Ticket #15711: offset_icon.patch

File offset_icon.patch, 8.3 KB (added by skorbut, 6 years ago)
  • src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java

     
    4242
    4343import org.openstreetmap.josm.Main;
    4444import org.openstreetmap.josm.actions.MergeLayerAction;
     45import org.openstreetmap.josm.data.coor.EastNorth;
     46import org.openstreetmap.josm.data.imagery.OffsetBookmark;
    4547import org.openstreetmap.josm.data.preferences.AbstractProperty;
    4648import org.openstreetmap.josm.gui.MainApplication;
    4749import org.openstreetmap.josm.gui.MapFrame;
     
    5658import org.openstreetmap.josm.gui.dialogs.layer.MoveDownAction;
    5759import org.openstreetmap.josm.gui.dialogs.layer.MoveUpAction;
    5860import org.openstreetmap.josm.gui.dialogs.layer.ShowHideLayerAction;
     61import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
    5962import org.openstreetmap.josm.gui.layer.JumpToMarkerActions;
    6063import org.openstreetmap.josm.gui.layer.Layer;
    6164import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
     
    6669import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
    6770import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
    6871import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
     72import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeEvent;
     73import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeListener;
    6974import org.openstreetmap.josm.gui.util.MultikeyActionsHandler;
    7075import org.openstreetmap.josm.gui.util.MultikeyShortcutAction.MultikeyInfo;
    7176import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
     
    8590 * Support for multiple {@link LayerListDialog} is currently not complete but intended for the future.
    8691 * @since 17
    8792 */
    88 public class LayerListDialog extends ToggleDialog {
     93public class LayerListDialog extends ToggleDialog implements DisplaySettingsChangeListener {
    8994    /** the unique instance of the dialog */
    9095    private static volatile LayerListDialog instance;
    9196
     
    205210        layerList.getColumnModel().getColumn(1).setPreferredWidth(12);
    206211        layerList.getColumnModel().getColumn(1).setResizable(false);
    207212
    208         layerList.getColumnModel().getColumn(2).setCellRenderer(new LayerVisibleCellRenderer());
    209         layerList.getColumnModel().getColumn(2).setCellEditor(new LayerVisibleCellEditor(new LayerVisibleCheckBox()));
     213        layerList.getColumnModel().getColumn(2).setCellRenderer(new OffsetLayerCellRenderer());
     214        layerList.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(new OffsetLayerCheckBox()));
    210215        layerList.getColumnModel().getColumn(2).setMaxWidth(16);
    211216        layerList.getColumnModel().getColumn(2).setPreferredWidth(16);
    212217        layerList.getColumnModel().getColumn(2).setResizable(false);
    213218
    214         layerList.getColumnModel().getColumn(3).setCellRenderer(new LayerNameCellRenderer());
    215         layerList.getColumnModel().getColumn(3).setCellEditor(new LayerNameCellEditor(new DisableShortcutsOnFocusGainedTextField()));
     219        layerList.getColumnModel().getColumn(3).setCellRenderer(new LayerVisibleCellRenderer());
     220        layerList.getColumnModel().getColumn(3).setCellEditor(new LayerVisibleCellEditor(new LayerVisibleCheckBox()));
     221        layerList.getColumnModel().getColumn(3).setMaxWidth(16);
     222        layerList.getColumnModel().getColumn(3).setPreferredWidth(16);
     223        layerList.getColumnModel().getColumn(3).setResizable(false);
     224
     225        layerList.getColumnModel().getColumn(4).setCellRenderer(new LayerNameCellRenderer());
     226        layerList.getColumnModel().getColumn(4).setCellEditor(new LayerNameCellEditor(new DisableShortcutsOnFocusGainedTextField()));
    216227        // Disable some default JTable shortcuts to use JOSM ones (see #5678, #10458)
    217228        for (KeyStroke ks : new KeyStroke[] {
    218229                KeyStroke.getKeyStroke(KeyEvent.VK_C, Main.platform.getMenuShortcutKeyMaskEx()),
     
    441452        }
    442453    }
    443454
     455    private static class OffsetLayerCheckBox extends JCheckBox {
     456        public OffsetLayerCheckBox() {
     457            setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
     458            ImageIcon blank = ImageProvider.get("dialogs/layerlist", "blank");
     459            ImageIcon withOffset = ImageProvider.get("dialogs/layerlist", "offset");
     460            setIcon(blank);
     461            setSelectedIcon(withOffset);
     462        }
     463    }
     464
    444465    private static class ActiveLayerCellRenderer implements TableCellRenderer {
    445466        private final JCheckBox cb;
    446467
     
    522543        }
    523544    }
    524545
     546    private static class OffsetLayerCellRenderer implements TableCellRenderer {
     547        private final JCheckBox cb;
     548
     549        /**
     550         * Constructs a new {@code OffsetLayerCellRenderer}.
     551         */
     552        OffsetLayerCellRenderer() {
     553            cb = new OffsetLayerCheckBox();
     554            cb.setEnabled(false);
     555        }
     556
     557        @Override
     558        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
     559            Layer layer = (Layer) value;
     560            if (layer instanceof AbstractTileSourceLayer<?>) {
     561                if (EastNorth.ZERO.equals(((AbstractTileSourceLayer<?>)layer).getDisplaySettings().getDisplacement())) {
     562                    cb.setSelected(false);
     563                    cb.setEnabled(false); // TODO: allow reselecting checkbox and thereby setting the old offset again
     564                    cb.setToolTipText(tr("layer is without a user-defined offset"));
     565                } else {
     566                    cb.setSelected(true);
     567                    cb.setEnabled(true);
     568                    cb.setToolTipText(tr("layer has a user-defined offset (click to remove offset)"));
     569                }
     570
     571            } else {
     572                cb.setSelected(false);
     573                cb.setEnabled(false);
     574                cb.setToolTipText(tr("this layer can not have an offset"));
     575            }
     576            return cb;
     577        }
     578    }
     579
    525580    private class LayerNameCellRenderer extends DefaultTableCellRenderer {
    526581
    527582        protected boolean isActiveLayer(Layer layer) {
     
    780835            }
    781836            selectionModel.setSelectionInterval(idx, idx);
    782837            ensureSelectedIsVisible();
     838            if (layer instanceof AbstractTileSourceLayer<?>) {
     839                ((AbstractTileSourceLayer<?>) layer).getDisplaySettings().addSettingsChangeListener(LayerListDialog.getInstance());
     840            }
    783841        }
    784842
    785843        /**
     
    9641022
    9651023        @Override
    9661024        public int getColumnCount() {
    967             return 4;
     1025            return 5;
    9681026        }
    9691027
    9701028        @Override
     
    9751033                case 0: return layers.get(row) == getActiveLayer();
    9761034                case 1:
    9771035                case 2:
    978                 case 3: return layers.get(row);
     1036                case 3:
     1037                case 4: return layers.get(row);
    9791038                default: // Do nothing
    9801039                }
    9811040            }
     
    10131072                    }
    10141073                    break;
    10151074                case 2:
     1075                    // reset layer offset
     1076                    if (l instanceof AbstractTileSourceLayer<?>) {
     1077                        AbstractTileSourceLayer<?> abstractTileSourceLayer = (AbstractTileSourceLayer<?>)l;
     1078                        OffsetBookmark offsetBookmark = abstractTileSourceLayer.getDisplaySettings().getOffsetBookmark();
     1079                        if (offsetBookmark != null) {
     1080                            offsetBookmark.setDisplacement(EastNorth.ZERO);
     1081                            abstractTileSourceLayer.getDisplaySettings().setOffsetBookmark(offsetBookmark);
     1082                        }
     1083                    }
     1084                    break;
     1085                case 3:
    10161086                    l.setVisible((Boolean) value);
    10171087                    break;
    1018                 case 3:
     1088                case 4:
    10191089                    l.rename((String) value);
    10201090                    break;
    10211091                default:
     
    12131283
    12141284        return new MultikeyInfo(index, l.getName());
    12151285    }
     1286
     1287    @Override
     1288    public void displaySettingsChanged(DisplaySettingsChangeEvent e) {
     1289        if ("displacement".equals(e.getChangedSetting())) {
     1290            layerList.repaint();
     1291        }
     1292    }
    12161293}