Changeset 1431 in josm


Ignore:
Timestamp:
Feb 19, 2009 6:56:23 PM (4 years ago)
Author:
stoecker
Message:

close #2187. modified patch by xeen

File:
1 edited

Legend:

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

    r1415 r1431  
    44import static org.openstreetmap.josm.tools.I18n.tr; 
    55 
    6 import java.awt.BorderLayout; 
    76import java.awt.Dimension; 
    87import java.awt.GridBagLayout; 
     
    1110import java.awt.event.ActionListener; 
    1211import java.awt.event.KeyEvent; 
    13 import java.beans.PropertyChangeEvent; 
    14 import java.beans.PropertyChangeListener; 
    1512import java.io.IOException; 
    1613import java.text.Collator; 
     
    2219import java.util.Map.Entry; 
    2320 
    24 import javax.swing.BoxLayout; 
    25 import javax.swing.JButton; 
    26 import javax.swing.JFrame; 
    2721import javax.swing.JLabel; 
    2822import javax.swing.JOptionPane; 
     
    4741import org.openstreetmap.josm.data.osm.RelationMember; 
    4842import org.openstreetmap.josm.data.osm.visitor.MergeVisitor; 
     43import org.openstreetmap.josm.gui.ExtendedDialog; 
    4944import org.openstreetmap.josm.gui.OsmPrimitivRenderer; 
     45import org.openstreetmap.josm.gui.SideButton; 
    5046import org.openstreetmap.josm.io.OsmServerObjectReader; 
    5147import org.openstreetmap.josm.tools.GBC; 
    52 import org.openstreetmap.josm.tools.ImageProvider; 
     48import org.openstreetmap.josm.tools.Shortcut; 
    5349import org.xml.sax.SAXException; 
    5450 
     
    6460 * 
    6561 */ 
    66 public class RelationEditor extends JFrame { 
     62public class RelationEditor extends ExtendedDialog { 
    6763 
    6864    /** 
     
    202198    public RelationEditor(Relation relation, Collection<RelationMember> selectedMembers ) 
    203199    { 
    204         super(relation == null ? tr("Create new relation") : 
    205             relation.id == 0 ? tr ("Edit new relation") : 
    206             tr("Edit relation #{0}", relation.id)); 
     200        // Initalizes ExtendedDialog 
     201        super(Main.parent, 
     202                relation == null 
     203                    ? tr("Create new relation") 
     204                    : (relation.id == 0 
     205                            ? tr ("Edit new relation") 
     206                            : tr("Edit relation #{0}", relation.id) 
     207                       ), 
     208                new String[] { tr("Apply Changes"), tr("Cancel")}, 
     209                false 
     210        ); 
     211 
    207212        this.relation = relation; 
    208  
    209213        ordered = !Main.pref.get("osm-server.version", "0.5").equals("0.5"); 
    210  
     214ordered = true; 
    211215        if (relation == null) { 
    212216            // create a new relation 
     
    218222        } 
    219223 
    220         getContentPane().setLayout(new BorderLayout()); 
     224        JPanel bothTables = setupBasicLayout(selectedMembers); 
     225 
    221226        JTabbedPane tabPane = new JTabbedPane(); 
    222         getContentPane().add(tabPane, BorderLayout.CENTER); 
    223  
    224         // (ab)use JOptionPane to make this look familiar; 
    225         // hook up with JOptionPane's property change event 
    226         // to detect button click 
    227         final JOptionPane okcancel = new JOptionPane("", 
    228             JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null); 
    229         getContentPane().add(okcancel, BorderLayout.SOUTH); 
    230  
    231         okcancel.addPropertyChangeListener(new PropertyChangeListener() { 
    232             public void propertyChange(PropertyChangeEvent event) { 
    233                 if (event.getPropertyName().equals(JOptionPane.VALUE_PROPERTY) && event.getNewValue() != null) { 
    234                     if ((Integer)event.getNewValue() == JOptionPane.OK_OPTION) { 
    235                         // clicked ok! 
    236                         if (RelationEditor.this.relation == null) { 
    237                             Main.main.undoRedo.add(new AddCommand(clone)); 
    238                             DataSet.fireSelectionChanged(Main.ds.getSelected()); 
    239                         } else if (!RelationEditor.this.relation.realEqual(clone, true)) { 
    240                             Main.main.undoRedo.add(new ChangeCommand(RelationEditor.this.relation, clone)); 
    241                             DataSet.fireSelectionChanged(Main.ds.getSelected()); 
    242                         } 
    243                     } 
    244                     setVisible(false); 
    245                 } 
    246             } 
    247         }); 
     227        tabPane.add(bothTables, tr("Basic")); 
     228 
     229        // This sets the minimum size before scrollbars appear on the dialog 
     230        tabPane.setPreferredSize(new Dimension(100, 100)); 
     231        contentConstraints = GBC.eol().fill().insets(5,10,5,0); 
     232        setupDialog(tabPane, new String[] { "ok.png", "cancel.png" }); 
     233        // FIXME: Make it remember last screen position 
     234        setSize(findMaxDialogSize()); 
    248235 
    249236        try { setAlwaysOnTop(true); } catch (SecurityException sx) {} 
    250237 
    251         // Basic Editor panel has two blocks; 
    252         // a tag table at the top and a membership list below. 
    253  
     238        setVisible(true); 
     239 
     240        if(getValue() != 1) 
     241            return; 
     242 
     243        // User clicked "Apply" 
     244        applyChanges(); 
     245    } 
     246 
     247    /** 
     248     * Basic Editor panel has two blocks: a tag table at the top and a membership list below 
     249     * @param selectedMembers 
     250     * @return a JPanel with the described layout 
     251     */ 
     252    private JPanel setupBasicLayout(Collection<RelationMember> selectedMembers) { 
    254253        // setting up the properties table 
    255  
    256254        propertyData.setColumnIdentifiers(new String[]{tr("Key"),tr("Value")}); 
    257255        propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     
    319317        // this is not exactly pretty but the four buttons simply don't fit in one line. 
    320318        // we should have smaller buttons for situations like this. 
    321         JPanel buttonPanel = new JPanel(new GridLayout(2,ordered ? 3 : 2)); 
    322  
    323         if (ordered) { 
    324             buttonPanel.add(createButton(null, "moveup", tr("Move the currently selected members up"), KeyEvent.VK_U, new ActionListener() { 
    325                 public void actionPerformed(ActionEvent e) { 
    326                     moveMembers(-1); 
    327                 } 
    328             })); 
    329         } 
     319        JPanel buttonPanel = setupBasicButtons(); 
     320 
    330321        bothTables.add(new JScrollPane(memberTable), GBC.eol().fill(GBC.BOTH)); 
    331  
    332         buttonPanel.add(createButton(marktr("Add Selected"),"addselected", 
    333         tr("Add all currently selected objects as members"), KeyEvent.VK_A, new ActionListener() { 
    334             public void actionPerformed(ActionEvent e) { 
    335                 addSelected(); 
    336             } 
    337         })); 
    338  
    339         buttonPanel.add(createButton(marktr("Remove Selected"),"removeselected", 
    340         tr("Remove all currently selected objects from relation"), KeyEvent.VK_R, new ActionListener() { 
    341             public void actionPerformed(ActionEvent e) { 
    342                 deleteSelected(); 
    343             } 
    344         })); 
    345  
    346         if(ordered) { 
    347             buttonPanel.add(createButton(null, "movedown", tr("Move the currently selected members down"), KeyEvent.VK_N, new ActionListener() { 
    348                 public void actionPerformed(ActionEvent e) { 
    349                     moveMembers(1); 
    350                 } 
    351             })); 
    352         } 
    353  
    354         buttonPanel.add(createButton(marktr("Remove"),"remove", 
    355         tr("Remove the member in the current table row from this relation"), KeyEvent.VK_D, new ActionListener() { 
    356             public void actionPerformed(ActionEvent e) { 
    357                 int[] rows = memberTable.getSelectedRows(); 
    358                 RelationMember mem = new RelationMember(); 
    359                 for (int row : rows) { 
    360                     mem.role = memberTable.getValueAt(row, 0).toString(); 
    361                     mem.member = (OsmPrimitive) memberTable.getValueAt(row, 1); 
    362                     clone.members.remove(mem); 
    363                 } 
    364                 refreshTables(); 
    365             } 
    366         })); 
    367  
    368         buttonPanel.add(createButton(marktr("Download Members"),"downloadincomplete", 
    369         tr("Download all incomplete ways and nodes in relation"), KeyEvent.VK_L, new ActionListener() { 
    370             public void actionPerformed(ActionEvent e) { 
    371                 downloadRelationMembers(); 
    372                 refreshTables(); 
    373             } 
    374         })); 
    375  
    376322        bothTables.add(buttonPanel, GBC.eop().fill(GBC.HORIZONTAL)); 
    377  
    378         tabPane.add(bothTables, tr("Basic")); 
    379  
    380323        refreshTables(); 
    381324 
     
    398341            } 
    399342        } 
    400  
    401         setSize(new Dimension(600, 500)); 
    402         setLocationRelativeTo(Main.parent); 
     343        return bothTables; 
     344    } 
     345 
     346    /** 
     347     * Creates the buttons for the basic editing layout 
     348     * @return JPanel with basic buttons 
     349     */ 
     350    private JPanel setupBasicButtons() { 
     351        JPanel buttonPanel = new JPanel(new GridLayout(2,ordered ? 3 : 2)); 
     352 
     353        if (ordered) { 
     354            buttonPanel.add(createButton(marktr("Move Up"), "moveup", tr("Move the currently selected members up"), KeyEvent.VK_U, new ActionListener() { 
     355                public void actionPerformed(ActionEvent e) { 
     356                    moveMembers(-1); 
     357                } 
     358            })); 
     359        } 
     360 
     361        buttonPanel.add(createButton(marktr("Add Selected"),"addselected", 
     362        tr("Add all currently selected objects as members"), KeyEvent.VK_D, new ActionListener() { 
     363            public void actionPerformed(ActionEvent e) { 
     364                addSelected(); 
     365            } 
     366        })); 
     367 
     368        buttonPanel.add(createButton(marktr("Remove Selected"),"removeselected", 
     369        tr("Remove all currently selected objects from relation"), KeyEvent.VK_G, new ActionListener() { 
     370            public void actionPerformed(ActionEvent e) { 
     371                deleteSelected(); 
     372            } 
     373        })); 
     374 
     375        if(ordered) { 
     376            buttonPanel.add(createButton(marktr("Move Down"), "movedown", tr("Move the currently selected members down"), KeyEvent.VK_J, new ActionListener() { 
     377                public void actionPerformed(ActionEvent e) { 
     378                    moveMembers(1); 
     379                } 
     380            })); 
     381        } 
     382 
     383        buttonPanel.add(createButton(marktr("Remove"),"remove", 
     384        tr("Remove the member in the current table row from this relation"), KeyEvent.VK_M, new ActionListener() { 
     385            public void actionPerformed(ActionEvent e) { 
     386                int[] rows = memberTable.getSelectedRows(); 
     387                RelationMember mem = new RelationMember(); 
     388                for (int row : rows) { 
     389                    mem.role = memberTable.getValueAt(row, 0).toString(); 
     390                    mem.member = (OsmPrimitive) memberTable.getValueAt(row, 1); 
     391                    clone.members.remove(mem); 
     392                } 
     393                refreshTables(); 
     394            } 
     395        })); 
     396 
     397        buttonPanel.add(createButton(marktr("Download Members"),"downloadincomplete", 
     398        tr("Download all incomplete ways and nodes in relation"), KeyEvent.VK_K, new ActionListener() { 
     399            public void actionPerformed(ActionEvent e) { 
     400                downloadRelationMembers(); 
     401                refreshTables(); 
     402            } 
     403        })); 
     404 
     405        return buttonPanel; 
     406    } 
     407 
     408    /** 
     409     * This function saves the user's changes. Must be invoked manually. 
     410     */ 
     411    private void applyChanges() { 
     412        if (RelationEditor.this.relation == null) { 
     413            // If the user wanted to create a new relation, but hasn't added any members or 
     414            // tags, don't add an empty relation 
     415            clone.checkTagged(); 
     416            if(clone.members.size() == 0 && !clone.tagged) 
     417                return; 
     418            Main.main.undoRedo.add(new AddCommand(clone)); 
     419            DataSet.fireSelectionChanged(Main.ds.getSelected()); 
     420        } else if (!RelationEditor.this.relation.realEqual(clone, true)) { 
     421            Main.main.undoRedo.add(new ChangeCommand(RelationEditor.this.relation, clone)); 
     422            DataSet.fireSelectionChanged(Main.ds.getSelected()); 
     423        } 
     424    } 
     425 
     426    @Override 
     427    protected Dimension findMaxDialogSize() { 
     428        // FIXME: Make it remember dialog size 
     429        return new Dimension(600, 500); 
    403430    } 
    404431 
     
    421448    } 
    422449 
    423     private JButton createButton(String name, String iconName, String tooltip, int mnemonic, ActionListener actionListener) { 
    424         JButton b = new JButton((name == null) ? null : tr(name), ImageProvider.get("dialogs", iconName)); 
    425         b.setActionCommand(name); 
    426         b.addActionListener(actionListener); 
    427         b.setToolTipText(tooltip); 
    428         b.setMnemonic(mnemonic); 
    429         b.putClientProperty("help", "Dialog/Properties/"+name); 
    430         return b; 
     450    private SideButton createButton(String name, String iconName, String tooltip, int mnemonic, ActionListener actionListener) { 
     451        return 
     452            new SideButton(name, iconName, "relationEditor", 
     453                tooltip, 
     454                Shortcut.registerShortcut("relationeditor:"+iconName, 
     455                        tr("Relation Editor: {0}", name == null ? tooltip : name), 
     456                        mnemonic, 
     457                        Shortcut.GROUP_MNEMONIC), 
     458                actionListener 
     459            ); 
    431460    } 
    432461 
Note: See TracChangeset for help on using the changeset viewer.