]> gitweb.fperrin.net Git - GpsPrune.git/blob - src/tim/prune/gui/UndoManager.java
b9d9f32993e51adcdb72957f9e5d309822dc811e
[GpsPrune.git] / src / 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 javax.swing.BorderFactory;
8 import javax.swing.JButton;
9 import javax.swing.JDialog;
10 import javax.swing.JFrame;
11 import javax.swing.JLabel;
12 import javax.swing.JList;
13 import javax.swing.JPanel;
14 import javax.swing.JScrollPane;
15 import javax.swing.ListSelectionModel;
16 import javax.swing.event.ListSelectionEvent;
17 import javax.swing.event.ListSelectionListener;
18
19 import tim.prune.App;
20 import tim.prune.I18nManager;
21 import tim.prune.undo.UndoStack;
22
23 /**
24  * Class to manage the selection of actions to undo
25  */
26 public class UndoManager
27 {
28         private App _app = null;
29         private JFrame _parentFrame = null;
30         private JDialog _dialog = null;
31         private JList<String> _actionList = null;
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                 _parentFrame = inFrame;
43         }
44
45         /**
46          * Show the dialog to select which actions to undo
47          */
48         public void show()
49         {
50                 _dialog = new JDialog(_parentFrame, I18nManager.getText("dialog.undo.title"), true);
51                 _dialog.setLocationRelativeTo(_parentFrame);
52                 JPanel mainPanel = new JPanel();
53                 mainPanel.setLayout(new BorderLayout(3, 3));
54                 mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
55                 UndoStack undoStack = _app.getUndoStack();
56                 mainPanel.add(new JLabel(I18nManager.getText("dialog.undo.pretext")), BorderLayout.NORTH);
57
58                 String[] undoActions = new String[undoStack.size()];
59                 for (int i=0; i<undoStack.size(); i++)
60                 {
61                         undoActions[i] = undoStack.getOperationAt(undoStack.size()-1-i).getDescription();
62                 }
63                 _actionList = new JList<String>(undoActions);
64                 _actionList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
65                 _actionList.setSelectedIndex(0);
66                 _actionList.addListSelectionListener(new ListSelectionListener()
67                         {
68                                 public void valueChanged(ListSelectionEvent e)
69                                 {
70                                         if (_actionList.getMinSelectionIndex() > 0)
71                                         {
72                                                 _actionList.setSelectionInterval(0, _actionList.getMaxSelectionIndex());
73                                         }
74                                 }
75                         });
76                 mainPanel.add(new JScrollPane(_actionList), BorderLayout.CENTER);
77                 // Buttons
78                 JPanel buttonPanel = new JPanel();
79                 buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
80                 JButton okButton = new JButton(I18nManager.getText("button.ok"));
81                 okButton.addActionListener(new ActionListener()
82                         {
83                                 public void actionPerformed(ActionEvent e)
84                                 {
85                                         _app.undoActions(_actionList.getMaxSelectionIndex() + 1);
86                                         _dialog.dispose();
87                                 }
88                         });
89                 buttonPanel.add(okButton);
90                 JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
91                 cancelButton.addActionListener(new ActionListener()
92                         {
93                                 public void actionPerformed(ActionEvent e)
94                                 {
95                                         _dialog.dispose();
96                                 }
97                         });
98                 buttonPanel.add(cancelButton);
99                 mainPanel.add(buttonPanel, BorderLayout.SOUTH);
100                 _dialog.getContentPane().add(mainPanel);
101                 _dialog.pack();
102                 _dialog.setVisible(true);
103         }
104
105 }