Ignore:
Timestamp:
2012-06-24T19:14:38+02:00 (12 years ago)
Author:
Don-vip
Message:

fix #4493, fix #7750: conflict dialog, nodes and members tab: allow selection via double-click, allow zoom via contexual menu, plus various fix in EDT violations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java

    r5081 r5297  
    88import java.awt.event.ActionEvent;
    99import java.awt.event.KeyEvent;
    10 import java.awt.event.MouseAdapter;
    11 import java.awt.event.MouseEvent;
    1210import java.util.Arrays;
    1311import java.util.Collection;
     
    2018import javax.swing.KeyStroke;
    2119import javax.swing.ListSelectionModel;
    22 import javax.swing.SwingUtilities;
    2320import javax.swing.event.ListSelectionEvent;
    2421import javax.swing.event.ListSelectionListener;
     
    2623import org.openstreetmap.josm.Main;
    2724import org.openstreetmap.josm.actions.AutoScaleAction;
    28 import org.openstreetmap.josm.data.osm.OsmPrimitive;
     25import org.openstreetmap.josm.actions.ZoomToAction;
    2926import org.openstreetmap.josm.data.osm.Way;
    3027import org.openstreetmap.josm.gui.MapView;
     
    3330import org.openstreetmap.josm.gui.layer.Layer;
    3431import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    35 
    36 public class MemberTable extends JTable implements IMemberModelListener {
    37 
    38     /**
    39      * the data layer in whose context relation members are edited in this table
    40      */
    41     protected OsmDataLayer layer;
    42 
    43     /** the popup menu */
    44     protected JPopupMenu popupMenu;
    45     private ZoomToAction zoomToAction;
     32import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
     33
     34public class MemberTable extends OsmPrimitivesTable implements IMemberModelListener {
     35
     36    /** the additional actions in popup menu */
    4637    private ZoomToGapAction zoomToGap;
    4738
     
    5445    public MemberTable(OsmDataLayer layer, MemberTableModel model) {
    5546        super(model, new MemberTableColumnModel(layer.data), model.getSelectionModel());
    56         this.layer = layer;
     47        setLayer(layer);
    5748        model.addMemberModelListener(this);
    5849        init();
    59 
    6050    }
    6151
     
    7969        getActionMap().put("selectNextColumnCell", new SelectNextColumnCellAction());
    8070        getActionMap().put("selectPreviousColumnCell", new SelectPreviousColumnCellAction());
    81 
    82         addMouseListener(new PopupListener());
    83         addMouseListener(new DblClickHandler());
     71    }
     72   
     73    @Override
     74    protected ZoomToAction buildZoomToAction() {
     75        return new ZoomToAction(this);
     76    }
     77   
     78    @Override
     79    protected JPopupMenu buildPopupMenu() {
     80        JPopupMenu menu = super.buildPopupMenu();
     81        zoomToGap = new ZoomToGapAction();
     82        MapView.addLayerChangeListener(zoomToGap);
     83        getSelectionModel().addListSelectionListener(zoomToGap);
     84        menu.add(zoomToGap);
     85        menu.addSeparator();
     86        menu.add(new SelectPreviousGapAction());
     87        menu.add(new SelectNextGapAction());
     88        return menu;
    8489    }
    8590
     
    156161    }
    157162
    158     /**
    159      * Replies the popup menu for this table
    160      *
    161      * @return the popup menu
    162      */
    163     protected JPopupMenu getPopUpMenu() {
    164         if (popupMenu == null) {
    165             popupMenu = new JPopupMenu();
    166             zoomToAction = new ZoomToAction();
    167             MapView.addLayerChangeListener(zoomToAction);
    168             getSelectionModel().addListSelectionListener(zoomToAction);
    169             popupMenu.add(zoomToAction);
    170             zoomToGap = new ZoomToGapAction();
    171             MapView.addLayerChangeListener(zoomToGap);
    172             getSelectionModel().addListSelectionListener(zoomToGap);
    173             popupMenu.add(zoomToGap);
    174             popupMenu.addSeparator();
    175             popupMenu.add(new SelectPreviousGapAction());
    176             popupMenu.add(new SelectNextGapAction());
    177         }
    178         return popupMenu;
    179     }
    180 
     163    @Override
    181164    public void unlinkAsListener() {
    182         MapView.removeLayerChangeListener(zoomToAction);
     165        super.unlinkAsListener();
    183166        MapView.removeLayerChangeListener(zoomToGap);
    184     }
    185 
    186     class PopupListener extends MouseAdapter {
    187         @Override
    188         public void mousePressed(MouseEvent e) {
    189             showPopup(e);
    190         }
    191 
    192         @Override
    193         public void mouseReleased(MouseEvent e) {
    194             showPopup(e);
    195         }
    196 
    197         private void showPopup(MouseEvent e) {
    198             if (e.isPopupTrigger()) {
    199                 getPopUpMenu().show(e.getComponent(), e.getX(), e.getY());
    200             }
    201         }
    202     }
    203 
    204     private class ZoomToAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
    205         public ZoomToAction() {
    206             putValue(NAME, tr("Zoom to"));
    207             putValue(SHORT_DESCRIPTION, tr("Zoom to the object the first selected member refers to"));
    208             updateEnabledState();
    209         }
    210 
    211         public void actionPerformed(ActionEvent e) {
    212             if (! isEnabled())
    213                 return;
    214             int rows[] = getSelectedRows();
    215             if (rows == null || rows.length == 0)
    216                 return;
    217             int row = rows[0];
    218             OsmPrimitive primitive = getMemberTableModel().getReferredPrimitive(row);
    219             layer.data.setSelected(primitive);
    220             AutoScaleAction.autoScale("selection");
    221         }
    222 
    223         protected void updateEnabledState() {
    224             if (Main.main == null || Main.main.getEditLayer() != layer) {
    225                 setEnabled(false);
    226                 putValue(SHORT_DESCRIPTION, tr("Zooming disabled because layer of this relation is not active"));
    227                 return;
    228             }
    229             if (getSelectedRowCount() == 0) {
    230                 setEnabled(false);
    231                 putValue(SHORT_DESCRIPTION, tr("Zooming disabled because there is no selected member"));
    232                 return;
    233             }
    234             setEnabled(true);
    235             putValue(SHORT_DESCRIPTION, tr("Zoom to the object the first selected member refers to"));
    236         }
    237 
    238         public void valueChanged(ListSelectionEvent e) {
    239             updateEnabledState();
    240         }
    241 
    242         public void activeLayerChange(Layer oldLayer, Layer newLayer) {
    243             updateEnabledState();
    244         }
    245 
    246         public void layerAdded(Layer newLayer) {
    247             updateEnabledState();
    248         }
    249 
    250         public void layerRemoved(Layer oldLayer) {
    251             updateEnabledState();
    252         }
    253167    }
    254168
     
    316230            Way way = (Way) getMemberTableModel().getReferredPrimitive(getSelectedRows()[0]);
    317231            if (!connectionType.linkPrev) {
    318                 layer.data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
     232                getLayer().data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
    319233                        ? way.firstNode() : way.lastNode());
    320234                AutoScaleAction.autoScale("selection");
    321235            } else if (!connectionType.linkNext) {
    322                 layer.data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
     236                getLayer().data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
    323237                        ? way.lastNode() : way.firstNode());
    324238                AutoScaleAction.autoScale("selection");
     
    328242        private void updateEnabledState() {
    329243            setEnabled(Main.main != null
    330                     && Main.main.getEditLayer() == layer
     244                    && Main.main.getEditLayer() == getLayer()
    331245                    && getSelectedRowCount() == 1
    332246                    && hasGap());
     
    357271        return (MemberTableModel) getModel();
    358272    }
    359 
    360     private class DblClickHandler extends MouseAdapter {
    361 
    362         protected void setSelection(MouseEvent e) {
    363             int row = rowAtPoint(e.getPoint());
    364             if (row < 0) return;
    365             OsmPrimitive primitive = getMemberTableModel().getReferredPrimitive(row);
    366             getMemberTableModel().getLayer().data.setSelected(primitive.getPrimitiveId());
    367         }
    368 
    369         protected void addSelection(MouseEvent e) {
    370             int row = rowAtPoint(e.getPoint());
    371             if (row < 0) return;
    372             OsmPrimitive primitive = getMemberTableModel().getReferredPrimitive(row);
    373             getMemberTableModel().getSelectionModel().addSelectionInterval(row, row);
    374             getMemberTableModel().getLayer().data.addSelected(primitive.getPrimitiveId());
    375 
    376         }
    377 
    378         @Override
    379         public void mouseClicked(MouseEvent e) {
    380             if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() > 1) {
    381                 if (e.isControlDown()) {
    382                     addSelection(e);
    383                 } else {
    384                     setSelection(e);
    385                 }
    386             }
    387         }
    388     }
    389273}
Note: See TracChangeset for help on using the changeset viewer.