// License: GPL. Copyright 2007 by Immanuel Scholz and others package org.openstreetmap.josm.gui.dialogs; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.KeyEvent; import java.util.Collection; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.command.Command; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener; import org.openstreetmap.josm.tools.Shortcut; public class CommandStackDialog extends ToggleDialog implements CommandQueueListener { private DefaultTreeModel treeModel = new DefaultTreeModel(new DefaultMutableTreeNode()); private JTree tree = new JTree(treeModel); public CommandStackDialog(final MapFrame mapFrame) { super(tr("Command Stack"), "commandstack", tr("Open a list of all commands (undo buffer)."), Shortcut.registerShortcut("subwindow:commandstack", tr("Toggle: {0}", tr("Command Stack")), KeyEvent.VK_O, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 100, true); Main.main.undoRedo.listenerCommands.add(this); tree.setRootVisible(false); tree.setShowsRootHandles(true); tree.expandRow(0); tree.setCellRenderer(new DefaultTreeCellRenderer(){ @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); DefaultMutableTreeNode v = (DefaultMutableTreeNode)value; if (v.getUserObject() instanceof JLabel) { JLabel l = (JLabel)v.getUserObject(); setIcon(l.getIcon()); setText(l.getText()); } return this; } }); tree.setVisibleRowCount(8); add(new JScrollPane(tree), BorderLayout.CENTER); } @Override public void setVisible(boolean v) { if (v) { buildList(); } else if (tree != null) { treeModel.setRoot(new DefaultMutableTreeNode()); } super.setVisible(v); } private void buildList() { if(Main.main.undoRedo.commands.size() != 0) { setTitle(tr("Command Stack: {0}", Main.main.undoRedo.commands.size())); } else { setTitle(tr("Command Stack")); } if (Main.map == null || Main.map.mapView == null || Main.map.mapView.getEditLayer() == null) return; Collection<Command> commands = Main.main.undoRedo.commands; DefaultMutableTreeNode root = new DefaultMutableTreeNode(); for (Command c : commands) { root.add(c.description()); } treeModel.setRoot(root); tree.scrollRowToVisible(treeModel.getChildCount(root)-1); } public void commandChanged(int queueSize, int redoSize) { if (!isVisible()) return; treeModel.setRoot(new DefaultMutableTreeNode()); buildList(); } }