/* * @(#)DrawApplication.java * * Project: JHotdraw - a GUI framework for technical drawings * http://www.jhotdraw.org * http://jhotdraw.sourceforge.net * Copyright: © by the original author(s) and all contributors * License: Lesser GNU Public License (LGPL) * http://www.opensource.org/licenses/lgpl-license.html */ package CH.ifa.draw.application; import CH.ifa.draw.framework.*; import CH.ifa.draw.standard.*; import CH.ifa.draw.figures.*; import CH.ifa.draw.util.*; import CH.ifa.draw.contrib.*; import javax.swing.*; import javax.swing.event.EventListenerList; import java.awt.*; import java.awt.event.*; import java.io.*; /** * DrawApplication defines a standard presentation for * standalone drawing editors. The presentation is * customized in subclasses. * The application is started as follows: *
* public static void main(String[] args) { * MayDrawApp window = new MyDrawApp(); * window.open(); * } ** * @version <$CURRENT_VERSION$> */ public class DrawApplication extends JFrame implements DrawingEditor, PaletteListener, VersionRequester { private Tool fTool; private Iconkit fIconkit; private JTextField fStatusLine; private ToolButton fDefaultToolButton; private ToolButton fSelectedToolButton; private static String fApplicationName; private StorageFormatManager fStorageFormatManager; private UndoManager myUndoManager; private String fgUntitled = "untitled"; private final EventListenerList listenerList = new EventListenerList(); private DesktopListener fDesktopListener; /** * This component acts as a desktop for the content. */ private Desktop fDesktop; // the image resource path private static final String fgDrawPath = "/CH/ifa/draw/"; public static final String IMAGES = fgDrawPath + "images/"; protected static int winCount = 0; /** * The index of the file menu in the menu bar. */ public static final int FILE_MENU = 0; /** * The index of the edit menu in the menu bar. */ public static final int EDIT_MENU = 1; /** * The index of the alignment menu in the menu bar. */ public static final int ALIGNMENT_MENU = 2; /** * The index of the attributes menu in the menu bar. */ public static final int ATTRIBUTES_MENU = 3; /** * Constructs a drawing window with a default title. */ public DrawApplication() { this("JHotDraw"); } /** * Constructs a drawing window with the given title. */ public DrawApplication(String title) { super(title); setApplicationName(title); winCount++; } /** * Factory method which can be overriden by subclasses to * create an instance of their type. * * @return newly created application */ protected DrawApplication createApplication() { return new DrawApplication(); } /** * Open a new view for this application containing a * view of the drawing of the currently activated window. */ public void newView() { DrawingView dv = getDesktop().getActiveDrawingView(); if (dv == null || !dv.isInteractive()) {//this should be ASSERT and otherwise handled by context sensitive menus. return; } DrawApplication window = createApplication(); window.open(); window.newWindow( dv.drawing() ); /* if (dv.drawing().getTitle() != null ) { window.setDrawingTitle(dv.drawing().getTitle() + " (View)"); } else { window.setDrawingTitle(getDefaultDrawingTitle() + " (View)"); }*/ } /** * Open a new window for this application containing the passed in drawing, * or a new drawing if the passed in drawing is null. */ public void newWindow(Drawing newDrawing) { getDesktop().removeAllFromDesktop(Desktop.PRIMARY); getDesktop().addToDesktop( createDrawingView( newDrawing ), Desktop.PRIMARY); toolDone(); } public final void newWindow() { newWindow( createDrawing() ); } /** * Opens a new window with a drawing view. */ public synchronized void open() { getVersionControlStrategy().assertCompatibleVersion(); setUndoManager(new UndoManager()); setIconkit(createIconkit()); getContentPane().setLayout(new BorderLayout()); // status line must be created before a tool is set setStatusLine(createStatusLine()); getContentPane().add(getStatusLine(), BorderLayout.SOUTH); //Initialize Desktop, must be done before tools setDesktopListener(createDesktopListener()); setDesktop(createDesktop()); //Initialize Tools // create dummy tool until the default tool is activated during toolDone() //why do we need a dummy tool? setTool(new NullTool(this), ""); JToolBar tools = createToolPalette(); createTools(tools); JPanel activePanel = new JPanel(); activePanel.setAlignmentX(LEFT_ALIGNMENT); activePanel.setAlignmentY(TOP_ALIGNMENT); activePanel.setLayout(new BorderLayout()); activePanel.add(tools, BorderLayout.NORTH); activePanel.add((Component)getDesktop(), BorderLayout.CENTER); getContentPane().add(activePanel, BorderLayout.CENTER); //Initialize Menus JMenuBar mb = new JMenuBar(); createMenus(mb); setJMenuBar(mb); Dimension d = defaultSize(); if (d.width > mb.getPreferredSize().width) { setSize(d.width, d.height); } else { setSize(mb.getPreferredSize().width, d.height); } addListeners(); setVisible(true); setStorageFormatManager(createStorageFormatManager()); } /** * Registers the listeners for this window */ protected void addListeners() { addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent event) { exit(); } } ); } /** * Creates the standard menus. Clients override this * method to add additional menus. */ protected void createMenus(JMenuBar mb) { addMenuIfPossible(mb, createFileMenu()); addMenuIfPossible(mb, createEditMenu()); addMenuIfPossible(mb, createAlignmentMenu()); addMenuIfPossible(mb, createAttributesMenu()); addMenuIfPossible(mb, createDebugMenu()); } protected void addMenuIfPossible(JMenuBar mb, JMenu newMenu) { if (newMenu != null) { mb.add(newMenu); } } /** * 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; } /** * 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; } /** * 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 execute() { getDesktop().getActiveDrawingView().setDisplayUpdate(new SimpleUpdateStrategy()); } }; menu.add(cmd); cmd = new AbstractCommand("Buffered Update", this) { public void execute() { getDesktop().getActiveDrawingView().setDisplayUpdate(new BufferedUpdateStrategy()); } }; menu.add(cmd); return menu; } /** * Creates the attributes menu and its submenus. Clients override this * method to add additional menu items. */ protected JMenu createAttributesMenu() { JMenu menu = new JMenu("Attributes"); menu.add(createColorMenu("Fill Color", FigureAttributeConstant.FILL_COLOR)); menu.add(createColorMenu("Pen Color", FigureAttributeConstant.FRAME_COLOR)); menu.add(createArrowMenu()); menu.addSeparator(); menu.add(createFontMenu()); menu.add(createFontSizeMenu()); menu.add(createFontStyleMenu()); menu.add(createColorMenu("Text Color", FigureAttributeConstant.TEXT_COLOR)); return menu; } /** * Creates the color menu. */ protected JMenu createColorMenu(String title, FigureAttributeConstant attribute) { CommandMenu menu = new CommandMenu(title); for (int i=0; i