Ignore:
Timestamp:
03.12.2009 19:02:25 (2 years ago)
Author:
Gubaer
Message:

fixed #3400: relation editor: improvement to highlight an element
fixed #3873: Feature request: download selected elements in relation editor
New: Dbl-Click in member table to set the map selection to this member
New: Ctrl-Dbl-Clik in member table to add the member to the the map selection
New: Download selected incomplete members only

File:
1 edited

Legend:

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

    r2512 r2563  
    55 
    66import java.awt.BorderLayout; 
    7 import java.awt.Dialog; 
    87import java.awt.Dimension; 
    98import java.awt.FlowLayout; 
    109import java.awt.GridBagConstraints; 
    1110import java.awt.GridBagLayout; 
    12 import java.awt.Insets; 
    1311import java.awt.event.ActionEvent; 
    1412import java.awt.event.FocusAdapter; 
     
    1917import java.awt.event.WindowAdapter; 
    2018import java.awt.event.WindowEvent; 
    21 import java.io.IOException; 
     19import java.beans.PropertyChangeEvent; 
     20import java.beans.PropertyChangeListener; 
    2221import java.util.ArrayList; 
    2322import java.util.Collection; 
     
    3029import javax.swing.AbstractAction; 
    3130import javax.swing.BorderFactory; 
    32 import javax.swing.JButton; 
    3331import javax.swing.JComponent; 
    3432import javax.swing.JLabel; 
     
    3836import javax.swing.JSplitPane; 
    3937import javax.swing.JTabbedPane; 
    40 import javax.swing.JTable; 
     38import javax.swing.JToolBar; 
    4139import javax.swing.KeyStroke; 
    42 import javax.swing.SwingUtilities; 
    4340import javax.swing.event.ChangeEvent; 
    4441import javax.swing.event.ChangeListener; 
     
    5754import org.openstreetmap.josm.data.osm.DataSet; 
    5855import org.openstreetmap.josm.data.osm.OsmPrimitive; 
    59 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 
    6056import org.openstreetmap.josm.data.osm.Relation; 
    6157import org.openstreetmap.josm.data.osm.RelationMember; 
    6258import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil; 
    6359import org.openstreetmap.josm.gui.DefaultNameFormatter; 
    64 import org.openstreetmap.josm.gui.ExceptionDialogUtil; 
    6560import org.openstreetmap.josm.gui.HelpAwareOptionPane; 
    66 import org.openstreetmap.josm.gui.PleaseWaitRunnable; 
    6761import org.openstreetmap.josm.gui.SideButton; 
    6862import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec; 
     
    7064import org.openstreetmap.josm.gui.help.HelpUtil; 
    7165import org.openstreetmap.josm.gui.layer.OsmDataLayer; 
    72 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor; 
    73 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 
    7466import org.openstreetmap.josm.gui.tagging.AutoCompletingTextField; 
    7567import org.openstreetmap.josm.gui.tagging.TagEditorPanel; 
    7668import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
    7769import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
    78 import org.openstreetmap.josm.io.OsmServerBackreferenceReader; 
    79 import org.openstreetmap.josm.io.OsmServerObjectReader; 
    80 import org.openstreetmap.josm.io.OsmTransferException; 
    8170import org.openstreetmap.josm.tools.ImageProvider; 
    8271import org.openstreetmap.josm.tools.Shortcut; 
    83 import org.xml.sax.SAXException; 
    8472 
    8573/** 
     
    125113        // 
    126114        memberTableModel = new MemberTableModel(getLayer()); 
     115        DataSet.selListeners.add(memberTableModel); 
     116        getLayer().data.addDataSetListener(memberTableModel); 
     117        getLayer().listenerDataChanged.add(memberTableModel); 
    127118        selectionTableModel = new SelectionTableModel(getLayer()); 
     119        DataSet.selListeners.add(selectionTableModel); 
    128120        referrerModel = new ReferringRelationsBrowserModel(relation); 
    129121 
     
    173165        ); 
    174166 
     167        getContentPane().add(buildToolBar(), BorderLayout.NORTH); 
    175168        getContentPane().add(tabbedPane, BorderLayout.CENTER); 
    176169        getContentPane().add(buildOkCancelButtonPanel(), BorderLayout.SOUTH); 
     
    189182        memberTableModel.setSelectedMembers(selectedMembers); 
    190183        HelpUtil.setHelpContext(getRootPane(),ht("/Dialog/RelationEditor")); 
     184    } 
     185 
     186    /** 
     187     * Creates the toolbar 
     188     *  
     189     * @return the toolbar 
     190     */ 
     191    protected JToolBar buildToolBar() { 
     192        JToolBar tb  = new JToolBar(); 
     193        tb.setFloatable(false); 
     194        tb.add(new ApplyAction()); 
     195        tb.add(new DuplicateRelationAction()); 
     196        DeleteCurrentRelationAction deleteAction = new DeleteCurrentRelationAction(); 
     197        addPropertyChangeListener(deleteAction); 
     198        tb.add(deleteAction); 
     199        return tb; 
    191200    } 
    192201 
     
    280289        pnl.add(scrollPane, gc); 
    281290 
     291        // --- role editing 
     292        JPanel p3 = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
     293        p3.add(new JLabel(tr("Apply Role:"))); 
     294        tfRole = new AutoCompletingTextField(10); 
     295        tfRole.setToolTipText(tr("Enter a role and apply it to the selected relation members")); 
     296        tfRole.addFocusListener(new FocusAdapter() { 
     297            @Override 
     298            public void focusGained(FocusEvent e) { 
     299                tfRole.selectAll(); 
     300            } 
     301        }); 
     302        tfRole.setAutoCompletionList(new AutoCompletionList()); 
     303        tfRole.addFocusListener( 
     304                new FocusAdapter() { 
     305                    @Override 
     306                    public void focusGained(FocusEvent e) { 
     307                        AutoCompletionList list = tfRole.getAutoCompletionList(); 
     308                        AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(list); 
     309                    } 
     310                } 
     311        ); 
     312        p3.add(tfRole); 
     313        SetRoleAction setRoleAction = new SetRoleAction(); 
     314        memberTableModel.getSelectionModel().addListSelectionListener(setRoleAction); 
     315        tfRole.getDocument().addDocumentListener(setRoleAction); 
     316        tfRole.addActionListener(setRoleAction); 
     317        memberTableModel.getSelectionModel().addListSelectionListener( 
     318                new ListSelectionListener() { 
     319                    public void valueChanged(ListSelectionEvent e) { 
     320                        tfRole.setEnabled(memberTable.getSelectedRowCount() > 0); 
     321                    } 
     322                } 
     323        ); 
     324        tfRole.setEnabled(memberTable.getSelectedRowCount() > 0); 
     325 
     326        gc.gridx = 1; 
     327        gc.gridy = 2; 
     328        gc.fill = GridBagConstraints.BOTH; 
     329        gc.anchor = GridBagConstraints.CENTER; 
     330        gc.weightx = 1.0; 
     331        gc.weighty = 0.0; 
     332        pnl.add(p3, gc); 
     333 
    282334        JPanel pnl2 = new JPanel(); 
    283335        pnl2.setLayout(new GridBagLayout()); 
     
    326378        pnl3.setLayout(new BorderLayout()); 
    327379        pnl3.add(splitPane, BorderLayout.CENTER); 
    328         pnl3.add(buildButtonPanel(), BorderLayout.SOUTH); 
    329380        return pnl3; 
    330381    } 
     
    338389        JPanel pnl = new JPanel(); 
    339390        pnl.setLayout(new BorderLayout()); 
    340         JTable tbl = new JTable(selectionTableModel, new SelectionTableColumnModel(memberTableModel)); 
    341         tbl.setEnabled(false); 
     391        SelectionTable tbl = new SelectionTable(selectionTableModel, new SelectionTableColumnModel(memberTableModel)); 
     392        tbl.setMemberTableModel(memberTableModel); 
    342393        JScrollPane pane = new JScrollPane(tbl); 
    343394        pnl.add(pane, BorderLayout.CENTER); 
     
    371422     * @return 
    372423     */ 
    373     protected JPanel buildLeftButtonPanel() { 
    374         JPanel pnl = new JPanel(); 
    375         pnl.setLayout(new GridBagLayout()); 
    376  
    377         GridBagConstraints gc = new GridBagConstraints(); 
    378         gc.gridx = 0; 
    379         gc.gridy = 0; 
    380         gc.gridheight = 1; 
    381         gc.gridwidth = 1; 
    382         gc.insets = new Insets(0, 5, 0, 5); 
    383         gc.fill = GridBagConstraints.HORIZONTAL; 
    384         gc.anchor = GridBagConstraints.CENTER; 
    385         gc.weightx = 0.0; 
    386         gc.weighty = 0.0; 
    387  
    388         // ----- 
    389         gc.gridy = 0; 
     424    protected JToolBar buildLeftButtonPanel() { 
     425        JToolBar tb = new JToolBar(); 
     426        tb.setOrientation(JToolBar.VERTICAL); 
     427        tb.setFloatable(false); 
     428 
     429        // -- move up action 
    390430        MoveUpAction moveUpAction = new MoveUpAction(); 
    391431        memberTableModel.getSelectionModel().addListSelectionListener(moveUpAction); 
    392         pnl.add(new JButton(moveUpAction), gc); 
    393  
    394         // ----- 
    395         gc.gridy = 1; 
     432        tb.add(moveUpAction); 
     433 
     434        // -- move down action 
    396435        MoveDownAction moveDownAction = new MoveDownAction(); 
    397436        memberTableModel.getSelectionModel().addListSelectionListener(moveDownAction); 
    398         pnl.add(new JButton(moveDownAction), gc); 
     437        tb.add(moveDownAction); 
     438 
     439        tb.addSeparator(); 
    399440 
    400441        // -- edit action 
    401         gc.gridy = 2; 
    402442        EditAction editAction = new EditAction(); 
    403443        memberTableModel.getSelectionModel().addListSelectionListener(editAction); 
    404         pnl.add(new JButton(editAction),gc); 
    405  
    406         // ------ 
    407         gc.gridy = 3; 
     444        tb.add(editAction); 
     445 
     446        // -- delete action 
    408447        RemoveAction removeSelectedAction = new RemoveAction(); 
    409448        memberTable.getSelectionModel().addListSelectionListener(removeSelectedAction); 
    410         pnl.add(new JButton(removeSelectedAction), gc); 
    411  
    412         // ------ 
    413         gc.gridy = 4; 
    414         SelectPrimitivesForSelectedMembersAction selectAction = new SelectPrimitivesForSelectedMembersAction(); 
    415         memberTable.getSelectionModel().addListSelectionListener(selectAction); 
    416         pnl.add(new JButton(selectAction), gc); 
    417  
    418         // ------ 
    419         gc.gridy = 5; 
     449        tb.add(removeSelectedAction); 
     450 
     451        tb.addSeparator(); 
     452        // -- sort action 
    420453        SortAction sortAction = new SortAction(); 
    421         pnl.add(new JButton(sortAction), gc); 
    422  
    423         // ------ 
    424         // just grab the remaining space 
    425         gc.gridy = 6; 
    426         gc.weighty = 1.0; 
    427         gc.fill = GridBagConstraints.BOTH; 
    428         pnl.add(new JPanel(), gc); 
    429         return pnl; 
     454        tb.add(sortAction); 
     455 
     456        tb.addSeparator(); 
     457 
     458        // -- download action 
     459        DownloadIncompleteMembersAction downloadIncompleteMembersAction = new DownloadIncompleteMembersAction(); 
     460        memberTable.getModel().addTableModelListener(downloadIncompleteMembersAction); 
     461        tb.add(downloadIncompleteMembersAction); 
     462 
     463        // -- download selected action 
     464        DownloadSelectedIncompleteMembersAction downloadSelectedIncompleteMembersAction = new DownloadSelectedIncompleteMembersAction(); 
     465        memberTable.getModel().addTableModelListener(downloadSelectedIncompleteMembersAction); 
     466        memberTable.getSelectionModel().addListSelectionListener(downloadSelectedIncompleteMembersAction); 
     467        tb.add(downloadSelectedIncompleteMembersAction); 
     468 
     469        return tb; 
    430470    } 
    431471 
     
    435475     * @return 
    436476     */ 
    437     protected JPanel buildSelectionControlButtonPanel() { 
    438         JPanel pnl = new JPanel(); 
    439         pnl.setLayout(new GridBagLayout()); 
    440  
    441         GridBagConstraints gc = new GridBagConstraints(); 
    442         gc.gridx = 0; 
    443         gc.gridy = 0; 
    444         gc.gridheight = 1; 
    445         gc.gridwidth = 1; 
    446         gc.insets = new Insets(0, 5, 0, 5); 
    447         gc.fill = GridBagConstraints.HORIZONTAL; 
    448         gc.anchor = GridBagConstraints.CENTER; 
    449         gc.weightx = 0.0; 
    450         gc.weighty = 0.0; 
     477    protected JToolBar buildSelectionControlButtonPanel() { 
     478        JToolBar tb = new JToolBar(JToolBar.VERTICAL); 
     479        tb.setFloatable(false); 
     480 
     481 
     482        // -- add at end action 
    451483        AddSelectedAtEndAction addSelectedAtEndAction = new AddSelectedAtEndAction(); 
    452484        selectionTableModel.addTableModelListener(addSelectedAtEndAction); 
    453         pnl.add(new JButton(addSelectedAtEndAction), gc); 
    454  
    455         // ----- 
    456         gc.gridy = 1; 
     485        tb.add(addSelectedAtEndAction); 
     486 
     487        // -- select members action 
    457488        SelectedMembersForSelectionAction selectMembersForSelectionAction = new SelectedMembersForSelectionAction(); 
    458489        selectionTableModel.addTableModelListener(selectMembersForSelectionAction); 
    459490        memberTableModel.addTableModelListener(selectMembersForSelectionAction); 
    460         pnl.add(new JButton(selectMembersForSelectionAction), gc); 
    461  
    462         // ----- 
    463         gc.gridy = 2; 
     491        tb.add(selectMembersForSelectionAction); 
     492 
     493        tb.addSeparator(); 
     494 
     495        // -- remove selected action 
    464496        RemoveSelectedAction removeSelectedAction = new RemoveSelectedAction(); 
    465497        selectionTableModel.addTableModelListener(removeSelectedAction); 
    466         pnl.add(new JButton(removeSelectedAction), gc); 
    467  
    468         // ------ 
    469         // just grab the remaining space 
    470         gc.gridy = 3; 
    471         gc.weighty = 1.0; 
    472         gc.fill = GridBagConstraints.BOTH; 
    473         pnl.add(new JPanel(), gc); 
    474  
    475         // ----- 
    476         gc.gridy = 4; 
    477         gc.weighty = 0.0; 
     498        tb.add(removeSelectedAction); 
     499 
     500        // -- select action 
     501        SelectPrimitivesForSelectedMembersAction selectAction = new SelectPrimitivesForSelectedMembersAction(); 
     502        memberTable.getSelectionModel().addListSelectionListener(selectAction); 
     503        tb.add(selectAction); 
     504 
     505        tb.addSeparator(); 
     506 
     507        // -- add at start action 
    478508        AddSelectedAtStartAction addSelectionAction = new AddSelectedAtStartAction(); 
    479509        selectionTableModel.addTableModelListener(addSelectionAction); 
    480         pnl.add(new JButton(addSelectionAction), gc); 
    481  
    482         // ----- 
    483         gc.gridy = 5; 
     510        tb.add(addSelectionAction); 
     511 
     512        // -- add before selected action 
    484513        AddSelectedBeforeSelection addSelectedBeforeSelectionAction = new AddSelectedBeforeSelection(); 
    485514        selectionTableModel.addTableModelListener(addSelectedBeforeSelectionAction); 
    486515        memberTableModel.getSelectionModel().addListSelectionListener(addSelectedBeforeSelectionAction); 
    487         pnl.add(new JButton(addSelectedBeforeSelectionAction), gc); 
    488  
    489         // ----- 
    490         gc.gridy = 6; 
     516        tb.add(addSelectedBeforeSelectionAction); 
     517 
     518        // -- add after selected action 
    491519        AddSelectedAfterSelection addSelectedAfterSelectionAction = new AddSelectedAfterSelection(); 
    492520        selectionTableModel.addTableModelListener(addSelectedAfterSelectionAction); 
    493521        memberTableModel.getSelectionModel().addListSelectionListener(addSelectedAfterSelectionAction); 
    494         pnl.add(new JButton(addSelectedAfterSelectionAction), gc); 
    495  
    496         return pnl; 
    497     } 
    498  
    499     /** 
    500      * Creates the buttons for the basic editing layout 
    501      * @return {@see JPanel} with basic buttons 
    502      */ 
    503     protected JPanel buildButtonPanel() { 
    504         JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
    505  
    506         // --- download members 
    507         buttonPanel.add(new SideButton(new DownlaodAction())); 
    508  
    509         // --- role editing 
    510         buttonPanel.add(new JLabel(tr("Role:"))); 
    511         tfRole = new AutoCompletingTextField(10); 
    512         tfRole.addFocusListener(new FocusAdapter() { 
    513             @Override 
    514             public void focusGained(FocusEvent e) { 
    515                 tfRole.selectAll(); 
    516             } 
    517         }); 
    518         tfRole.setAutoCompletionList(new AutoCompletionList()); 
    519         tfRole.addFocusListener( 
    520                 new FocusAdapter() { 
    521                     @Override 
    522                     public void focusGained(FocusEvent e) { 
    523                         AutoCompletionList list = tfRole.getAutoCompletionList(); 
    524                         AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(list); 
    525                     } 
    526                 } 
    527         ); 
    528  
    529         buttonPanel.add(tfRole); 
    530         SetRoleAction setRoleAction = new SetRoleAction(); 
    531         memberTableModel.getSelectionModel().addListSelectionListener(setRoleAction); 
    532         buttonPanel.add(new SideButton(setRoleAction)); 
    533         tfRole.getDocument().addDocumentListener(setRoleAction); 
    534         tfRole.addActionListener(setRoleAction); 
    535  
    536         // --- copy relation action 
    537         buttonPanel.add(new SideButton(new DuplicateRelationAction())); 
    538  
    539         // --- apply relation action 
    540         buttonPanel.add(new SideButton(new ApplyAction())); 
    541  
    542         // --- delete relation action 
    543         buttonPanel.add(new SideButton(new DeleteCurrentRelationAction())); 
    544         return buttonPanel; 
     522        tb.add(addSelectedAfterSelectionAction); 
     523 
     524        return tb; 
    545525    } 
    546526 
     
    548528    protected Dimension findMaxDialogSize() { 
    549529        // FIXME: Make it remember dialog size 
    550         return new Dimension(700, 500); 
    551     } 
    552  
    553     @Override 
    554     public void dispose() { 
    555         selectionTableModel.unregister(); 
    556         DataSet.selListeners.remove(memberTableModel); 
    557         super.dispose(); 
     530        return new Dimension(700, 650); 
    558531    } 
    559532 
     
    561534    public void setVisible(boolean visible) { 
    562535        if (visible) { 
    563             tagEditorPanel.initAutoCompletion(Main.main.getEditLayer()); 
     536            tagEditorPanel.initAutoCompletion(getLayer()); 
    564537        } 
    565538        super.setVisible(visible); 
    566539        if (!visible) { 
     540            // make sure all registered listeners are unregistered 
     541            // 
     542            selectionTableModel.unregister(); 
     543            DataSet.selListeners.remove(memberTableModel); 
     544            DataSet.selListeners.remove(selectionTableModel); 
     545            getLayer().data.removeDataSetListener(memberTableModel); 
     546            getLayer().listenerDataChanged.remove(memberTableModel); 
    567547            dispose(); 
    568548        } 
     
    888868    } 
    889869 
    890     class SortAction extends AbstractAction { 
     870    class SortAction extends AbstractAction implements ListSelectionListener { 
    891871        public SortAction() { 
    892872            putValue(SHORT_DESCRIPTION, tr("Sort the relation members")); 
    893873            putValue(SMALL_ICON, ImageProvider.get("dialogs", "sort")); 
    894             // putValue(NAME, tr("Sort")); 
     874            putValue(NAME, tr("Sort")); 
    895875            Shortcut.registerShortcut("relationeditor:sort", tr("Relation Editor: Sort"), KeyEvent.VK_T, 
    896876                    Shortcut.GROUP_MNEMONIC); 
    897             //setEnabled(false); 
     877            updateEnabledState(); 
    898878        } 
    899879 
    900880        public void actionPerformed(ActionEvent e) { 
    901881            memberTableModel.sort(); 
     882        } 
     883 
     884        protected void updateEnabledState() { 
     885            setEnabled(memberTable.getSelectedRowCount() > 0); 
     886        } 
     887 
     888        public void valueChanged(ListSelectionEvent e) { 
     889            updateEnabledState(); 
    902890        } 
    903891    } 
     
    960948    } 
    961949 
    962     class DeleteCurrentRelationAction extends AbstractAction { 
     950    class DeleteCurrentRelationAction extends AbstractAction implements PropertyChangeListener{ 
    963951        public DeleteCurrentRelationAction() { 
    964952            putValue(SHORT_DESCRIPTION, tr("Delete the currently edited relation")); 
     
    983971 
    984972        protected void updateEnabledState() { 
    985             setEnabled(getRelation() != null); 
     973            setEnabled(getRelationSnapshot() != null); 
     974        } 
     975 
     976        public void propertyChange(PropertyChangeEvent evt) { 
     977            if (evt.getPropertyName().equals(RELATION_SNAPSHOT_PROP)) { 
     978                updateEnabledState(); 
     979            } 
    986980        } 
    987981    } 
     
    11871181    } 
    11881182 
    1189     class DownlaodAction extends AbstractAction { 
    1190         public DownlaodAction() { 
    1191             putValue(SHORT_DESCRIPTION, tr("Download all incomplete ways and nodes in relation")); 
    1192             putValue(SMALL_ICON, ImageProvider.get("dialogs", "downloadincomplete")); 
     1183    class DownloadIncompleteMembersAction extends AbstractAction implements TableModelListener { 
     1184        public DownloadIncompleteMembersAction() { 
     1185            putValue(SHORT_DESCRIPTION, tr("Download all incomplete members")); 
     1186            putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincomplete")); 
    11931187            putValue(NAME, tr("Download Members")); 
    11941188            Shortcut.registerShortcut("relationeditor:downloadincomplete", tr("Relation Editor: Download Members"), 
     
    12001194            if (!isEnabled()) 
    12011195                return; 
    1202             Main.worker.submit(new DownloadTask( 
    1203                     Collections.singletonList(getRelation()), 
     1196            Main.worker.submit(new DownloadRelationMemberTask( 
     1197                    getRelation(), 
     1198                    memberTableModel.getIncompleteMemberPrimitives(), 
    12041199                    getLayer(), 
    12051200                    memberTableModel, 
     
    12091204 
    12101205        protected void updateEnabledState() { 
    1211             setEnabled(getRelation() != null && !getRelation().isNew()); 
     1206            setEnabled( 
     1207                    getRelation() != null 
     1208                    && !getRelation().isNew() 
     1209                    && memberTableModel.hasIncompleteMembers() 
     1210            ); 
     1211        } 
     1212 
     1213        public void tableChanged(TableModelEvent e) { 
     1214            updateEnabledState(); 
     1215        } 
     1216    } 
     1217 
     1218    class DownloadSelectedIncompleteMembersAction extends AbstractAction implements ListSelectionListener, TableModelListener{ 
     1219        public DownloadSelectedIncompleteMembersAction() { 
     1220            putValue(SHORT_DESCRIPTION, tr("Download selected incomplete members")); 
     1221            putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected")); 
     1222            putValue(NAME, tr("Download Members")); 
     1223            Shortcut.registerShortcut("relationeditor:downloadincomplete", tr("Relation Editor: Download Members"), 
     1224                    KeyEvent.VK_K, Shortcut.GROUP_MNEMONIC); 
     1225            updateEnabledState(); 
     1226        } 
     1227 
     1228        public void actionPerformed(ActionEvent e) { 
     1229            if (!isEnabled()) 
     1230                return; 
     1231            Main.worker.submit(new DownloadRelationMemberTask( 
     1232                    getRelation(), 
     1233                    memberTableModel.getSelectedIncompleteMemberPrimitives(), 
     1234                    getLayer(), 
     1235                    memberTableModel, 
     1236                    GenericRelationEditor.this) 
     1237            ); 
     1238        } 
     1239 
     1240        protected void updateEnabledState() { 
     1241            setEnabled( 
     1242                    getRelation() != null 
     1243                    && !getRelation().isNew() 
     1244                    && memberTableModel.hasIncompleteSelectedMembers() 
     1245            ); 
     1246        } 
     1247 
     1248        public void valueChanged(ListSelectionEvent e) { 
     1249            updateEnabledState(); 
     1250        } 
     1251 
     1252        public void tableChanged(TableModelEvent e) { 
     1253            updateEnabledState(); 
    12121254        } 
    12131255    } 
     
    13661408        } 
    13671409    } 
    1368  
    1369     /** 
    1370      * The asynchronous task for downloading relation members. 
    1371      * 
    1372      */ 
    1373     public static class DownloadTask extends PleaseWaitRunnable { 
    1374         private boolean cancelled; 
    1375         private Exception lastException; 
    1376         private List<Relation> relations; 
    1377         private OsmDataLayer curLayer; 
    1378         private MemberTableModel memberTableModel; 
    1379         private OsmServerObjectReader objectReader; 
    1380         private OsmServerBackreferenceReader parentReader; 
    1381  
    1382         public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) { 
    1383             super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /* don't ignore exception */); 
    1384             this.relations = relations; 
    1385             this.curLayer = curLayer; 
    1386             this.memberTableModel = memberTableModel; 
    1387         } 
    1388  
    1389         public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel) { 
    1390             super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /* don't ignore exception */); 
    1391             this.relations = relations; 
    1392             this.curLayer = curLayer; 
    1393             this.memberTableModel = memberTableModel; 
    1394         } 
    1395  
    1396         @Override 
    1397         protected void cancel() { 
    1398             cancelled = true; 
    1399             synchronized(this) { 
    1400                 if (objectReader != null) { 
    1401                     objectReader.cancel(); 
    1402                 } else if (parentReader != null) { 
    1403                     parentReader.cancel(); 
    1404                 } 
    1405             } 
    1406         } 
    1407  
    1408         @Override 
    1409         protected void finish() { 
    1410             Main.map.repaint(); 
    1411             if (cancelled) 
    1412                 return; 
    1413             if (memberTableModel != null) { 
    1414                 memberTableModel.fireTableDataChanged(); 
    1415             } 
    1416             if (lastException != null) { 
    1417                 ExceptionDialogUtil.explainException(lastException); 
    1418             } 
    1419         } 
    1420  
    1421         @Override 
    1422         protected void realRun() throws SAXException, IOException, OsmTransferException { 
    1423             try { 
    1424                 for (Relation relation : relations) { 
    1425                     // download the relation 
    1426                     // 
    1427                     progressMonitor.indeterminateSubTask(tr("Downloading relation ''{0}''", relation.getDisplayName(DefaultNameFormatter.getInstance()))); 
    1428                     synchronized(this) { 
    1429                         if (cancelled) return; 
    1430                         objectReader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.RELATION, true /* full download */); 
    1431                     } 
    1432                     final DataSet dataSet = objectReader.parseOsm(progressMonitor 
    1433                             .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); 
    1434                     if (dataSet == null) 
    1435                         return; 
    1436                     synchronized (this) { 
    1437                         if (cancelled) return; 
    1438                         objectReader = null; 
    1439                     } 
    1440  
    1441                     // download referring objects of the downloaded member objects 
    1442                     // 
    1443                     // asked for in #3999, but uncommented for the time being. Could be used 
    1444                     // later, perhaps if user explicity requests so (for instance by checking 
    1445                     // a checkbox) 
    1446                     //                    for (OsmPrimitive p: relation.getMemberPrimitives()) { 
    1447                     //                        synchronized(this) { 
    1448                     //                            if (cancelled) return; 
    1449                     //                            parentReader = new OsmServerBackreferenceReader(p); 
    1450                     //                        } 
    1451                     //                        DataSet parents = parentReader.parseOsm(progressMonitor.createSubTaskMonitor(1, false)); 
    1452                     //                        synchronized(this) { 
    1453                     //                            if (cancelled) return; 
    1454                     //                            parentReader = null; 
    1455                     //                        } 
    1456                     //                        DataSetMerger merger = new DataSetMerger(dataSet, parents); 
    1457                     //                        merger.merge(); 
    1458                     //                    } 
    1459                     //                    if (cancelled) return; 
    1460  
    1461                     // has to run on the EDT because mergeFrom may trigger events 
    1462                     // which update the UI 
    1463                     // 
    1464                     SwingUtilities.invokeAndWait( 
    1465                             new Runnable() { 
    1466                                 public void run() { 
    1467                                     curLayer.mergeFrom(dataSet); 
    1468                                     curLayer.fireDataChange(); 
    1469                                     curLayer.onPostDownloadFromServer(); 
    1470                                 } 
    1471                             } 
    1472                     ); 
    1473                 } 
    1474             } catch (Exception e) { 
    1475                 if (cancelled) { 
    1476                     System.out.println(tr("Warning: ignoring exception because task is cancelled. Exception: {0}", e 
    1477                             .toString())); 
    1478                     return; 
    1479                 } 
    1480                 lastException = e; 
    1481             } 
    1482         } 
    1483     } 
    14841410} 
Note: See TracChangeset for help on using the changeset viewer.