Ticket #22655: 22655.patch

File 22655.patch, 5.5 KB (added by taylor.smock, 3 years ago)

Use drop-down arrow for Add and Clear action

  • src/org/openstreetmap/josm/plugins/todo/TodoDialog.java

    diff --git a/src/org/openstreetmap/josm/plugins/todo/TodoDialog.java b/src/org/openstreetmap/josm/plugins/todo/TodoDialog.java
    index 73be6f1..0503685 100644
    a b package org.openstreetmap.josm.plugins.todo;  
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.Component;
     7import java.awt.Rectangle;
    68import java.awt.event.ActionEvent;
    79import java.awt.event.KeyEvent;
    810import java.awt.event.MouseAdapter;
    import java.util.stream.Collectors;  
    1820import java.util.stream.Stream;
    1921
    2022import javax.swing.AbstractAction;
     23import javax.swing.Action;
    2124import javax.swing.DefaultListSelectionModel;
    2225import javax.swing.JList;
     26import javax.swing.JPopupMenu;
    2327import javax.swing.ListSelectionModel;
    2428import javax.swing.SwingUtilities;
    2529import javax.swing.event.ListDataEvent;
    import javax.swing.event.ListSelectionListener;  
    2933
    3034import org.openstreetmap.josm.actions.AutoScaleAction;
    3135import org.openstreetmap.josm.actions.AutoScaleAction.AutoScaleMode;
     36import org.openstreetmap.josm.actions.JosmAction;
    3237import org.openstreetmap.josm.data.osm.DataSelectionListener;
    3338import org.openstreetmap.josm.data.osm.OsmPrimitive;
    3439import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
    public class TodoDialog extends ToggleDialog implements PropertyChangeListener,  
    6671    private final PassAction actPass = new PassAction(model);
    6772    private final MarkAction actMark = new MarkAction(model);
    6873    private final MarkSelectedAction actMarkSelected = new MarkSelectedAction(model);
     74    private final ClearAndAddAction actClearAndAdd = new ClearAndAddAction(model);   
    6975    /* The popup must be created AFTER actions */
    7076    private final TodoPopup popupMenu = new TodoPopup(lstPrimitives);
    7177
    public class TodoDialog extends ToggleDialog implements PropertyChangeListener,  
    112118        SideButton addButton = new SideButton(actAdd);
    113119        actAdd.updateEnabledState();
    114120
     121        // the clear and add button
     122        addButton.createArrow(l -> showPopupMenu(addButton, actClearAndAdd), true);
     123
    115124        // the pass button
    116125        SideButton passButton = new SideButton(actPass);
    117126        lstPrimitives.getSelectionModel().addListSelectionListener(actPass);
    public class TodoDialog extends ToggleDialog implements PropertyChangeListener,  
    128137        createLayout(lstPrimitives, true, Arrays.asList(selectButton, addButton, passButton, markButton, markSelectedButton));
    129138    }
    130139
     140    private static void showPopupMenu(Component parent, Object... menuItems) {
     141        final JPopupMenu menu = new JPopupMenu();
     142        final Rectangle box = parent.getBounds();
     143        for (Object item : menuItems) {
     144            if (item instanceof Action) {
     145                menu.add((Action) item);
     146            } else {
     147                throw new IllegalArgumentException("We don't currently support " + item.getClass());
     148            }
     149        }
     150        menu.show(parent, 0, box.y + box.height);
     151    }
     152
    131153    private static void zoom(OsmDataLayer layer) {
    132154        OsmDataLayer prev = MainApplication.getLayerManager().getEditLayer();
    133155
    public class TodoDialog extends ToggleDialog implements PropertyChangeListener,  
    178200    @Override
    179201    public void showNotify() {
    180202        SelectionEventManager.getInstance().addSelectionListenerForEdt(actAdd);
     203        SelectionEventManager.getInstance().addSelectionListenerForEdt(actClearAndAdd);
    181204        SelectionEventManager.getInstance().addSelectionListenerForEdt(actMarkSelected);
    182205        actAdd.updateEnabledState();
    183206    }
    public class TodoDialog extends ToggleDialog implements PropertyChangeListener,  
    317340        }
    318341    }
    319342
     343    private class ClearAndAddAction extends JosmAction implements DataSelectionListener {
     344        private final TodoListModel model;
     345
     346        ClearAndAddAction(TodoListModel model) {
     347            super(
     348                tr("Clear and add"),
     349                "dialogs/selectionlist",
     350                tr("Clear list, add the selected items to the todo list and zoom first item."),
     351                Shortcut.registerShortcut("subwindow:todo:clearandadd", tr("Clear and add elements"), KeyEvent.VK_CLOSE_BRACKET, Shortcut.CTRL),
     352                false
     353                );
     354            this.model = model;           
     355            updateEnabledState();
     356        }
     357
     358        @Override
     359        public void actionPerformed(ActionEvent e) {
     360            model.clear();
     361            model.addItems(getItems());
     362            selectAndZoom(model.getSelected());
     363        }
     364
     365        /**
     366         * Update the enabled state of the action
     367         */
     368        public void updateEnabledState() {
     369            if (MainApplication.getLayerManager().getEditLayer() == null) {
     370                setEnabled(false);
     371            } else {
     372                setEnabled(!MainApplication.getLayerManager().getEditLayer().data.selectionEmpty());
     373            }
     374        }
     375
     376        @Override
     377        public void selectionChanged(SelectionChangeEvent event) {
     378            updateEnabledState();
     379        }
     380    }
     381
    320382    private class MarkSelectedAction extends AbstractAction implements DataSelectionListener {
    321383        private final TodoListModel model;
    322384
    public class TodoDialog extends ToggleDialog implements PropertyChangeListener,  
    514576    @Override
    515577    public void propertyChange(PropertyChangeEvent arg0) {
    516578        actAdd.updateEnabledState();
     579        actClearAndAdd.updateEnabledState();
    517580    }
    518581
    519582    @Override