Changeset 1762 in josm


Ignore:
Timestamp:
Jul 11, 2009 9:32:42 AM (4 years ago)
Author:
Gubaer
Message:

added: improved tag editor grid in relation editor (borrowed code from tag editor plugin)
removed: realEqual() on OsmPrimitive, Node, etc.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java

    r1706 r1762  
    4444        public String apply(String text) { 
    4545            Matcher m = startPattern.matcher(text); 
    46             if (!m.lookingAt()) 
     46            if (!m.lookingAt()) { 
    4747                m = endPattern.matcher(text); 
     48            } 
    4849 
    4950            if (m.lookingAt()) { 
     
    6263 
    6364    private static PrefixSuffixSwitcher[] prefixSuffixSwitchers = 
    64             new PrefixSuffixSwitcher[] { 
    65                 new PrefixSuffixSwitcher("left", "right"), 
    66                 new PrefixSuffixSwitcher("forward", "backward"), 
    67                 new PrefixSuffixSwitcher("forwards", "backwards") 
    68             }; 
     65        new PrefixSuffixSwitcher[] { 
     66        new PrefixSuffixSwitcher("left", "right"), 
     67        new PrefixSuffixSwitcher("forward", "backward"), 
     68        new PrefixSuffixSwitcher("forwards", "backwards") 
     69    }; 
    6970 
    7071    @Override 
    7172    public Collection<Command> execute(Way oldway, Way way) throws UserCancelException { 
    7273        Map<OsmPrimitive, List<TagCorrection>> tagCorrectionsMap = 
    73                 new HashMap<OsmPrimitive, List<TagCorrection>>(); 
     74            new HashMap<OsmPrimitive, List<TagCorrection>>(); 
    7475 
    7576        ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>(); 
     
    8687 
    8788                if (key.equals("oneway")) { 
    88                     if (value.equals("-1")) 
     89                    if (value.equals("-1")) { 
    8990                        newValue = OsmUtils.trueval; 
    90                     else { 
     91                    } else { 
    9192                        Boolean boolValue = OsmUtils.getOsmBoolean(value); 
    9293                        if (boolValue != null && boolValue.booleanValue()) { 
     
    9798                    for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) { 
    9899                        newKey = prefixSuffixSwitcher.apply(key); 
    99                         if (!key.equals(newKey)) 
     100                        if (!key.equals(newKey)) { 
    100101                            break; 
     102                        } 
    101103                    } 
    102104                } 
    103105 
    104                 if (!key.equals(newKey) || !value.equals(newValue)) 
     106                if (!key.equals(newKey) || !value.equals(newValue)) { 
    105107                    tagCorrectionsMap.get(primitive).add( 
    106108                            new TagCorrection(key, value, newKey, newValue)); 
     109                } 
    107110            } 
    108111        } 
    109112 
    110113        Map<OsmPrimitive, List<RoleCorrection>> roleCorrectionMap = 
    111                 new HashMap<OsmPrimitive, List<RoleCorrection>>(); 
     114            new HashMap<OsmPrimitive, List<RoleCorrection>>(); 
    112115        roleCorrectionMap.put(way, new ArrayList<RoleCorrection>()); 
    113116 
     
    115118            int position = 0; 
    116119            for (RelationMember member : relation.members) { 
    117                 if (!member.member.realEqual(oldway, true) 
     120                if (!member.member.hasEqualSemanticAttributes(oldway) 
    118121                        || member.role.length() == 0) { 
    119122                    position++; 
     
    131134                } 
    132135 
    133                 if (found) 
     136                if (found) { 
    134137                    roleCorrectionMap.get(way).add( 
    135138                            new RoleCorrection(relation, position, member, newRole)); 
     139                } 
    136140 
    137141                position++; 
  • trunk/src/org/openstreetmap/josm/data/osm/Node.java

    r1750 r1762  
    107107    } 
    108108 
    109     /** 
    110      * @deprecated 
    111      * @see #hasEqualSemanticAttributes(OsmPrimitive) 
    112      * @see #hasEqualTechnicalAttributes(OsmPrimitive) 
    113      */ 
    114     @Deprecated 
    115     @Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) { 
    116         if (osm instanceof Node) { 
    117             if (super.realEqual(osm, semanticOnly)) { 
    118                 if ((coor == null) && ((Node)osm).coor == null) 
    119                     return true; 
    120                 if (coor != null) 
    121                     return coor.equals(((Node)osm).coor); 
    122             } 
    123         } 
    124         return false; 
    125     } 
    126  
    127109    @Override 
    128110    public boolean hasEqualSemanticAttributes(OsmPrimitive other) { 
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r1690 r1762  
    284284        clearCached(); 
    285285        clearErrors(); 
    286     } 
    287  
    288     /** 
    289      * Perform an equality compare for all non-volatile fields not only for the id 
    290      * but for the whole object (for conflict resolving) 
    291      * @param semanticOnly if <code>true</code>, modified flag and timestamp are not compared 
    292      *  
    293      * @deprecated 
    294      * @see #hasEqualSemanticAttributes(OsmPrimitive) 
    295      * @see #hasEqualTechnicalAttributes(OsmPrimitive) 
    296      */ 
    297     @Deprecated 
    298     public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) { 
    299         return id == osm.id 
    300         && incomplete == osm.incomplete 
    301         && deleted == osm.deleted 
    302         && (semanticOnly || ( 
    303                 modified == osm.modified 
    304                 && timestamp == osm.timestamp 
    305                 && version == osm.version 
    306                 && visible == osm.visible 
    307                 && (user == null ? osm.user==null : user==osm.user)) 
    308         ) 
    309         && (keys == null ? osm.keys==null : keys.equals(osm.keys)); 
    310286    } 
    311287 
  • trunk/src/org/openstreetmap/josm/data/osm/Relation.java

    r1690 r1762  
    6868        // adding members in string increases memory usage a lot and overflows for looped relations 
    6969        return "{Relation id="+id+" version="+version+"}"; 
    70     } 
    71  
    72     @Deprecated 
    73     @Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) { 
    74         return osm instanceof Relation ? super.realEqual(osm, semanticOnly) && members.equals(((Relation)osm).members) : false; 
    7570    } 
    7671 
  • trunk/src/org/openstreetmap/josm/data/osm/Way.java

    r1690 r1762  
    9999        if (incomplete) return "{Way id="+id+" version="+version+" (incomplete)}"; 
    100100        return "{Way id="+id+" version="+version+" nodes="+Arrays.toString(nodes.toArray())+"}"; 
    101     } 
    102  
    103     @Deprecated 
    104     @Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) { 
    105         return osm instanceof Way ? super.realEqual(osm, semanticOnly) && nodes.equals(((Way)osm).nodes) : false; 
    106101    } 
    107102 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r1754 r1762  
    99import java.awt.event.ActionEvent; 
    1010import java.awt.event.ActionListener; 
     11import java.awt.event.ComponentAdapter; 
     12import java.awt.event.ComponentEvent; 
    1113import java.awt.event.KeyEvent; 
     14import java.awt.event.WindowAdapter; 
     15import java.awt.event.WindowEvent; 
    1216import java.io.IOException; 
    1317import java.util.ArrayList; 
    1418import java.util.Arrays; 
    1519import java.util.Collection; 
    16 import java.util.Map.Entry; 
    1720 
    1821import javax.swing.JLabel; 
     
    2326import javax.swing.JTable; 
    2427import javax.swing.ListSelectionModel; 
     28import javax.swing.SwingUtilities; 
    2529import javax.swing.event.ListSelectionEvent; 
    2630import javax.swing.event.ListSelectionListener; 
     
    4448import org.openstreetmap.josm.gui.SideButton; 
    4549import org.openstreetmap.josm.gui.dialogs.ConflictDialog; 
     50import org.openstreetmap.josm.gui.dialogs.relation.ac.AutoCompletionCache; 
     51import org.openstreetmap.josm.gui.dialogs.relation.ac.AutoCompletionList; 
    4652import org.openstreetmap.josm.io.OsmServerObjectReader; 
    4753import org.openstreetmap.josm.io.OsmTransferException; 
     
    94100public class GenericRelationEditor extends RelationEditor { 
    95101 
     102    // We need this twice, so cache result 
     103    protected final static String applyChangesText = tr("Apply Changes"); 
     104 
    96105    private JLabel status; 
    97  
    98     /** 
    99      * The property data. 
    100      */ 
    101     private final DefaultTableModel propertyData = new DefaultTableModel() { 
    102         @Override public boolean isCellEditable(int row, int column) { 
    103             return true; 
    104         } 
    105         @Override public Class<?> getColumnClass(int columnIndex) { 
    106             return String.class; 
    107         } 
    108     }; 
    109106 
    110107    /** 
     
    123120     * The properties and membership lists. 
    124121     */ 
    125     private final JTable propertyTable = new JTable(propertyData); 
    126122    private final JTable memberTable = new JTable(memberData); 
    127123 
    128     // We need this twice, so cache result 
    129     protected final static String applyChangesText = tr("Apply Changes"); 
     124    /** the tag table and its model */ 
     125    private TagEditorModel tagEditorModel; 
     126    private TagTable tagTable; 
     127    private AutoCompletionCache acCache; 
     128    private AutoCompletionList acList; 
     129 
    130130 
    131131    /** 
     
    141141        // Initalizes ExtendedDialog 
    142142        super(relation, selectedMembers); 
     143        acCache = AutoCompletionCache.getCacheForLayer(Main.map.mapView.getEditLayer()); 
     144        acList = new AutoCompletionList(); 
    143145 
    144146        JPanel bothTables = setupBasicLayout(selectedMembers); 
     147        if (relation != null) { 
     148            this.tagEditorModel.initFromPrimitive(relation); 
     149        } else { 
     150            tagEditorModel.clear(); 
     151        } 
     152        tagEditorModel.ensureOneTag(); 
     153        addWindowListener( 
     154                new WindowAdapter() { 
     155                    protected void requestFocusInTopLeftCell() { 
     156                        SwingUtilities.invokeLater(new Runnable(){ 
     157                            public void run() 
     158                            { 
     159                                tagEditorModel.ensureOneTag(); 
     160                                tagTable.requestFocusInCell(0, 0); 
     161                            } 
     162                        }); 
     163                    } 
     164                    @Override public void windowGainedFocus(WindowEvent e) { 
     165                        requestFocusInTopLeftCell(); 
     166                    } 
     167                    @Override 
     168                    public void windowActivated(WindowEvent e) { 
     169                        requestFocusInTopLeftCell(); 
     170                    } 
     171                    @Override 
     172                    public void windowDeiconified(WindowEvent e) { 
     173                        requestFocusInTopLeftCell(); 
     174                    } 
     175                    @Override 
     176                    public void windowOpened(WindowEvent e) { 
     177                        requestFocusInTopLeftCell(); 
     178                    } 
     179                } 
     180        ); 
    145181 
    146182        JTabbedPane tabPane = new JTabbedPane(); 
     
    165201     */ 
    166202    private JPanel setupBasicLayout(Collection<RelationMember> selectedMembers) { 
    167         // setting up the properties table 
    168         propertyData.setColumnIdentifiers(new String[]{tr("Key"),tr("Value")}); 
    169         propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    170         propertyData.addTableModelListener(new TableModelListener() { 
    171             public void tableChanged(TableModelEvent tme) { 
    172                 if (tme.getType() == TableModelEvent.UPDATE) { 
    173                     int row = tme.getFirstRow(); 
    174  
    175                     if (!(tme.getColumn() == 0 && row == propertyData.getRowCount() -1)) { 
    176                         clone.entrySet().clear(); 
    177                         for (int i = 0; i < propertyData.getRowCount(); i++) { 
    178                             String key = propertyData.getValueAt(i, 0).toString(); 
    179                             String value = propertyData.getValueAt(i, 1).toString(); 
    180                             if (key.length() > 0 && value.length() > 0) { 
    181                                 clone.put(key, value); 
    182                             } 
    183                         } 
    184                         refreshTables(); 
    185                     } 
    186                 } 
    187             } 
    188         }); 
    189         propertyTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 
     203        // setting up the tag table 
     204        // 
     205        tagEditorModel = new TagEditorModel(); 
     206        tagTable = new TagTable(tagEditorModel); 
     207        acCache.initFromJOSMDataset(); 
     208        TagCellEditor editor = ((TagCellEditor)tagTable.getColumnModel().getColumn(0).getCellEditor()); 
     209        editor.setAutoCompletionCache(acCache); 
     210        editor.setAutoCompletionList(acList); 
     211        editor = ((TagCellEditor)tagTable.getColumnModel().getColumn(1).getCellEditor()); 
     212        editor.setAutoCompletionCache(acCache); 
     213        editor.setAutoCompletionList(acList); 
     214 
    190215 
    191216        // setting up the member table 
     
    198223                if (tme.getType() == TableModelEvent.UPDATE && tme.getColumn() == 0) { 
    199224                    int row = tme.getFirstRow(); 
    200                     clone.members.get(row).role = memberData.getValueAt(row, 0).toString(); 
     225                    getClone().members.get(row).role = memberData.getValueAt(row, 0).toString(); 
    201226                } 
    202227            } 
     
    230255        JPanel bothTables = new JPanel(); 
    231256        bothTables.setLayout(new GridBagLayout()); 
    232         bothTables.add(new JLabel(tr("Tags (empty value deletes tag)")), GBC.eol().fill(GBC.HORIZONTAL)); 
    233         bothTables.add(new JScrollPane(propertyTable), GBC.eop().fill(GBC.BOTH)); 
     257        bothTables.add(new JLabel(tr("Tags")), GBC.eol().fill(GBC.HORIZONTAL)); 
     258        final JScrollPane scrollPane = new JScrollPane(tagTable); 
     259 
     260        // this adapters ensures that the width of the tag table columns is adjusted 
     261        // to the width of the scroll pane viewport. Also tried to overwrite 
     262        // getPreferredViewportSize() in JTable, but did not work. 
     263        // 
     264        scrollPane.addComponentListener( 
     265                new ComponentAdapter() { 
     266                    @Override public void componentResized(ComponentEvent e) { 
     267                        super.componentResized(e); 
     268                        Dimension d = scrollPane.getViewport().getExtentSize(); 
     269                        tagTable.adjustColumnWidth(d.width); 
     270                    } 
     271                } 
     272        ); 
     273        bothTables.add(scrollPane, GBC.eop().fill(GBC.BOTH)); 
    234274        bothTables.add(status = new JLabel(tr("Members")), GBC.eol().fill(GBC.HORIZONTAL)); 
    235275        // this is not exactly pretty but the four buttons simply don't fit in one line. 
     
    310350                    mem.role = memberTable.getValueAt(row, 0).toString(); 
    311351                    mem.member = (OsmPrimitive) memberTable.getValueAt(row, 1); 
    312                     clone.members.remove(mem); 
     352                    getClone().members.remove(mem); 
    313353                } 
    314354                refreshTables(); 
     
    337377        // TODO: sort only selected rows 
    338378 
    339         for (i = 1; i < clone.members.size(); ++i) 
     379        for (i = 1; i < getClone().members.size(); ++i) 
    340380        { 
    341             RelationMember  m = clone.members.get(i); 
     381            RelationMember  m = getClone().members.get(i); 
    342382            if (m.member.incomplete) 
    343383                // TODO: emit some message that sorting failed 
     
    373413        } 
    374414 
    375         for (i = 0; i < clone.members.size(); ++i) 
     415        for (i = 0; i < getClone().members.size(); ++i) 
    376416        { 
    377             RelationMember  m = clone.members.get(i); 
     417            RelationMember  m = getClone().members.get(i); 
    378418            Integer         m2 = null; 
    379419            Node            searchNode = null; 
     
    410450                { 
    411451                    m2 = points.get(searchNode).first(); 
    412                     if (m.member == clone.members.get(m2).member) 
     452                    if (m.member == getClone().members.get(m2).member) 
    413453                    { 
    414454                        m2 = points.get(searchNode).last(); 
     
    418458            catch(java.util.NoSuchElementException e) {} 
    419459 
    420             if ((m2 == null) && ((i+1) < clone.members.size())) 
     460            if ((m2 == null) && ((i+1) < getClone().members.size())) 
    421461            { 
    422462                // TODO: emit some message that sorting failed 
     
    429469                try 
    430470                { 
    431                     Way next = (Way)clone.members.get(m2).member; 
     471                    Way next = (Way)getClone().members.get(m2).member; 
    432472                    lastWayStartUsed = searchNode.equals(next.firstNode()); 
    433473                } 
     
    436476                } 
    437477 
    438                 if ((m2 < clone.members.size()) && ((i+1) < clone.members.size())) 
    439                 { 
    440                     RelationMember  a = clone.members.get(i+1); 
    441                     RelationMember  b = clone.members.get(m2); 
     478                if ((m2 < getClone().members.size()) && ((i+1) < getClone().members.size())) 
     479                { 
     480                    RelationMember  a = getClone().members.get(i+1); 
     481                    RelationMember  b = getClone().members.get(m2); 
    442482 
    443483                    if (m2 != (i+1)) 
    444484                    { 
    445                         clone.members.set(i+1, b); 
    446                         clone.members.set(m2, a); 
     485                        getClone().members.set(i+1, b); 
     486                        getClone().members.set(m2, a); 
    447487 
    448488                        try 
     
    499539     */ 
    500540    private void applyChanges() { 
    501         if (GenericRelationEditor.this.relation == null) { 
     541        if (getRelation()== null) { 
    502542            // If the user wanted to create a new relation, but hasn't added any members or 
    503543            // tags, don't add an empty relation 
    504             if(clone.members.size() == 0 && !clone.isTagged()) 
     544            if(getClone().members.size() == 0 && tagEditorModel.getKeys().isEmpty()) 
    505545                return; 
    506             Main.main.undoRedo.add(new AddCommand(clone)); 
     546            tagEditorModel.applyToPrimitive(getClone()); 
     547            Main.main.undoRedo.add(new AddCommand(getClone())); 
    507548            DataSet.fireSelectionChanged(Main.ds.getSelected()); 
    508         } else if (!GenericRelationEditor.this.relation.realEqual(clone, true)) { 
    509             Main.main.undoRedo.add(new ChangeCommand(GenericRelationEditor.this.relation, clone)); 
     549        } else if (getRelation().hasEqualSemanticAttributes(getClone())) { 
     550            tagEditorModel.applyToPrimitive(getClone()); 
     551            Main.main.undoRedo.add(new ChangeCommand(getRelation(), getClone())); 
    510552            DataSet.fireSelectionChanged(Main.ds.getSelected()); 
    511553        } 
     
    532574        int numLinked = 0; 
    533575 
    534         propertyData.setRowCount(0); 
    535         for (Entry<String, String> e : clone.entrySet()) { 
    536             propertyData.addRow(new Object[]{e.getKey(), e.getValue()}); 
    537         } 
    538         propertyData.addRow(new Object[]{"", ""}); 
    539  
    540576        // re-load membership data 
    541577 
    542578        memberData.setRowCount(0); 
    543         for (int i=0; i<clone.members.size(); i++) { 
     579        for (int i=0; i<getClone().members.size(); i++) { 
    544580 
    545581            // this whole section is aimed at finding out whether the 
     
    550586            // it should cache results, so... FIXME ;-) 
    551587 
    552             RelationMember em = clone.members.get(i); 
     588            RelationMember em = getClone().members.get(i); 
    553589            WayConnectionType link = WayConnectionType.none; 
    554590            RelationMember m = em; 
     
    562598                    break; 
    563599                } else if (m.member instanceof Relation) { 
    564                     if (m.member == this.relation) { 
     600                    if (m.member == this.getRelation()) { 
    565601                        break; 
    566602                    } 
     
    572608            } 
    573609            if (way1 != null) { 
    574                 int next = (i+1) % clone.members.size(); 
     610                int next = (i+1) % getClone().members.size(); 
    575611                while (next != i) { 
    576                     m = clone.members.get(next); 
    577                     next = (next + 1) % clone.members.size(); 
     612                    m = getClone().members.get(next); 
     613                    next = (next + 1) % getClone().members.size(); 
    578614                    depth = 0; 
    579615                    while (m != null && depth < 10) { 
     
    582618                            break; 
    583619                        } else if (m.member instanceof Relation) { 
    584                             if (m.member == this.relation) { 
     620                            if (m.member == this.getRelation()) { 
    585621                                break; 
    586622                            } 
     
    631667            memberData.addRow(new Object[]{em.role, em.member, link}); 
    632668        } 
    633         status.setText(tr("Members: {0} (linked: {1})", clone.members.size(), numLinked)); 
     669        status.setText(tr("Members: {0} (linked: {1})", getClone().members.size(), numLinked)); 
    634670    } 
    635671 
     
    657693            int[] rows = memberTable.getSelectedRows(); 
    658694            if (rows.length > 0) { 
    659                 clone.members.add(rows[0], em); 
     695                getClone().members.add(rows[0], em); 
    660696            } else { 
    661                 clone.members.add(em); 
     697                getClone().members.add(em); 
    662698            } 
    663699        } 
     
    667703    private void deleteSelected() { 
    668704        for (OsmPrimitive p : Main.ds.getSelected()) { 
    669             Relation c = new Relation(clone); 
     705            Relation c = new Relation(getClone()); 
    670706            for (RelationMember rm : c.members) { 
    671707                if (rm.member == p) 
     
    674710                    mem.role = rm.role; 
    675711                    mem.member = rm.member; 
    676                     clone.members.remove(mem); 
     712                    getClone().members.remove(mem); 
    677713                } 
    678714            } 
     
    687723        // check if user attempted to move anything beyond the boundary of the list 
    688724        if (rows[0] + direction < 0) return; 
    689         if (rows[rows.length-1] + direction >= clone.members.size()) return; 
    690  
    691         RelationMember m[] = new RelationMember[clone.members.size()]; 
     725        if (rows[rows.length-1] + direction >= getClone().members.size()) return; 
     726 
     727        RelationMember m[] = new RelationMember[getClone().members.size()]; 
    692728 
    693729        // first move all selected rows from the member list into a new array, 
    694730        // displaced by the move amount 
    695731        for (Integer i: rows) { 
    696             m[i+direction] = clone.members.get(i); 
    697             clone.members.set(i, null); 
     732            m[i+direction] = getClone().members.get(i); 
     733            getClone().members.set(i, null); 
    698734        } 
    699735 
     
    701737        // elements. 
    702738        int i = 0; 
    703         for (RelationMember rm : clone.members) { 
     739        for (RelationMember rm : getClone().members) { 
    704740            if (rm != null) { 
    705741                while (m[i] != null) { 
     
    711747 
    712748        // and write the array back into the member list. 
    713         clone.members.clear(); 
    714         clone.members.addAll(Arrays.asList(m)); 
     749        getClone().members.clear(); 
     750        getClone().members.addAll(Arrays.asList(m)); 
    715751        refreshTables(); 
    716752        ListSelectionModel lsm = memberTable.getSelectionModel(); 
     
    724760    private void downloadRelationMembers() { 
    725761        boolean download = false; 
    726         for (RelationMember member : clone.members) { 
     762        for (RelationMember member : getClone().members) { 
    727763            if (member.member.incomplete) { 
    728764                download = true; 
     
    731767        } 
    732768        if (download) { 
    733             OsmServerObjectReader reader = new OsmServerObjectReader(clone.id, OsmPrimitiveType.RELATION, true); 
     769            OsmServerObjectReader reader = new OsmServerObjectReader(getClone().id, OsmPrimitiveType.RELATION, true); 
    734770            try { 
    735771                DataSet dataSet = reader.parseOsm(); 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java

    r1710 r1762  
    1616public abstract class RelationEditor extends ExtendedDialog { 
    1717 
     18    /** keeps track of open relation editors */ 
     19    static private RelationDialogManager relationDialogManager; 
     20 
     21    /** 
     22     * Replies the singleton {@see RelationDialogManager} 
     23     *  
     24     * @return the singleton {@see RelationDialogManager} 
     25     */ 
     26    static public RelationDialogManager getRelationDialogManager() { 
     27        if (relationDialogManager == null) { 
     28            relationDialogManager = new RelationDialogManager(); 
     29        } 
     30        return relationDialogManager; 
     31    } 
     32 
    1833    public static ArrayList<Class<RelationEditor>> editors = new ArrayList<Class<RelationEditor>>(); 
    1934 
     
    2237     * editing. 
    2338     */ 
    24     protected Relation relation; 
    25     protected Relation clone; 
     39    private Relation relation; 
     40    private Relation clone; 
    2641 
    2742    /** 
     
    5772            } 
    5873        } 
    59         return new GenericRelationEditor(r, selectedMembers); 
     74        if (getRelationDialogManager().isOpenInEditor(r)) 
     75            return getRelationDialogManager().getEditorForRelation(r); 
     76        else { 
     77            RelationEditor editor = new GenericRelationEditor(r, selectedMembers); 
     78            getRelationDialogManager().register(r, editor); 
     79            return editor; 
     80        } 
    6081    } 
    6182 
     
    84105        } 
    85106    } 
     107 
     108    protected Relation getRelation() { 
     109        return relation; 
     110    } 
     111 
     112    protected Relation getClone() { 
     113        return clone; 
     114    } 
    86115} 
Note: See TracChangeset for help on using the changeset viewer.