Ticket #12882: patch-layers-update-layer-list.patch

File patch-layers-update-layer-list.patch, 16.4 KB (added by michael2402, 9 years ago)
  • src/org/openstreetmap/josm/Main.java

    diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
    index 9ccc7eb..ac883f4 100644
    a b public abstract class Main {  
    143143    /**
    144144     * Replies true if JOSM currently displays a map view. False, if it doesn't, i.e. if
    145145     * it only shows the MOTD panel.
     146     * <p>
     147     * You do not need this when accessing the layer manager. The layer manager will be empty if no map view is shown.
    146148     *
    147149     * @return <code>true</code> if JOSM currently displays a map view
    148150     */
  • src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
    index 8c6ae23..6c9e2fc 100644
    a b import org.openstreetmap.josm.gui.dialogs.layer.MoveUpAction;  
    5959import org.openstreetmap.josm.gui.dialogs.layer.ShowHideLayerAction;
    6060import org.openstreetmap.josm.gui.layer.JumpToMarkerActions;
    6161import org.openstreetmap.josm.gui.layer.Layer;
     62import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
     63import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
     64import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
     65import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
     66import org.openstreetmap.josm.gui.layer.MainLayerManager;
     67import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
     68import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
    6269import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
    6370import org.openstreetmap.josm.gui.util.GuiHelper;
    6471import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
    import org.openstreetmap.josm.tools.Shortcut;  
    7481 * This is a toggle dialog which displays the list of layers. Actions allow to
    7582 * change the ordering of the layers, to hide/show layers, to activate layers,
    7683 * and to delete layers.
     84 * <p>
     85 * Support for multiple {@link LayerListDialog} is currently not complete but intended for the future.
    7786 * @since 17
    7887 */
    7988public class LayerListDialog extends ToggleDialog {
    public class LayerListDialog extends ToggleDialog {  
    135144    private final ToggleLayerIndexVisibility[] visibilityToggleActions = new ToggleLayerIndexVisibility[10];
    136145
    137146    /**
     147     * The {@link MainLayerManager} this list is for.
     148     * @since xxx
     149     */
     150    private final transient MainLayerManager layerManager;
     151
     152    /**
    138153     * registers (shortcut to toggle right hand side toggle dialogs)+(number keys) shortcuts
    139154     * to toggle the visibility of the first ten layers.
    140155     */
    public class LayerListDialog extends ToggleDialog {  
    154169     * @param mapFrame map frame
    155170     */
    156171    protected LayerListDialog(MapFrame mapFrame) {
     172        this(mapFrame.mapView.getLayerManager());
     173    }
     174
     175    /**
     176     * Creates a layer list and attach it to the given mapView.
     177     * @param layerManager The layer manager this list is for
     178     * @since xxx
     179     */
     180    private LayerListDialog(MainLayerManager layerManager) {
    157181        super(tr("Layers"), "layerlist", tr("Open a list of all loaded layers."),
    158182                Shortcut.registerShortcut("subwindow:layers", tr("Toggle: {0}", tr("Layers")), KeyEvent.VK_L,
    159183                        Shortcut.ALT_SHIFT), 100, true);
     184        this.layerManager = layerManager;
    160185
    161186        // create the models
    162187        //
    public class LayerListDialog extends ToggleDialog {  
    166191
    167192        // create the list control
    168193        //
    169         layerList = new LayerList(model);
     194        layerList = new LayerList(model, layerManager);
    170195        layerList.setSelectionModel(selectionModel);
    171196        layerList.addMouseListener(new PopupMenuHandler());
    172197        layerList.setBackground(UIManager.getColor("Button.background"));
    public class LayerListDialog extends ToggleDialog {  
    218243
    219244        // init the model
    220245        //
    221         final MapView mapView = mapFrame.mapView;
    222246        model.populate();
    223         model.setSelectedLayer(mapView.getActiveLayer());
     247        model.setSelectedLayer(layerManager.getActiveLayer());
    224248        model.addLayerListModelListener(
    225249                new LayerListModelListener() {
    226250                    @Override
    public class LayerListDialog extends ToggleDialog {  
    296320        createVisibilityToggleShortcuts();
    297321    }
    298322
     323    /**
     324     * Gets the layer manager this dialog is for.
     325     * @return The layer manager.
     326     * @since xxx
     327     */
     328    public MainLayerManager getLayerManager() {
     329        return layerManager;
     330    }
     331
    299332    @Override
    300333    public void showNotify() {
    301334        MapView.addLayerChangeListener(activateLayerAction);
    302         MapView.addLayerChangeListener(model);
     335        layerManager.addLayerChangeListener(model);
     336        layerManager.addActiveLayerChangeListener(model, true);
    303337        model.populate();
    304338    }
    305339
    306340    @Override
    307341    public void hideNotify() {
    308         MapView.removeLayerChangeListener(model);
     342        layerManager.removeLayerChangeListener(model);
     343        layerManager.removeActiveLayerChangeListener(model);
    309344        MapView.removeLayerChangeListener(activateLayerAction);
    310345    }
    311346
    public class LayerListDialog extends ToggleDialog {  
    512547    private class LayerNameCellRenderer extends DefaultTableCellRenderer {
    513548
    514549        protected boolean isActiveLayer(Layer layer) {
    515             if (!Main.isDisplayingMapView())
    516                 return false;
    517             return Main.map.mapView.getActiveLayer() == layer;
     550            return getLayerManager().getActiveLayer() == layer;
    518551        }
    519552
    520553        @Override
    public class LayerListDialog extends ToggleDialog {  
    611644     * It also listens to {@link PropertyChangeEvent}s of every {@link Layer} it manages, in particular to
    612645     * the properties {@link Layer#VISIBLE_PROP} and {@link Layer#NAME_PROP}.
    613646     */
    614     public static final class LayerListModel extends AbstractTableModel implements MapView.LayerChangeListener, PropertyChangeListener {
     647    public static final class LayerListModel extends AbstractTableModel
     648            implements LayerChangeListener, ActiveLayerChangeListener, PropertyChangeListener {
    615649        /** manages list selection state*/
    616650        private final DefaultListSelectionModel selectionModel;
    617651        private final CopyOnWriteArrayList<LayerListModelListener> listeners;
    public class LayerListDialog extends ToggleDialog {  
    627661            listeners = new CopyOnWriteArrayList<>();
    628662        }
    629663
    630         void setlayerList(LayerList layerList) {
     664        void setLayerList(LayerList layerList) {
    631665            this.layerList = layerList;
    632666        }
    633667
     668        private MainLayerManager getLayerManager() {
     669            // layerList should never be null. But if it is, we should not crash.
     670            if (layerList == null) {
     671                return new MainLayerManager();
     672            } else {
     673                return layerList.getLayerManager();
     674            }
     675        }
     676
    634677        /**
    635678         * Adds a listener to this model
    636679         *
    public class LayerListDialog extends ToggleDialog {  
    743786            layer.removePropertyChangeListener(this);
    744787            final int size = getRowCount();
    745788            final List<Integer> rows = getSelectedRows();
    746             GuiHelper.runInEDTAndWait(new Runnable() {
    747                 @Override
    748                 public void run() {
    749                     if (rows.isEmpty() && size > 0) {
    750                         selectionModel.setSelectionInterval(size-1, size-1);
    751                     }
    752                     fireTableDataChanged();
    753                     fireRefresh();
    754                     ensureActiveSelected();
    755                 }
    756             });
     789
     790            if (rows.isEmpty() && size > 0) {
     791                selectionModel.setSelectionInterval(size-1, size-1);
     792            }
     793            fireTableDataChanged();
     794            fireRefresh();
     795            ensureActiveSelected();
    757796        }
    758797
    759798        /**
    public class LayerListDialog extends ToggleDialog {  
    887926         */
    888927        public List<Layer> getPossibleMergeTargets(Layer source) {
    889928            List<Layer> targets = new ArrayList<>();
    890             if (source == null || !Main.isDisplayingMapView()) {
     929            if (source == null) {
    891930                return targets;
    892931            }
    893             for (Layer target : Main.map.mapView.getAllLayersAsList()) {
     932            for (Layer target : getLayers()) {
    894933                if (source == target) {
    895934                    continue;
    896935                }
    public class LayerListDialog extends ToggleDialog {  
    909948         * Never null, but can be empty.
    910949         */
    911950        public List<Layer> getLayers() {
    912             if (!Main.isDisplayingMapView())
    913                 return Collections.<Layer>emptyList();
    914             return Main.map.mapView.getAllLayersAsList();
     951            return getLayerManager().getLayers();
    915952        }
    916953
    917954        /**
    public class LayerListDialog extends ToggleDialog {  
    941978         * @return the active layer. null, if no active layer is available
    942979         */
    943980        protected Layer getActiveLayer() {
    944             return Main.isDisplayingMapView() ? Main.map.mapView.getActiveLayer() : null;
     981            return getLayerManager().getActiveLayer();
    945982        }
    946983
    947984        /**
    948          * Replies the scale layer. null, if no active layer is available
     985         * Replies the scale layer. null, if no active layer is available.
    949986         *
    950987         * @return the scale layer. null, if no active layer is available
     988         * @deprecated Deprecated since it is unused in JOSM and does not really belong here. Can be removed soon (August 2016).
     989         *             You can directly query MapView.
    951990         */
     991        @Deprecated
    952992        protected NativeScaleLayer getNativeScaleLayer() {
    953993            return Main.isDisplayingMapView() ? Main.map.mapView.getNativeScaleLayer() : null;
    954994        }
    public class LayerListDialog extends ToggleDialog {  
    9971037                Layer l = layers.get(row);
    9981038                switch (col) {
    9991039                case 0:
    1000                     Main.map.mapView.setActiveLayer(l);
     1040                    getLayerManager().setActiveLayer(l);
    10011041                    l.setVisible(true);
    10021042                    break;
    10031043                case 1:
    public class LayerListDialog extends ToggleDialog {  
    10271067        }
    10281068
    10291069        /* ------------------------------------------------------------------------------ */
    1030         /* Interface LayerChangeListener                                                  */
     1070        /* Interface ActiveLayerChangeListener                                            */
    10311071        /* ------------------------------------------------------------------------------ */
    10321072        @Override
    1033         public void activeLayerChange(final Layer oldLayer, final Layer newLayer) {
    1034             GuiHelper.runInEDTAndWait(new Runnable() {
    1035                 @Override
    1036                 public void run() {
    1037                     if (oldLayer != null) {
    1038                         int idx = getLayers().indexOf(oldLayer);
    1039                         if (idx >= 0) {
    1040                             fireTableRowsUpdated(idx, idx);
    1041                         }
    1042                     }
     1073        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
     1074            Layer oldLayer = e.getPreviousActiveLayer();
     1075            if (oldLayer != null) {
     1076                int idx = getLayers().indexOf(oldLayer);
     1077                if (idx >= 0) {
     1078                    fireTableRowsUpdated(idx, idx);
     1079                }
     1080            }
    10431081
    1044                     if (newLayer != null) {
    1045                         int idx = getLayers().indexOf(newLayer);
    1046                         if (idx >= 0) {
    1047                             fireTableRowsUpdated(idx, idx);
    1048                         }
    1049                     }
    1050                     ensureActiveSelected();
     1082            Layer newLayer = getActiveLayer();
     1083            if (newLayer != null) {
     1084                int idx = getLayers().indexOf(newLayer);
     1085                if (idx >= 0) {
     1086                    fireTableRowsUpdated(idx, idx);
    10511087                }
    1052             });
     1088            }
     1089            ensureActiveSelected();
    10531090        }
    10541091
     1092        /* ------------------------------------------------------------------------------ */
     1093        /* Interface LayerChangeListener                                                  */
     1094        /* ------------------------------------------------------------------------------ */
    10551095        @Override
    1056         public void layerAdded(Layer newLayer) {
    1057             onAddLayer(newLayer);
     1096        public void layerAdded(LayerAddEvent e) {
     1097            onAddLayer(e.getAddedLayer());
    10581098        }
    10591099
    10601100        @Override
    1061         public void layerRemoved(final Layer oldLayer) {
    1062             onRemoveLayer(oldLayer);
     1101        public void layerRemoving(LayerRemoveEvent e) {
     1102            onRemoveLayer(e.getRemovedLayer());
     1103        }
     1104
     1105        @Override
     1106        public void layerOrderChanged(LayerOrderChangeEvent e) {
     1107            // ignored for now, since only we change layer order.
    10631108        }
    10641109
    10651110        /* ------------------------------------------------------------------------------ */
    public class LayerListDialog extends ToggleDialog {  
    10771122        }
    10781123    }
    10791124
     1125    /**
     1126     * This component displays a list of layers and provides the methods needed by {@link LayerListModel}.
     1127     */
    10801128    static class LayerList extends JTable {
    1081         LayerList(LayerListModel dataModel) {
     1129        private final transient MainLayerManager layerManager;
     1130
     1131        LayerList(LayerListModel dataModel, MainLayerManager layerManager) {
    10821132            super(dataModel);
    1083             dataModel.setlayerList(this);
     1133            this.layerManager = layerManager;
     1134            dataModel.setLayerList(this);
    10841135        }
    10851136
    10861137        public void scrollToVisible(int row, int col) {
    public class LayerListDialog extends ToggleDialog {  
    10921143            rect.setLocation(rect.x - pt.x, rect.y - pt.y);
    10931144            viewport.scrollRectToVisible(rect);
    10941145        }
     1146
     1147        /**
     1148         * Gets you the layer manager used for this list.
     1149         * @return The layer manager.
     1150         * @since xxx
     1151         */
     1152        public MainLayerManager getLayerManager() {
     1153            return layerManager;
     1154        }
    10951155    }
    10961156
    10971157    /**
    public class LayerListDialog extends ToggleDialog {  
    11481208     * @return the layer at given index, or {@code null} if index out of range
    11491209     */
    11501210    public static Layer getLayerForIndex(int index) {
    1151         if (!Main.isDisplayingMapView())
    1152             return null;
    1153 
    1154         List<Layer> layers = Main.map.mapView.getAllLayersAsList();
     1211        List<Layer> layers = Main.getLayerManager().getLayers();
    11551212
    11561213        if (index < layers.size() && index >= 0)
    11571214            return layers.get(index);
    public class LayerListDialog extends ToggleDialog {  
    11681225    public static List<MultikeyInfo> getLayerInfoByClass(Class<?> layerClass) {
    11691226        List<MultikeyInfo> result = new ArrayList<>();
    11701227
    1171         if (!Main.isDisplayingMapView())
    1172             return result;
    1173 
    1174         List<Layer> layers = Main.map.mapView.getAllLayersAsList();
     1228        List<Layer> layers = Main.getLayerManager().getLayers();
    11751229
    11761230        int index = 0;
    11771231        for (Layer l: layers) {
    public class LayerListDialog extends ToggleDialog {  
    11851239    }
    11861240
    11871241    /**
    1188      * Determines if a layer is valid (contained in layer list).
     1242     * Determines if a layer is valid (contained in global layer list).
    11891243     * @param l the layer
    11901244     * @return {@code true} if layer {@code l} is contained in current layer list
    11911245     */
    11921246    public static boolean isLayerValid(Layer l) {
    1193         if (l == null || !Main.isDisplayingMapView())
     1247        if (l == null)
    11941248            return false;
    11951249
    1196         return Main.map.mapView.getAllLayersAsList().contains(l);
     1250        return Main.getLayerManager().containsLayer(l);
    11971251    }
    11981252
    11991253    /**
    public class LayerListDialog extends ToggleDialog {  
    12021256     * @return info about layer {@code l}
    12031257     */
    12041258    public static MultikeyInfo getLayerInfo(Layer l) {
    1205         if (l == null || !Main.isDisplayingMapView())
     1259        if (l == null)
    12061260            return null;
    12071261
    1208         int index = Main.map.mapView.getAllLayersAsList().indexOf(l);
     1262        int index = Main.getLayerManager().getLayers().indexOf(l);
    12091263        if (index < 0)
    12101264            return null;
    12111265