3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.awt.event.InputEvent;
6 import java.awt.event.KeyEvent;
8 import javax.swing.JFrame;
9 import javax.swing.JMenu;
10 import javax.swing.JMenuBar;
11 import javax.swing.JMenuItem;
12 import javax.swing.KeyStroke;
15 import tim.prune.DataSubscriber;
16 import tim.prune.I18nManager;
17 import tim.prune.data.Selection;
18 import tim.prune.data.Track;
19 import tim.prune.data.TrackInfo;
22 * Class to manage the menu bar,
23 * including enabling and disabling the menu items
25 public class MenuManager implements DataSubscriber
27 private JFrame _parent = null;
28 private App _app = null;
29 private Track _track = null;
30 private Selection _selection = null;
32 // Menu items which need enabling/disabling
33 JMenuItem _saveItem = null;
34 JMenuItem _exportItem = null;
35 JMenuItem _undoItem = null;
36 JMenuItem _clearUndoItem = null;
37 JMenuItem _deletePointItem = null;
38 JMenuItem _deleteRangeItem = null;
39 JMenuItem _deleteDuplicatesItem = null;
40 JMenuItem _compressItem = null;
41 JMenuItem _interpolateItem = null;
42 JMenuItem _selectAllItem = null;
43 JMenuItem _selectNoneItem = null;
44 JMenuItem _show3dItem = null;
45 JMenuItem _reverseItem = null;
46 JMenu _rearrangeMenu = null;
47 JMenuItem _rearrangeStartItem = null;
48 JMenuItem _rearrangeEndItem = null;
49 JMenuItem _rearrangeNearestItem = null;
54 * @param inParent parent object for dialogs
55 * @param inApp application to call on menu actions
57 public MenuManager(JFrame inParent, App inApp, TrackInfo inTrackInfo)
61 _track = inTrackInfo.getTrack();
62 _selection = inTrackInfo.getSelection();
67 * Create a JMenuBar containing all menu items
70 public JMenuBar createMenuBar()
72 JMenuBar menubar = new JMenuBar();
73 JMenu fileMenu = new JMenu(I18nManager.getText("menu.file"));
74 JMenuItem openMenuItem = new JMenuItem(I18nManager.getText("menu.file.open"));
75 openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
76 openMenuItem.addActionListener(new ActionListener() {
77 public void actionPerformed(ActionEvent e)
82 fileMenu.add(openMenuItem);
83 _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S);
84 _saveItem.addActionListener(new ActionListener() {
85 public void actionPerformed(ActionEvent e)
90 _saveItem.setEnabled(false);
91 fileMenu.add(_saveItem);
93 _exportItem = new JMenuItem(I18nManager.getText("menu.file.export"));
94 _exportItem.addActionListener(new ActionListener() {
95 public void actionPerformed(ActionEvent e)
100 _exportItem.setEnabled(false);
101 fileMenu.add(_exportItem);
102 fileMenu.addSeparator();
103 JMenuItem exitMenuItem = new JMenuItem(I18nManager.getText("menu.file.exit"));
104 exitMenuItem.addActionListener(new ActionListener() {
105 public void actionPerformed(ActionEvent e)
110 fileMenu.add(exitMenuItem);
111 menubar.add(fileMenu);
112 JMenu editMenu = new JMenu(I18nManager.getText("menu.edit"));
113 editMenu.setMnemonic(KeyEvent.VK_E);
114 _undoItem = new JMenuItem(I18nManager.getText("menu.edit.undo"));
115 _undoItem.addActionListener(new ActionListener() {
116 public void actionPerformed(ActionEvent e)
121 _undoItem.setEnabled(false);
122 editMenu.add(_undoItem);
123 _clearUndoItem = new JMenuItem(I18nManager.getText("menu.edit.clearundo"));
124 _clearUndoItem.addActionListener(new ActionListener() {
125 public void actionPerformed(ActionEvent e)
130 _clearUndoItem.setEnabled(false);
131 editMenu.add(_clearUndoItem);
132 editMenu.addSeparator();
133 _deletePointItem = new JMenuItem(I18nManager.getText("menu.edit.deletepoint"));
134 _deletePointItem.addActionListener(new ActionListener() {
135 public void actionPerformed(ActionEvent e)
137 _app.deleteCurrentPoint();
140 _deletePointItem.setEnabled(false);
141 editMenu.add(_deletePointItem);
142 _deleteRangeItem = new JMenuItem(I18nManager.getText("menu.edit.deleterange"));
143 _deleteRangeItem.addActionListener(new ActionListener() {
144 public void actionPerformed(ActionEvent e)
146 _app.deleteSelectedRange();
149 _deleteRangeItem.setEnabled(false);
150 editMenu.add(_deleteRangeItem);
151 _deleteDuplicatesItem = new JMenuItem(I18nManager.getText("menu.edit.deleteduplicates"));
152 _deleteDuplicatesItem.addActionListener(new ActionListener() {
153 public void actionPerformed(ActionEvent e)
155 _app.deleteDuplicates();
158 _deleteDuplicatesItem.setEnabled(false);
159 editMenu.add(_deleteDuplicatesItem);
160 _compressItem = new JMenuItem(I18nManager.getText("menu.edit.compress"));
161 _compressItem.addActionListener(new ActionListener() {
162 public void actionPerformed(ActionEvent e)
164 _app.compressTrack();
167 _compressItem.setEnabled(false);
168 editMenu.add(_compressItem);
169 editMenu.addSeparator();
170 _interpolateItem = new JMenuItem(I18nManager.getText("menu.edit.interpolate"));
171 _interpolateItem.addActionListener(new ActionListener() {
172 public void actionPerformed(ActionEvent e)
174 _app.interpolateSelection();
177 _interpolateItem.setEnabled(false);
178 editMenu.add(_interpolateItem);
179 _reverseItem = new JMenuItem(I18nManager.getText("menu.edit.reverse"));
180 _reverseItem.addActionListener(new ActionListener() {
181 public void actionPerformed(ActionEvent e)
186 _reverseItem.setEnabled(false);
187 editMenu.add(_reverseItem);
188 // Rearrange waypoints
189 _rearrangeMenu = new JMenu(I18nManager.getText("menu.edit.rearrange"));
190 _rearrangeMenu.setEnabled(false);
191 _rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.start"));
192 _rearrangeStartItem.addActionListener(new ActionListener() {
193 public void actionPerformed(ActionEvent e)
195 _app.rearrangeWaypoints(App.REARRANGE_TO_START);
198 _rearrangeStartItem.setEnabled(true);
199 _rearrangeMenu.add(_rearrangeStartItem);
200 _rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.end"));
201 _rearrangeEndItem.addActionListener(new ActionListener() {
202 public void actionPerformed(ActionEvent e)
204 _app.rearrangeWaypoints(App.REARRANGE_TO_END);
207 _rearrangeEndItem.setEnabled(true);
208 _rearrangeMenu.add(_rearrangeEndItem);
209 _rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.nearest"));
210 _rearrangeNearestItem.addActionListener(new ActionListener() {
211 public void actionPerformed(ActionEvent e)
213 _app.rearrangeWaypoints(App.REARRANGE_TO_NEAREST);
216 _rearrangeNearestItem.setEnabled(true);
217 _rearrangeMenu.add(_rearrangeNearestItem);
218 editMenu.add(_rearrangeMenu);
219 menubar.add(editMenu);
222 JMenu selectMenu = new JMenu(I18nManager.getText("menu.select"));
223 _selectAllItem = new JMenuItem(I18nManager.getText("menu.select.all"));
224 _selectAllItem.setEnabled(false);
225 _selectAllItem.addActionListener(new ActionListener() {
226 public void actionPerformed(ActionEvent e)
231 selectMenu.add(_selectAllItem);
232 _selectNoneItem = new JMenuItem(I18nManager.getText("menu.select.none"));
233 _selectNoneItem.setEnabled(false);
234 _selectNoneItem.addActionListener(new ActionListener() {
235 public void actionPerformed(ActionEvent e)
240 selectMenu.add(_selectNoneItem);
241 menubar.add(selectMenu);
243 // Add 3d menu if available
244 if (isJava3dEnabled())
246 JMenu threeDMenu = new JMenu(I18nManager.getText("menu.3d"));
247 _show3dItem = new JMenuItem(I18nManager.getText("menu.3d.show3d"));
248 _show3dItem.addActionListener(new ActionListener() {
249 public void actionPerformed(ActionEvent e)
254 _show3dItem.setEnabled(false);
255 threeDMenu.add(_show3dItem);
256 menubar.add(threeDMenu);
259 // Help menu for About
260 JMenu helpMenu = new JMenu(I18nManager.getText("menu.help"));
261 JMenuItem aboutItem = new JMenuItem(I18nManager.getText("menu.help.about"));
262 aboutItem.addActionListener(new ActionListener() {
263 public void actionPerformed(ActionEvent e)
265 new AboutScreen(_parent).show();
268 helpMenu.add(aboutItem);
269 menubar.add(helpMenu);
276 * Method to update menu when file loaded
278 public void informFileLoaded()
280 // save, undo, delete enabled
281 _saveItem.setEnabled(true);
282 _undoItem.setEnabled(true);
283 _deleteDuplicatesItem.setEnabled(true);
284 _compressItem.setEnabled(true);
289 * @return true if 3d capability is installed
291 private static boolean isJava3dEnabled()
293 boolean has3d = false;
296 Class universeClass = Class.forName("com.sun.j3d.utils.universe.SimpleUniverse");
299 catch (ClassNotFoundException e)
301 // no java3d classes available
308 * @see tim.prune.DataSubscriber#dataUpdated(tim.prune.data.Track)
310 public void dataUpdated()
312 boolean hasData = (_track != null && _track.getNumPoints() > 0);
313 // set functions which require data
314 _saveItem.setEnabled(hasData);
315 _exportItem.setEnabled(hasData);
316 _deleteDuplicatesItem.setEnabled(hasData);
317 _compressItem.setEnabled(hasData);
318 _rearrangeMenu.setEnabled(hasData && _track.hasMixedData());
319 _selectAllItem.setEnabled(hasData);
320 _selectNoneItem.setEnabled(hasData);
321 if (_show3dItem != null)
322 _show3dItem.setEnabled(hasData);
323 // is undo available?
324 boolean hasUndo = !_app.getUndoStack().isEmpty();
325 _undoItem.setEnabled(hasUndo);
326 _clearUndoItem.setEnabled(hasUndo);
327 // is there a current point?
328 boolean hasPoint = (hasData && _selection.getCurrentPointIndex() >= 0);
329 _deletePointItem.setEnabled(hasPoint);
330 // is there a current range?
331 boolean hasRange = (hasData && _selection.hasRangeSelected());
332 _deleteRangeItem.setEnabled(hasRange);
333 _interpolateItem.setEnabled(hasRange
334 && (_selection.getEnd() - _selection.getStart()) == 1);
335 _reverseItem.setEnabled(hasRange);