Ignore:
Timestamp:
2016-01-14T16:42:50+01:00 (8 years ago)
Author:
simon04
Message:

see #12338 - Conflict resolution: add expert actions "Resolve to my/their versions" in popup menu

This resolves all selected conflicts to my/their versions.

File:
1 edited

Legend:

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

    r9059 r9440  
    1313import java.awt.event.KeyEvent;
    1414import java.awt.event.MouseEvent;
     15import java.util.ArrayList;
    1516import java.util.Arrays;
    1617import java.util.Collection;
    1718import java.util.HashSet;
    1819import java.util.LinkedList;
     20import java.util.List;
    1921import java.util.Set;
    2022import java.util.concurrent.CopyOnWriteArrayList;
     
    2224import javax.swing.AbstractAction;
    2325import javax.swing.JList;
     26import javax.swing.JMenuItem;
    2427import javax.swing.JOptionPane;
    2528import javax.swing.JPopupMenu;
     
    3033import javax.swing.event.ListSelectionEvent;
    3134import javax.swing.event.ListSelectionListener;
     35import javax.swing.event.PopupMenuEvent;
     36import javax.swing.event.PopupMenuListener;
    3237
    3338import org.openstreetmap.josm.Main;
    3439import org.openstreetmap.josm.actions.AbstractSelectAction;
     40import org.openstreetmap.josm.actions.ExpertToggleAction;
     41import org.openstreetmap.josm.command.Command;
     42import org.openstreetmap.josm.command.SequenceCommand;
    3543import org.openstreetmap.josm.data.SelectionChangedListener;
    3644import org.openstreetmap.josm.data.conflict.Conflict;
     
    5260import org.openstreetmap.josm.gui.PopupMenuHandler;
    5361import org.openstreetmap.josm.gui.SideButton;
     62import org.openstreetmap.josm.gui.conflict.pair.ConflictResolver;
     63import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
    5464import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    5565import org.openstreetmap.josm.gui.util.GuiHelper;
     
    118128
    119129        popupMenuHandler.addAction(Main.main.menu.autoScaleActions.get("conflict"));
     130
     131        final ResolveTpMyVersionAction resolveTpMyVersionAction = new ResolveTpMyVersionAction();
     132        final ResolveToTheirVersionAction resolveToTheirVersionAction = new ResolveToTheirVersionAction();
     133        addListSelectionListener(resolveTpMyVersionAction);
     134        addListSelectionListener(resolveToTheirVersionAction);
     135        final JMenuItem btnResolveMy = popupMenuHandler.addAction(resolveTpMyVersionAction);
     136        final JMenuItem btnResolveTheir = popupMenuHandler.addAction(resolveToTheirVersionAction);
     137
     138        popupMenuHandler.addListener(new PopupMenuListener() {
     139            @Override
     140            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
     141                btnResolveMy.setVisible(ExpertToggleAction.isExpert());
     142                btnResolveTheir.setVisible(ExpertToggleAction.isExpert());
     143            }
     144
     145            @Override
     146            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
     147                // Do nothing
     148            }
     149
     150            @Override
     151            public void popupMenuCanceled(PopupMenuEvent e) {
     152                // Do nothing
     153            }
     154        });
    120155    }
    121156
     
    319354    }
    320355
     356    private boolean isConflictSelected() {
     357        final ListSelectionModel model = lstConflicts.getSelectionModel();
     358        return model.getMinSelectionIndex() >= 0 && model.getMaxSelectionIndex() >= model.getMinSelectionIndex();
     359    }
     360
    321361    @Override
    322362    public void onConflictsAdded(ConflictCollection conflicts) {
     
    445485        @Override
    446486        public void valueChanged(ListSelectionEvent e) {
    447             ListSelectionModel model = (ListSelectionModel) e.getSource();
    448             boolean enabled = model.getMinSelectionIndex() >= 0
    449             && model.getMaxSelectionIndex() >= model.getMinSelectionIndex();
    450             setEnabled(enabled);
     487            setEnabled(isConflictSelected());
    451488        }
    452489    }
     
    471508        @Override
    472509        public void valueChanged(ListSelectionEvent e) {
    473             ListSelectionModel model = (ListSelectionModel) e.getSource();
    474             boolean enabled = model.getMinSelectionIndex() >= 0
    475             && model.getMaxSelectionIndex() >= model.getMinSelectionIndex();
    476             setEnabled(enabled);
     510            setEnabled(isConflictSelected());
     511        }
     512    }
     513
     514    abstract class ResolveToAction extends ResolveAction {
     515        private final String name;
     516        private final MergeDecisionType type;
     517
     518        ResolveToAction(String name, String description, MergeDecisionType type) {
     519            this.name = name;
     520            this.type = type;
     521            putValue(NAME, name);
     522            putValue(SHORT_DESCRIPTION,  description);
     523        }
     524
     525        @Override
     526        public void actionPerformed(ActionEvent e) {
     527            final ConflictResolver resolver = new ConflictResolver();
     528            final List<Command> commands = new ArrayList<>();
     529            for (OsmPrimitive osmPrimitive : lstConflicts.getSelectedValuesList()) {
     530                Conflict<? extends OsmPrimitive> c = conflicts.getConflictForMy(osmPrimitive);
     531                resolver.populate(c);
     532                resolver.decideRemaining(type);
     533                commands.add(resolver.buildResolveCommand());
     534            }
     535            Main.main.undoRedo.add(new SequenceCommand(name, commands));
     536            refreshView();
     537            Main.map.mapView.repaint();
     538        }
     539    }
     540
     541    class ResolveTpMyVersionAction extends ResolveToAction {
     542        public ResolveTpMyVersionAction() {
     543            super(tr("Resolve to my versions"), tr("Resolves all unresolved conflicts to ''my'' version"),
     544                    MergeDecisionType.KEEP_MINE);
     545        }
     546    }
     547
     548    class ResolveToTheirVersionAction extends ResolveToAction {
     549        public ResolveToTheirVersionAction() {
     550            super(tr("Resolve to their versions"), tr("Resolves all unresolved conflicts to ''their'' version"),
     551                    MergeDecisionType.KEEP_THEIR);
    477552        }
    478553    }
Note: See TracChangeset for help on using the changeset viewer.