/** Creates the color menu. */
 protected JMenu createColorMenu(String title, String attribute) {
   CommandMenu menu = new CommandMenu(title);
   for (int i = 0; i < ColorMap.size(); i++)
     menu.add(
         new UndoableCommand(
             new ChangeAttributeCommand(ColorMap.name(i), attribute, ColorMap.color(i), this)));
   return menu;
 }
 /**
  * Creates the fonts menus. It installs all available fonts supported by the toolkit
  * implementation.
  */
 protected JMenu createFontMenu() {
   CommandMenu menu = new CommandMenu("Font");
   String fonts[] = Toolkit.getDefaultToolkit().getFontList();
   for (int i = 0; i < fonts.length; i++) {
     menu.add(
         new UndoableCommand(new ChangeAttributeCommand(fonts[i], "FontName", fonts[i], this)));
   }
   return menu;
 }
 /** Creates the font size menu. */
 protected JMenu createFontSizeMenu() {
   CommandMenu menu = new CommandMenu("Font Size");
   int sizes[] = {9, 10, 12, 14, 18, 24, 36, 48, 72};
   for (int i = 0; i < sizes.length; i++) {
     menu.add(
         new UndoableCommand(
             new ChangeAttributeCommand(
                 Integer.toString(sizes[i]), "FontSize", new Integer(sizes[i]), this)));
   }
   return menu;
 }
 /** Creates the font style menu with entries (Plain, Italic, Bold). */
 protected JMenu createFontStyleMenu() {
   CommandMenu menu = new CommandMenu("Font Style");
   menu.add(
       new UndoableCommand(
           new ChangeAttributeCommand("Plain", "FontStyle", new Integer(Font.PLAIN), this)));
   menu.add(
       new UndoableCommand(
           new ChangeAttributeCommand("Italic", "FontStyle", new Integer(Font.ITALIC), this)));
   menu.add(
       new UndoableCommand(
           new ChangeAttributeCommand("Bold", "FontStyle", new Integer(Font.BOLD), this)));
   return menu;
 }
 protected JMenu createImagesMenu() {
   CommandMenu menu = new CommandMenu("Images");
   File imagesDirectory = new File(fgSampleImagesPath);
   try {
     String[] list = imagesDirectory.list();
     for (int i = 0; i < list.length; i++) {
       String name = list[i];
       String path = fgSampleImagesResourcePath + name;
       menu.add(new UndoableCommand(new InsertImageCommand(name, path, this)));
     }
   } catch (Exception e) {
   }
   return menu;
 }
 /** Creates the alignment menu. Clients override this method to add additional menu items. */
 protected JMenu createAlignmentMenu() {
   CommandMenu menu = new CommandMenu("Align");
   menu.addCheckItem(new ToggleGridCommand("Toggle Snap to Grid", this, new Point(4, 4)));
   menu.addSeparator();
   menu.add(new UndoableCommand(new AlignCommand(AlignCommand.Alignment.LEFTS, this)));
   menu.add(new UndoableCommand(new AlignCommand(AlignCommand.Alignment.CENTERS, this)));
   menu.add(new UndoableCommand(new AlignCommand(AlignCommand.Alignment.RIGHTS, this)));
   menu.addSeparator();
   menu.add(new UndoableCommand(new AlignCommand(AlignCommand.Alignment.TOPS, this)));
   menu.add(new UndoableCommand(new AlignCommand(AlignCommand.Alignment.MIDDLES, this)));
   menu.add(new UndoableCommand(new AlignCommand(AlignCommand.Alignment.BOTTOMS, this)));
   return menu;
 }
  /** Create a menu which allows the user to select a different look and feel at runtime. */
  public JMenu createLookAndFeelMenu() {
    CommandMenu menu = new CommandMenu("Look'n'Feel");

    UIManager.LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels();

    for (int i = 0; i < lafs.length; i++) {
      final String lnfClassName = lafs[i].getClassName();
      Command cmd =
          new AbstractCommand(lafs[i].getName(), this) {
            public void execute() {
              newLookAndFeel(lnfClassName);
            }
          };
      menu.add(cmd);
    }
    return menu;
  }
  protected JMenu createAnimationMenu() {
    CommandMenu menu = new CommandMenu("Animation");
    Command cmd =
        new AbstractCommand("Start Animation", this) {
          public void execute() {
            startAnimation();
          }
        };
    menu.add(cmd);

    cmd =
        new AbstractCommand("Stop Animation", this) {
          public void execute() {
            endAnimation();
          }
        };
    menu.add(cmd);
    return menu;
  }
 /** Creates the arrows menu. */
 protected JMenu createArrowMenu() {
   CommandMenu menu = new CommandMenu("Arrow");
   menu.add(
       new UndoableCommand(
           new ChangeAttributeCommand(
               "none", "ArrowMode", new Integer(PolyLineFigure.ARROW_TIP_NONE), this)));
   menu.add(
       new UndoableCommand(
           new ChangeAttributeCommand(
               "at Start", "ArrowMode", new Integer(PolyLineFigure.ARROW_TIP_START), this)));
   menu.add(
       new UndoableCommand(
           new ChangeAttributeCommand(
               "at End", "ArrowMode", new Integer(PolyLineFigure.ARROW_TIP_END), this)));
   menu.add(
       new UndoableCommand(
           new ChangeAttributeCommand(
               "at Both", "ArrowMode", new Integer(PolyLineFigure.ARROW_TIP_BOTH), this)));
   return menu;
 }
  /** Creates the debug menu. Clients override this method to add additional menu items. */
  protected JMenu createDebugMenu() {
    CommandMenu menu = new CommandMenu("Debug");

    Command cmd =
        new AbstractCommand("Simple Update", this) {
          public void executable() {
            this.view().setDisplayUpdate(new SimpleUpdateStrategy());
          }
        };
    menu.add(cmd);

    cmd =
        new AbstractCommand("Buffered Update", this) {
          public void executable() {
            this.view().setDisplayUpdate(new BufferedUpdateStrategy());
          }
        };
    menu.add(cmd);
    return menu;
  }
  protected JMenu createWindowMenu() {
    CommandMenu menu = new CommandMenu("Window");
    Command cmd =
        new AbstractCommand("New View", this) {
          public void execute() {
            newView();
          }
        };
    menu.add(cmd);

    cmd =
        new AbstractCommand("New Window", this, false) {
          public void execute() {
            newWindow(createDrawing());
          }
        };
    menu.add(cmd);

    menu.addSeparator();
    menu.add(new WindowMenu("Window List", (MDIDesktopPane) getDesktop(), this));

    return menu;
  }
  /**
   * Fired by a view when the figure seleciton changes. Since Commands and Tools are Actions and
   * they are registered to hear these events, they will handle themselves. So selection sensitive
   * menuitems will update their own states.
   *
   * @see DrawingEditor
   */
  public void figureSelectionChanged(DrawingView view) {
    JMenuBar mb = getJMenuBar();
    CommandMenu editMenu = (CommandMenu) mb.getMenu(EDIT_MENU);
    // make sure it does exist
    if (editMenu != null) {
      editMenu.checkEnabled();
    }
    CommandMenu alignmentMenu = (CommandMenu) mb.getMenu(ALIGNMENT_MENU);
    // make sure it does exist
    if (alignmentMenu != null) {
      alignmentMenu.checkEnabled();
    }

    JMenu attributeMenu = mb.getMenu(ATTRIBUTES_MENU);
    // make sure it does exist
    if (attributeMenu != null) {
      for (int i = 0; i < attributeMenu.getItemCount(); i++) {
        JMenuItem currentMenu = attributeMenu.getItem(i);
        if (currentMenu instanceof CommandMenu) {
          ((CommandMenu) currentMenu).checkEnabled();
        }
      }
    }
  }
  /** Creates the file menu. Clients override this method to add additional menu items. */
  protected JMenu createFileMenu() {
    CommandMenu menu = new CommandMenu("File");
    Command cmd =
        new AbstractCommand("New", this, false) {
          public void execute() {
            promptNew();
          }
        };
    menu.add(cmd, new MenuShortcut('n'));

    cmd =
        new AbstractCommand("Open...", this, false) {
          public void execute() {
            promptOpen();
          }
        };
    menu.add(cmd, new MenuShortcut('o'));

    cmd =
        new AbstractCommand("Save As...", this, true) {
          public void execute() {
            promptSaveAs();
          }
        };
    menu.add(cmd, new MenuShortcut('s'));
    menu.addSeparator();

    cmd =
        new AbstractCommand("Print...", this, true) {
          public void execute() {
            print();
          }
        };
    menu.add(cmd, new MenuShortcut('p'));
    menu.addSeparator();

    cmd =
        new AbstractCommand("Exit", this, true) {
          public void execute() {
            exit();
          }
        };
    menu.add(cmd);
    return menu;
  }
 /** Creates the edit menu. Clients override this method to add additional menu items. */
 protected JMenu createEditMenu() {
   CommandMenu menu = new CommandMenu("Edit");
   menu.add(new UndoableCommand(new SelectAllCommand("Select All", this)), new MenuShortcut('a'));
   menu.addSeparator();
   menu.add(new UndoableCommand(new CutCommand("Cut", this)), new MenuShortcut('x'));
   menu.add(new CopyCommand("Copy", this), new MenuShortcut('c'));
   menu.add(new UndoableCommand(new PasteCommand("Paste", this)), new MenuShortcut('v'));
   menu.addSeparator();
   menu.add(new UndoableCommand(new DuplicateCommand("Duplicate", this)), new MenuShortcut('d'));
   menu.add(new UndoableCommand(new DeleteCommand("Delete", this)));
   menu.addSeparator();
   menu.add(new UndoableCommand(new GroupCommand("Group", this)));
   menu.add(new UndoableCommand(new UngroupCommand("Ungroup", this)));
   menu.addSeparator();
   menu.add(new UndoableCommand(new SendToBackCommand("Send to Back", this)));
   menu.add(new UndoableCommand(new BringToFrontCommand("Bring to Front", this)));
   menu.addSeparator();
   menu.add(new UndoCommand("Undo Command", this));
   menu.add(new RedoCommand("Redo Command", this));
   return menu;
 }