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

Location:
trunk/src/org/openstreetmap/josm/gui
Files:
4 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/MapStatus.java

    r5137 r5297  
    4747import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
    4848import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor.ProgressMonitorDialog;
     49import org.openstreetmap.josm.gui.util.GuiHelper;
    4950import org.openstreetmap.josm.tools.GBC;
    5051import org.openstreetmap.josm.tools.ImageProvider;
     
    757758        setHelpText(null, t);
    758759    }
    759     public void setHelpText(Object id, String text)  {
     760    public void setHelpText(Object id, final String text)  {
    760761
    761762        StatusTextHistory entry = new StatusTextHistory(id, text);
     
    764765        statusText.add(entry);
    765766
    766         helpText.setText(text);
    767         helpText.setToolTipText(text);
     767        GuiHelper.runInEDT(new Runnable() {
     768            @Override
     769            public void run() {
     770                helpText.setText(text);
     771                helpText.setToolTipText(text);
     772            }
     773        });
    768774    }
    769775    public void resetHelpText(Object id) {
  • trunk/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java

    r5288 r5297  
    338338        return resolvedCompletely;
    339339    }
     340
     341    public void unregisterListeners() {
     342        nodeListMerger.unlinkAsListener();
     343        relationMemberMerger.unlinkAsListener();
     344    }
    340345}
  • trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java

    r5266 r5297  
    2929import org.openstreetmap.josm.gui.HelpAwareOptionPane;
    3030import org.openstreetmap.josm.gui.help.HelpUtil;
     31import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
    3132
    3233/**
     
    6970    protected HashMap<ListRole, ArrayList<T>> entries;
    7071
    71     protected DefaultTableModel myEntriesTableModel;
    72     protected DefaultTableModel theirEntriesTableModel;
    73     protected DefaultTableModel mergedEntriesTableModel;
     72    protected EntriesTableModel myEntriesTableModel;
     73    protected EntriesTableModel theirEntriesTableModel;
     74    protected EntriesTableModel mergedEntriesTableModel;
    7475
    7576    protected EntriesSelectionModel myEntriesSelectionModel;
     
    210211    }
    211212
    212     public TableModel getMyTableModel() {
     213    public OsmPrimitivesTableModel getMyTableModel() {
    213214        return myEntriesTableModel;
    214215    }
    215216
    216     public TableModel getTheirTableModel() {
     217    public OsmPrimitivesTableModel getTheirTableModel() {
    217218        return theirEntriesTableModel;
    218219    }
    219220
    220     public TableModel getMergedTableModel() {
     221    public OsmPrimitivesTableModel getMergedTableModel() {
    221222        return mergedEntriesTableModel;
    222223    }
     
    535536    protected boolean myAndTheirEntriesEqual() {
    536537
    537         if (getMyEntries().size() != getTheirEntries().size())
     538        if (getMyEntriesSize() != getTheirEntriesSize())
    538539            return false;
    539         for (int i=0; i < getMyEntries().size(); i++) {
     540        for (int i=0; i < getMyEntriesSize(); i++) {
    540541            if (! isEqualEntry(getMyEntries().get(i), getTheirEntries().get(i)))
    541542                return false;
     
    555556     * @see ListMergeModel#getMergedTableModel()
    556557     */
    557     public class EntriesTableModel extends DefaultTableModel {
     558    public class EntriesTableModel extends DefaultTableModel implements OsmPrimitivesTableModel {
    558559        private final ListRole role;
    559560
     
    675676            return role;
    676677        }
     678
     679        @Override
     680        public OsmPrimitive getReferredPrimitive(int idx) {
     681            return (OsmPrimitive) getValueAt(idx, 1);
     682        }
    677683    }
    678684
  • trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java

    r5266 r5297  
    3636import javax.swing.event.ListSelectionListener;
    3737
     38import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
    3839import org.openstreetmap.josm.tools.CheckParameterUtil;
    3940import org.openstreetmap.josm.tools.ImageProvider;
     
    4647 */
    4748public abstract class ListMerger<T> extends JPanel implements PropertyChangeListener, Observer {
    48     protected JTable myEntriesTable;
    49     protected JTable mergedEntriesTable;
    50     protected JTable theirEntriesTable;
     49    protected OsmPrimitivesTable myEntriesTable;
     50    protected OsmPrimitivesTable mergedEntriesTable;
     51    protected OsmPrimitivesTable theirEntriesTable;
    5152
    5253    protected ListMergeModel<T> model;
     
    878879                trn("Their version ({0} entry)", "Their version ({0} entries)", model.getTheirEntriesSize(), model.getTheirEntriesSize())
    879880        );
     881    }
     882   
     883    public void unlinkAsListener() {
     884        myEntriesTable.unlinkAsListener();
     885        mergedEntriesTable.unlinkAsListener();
     886        theirEntriesTable.unlinkAsListener();
    880887    }
    881888
  • trunk/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java

    r5266 r5297  
    22package org.openstreetmap.josm.gui.conflict.pair.nodes;
    33
     4import java.util.List;
     5
    46import javax.swing.JScrollPane;
    5 import javax.swing.JTable;
    67
     8import org.openstreetmap.josm.Main;
    79import org.openstreetmap.josm.data.conflict.Conflict;
    810import org.openstreetmap.josm.data.osm.Node;
     
    1113import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
    1214import org.openstreetmap.josm.gui.conflict.pair.ListMerger;
     15import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    1316
    1417/**
     
    2326    @Override
    2427    protected JScrollPane buildMyElementsTable() {
    25         myEntriesTable  = new JTable(
     28        myEntriesTable  = new NodeListTable(
     29                "table.mynodes",
    2630                model.getMyTableModel(),
    27                 new NodeListColumnModel(
    28                         new NodeListTableCellRenderer()
    29                 ),
    3031                model.getMySelectionModel()
    3132        );
    32         myEntriesTable.setName("table.mynodes");
    33         myEntriesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    3433        return embeddInScrollPane(myEntriesTable);
    3534    }
     
    3736    @Override
    3837    protected JScrollPane buildMergedElementsTable() {
    39         mergedEntriesTable  = new JTable(
     38        mergedEntriesTable  = new NodeListTable(
     39                "table.mergednodes",
    4040                model.getMergedTableModel(),
    41                 new NodeListColumnModel(
    42                         new NodeListTableCellRenderer()
    43                 ),
    4441                model.getMergedSelectionModel()
    4542        );
    46         mergedEntriesTable.setName("table.mergednodes");
    47         mergedEntriesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    4843        return embeddInScrollPane(mergedEntriesTable);
    4944    }
     
    5146    @Override
    5247    protected JScrollPane buildTheirElementsTable() {
    53         theirEntriesTable  = new JTable(
     48        theirEntriesTable  = new NodeListTable(
     49                "table.theirnodes",
    5450                model.getTheirTableModel(),
    55                 new NodeListColumnModel(
    56                         new NodeListTableCellRenderer()
    57                 ),
    5851                model.getTheirSelectionModel()
    5952        );
    60         theirEntriesTable.setName("table.theirnodes");
    61         theirEntriesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    6253        return embeddInScrollPane(theirEntriesTable);
    6354    }
    6455
    6556    public void populate(Conflict<? extends OsmPrimitive> conflict) {
    66         ((NodeListMergeModel)model).populate((Way)conflict.getMy(), (Way)conflict.getTheir());
     57        Way myWay = (Way)conflict.getMy();
     58        Way theirWay = (Way)conflict.getTheir();
     59        ((NodeListMergeModel)model).populate(myWay, theirWay);
     60        myEntriesTable.setLayer(findLayerFor(myWay));
     61        theirEntriesTable.setLayer(findLayerFor(theirWay));
     62    }
     63   
     64    protected OsmDataLayer findLayerFor(Way w) {
     65        List<OsmDataLayer> layers = Main.map.mapView.getLayersOfType(OsmDataLayer.class);
     66        // Find layer with same dataset
     67        for (OsmDataLayer layer : layers) {
     68            if (layer.data == w.getDataSet()) {
     69                return layer;
     70            }
     71        }
     72        // Conflict after merging layers: a dataset could be no more in any layer, try to find another layer with same primitive
     73        for (OsmDataLayer layer : layers) {
     74            for (Way way : layer.data.getWays()) {
     75                if (way.getPrimitiveId().equals(w.getPrimitiveId())) {
     76                    return layer;
     77                }
     78            }
     79        }
     80        return null;
    6781    }
    6882
  • trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java

    r5266 r5297  
    33
    44import javax.swing.JScrollPane;
    5 import javax.swing.JTable;
    65
    76import org.openstreetmap.josm.data.conflict.Conflict;
     
    1817    @Override
    1918    protected JScrollPane buildMyElementsTable() {
    20         myEntriesTable  = new JTable(
     19        myEntriesTable  = new RelationMemberTable(
     20                "table.mymembers",
    2121                model.getMyTableModel(),
    22                 new RelationMemberListColumnModel(),
    2322                model.getMySelectionModel()
    2423        );
    25         myEntriesTable.setName("table.mynodes");
    26         myEntriesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    2724        return embeddInScrollPane(myEntriesTable);
    2825    }
     
    3027    @Override
    3128    protected JScrollPane buildMergedElementsTable() {
    32         mergedEntriesTable  = new JTable(
     29        mergedEntriesTable  = new RelationMemberTable(
     30                "table.mergedmembers",
    3331                model.getMergedTableModel(),
    34                 new RelationMemberListColumnModel(),
    3532                model.getMergedSelectionModel()
    3633        );
    3734        mergedEntriesTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
    38         mergedEntriesTable.setName("table.mergednodes");
    39         mergedEntriesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    4035        return embeddInScrollPane(mergedEntriesTable);
    4136    }
     
    4338    @Override
    4439    protected JScrollPane buildTheirElementsTable() {
    45         theirEntriesTable  = new JTable(
     40        theirEntriesTable  = new RelationMemberTable(
     41                "table.theirmembers",
    4642                model.getTheirTableModel(),
    47                 new RelationMemberListColumnModel(),
    4843                model.getTheirSelectionModel()
    4944        );
    50         theirEntriesTable.setName("table.theirnodes");
    51         theirEntriesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    5245        return embeddInScrollPane(theirEntriesTable);
    5346    }
  • trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java

    r5266 r5297  
    4646import org.openstreetmap.josm.gui.SideButton;
    4747import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     48import org.openstreetmap.josm.gui.util.GuiHelper;
    4849import org.openstreetmap.josm.tools.ImageProvider;
    4950import org.openstreetmap.josm.tools.Shortcut;
     
    156157    public final void refreshView() {
    157158        OsmDataLayer editLayer =  Main.main.getEditLayer();
    158         conflicts = editLayer == null?new ConflictCollection():editLayer.getConflicts();
    159         model.fireContentChanged();
    160         updateTitle(conflicts.size());
     159        conflicts = (editLayer == null ? new ConflictCollection() : editLayer.getConflicts());
     160        GuiHelper.runInEDT(new Runnable() {
     161            @Override
     162            public void run() {
     163                model.fireContentChanged();
     164                updateTitle(conflicts.size());
     165            }
     166        });
    161167    }
    162168
  • trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java

    r5266 r5297  
    99import java.awt.Dimension;
    1010import java.awt.FlowLayout;
    11 import java.awt.Point;
    1211import java.awt.event.ActionEvent;
    1312import java.beans.PropertyChangeEvent;
     
    10099    private void unregisterListeners() {
    101100        resolver.removePropertyChangeListener(applyResolutionAction);
     101        resolver.unregisterListeners();
    102102    }
    103103
  • trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java

    r5275 r5297  
    6363import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
    6464import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     65import org.openstreetmap.josm.gui.util.GuiHelper;
    6566import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
    6667import org.openstreetmap.josm.tools.CheckParameterUtil;
     
    704705        @Override
    705706        public void updateEnabledState() {
    706             if (layer == null) {
    707                 if (getModel().getSelectedLayers().size() != 1) {
    708                     setEnabled(false);
    709                     return;
    710                 }
    711                 Layer selectedLayer = getModel().getSelectedLayers().get(0);
    712                 setEnabled(!isActiveLayer(selectedLayer));
    713             } else {
    714                 setEnabled(!isActiveLayer(layer));
    715             }
     707            GuiHelper.runInEDT(new Runnable() {
     708                @Override
     709                public void run() {
     710                    if (layer == null) {
     711                        if (getModel().getSelectedLayers().size() != 1) {
     712                            setEnabled(false);
     713                            return;
     714                        }
     715                        Layer selectedLayer = getModel().getSelectedLayers().get(0);
     716                        setEnabled(!isActiveLayer(selectedLayer));
     717                    } else {
     718                        setEnabled(!isActiveLayer(layer));
     719                    }
     720                }
     721            });
    716722        }
    717723
     
    12551261                return;
    12561262            layer.removePropertyChangeListener(this);
    1257             int size = getRowCount();
    1258             List<Integer> rows = getSelectedRows();
    1259             if (rows.isEmpty() && size > 0) {
    1260                 selectionModel.setSelectionInterval(size-1, size-1);
    1261             }
    1262             fireTableDataChanged();
    1263             fireRefresh();
    1264             ensureActiveSelected();
     1263            final int size = getRowCount();
     1264            final List<Integer> rows = getSelectedRows();
     1265            GuiHelper.runInEDTAndWait(new Runnable() {
     1266                @Override
     1267                public void run() {
     1268                    if (rows.isEmpty() && size > 0) {
     1269                        selectionModel.setSelectionInterval(size-1, size-1);
     1270                    }
     1271                    fireTableDataChanged();
     1272                    fireRefresh();
     1273                    ensureActiveSelected();
     1274                }
     1275            });
    12651276        }
    12661277
     
    14261437            if (getLayers().isEmpty())
    14271438                return;
    1428             if (getActiveLayer() != null) {
     1439            final Layer activeLayer = getActiveLayer();
     1440            if (activeLayer != null) {
    14291441                // there's an active layer - select it and make it
    14301442                // visible
    1431                 int idx = getLayers().indexOf(getActiveLayer());
     1443                int idx = getLayers().indexOf(activeLayer);
    14321444                selectionModel.setSelectionInterval(idx, idx);
    14331445                ensureSelectedIsVisible();
     
    15061518        /* ------------------------------------------------------------------------------ */
    15071519        @Override
    1508         public void activeLayerChange(Layer oldLayer, Layer newLayer) {
    1509             if (oldLayer != null) {
    1510                 int idx = getLayers().indexOf(oldLayer);
    1511                 if (idx >= 0) {
    1512                     fireTableRowsUpdated(idx,idx);
    1513                 }
    1514             }
    1515 
    1516             if (newLayer != null) {
    1517                 int idx = getLayers().indexOf(newLayer);
    1518                 if (idx >= 0) {
    1519                     fireTableRowsUpdated(idx,idx);
    1520                 }
    1521             }
    1522             ensureActiveSelected();
     1520        public void activeLayerChange(final Layer oldLayer, final Layer newLayer) {
     1521            GuiHelper.runInEDTAndWait(new Runnable() {
     1522                @Override
     1523                public void run() {
     1524                    if (oldLayer != null) {
     1525                        int idx = getLayers().indexOf(oldLayer);
     1526                        if (idx >= 0) {
     1527                            fireTableRowsUpdated(idx,idx);
     1528                        }
     1529                    }
     1530
     1531                    if (newLayer != null) {
     1532                        int idx = getLayers().indexOf(newLayer);
     1533                        if (idx >= 0) {
     1534                            fireTableRowsUpdated(idx,idx);
     1535                        }
     1536                    }
     1537                    ensureActiveSelected();
     1538                }
     1539            });
    15231540        }
    15241541
  • 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}
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

    r5266 r5297  
    4545import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction;
    4646import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    47 
    48 public class MemberTableModel extends AbstractTableModel implements TableModelListener, SelectionChangedListener, DataSetListener {
     47import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
     48
     49public class MemberTableModel extends AbstractTableModel implements TableModelListener, SelectionChangedListener, DataSetListener, OsmPrimitivesTableModel {
    4950
    5051    /**
     
    198199    }
    199200
     201    @Override
    200202    public OsmPrimitive getReferredPrimitive(int idx) {
    201203        return members.get(idx).getMember();
     
    650652     * @return the unlinked node if element is a way, the node itself if element is a node, null otherwise
    651653     */
    652     private static Node getUnusedNode(RelationMember element, RelationMember linked_element)
     654    /*private static Node getUnusedNode(RelationMember element, RelationMember linked_element)
    653655    {
    654656        Node result = null;
     
    677679
    678680        return result;
    679     }
     681    }*/
    680682
    681683    /*
  • trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r5275 r5297  
    7878import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
    7979import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     80import org.openstreetmap.josm.gui.util.GuiHelper;
    8081import org.openstreetmap.josm.tools.DateUtils;
    8182import org.openstreetmap.josm.tools.FilteredCollection;
     
    386387        );
    387388
    388         StringBuffer sb = new StringBuffer();
     389        final StringBuffer sb = new StringBuffer();
    389390        sb.append("<html>").append(msg1).append("</html>");
    390391        if (numNewConflicts > 0) {
    391             ButtonSpec[] options = new ButtonSpec[] {
     392            final ButtonSpec[] options = new ButtonSpec[] {
    392393                    new ButtonSpec(
    393394                            tr("OK"),
     
    397398                    )
    398399            };
    399             HelpAwareOptionPane.showOptionDialog(
    400                     Main.parent,
    401                     sb.toString(),
    402                     tr("Conflicts detected"),
    403                     JOptionPane.WARNING_MESSAGE,
    404                     null, /* no icon */
    405                     options,
    406                     options[0],
    407                     ht("/Concepts/Conflict#WarningAboutDetectedConflicts")
    408             );
    409             Main.map.conflictDialog.unfurlDialog();
    410             Main.map.repaint();
     400            GuiHelper.runInEDT(new Runnable() {
     401                @Override
     402                public void run() {
     403                    HelpAwareOptionPane.showOptionDialog(
     404                            Main.parent,
     405                            sb.toString(),
     406                            tr("Conflicts detected"),
     407                            JOptionPane.WARNING_MESSAGE,
     408                            null, /* no icon */
     409                            options,
     410                            options[0],
     411                            ht("/Concepts/Conflict#WarningAboutDetectedConflicts")
     412                    );
     413                    Main.map.conflictDialog.unfurlDialog();
     414                    Main.map.repaint();
     415                }
     416            });
    411417        }
    412418    }
  • trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java

    r5233 r5297  
    77import java.awt.Container;
    88import java.awt.Image;
     9import java.lang.reflect.InvocationTargetException;
    910
    1011import javax.swing.Icon;
     
    4344        }
    4445    }
     46
     47    public static void runInEDTAndWait(Runnable task) {
     48        if (SwingUtilities.isEventDispatchThread()) {
     49            task.run();
     50        } else {
     51            try {
     52                SwingUtilities.invokeAndWait(task);
     53            } catch (InterruptedException e) {
     54                e.printStackTrace();
     55            } catch (InvocationTargetException e) {
     56                e.printStackTrace();
     57            }
     58        }
     59    }
    4560   
    4661    /**
Note: See TracChangeset for help on using the changeset viewer.