package tim.prune.gui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.KeyStroke; import tim.prune.App; import tim.prune.DataSubscriber; import tim.prune.I18nManager; import tim.prune.data.Selection; import tim.prune.data.Track; import tim.prune.data.TrackInfo; /** * Class to manage the menu bar, * including enabling and disabling the menu items */ public class MenuManager implements DataSubscriber { private JFrame _parent = null; private App _app = null; private Track _track = null; private Selection _selection = null; // Menu items which need enabling/disabling JMenuItem _saveItem = null; JMenuItem _exportItem = null; JMenuItem _undoItem = null; JMenuItem _clearUndoItem = null; JMenuItem _deletePointItem = null; JMenuItem _deleteRangeItem = null; JMenuItem _deleteDuplicatesItem = null; JMenuItem _compressItem = null; JMenuItem _interpolateItem = null; JMenuItem _selectAllItem = null; JMenuItem _selectNoneItem = null; JMenuItem _show3dItem = null; JMenuItem _reverseItem = null; JMenu _rearrangeMenu = null; JMenuItem _rearrangeStartItem = null; JMenuItem _rearrangeEndItem = null; JMenuItem _rearrangeNearestItem = null; /** * Constructor * @param inParent parent object for dialogs * @param inApp application to call on menu actions */ public MenuManager(JFrame inParent, App inApp, TrackInfo inTrackInfo) { _parent = inParent; _app = inApp; _track = inTrackInfo.getTrack(); _selection = inTrackInfo.getSelection(); } /** * Create a JMenuBar containing all menu items * @return JMenuBar */ public JMenuBar createMenuBar() { JMenuBar menubar = new JMenuBar(); JMenu fileMenu = new JMenu(I18nManager.getText("menu.file")); JMenuItem openMenuItem = new JMenuItem(I18nManager.getText("menu.file.open")); openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK)); openMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.openFile(); } }); fileMenu.add(openMenuItem); _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S); _saveItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.saveFile(); } }); _saveItem.setEnabled(false); fileMenu.add(_saveItem); // Export _exportItem = new JMenuItem(I18nManager.getText("menu.file.export")); _exportItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.exportKml(); } }); _exportItem.setEnabled(false); fileMenu.add(_exportItem); fileMenu.addSeparator(); JMenuItem exitMenuItem = new JMenuItem(I18nManager.getText("menu.file.exit")); exitMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.exit(); } }); fileMenu.add(exitMenuItem); menubar.add(fileMenu); JMenu editMenu = new JMenu(I18nManager.getText("menu.edit")); editMenu.setMnemonic(KeyEvent.VK_E); _undoItem = new JMenuItem(I18nManager.getText("menu.edit.undo")); _undoItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.beginUndo(); } }); _undoItem.setEnabled(false); editMenu.add(_undoItem); _clearUndoItem = new JMenuItem(I18nManager.getText("menu.edit.clearundo")); _clearUndoItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.clearUndo(); } }); _clearUndoItem.setEnabled(false); editMenu.add(_clearUndoItem); editMenu.addSeparator(); _deletePointItem = new JMenuItem(I18nManager.getText("menu.edit.deletepoint")); _deletePointItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.deleteCurrentPoint(); } }); _deletePointItem.setEnabled(false); editMenu.add(_deletePointItem); _deleteRangeItem = new JMenuItem(I18nManager.getText("menu.edit.deleterange")); _deleteRangeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.deleteSelectedRange(); } }); _deleteRangeItem.setEnabled(false); editMenu.add(_deleteRangeItem); _deleteDuplicatesItem = new JMenuItem(I18nManager.getText("menu.edit.deleteduplicates")); _deleteDuplicatesItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.deleteDuplicates(); } }); _deleteDuplicatesItem.setEnabled(false); editMenu.add(_deleteDuplicatesItem); _compressItem = new JMenuItem(I18nManager.getText("menu.edit.compress")); _compressItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.compressTrack(); } }); _compressItem.setEnabled(false); editMenu.add(_compressItem); editMenu.addSeparator(); _interpolateItem = new JMenuItem(I18nManager.getText("menu.edit.interpolate")); _interpolateItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.interpolateSelection(); } }); _interpolateItem.setEnabled(false); editMenu.add(_interpolateItem); _reverseItem = new JMenuItem(I18nManager.getText("menu.edit.reverse")); _reverseItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.reverseRange(); } }); _reverseItem.setEnabled(false); editMenu.add(_reverseItem); // Rearrange waypoints _rearrangeMenu = new JMenu(I18nManager.getText("menu.edit.rearrange")); _rearrangeMenu.setEnabled(false); _rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.start")); _rearrangeStartItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.rearrangeWaypoints(App.REARRANGE_TO_START); } }); _rearrangeStartItem.setEnabled(true); _rearrangeMenu.add(_rearrangeStartItem); _rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.end")); _rearrangeEndItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.rearrangeWaypoints(App.REARRANGE_TO_END); } }); _rearrangeEndItem.setEnabled(true); _rearrangeMenu.add(_rearrangeEndItem); _rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.nearest")); _rearrangeNearestItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.rearrangeWaypoints(App.REARRANGE_TO_NEAREST); } }); _rearrangeNearestItem.setEnabled(true); _rearrangeMenu.add(_rearrangeNearestItem); editMenu.add(_rearrangeMenu); menubar.add(editMenu); // Select menu JMenu selectMenu = new JMenu(I18nManager.getText("menu.select")); _selectAllItem = new JMenuItem(I18nManager.getText("menu.select.all")); _selectAllItem.setEnabled(false); _selectAllItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.selectAll(); } }); selectMenu.add(_selectAllItem); _selectNoneItem = new JMenuItem(I18nManager.getText("menu.select.none")); _selectNoneItem.setEnabled(false); _selectNoneItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.selectNone(); } }); selectMenu.add(_selectNoneItem); menubar.add(selectMenu); // Add 3d menu if available if (isJava3dEnabled()) { JMenu threeDMenu = new JMenu(I18nManager.getText("menu.3d")); _show3dItem = new JMenuItem(I18nManager.getText("menu.3d.show3d")); _show3dItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _app.show3dWindow(); } }); _show3dItem.setEnabled(false); threeDMenu.add(_show3dItem); menubar.add(threeDMenu); } // Help menu for About JMenu helpMenu = new JMenu(I18nManager.getText("menu.help")); JMenuItem aboutItem = new JMenuItem(I18nManager.getText("menu.help.about")); aboutItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new AboutScreen(_parent).show(); } }); helpMenu.add(aboutItem); menubar.add(helpMenu); return menubar; } /** * Method to update menu when file loaded */ public void informFileLoaded() { // save, undo, delete enabled _saveItem.setEnabled(true); _undoItem.setEnabled(true); _deleteDuplicatesItem.setEnabled(true); _compressItem.setEnabled(true); } /** * @return true if 3d capability is installed */ private static boolean isJava3dEnabled() { boolean has3d = false; try { Class universeClass = Class.forName("com.sun.j3d.utils.universe.SimpleUniverse"); has3d = true; } catch (ClassNotFoundException e) { // no java3d classes available } return has3d; } /** * @see tim.prune.DataSubscriber#dataUpdated(tim.prune.data.Track) */ public void dataUpdated() { boolean hasData = (_track != null && _track.getNumPoints() > 0); // set functions which require data _saveItem.setEnabled(hasData); _exportItem.setEnabled(hasData); _deleteDuplicatesItem.setEnabled(hasData); _compressItem.setEnabled(hasData); _rearrangeMenu.setEnabled(hasData && _track.hasMixedData()); _selectAllItem.setEnabled(hasData); _selectNoneItem.setEnabled(hasData); if (_show3dItem != null) _show3dItem.setEnabled(hasData); // is undo available? boolean hasUndo = !_app.getUndoStack().isEmpty(); _undoItem.setEnabled(hasUndo); _clearUndoItem.setEnabled(hasUndo); // is there a current point? boolean hasPoint = (hasData && _selection.getCurrentPointIndex() >= 0); _deletePointItem.setEnabled(hasPoint); // is there a current range? boolean hasRange = (hasData && _selection.hasRangeSelected()); _deleteRangeItem.setEnabled(hasRange); _interpolateItem.setEnabled(hasRange && (_selection.getEnd() - _selection.getStart()) == 1); _reverseItem.setEnabled(hasRange); } }