]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/UndoManager.java
Version 4, January 2008
[GpsPrune.git] / tim / prune / gui / UndoManager.java
1 package tim.prune.gui;
2
3 import java.awt.FlowLayout;
4 import java.awt.BorderLayout;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import java.util.Stack;
8 import javax.swing.BorderFactory;
9 import javax.swing.JButton;
10 import javax.swing.JDialog;
11 import javax.swing.JFrame;
12 import javax.swing.JLabel;
13 import javax.swing.JList;
14 import javax.swing.JPanel;
15 import javax.swing.JScrollPane;
16 import javax.swing.ListSelectionModel;
17 import javax.swing.event.ListSelectionEvent;
18 import javax.swing.event.ListSelectionListener;
19
20 import tim.prune.App;
21 import tim.prune.I18nManager;
22 import tim.prune.undo.UndoOperation;
23
24 /**
25  * Class to manage the selection of actions to undo
26  */
27 public class UndoManager
28 {
29         private App _app;
30         private JDialog _dialog;
31         private JList _actionList;
32
33
34         /**
35          * Constructor
36          * @param inApp App object
37          * @param inFrame parent frame
38          */
39         public UndoManager(App inApp, JFrame inFrame)
40         {
41                 _app = inApp;
42                 _dialog = new JDialog(inFrame, I18nManager.getText("dialog.undo.title"), true);
43                 _dialog.setLocationRelativeTo(inFrame);
44                 JPanel mainPanel = new JPanel();
45                 mainPanel.setLayout(new BorderLayout(3, 3));
46                 mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
47                 Stack undoStack = inApp.getUndoStack();
48                 mainPanel.add(new JLabel(I18nManager.getText("dialog.undo.pretext")), BorderLayout.NORTH);
49
50                 String[] undoActions = new String[undoStack.size()];
51                 for (int i=0; i<undoStack.size(); i++)
52                 {
53                         undoActions[i] = ((UndoOperation) undoStack.elementAt(undoStack.size()-1-i)).getDescription();
54                 }
55                 _actionList = new JList(undoActions);
56                 _actionList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
57                 _actionList.setSelectedIndex(0);
58                 _actionList.addListSelectionListener(new ListSelectionListener()
59                         {
60                                 public void valueChanged(ListSelectionEvent e)
61                                 {
62                                         if (_actionList.getMinSelectionIndex() > 0)
63                                         {
64                                                 _actionList.setSelectionInterval(0, _actionList.getMaxSelectionIndex());
65                                         }
66                                 }
67                         });
68                 mainPanel.add(new JScrollPane(_actionList), BorderLayout.CENTER);
69                 // Buttons
70                 JPanel buttonPanel = new JPanel();
71                 buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
72                 JButton okButton = new JButton(I18nManager.getText("button.ok"));
73                 okButton.addActionListener(new ActionListener()
74                         {
75                                 public void actionPerformed(ActionEvent e)
76                                 {
77                                         _app.undoActions(_actionList.getMaxSelectionIndex() + 1);
78                                         _dialog.dispose();
79                                 }
80                         });
81                 buttonPanel.add(okButton);
82                 JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
83                 cancelButton.addActionListener(new ActionListener()
84                         {
85                                 public void actionPerformed(ActionEvent e)
86                                 {
87                                         _dialog.dispose();
88                                 }
89                         });
90                 buttonPanel.add(cancelButton);
91                 mainPanel.add(buttonPanel, BorderLayout.SOUTH);
92                 _dialog.getContentPane().add(mainPanel);
93                 _dialog.pack();
94                 _dialog.show();
95         }
96
97 }