001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.osm;
003
004import java.util.Collection;
005import java.util.Collections;
006import java.util.Optional;
007
008import org.openstreetmap.josm.actions.mapmode.DrawAction;
009import org.openstreetmap.josm.gui.MainApplication;
010import org.openstreetmap.josm.gui.MapFrame;
011import org.openstreetmap.josm.gui.layer.OsmDataLayer;
012
013/**
014 * Global OSM dataset registry.
015 * @since 14143
016 */
017public final class OsmDataManager implements IOsmDataManager {
018
019    private OsmDataManager() {
020        // hide constructor
021    }
022
023    private static class InstanceHolder {
024        static final OsmDataManager INSTANCE = new OsmDataManager();
025    }
026
027    /**
028     * Returns the unique instance.
029     * @return the unique instance
030     */
031    public static OsmDataManager getInstance() {
032        return InstanceHolder.INSTANCE;
033    }
034
035    @Override
036    public Collection<OsmPrimitive> getInProgressSelection() {
037        MapFrame map = MainApplication.getMap();
038        if (map != null && map.mapMode instanceof DrawAction) {
039            return ((DrawAction) map.mapMode).getInProgressSelection();
040        } else {
041            DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
042            if (ds == null) return Collections.emptyList();
043            return ds.getSelected();
044        }
045    }
046
047    @Override
048    public Collection<? extends IPrimitive> getInProgressISelection() {
049        MapFrame map = MainApplication.getMap();
050        if (map != null && map.mapMode instanceof DrawAction) {
051            return ((DrawAction) map.mapMode).getInProgressSelection();
052        } else {
053            OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
054            if (ds == null) return Collections.emptyList();
055            return ds.getSelected();
056        }
057    }
058
059    @Override
060    public DataSet getEditDataSet() {
061        return MainApplication.getLayerManager().getEditDataSet();
062    }
063
064    @Override
065    public DataSet getActiveDataSet() {
066        return MainApplication.getLayerManager().getActiveDataSet();
067    }
068
069    @Override
070    public void setActiveDataSet(DataSet ds) {
071        Optional<OsmDataLayer> layer = MainApplication.getLayerManager().getLayersOfType(OsmDataLayer.class).stream()
072                .filter(l -> l.data.equals(ds)).findFirst();
073        if (layer.isPresent()) {
074            MainApplication.getLayerManager().setActiveLayer(layer.get());
075        }
076    }
077
078    @Override
079    public boolean containsDataSet(DataSet ds) {
080        return MainApplication.getLayerManager().getLayersOfType(OsmDataLayer.class).stream().anyMatch(l -> l.data.equals(ds));
081    }
082}