Ignore:
Timestamp:
2015-06-10T14:21:24+02:00 (10 years ago)
Author:
nokutu
Message:

New history dialog

Location:
applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java

    r31256 r31257  
    88        public final LatLon latLon;
    99        /** Direction of the picture */
    10         protected final double ca;
    11         private boolean isModified = false;
     10        public final double ca;
     11        public boolean isModified = false;
    1212        /** Temporal position of the picture until it is uplaoded */
    1313        public LatLon tempLatLon;
     
    1818        public LatLon movingLatLon;
    1919        /** Temporal direction of the picture until it is uplaoded */
    20         protected double tempCa;
     20        public double tempCa;
    2121        /**
    2222         * When the object direction is being moved in the map, the temporal
  • applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java

    r31256 r31257  
    66import org.openstreetmap.josm.plugins.mapillary.cache.MapillaryCache;
    77import org.openstreetmap.josm.plugins.mapillary.downloads.MapillaryDownloader;
     8import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryHistoryDialog;
    89import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryToggleDialog;
    910import org.openstreetmap.josm.Main;
     
    6263
    6364        private List<Bounds> bounds;
    64         private MapillaryToggleDialog tgd;
     65
     66        private MapillaryToggleDialog mtd;
     67        private MapillaryHistoryDialog mhd;
    6568
    6669        private MouseAdapter mouseAdapter;
     
    9194                        MapView.addLayerChangeListener(this);
    9295                        Main.map.mapView.getEditLayer().data.addDataSetListener(this);
    93                         if (tgd == null) {
     96                        if (mtd == null) {
    9497                                if (MapillaryToggleDialog.INSTANCE == null) {
    95                                         tgd = MapillaryToggleDialog.getInstance();
    96                                         Main.map.addToggleDialog(tgd, false);
     98                                        mtd = MapillaryToggleDialog.getInstance();
     99                                        Main.map.addToggleDialog(mtd, false);
    97100                                } else
    98                                         tgd = MapillaryToggleDialog.getInstance();
     101                                        mtd = MapillaryToggleDialog.getInstance();
     102                        }
     103                        if (mhd == null) {
     104                                if (MapillaryHistoryDialog.INSTANCE == null) {
     105                                        mhd = MapillaryHistoryDialog.getInstance();
     106                                        Main.map.addToggleDialog(mhd, false);
     107                                } else
     108                                        mhd = MapillaryHistoryDialog.getInstance();
    99109                        }
    100110                }
     
    109119        }
    110120
    111                        
    112121        public synchronized static MapillaryLayer getInstance() {
    113122                if (MapillaryLayer.INSTANCE == null)
  • applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandMoveImage.java

    r31256 r31257  
    22
    33import static org.openstreetmap.josm.tools.I18n.trn;
     4
    45import java.util.ArrayList;
    56import java.util.List;
     
    1516 */
    1617public class CommandMoveImage extends MapillaryCommand {
    17         private List<MapillaryAbstractImage> images;
    1818        private double x;
    1919        private double y;
     
    3131                        image.stopMoving();
    3232                }
     33                checkModified();
    3334                Main.map.repaint();
    3435        }
     
    4041                        image.stopMoving();
    4142                }
     43                checkModified();
    4244                Main.map.repaint();
    4345        }
     
    4648                return trn("Moved {0} node", "Moved {0} nodes", images.size(), images.size());
    4749        }
     50       
     51        @Override
     52        public void sum(MapillaryCommand command) {
     53                if (command instanceof CommandMoveImage) {
     54                        this.x += ((CommandMoveImage) command).x;
     55                        this.y += ((CommandMoveImage) command).y;
     56                }
     57        }
    4858}
  • applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/CommandTurnImage.java

    r31256 r31257  
    1616 */
    1717public class CommandTurnImage extends MapillaryCommand {
    18         private List<MapillaryAbstractImage> images;
    1918        private double ca;
    2019
     
    3029                        image.stopMoving();
    3130                }
     31                checkModified();
    3232                Main.map.repaint();
    3333        }
     
    3939                        image.stopMoving();
    4040                }
     41                checkModified();
    4142                Main.map.repaint();
    4243        }
    4344
    4445        public String toString() {
    45                 return trn("Turned {0} node", "Moved {0} nodes", images.size(), images.size());
     46                return trn("Turned {0} node", "Turned {0} nodes", this.images.size(),
     47                                this.images.size());
     48        }
     49
     50        @Override
     51        public void sum(MapillaryCommand command) {
     52                if (command instanceof CommandTurnImage) {
     53                        this.ca += ((CommandTurnImage) command).ca;
     54                }
    4655        }
    4756}
  • applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryCommand.java

    r31245 r31257  
    11package org.openstreetmap.josm.plugins.mapillary.commands;
     2
     3import java.util.List;
     4
     5import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
    26
    37/**
     
    812 */
    913public abstract class MapillaryCommand {
     14        protected List<MapillaryAbstractImage> images;
    1015
    1116        public abstract void undo();
    1217
    1318        public abstract void redo();
     19       
     20        public abstract void sum(MapillaryCommand command);
     21       
     22        public void checkModified() {
     23                for (MapillaryAbstractImage image : images)
     24                        image.isModified = (image.tempLatLon == image.latLon || image.tempCa == image.ca);
     25        }
    1426}
  • applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/commands/MapillaryRecord.java

    r31245 r31257  
    55/**
    66 * History record system in order to let you undo commands
     7 *
    78 * @author nokutu
    89 *
     
    1011public class MapillaryRecord {
    1112        public static MapillaryRecord INSTANCE;
     13
     14        private ArrayList<MapillaryRecordListener> listeners;
    1215
    1316        public ArrayList<MapillaryCommand> commandList;
     
    1821                commandList = new ArrayList<>();
    1922                position = -1;
     23                listeners = new ArrayList<>();
    2024        }
    2125
     
    2630        }
    2731
     32        public void addListener(MapillaryRecordListener lis) {
     33                this.listeners.add(lis);
     34        }
     35
     36        public void removeListener(MapillaryRecordListener lis) {
     37                this.listeners.remove(lis);
     38        }
     39
    2840        /**
    2941         * Adds a new command to the list.
     
    3244         */
    3345        public void addCommand(MapillaryCommand command) {
     46                // Checks if it is a continuation of last command
     47                if (position != -1
     48                                && commandList.get(position).images.equals(command.images)
     49                                && commandList.get(position).getClass() == command.getClass()) {
     50                        commandList.get(position).sum(command);
     51                        fireRecordChanged();
     52                        return;
     53                }
    3454                commandList.add(position + 1, command);
    3555                position++;
     
    3757                        commandList.remove(position + 1);
    3858                }
     59                fireRecordChanged();
    3960        }
    4061
     
    4768                commandList.get(position).undo();
    4869                position--;
     70                fireRecordChanged();
    4971        }
    5072
     
    5375         */
    5476        public void redo() {
    55                 if (position >= commandList.size())
     77                if (position + 1 >= commandList.size())
    5678                        return;
     79                position++;
    5780                commandList.get(position).redo();
    58                 position++;
     81                fireRecordChanged();
     82        }
     83
     84        private void fireRecordChanged() {
     85                for (MapillaryRecordListener lis : listeners)
     86                        if (lis != null)
     87                                lis.recordChanged();
    5988        }
    6089}
  • applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryHistoryDialog.java

    r31256 r31257  
    33import static org.openstreetmap.josm.tools.I18n.tr;
    44
     5import java.awt.Component;
     6import java.awt.Dimension;
     7import java.awt.GridBagLayout;
     8import java.awt.event.ActionEvent;
     9import java.util.ArrayList;
     10import java.util.Arrays;
     11
     12import javax.swing.AbstractAction;
     13import javax.swing.Box;
     14import javax.swing.JPanel;
     15import javax.swing.JSeparator;
     16import javax.swing.JTree;
     17import javax.swing.tree.DefaultTreeCellRenderer;
     18import javax.swing.tree.DefaultTreeModel;
     19
     20import org.openstreetmap.josm.gui.SideButton;
    521import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
     22import org.openstreetmap.josm.plugins.mapillary.commands.MapillaryCommand;
     23import org.openstreetmap.josm.plugins.mapillary.commands.MapillaryRecord;
     24import org.openstreetmap.josm.plugins.mapillary.commands.MapillaryRecordListener;
     25import org.openstreetmap.josm.tools.GBC;
     26import org.openstreetmap.josm.tools.ImageProvider;
    627
    7 public class MapillaryHistoryDialog extends ToggleDialog {
     28import javax.swing.tree.DefaultMutableTreeNode;
     29
     30public class MapillaryHistoryDialog extends ToggleDialog implements
     31                MapillaryRecordListener {
     32
     33        public static MapillaryHistoryDialog INSTANCE;
     34
     35        private final DefaultTreeModel undoTreeModel = new DefaultTreeModel(
     36                        new DefaultMutableTreeNode());
     37        private final DefaultTreeModel redoTreeModel = new DefaultTreeModel(
     38                        new DefaultMutableTreeNode());
     39        private final JTree undoTree = new JTree(undoTreeModel);
     40        private final JTree redoTree = new JTree(redoTreeModel);
     41
     42        private JSeparator separator = new JSeparator();
     43        private Component spacer = Box.createRigidArea(new Dimension(0, 3));
     44
     45        private SideButton undoButton;
     46        private SideButton redoButton;
    847
    948        public MapillaryHistoryDialog() {
    10                 super(tr("Mapillary history"), "mapillary.png",
     49                super(tr("Mapillary history"), "mapillaryhistory.png",
    1150                                tr("Open Mapillary history dialog"), null, 200);
     51
     52                MapillaryRecord.getInstance().addListener(this);
     53
     54                undoTree.expandRow(0);
     55                undoTree.setShowsRootHandles(true);
     56                undoTree.setRootVisible(false);
     57                undoTree.setCellRenderer(new MapillaryCellRenderer());
     58                redoTree.expandRow(0);
     59                redoTree.setCellRenderer(new MapillaryCellRenderer());
     60                redoTree.setShowsRootHandles(true);
     61                redoTree.setRootVisible(false);
     62
     63                JPanel treesPanel = new JPanel(new GridBagLayout());
     64                treesPanel.add(spacer, GBC.eol());
     65                spacer.setVisible(false);
     66                treesPanel.add(undoTree, GBC.eol().fill(GBC.HORIZONTAL));
     67                separator.setVisible(false);
     68                treesPanel.add(separator, GBC.eol().fill(GBC.HORIZONTAL));
     69                treesPanel.add(redoTree, GBC.eol().fill(GBC.HORIZONTAL));
     70                treesPanel.add(Box.createRigidArea(new Dimension(0, 0)), GBC.std()
     71                                .weight(0, 1));
     72                treesPanel.setBackground(redoTree.getBackground());
     73
     74                undoButton = new SideButton(new UndoAction());
     75                redoButton = new SideButton(new RedoAction());
     76
     77                createLayout(treesPanel, true,
     78                                Arrays.asList(new SideButton[] { undoButton, redoButton }));
     79        }
     80
     81        public static MapillaryHistoryDialog getInstance() {
     82                if (INSTANCE == null)
     83                        INSTANCE = new MapillaryHistoryDialog();
     84                return INSTANCE;
     85        }
     86
     87        private void buildTree() {
     88                redoButton.setEnabled(true);
     89                undoButton.setEnabled(true);
     90                ArrayList<MapillaryCommand> commands = MapillaryRecord.getInstance().commandList;
     91                int position = MapillaryRecord.getInstance().position;
     92                ArrayList<MapillaryCommand> undoCommands = new ArrayList<>();
     93                if (position >= 0)
     94                        undoCommands = new ArrayList<>(commands.subList(0, position + 1));
     95                else
     96                        undoButton.setEnabled(false);
     97                ArrayList<MapillaryCommand> redoCommands = new ArrayList<>();
     98                if (commands.size() > 0 && position + 1 < commands.size())
     99                        redoCommands = new ArrayList<>(commands.subList(position + 1,
     100                                        commands.size()));
     101                else
     102                        redoButton.setEnabled(false);
     103
     104                DefaultMutableTreeNode redoRoot = new DefaultMutableTreeNode();
     105                DefaultMutableTreeNode undoRoot = new DefaultMutableTreeNode();
     106
     107                for (MapillaryCommand command : undoCommands) {
     108                        if (command != null)
     109                                undoRoot.add(new DefaultMutableTreeNode(command.toString()));
     110                }
     111                for (MapillaryCommand command : redoCommands) {
     112                        if (command != null)
     113                                redoRoot.add(new DefaultMutableTreeNode(command.toString()));
     114                }
     115
     116                separator
     117                                .setVisible(!undoCommands.isEmpty() || !redoCommands.isEmpty());
     118                spacer.setVisible(undoCommands.isEmpty() && !redoCommands.isEmpty());
     119
     120                undoTreeModel.setRoot(undoRoot);
     121                redoTreeModel.setRoot(redoRoot);
     122        }
     123
     124        @Override
     125        public void recordChanged() {
     126                buildTree();
     127        }
     128
     129        private class UndoAction extends AbstractAction {
     130
     131                public UndoAction() {
     132                        putValue(NAME, tr("Undo"));
     133                        putValue(SMALL_ICON, ImageProvider.get("undo"));
     134                }
     135
     136                @Override
     137                public void actionPerformed(ActionEvent arg0) {
     138                        MapillaryRecord.getInstance().undo();
     139                }
     140
     141        }
     142
     143        private class RedoAction extends AbstractAction {
     144                public RedoAction() {
     145                        putValue(NAME, tr("Redo"));
     146                        putValue(SMALL_ICON, ImageProvider.get("redo"));
     147                }
     148
     149                @Override
     150                public void actionPerformed(ActionEvent arg0) {
     151                        MapillaryRecord.getInstance().redo();
     152                }
     153
     154        }
     155
     156        private static class MapillaryCellRenderer extends DefaultTreeCellRenderer {
     157                @Override
     158                public Component getTreeCellRendererComponent(JTree tree, Object value,
     159                                boolean sel, boolean expanded, boolean leaf, int row,
     160                                boolean hasFocus) {
     161                        super.getTreeCellRendererComponent(tree, value, sel, expanded,
     162                                        leaf, row, hasFocus);
     163                        setIcon(ImageProvider.get("data/node.png"));
     164                        return this;
     165                }
    12166        }
    13167}
Note: See TracChangeset for help on using the changeset viewer.