📄 mainwindow.java
字号:
/* * USE - UML based specification environment * Copyright (C) 1999-2004 Mark Richters, University of Bremen * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *//* $ProjectHeader: use 2-3-0-release.1 Mon, 12 Sep 2005 20:18:33 +0200 green $ */package org.tzi.use.gui.main;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.Event;import java.awt.event.ActionEvent;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.print.PageFormat;import java.awt.print.Paper;import java.awt.print.PrinterJob;import java.beans.PropertyVetoException;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.io.Reader;import java.io.StringReader;import java.util.Iterator;import javax.swing.AbstractAction;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JCheckBoxMenuItem;import javax.swing.JComponent;import javax.swing.JDesktopPane;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JInternalFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.JToolBar;import javax.swing.KeyStroke;import javax.swing.SwingUtilities;import javax.swing.event.ChangeEvent;import javax.swing.event.ChangeListener;import javax.swing.event.InternalFrameAdapter;import javax.swing.event.InternalFrameEvent;import org.tzi.use.config.Options;import org.tzi.use.gui.util.ExtFileFilter;import org.tzi.use.gui.util.StatusBar;import org.tzi.use.gui.util.TextComponentWriter;import org.tzi.use.gui.views.CallStackView;import org.tzi.use.gui.views.ClassExtentView;import org.tzi.use.gui.views.ClassInvariantView;import org.tzi.use.gui.views.CommandView;import org.tzi.use.gui.views.LinkCountView;import org.tzi.use.gui.views.ObjectCountView;import org.tzi.use.gui.views.ObjectPropertiesView;import org.tzi.use.gui.views.SequenceDiagramView;import org.tzi.use.gui.views.StateEvolutionView;import org.tzi.use.gui.views.View;import org.tzi.use.gui.views.diagrams.classdiagram.NewClassDiagramView;import org.tzi.use.gui.views.diagrams.objectdiagram.NewObjectDiagramView;import org.tzi.use.main.Session;import org.tzi.use.main.shell.Shell;import org.tzi.use.parser.USECompiler;import org.tzi.use.uml.mm.MClass;import org.tzi.use.uml.mm.MModel;import org.tzi.use.uml.mm.ModelFactory;import org.tzi.use.uml.ocl.type.TypeFactory;import org.tzi.use.uml.sys.MCmd;import org.tzi.use.uml.sys.MCmdCreateObjects;import org.tzi.use.uml.sys.MSystem;import org.tzi.use.uml.sys.MSystemException;import org.tzi.use.uml.sys.StateChangeEvent;import org.tzi.use.uml.sys.StateChangeListener;import org.tzi.use.util.Log;import org.tzi.use.util.USEWriter;/** * The main application window of USE. * * @version $ProjectVersion: 2-3-0-release.1 $ * @author Mark Richters */public class MainWindow extends JFrame implements StateChangeListener { private Session fSession; private StatusBar fStatusBar; private LogPanel fLogPanel; private PrintWriter fLogWriter; private JDesktopPane fDesk; private JSplitPane fTopSplitPane; private ModelBrowser fModelBrowser; private JMenuItem fMenuItemEditUndo; private JButton fBtnEditUndo; private JCheckBoxMenuItem fCbMenuItemCheckStructure; private static final String DEFAULT_UNDO_TEXT = "Undo last state command"; private static final String STATE_EVAL_OCL = "Evaluate OCL expression"; private PageFormat fPageFormat; private static MainWindow fInstance; // global instance of main window private JButton addToToolBar(JToolBar toolBar, AbstractAction action, String toolTip) { JButton tb = toolBar.add(action); tb.setToolTipText(toolTip); tb.setText(""); return tb; } MainWindow(Session session) { super("USE"); fInstance = this; fSession = session; // the session may be changed from the shell fSession.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { sessionChanged(); } }); } }); fSession.addExecutedCmdListener(new Session.ExecutedCmdListener() { public void executedCmd(Session.ExecutedCmd e) { final MCmd cmd = e.cmd(); SwingUtilities.invokeLater(new Runnable() { public void run() { if (cmd.canUndo() ) enableUndo(cmd.name()); } }); } }); // create toolbar JToolBar toolBar = new JToolBar(); addToToolBar(toolBar, fActionFileOpenSpec, "Open specification"); addToToolBar(toolBar, fActionFilePrint, "Print diagram"); toolBar.addSeparator(); fBtnEditUndo = addToToolBar(toolBar, fActionEditUndo, DEFAULT_UNDO_TEXT); addToToolBar(toolBar, fActionStateEvalOCL, STATE_EVAL_OCL); toolBar.addSeparator(); addToToolBar(toolBar, fActionViewCreateClassDiagram, "Create class diagram view"); addToToolBar(toolBar, fActionViewCreateObjectDiagram, "Create object diagram view"); addToToolBar(toolBar, fActionViewCreateClassInvariant, "Create class invariant view"); addToToolBar(toolBar, fActionViewCreateObjectCount, "Create object count view"); addToToolBar(toolBar, fActionViewCreateLinkCount, "Create link count view"); addToToolBar(toolBar, fActionViewCreateStateEvolution, "Create state evolution view"); addToToolBar(toolBar, fActionViewCreateObjectProperties, "Create object properties view"); addToToolBar(toolBar, fActionViewCreateClassExtent, "Create class extent view"); addToToolBar(toolBar, fActionViewCreateSequenceDiagram, "Create sequence diagram view"); addToToolBar(toolBar, fActionViewCreateCallStack, "Create call stack view"); addToToolBar(toolBar, fActionViewCreateCommandList, "Create command list view"); //addToToolBar(toolBar, fActionViewCreateStateTree, "Create state tree view"); // create the menubar JMenuBar menuBar = new JMenuBar(); getRootPane().setJMenuBar(menuBar); // `File' submenu JMenuItem mi; JMenu menu = new JMenu("File"); menu.setMnemonic('F'); menuBar.add(menu); mi = menu.add(fActionFileOpenSpec); mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK)); mi.setMnemonic('O'); mi = menu.add(fActionFileSaveScript); mi.setMnemonic('S'); mi = menu.add(fActionFileSaveProtocol); menu.addSeparator(); mi = menu.add(fActionFilePrinterSetup); mi = menu.add(fActionFilePrint); menu.addSeparator(); mi = menu.add(fActionFileExit); mi.setMnemonic('x'); mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK)); // `Edit' submenu menu = new JMenu("Edit"); menu.setMnemonic('E'); menuBar.add(menu); fMenuItemEditUndo = menu.add(fActionEditUndo); fMenuItemEditUndo.setMnemonic('U'); fMenuItemEditUndo.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK)); // `State' submenu menu = new JMenu("State"); menu.setMnemonic('S'); menuBar.add(menu); mi = menu.add(fActionStateCreateObject); mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F7, 0)); mi.setMnemonic('C'); mi = menu.add(fActionStateEvalOCL); mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F8, 0)); mi.setMnemonic('E'); mi = menu.add(fActionStateCheckStructure); mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F9, 0)); mi.setMnemonic('s'); fCbMenuItemCheckStructure = new JCheckBoxMenuItem("Check structure after every change"); fCbMenuItemCheckStructure.setMnemonic('h'); fCbMenuItemCheckStructure.setSelected(false); menu.add(fCbMenuItemCheckStructure); mi = menu.add(fActionStateReset); mi.setMnemonic('R'); // `View' submenu menu = new JMenu("View"); menu.setMnemonic('V'); menuBar.add(menu); JMenu submenu = new JMenu("Create"); submenu.setMnemonic('C'); menu.add(submenu); mi = submenu.add(fActionViewCreateObjectCount); mi.setMnemonic('O'); mi = submenu.add(fActionViewCreateLinkCount); mi.setMnemonic('L'); mi = submenu.add(fActionViewCreateClassDiagram); mi.setMnemonic('V'); mi = submenu.add(fActionViewCreateObjectDiagram); mi.setMnemonic('d'); mi = submenu.add(fActionViewCreateClassInvariant); mi.setMnemonic('C'); mi = submenu.add(fActionViewCreateStateEvolution); mi.setMnemonic('S'); mi = submenu.add(fActionViewCreateObjectProperties); mi.setMnemonic('p'); mi = submenu.add(fActionViewCreateClassExtent); mi.setMnemonic('e'); mi = submenu.add(fActionViewCreateSequenceDiagram); mi.setMnemonic('q'); mi = submenu.add(fActionViewCreateCallStack); mi.setMnemonic('a'); mi = submenu.add(fActionViewCreateCommandList); mi.setMnemonic('i'); //mi = submenu.add(fActionViewCreateStateTree); // experimental: must be enabled by switch at run-time if (Options.extClassDiagram ) { mi = menu.add(fActionViewClassDiagram); } menu.addSeparator(); mi = menu.add(fActionViewTile); mi.setMnemonic('T'); mi = menu.add(fActionViewCloseAll); mi.setMnemonic('a'); // `Help' submenu menu = new JMenu("Help"); menu.setMnemonic('H'); menuBar.add(menu); // not yet implemented in swing: menuBar.setHelpMenu(menu); mi = menu.add(fActionHelpAbout); mi.setMnemonic('A'); // create the browser panel fModelBrowser = new ModelBrowser(); // create the desktop fDesk = new JDesktopPane(); fDesk.setDesktopManager(new ViewManager()); // create the log panel fLogPanel = new LogPanel(); fLogWriter = new PrintWriter(new TextComponentWriter(fLogPanel.getTextComponent()), true); // create status bar fStatusBar = new StatusBar(); // put the three panels into split panes JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, fModelBrowser, fDesk); sp.setDividerLocation(200); fTopSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp, fLogPanel); fTopSplitPane.setDividerLocation(400); fTopSplitPane.setOneTouchExpandable(true); // Layout and set the content pane JPanel contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); contentPane.setPreferredSize(new Dimension(800, 550)); contentPane.add(toolBar, BorderLayout.NORTH); contentPane.add(fTopSplitPane, BorderLayout.CENTER); contentPane.add(fStatusBar, BorderLayout.SOUTH); setContentPane(contentPane); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { close(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -