Generated on Thu Mar 6 14:51:43 2008 for Gecode/J by doxygen 1.5.4

MenuBar.java

Go to the documentation of this file.
00001 /* -*- indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Mikael Lagerkvist <lagerkvist@gecode.org>
00005  *     Guido Tack <tack@gecode.org>
00006  *
00007  *  Copyright:
00008  *     Mikael Lagerkvist, 2006
00009  *     Guido Tack, 2006
00010  *
00011  *  Last modified:
00012  *     $Date: 2007-08-09 16:00:10 +0200 (Thu, 09 Aug 2007) $ by $Author: tack $
00013  *     $Revision: 4792 $
00014  *
00015  *  This file is part of Gecode, the generic constraint
00016  *  development environment:
00017  *     http://www.gecode.org
00018  *
00019  *  Permission is hereby granted, free of charge, to any person obtaining
00020  *  a copy of this software and associated documentation files (the
00021  *  "Software"), to deal in the Software without restriction, including
00022  *  without limitation the rights to use, copy, modify, merge, publish,
00023  *  distribute, sublicense, and/or sell copies of the Software, and to
00024  *  permit persons to whom the Software is furnished to do so, subject to
00025  *  the following conditions:
00026  *
00027  *  The above copyright notice and this permission notice shall be
00028  *  included in all copies or substantial portions of the Software.
00029  *
00030  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00031  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00032  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00033  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00034  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00035  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00036  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00037  *
00038  */
00039 
00040 package org.gecode.gist.swing;
00041 
00042 import org.gecode.gist.*;
00043 import java.awt.event.ActionEvent;
00044 import javax.swing.*;
00045 import java.util.Enumeration;
00046 
00047 class MenuBar extends JMenuBar {
00048 
00049     protected Action resetAction;
00050     protected Action saveAsAction;
00051     protected Action inspectAction;
00052     protected Action inspectBranchesAction;
00053     protected Action inspectBPAction;
00054     protected Action searchAllAction;
00055     protected Action searchOneAction;
00056     protected Action searchNAction;
00057     protected Action hideNodeAction;
00058     protected Action hideFailedAction;
00059     protected Action unhideAllAction;
00060     protected Action scaleToFitAction;
00061     
00062     protected Action navUpAction;
00063     protected Action navDownAction;
00064     protected Action navLeftAction;
00065     protected Action navRightAction;
00066 
00067     protected Action jumpNextSolAction;
00068     protected Action jumpPrevSolAction;
00069     protected Action jumpRootAction;
00070     protected Action jumpLeftmostAction;
00071     protected Action jumpRightmostAction;
00072     protected Action centerCursorAction;
00073 
00074     protected Action configAction;
00075     protected Action quitAction;
00076 
00077     private JPopupMenu pop;
00078 
00079     private GistController _ctrl;
00080 
00081     protected ButtonGroup inspectionActionsGroup;
00082     protected JMenu actionsMenu;
00083 
00084     public class ResetAction extends AbstractAction {
00085         public ResetAction() {
00086             super("Reset");
00087             putValue(SHORT_DESCRIPTION, "Reset the tree");
00088         }
00089         public void actionPerformed(ActionEvent e) {
00090             _ctrl.reset();
00091         }
00092     }
00093     public class SaveAsAction extends AbstractAction {
00094       public SaveAsAction() {
00095             super("Save as");
00096             putValue(SHORT_DESCRIPTION, "Save the tree as postscript");
00097       }
00098       public void actionPerformed(ActionEvent e) {
00099         _ctrl.saveAs();
00100       }
00101     }
00102 
00103     public class SelectInspectionAction extends AbstractAction {
00104         private String action;
00105         public SelectInspectionAction(String s) {
00106             super(s);
00107             action = s;
00108         }
00109         public void actionPerformed(ActionEvent e) {
00110             _ctrl.selectInspectionAction(action);
00111         }
00112     }
00113     public class InspectAction extends AbstractAction {
00114         public InspectAction() {
00115             super("Inspect");
00116             putValue(SHORT_DESCRIPTION, "Inspect the current node");
00117         }
00118         public void actionPerformed(ActionEvent e) {
00119             _ctrl.inspect();
00120         }
00121     }
00122     public class InspectBranchesAction extends AbstractAction {
00123         public InspectBranchesAction() {
00124             super("Inspect Branches");
00125             putValue(SHORT_DESCRIPTION, "Inspect branches of the current node");
00126         }
00127         public void actionPerformed(ActionEvent e) {
00128             _ctrl.inspectBranches();
00129         }
00130     }
00131     public class InspectBPAction extends AbstractAction {
00132         public InspectBPAction() {
00133             super("Inspect before propagation");
00134             putValue(SHORT_DESCRIPTION, "Inspect the current node before propagation");
00135         }
00136         public void actionPerformed(ActionEvent e) {
00137             _ctrl.inspectBeforePropagation();
00138         }
00139     }
00140     public class SearchAllAction extends AbstractAction {
00141         public SearchAllAction() {
00142             super("Search all");
00143             putValue(SHORT_DESCRIPTION, "Search all solutions");
00144         }
00145         public void actionPerformed(ActionEvent e) {
00146             _ctrl.exploreAll();
00147         }
00148     }
00149     public class SearchOneAction extends AbstractAction {
00150         public SearchOneAction() {
00151             super("Search one");
00152             putValue(SHORT_DESCRIPTION, "Search one solution");
00153         }
00154         public void actionPerformed(ActionEvent e) {
00155             _ctrl.exploreOne();
00156         }
00157     }
00158     public class SearchNAction extends AbstractAction {
00159         public SearchNAction() {
00160             super("Search n");
00161             putValue(SHORT_DESCRIPTION, "Search n solutions");
00162         }
00163         public void actionPerformed(ActionEvent e) {
00164             _ctrl.exploreN();
00165         }
00166     }
00167     public class HideNodeAction extends AbstractAction {
00168         public HideNodeAction() {
00169             super("(Un)hide node");
00170             putValue(SHORT_DESCRIPTION, "(Un)hide node");
00171         }
00172         public void actionPerformed(ActionEvent e) {
00173             _ctrl.toggleHidden();
00174         }
00175     }
00176     public class HideFailedAction extends AbstractAction {
00177         public HideFailedAction() {
00178             super("Hide failed");
00179             putValue(SHORT_DESCRIPTION, "Hide failed");
00180         }
00181         public void actionPerformed(ActionEvent e) {
00182             _ctrl.hideFailed();
00183         }
00184     }
00185     public class UnhideAllAction extends AbstractAction {
00186         public UnhideAllAction() {
00187             super("Unhide all");
00188             putValue(SHORT_DESCRIPTION, "Unhide all");
00189         }
00190         public void actionPerformed(ActionEvent e) {
00191             _ctrl.unhideAll();
00192         }
00193     }
00194     public class ScaleToFitAction extends AbstractAction {
00195         public ScaleToFitAction() {
00196             super("Scale to fit");
00197             putValue(SHORT_DESCRIPTION, "Scale to fit");
00198         }
00199         public void actionPerformed(ActionEvent e) {
00200             _ctrl.scaleToFit();
00201         }
00202     }
00203 
00204     // Navigation actions
00205     public class NavUpAction extends AbstractAction {
00206         public NavUpAction() {
00207             super("Up");
00208             putValue(SHORT_DESCRIPTION, "Navigate upwards");
00209         }
00210         public void actionPerformed(ActionEvent e) {
00211             _ctrl.navUp();
00212         }
00213     }
00214     public class NavDownAction extends AbstractAction {
00215         public NavDownAction() {
00216             super("Down");
00217             putValue(SHORT_DESCRIPTION, "Navigate downwards");
00218         }
00219         public void actionPerformed(ActionEvent e) {
00220             _ctrl.navDown();
00221         }
00222     }
00223     public class NavLeftAction extends AbstractAction {
00224         public NavLeftAction() {
00225             super("Left");
00226             putValue(SHORT_DESCRIPTION, "Navigate left");
00227         }
00228         public void actionPerformed(ActionEvent e) {
00229             _ctrl.navLeft();
00230         }
00231     }
00232     public class NavRightAction extends AbstractAction {
00233         public NavRightAction() {
00234             super("Right");
00235             putValue(SHORT_DESCRIPTION, "Navigate right");
00236         }
00237         public void actionPerformed(ActionEvent e) {
00238             _ctrl.navRight();
00239         }
00240     }
00241 
00242     public class JumpNextSolAction extends AbstractAction {
00243         public JumpNextSolAction() {
00244             super("Jump to next solution");
00245             putValue(SHORT_DESCRIPTION, "Jump to next solution");
00246         }
00247         public void actionPerformed(ActionEvent e) {
00248             _ctrl.jumpNextSol();
00249         }
00250     }
00251     public class JumpPrevSolAction extends AbstractAction {
00252         public JumpPrevSolAction() {
00253             super("Jump to previous solution");
00254             putValue(SHORT_DESCRIPTION, "Jump to previous solution");
00255         }
00256         public void actionPerformed(ActionEvent e) {
00257             _ctrl.jumpPrevSol();
00258         }
00259     }
00260 
00261     public class JumpRootAction extends AbstractAction {
00262         public JumpRootAction() {
00263             super("Jump to root node");
00264             putValue(SHORT_DESCRIPTION, "Jump to root node");
00265         }
00266         public void actionPerformed(ActionEvent e) {
00267             _ctrl.jumpRoot();
00268         }
00269     }
00270     public class JumpLeftmostAction extends AbstractAction {
00271         public JumpLeftmostAction() {
00272             super("Leftmost");
00273             putValue(SHORT_DESCRIPTION, "Jump to leftmost node");
00274         }
00275         public void actionPerformed(ActionEvent e) {
00276             _ctrl.jumpLeftmost();
00277         }
00278     }
00279     public class JumpRightmostAction extends AbstractAction {
00280         public JumpRightmostAction() {
00281             super("Rightmost");
00282             putValue(SHORT_DESCRIPTION, "Jump to rightmost node");
00283         }
00284         public void actionPerformed(ActionEvent e) {
00285             _ctrl.jumpRightmost();
00286         }
00287     }
00288     public class CenterCursorAction extends AbstractAction {
00289         public CenterCursorAction() {
00290             super("Center current node");
00291             putValue(SHORT_DESCRIPTION,
00292                      "Center view on current node (if possible)");
00293         }
00294         public void actionPerformed(ActionEvent e) {
00295             _ctrl.centerCursor();
00296         }
00297     }
00298 
00299 
00300     public class AboutAction extends AbstractAction {
00301         private AboutWindow aw;
00302         public AboutAction(JFrame f) {
00303             super("About");
00304             aw = new AboutWindow(f);
00305             putValue(SHORT_DESCRIPTION, "About Gecode/J Gist");
00306         }
00307         public void actionPerformed(ActionEvent e) {
00308             aw.open();
00309         }
00310     }
00311 
00312     public class HelpAction extends AbstractAction {
00313         private HelpWindow hw;
00314         public HelpAction(JFrame f) {
00315             super("Help");
00316             hw = new HelpWindow(f);
00317             putValue(SHORT_DESCRIPTION, "Help on the Gecode/J Gist");
00318         }
00319         public void actionPerformed(ActionEvent e) {
00320             hw.open();
00321         }
00322     }
00323 
00324     public class ConfigAction extends AbstractAction {
00325         private ConfigDialog cd;
00326         public ConfigAction(JFrame f) {
00327             super("Preferences");
00328             cd = new ConfigDialog(f);
00329             putValue(SHORT_DESCRIPTION, "Preferences for the Gecode/J Gist");
00330         }
00331         public void actionPerformed(ActionEvent e) {
00332             cd.open();
00333         }
00334     }
00335 
00336     // System actions
00337     public class QuitAction extends AbstractAction {
00338         public QuitAction() {
00339             super("Quit");
00340             putValue(SHORT_DESCRIPTION, "Quit Gecode Gist");
00341         }
00342         public void actionPerformed(ActionEvent e) {
00343             System.exit(0);
00344         }
00345     }
00346 
00347 
00348 
00349     public MenuBar(JFrame frame, GistController ctrl) {
00350         _ctrl = ctrl;
00351 
00352         JMenuItem menuItem = null;
00353 
00354         resetAction = new ResetAction();
00355         saveAsAction = new SaveAsAction();
00356         inspectAction = new InspectAction();
00357         inspectBranchesAction = new InspectBranchesAction();
00358         inspectBPAction = new InspectBPAction();
00359         searchAllAction = new SearchAllAction();
00360         searchOneAction = new SearchOneAction();
00361         searchNAction = new SearchNAction();
00362         hideNodeAction = new HideNodeAction();
00363         hideFailedAction = new HideFailedAction();
00364         unhideAllAction = new UnhideAllAction();
00365         scaleToFitAction = new ScaleToFitAction();
00366 
00367         navUpAction = new NavUpAction();
00368         navDownAction = new NavDownAction();
00369         navLeftAction = new NavLeftAction();
00370         navRightAction = new NavRightAction();
00371 
00372         jumpNextSolAction = new JumpNextSolAction();
00373         jumpPrevSolAction = new JumpPrevSolAction();
00374         jumpRootAction = new JumpRootAction();
00375         jumpLeftmostAction = new JumpLeftmostAction();
00376         jumpRightmostAction = new JumpRightmostAction();
00377         centerCursorAction = new CenterCursorAction();
00378 
00379         configAction = new ConfigAction(frame);
00380         quitAction = new QuitAction();
00381 
00382         JMenu fileMenu = new JMenu("File");
00383         JMenu nodeMenu = new JMenu("Node");
00384         JMenu searchMenu = new JMenu("Search");
00385         JMenu helpMenu = new JMenu("Help");
00386 
00387         actionsMenu = new JMenu("Inspection actions");
00388 
00389         menuItem = new JMenuItem(new HelpAction(frame));
00390         helpMenu.add(menuItem);
00391         menuItem = new JMenuItem(new AboutAction(frame));
00392         helpMenu.add(menuItem);
00393 
00394         pop = new JPopupMenu();
00395 
00396         menuItem = new JMenuItem(resetAction);
00397         menuItem.setIcon(null); //arbitrarily chose not to use icon
00398         menuItem.setAccelerator(KeyStroke.getKeyStroke("control R"));
00399         fileMenu.add(menuItem);
00400 
00401 
00402         menuItem = new JMenuItem(saveAsAction);
00403         menuItem.setIcon(null); //arbitrarily chose not to use icon
00404         menuItem.setAccelerator(KeyStroke.getKeyStroke("control S"));
00405         fileMenu.add(menuItem);
00406 
00407         updateEventListeners();
00408         nodeMenu.add(actionsMenu);
00409 
00410         menuItem = new JMenuItem(inspectAction);
00411         menuItem.setIcon(null); //arbitrarily chose not to use icon
00412         menuItem.setAccelerator(KeyStroke.getKeyStroke("ENTER"));
00413         nodeMenu.add(menuItem);
00414 
00415         menuItem = new JMenuItem(inspectBranchesAction);
00416         menuItem.setIcon(null); //arbitrarily chose not to use icon
00417         menuItem.setAccelerator(KeyStroke.getKeyStroke("control ENTER"));
00418         nodeMenu.add(menuItem);
00419 
00420         menuItem = new JMenuItem(inspectBPAction);
00421         menuItem.setIcon(null); //arbitrarily chose not to use icon
00422         menuItem.setAccelerator(KeyStroke.getKeyStroke("control shift ENTER"));
00423         nodeMenu.add(menuItem);
00424 
00425         menuItem = new JMenuItem(searchAllAction);
00426         menuItem.setIcon(null); //arbitrarily chose not to use icon
00427         menuItem.setAccelerator(KeyStroke.getKeyStroke("A"));
00428         searchMenu.add(menuItem);
00429 
00430         menuItem = new JMenuItem(searchOneAction);
00431         menuItem.setIcon(null); //arbitrarily chose not to use icon
00432         menuItem.setAccelerator(KeyStroke.getKeyStroke("1"));
00433         searchMenu.add(menuItem);
00434 
00435         menuItem = new JMenuItem(searchNAction);
00436         menuItem.setIcon(null); //arbitrarily chose not to use icon
00437         menuItem.setAccelerator(KeyStroke.getKeyStroke("N"));
00438         searchMenu.add(menuItem);
00439 
00440         menuItem = new JMenuItem(hideNodeAction);
00441         menuItem.setIcon(null); //arbitrarily chose not to use icon
00442         menuItem.setAccelerator(KeyStroke.getKeyStroke("H"));
00443         nodeMenu.add(menuItem);
00444 
00445         menuItem = new JMenuItem(hideFailedAction);
00446         menuItem.setIcon(null); //arbitrarily chose not to use icon
00447         menuItem.setAccelerator(KeyStroke.getKeyStroke("F"));
00448         nodeMenu.add(menuItem);
00449 
00450         menuItem = new JMenuItem(unhideAllAction);
00451         menuItem.setIcon(null); //arbitrarily chose not to use icon
00452         menuItem.setAccelerator(KeyStroke.getKeyStroke("U"));
00453         nodeMenu.add(menuItem);
00454 
00455         nodeMenu.addSeparator();
00456         menuItem = new JMenuItem(navUpAction);
00457         menuItem.setIcon(null); //arbitrarily chose not to use icon
00458         menuItem.setAccelerator(KeyStroke.getKeyStroke("control UP"));
00459         nodeMenu.add(menuItem);
00460         menuItem = new JMenuItem(navDownAction);
00461         menuItem.setIcon(null); //arbitrarily chose not to use icon
00462         menuItem.setAccelerator(KeyStroke.getKeyStroke("control DOWN"));
00463         nodeMenu.add(menuItem);
00464         menuItem = new JMenuItem(navLeftAction);
00465         menuItem.setIcon(null); //arbitrarily chose not to use icon
00466         menuItem.setAccelerator(KeyStroke.getKeyStroke("control LEFT"));
00467         nodeMenu.add(menuItem);
00468         menuItem = new JMenuItem(navRightAction);
00469         menuItem.setIcon(null); //arbitrarily chose not to use icon
00470         menuItem.setAccelerator(KeyStroke.getKeyStroke("control RIGHT"));
00471         nodeMenu.add(menuItem);
00472 
00473         nodeMenu.addSeparator();
00474         menuItem = new JMenuItem(jumpNextSolAction);
00475         menuItem.setIcon(null); //arbitrarily chose not to use icon
00476         menuItem.setAccelerator(KeyStroke.getKeyStroke("J"));
00477         nodeMenu.add(menuItem);
00478         menuItem = new JMenuItem(jumpPrevSolAction);
00479         menuItem.setIcon(null); //arbitrarily chose not to use icon
00480         menuItem.setAccelerator(KeyStroke.getKeyStroke("shift J"));
00481         nodeMenu.add(menuItem);
00482         menuItem = new JMenuItem(jumpRootAction);
00483         menuItem.setIcon(null); //arbitrarily chose not to use icon
00484         menuItem.setAccelerator(KeyStroke.getKeyStroke("R"));
00485         nodeMenu.add(menuItem);
00486         menuItem = new JMenuItem(jumpLeftmostAction);
00487         menuItem.setIcon(null); //arbitrarily chose not to use icon
00488         menuItem.setAccelerator(KeyStroke.getKeyStroke('-'));
00489         nodeMenu.add(menuItem);
00490         menuItem = new JMenuItem(jumpRightmostAction);
00491         menuItem.setIcon(null); //arbitrarily chose not to use icon
00492         menuItem.setAccelerator(KeyStroke.getKeyStroke('+'));
00493         nodeMenu.add(menuItem);
00494         menuItem = new JMenuItem(centerCursorAction);
00495         menuItem.setIcon(null); //arbitrarily chose not to use icon
00496         menuItem.setAccelerator(KeyStroke.getKeyStroke("C"));
00497         nodeMenu.add(menuItem);
00498 
00499         menuItem = new JMenuItem(scaleToFitAction);
00500         menuItem.setIcon(null); //arbitrarily chose not to use icon
00501         menuItem.setAccelerator(KeyStroke.getKeyStroke("Z"));
00502         fileMenu.add(menuItem);
00503 
00504         //menuItem = new JMenuItem("Preferences");
00505         //menuItem.setEnabled(false);
00506         menuItem = new JMenuItem(configAction);
00507         menuItem.setIcon(null); //arbitrarily chose not to use icon
00508         menuItem.setAccelerator(KeyStroke.getKeyStroke("control P"));
00509         fileMenu.add(menuItem);
00510 
00511         menuItem = new JMenuItem(quitAction);
00512         menuItem.setIcon(null); //arbitrarily chose not to use icon
00513         menuItem.setAccelerator(KeyStroke.getKeyStroke("control Q"));
00514         fileMenu.add(menuItem);
00515 
00516         //Set up the menu bar.
00517         add(fileMenu);
00518         add(nodeMenu);
00519         add(searchMenu);
00520         add(helpMenu);
00521 
00522 
00523         //Set up the popup menu
00524         pop.add(new JMenuItem(searchAllAction));
00525         pop.add(new JMenuItem(searchOneAction));
00526         pop.add(new JMenuItem(searchNAction));
00527         pop.add(new JMenuItem(hideNodeAction));
00528         pop.add(new JMenuItem(hideFailedAction));
00529         pop.add(new JMenuItem(unhideAllAction));
00530         pop.add(new JMenuItem(inspectBranchesAction));
00531         pop.add(new JMenuItem(inspectBPAction));
00532 
00533         pop.pack();
00534     }
00535 
00536     JPopupMenu getPopupMenu() {
00537         return pop;
00538     }
00539 
00540     // Methods for controlling disabling and enabling of menu entries
00541     public void menuInspectActive(boolean active, boolean isRoot, boolean isLeaf) {
00542         inspectAction.setEnabled(active);
00543         inspectBPAction.setEnabled(!isRoot);
00544         inspectBranchesAction.setEnabled(active && !isLeaf);
00545     }
00546     public void menuSearchActive(boolean active) {
00547         searchNAction.setEnabled(active);
00548         searchOneAction.setEnabled(active);
00549         searchAllAction.setEnabled(active);
00550     }
00551     public void menuHideNodeActive(boolean active, boolean hidden) {
00552         hideNodeAction.setEnabled(active);
00553     }
00554     public void menuUnhideAllActive(boolean active) {
00555         unhideAllAction.setEnabled(active);
00556     }
00557     public void menuHideFailedActive(boolean active) {
00558         hideFailedAction.setEnabled(active);
00559     }
00560 
00561     // Handling event listeners
00562     public void updateEventListeners() {
00563         updateEventListeners(_ctrl.getListeners(), _ctrl.getSelectedAction());
00564     }
00565     private void updateEventListeners(Enumeration<String> es,
00566                                       String selectedAction) {
00567         actionsMenu.removeAll();
00568         JRadioButtonMenuItem menuItem;
00569         menuItem =
00570             new JRadioButtonMenuItem(new SelectInspectionAction("default"));
00571         menuItem.setIcon(null); //arbitrarily chose not to use icon
00572         actionsMenu.add(menuItem);
00573         inspectionActionsGroup = new ButtonGroup();
00574         inspectionActionsGroup.add(menuItem);
00575         if (selectedAction.equals("default")) {
00576             menuItem.setSelected(true);
00577         }
00578         while (es.hasMoreElements()) {
00579             String name = es.nextElement();
00580             SelectInspectionAction sia =
00581                 new SelectInspectionAction(name);
00582             menuItem =
00583                 new JRadioButtonMenuItem(sia);
00584             menuItem.setIcon(null); //arbitrarily chose not to use icon
00585             actionsMenu.add(menuItem);
00586             inspectionActionsGroup.add(menuItem);
00587             if (selectedAction.equals(name)) {
00588                 menuItem.setSelected(true);
00589             }
00590         }
00591     }
00592     
00593 }