Ticket #18329: 18329.diff

File 18329.diff, 6.0 KB (added by Bjoeni, 6 years ago)
  • src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java

     
    3838import javax.swing.table.TableModel;
    3939
    4040import org.openstreetmap.josm.actions.ExpertToggleAction;
     41import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
    4142import org.openstreetmap.josm.actions.MergeLayerAction;
    4243import org.openstreetmap.josm.data.coor.EastNorth;
    4344import org.openstreetmap.josm.data.imagery.OffsetBookmark;
     45import org.openstreetmap.josm.data.preferences.AbstractProperty.ValueChangeEvent;
    4446import org.openstreetmap.josm.data.preferences.AbstractProperty.ValueChangeListener;
    4547import org.openstreetmap.josm.data.preferences.BooleanProperty;
    4648import org.openstreetmap.josm.gui.MainApplication;
     
    129131
    130132    /** the list of layers (technically its a JTable, but appears like a list) */
    131133    private final LayerList layerList;
    132     private final ValueChangeListener<? super Boolean> displayNumbersPrefListener;
     134    private final ColumnWidthAdaptionListener visibilityWidthListener;
    133135
    134136    private final ActivateLayerAction activateLayerAction;
    135137    private final ShowHideLayerAction showHideLayerAction;
     
    222224        layerList.getColumnModel().getColumn(2).setPreferredWidth(16);
    223225        layerList.getColumnModel().getColumn(2).setResizable(false);
    224226
    225         int width = getLayerNumberWidth();
    226227        layerList.getColumnModel().getColumn(3).setCellRenderer(new LayerVisibleCellRenderer());
    227228        layerList.getColumnModel().getColumn(3).setCellEditor(new LayerVisibleCellEditor(new LayerVisibleCheckBox()));
    228         layerList.getColumnModel().getColumn(3).setMaxWidth(width);
    229         layerList.getColumnModel().getColumn(3).setPreferredWidth(width);
    230229        layerList.getColumnModel().getColumn(3).setResizable(false);
    231230
    232231        layerList.getColumnModel().getColumn(4).setCellRenderer(new LayerNameCellRenderer());
     
    251250            layerList.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(ks, new Object());
    252251        }
    253252
    254         displayNumbersPrefListener = change -> {
    255             int numberWidth = getLayerNumberWidth();
    256             layerList.getColumnModel().getColumn(3).setMaxWidth(numberWidth);
    257             layerList.getColumnModel().getColumn(3).setPreferredWidth(numberWidth);
    258             repaint();
    259         };
    260         DISPLAY_NUMBERS.addListener(displayNumbersPrefListener);
     253        visibilityWidthListener = new ColumnWidthAdaptionListener(3, 16);
     254        DISPLAY_NUMBERS.addListener(visibilityWidthListener);
     255        ExpertToggleAction.addExpertModeChangeListener(visibilityWidthListener);
     256        layerManager.addLayerChangeListener(visibilityWidthListener);
     257        visibilityWidthListener.updateColumnWidth();
    261258
    262259        // init the model
    263260        //
     
    342339        return ExpertToggleAction.isExpert() && DISPLAY_NUMBERS.get();
    343340    }
    344341
    345     private static int getLayerNumberWidth() {
    346         return displayLayerNumbers() ? 48 : 16;
    347     }
    348 
    349342    /**
    350343     * Gets the layer manager this dialog is for.
    351344     * @return The layer manager.
     
    387380        MultikeyActionsHandler.getInstance().removeAction(showHideLayerAction);
    388381        JumpToMarkerActions.unregisterActions();
    389382        layerList.setTransferHandler(null);
    390         DISPLAY_NUMBERS.removeListener(displayNumbersPrefListener);
     383        DISPLAY_NUMBERS.removeListener(visibilityWidthListener);
     384        ExpertToggleAction.removeExpertModeChangeListener(visibilityWidthListener);
     385        layerManager.removeLayerChangeListener(visibilityWidthListener);
    391386        super.destroy();
    392387        instance = null;
    393388    }
     
    396391        return ImageProvider.createBlankIcon(ImageSizes.LAYER);
    397392    }
    398393
     394    private class ColumnWidthAdaptionListener implements ValueChangeListener<Boolean>, ExpertModeChangeListener, LayerChangeListener {
     395        private final int minWidth;
     396        private final int column;
     397
     398        public ColumnWidthAdaptionListener(int column, int minWidth) {
     399            this.column = column;
     400            this.minWidth = minWidth;
     401        }
     402
     403        @Override
     404        public void expertChanged(boolean isExpert) {
     405            updateColumnWidth();
     406        }
     407
     408        @Override
     409        public void valueChanged(ValueChangeEvent<? extends Boolean> e) {
     410            updateColumnWidth();
     411        }
     412
     413        @Override
     414        public void layerAdded(LayerAddEvent e) {
     415            updateColumnWidth();
     416        }
     417
     418        @Override
     419        public void layerRemoving(LayerRemoveEvent e) {
     420            updateColumnWidth();
     421        }
     422
     423        @Override
     424        public void layerOrderChanged(LayerOrderChangeEvent e) {
     425            //not needed
     426        }
     427
     428        public void updateColumnWidth() {
     429            int width = minWidth;
     430            for (int row = 0; row < layerList.getRowCount(); row++) {
     431                TableCellRenderer renderer = layerList.getCellRenderer(row, column);
     432                Component comp = layerList.prepareRenderer(renderer, row, column);
     433                width = Math.max(comp.getPreferredSize().width + 1, width);
     434            }
     435            layerList.getColumnModel().getColumn(3).setMaxWidth(width);
     436            layerList.getColumnModel().getColumn(3).setPreferredWidth(width);
     437            repaint();
     438        }
     439    }
     440
    399441    private static class ActiveLayerCheckBox extends JCheckBox {
    400442        ActiveLayerCheckBox() {
    401443            setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
     
    418460         * Constructs a new {@code LayerVisibleCheckBox}.
    419461         */
    420462        LayerVisibleCheckBox() {
    421             setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
    422463            iconEye = ImageProvider.get("dialogs/layerlist", "eye");
    423464            iconEyeTranslucent = ImageProvider.get("dialogs/layerlist", "eye-translucent");
    424465            setIcon(ImageProvider.get("dialogs/layerlist", "eye-off"));