You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by tw...@apache.org on 2008/08/21 14:57:40 UTC
svn commit: r687733 [2/3] - in
/incubator/uima/uimaj/trunk/uimaj-tools/src/main/java/org/apache/uima/tools/cvd:
CVD.java MainFrame.java control/XmiCasFileOpenHandler.java
Modified: incubator/uima/uimaj/trunk/uimaj-tools/src/main/java/org/apache/uima/tools/cvd/MainFrame.java
URL: http://svn.apache.org/viewvc/incubator/uima/uimaj/trunk/uimaj-tools/src/main/java/org/apache/uima/tools/cvd/MainFrame.java?rev=687733&r1=687732&r2=687733&view=diff
==============================================================================
--- incubator/uima/uimaj/trunk/uimaj-tools/src/main/java/org/apache/uima/tools/cvd/MainFrame.java (original)
+++ incubator/uima/uimaj/trunk/uimaj-tools/src/main/java/org/apache/uima/tools/cvd/MainFrame.java Thu Aug 21 05:57:40 2008
@@ -1,2109 +1,2136 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.uima.tools.cvd;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.HeadlessException;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.net.MalformedURLException;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.StringTokenizer;
-import java.util.logging.LogManager;
-
-import javax.swing.Action;
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.ButtonGroup;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-import javax.swing.JTree;
-import javax.swing.KeyStroke;
-import javax.swing.WindowConstants;
-import javax.swing.border.BevelBorder;
-import javax.swing.border.Border;
-import javax.swing.event.TreeModelEvent;
-import javax.swing.event.TreeModelListener;
-import javax.swing.text.DefaultEditorKit;
-import javax.swing.text.Style;
-import javax.swing.text.StyleConstants;
-import javax.swing.text.StyleContext;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeSelectionModel;
-
-import org.apache.uima.UIMAFramework;
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.FSIndex;
-import org.apache.uima.cas.FSIndexRepository;
-import org.apache.uima.cas.Feature;
-import org.apache.uima.cas.SofaFS;
-import org.apache.uima.cas.Type;
-import org.apache.uima.cas.TypeSystem;
-import org.apache.uima.cas.impl.CASImpl;
-import org.apache.uima.internal.util.Timer;
-import org.apache.uima.resource.ResourceManager;
-import org.apache.uima.resource.ResourceSpecifier;
-import org.apache.uima.tools.cpm.PerformanceReportDialog;
-import org.apache.uima.tools.cvd.control.AboutHandler;
-import org.apache.uima.tools.cvd.control.AboutUimaHandler;
-import org.apache.uima.tools.cvd.control.AddLanguageHandler;
-import org.apache.uima.tools.cvd.control.AnnotatorOpenEventHandler;
-import org.apache.uima.tools.cvd.control.AnnotatorRerunEventHandler;
-import org.apache.uima.tools.cvd.control.AnnotatorRunOnCasEventHandler;
-import org.apache.uima.tools.cvd.control.CaretChangeHandler;
-import org.apache.uima.tools.cvd.control.CloseLogViewHandler;
-import org.apache.uima.tools.cvd.control.ColorPrefsOpenHandler;
-import org.apache.uima.tools.cvd.control.ColorPrefsSaveHandler;
-import org.apache.uima.tools.cvd.control.FSTreeSelectionListener;
-import org.apache.uima.tools.cvd.control.FileOpenEventHandler;
-import org.apache.uima.tools.cvd.control.FileSaveAsEventHandler;
-import org.apache.uima.tools.cvd.control.FileSaveEventHandler;
-import org.apache.uima.tools.cvd.control.FocusFSAction;
-import org.apache.uima.tools.cvd.control.FocusIRAction;
-import org.apache.uima.tools.cvd.control.FocusTextAction;
-import org.apache.uima.tools.cvd.control.HelpHandler;
-import org.apache.uima.tools.cvd.control.IndexPopupListener;
-import org.apache.uima.tools.cvd.control.IndexTreeSelectionListener;
-import org.apache.uima.tools.cvd.control.LoadRecentDescFileEventHandler;
-import org.apache.uima.tools.cvd.control.LoadRecentTextFileEventHandler;
-import org.apache.uima.tools.cvd.control.MainFrameClosing;
-import org.apache.uima.tools.cvd.control.ManualHandler;
-import org.apache.uima.tools.cvd.control.NewTextEventHandler;
-import org.apache.uima.tools.cvd.control.PopupHandler;
-import org.apache.uima.tools.cvd.control.PopupListener;
-import org.apache.uima.tools.cvd.control.RemoveLanguageHandler;
-import org.apache.uima.tools.cvd.control.RestoreLangDefaultsHandler;
-import org.apache.uima.tools.cvd.control.SetCodePageHandler;
-import org.apache.uima.tools.cvd.control.SetDataPathHandler;
-import org.apache.uima.tools.cvd.control.SetLanguageHandler;
-import org.apache.uima.tools.cvd.control.SetLogConfigHandler;
-import org.apache.uima.tools.cvd.control.ShowAnnotatedTextHandler;
-import org.apache.uima.tools.cvd.control.ShowAnnotationCustomizerHandler;
-import org.apache.uima.tools.cvd.control.ShowTypesystemHandler;
-import org.apache.uima.tools.cvd.control.SofaSelectionListener;
-import org.apache.uima.tools.cvd.control.SystemExitHandler;
-import org.apache.uima.tools.cvd.control.TextChangedListener;
-import org.apache.uima.tools.cvd.control.TextContextMenuAction;
-import org.apache.uima.tools.cvd.control.TextFocusHandler;
-import org.apache.uima.tools.cvd.control.TreeFocusHandler;
-import org.apache.uima.tools.cvd.control.TypeSystemFileOpenEventHandler;
-import org.apache.uima.tools.cvd.control.UndoMgr;
-import org.apache.uima.tools.cvd.control.XCASFileOpenEventHandler;
-import org.apache.uima.tools.cvd.control.XCASSaveHandler;
-import org.apache.uima.tools.cvd.control.XCASSaveTSHandler;
-import org.apache.uima.tools.cvd.control.XmiCasFileOpenHandler;
-import org.apache.uima.tools.cvd.control.XmiCasSaveHandler;
-import org.apache.uima.util.FileUtils;
-import org.apache.uima.util.Level;
-import org.apache.uima.util.Logger;
-import org.apache.uima.util.ProcessTrace;
-import org.apache.uima.util.XMLInputSource;
-
-/**
- * Class comment for MainFrame.java goes here.
- *
- *
- */
-public class MainFrame extends JFrame {
-
- private static final long serialVersionUID = -1357410768440678886L;
-
- public static List<Level> logLevels = new ArrayList<Level>(9);
- static {
- logLevels.add(Level.OFF);
- logLevels.add(Level.SEVERE);
- logLevels.add(Level.WARNING);
- logLevels.add(Level.INFO);
- logLevels.add(Level.CONFIG);
- logLevels.add(Level.FINE);
- logLevels.add(Level.FINER);
- logLevels.add(Level.FINEST);
- logLevels.add(Level.ALL);
- }
-
- private static final String loggerPropertiesFileName = "org/apache/uima/tools/annot_view/Logger.properties";
-
- private static final String defaultText =
- "Load or edit text here.";
-
- private static final String titleText = "CAS Visual Debugger (CVD)";
-
- static final String htmlGrayColor = "<font color=#808080>";
-
- private static final String indexReposRootLabel = "<html><b>CAS Index Repository</b></html>";
-
- private static final String noIndexReposLabel = "<html><b>" + htmlGrayColor
- + "CAS Index Repository</b></html>";
-
- // The content areas.
- private JTextArea textArea;
-
- private JTree indexTree;
-
- private JTree fsTree;
-
- private JPanel statusPanel;
-
- private JTextField statusBar;
-
- private JTextField fileStatus;
-
- private JTextField aeStatus;
-
- private JTextField caretStatus;
-
- private Border textTitleBorder;
-
- // Dirty flag for the editor.
- private boolean isDirty;
-
- // The scroll panels.
- private JScrollPane textScrollPane;
-
- private JScrollPane indexTreeScrollPane;
-
- private JScrollPane fsTreeScrollPane;
-
- // Menus
- private JMenu fileMenu = null;
-
- private JMenuItem fileSaveItem = null;
-
- private JMenu editMenu;
-
- private JMenuItem undoItem;
-
- private UndoMgr undoMgr;
-
- private Action cutAction;
-
- private Action copyAction;
-
- private JMenuItem allAnnotationViewerItem;
-
- private JMenuItem acdItem;
-
- private JMenuItem tsViewerItem;
-
- private JMenuItem reRunMenu;
-
- private JMenuItem runOnCasMenuItem;
-
- private JMenuItem showPerfReportItem;
-
- private JPopupMenu textPopup;
-
- private JMenuItem xcasReadItem;
-
- private JMenuItem xcasWriteItem;
-
- private JMenuItem xmiCasReadItem;
-
- private JMenuItem xmiCasWriteItem;
-
- private JMenuItem typeSystemWriteItem;
-
- private JMenuItem typeSystemReadItem;
-
- private JMenu recentTextFileMenu;
-
- private JMenu recentDescFileMenu;
-
- // Ini file
- private File iniFile = null;
-
- // Code pages
-
- private List<String> codePages = null;
-
- private String codePage = null;
-
- private JMenu cpMenu;
-
- private ButtonGroup cpButtons;
-
- // Language support
- String languagePrefsList = null;
-
- // private String defaultLanguagePref = null;
- private List<String> languages = null;
-
- private JMenu langMenu;
-
- private ButtonGroup langButtons;
-
- private static final String LANGUAGE_DEFAULT = "en";
-
- private String language;
-
- private static final String defaultLanguages = "de,en,fr,ja,ko-kr,pt-br,zh-cn,zh-tw,x-unspecified";
-
- private File textFile = null;
-
- private File fileOpenDir = null;
-
- private File annotOpenDir = null;
-
- private File xcasFileOpenDir = null;
-
- private File colorSettingsDir = null;
-
- // Selected index
- private String indexLabel = null;
-
- private FSIndex index = null;
-
- private boolean isAnnotationIndex = false;
-
- private CAS cas = null;
-
- private File aeDescriptorFile = null;
-
- private AnalysisEngine ae = null;
-
- private File logFile = null;
-
- private Logger log = null;
-
- private File colorSettingFile;
-
- private static final Color selectionColor = Color.orange;
-
- private Properties preferences;
-
- private ProcessTrace lastRunProcessTrace = null;
-
- public static final String textDirPref = "dir.open.text";
-
- public static final String aeDirPref = "dir.open.tae";
-
- public static final String xcasDirPref = "dir.open.xcas";
-
- public static final String textSizePref = "textArea.size";
-
- public static final String indexTreeSizePref = "indexTree.size";
-
- public static final String fsTreeSizePref = "fsTree.size";
-
- public static final String tsWindowSizePref = "tsWindow.size";
-
- public static final String annotViewSizePref = "annotViewWindow.size";
-
- public static final String logViewSizePref = "logViewWindow.size";
-
- public static final String widthSuffix = ".width";
-
- public static final String heightSuffix = ".height";
-
- private static final String colorFilePref = "colors.file";
-
- private static final String colorDirPref = "colors.dir";
-
- private static final String cpCurrentPref = "cp.selected";
-
- private static final String langCurrentPref = "lang.selected";
-
- private static final String langListPref = "lang.list";
-
- private static final String textFileListPref = "file.text.list";
-
- private static final String descFileListPref = "file.desc.list";
-
- private static final String dataPathPref = "datapath";
-
- private static final Dimension textDimensionDefault = new Dimension(500, 400);
-
- private static final Dimension fsTreeDimensionDefault = new Dimension(200, 200);
-
- private static final Dimension logFileDimensionDefault = new Dimension(500, 600);
-
- public static final String DEFAULT_STYLE_NAME = "defaultStyle";
-
- private Map<String, Style> styleMap = new HashMap<String, Style>();
-
- // For recently used text and descriptor files.
- private static final int maxRecentSize = 8;
-
- private final RecentFilesList recentTextFiles = new RecentFilesList(maxRecentSize);
-
- private final List<String> textFileNameList = new ArrayList<String>();
-
- private final RecentFilesList recentDescFiles = new RecentFilesList(maxRecentSize);
-
- private final List<String> descFileNameList = new ArrayList<String>();
-
- // For cursor handling (busy cursor). Is there a better way?
- private List<Component> cursorOwningComponents = new ArrayList<Component>();
-
- private List<Cursor> cursorCache = null;
-
- private String dataPathName;
-
- private JComboBox sofaSelectionComboBox;
-
- private JPanel sofaSelectionPanel;
-
- private boolean exitOnClose = true;
-
- /**
- * Constructor for MainFrame.
- *
- * @throws HeadlessException
- */
- public MainFrame(File iniFile) {
- super();
- this.iniFile = iniFile;
- init();
- }
-
- public void runAE(boolean doCasReset) {
- setStatusbarMessage("Running Annotator.");
- Timer timer = new Timer();
- timer.start();
- if (this.ae == null) {
- JOptionPane.showMessageDialog(this, "No AE loaded.", "Error", JOptionPane.ERROR_MESSAGE);
- return;
- }
- internalRunAE(doCasReset);
- timer.stop();
- setStatusbarMessage("Done running AE " + this.ae.getAnalysisEngineMetaData().getName() + " in "
- + timer.getTimeSpan() + ".");
- updateIndexTree(true);
- this.allAnnotationViewerItem.setEnabled(false);
- this.isDirty = false;
- this.runOnCasMenuItem.setEnabled(true);
- }
-
- public void setDataPath(String dataPath) {
- this.dataPathName = dataPath;
- }
-
- public void loadAEDescriptor(File descriptorFile) {
- addRecentDescFile(descriptorFile);
- setWaitCursor();
- if (descriptorFile.exists() && descriptorFile.isFile()) {
- this.annotOpenDir = descriptorFile.getParentFile();
- }
- Timer time = new Timer();
- time.start();
- boolean success = false;
- try {
- success = setupAE(descriptorFile);
- } catch (Exception e) {
- handleException(e);
- } catch (NoClassDefFoundError e) {
- // We don't want to catch all errors, but some are ok.
- handleException(e);
- }
- time.stop();
- if (!success) {
- setStatusbarMessage("Failed to load AE specifier: " + descriptorFile.getName());
- this.reRunMenu.setText("Run AE");
- setAEStatusMessage();
- resetCursor();
- return;
- }
- if (this.ae != null) {
- this.aeDescriptorFile = descriptorFile;
- String annotName = this.ae.getAnalysisEngineMetaData().getName();
- this.reRunMenu.setText("Run " + annotName);
- this.reRunMenu.setEnabled(true);
- this.runOnCasMenuItem.setText("Run " + annotName + " on CAS");
- setAEStatusMessage();
- setStatusbarMessage("Done loading AE " + annotName + " in " + time.getTimeSpan() + ".");
- }
- // Check for CAS multiplier
- // TODO: properly handle CAS multiplication
- if (this.ae != null) {
- if (this.ae.getAnalysisEngineMetaData().getOperationalProperties().getOutputsNewCASes()) {
- JOptionPane
- .showMessageDialog(
- this,
- "This analysis engine uses a CAS multiplier component.\nCAS multiplication/merging is not currently supported in CVD.\nYou can run the analysis engine, but will not see any results.",
- "Warning: unsupported operation", JOptionPane.WARNING_MESSAGE);
- }
- }
- resetCursor();
- }
-
- public void handleException(Throwable e) {
- StringBuffer msg = new StringBuffer();
- handleException(e, msg);
- }
-
- protected void handleException(Throwable e, StringBuffer msg) {
- msg.append(e.getClass().getName() + ": ");
- if (e.getMessage() != null) {
- msg.append(e.getMessage());
- }
- if (this.log != null) {
- if (e instanceof Exception) {
- this.log.log(Level.SEVERE, ((Exception) e).getLocalizedMessage(), e);
- } else {
- this.log.log(Level.SEVERE, e.getMessage(), e);
- }
- msg.append("\nMore detailed information is in the log file.");
- }
- boolean hasAsserts = false;
- // assert(hasAsserts = true);
- if (hasAsserts) {
- e.printStackTrace();
- }
- JOptionPane.showMessageDialog(this, msg.toString(), "Exception", JOptionPane.ERROR_MESSAGE);
-
- }
-
- private void showError(String msg) {
- JOptionPane.showMessageDialog(this, msg, "Error", JOptionPane.ERROR_MESSAGE);
- }
-
- public void loadFile() {
- try {
- if (this.textFile.exists() && this.textFile.canRead()) {
- String text = null;
- if (this.codePage == null) {
- text = FileUtils.file2String(this.textFile);
- } else {
- text = FileUtils.file2String(this.textFile, this.codePage);
- }
- setTextNoTitle(text);
- setTitle();
- addRecentTextFile(this.textFile);
- } else {
- handleException(new IOException("File does not exist or is not readable: "
- + this.textFile.getAbsolutePath()));
- }
- // Add the loaded file to the recently used files list.
- } catch (UnsupportedEncodingException e) {
- StringBuffer msg = new StringBuffer("Unsupported text encoding (code page): ");
- handleException(e, msg);
- } catch (Exception e) {
- handleException(e);
- }
- }
-
- private static final int getMnemonic(int i) {
- switch (i) {
- case 1:
- return KeyEvent.VK_1;
- case 2:
- return KeyEvent.VK_2;
- case 3:
- return KeyEvent.VK_3;
- case 4:
- return KeyEvent.VK_4;
- case 5:
- return KeyEvent.VK_5;
- case 6:
- return KeyEvent.VK_6;
- case 7:
- return KeyEvent.VK_7;
- case 8:
- return KeyEvent.VK_8;
- case 9:
- return KeyEvent.VK_9;
- default:
- return KeyEvent.VK_0;
- }
- }
-
- private final JMenuItem createRecentTextFileItem(int num, File file) {
- String fileShortName = file.getName();
- JMenuItem item = new JMenuItem(num + " " + fileShortName, getMnemonic(num));
- item.addActionListener(new LoadRecentTextFileEventHandler(this, file.getAbsolutePath()));
- item.setToolTipText(file.getAbsolutePath());
- return item;
- }
-
- private void addRecentTextFile(File file) {
- this.recentTextFiles.addFile(file);
- this.recentTextFileMenu.removeAll();
- List<File> textFiles = this.recentTextFiles.getFileList();
- for (int i = 0; i < textFiles.size(); i++) {
- JMenuItem menuItem = createRecentTextFileItem(i + 1, textFiles.get(i));
- this.recentTextFileMenu.add(menuItem);
- }
- }
-
- private final JMenuItem createRecentDescFileItem(int num, File file) {
- String fileShortName = file.getName();
- JMenuItem item = new JMenuItem(num + " " + fileShortName, getMnemonic(num));
- item.addActionListener(new LoadRecentDescFileEventHandler(this, file.getAbsolutePath()));
- item.setToolTipText(file.getAbsolutePath());
- return item;
- }
-
- private void addRecentDescFile(File file) {
- this.recentDescFiles.addFile(file);
- this.recentDescFileMenu.removeAll();
- List<File> descFiles = this.recentDescFiles.getFileList();
- for (int i = 0; i < descFiles.size(); i++) {
- JMenuItem menuItem = createRecentDescFileItem(i + 1, descFiles.get(i));
- this.recentDescFileMenu.add(menuItem);
- }
- }
-
- /**
- * Set the text to be analyzed.
- *
- * @param text
- * The text.
- */
- public void setText(String text) {
- this.textFile = null;
- setTextNoTitle(text);
- setTitle();
- }
-
- /**
- * Load a text file.
- *
- * @param textFile1
- * The text file.
- */
- public void loadTextFile(File textFile1) {
- this.textFile = textFile1;
- loadFile();
- }
-
- // Set the text.
- public void setTextNoTitle(String text) {
- this.textArea.setText(text);
- this.textArea.getCaret().setDot(0);
- this.isDirty = false;
- }
-
- public void setTitle() {
- StringBuffer buf = new StringBuffer();
- buf.append(titleText);
- if (this.textFile != null) {
- buf.append(": \"");
- buf.append(this.textFile.getAbsolutePath());
- buf.append("*");
- buf.append("\"");
- }
- this.setTitle(buf.toString());
- }
-
- public boolean saveFile() {
- if (this.textFile.exists() && !this.textFile.canWrite()) {
- showError("File is not writable: " + this.textFile.getAbsolutePath());
- return false;
- }
- final String text = this.textArea.getText();
- FileOutputStream fileOutStream = null;
- try {
- fileOutStream = new FileOutputStream(this.textFile);
- } catch (FileNotFoundException e) {
- handleException(e);
- return false;
- }
- Writer writer = null;
- if (this.codePage == null) {
- writer = new OutputStreamWriter(fileOutStream);
- } else {
- try {
- writer = new OutputStreamWriter(fileOutStream, this.codePage);
- } catch (UnsupportedEncodingException e) {
- handleException(e);
- return false;
- }
- }
- try {
- writer.write(text);
- writer.close();
- this.isDirty = false;
- setTitle();
- } catch (IOException e) {
- handleException(e);
- return false;
- }
- return true;
- }
-
- private void createTextArea() {
- try {
- this.textArea = new JTextArea();
- this.addCursorOwningComponent(this.textArea);
- Border emptyBorder = BorderFactory.createEmptyBorder(2, 4, 2, 2);
- Border grayLineBordre = BorderFactory.createLineBorder(Color.gray, 1);
- this.textArea.setBorder(BorderFactory.createCompoundBorder(grayLineBordre, emptyBorder));
- this.textArea.setSelectionColor(selectionColor);
- this.textArea.setEditable(true);
- this.textArea.setLineWrap(true);
- this.textArea.setWrapStyleWord(true);
- this.textArea.setText(defaultText);
- this.textArea.addMouseListener(new PopupListener(this));
- // textArea.setFocusable(true);
- this.textArea.addFocusListener(new TextFocusHandler(this));
- this.textArea.getDocument().addDocumentListener(new TextChangedListener(this));
- this.textArea.addCaretListener(new CaretChangeHandler(this));
- this.undoMgr = new UndoMgr(this);
- this.textArea.getDocument().addUndoableEditListener(this.undoMgr);
- } catch (Exception e) {
- handleException(e);
- }
- }
-
- private void populateEditMenu() {
- this.undoItem = new JMenuItem("Undo");
- this.undoItem.addActionListener(this.undoMgr);
- this.undoItem.setEnabled(false);
- this.undoItem.setMnemonic(KeyEvent.VK_U);
- this.undoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
- this.editMenu.add(this.undoItem);
- this.editMenu.addSeparator();
- HashMap<Object, Action> actionMap = createEditActionMap();
- // Cut
- this.cutAction = actionMap.get(DefaultEditorKit.cutAction);
- this.cutAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_T));
- this.cutAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X,
- InputEvent.CTRL_MASK));
- this.cutAction.setEnabled(false);
- JMenuItem cutItem = new JMenuItem(this.cutAction);
- cutItem.setText("Cut");
- this.editMenu.add(cutItem);
- // Copy
- this.copyAction = actionMap.get(DefaultEditorKit.copyAction);
- this.copyAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_C));
- this.copyAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C,
- InputEvent.CTRL_MASK));
- this.copyAction.setEnabled(false);
- JMenuItem copyItem = new JMenuItem(this.copyAction);
- copyItem.setText("Copy");
- this.editMenu.add(copyItem);
- // Paste
- Action pasteAction = actionMap.get(DefaultEditorKit.pasteAction);
- pasteAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
- pasteAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V,
- InputEvent.CTRL_MASK));
- JMenuItem pasteItem = new JMenuItem(pasteAction);
- pasteItem.setText("Paste");
- this.editMenu.add(pasteItem);
- }
-
- private HashMap<Object, Action> createEditActionMap() {
- HashMap<Object, Action> map = new HashMap<Object, Action>();
- Action[] ar = this.textArea.getActions();
- for (int i = 0; i < ar.length; i++) {
- Action a = ar[i];
- map.put(a.getValue(Action.NAME), a);
- }
- return map;
- }
-
- private JMenuBar createMenuBar() {
- JMenuBar menuBar = new JMenuBar();
- createFileMenu();
- menuBar.add(this.fileMenu);
- menuBar.add(createEditMenu());
- menuBar.add(createRunMenu());
- menuBar.add(createToolsMenu());
- menuBar.add(createHelpMenu());
- return menuBar;
- }
-
- private JMenu createEditMenu() {
- this.editMenu = new JMenu("Edit");
- this.editMenu.setMnemonic(KeyEvent.VK_E);
- populateEditMenu();
- return this.editMenu;
- }
-
- private JMenu createHelpMenu() {
- JMenu helpMenu = new JMenu("Help");
- helpMenu.setMnemonic(KeyEvent.VK_H);
- JMenuItem manualItem = new JMenuItem("Manual", KeyEvent.VK_M);
- manualItem.addActionListener(new ManualHandler(this));
- helpMenu.add(manualItem);
- JMenuItem helpInfoItem = new JMenuItem("Help", KeyEvent.VK_H);
- helpInfoItem.addActionListener(new HelpHandler(this));
- helpMenu.add(helpInfoItem);
- helpMenu.addSeparator();
- JMenuItem aboutItem = new JMenuItem("About CVD", KeyEvent.VK_A);
- aboutItem.addActionListener(new AboutHandler(this));
- helpMenu.add(aboutItem);
- JMenuItem aboutUimaItem = new JMenuItem("About UIMA", KeyEvent.VK_U);
- aboutUimaItem.addActionListener(new AboutUimaHandler(this));
- helpMenu.add(aboutUimaItem);
- return helpMenu;
- }
-
- private void createFileMenu() {
- this.fileMenu = new JMenu("File");
-
- // Standard text file menu items.
- JMenuItem newTextItem = new JMenuItem("New Text...", KeyEvent.VK_N);
- newTextItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
- newTextItem.addActionListener(new NewTextEventHandler(this));
- this.fileMenu.add(newTextItem);
- this.fileMenu.setMnemonic(KeyEvent.VK_F);
- JMenuItem fileOpen = new JMenuItem("Open Text File", KeyEvent.VK_O);
- fileOpen.addActionListener(new FileOpenEventHandler(this));
- fileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
- this.fileMenu.add(fileOpen);
- this.fileSaveItem = new JMenuItem("Save Text File", KeyEvent.VK_S);
- this.fileSaveItem.setEnabled(false);
- this.fileSaveItem.addActionListener(new FileSaveEventHandler(this));
- this.fileSaveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
- this.fileMenu.add(this.fileSaveItem);
- JMenuItem fileSaveAsItem = new JMenuItem("Save Text As...", KeyEvent.VK_A);
- fileSaveAsItem.addActionListener(new FileSaveAsEventHandler(this));
- this.fileMenu.add(fileSaveAsItem);
- createCPMenu();
- this.cpMenu.setMnemonic(KeyEvent.VK_P);
- this.fileMenu.add(this.cpMenu);
- this.fileMenu.addSeparator();
- this.recentTextFileMenu = new JMenu("Recently used ...");
- this.recentTextFileMenu.setMnemonic(KeyEvent.VK_U);
- this.fileMenu.add(this.recentTextFileMenu);
- this.fileMenu.addSeparator();
-
- // Color preferences
- JMenuItem colorPrefsOpenItem = new JMenuItem("Load Color Settings", KeyEvent.VK_L);
- colorPrefsOpenItem.addActionListener(new ColorPrefsOpenHandler(this));
- this.fileMenu.add(colorPrefsOpenItem);
- JMenuItem colorPrefsSaveItem = new JMenuItem("Save Color Settings", KeyEvent.VK_C);
- colorPrefsSaveItem.addActionListener(new ColorPrefsSaveHandler(this));
- this.fileMenu.add(colorPrefsSaveItem);
- this.fileMenu.addSeparator();
-
- // Reading and writing type system files.
- this.typeSystemReadItem = new JMenuItem("Read Type System File");
- this.typeSystemReadItem.setEnabled(true);
- this.typeSystemReadItem.addActionListener(new TypeSystemFileOpenEventHandler(this));
- this.fileMenu.add(this.typeSystemReadItem);
- this.typeSystemWriteItem = new JMenuItem("Write Type System File");
- this.typeSystemWriteItem.addActionListener(new XCASSaveTSHandler(this));
- this.fileMenu.add(this.typeSystemWriteItem);
- this.fileMenu.addSeparator();
-
- // Reading and writing XMI CAS files.
- this.xmiCasReadItem = new JMenuItem("Read XMI CAS File");
- this.xmiCasReadItem.addActionListener(new XmiCasFileOpenHandler(this));
- this.fileMenu.add(this.xmiCasReadItem);
- this.xmiCasWriteItem = new JMenuItem("Write XMI CAS File");
- this.xmiCasWriteItem.addActionListener(new XmiCasSaveHandler(this));
- this.fileMenu.add(this.xmiCasWriteItem);
- this.fileMenu.addSeparator();
-
- // Reading and writing old-style XCAS files.
- this.xcasReadItem = new JMenuItem("Read XCAS File", KeyEvent.VK_R);
- this.xcasReadItem.addActionListener(new XCASFileOpenEventHandler(this));
- this.fileMenu.add(this.xcasReadItem);
- this.xcasWriteItem = new JMenuItem("Write XCAS File", KeyEvent.VK_W);
- this.xcasWriteItem.addActionListener(new XCASSaveHandler(this));
- this.fileMenu.add(this.xcasWriteItem);
- this.fileMenu.addSeparator();
- JMenuItem exit = new JMenuItem("Exit", KeyEvent.VK_X);
- exit.addActionListener(new SystemExitHandler(this));
- this.fileMenu.add(exit);
-
- // Disable menu items that can't be executed yet.
- this.typeSystemWriteItem.setEnabled(false);
- setEnableCasFileReadingAndWriting();
- }
-
- public final void setEnableCasFileReadingAndWriting() {
- final boolean enable = this.cas != null;
- this.xcasReadItem.setEnabled(enable);
- this.xmiCasReadItem.setEnabled(enable);
- this.xcasWriteItem.setEnabled(enable);
- this.xmiCasWriteItem.setEnabled(enable);
- }
-
- private final void addCursorOwningComponent(Component comp) {
- this.cursorOwningComponents.add(comp);
- }
-
- private final void setWaitCursor() {
- this.setEnabled(false);
- this.cursorCache = new ArrayList<Cursor>();
- for (int i = 0; i < this.cursorOwningComponents.size(); i++) {
- Component comp = this.cursorOwningComponents.get(i);
- this.cursorCache.add(comp.getCursor());
- comp.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- }
- }
-
- public final void resetCursor() {
- if (this.cursorCache == null) {
- return;
- }
- for (int i = 0; i < this.cursorOwningComponents.size(); i++) {
- Component comp = this.cursorOwningComponents.get(i);
- comp.setCursor(this.cursorCache.get(i));
- }
- this.setEnabled(true);
- }
-
- public void createCodePages() {
- // Get supported encodings from JVM
- Map<String, Charset> charsetMap = Charset.availableCharsets();
- String sysCodePage = Charset.defaultCharset().name();
-
- this.codePages = new ArrayList<String>();
-
- if (sysCodePage != null) {
- this.codePages.add(sysCodePage);
- if (this.codePage == null) {
- this.codePage = sysCodePage;
- }
- }
- for (String charsetName : charsetMap.keySet()) {
- if (!this.codePages.contains(charsetName)) {
- this.codePages.add(charsetName);
- }
- }
- }
-
- public void resetTrees() {
- updateIndexTree(false);
- }
-
- private void createCPMenu() {
- createCodePages();
- this.cpMenu = new AutoFoldingMenu("Code Page", 20);
- resetCPMenu();
- }
-
- public void resetCPMenu() {
- this.cpMenu.removeAll();
- this.cpButtons = new ButtonGroup();
- JRadioButtonMenuItem item;
- String cp;
- for (int i = 0; i < this.codePages.size(); i++) {
- cp = this.codePages.get(i);
- item = new JRadioButtonMenuItem(cp);
- if (cp.equals(this.codePage)) {
- item.setSelected(true);
- }
- item.addActionListener(new SetCodePageHandler(this));
- this.cpButtons.add(item);
- this.cpMenu.add(item);
- }
-
- }
-
- public void addLanguage(String language1) {
- this.language = language1;
- if (!this.languages.contains(language1)) {
- this.languages.add(language1);
- }
- resetLangMenu();
- }
-
- private void createLangMenu() {
- createLanguages();
- this.langMenu = new JMenu("Language");
- resetLangMenu();
- }
-
- public void resetLangMenu() {
- this.langMenu.removeAll();
- this.langButtons = new ButtonGroup();
- JRadioButtonMenuItem item;
- String lang;
- for (int i = 0; i < this.languages.size(); i++) {
- lang = this.languages.get(i);
- item = new JRadioButtonMenuItem(lang);
- if (lang.equals(this.language)) {
- item.setSelected(true);
- }
- item.addActionListener(new SetLanguageHandler(this));
- this.langButtons.add(item);
- this.langMenu.add(item);
- }
- this.langMenu.addSeparator();
- JMenuItem addLangItem = new JMenuItem("Add language");
- addLangItem.addActionListener(new AddLanguageHandler(this));
- this.langMenu.add(addLangItem);
- JMenu removeMenu = new JMenu("Remove language");
- for (int i = 0; i < this.languages.size(); i++) {
- JMenuItem rmItem = new JMenuItem(this.languages.get(i));
- rmItem.addActionListener(new RemoveLanguageHandler(this));
- removeMenu.add(rmItem);
- }
- this.langMenu.add(removeMenu);
- JMenuItem restoreDefaultsItem = new JMenuItem("Restore defaults");
- restoreDefaultsItem.addActionListener(new RestoreLangDefaultsHandler(this));
- this.langMenu.add(restoreDefaultsItem);
- }
-
- public void createLanguages() {
- this.languages = new ArrayList<String>();
- if (this.languagePrefsList == null) {
- this.languagePrefsList = defaultLanguages;
- }
- if (this.language == null) {
- this.language = LANGUAGE_DEFAULT;
- }
- StringTokenizer tok = new StringTokenizer(this.languagePrefsList, ",");
- String lang;
- while (tok.hasMoreTokens()) {
- lang = tok.nextToken();
- if (!this.languages.contains(lang)) {
- this.languages.add(lang);
- }
- }
- }
-
- private JMenu createRunMenu() {
- JMenu runMenu = new JMenu("Run");
- runMenu.setMnemonic(KeyEvent.VK_R);
- JMenuItem runMenuItem = new JMenuItem("Load AE", KeyEvent.VK_L);
- runMenuItem.addActionListener(new AnnotatorOpenEventHandler(this));
- runMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, ActionEvent.CTRL_MASK));
- runMenu.add(runMenuItem);
- this.reRunMenu = new JMenuItem("Run AE", KeyEvent.VK_R);
- this.reRunMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.CTRL_MASK));
- runMenu.add(this.reRunMenu);
- this.reRunMenu.addActionListener(new AnnotatorRerunEventHandler(this));
- this.reRunMenu.setEnabled(false);
- this.runOnCasMenuItem = new JMenuItem("Run AE on CAS", KeyEvent.VK_Y);
- this.runOnCasMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y,
- ActionEvent.CTRL_MASK));
- runMenu.add(this.runOnCasMenuItem);
- this.runOnCasMenuItem.addActionListener(new AnnotatorRunOnCasEventHandler(this));
- this.runOnCasMenuItem.setEnabled(false);
- this.showPerfReportItem = new JMenuItem("Performance report");
- this.showPerfReportItem.setEnabled(false);
- this.showPerfReportItem.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (MainFrame.this.lastRunProcessTrace == null) {
- MainFrame.this.showError("No performance report to show.");
- } else {
- PerformanceReportDialog prd = new PerformanceReportDialog(MainFrame.this);
- prd.displayStats(MainFrame.this.lastRunProcessTrace, 1, "Process trace");
- }
- }
- });
- runMenu.add(this.showPerfReportItem);
- runMenu.addSeparator();
- this.recentDescFileMenu = new JMenu("Recently used ...");
- this.recentDescFileMenu.setMnemonic(KeyEvent.VK_U);
- runMenu.add(this.recentDescFileMenu);
- runMenu.addSeparator();
- createLangMenu();
- runMenu.add(this.langMenu);
- this.langMenu.setMnemonic(KeyEvent.VK_L);
- // runMenu.addSeparator();
- JMenuItem dataPathItem = new JMenuItem("Set data path");
- dataPathItem.addActionListener(new SetDataPathHandler(this));
- dataPathItem.setMnemonic(KeyEvent.VK_S);
- runMenu.addSeparator();
- runMenu.add(dataPathItem);
- return runMenu;
- }
-
- private JMenu createToolsMenu() {
- JMenu toolsMenu = new JMenu("Tools");
- toolsMenu.setMnemonic(KeyEvent.VK_T);
- this.tsViewerItem = new JMenuItem("View Typesystem", KeyEvent.VK_T);
- this.tsViewerItem.addActionListener(new ShowTypesystemHandler(this));
- this.tsViewerItem.setEnabled(false);
- toolsMenu.add(this.tsViewerItem);
- this.allAnnotationViewerItem = new JMenuItem("Show Selected Annotations", KeyEvent.VK_A);
- this.allAnnotationViewerItem.addActionListener(new ShowAnnotatedTextHandler(this));
- toolsMenu.add(this.allAnnotationViewerItem);
- this.allAnnotationViewerItem.setEnabled(false);
- this.acdItem = new JMenuItem("Customize Annotation Display", KeyEvent.VK_C);
- toolsMenu.add(this.acdItem);
- this.acdItem.setEnabled(false);
- this.acdItem.addActionListener(new ShowAnnotationCustomizerHandler(this));
-
- JMenu logConfig = new JMenu("Set Log Level");
- ButtonGroup levelGroup = new ButtonGroup();
-
- // get current log level setting
- String curLogLevel = LogManager.getLogManager().getProperty(".level");
-
- // create log config menu with available log levels
- Iterator<Level> levelIt = MainFrame.logLevels.iterator();
- while (levelIt.hasNext()) {
- Level level = levelIt.next();
- JRadioButtonMenuItem item = new JRadioButtonMenuItem(level.toString());
- // select current log level
- if (level.toString().equals(curLogLevel)) {
- item.setSelected(true);
- }
- item.addActionListener(new SetLogConfigHandler());
- levelGroup.add(item);
- logConfig.add(item);
- }
- toolsMenu.add(logConfig);
-
- JMenuItem logViewer = new JMenuItem("View Log File", KeyEvent.VK_L);
- logViewer.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent event) {
- LogFileViewer viewer = new LogFileViewer("Log file: "
- + MainFrame.this.logFile.getAbsolutePath());
- viewer.addWindowListener(new CloseLogViewHandler(MainFrame.this));
- Dimension dim = getDimension(logViewSizePref);
- if (dim == null) {
- dim = logFileDimensionDefault;
- }
- viewer.init(MainFrame.this.logFile, dim);
- }
- });
- toolsMenu.add(logViewer);
-
- return toolsMenu;
- }
-
- private void createStatusBar() {
- this.statusPanel = new JPanel();
- // statusPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
- this.statusPanel.setLayout(new BoxLayout(this.statusPanel, BoxLayout.X_AXIS));
- this.statusBar = new JTextField();
- Border innerCompound = BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(
- BevelBorder.LOWERED, Color.lightGray, Color.darkGray), BorderFactory.createEmptyBorder(0,
- 3, 0, 3));
- Border leftCompoundBorder = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(
- 0, 0, 0, 1), innerCompound);
- Border middleCompoundBorder = BorderFactory.createCompoundBorder(BorderFactory
- .createEmptyBorder(0, 1, 0, 1), innerCompound);
- Border rightCompoundBorder = BorderFactory.createCompoundBorder(BorderFactory
- .createEmptyBorder(0, 1, 0, 0), innerCompound);
- // statusBar.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2));
- this.statusBar.setBorder(leftCompoundBorder);
- this.statusBar.setEditable(false);
- this.statusBar.setBackground(this.getBackground());
- this.statusBar.setText("Starting up.");
- this.statusBar.setToolTipText("Status Bar");
- this.statusPanel.add(this.statusBar);
- this.fileStatus = new JTextField();
- // fileStatus.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2));
- this.fileStatus.setBorder(rightCompoundBorder);
- this.fileStatus.setMaximumSize(new Dimension(500, 25));
- this.fileStatus.setEditable(false);
- // fileStatus.setBackground(new Color(204, 204, 255));
- // fileStatus.setBackground(new Color(164, 147, 255));
- // statusPanel.add(fileStatus);
- this.aeStatus = new JTextField();
- this.aeStatus.setBorder(middleCompoundBorder);
- this.aeStatus.setMaximumSize(new Dimension(500, 25));
- this.aeStatus.setEditable(false);
- this.statusPanel.add(this.aeStatus);
- this.caretStatus = new JTextField();
- this.caretStatus.setBorder(rightCompoundBorder);
- this.caretStatus.setMaximumSize(new Dimension(500, 25));
- // caretStatus.setBackground(new Color(204, 255, 204));
- this.caretStatus.setEditable(false);
- this.caretStatus.setToolTipText("Position of cursor or extent of selection");
- this.statusPanel.add(this.caretStatus);
- // setCaretStatus(0, 0);
- // setFileStatusMessage();
- setAEStatusMessage();
- }
-
- public void setCaretStatus(final int dot, final int mark) {
- if (dot == mark) {
- this.caretStatus.setText("Cursor: " + dot);
- } else {
- int from, to;
- if (dot < mark) {
- from = dot;
- to = mark;
- } else {
- from = mark;
- to = dot;
- }
- this.caretStatus.setText("Selection: " + from + " - " + to);
- }
- this.statusPanel.revalidate();
- boolean enable = dot != mark;
- this.cutAction.setEnabled(enable);
- this.copyAction.setEnabled(enable);
- }
-
- public void setFileStatusMessage() {
- Border textBorder;
- if (this.textFile == null) {
- textBorder = BorderFactory.createTitledBorder(this.textTitleBorder, "Text");
- // textBorder.setTitleJustification(TitledBorder.ABOVE_TOP);
- } else {
- textBorder = BorderFactory.createTitledBorder(this.textTitleBorder, this.textFile
- .getAbsolutePath());
- }
- this.textScrollPane.setBorder(textBorder);
- this.textScrollPane.revalidate();
- }
-
- private void setAEStatusMessage() {
- if (this.ae == null || this.aeDescriptorFile == null) {
- this.aeStatus.setText("(No AE Loaded)");
- this.aeStatus.setToolTipText("No AE descriptor loaded.");
- } else {
- this.aeStatus.setText(this.aeDescriptorFile.getName());
- this.aeStatus.setToolTipText("<html>Currently loaded AE descriptor file:<br>"
- + this.aeDescriptorFile.getAbsolutePath() + "</html>");
- }
- this.statusPanel.revalidate();
- }
-
- public void setStatusbarMessage(String message) {
- // Date date = new Date();
- Calendar calendar = Calendar.getInstance();
- int time;
- StringBuffer buf = new StringBuffer();
- buf.append("[");
- time = calendar.get(Calendar.HOUR_OF_DAY);
- if (time < 10) {
- buf.append("0");
- }
- buf.append(time);
- buf.append(":");
- time = calendar.get(Calendar.MINUTE);
- if (time < 10) {
- buf.append("0");
- }
- buf.append(time);
- buf.append(":");
- time = calendar.get(Calendar.SECOND);
- if (time < 10) {
- buf.append("0");
- }
- buf.append(time);
- buf.append("] ");
- buf.append(message);
- this.statusBar.setText(buf.toString());
- this.statusPanel.revalidate();
- }
-
- private void initializeLogging() {
-
- // set log file path
- File homeDir = new File(System.getProperty("user.home"));
- this.logFile = new File(homeDir, "uima.log");
-
- // delete file if it exists
- this.logFile.delete();
-
- // initialize log framework
- LogManager logManager = LogManager.getLogManager();
- try {
- logManager.readConfiguration(ClassLoader.getSystemResourceAsStream(loggerPropertiesFileName));
- } catch (SecurityException e) {
- handleException(e);
- return;
- } catch (IOException e) {
- handleException(e);
- return;
- }
-
- // get UIMA framework logger
- this.log = UIMAFramework.getLogger();
- }
-
- private void init() {
- this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- this.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- // Do nothing.
- }
- });
- initializeLogging();
- this.addCursorOwningComponent(this);
- this.addWindowListener(new MainFrameClosing(this));
- // runConfigs = new ArrayList();
- createTextArea();
- this.setTitle(titleText);
- JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
- Border emptyBorder = BorderFactory.createEmptyBorder(0, 0, 0, 0);
- Border grayLineBorder = BorderFactory.createLineBorder(Color.gray, 1);
- splitPane.setBorder(emptyBorder);
- final int dividerSize = 5;
- splitPane.setDividerSize(dividerSize);
- JPanel contentPane = new JPanel(new BorderLayout());
- contentPane.add(splitPane, BorderLayout.CENTER);
- contentPane.setBorder(emptyBorder);
- createStatusBar();
- contentPane.add(this.statusPanel, BorderLayout.SOUTH);
- contentPane.setOpaque(true);
-
- this.setContentPane(contentPane);
- initIRTree();
- this.indexTree.addMouseListener(new IndexPopupListener(this));
-
- // add combobox to select the view
- JPanel leftPanel = new JPanel();
- leftPanel.setLayout(new BorderLayout());
- this.sofaSelectionPanel = new JPanel();
- this.sofaSelectionComboBox = new JComboBox();
- this.sofaSelectionComboBox.addItem(CAS.NAME_DEFAULT_SOFA);
- this.sofaSelectionPanel.add(new JLabel("Select View:"));
- this.sofaSelectionPanel.add(this.sofaSelectionComboBox);
- leftPanel.add(this.sofaSelectionPanel, BorderLayout.NORTH);
- this.sofaSelectionPanel.setVisible(false);
- this.sofaSelectionComboBox.addItemListener(new SofaSelectionListener(this));
- this.sofaSelectionComboBox
- .setToolTipText("This CAS has multiple Views. Select the View to display.");
-
- JSplitPane treePairPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
- treePairPane.setDividerSize(dividerSize);
- this.indexTreeScrollPane = new JScrollPane(this.indexTree);
- this.indexTreeScrollPane.setBorder(grayLineBorder);
- leftPanel.add(treePairPane);
- splitPane.setLeftComponent(leftPanel);
- // splitPane.setLeftComponent(treePairPane);
- treePairPane.setBorder(BorderFactory.createTitledBorder(grayLineBorder, "Analysis Results"));
- treePairPane.setLeftComponent(this.indexTreeScrollPane);
- initFSTree();
- this.fsTreeScrollPane = new JScrollPane(this.fsTree);
- this.fsTreeScrollPane.setBorder(grayLineBorder);
- treePairPane.setRightComponent(this.fsTreeScrollPane);
- // TitledBorder analysisResultBorder =
- // BorderFactory.createTitledBorder(emptyBorder, "Analysis Results");
- // treePairPane.setBorder(analysisResultBorder);
- this.textScrollPane = new JScrollPane(this.textArea);
- this.textScrollPane.setBorder(BorderFactory.createLineBorder(Color.gray, 1));
- // JPanel textAreaPanel = new JPanel();
- this.textTitleBorder = grayLineBorder;
- setFileStatusMessage();
- splitPane.setRightComponent(this.textScrollPane);
- try {
- loadProgramPreferences();
- } catch (IOException e) {
- handleException(e);
- }
- // Create menus after loading preferences to get code pages.
- this.setJMenuBar(createMenuBar());
- Style defaultStyle = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
- defaultStyle = StyleContext.getDefaultStyleContext().addStyle("defaultAnnot", defaultStyle);
- StyleConstants.setBackground(defaultStyle, selectionColor);
- this.styleMap.put(CAS.TYPE_NAME_ANNOTATION, defaultStyle);
- this.textPopup = new JPopupMenu();
- this.fsTree.addFocusListener(new TreeFocusHandler(this.fsTree));
- this.indexTree.addFocusListener(new TreeFocusHandler(this.indexTree));
- initKeyMap();
- // Does not work in Java 1.3
- // initFocusTraversalPolicy();
- initFileLists();
- setStatusbarMessage("Ready.");
- }
-
- private final void initFileLists() {
- int numFiles = this.textFileNameList.size();
- int max = numFiles < maxRecentSize ? numFiles : maxRecentSize;
- for (int i = 0; i < max; i++) {
- File file = new File(this.textFileNameList.get(i));
- this.recentTextFileMenu.add(createRecentTextFileItem(i + 1, file));
- this.recentTextFiles.appendFile(file);
- }
- numFiles = this.descFileNameList.size();
- max = numFiles < maxRecentSize ? numFiles : maxRecentSize;
- for (int i = 0; i < max; i++) {
- File file = new File(this.descFileNameList.get(i));
- this.recentDescFileMenu.add(createRecentDescFileItem(i + 1, file));
- this.recentDescFiles.appendFile(file);
- }
- }
-
- protected boolean setupAE(File aeFile) {
- try {
- ResourceManager rsrcMgr = null;
- if (this.dataPathName != null) {
- try {
- rsrcMgr = UIMAFramework.newDefaultResourceManager();
- rsrcMgr.setDataPath(this.dataPathName);
- } catch (MalformedURLException e) {
- StringBuffer msg = new StringBuffer();
- msg.append("Error setting data path in AE,\n");
- msg.append("data path contains invalid URL or file descriptor.\n");
- msg.append("You can still run the AE if it doesn't rely on the data path.\n");
- msg.append("Please correct the data path in the \"Run->Set data path\" menu.\n");
- handleException(e, msg);
- }
- }
-
- // Destroy old AE.
- if (this.ae != null) {
- destroyAe();
- this.acdItem.setEnabled(false);
- setEnableCasFileReadingAndWriting();
- this.tsViewerItem.setEnabled(false);
- this.reRunMenu.setEnabled(false);
- this.runOnCasMenuItem.setEnabled(false);
- }
-
- // get Resource Specifier from XML file
- XMLInputSource in = new XMLInputSource(aeFile);
- ResourceSpecifier specifier = UIMAFramework.getXMLParser().parseResourceSpecifier(in);
-
- // for debugging, output the Resource Specifier
- // System.out.println(specifier);
-
- // create Analysis Engine here
- if (rsrcMgr == null) {
- this.ae = UIMAFramework.produceAnalysisEngine(specifier);
- } else {
- this.ae = UIMAFramework.produceAnalysisEngine(specifier, rsrcMgr, null);
- }
- this.cas = this.ae.newCAS();
- initCas();
- this.acdItem.setEnabled(true);
- this.tsViewerItem.setEnabled(true);
- this.typeSystemWriteItem.setEnabled(true);
- setEnableCasFileReadingAndWriting();
- this.reRunMenu.setEnabled(true);
-
- // reset sofa combo box with just the initial view
- // this.disableSofaListener = true;
- this.sofaSelectionComboBox.removeAllItems();
- this.sofaSelectionComboBox.addItem(CAS.NAME_DEFAULT_SOFA);
- this.sofaSelectionPanel.setVisible(false);
- // this.disableSofaListener = false;
- MainFrame.this.updateIndexTree(true);
- } catch (Exception e) {
- handleException(e);
- return false;
- }
- return true;
- }
-
- private final void initCas() {
- this.cas.setDocumentLanguage(this.language);
- this.cas.setDocumentText(this.textArea.getText());
- }
-
- protected void internalRunAE(boolean doCasReset) {
- try {
- if (doCasReset) {
- // Change to Initial view
- this.cas = this.cas.getView(CAS.NAME_DEFAULT_SOFA);
- this.cas.reset();
- initCas();
- // this.disableSofaListener = true;
- this.sofaSelectionComboBox.setSelectedIndex(0);
- }
- this.lastRunProcessTrace = this.ae.process(this.cas);
- this.showPerfReportItem.setEnabled(true);
- this.log.log(Level.INFO, "Process trace of AE run:\n" + this.lastRunProcessTrace.toString());
- // Update sofacombobox here
- // this.disableSofaListener = true;
- int currentViewID = this.sofaSelectionComboBox.getSelectedIndex();
- this.sofaSelectionComboBox.removeAllItems();
- this.sofaSelectionComboBox.addItem(CAS.NAME_DEFAULT_SOFA);
- Iterator<?> sofas = ((CASImpl) MainFrame.this.cas).getBaseCAS().getSofaIterator();
- Feature sofaIdFeat = MainFrame.this.cas.getTypeSystem().getFeatureByFullName(
- CAS.FEATURE_FULL_NAME_SOFAID);
- boolean nonDefaultSofaFound = false;
- while (sofas.hasNext()) {
- SofaFS sofa = (SofaFS) sofas.next();
- String sofaId = sofa.getStringValue(sofaIdFeat);
- if (!CAS.NAME_DEFAULT_SOFA.equals(sofaId)) {
- this.sofaSelectionComboBox.addItem(sofaId);
- nonDefaultSofaFound = true;
- }
- }
- this.sofaSelectionComboBox.setSelectedIndex(currentViewID);
- // make sofa selector visible if any text sofa other than the
- // default was found
- this.sofaSelectionPanel.setVisible(nonDefaultSofaFound);
- } catch (Exception e) {
- handleException(e);
- } catch (Error e) {
- StringBuffer buf = new StringBuffer();
- buf.append("A severe error has occured:\n");
- handleException(e, buf);
- throw e;
- }
- }
-
- private void initIRTree() {
- DefaultMutableTreeNode root = new DefaultMutableTreeNode(noIndexReposLabel);
- DefaultTreeModel model = new DefaultTreeModel(root);
- this.indexTree = new JTree(model);
- this.indexTree.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 2));
- // Only one node can be selected at any one time.
- this.indexTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
- this.indexTree.addTreeSelectionListener(new IndexTreeSelectionListener(this));
- // No icons.
- DefaultTreeCellRenderer cellRenderer = new DefaultTreeCellRenderer();
- cellRenderer.setLeafIcon(null);
- // cellRenderer.setIcon(null);
- cellRenderer.setClosedIcon(null);
- cellRenderer.setOpenIcon(null);
- this.indexTree.setCellRenderer(cellRenderer);
- }
-
- private void initFSTree() {
- FSTreeModel treeModel = new FSTreeModel();
- this.fsTree = new JTree(treeModel);
- this.fsTree.addMouseListener(new StringFsPopupEventAdapter());
- this.fsTree.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 2));
- this.fsTree.setLargeModel(true);
- // Only one node can be selected at any one time.
- this.fsTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
- this.fsTree.addTreeSelectionListener(new FSTreeSelectionListener(this));
- DefaultTreeCellRenderer cellRenderer = new DefaultTreeCellRenderer();
- cellRenderer.setLeafIcon(null);
- // cellRenderer.setIcon(null);
- cellRenderer.setClosedIcon(null);
- cellRenderer.setOpenIcon(null);
- this.fsTree.setCellRenderer(cellRenderer);
- }
-
- private void deleteFSTree() {
- ((FSTreeModel) this.fsTree.getModel()).reset();
- }
-
- @SuppressWarnings("unchecked")
- public void updateIndexTree(boolean useCAS) {
- deleteFSTree();
- DefaultMutableTreeNode root = (DefaultMutableTreeNode) this.indexTree.getModel().getRoot();
- if (useCAS) {
- root.setUserObject(indexReposRootLabel);
- } else {
- root.setUserObject(noIndexReposLabel);
- }
- root.removeAllChildren();
- if (this.cas != null && useCAS) {
- FSIndexRepository ir = this.cas.getIndexRepository();
- Iterator<String> it = ir.getLabels();
- while (it.hasNext()) {
- String label = it.next();
- FSIndex index1 = ir.getIndex(label);
- IndexTreeNode nodeObj = new IndexTreeNode(label, index1.getType(), index1.size());
- DefaultMutableTreeNode node = new DefaultMutableTreeNode(nodeObj);
- root.add(node);
- node.add(createTypeTree(index1.getType(), this.cas.getTypeSystem(), label, ir));
- }
- }
- DefaultTreeModel model = (DefaultTreeModel) this.indexTree.getModel();
- // 1.3 workaround
- TreeModelListener[] listeners = org.apache.uima.tools.cvd.tsview.MainFrame
- .getTreeModelListeners(model);
- // TreeModelListener[] listeners = model.getTreeModelListeners();
- // System.out.println("Number of tree model listeners: " +
- // listeners.length);
- Object[] path = new Object[1];
- path[0] = root;
- TreeModelEvent event = new TreeModelEvent(root, path);
- for (int i = 0; i < listeners.length; i++) {
- listeners[i].treeStructureChanged(event);
- }
- }
-
- public void updateFSTree(String indexName, FSIndex index1) {
- FSTreeModel treeModel = (FSTreeModel) this.fsTree.getModel();
- treeModel.update(indexName, index1, this.cas);
- }
-
- private ArrayList<FSNode> getAnnotationsAtPos(int pos, List<FSNode> annots) {
- ArrayList<FSNode> res = new ArrayList<FSNode>();
- FSNode annot;
- final int max = annots.size();
- for (int i = 0; i < max; i++) {
- annot = annots.get(i);
- if (annot.getStart() > pos) {
- break;
- }
- if (annot.getEnd() >= pos) {
- res.add(annot);
- }
- }
- return res;
- }
-
- @SuppressWarnings("unchecked")
- private DefaultMutableTreeNode createTypeTree(Type type, TypeSystem ts, String label,
- FSIndexRepository ir) {
- int size = ir.getIndex(label, type).size();
- TypeTreeNode typeNode = new TypeTreeNode(type, label, size);
- DefaultMutableTreeNode node = new DefaultMutableTreeNode(typeNode);
- List<Type> types = ts.getDirectSubtypes(type);
- final int max = types.size();
- for (int i = 0; i < max; i++) {
- if (ir.getIndex(label, types.get(i)) == null) {
- continue;
- }
- DefaultMutableTreeNode child = createTypeTree(types.get(i), ts, label, ir);
- node.add(child);
- }
- return node;
- }
-
- private void loadProgramPreferences() throws IOException {
- if (this.iniFile == null) {
- File home = new File(System.getProperty("user.home"));
- this.iniFile = new File(home, "annotViewer.pref");
- }
- if (this.iniFile.exists() && this.iniFile.isFile() && this.iniFile.canRead()) {
- FileInputStream in = new FileInputStream(this.iniFile);
- this.preferences = new Properties();
- this.preferences.load(in);
- String fileOpenDirName = this.preferences.getProperty(textDirPref);
- if (fileOpenDirName != null) {
- this.fileOpenDir = new File(fileOpenDirName);
- }
- String aeOpenDirName = this.preferences.getProperty(aeDirPref);
- if (aeOpenDirName != null) {
- this.annotOpenDir = new File(aeOpenDirName);
- }
- String xcasOpenDirName = this.preferences.getProperty(xcasDirPref);
- if (xcasOpenDirName != null) {
- this.xcasFileOpenDir = new File(xcasOpenDirName);
- }
- String colorFileName = this.preferences.getProperty(colorFilePref);
- if (colorFileName != null) {
- this.colorSettingFile = new File(colorFileName);
- try {
- loadColorPreferences(this.colorSettingFile);
- } catch (IOException e) {
- handleException(e);
- }
- }
- String colorDirName = this.preferences.getProperty(colorDirPref);
- if (colorDirName != null) {
- this.colorSettingsDir = new File(colorDirName);
- }
- this.codePage = this.preferences.getProperty(cpCurrentPref);
- this.language = this.preferences.getProperty(langCurrentPref);
- this.languagePrefsList = this.preferences.getProperty(langListPref);
- this.dataPathName = this.preferences.getProperty(dataPathPref);
- }
- if (this.preferences == null) {
- this.textScrollPane.setPreferredSize(textDimensionDefault);
- this.fsTree.setPreferredSize(fsTreeDimensionDefault);
- } else {
- setPreferredSize(this.textScrollPane, textSizePref);
- setPreferredSize(this.indexTreeScrollPane, indexTreeSizePref);
- setPreferredSize(this.fsTreeScrollPane, fsTreeSizePref);
- }
- if (this.preferences != null) {
- List<String> list = stringToArrayList(this.preferences.getProperty(textFileListPref, ""));
- for (int i = 0; i < list.size(); i++) {
- this.textFileNameList.add(list.get(i));
- }
- list = stringToArrayList(this.preferences.getProperty(descFileListPref, ""));
- for (int i = 0; i < list.size(); i++) {
- this.descFileNameList.add(list.get(i));
- }
- }
- // System.out.println("Home dir: " + System.getProperty("user.home"));
- if (this.preferences == null) {
- this.preferences = new Properties();
- }
- }
-
- public void setPreferredSize(JComponent comp, String propPrefix) {
- // assert(comp != null);
- comp.setPreferredSize(getDimension(propPrefix));
- }
-
- public Dimension getDimension(String propPrefix) {
- if (this.preferences == null) {
- return null;
- }
- final String width = this.preferences.getProperty(propPrefix + widthSuffix);
- final String height = this.preferences.getProperty(propPrefix + heightSuffix);
- if (height == null || width == null) {
- return null;
- }
- double x = 0.0;
- double y = 0.0;
- try {
- x = Double.parseDouble(width);
- y = Double.parseDouble(height);
- } catch (NumberFormatException e) {
- handleException(e);
- return null;
- }
- Dimension d = new Dimension();
- d.setSize(x, y);
- return d;
- }
-
- private static final String stringListToString(List<String> list) {
- if (list.size() < 1) {
- return "";
- }
- StringBuffer buf = new StringBuffer();
- buf.append(list.get(0));
- for (int i = 1; i < list.size(); i++) {
- buf.append(',');
- buf.append(list.get(i));
- }
- return buf.toString();
- }
-
- private static final List<String> stringToArrayList(String s) {
- List<String> list = new ArrayList<String>();
- if (s.length() > 0) {
- StringTokenizer tok = new StringTokenizer(s, ",");
- while (tok.hasMoreTokens()) {
- list.add(tok.nextToken());
- }
- }
- return list;
- }
-
- public void saveProgramPreferences() throws IOException {
- // File open dialog preferences.
- if (this.preferences == null) {
- this.preferences = new Properties();
- }
- if (this.fileOpenDir != null) {
- this.preferences.setProperty(textDirPref, this.fileOpenDir.getAbsolutePath());
- }
- if (this.annotOpenDir != null) {
- this.preferences.setProperty(aeDirPref, this.annotOpenDir.getAbsolutePath());
- }
- if (this.xcasFileOpenDir != null) {
- this.preferences.setProperty(xcasDirPref, this.xcasFileOpenDir.getAbsolutePath());
- }
- // Window size preferences.
- Dimension d = this.textScrollPane.getSize();
- this.preferences.setProperty(textSizePref + widthSuffix, Double.toString(d.getWidth()));
- this.preferences.setProperty(textSizePref + heightSuffix, Double.toString(d.getHeight()));
- d = this.indexTreeScrollPane.getSize();
- this.preferences.setProperty(indexTreeSizePref + widthSuffix, Double.toString(d.getWidth()));
- this.preferences.setProperty(indexTreeSizePref + heightSuffix, Double.toString(d.getHeight()));
- d = this.fsTreeScrollPane.getSize();
- this.preferences.setProperty(fsTreeSizePref + widthSuffix, Double.toString(d.getWidth()));
- this.preferences.setProperty(fsTreeSizePref + heightSuffix, Double.toString(d.getHeight()));
- if (this.dataPathName != null) {
- this.preferences.setProperty(dataPathPref, this.dataPathName);
- }
- if (this.colorSettingFile != null) {
- this.preferences.setProperty(colorFilePref, this.colorSettingFile.getAbsolutePath());
- }
- if (this.colorSettingsDir != null) {
- this.preferences.setProperty(colorDirPref, this.colorSettingsDir.getAbsolutePath());
- }
- if (this.codePage != null) {
- this.preferences.setProperty(cpCurrentPref, this.codePage);
- }
- if (this.language != null) {
- this.preferences.setProperty(langCurrentPref, this.language);
- }
- if (this.languages != null && this.languages.size() > 0) {
- StringBuffer buf = new StringBuffer();
- buf.append(this.languages.get(0));
- for (int i = 1; i < this.languages.size(); i++) {
- buf.append(",");
- buf.append(this.languages.get(i));
- }
- this.preferences.setProperty(langListPref, buf.toString());
- }
- this.preferences.setProperty(textFileListPref, stringListToString(this.recentTextFiles
- .toStringList()));
- this.preferences.setProperty(descFileListPref, stringListToString(this.recentDescFiles
- .toStringList()));
- // Write out preferences to file.
- FileOutputStream out = new FileOutputStream(this.iniFile);
- this.preferences.store(out, "Automatically generated preferences file for Annotation Viewer");
- }
-
- public void saveColorPreferences(File file) throws IOException {
- Properties prefs1 = new Properties();
- Iterator<String> it = this.styleMap.keySet().iterator();
- String type;
- Style style;
- Color fg, bg;
- while (it.hasNext()) {
- type = it.next();
- style = this.styleMap.get(type);
- fg = StyleConstants.getForeground(style);
- bg = StyleConstants.getBackground(style);
- prefs1.setProperty(type, Integer.toString(fg.getRGB()) + "+" + Integer.toString(bg.getRGB()));
- }
- FileOutputStream out = new FileOutputStream(file);
- prefs1.store(out, "Color preferences for annotation viewer.");
- }
-
- public void loadColorPreferences(File file) throws IOException {
- Style parent = this.styleMap.get(CAS.TYPE_NAME_ANNOTATION);
- StyleContext sc = StyleContext.getDefaultStyleContext();
- Properties prefs1 = new Properties();
- FileInputStream in = new FileInputStream(file);
- prefs1.load(in);
- String typeName, value;
- Style style;
- Color color;
- int pos;
- Iterator<?> it = prefs1.keySet().iterator();
- while (it.hasNext()) {
- typeName = (String) it.next();
- value = prefs1.getProperty(typeName);
- style = sc.addStyle(typeName, parent);
- pos = value.indexOf('+');
- if (pos <= 0) {
- continue;
- }
- // Set foreground.
- color = new Color(Integer.parseInt(value.substring(0, pos)));
- StyleConstants.setForeground(style, color);
- // Set background.
- color = new Color(Integer.parseInt(value.substring(pos + 1, value.length())));
- StyleConstants.setBackground(style, color);
- this.styleMap.put(typeName, style);
- }
- }
-
- private void initKeyMap() {
- // Create a key map for focussing the index repository tree panel.
- Action focusIRAction = new FocusIRAction(this);
- String focusIRActionName = "focusIRAction";
- getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
- KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_MASK), focusIRActionName);
- getRootPane().getActionMap().put(focusIRActionName, focusIRAction);
- // Create a key map for focussing the FS tree panel.
- Action focusFSAction = new FocusFSAction(this);
- String focusFSActionName = "focusFSAction";
- getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
- KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK), focusFSActionName);
- getRootPane().getActionMap().put(focusFSActionName, focusFSAction);
- // Create a key map for focussing the text area.
- Action focusTextAction = new FocusTextAction(this);
- String focusTextActionName = "focusTextAction";
- getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
- KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_MASK), focusTextActionName);
- getRootPane().getActionMap().put(focusTextActionName, focusTextAction);
- // Create a key map for bringing up the text area context menu.
- Action textContextAction = new TextContextMenuAction(this);
- String textContextActionName = "textContextAction";
- this.textArea.getInputMap(JComponent.WHEN_FOCUSED).put(
- KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.ALT_MASK), textContextActionName);
- this.textArea.getActionMap().put(textContextActionName, textContextAction);
- }
-
- @SuppressWarnings("unchecked")
- public void showTextPopup(int x, int y) {
- final int pos = this.textArea.getCaretPosition();
- this.textPopup.removeAll();
- JMenuItem item = new JMenuItem("Position: " + pos);
- item.setEnabled(false);
- this.textPopup.add(item);
- FSNode posAnnot;
- if (this.isAnnotationIndex) {
- List<FSNode> annots = ((FSTreeModel) this.fsTree.getModel()).getFSs();
- ArrayList<FSNode> selAnnots = getAnnotationsAtPos(pos, annots);
- for (int i = 0; i < selAnnots.size(); i++) {
- posAnnot = selAnnots.get(i);
- item = new JMenuItem("[" + posAnnot.getArrayPos() + "] = " + posAnnot.getType().getName());
- item.addActionListener(new PopupHandler(this, posAnnot.getArrayPos()));
- this.textPopup.add(item);
- }
- }
- this.textPopup.show(this.textArea, x, y);
- }
-
- public JTree getIndexTree() {
- return this.indexTree;
- }
-
- public JTree getFsTree() {
- return this.fsTree;
- }
-
- public JTextArea getTextArea() {
- return this.textArea;
- }
-
- public CAS getCas() {
- return this.cas;
- }
-
- public boolean isDirty() {
- return this.isDirty;
- }
-
- public void setDirty(boolean isDirty) {
- this.isDirty = isDirty;
- }
-
- public Properties getPreferences() {
- return this.preferences;
- }
-
- public String getIndexLabel() {
- return this.indexLabel;
- }
-
- public FSIndex getIndex() {
- return this.index;
- }
-
- public Map<String, Style> getStyleMap() {
- return this.styleMap;
- }
-
- public AnalysisEngine getAe() {
- return this.ae;
- }
-
- public void setIndexLabel(String indexLabel) {
- this.indexLabel = indexLabel;
- }
-
- public boolean isAnnotationIndex() {
- return this.isAnnotationIndex;
- }
-
- public void setAnnotationIndex(boolean isAnnotationIndex) {
- this.isAnnotationIndex = isAnnotationIndex;
- }
-
- public void setIndex(FSIndex index) {
- this.index = index;
- }
-
- public void setAllAnnotationViewerItemEnable(boolean enabled) {
- this.allAnnotationViewerItem.setEnabled(enabled);
- }
-
- public File getFileOpenDir() {
- return this.fileOpenDir;
- }
-
- public void setFileOpenDir(File fileOpenDir) {
- this.fileOpenDir = fileOpenDir;
- }
-
- public File getTextFile() {
- return this.textFile;
- }
-
- public void setTextFile(File textFile) {
- this.textFile = textFile;
- }
-
- public void setSaveTextFileEnable(boolean enabled) {
- this.fileSaveItem.setEnabled(enabled);
- }
-
- public UndoMgr getUndoMgr() {
- return this.undoMgr;
- }
-
- public void setUndoEnabled(boolean enabled) {
- this.undoItem.setEnabled(enabled);
- }
-
- public File getXcasFileOpenDir() {
- return this.xcasFileOpenDir;
- }
-
- public void setXcasFileOpenDir(File xcasFileOpenDir) {
- this.xcasFileOpenDir = xcasFileOpenDir;
- }
-
- public void setCas(CAS cas) {
- this.cas = cas;
- }
-
- public void setRunOnCasEnabled() {
- // Enable the "Run on CAS" menu item when we have both an AE and a CAS.
- this.runOnCasMenuItem.setEnabled(this.ae != null && this.cas != null);
- }
-
- public void destroyAe() {
- this.cas = null;
- if (this.ae != null) {
- this.ae.destroy();
- this.ae = null;
- }
- }
-
- public void setRerunEnabled(boolean enabled) {
- this.reRunMenu.setEnabled(enabled);
- }
-
- public void setTypeSystemViewerEnabled(boolean enabled) {
- this.tsViewerItem.setEnabled(enabled);
- }
-
- public File getColorSettingsDir() {
- return this.colorSettingsDir;
- }
-
- public void setColorSettingsDir(File colorSettingsDir) {
- this.colorSettingsDir = colorSettingsDir;
- }
-
- public File getColorSettingFile() {
- return this.colorSettingFile;
- }
-
- public void setColorSettingFile(File colorSettingFile) {
- this.colorSettingFile = colorSettingFile;
- }
-
- public File getAnnotOpenDir() {
- return this.annotOpenDir;
- }
-
- public void setAnnotOpenDir(File annotOpenDir) {
- this.annotOpenDir = annotOpenDir;
- }
-
- public String getDataPathName() {
- return this.dataPathName;
- }
-
- public void setDataPathName(String dataPathName) {
- this.dataPathName = dataPathName;
- }
-
- public String getCodePage() {
- return this.codePage;
- }
-
- public void setCodePage(String codePage) {
- this.codePage = codePage;
- }
-
- public List<String> getCodePages() {
- return this.codePages;
- }
-
- public String getLanguage() {
- return this.language;
- }
-
- public void setLanguage(String language) {
- this.language = language;
- }
-
- public List<String> getLanguages() {
- return this.languages;
- }
-
- public String getLanguagePrefsList() {
- return this.languagePrefsList;
- }
-
- public void setLanguagePrefsList(String languagePrefsList) {
- this.languagePrefsList = languagePrefsList;
- }
-
- /**
- *
- */
- public void handleSofas() {
- // Populate sofa combo box with the names of all text
- // Sofas in the CAS
- String currentView = (String) this.sofaSelectionComboBox.getSelectedItem();
- this.sofaSelectionComboBox.removeAllItems();
- this.sofaSelectionComboBox.addItem(CAS.NAME_DEFAULT_SOFA);
- Iterator<?> sofas = ((CASImpl) getCas()).getBaseCAS().getSofaIterator();
- Feature sofaIdFeat = getCas().getTypeSystem()
- .getFeatureByFullName(CAS.FEATURE_FULL_NAME_SOFAID);
- boolean nonDefaultSofaFound = false;
- while (sofas.hasNext()) {
- SofaFS sofa = (SofaFS) sofas.next();
- String sofaId = sofa.getStringValue(sofaIdFeat);
- if (!CAS.NAME_DEFAULT_SOFA.equals(sofaId)) {
- this.sofaSelectionComboBox.addItem(sofaId);
- nonDefaultSofaFound = true;
- }
- }
- // reuse last selected view if found in new CAS
- int newIndex = 0;
- String newView = CAS.NAME_DEFAULT_SOFA;
- for (int i = 0; i < this.sofaSelectionComboBox.getItemCount(); i++) {
- if (currentView.equals(this.sofaSelectionComboBox.getItemAt(i))) {
- newIndex = i;
- newView = currentView;
- break;
- }
- }
- // make sofa selector visible if any text sofa other
- // than the default was found
- this.sofaSelectionPanel.setVisible(nonDefaultSofaFound);
- setCas(getCas().getView(newView));
-
- this.sofaSelectionComboBox.setSelectedIndex(newIndex);
- String text = getCas().getDocumentText();
- if (text == null) {
- text = getCas().getSofaDataURI();
- if (text != null) {
- text = "SofaURI = " + text;
- } else {
- if (getCas().getSofaDataArray() != null) {
- text = "Sofa array with mime type = " + getCas().getSofa().getSofaMime();
- }
- }
- }
- setText(text);
- if (text == null) {
- getTextArea().repaint();
- }
- }
-
- public boolean isExitOnClose() {
- return this.exitOnClose;
- }
-
- /**
- * Set exit-on-close behavior. Normally, CVD will shut down the JVM it's running in when it's main
- * window is being closed. Calling <code>setExitOnClose(false)</code> prevents that. It is then
- * the caller's task to shut down the JVM.
- *
- * @param exitOnClose
- */
- public void setExitOnClose(boolean exitOnClose) {
- this.exitOnClose = exitOnClose;
- }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.tools.cvd;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.HeadlessException;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.logging.LogManager;
+
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.JTree;
+import javax.swing.KeyStroke;
+import javax.swing.WindowConstants;
+import javax.swing.border.BevelBorder;
+import javax.swing.border.Border;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.Style;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.StyleContext;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeSelectionModel;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.FSIndex;
+import org.apache.uima.cas.FSIndexRepository;
+import org.apache.uima.cas.Feature;
+import org.apache.uima.cas.SofaFS;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.TypeSystem;
+import org.apache.uima.cas.impl.CASImpl;
+import org.apache.uima.cas.impl.XmiCasDeserializer;
+import org.apache.uima.internal.util.Timer;
+import org.apache.uima.resource.ResourceManager;
+import org.apache.uima.resource.ResourceSpecifier;
+import org.apache.uima.tools.cpm.PerformanceReportDialog;
+import org.apache.uima.tools.cvd.control.AboutHandler;
+import org.apache.uima.tools.cvd.control.AboutUimaHandler;
+import org.apache.uima.tools.cvd.control.AddLanguageHandler;
+import org.apache.uima.tools.cvd.control.AnnotatorOpenEventHandler;
+import org.apache.uima.tools.cvd.control.AnnotatorRerunEventHandler;
+import org.apache.uima.tools.cvd.control.AnnotatorRunOnCasEventHandler;
+import org.apache.uima.tools.cvd.control.CaretChangeHandler;
+import org.apache.uima.tools.cvd.control.CloseLogViewHandler;
+import org.apache.uima.tools.cvd.control.ColorPrefsOpenHandler;
+import org.apache.uima.tools.cvd.control.ColorPrefsSaveHandler;
+import org.apache.uima.tools.cvd.control.FSTreeSelectionListener;
+import org.apache.uima.tools.cvd.control.FileOpenEventHandler;
+import org.apache.uima.tools.cvd.control.FileSaveAsEventHandler;
+import org.apache.uima.tools.cvd.control.FileSaveEventHandler;
+import org.apache.uima.tools.cvd.control.FocusFSAction;
+import org.apache.uima.tools.cvd.control.FocusIRAction;
+import org.apache.uima.tools.cvd.control.FocusTextAction;
+import org.apache.uima.tools.cvd.control.HelpHandler;
+import org.apache.uima.tools.cvd.control.IndexPopupListener;
+import org.apache.uima.tools.cvd.control.IndexTreeSelectionListener;
+import org.apache.uima.tools.cvd.control.LoadRecentDescFileEventHandler;
+import org.apache.uima.tools.cvd.control.LoadRecentTextFileEventHandler;
+import org.apache.uima.tools.cvd.control.MainFrameClosing;
+import org.apache.uima.tools.cvd.control.ManualHandler;
+import org.apache.uima.tools.cvd.control.NewTextEventHandler;
+import org.apache.uima.tools.cvd.control.PopupHandler;
+import org.apache.uima.tools.cvd.control.PopupListener;
+import org.apache.uima.tools.cvd.control.RemoveLanguageHandler;
+import org.apache.uima.tools.cvd.control.RestoreLangDefaultsHandler;
+import org.apache.uima.tools.cvd.control.SetCodePageHandler;
+import org.apache.uima.tools.cvd.control.SetDataPathHandler;
+import org.apache.uima.tools.cvd.control.SetLanguageHandler;
+import org.apache.uima.tools.cvd.control.SetLogConfigHandler;
+import org.apache.uima.tools.cvd.control.ShowAnnotatedTextHandler;
+import org.apache.uima.tools.cvd.control.ShowAnnotationCustomizerHandler;
+import org.apache.uima.tools.cvd.control.ShowTypesystemHandler;
+import org.apache.uima.tools.cvd.control.SofaSelectionListener;
+import org.apache.uima.tools.cvd.control.SystemExitHandler;
+import org.apache.uima.tools.cvd.control.TextChangedListener;
+import org.apache.uima.tools.cvd.control.TextContextMenuAction;
+import org.apache.uima.tools.cvd.control.TextFocusHandler;
+import org.apache.uima.tools.cvd.control.TreeFocusHandler;
+import org.apache.uima.tools.cvd.control.TypeSystemFileOpenEventHandler;
+import org.apache.uima.tools.cvd.control.UndoMgr;
+import org.apache.uima.tools.cvd.control.XCASFileOpenEventHandler;
+import org.apache.uima.tools.cvd.control.XCASSaveHandler;
+import org.apache.uima.tools.cvd.control.XCASSaveTSHandler;
+import org.apache.uima.tools.cvd.control.XmiCasFileOpenHandler;
+import org.apache.uima.tools.cvd.control.XmiCasSaveHandler;
+import org.apache.uima.util.FileUtils;
+import org.apache.uima.util.Level;
+import org.apache.uima.util.Logger;
+import org.apache.uima.util.ProcessTrace;
+import org.apache.uima.util.XMLInputSource;
+
+/**
+ * Class comment for MainFrame.java goes here.
+ *
+ *
+ */
+public class MainFrame extends JFrame {
+
+ private static final long serialVersionUID = -1357410768440678886L;
+
+ public static List<Level> logLevels = new ArrayList<Level>(9);
+ static {
+ logLevels.add(Level.OFF);
+ logLevels.add(Level.SEVERE);
+ logLevels.add(Level.WARNING);
+ logLevels.add(Level.INFO);
+ logLevels.add(Level.CONFIG);
+ logLevels.add(Level.FINE);
+ logLevels.add(Level.FINER);
+ logLevels.add(Level.FINEST);
+ logLevels.add(Level.ALL);
+ }
+
+ private static final String loggerPropertiesFileName = "org/apache/uima/tools/annot_view/Logger.properties";
+
+ private static final String defaultText =
+ "Load or edit text here.";
+
+ private static final String titleText = "CAS Visual Debugger (CVD)";
+
+ static final String htmlGrayColor = "<font color=#808080>";
+
+ private static final String indexReposRootLabel = "<html><b>CAS Index Repository</b></html>";
+
+ private static final String noIndexReposLabel = "<html><b>" + htmlGrayColor
+ + "CAS Index Repository</b></html>";
+
+ // The content areas.
+ private JTextArea textArea;
+
+ private JTree indexTree;
+
+ private JTree fsTree;
+
+ private JPanel statusPanel;
+
+ private JTextField statusBar;
+
+ private JTextField fileStatus;
+
+ private JTextField aeStatus;
+
+ private JTextField caretStatus;
+
+ private Border textTitleBorder;
+
+ // Dirty flag for the editor.
+ private boolean isDirty;
+
+ // The scroll panels.
+ private JScrollPane textScrollPane;
+
+ private JScrollPane indexTreeScrollPane;
+
+ private JScrollPane fsTreeScrollPane;
+
+ // Menus
+ private JMenu fileMenu = null;
+
+ private JMenuItem fileSaveItem = null;
+
+ private JMenu editMenu;
+
+ private JMenuItem undoItem;
+
+ private UndoMgr undoMgr;
+
+ private Action cutAction;
+
+ private Action copyAction;
+
+ private JMenuItem allAnnotationViewerItem;
+
+ private JMenuItem acdItem;
+
+ private JMenuItem tsViewerItem;
+
+ private JMenuItem reRunMenu;
+
+ private JMenuItem runOnCasMenuItem;
+
+ private JMenuItem showPerfReportItem;
+
+ private JPopupMenu textPopup;
+
+ private JMenuItem xcasReadItem;
+
+ private JMenuItem xcasWriteItem;
+
+ private JMenuItem xmiCasReadItem;
+
+ private JMenuItem xmiCasWriteItem;
+
+ private JMenuItem typeSystemWriteItem;
+
+ private JMenuItem typeSystemReadItem;
+
+ private JMenu recentTextFileMenu;
+
+ private JMenu recentDescFileMenu;
+
+ // Ini file
+ private File iniFile = null;
+
+ // Code pages
+
+ private List<String> codePages = null;
+
+ private String codePage = null;
+
+ private JMenu cpMenu;
+
+ private ButtonGroup cpButtons;
+
+ // Language support
+ String languagePrefsList = null;
+
+ // private String defaultLanguagePref = null;
+ private List<String> languages = null;
+
+ private JMenu langMenu;
+
+ private ButtonGroup langButtons;
+
+ private static final String LANGUAGE_DEFAULT = "en";
+
+ private String language;
+
+ private static final String defaultLanguages = "de,en,fr,ja,ko-kr,pt-br,zh-cn,zh-tw,x-unspecified";
+
+ private File textFile = null;
+
+ private File fileOpenDir = null;
+
+ private File annotOpenDir = null;
+
+ private File xcasFileOpenDir = null;
+
+ private File colorSettingsDir = null;
+
+ // Selected index
+ private String indexLabel = null;
+
+ private FSIndex index = null;
+
+ private boolean isAnnotationIndex = false;
+
+ private CAS cas = null;
+
+ private File aeDescriptorFile = null;
+
+ private AnalysisEngine ae = null;
+
+ private File logFile = null;
+
+ private Logger log = null;
+
+ private File colorSettingFile;
+
+ private static final Color selectionColor = Color.orange;
+
+ private Properties preferences;
+
+ private ProcessTrace lastRunProcessTrace = null;
+
+ public static final String textDirPref = "dir.open.text";
+
+ public static final String aeDirPref = "dir.open.tae";
+
+ public static final String xcasDirPref = "dir.open.xcas";
+
+ public static final String textSizePref = "textArea.size";
+
+ public static final String indexTreeSizePref = "indexTree.size";
+
+ public static final String fsTreeSizePref = "fsTree.size";
+
+ public static final String tsWindowSizePref = "tsWindow.size";
+
+ public static final String annotViewSizePref = "annotViewWindow.size";
+
+ public static final String logViewSizePref = "logViewWindow.size";
+
+ public static final String widthSuffix = ".width";
+
+ public static final String heightSuffix = ".height";
+
+ private static final String colorFilePref = "colors.file";
+
+ private static final String colorDirPref = "colors.dir";
+
+ private static final String cpCurrentPref = "cp.selected";
+
+ private static final String langCurrentPref = "lang.selected";
+
+ private static final String langListPref = "lang.list";
+
+ private static final String textFileListPref = "file.text.list";
+
+ private static final String descFileListPref = "file.desc.list";
+
+ private static final String dataPathPref = "datapath";
+
+ private static final Dimension textDimensionDefault = new Dimension(500, 400);
+
+ private static final Dimension fsTreeDimensionDefault = new Dimension(200, 200);
+
+ private static final Dimension logFileDimensionDefault = new Dimension(500, 600);
+
+ public static final String DEFAULT_STYLE_NAME = "defaultStyle";
+
+ private Map<String, Style> styleMap = new HashMap<String, Style>();
+
+ // For recently used text and descriptor files.
+ private static final int maxRecentSize = 8;
+
+ private final RecentFilesList recentTextFiles = new RecentFilesList(maxRecentSize);
+
+ private final List<String> textFileNameList = new ArrayList<String>();
+
+ private final RecentFilesList recentDescFiles = new RecentFilesList(maxRecentSize);
+
+ private final List<String> descFileNameList = new ArrayList<String>();
+
+ // For cursor handling (busy cursor). Is there a better way?
[... 1743 lines stripped ...]