Changeset 3640 in josm


Ignore:
Timestamp:
Oct 24, 2010 3:07:01 PM (3 years ago)
Author:
jttt
Message:

Fix #5579 allow paste tags in the relation editor

Location:
trunk/src/org/openstreetmap/josm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java

    r3385 r3640  
    2323import org.openstreetmap.josm.data.osm.PrimitiveData; 
    2424import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy; 
     25import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy.PasteBufferChangedListener; 
     26import org.openstreetmap.josm.data.osm.Tag; 
    2527import org.openstreetmap.josm.data.osm.TagCollection; 
    26 import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy.PasteBufferChangedListener; 
    2728import org.openstreetmap.josm.gui.conflict.tags.PasteTagsConflictResolverDialog; 
    2829import org.openstreetmap.josm.tools.Shortcut; 
     
    4243        private final Collection<PrimitiveData> source; 
    4344        private final Collection<OsmPrimitive> target; 
    44         private final List<Command> commands = new ArrayList<Command>(); 
     45        private final List<Tag> commands = new ArrayList<Tag>(); 
    4546 
    4647        public TagPaster(Collection<PrimitiveData> source, Collection<OsmPrimitive> target) { 
     
    100101        } 
    101102 
    102         protected Command buildChangeCommand(Collection<? extends OsmPrimitive> selection, TagCollection tc) { 
    103             List<Command> commands = new ArrayList<Command>(); 
     103        protected void buildChangeCommand(Collection<? extends OsmPrimitive> selection, TagCollection tc) { 
    104104            for (String key : tc.getKeys()) { 
    105                 String value = tc.getValues(key).iterator().next(); 
    106                 value = value.equals("") ? null : value; 
    107                 commands.add(new ChangePropertyCommand(selection,key,value)); 
    108             } 
    109             if (!commands.isEmpty()) { 
    110                 String title1 = trn("Pasting {0} tag", "Pasting {0} tags", tc.getKeys().size(), tc.getKeys().size()); 
    111                 String title2 = trn("to {0} primitive", "to {0} primtives", selection.size(), selection.size()); 
    112                 return new SequenceCommand( 
    113                         title1 + " " + title2, 
    114                         commands 
    115                 ); 
    116             } 
    117             return null; 
     105                commands.add(new Tag(key, tc.getValues(key).iterator().next())); 
     106            } 
    118107        } 
    119108 
     
    166155                if (dialog.isCanceled()) 
    167156                    return; 
    168                 Command cmd = buildChangeCommand(target, dialog.getResolution()); 
    169                 commands.add(cmd); 
     157                buildChangeCommand(target, dialog.getResolution()); 
    170158            } else { 
    171159                // no conflicts in the source tags to resolve. Just apply the tags 
    172160                // to the target primitives 
    173161                // 
    174                 Command cmd = buildChangeCommand(target, tc); 
    175                 commands.add(cmd); 
     162                buildChangeCommand(target, tc); 
    176163            } 
    177164        } 
     
    218205                for (OsmPrimitiveType type:OsmPrimitiveType.values()) { 
    219206                    if (hasSourceTagsByType(type) && hasTargetPrimitives(type.getOsmClass())) { 
    220                         Command cmd = buildChangeCommand(target, getSourceTagsByType(type)); 
    221                         commands.add(cmd); 
     207                        buildChangeCommand(target, getSourceTagsByType(type)); 
    222208                    } 
    223209                } 
     
    236222                for (OsmPrimitiveType type:OsmPrimitiveType.values()) { 
    237223                    if (hasSourceTagsByType(type) && hasTargetPrimitives(type.getOsmClass())) { 
    238                         Command cmd = buildChangeCommand(OsmPrimitive.getFilteredList(target, type.getOsmClass()), dialog.getResolution(type)); 
    239                         commands.add(cmd); 
     224                        buildChangeCommand(OsmPrimitive.getFilteredList(target, type.getOsmClass()), dialog.getResolution(type)); 
    240225                    } 
    241226                } 
     
    243228        } 
    244229 
    245         public List<Command> execute() { 
     230        public List<Tag> execute() { 
    246231            commands.clear(); 
    247232            if (isHeteogeneousSource()) { 
     
    256241 
    257242    public void actionPerformed(ActionEvent e) { 
    258         if (getCurrentDataSet().getSelected().isEmpty()) 
     243        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected(); 
     244 
     245        if (selection.isEmpty()) 
    259246            return; 
    260         TagPaster tagPaster = new TagPaster(Main.pasteBuffer.getDirectlyAdded(), getCurrentDataSet().getSelected()); 
    261         for (Command c:tagPaster.execute()) { 
    262             Main.main.undoRedo.add(c); 
    263         } 
     247 
     248        TagPaster tagPaster = new TagPaster(Main.pasteBuffer.getDirectlyAdded(), selection); 
     249 
     250        List<Command> commands = new ArrayList<Command>(); 
     251        for (Tag tag: tagPaster.execute()) { 
     252            commands.add(new ChangePropertyCommand(selection, tag.getKey(), "".equals(tag.getValue())?null:tag.getValue())); 
     253        } 
     254        if (!commands.isEmpty()) { 
     255            String title1 = trn("Pasting {0} tag", "Pasting {0} tags", commands.size(), commands.size()); 
     256            String title2 = trn("to {0} primitive", "to {0} primtives", selection.size(), selection.size()); 
     257            Main.main.undoRedo.add( 
     258                    new SequenceCommand( 
     259                            title1 + " " + title2, 
     260                            commands 
     261                    )); 
     262        } 
     263 
    264264    } 
    265265 
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r3561 r3640  
    5454import org.openstreetmap.josm.Main; 
    5555import org.openstreetmap.josm.actions.CopyAction; 
     56import org.openstreetmap.josm.actions.PasteTagsAction.TagPaster; 
    5657import org.openstreetmap.josm.command.AddCommand; 
    5758import org.openstreetmap.josm.command.ChangeCommand; 
     
    132133            @Override 
    133134            public void updateTags(List<Tag> tags) { 
    134                 Map<String, TagModel> modelTags = new HashMap<String, TagModel>(); 
    135                 for (int i=0; i<tagEditorPanel.getModel().getRowCount(); i++) { 
    136                     TagModel tagModel = tagEditorPanel.getModel().get(i); 
    137                     modelTags.put(tagModel.getName(), tagModel); 
    138                 } 
    139                 for (Tag tag: tags) { 
    140                     TagModel existing = modelTags.get(tag.getKey()); 
    141  
    142                     if (tag.getValue().isEmpty()) { 
    143                         if (existing != null) { 
    144                             tagEditorPanel.getModel().delete(tag.getKey()); 
    145                         } 
    146                     } else { 
    147                         if (existing != null) { 
    148                             tagEditorPanel.getModel().updateTagValue(existing, tag.getValue()); 
    149                         } else { 
    150                             tagEditorPanel.getModel().add(tag.getKey(), tag.getValue()); 
    151                         } 
    152                     } 
    153  
    154                 } 
     135                GenericRelationEditor.this.updateTags(tags); 
    155136            } 
    156137 
     
    429410        new PasteMembersAction(); 
    430411        new CopyMembersAction(); 
     412        new PasteTagsAction(); 
    431413 
    432414        return pnl3; 
     
    650632    } 
    651633 
     634    protected void updateTags(List<Tag> tags) { 
     635 
     636        if (tags.isEmpty()) 
     637            return; 
     638 
     639        Map<String, TagModel> modelTags = new HashMap<String, TagModel>(); 
     640        for (int i=0; i<tagEditorPanel.getModel().getRowCount(); i++) { 
     641            TagModel tagModel = tagEditorPanel.getModel().get(i); 
     642            modelTags.put(tagModel.getName(), tagModel); 
     643        } 
     644        for (Tag tag: tags) { 
     645            TagModel existing = modelTags.get(tag.getKey()); 
     646 
     647            if (tag.getValue().isEmpty()) { 
     648                if (existing != null) { 
     649                    tagEditorPanel.getModel().delete(tag.getKey()); 
     650                } 
     651            } else { 
     652                if (existing != null) { 
     653                    tagEditorPanel.getModel().updateTagValue(existing, tag.getValue()); 
     654                } else { 
     655                    tagEditorPanel.getModel().add(tag.getKey(), tag.getValue()); 
     656                } 
     657            } 
     658 
     659        } 
     660    } 
     661 
    652662    static class AddAbortException extends Exception  { 
    653663    } 
     
    15651575    } 
    15661576 
     1577    class PasteTagsAction extends AbstractAction { 
     1578 
     1579        public PasteTagsAction() { 
     1580            registerCopyPasteAction(this, "PASTE_TAGS", Shortcut.registerShortcut("system:pastestyle", tr("Edit: {0}", tr("Paste Tags")), KeyEvent.VK_V, Shortcut.GROUP_MENU, Shortcut.SHIFT_DEFAULT).getKeyStroke()); 
     1581        } 
     1582 
     1583        @Override 
     1584        public void actionPerformed(ActionEvent e) { 
     1585            Relation relation = new Relation(); 
     1586            tagEditorPanel.getModel().applyToPrimitive(relation); 
     1587            TagPaster tagPaster = new TagPaster(Main.pasteBuffer.getDirectlyAdded(), Collections.<OsmPrimitive>singletonList(relation)); 
     1588            updateTags(tagPaster.execute()); 
     1589        } 
     1590 
     1591    } 
     1592 
    15671593    class MemberTableDblClickAdapter extends MouseAdapter { 
    15681594        @Override 
  • trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorModel.java

    r3518 r3640  
    209209        if (tag == null) { 
    210210            tag = new TagModel(name, value); 
    211             tags.add(tag); 
     211            int index = tags.size(); 
     212            while (index >= 1 && tags.get(index - 1).getName().isEmpty() && tags.get(index - 1).getValue().isEmpty()) { 
     213                index--; // If last line(s) is empty, add new tag before it 
     214            } 
     215            tags.add(index, tag); 
    212216        } else { 
    213217            tag.addValue(value); 
Note: See TracChangeset for help on using the changeset viewer.