Changeset 3640 in josm for trunk/src/org/openstreetmap/josm


Ignore:
Timestamp:
2010-10-24T15:07:01+02:00 (14 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.