From 5b1303abd341cc6f1ddfd14c2099c60e99794274 Mon Sep 17 00:00:00 2001 From: Victor Häggqvist Date: Sun, 11 May 2014 20:35:02 +0200 Subject: maven move --- src/META-INF/MANIFEST.MF | 3 - src/com/snilius/xquery/AboutDialog.java | 129 --- src/com/snilius/xquery/FrameDisplayer.java | 50 - src/com/snilius/xquery/MacOSHandler.java | 77 -- src/com/snilius/xquery/Messages.java | 54 - src/com/snilius/xquery/QueryFrame.java | 1177 ------------------- src/com/snilius/xquery/QueryFrame.properties | 54 - src/com/snilius/xquery/XQuisitor.java | 89 -- .../java/com/snilius/xquery/FrameDisplayer.java | 50 + src/main/java/com/snilius/xquery/MacOSHandler.java | 84 ++ src/main/java/com/snilius/xquery/Messages.java | 59 + src/main/java/com/snilius/xquery/QueryFrame.java | 1181 ++++++++++++++++++++ src/main/java/com/snilius/xquery/XQuisitor.java | 87 ++ src/main/resources/QueryFrame.properties | 55 + src/packaging/Info.plist | 45 - src/packaging/JavaApplicationStub | Bin 27280 -> 0 bytes src/packaging/PkgInfo | 1 - 17 files changed, 1516 insertions(+), 1679 deletions(-) delete mode 100644 src/META-INF/MANIFEST.MF delete mode 100644 src/com/snilius/xquery/AboutDialog.java delete mode 100644 src/com/snilius/xquery/FrameDisplayer.java delete mode 100644 src/com/snilius/xquery/MacOSHandler.java delete mode 100644 src/com/snilius/xquery/Messages.java delete mode 100644 src/com/snilius/xquery/QueryFrame.java delete mode 100644 src/com/snilius/xquery/QueryFrame.properties delete mode 100644 src/com/snilius/xquery/XQuisitor.java create mode 100644 src/main/java/com/snilius/xquery/FrameDisplayer.java create mode 100644 src/main/java/com/snilius/xquery/MacOSHandler.java create mode 100644 src/main/java/com/snilius/xquery/Messages.java create mode 100644 src/main/java/com/snilius/xquery/QueryFrame.java create mode 100644 src/main/java/com/snilius/xquery/XQuisitor.java create mode 100644 src/main/resources/QueryFrame.properties delete mode 100644 src/packaging/Info.plist delete mode 100644 src/packaging/JavaApplicationStub delete mode 100644 src/packaging/PkgInfo diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF deleted file mode 100644 index b4a3011..0000000 --- a/src/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: com.snilius.xquery.XQuisitor - diff --git a/src/com/snilius/xquery/AboutDialog.java b/src/com/snilius/xquery/AboutDialog.java deleted file mode 100644 index 98fea2a..0000000 --- a/src/com/snilius/xquery/AboutDialog.java +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2003-2005 Elliotte Rusty Harold -// -// This file is part of XQuisitor. -// -// XQuisitor 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. -// -// XQuisitor 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 XQuisitor; if not, write to the - -// Free Software Foundation, Inc. -// 59 Temple Place, Suite 330 -// Boston, MA 02111-1307 -// USA -// -// In addition, as a special exception, Elliotte Rusty Harold gives -// permission to link the code of this program with the Saxon-B library (or -// with modified versions of Saxon-B that use the same license as Saxon-B), -// and distribute linked combinations including the two. You must obey the -// GNU General Public License in all respects for all of the code used other -// than Saxon-B. If you modify this file, you may extend this exception to -// your version of the file, but you are not obligated to do so. If you do -// not wish to do so, delete this exception statement from your version. - -package com.snilius.xquery; - -import java.awt.BorderLayout; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.LayoutManager; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextArea; -import javax.swing.text.JTextComponent; - -/** - * @author Elliotte Rusty Harold - * @version 1.0a5 - */ -class AboutDialog extends JDialog { - - AboutDialog(JFrame parent) { - super(parent, Messages.getString("About_XQuisitor_49")); - - this.getContentPane().setLayout(new BorderLayout()); - this.getContentPane().add(BorderLayout.CENTER, makeMainPane()); - this.getContentPane().add(BorderLayout.WEST, new JPanel()); - this.getContentPane().add(BorderLayout.EAST, new JPanel()); - - this.pack(); - this.setResizable(false); - this.setLocationRelativeTo(null); - } - - private static Font font = new Font("Dialog", Font.PLAIN, 12); - - - private JPanel makeMainPane() { - JPanel panel = new JPanel(); - panel.setLayout(new BorderLayout()); - panel.add( - BorderLayout.NORTH, - makeTopPane() - ); - JTextComponent information = new JTextArea(); - information.setText(Messages.getString("gpl")); - information.setEditable(false); - information.setBackground(this.getBackground()); - panel.add(BorderLayout.CENTER, information); - JPanel okPanel = new JPanel(); - okPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); - JButton ok = new JButton(Messages.getString("OK")); - ok.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - hide(); - dispose(); - } - }); - okPanel.add(ok); - getRootPane().setDefaultButton(ok); - panel.add(BorderLayout.SOUTH, okPanel); - - return panel; - } - - private JPanel makeTopPane() { - JPanel panel = new JPanel(); - LayoutManager layout = new GridLayout(8, 1); - panel.setLayout(layout); - panel.add(new JLabel()); - JLabel title = new JLabel("XQuisitor"); - panel.add(title); - - JLabel copyright = new JLabel("Copyright 2003-2005 Elliotte Rusty Harold"); - copyright.setFont(font); - panel.add(copyright); - - JLabel version = new JLabel("Version: 1.0a5"); - version.setFont(font); - panel.add(version); - - panel.add(new JLabel()); - - JLabel credits = new JLabel("Contains the Saxon-B XSLT Processor from Michael Kay"); - credits.setFont(font); - panel.add(credits); - - JLabel credits2 = new JLabel("http://saxon.sourceforge.net/"); - credits2.setFont(font); - panel.add(credits2); - - return panel; - } - -} diff --git a/src/com/snilius/xquery/FrameDisplayer.java b/src/com/snilius/xquery/FrameDisplayer.java deleted file mode 100644 index 6874b4f..0000000 --- a/src/com/snilius/xquery/FrameDisplayer.java +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2003 Elliotte Rusty Harold -// -// This file is part of XQuisitor. -// -// XQuisitor 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. -// -// XQuisitor 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 XQuisitor; if not, write to the -// Free Software Foundation, Inc. -// 59 Temple Place, Suite 330 -// Boston, MA 02111-1307 USA -// -// In addition, as a special exception, Elliotte Rusty Harold gives -// permission to link the code of this program with the Saxon-B library (or -// with modified versions of Saxon-B that use the same license as Saxon-B), -// and distribute linked combinations including the two. You must obey the -// GNU General Public License in all respects for all of the code used other -// than Saxon-B. If you modify this file, you may extend this exception to -// your version of the file, but you are not obligated to do so. If you do -// not wish to do so, delete this exception statement from your version. - -package com.snilius.xquery; - -import java.awt.Frame; - -/** - * For an explanation of this class see John Zukowski's artile at - * http://java.sun.com/developer/JDCTechTips/2003/tt1208.html - */ -class FrameDisplayer implements Runnable { - - private final Frame frame; - - public FrameDisplayer(Frame frame) { - this.frame = frame; - } - - public void run() { - frame.show(); - } - -} diff --git a/src/com/snilius/xquery/MacOSHandler.java b/src/com/snilius/xquery/MacOSHandler.java deleted file mode 100644 index 07bf757..0000000 --- a/src/com/snilius/xquery/MacOSHandler.java +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2004 Elliotte Rusty Harold -// -// This file is part of XQuisitor. -// -// XQuisitor 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. -// -// XQuisitor 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 XQuisitor; if not, write to the -// -// Free Software Foundation, Inc. -// 59 Temple Place, Suite 330 -// Boston, MA 02111-1307 -// USA -// -// In addition, as a special exception, Elliotte Rusty Harold gives -// permission to link the code of this program with the Saxon-B library (or -// with modified versions of Saxon-B that use the same license as Saxon-B), -// and distribute linked combinations including the two. You must obey the -// GNU General Public License in all respects for all of the code used other -// than Saxon-B. If you modify this file, you may extend this exception to -// your version of the file, but you are not obligated to do so. If you do -// not wish to do so, delete this exception statement from your version. - -package com.snilius.xquery; - -import java.awt.Dialog; -import java.awt.EventQueue; - -import com.apple.eawt.ApplicationAdapter; -import com.apple.eawt.ApplicationEvent; -import com.apple.eawt.Application; - -/** - * @author Elliotte Rusty Harold - * @version 1.0a5 - */ -public class MacOSHandler extends Application { - - private QueryFrame frame; - private Dialog about; - - // can I add a hiddenFrame of some kind to keep the - // menu bar onscreen???? - - public MacOSHandler(QueryFrame frame) { - this.frame = frame; - about = new AboutDialog(frame); - addApplicationListener(new AboutBoxHandler()); - } - - class AboutBoxHandler extends ApplicationAdapter { - // what else can I handle here???? - - public void handleAbout(ApplicationEvent event) { - EventQueue.invokeLater(new Runnable() { - public void run() { - about.show(); - } - }); - event.setHandled(true); - } - - public void handleQuit(ApplicationEvent event) { - frame.quit(); - } - - } - -} \ No newline at end of file diff --git a/src/com/snilius/xquery/Messages.java b/src/com/snilius/xquery/Messages.java deleted file mode 100644 index 6a6891e..0000000 --- a/src/com/snilius/xquery/Messages.java +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2003 Elliotte Rusty Harold -// -// This file is part of XQuisitor. -// -// XQuisitor 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. -// -// XQuisitor 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 XQuisitor; if not, write to the -// Free Software Foundation, Inc. -// 59 Temple Place, Suite 330 -// -// In addition, as a special exception, Elliotte Rusty Harold gives -// permission to link the code of this program with the Saxon-B library (or -// with modified versions of Saxon-B that use the same license as Saxon-B), -// and distribute linked combinations including the two. You must obey the -// GNU General Public License in all respects for all of the code used other -// than Saxon-B. If you modify this file, you may extend this exception to -// your version of the file, but you are not obligated to do so. If you do -// not wish to do so, delete this exception statement from your version. - -package com.snilius.xquery; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -/** - * @author Elliotte Rusty Harold - * @version 1.0a5 - */ -class Messages { - - private static final String BUNDLE_NAME = "com.snilius.xquery.QueryFrame"; - - private static final ResourceBundle RESOURCE_BUNDLE = - ResourceBundle.getBundle(BUNDLE_NAME); - - private Messages() {} - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} diff --git a/src/com/snilius/xquery/QueryFrame.java b/src/com/snilius/xquery/QueryFrame.java deleted file mode 100644 index f1e6d17..0000000 --- a/src/com/snilius/xquery/QueryFrame.java +++ /dev/null @@ -1,1177 +0,0 @@ -// Copyright 2003-2005 Elliotte Rusty Harold -// -// This file is part of XQuisitor. -// -// XQuisitor 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. -// -// XQuisitor 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 XQuisitor; if not, write to the -// -// Free Software Foundation, Inc. -// 59 Temple Place, Suite 330 -// Boston, MA 02111-1307 -// USA -// -// In addition, as a special exception, Elliotte Rusty Harold gives -// permission to link the code of this program with the Saxon-B library (or -// with modified versions of Saxon-B that use the same license as Saxon-B), -// and distribute linked combinations including the two. You must obey the -// GNU General Public License in all respects for all of the code used other -// than Saxon-B. If you modify this file, you may extend this exception to -// your version of the file, but you are not obligated to do so. If you do -// not wish to do so, delete this exception statement from your version. - -package com.snilius.xquery; - -import net.sf.saxon.Configuration; -import net.sf.saxon.om.DocumentInfo; -import net.sf.saxon.om.Item; -import net.sf.saxon.om.NodeInfo; -import net.sf.saxon.om.SequenceIterator; -import net.sf.saxon.query.DynamicQueryContext; -import net.sf.saxon.query.QueryResult; -import net.sf.saxon.query.StaticQueryContext; -import net.sf.saxon.query.XQueryExpression; -import net.sf.saxon.trans.XPathException; -import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; -import org.fife.ui.rsyntaxtextarea.SyntaxConstants; -import org.fife.ui.rtextarea.RTextScrollPane; -import org.xml.sax.InputSource; - -import javax.print.*; -import javax.print.attribute.HashPrintRequestAttributeSet; -import javax.print.attribute.PrintRequestAttributeSet; -import javax.swing.*; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; - -import javax.swing.text.DefaultEditorKit; -import javax.swing.text.JTextComponent; - -import javax.swing.undo.CannotRedoException; -import javax.swing.undo.CannotUndoException; -import javax.swing.undo.UndoManager; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Source; -import javax.xml.transform.TransformerException; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.stream.StreamResult; -import java.awt.*; -import java.awt.event.*; -import java.awt.print.PageFormat; -import java.awt.print.PrinterJob; -import java.io.*; -import java.net.URI; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; -import java.util.prefs.Preferences; - -/** - *

- * This is the primary class that implements most of the logic in - * XQuisitor. It represents an XQuisitor window and its menu bar. - *

- * - * @author Elliotte Rusty Harold - * @version 1.0a5 - * - */ -final class QueryFrame extends JFrame { - - // cut and paste menu items should be disabled when queryPane gets the focus???? - // add to CVS???? - // Write a French translation???? - // add and check accessibility???? - // is the GPL binding to Saxon a license problem? - - - //constants - private final int bottomOffset = 64; - private final String PRF_CONTEXT ="context"; - private final String PRF_BASEURI ="baseUri"; - - Preferences prefs = Preferences.userNodeForPackage(com.snilius.xquery.QueryFrame.class); - - private static int preferredMetaKey; - private static List openWindows = new LinkedList(); - - private RSyntaxTextArea queryArea = new RSyntaxTextArea(); - private RSyntaxTextArea outputArea = new RSyntaxTextArea(); - private RTextScrollPane rTextScrollPaneOutput; - - private JTextField contextField = new JTextField(24); - private JTextField baseField = new JTextField(24); - private JCheckBox doWrapping = new JCheckBox(Messages.getString("wrap")); - private JCheckBox doIndenting = new JCheckBox(Messages.getString("prettyPrint")); - private JCheckBox enableLineComments = new JCheckBox(Messages.getString("lineComment")); - private static Font display = new Font("Monospaced", Font.BOLD, 16); - private static Insets margin = new Insets(4, 3, 2, 4); - private UndoManager manager = new UndoManager(); - private JCheckBoxMenuItem wrapItem - = new JCheckBoxMenuItem(Messages.getString("wrap")); - private JCheckBoxMenuItem indentItem - = new JCheckBoxMenuItem(Messages.getString("prettyPrint")); - private JCheckBoxMenuItem commentItem = new JCheckBoxMenuItem(Messages.getString("lineComment")); - - private File queryFile = null; - private File contextFile; - private SequenceIterator queryResult; - private StaticQueryContext queryContext; - - private final static Properties prettyPrint = new Properties(); - private final static Properties uglyPrint = new Properties(); - final static boolean thisIsAMac = System.getProperty("mrj.version") != null; - - static { - prettyPrint.setProperty(OutputKeys.INDENT, "yes"); - preferredMetaKey = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); - } - - public QueryFrame() { - - super(Messages.getString("XQuisitor_5")); - if (thisIsAMac) new MacOSHandler(this); - this.setJMenuBar(makeMenuBar()); - - JSplitPane splitter = new JSplitPane(JSplitPane.VERTICAL_SPLIT, - makeQueryPanel(), - makeOutputPanel()); - this.getContentPane().add(splitter); - - loadPreferences(); - - Toolkit toolkit = this.getToolkit(); - Dimension screenSize = toolkit.getScreenSize(); - this.setSize(screenSize.width, screenSize.height-bottomOffset); - this.setLocation(0, 0); - - initQueryProcessor(); - - } - - private void loadPreferences() { - contextField.setText(prefs.get(PRF_CONTEXT,"")); - baseField.setText(prefs.get(PRF_BASEURI,getUserDir())); - } - - - private JPanel makeQueryPanel() { - - JPanel queryPanel = new JPanel(); - queryPanel.setLayout(new BorderLayout()); - queryArea.setTabSize(2); - queryArea.setCodeFoldingEnabled(true); - queryArea.getDocument().addUndoableEditListener(manager); - RTextScrollPane rTextScrollPane = new RTextScrollPane(queryArea); - - queryPanel.add(new JLabel(Messages.getString("Query_6")), BorderLayout.NORTH); - queryPanel.add(rTextScrollPane, BorderLayout.CENTER); - queryPanel.add(makeOptionsPanel(), BorderLayout.EAST); - return queryPanel; - - } - - - private JPanel makeOutputPanel() { - JPanel outputPanel = new JPanel(); - outputPanel.setLayout(new BorderLayout()); - outputPanel.add(new JLabel(Messages.getString("Query_Result_7")), BorderLayout.NORTH); - - outputArea.setCodeFoldingEnabled(true); - outputArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML); - outputArea.setTabSize(2); - outputArea.setCurrentLineHighlightColor(Color.WHITE); - - rTextScrollPaneOutput = new RTextScrollPane(outputArea); - - outputPanel.add(rTextScrollPaneOutput, BorderLayout.CENTER); - return outputPanel; - } - - private JPanel makeOptionsPanel() { - - JPanel options = new JPanel(); - GridBagLayout gbl = new GridBagLayout(); - options.setLayout(gbl); - - // It looks like each text field needs its own - // UndoManager which is active whenever that field has the focus. - // Otherwise, the undo crosses field boundaries???? - // baseField.getDocument().addUndoableEditListener(manager); - - JLabel baseLabel = new JLabel( - Messages.getString("Base_URI___9"), JLabel.LEFT); - baseLabel.setDisplayedMnemonic(KeyEvent.VK_B); - baseLabel.setLabelFor(baseField); - - JLabel chooserLabel = new JLabel( - Messages.getString("Context___10"), JLabel.LEFT); - chooserLabel.setDisplayedMnemonic(KeyEvent.VK_C); - chooserLabel.setLabelFor(contextField); - - // baseLabel - GridBagConstraints baseLabelConstraints = new GridBagConstraints(); - baseLabelConstraints.gridx=0; - baseLabelConstraints.gridy=0; - baseLabelConstraints.gridwidth=3; - baseLabelConstraints.gridheight=1; - baseLabelConstraints.anchor = GridBagConstraints.NORTHWEST; - baseLabelConstraints.insets = new Insets(0, 0, 0, 12); - gbl.setConstraints(baseLabel, baseLabelConstraints); - options.add(baseLabel); - - // baseField - GridBagConstraints baseFieldConstraints = new GridBagConstraints(); - baseFieldConstraints.anchor = GridBagConstraints.NORTHWEST; - baseFieldConstraints.gridx=3; - baseFieldConstraints.gridy=0; - baseFieldConstraints.gridwidth=4; - baseFieldConstraints.gridheight=1; - baseFieldConstraints.insets = new Insets(0, 0, 0, 6); - gbl.setConstraints(baseField, baseFieldConstraints); - options.add(baseField); - - // choose base - JButton chooseBase = new JButton(Messages.getString("..._11")); - GridBagConstraints chooseBaseConstraints = new GridBagConstraints(); - chooseBaseConstraints.anchor = GridBagConstraints.NORTHWEST; - chooseBaseConstraints.gridx=7; - chooseBaseConstraints.gridy=0; - chooseBaseConstraints.gridwidth=1; - chooseBaseConstraints.gridheight=1; - chooseBaseConstraints.insets = new Insets(0, 2, 2, 0); - gbl.setConstraints(chooseBase, chooseBaseConstraints); - options.add(chooseBase); - chooseBase.addActionListener(new BaseURIChooser()); - - // chooserLabel - GridBagConstraints chooserLabelConstraints = new GridBagConstraints(); - chooserLabelConstraints.gridx=0; - chooserLabelConstraints.gridy=1; - chooserLabelConstraints.gridwidth=3; - chooserLabelConstraints.gridheight=1; - chooserLabelConstraints.anchor = GridBagConstraints.NORTHWEST; - chooserLabelConstraints.insets = new Insets(0, 0, 0, 12); - gbl.setConstraints(chooserLabel, chooserLabelConstraints); - options.add(chooserLabel); - - - // contextField - // contextField.getDocument().addUndoableEditListener(manager); - GridBagConstraints contextFieldConstraints = new GridBagConstraints(); - contextFieldConstraints.anchor = GridBagConstraints.NORTHWEST; - contextFieldConstraints.gridx=3; - contextFieldConstraints.gridy=1; - contextFieldConstraints.gridwidth=4; - contextFieldConstraints.gridheight=1; - contextFieldConstraints.insets = new Insets(0, 0, 0, 6); - gbl.setConstraints(contextField, contextFieldConstraints); - options.add(contextField); - - // chooseFile button - JButton chooseFile = new JButton(Messages.getString("..._12")); - GridBagConstraints chooseFileConstraints = new GridBagConstraints(); - chooseFileConstraints.anchor = GridBagConstraints.NORTHWEST; - chooseFileConstraints.gridx=7; - chooseFileConstraints.gridy=1; - chooseFileConstraints.gridwidth=1; - chooseFileConstraints.gridheight=1; - chooseFileConstraints.insets = new Insets(0, 2, 2, 0); - gbl.setConstraints(chooseFile, chooseFileConstraints); - options.add(chooseFile); - chooseFile.addActionListener(new ContextChooser()); - - ItemListener redrawer = new NeedsSerialization(); - doWrapping.addItemListener(redrawer); - doWrapping.setMnemonic(KeyEvent.VK_W); - doIndenting.addItemListener(redrawer); - doIndenting.setMnemonic(KeyEvent.VK_P); - - // doWrapping checkbox - GridBagConstraints doWrappingConstraints = new GridBagConstraints(); - doWrappingConstraints.gridx=3; - doWrappingConstraints.gridy=2; - doWrappingConstraints.gridwidth=3; - doWrappingConstraints.gridheight=1; - doWrappingConstraints.anchor = GridBagConstraints.WEST; - gbl.setConstraints(doWrapping, doWrappingConstraints); - options.add(doWrapping); - - // doIndenting checkbox - GridBagConstraints doIndentingConstraints = new GridBagConstraints(); - doIndentingConstraints.gridx=3; - doIndentingConstraints.gridy=3; - doIndentingConstraints.gridwidth=2; - doIndentingConstraints.gridheight=1; - doWrappingConstraints.anchor = GridBagConstraints.WEST; - gbl.setConstraints(doIndenting, doIndentingConstraints); - doIndenting.setSelected(true); - options.add(doIndenting); - - GridBagConstraints enableLineCommentsConstraints = new GridBagConstraints(); - enableLineCommentsConstraints.gridx=3; - enableLineCommentsConstraints.gridy=4; - enableLineCommentsConstraints.gridwidth=3; - enableLineCommentsConstraints.gridheight=1; - gbl.setConstraints(enableLineComments,enableLineCommentsConstraints); - enableLineComments.setSelected(true); - options.add(enableLineComments); - - // executeButton - GridBagConstraints executeButtonConstraints = new GridBagConstraints(); - JButton executeButton = new JButton(Messages.getString("Run_Query_13")); - executeButton.addActionListener(new RunQuery()); - executeButtonConstraints.gridx=5; - executeButtonConstraints.gridy=5; - executeButtonConstraints.gridwidth=2; - executeButtonConstraints.gridheight=1; - executeButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; - executeButtonConstraints.insets = new Insets(17, 0, 0, 0); - gbl.setConstraints(executeButton, executeButtonConstraints); - options.add(executeButton); - - FieldFocusListener fieldFocusListenerContext = new FieldFocusListener("context"); - FieldFocusListener fieldFocusListenerBase = new FieldFocusListener("base"); - //register eventhandler for fields - contextField.addFocusListener(fieldFocusListenerContext); - baseField.addFocusListener(fieldFocusListenerBase); - - // baseField.set(KeyEvent.VK_B); - - JPanel master = new JPanel(); - master.add(options); - return master; - } - - private String getUserDir(){ - String userdir = System.getProperty("user.dir"); - String dir=""; - if (userdir != null) { - File baseDir = new File(userdir); - URI baseURI = baseDir.toURI(); - dir=baseURI.toASCIIString(); - } - return dir; - } - - - private void initQueryProcessor() { - Configuration config = new Configuration(); - config.setHostLanguage(Configuration.XQUERY); - queryContext = new StaticQueryContext(config); - - } - - - private JMenuBar makeMenuBar() { - JMenuBar jmb = new JMenuBar(); - jmb.add(makeFileMenu()); - jmb.add(makeEditMenu()); - jmb.add(makeQueryMenu()); - if (!thisIsAMac) jmb.add(makeHelpMenu()); - return jmb; - } - - - private JMenu makeFileMenu() { - - JMenu menu = new JMenu("File"); - menu.setMnemonic(KeyEvent.VK_F); - - JMenuItem newItem = new JMenuItem(Messages.getString("New_16")); - newItem.setMnemonic(KeyEvent.VK_N); - newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, preferredMetaKey)); - newItem.addActionListener(new NewListener()); - menu.add(newItem); - - JMenuItem openItem = new JMenuItem(Messages.getString("Open..._17")); - openItem.setMnemonic(KeyEvent.VK_O); - openItem.addActionListener(new OpenListener()); - openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, preferredMetaKey)); - menu.add(openItem); - - menu.addSeparator(); - - JMenuItem closeItem = new JMenuItem(Messages.getString("Close_18")); - closeItem.setMnemonic(KeyEvent.VK_C); - closeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, preferredMetaKey)); - closeItem.addActionListener(new CloseListener()); - menu.add(closeItem); - - menu.addSeparator(); - - JMenuItem saveItem = new JMenuItem(Messages.getString("Save_19")); - saveItem.setMnemonic(KeyEvent.VK_S); - saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, preferredMetaKey)); - saveItem.addActionListener(new SaveListener(queryArea, false)); - menu.add(saveItem); - - JMenuItem saveAsItem = new JMenuItem(Messages.getString("Save_As..._20")); - saveAsItem.setMnemonic(KeyEvent.VK_A); - saveAsItem.addActionListener(new SaveListener(queryArea, true)); - menu.add(saveAsItem); - - JMenuItem saveOutputItem = new JMenuItem(Messages.getString("Save_Query_Result..._21")); - saveOutputItem.setMnemonic(KeyEvent.VK_V); - saveOutputItem.addActionListener(new SaveListener(this.outputArea, true)); - menu.add(saveOutputItem); - - menu.addSeparator(); - - JMenuItem pageSetupItem = new JMenuItem(Messages.getString("Page_Setup..._22")); - pageSetupItem.setMnemonic(KeyEvent.VK_U); - pageSetupItem.addActionListener(new PageSetupListener()); - menu.add(pageSetupItem); - - JMenuItem printItem = new JMenuItem(Messages.getString("Print..._23")); - printItem.setMnemonic(KeyEvent.VK_P); - printItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, preferredMetaKey)); - printItem.addActionListener(new PrintListener(outputArea)); - menu.add(printItem); - - JMenuItem printQueryItem = new JMenuItem(Messages.getString("Print_Query..._24")); - printQueryItem.setMnemonic(KeyEvent.VK_Q); - printQueryItem.addActionListener(new PrintListener(queryArea)); - menu.add(printQueryItem); - - if (!thisIsAMac) { - // Mac OS X adds its own quit item - menu.addSeparator(); - - JMenuItem exitItem = new JMenuItem(Messages.getString("Exit_25")); - exitItem.setMnemonic(KeyEvent.VK_X); - exitItem.addActionListener(new ExitListener()); - menu.add(exitItem); - } - - return menu; - - } - - - private JMenu makeEditMenu() { - - JMenu menu = new JMenu(Messages.getString("Edit_26")); - menu.setMnemonic(KeyEvent.VK_E); - - JMenuItem undoItem = new JMenuItem(Messages.getString("Undo_27")); - undoItem.setMnemonic(KeyEvent.VK_U); - undoItem.setAccelerator(KeyStroke.getKeyStroke('Z', preferredMetaKey)); - undoItem.addActionListener(new UndoAction()); - menu.add(undoItem); - - JMenuItem redoItem = new JMenuItem(Messages.getString("Redo_28")); - redoItem.setMnemonic(KeyEvent.VK_R); - redoItem.setAccelerator(KeyStroke.getKeyStroke('Y', preferredMetaKey)); - redoItem.addActionListener(new RedoAction()); - menu.add(redoItem); - - menu.addSeparator(); - - JMenuItem cutItem = new JMenuItem(Messages.getString("Cut_29")); - cutItem.setMnemonic(KeyEvent.VK_C); - cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, preferredMetaKey)); - cutItem.addActionListener(queryArea.getActionMap().get(DefaultEditorKit.cutAction)); - menu.add(cutItem); - - JMenuItem copyItem = new JMenuItem(Messages.getString("Copy_30")); - copyItem.setMnemonic(KeyEvent.VK_O); - copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, preferredMetaKey)); - copyItem.addActionListener(queryArea.getActionMap().get(DefaultEditorKit.copyAction)); - menu.add(copyItem); - - JMenuItem pasteItem = new JMenuItem(Messages.getString("Paste_31")); - pasteItem.setMnemonic(KeyEvent.VK_P); - pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, preferredMetaKey)); - pasteItem.addActionListener(queryArea.getActionMap().get(DefaultEditorKit.pasteAction)); - menu.add(pasteItem); - - if (thisIsAMac) { - JMenuItem clearItem = new JMenuItem(Messages.getString("Clear_32")); - clearItem.setMnemonic(KeyEvent.VK_E); - // clearItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, ????)); - clearItem.setEnabled(false); // ???? - menu.add(clearItem); - } - - menu.addSeparator(); - - JMenuItem selectAllItem = new JMenuItem(Messages.getString("Select_All_33")); - selectAllItem.setMnemonic(KeyEvent.VK_A); - selectAllItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, preferredMetaKey)); - ActionListener selectAllAction = queryArea.getActionMap().get("select-all"); - selectAllItem.addActionListener(selectAllAction); - menu.add(selectAllItem); - - return menu; - } - - - private JMenu makeQueryMenu() { - - JMenu menu = new JMenu(Messages.getString("Query_6")); - menu.setMnemonic(KeyEvent.VK_Q); - - JMenuItem queryItem = new JMenuItem(Messages.getString("Run_Query_13")); - queryItem.setMnemonic(KeyEvent.VK_R); - queryItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, preferredMetaKey)); - queryItem.addActionListener(new RunQuery()); - menu.add(queryItem); - - menu.addSeparator(); - - JMenuItem baseItem = new JMenuItem(Messages.getString("setBaseURI")); - baseItem.setMnemonic(KeyEvent.VK_B); - baseItem.addActionListener(new BaseURIChooser()); - menu.add(baseItem); - - JMenuItem contextItem = new JMenuItem(Messages.getString("setContextNode")); - contextItem.setMnemonic(KeyEvent.VK_C); - contextItem.addActionListener(new ContextChooser()); - menu.add(contextItem); - - menu.addSeparator(); - - ActionListener changer = new NeedsSerialization(); - wrapItem.setMnemonic(KeyEvent.VK_W); - wrapItem.addActionListener(changer); - menu.add(wrapItem); - - indentItem.setMnemonic(KeyEvent.VK_P); - indentItem.addActionListener(changer); - menu.add(indentItem); - - commentItem.setMnemonic(KeyEvent.VK_L); - commentItem.addActionListener(changer); - - menu.add(commentItem); - - return menu; - } - - - private JMenu makeHelpMenu() { - - JMenu menu = new JMenu(Messages.getString("Help_35")); - menu.setMnemonic(KeyEvent.VK_H); - - JMenuItem aboutItem = new JMenuItem(Messages.getString("About_XQuisitor..._36")); - aboutItem.setMnemonic(KeyEvent.VK_A); - aboutItem.addActionListener(new AboutListener()); - menu.add(aboutItem); - // ???? - return menu; - } - - - public void show() { - openWindows.add(this); - super.show(); - } - - - public void hide() { - super.hide(); - openWindows.remove(this); - if (openWindows.isEmpty()) System.exit(0); - } - - - private class ContextChooser implements ActionListener { - - public void actionPerformed(ActionEvent evt) { - JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle(Messages.getString("Please_choose_context_document_or_directory__37")); - chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - if (contextFile != null) { - chooser.setCurrentDirectory(contextFile); - } - if (chooser.showOpenDialog(QueryFrame.this) == JFileChooser.APPROVE_OPTION) { - contextFile = new File( - chooser.getCurrentDirectory(), - chooser.getSelectedFile().getName() - ); - contextField.setText(contextFile.toURI().toString()); - saveContextField(); - } - - } - - } - - - private class CancelQuery implements ActionListener { - - private QueryThread t; - - CancelQuery(QueryThread t) { - this.t = t; - } - - public void actionPerformed(ActionEvent evt) { - t.userCancelled(); - } - - } - - private class BaseURIChooser implements ActionListener { - - private File uriFile; - - public void actionPerformed(ActionEvent e) { - JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle(Messages.getString("Please_choose_directory_that_sets_base_URI__38")); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - if (uriFile != null) chooser.setSelectedFile(uriFile); - else if (contextFile != null) chooser.setSelectedFile(contextFile); - if (chooser.showOpenDialog(QueryFrame.this) == JFileChooser.APPROVE_OPTION) { - uriFile = new File( - chooser.getCurrentDirectory(), - chooser.getSelectedFile().getName() - ); - baseField.setText(uriFile.toURI().toString()); - } - - } - - } - - private static String lineSeparator = System.getProperty("line.separator"); - - private class RunQuery implements ActionListener { - - public void actionPerformed(ActionEvent evt) { - Thread t = new QueryThread(queryArea.getText(), baseField.getText().trim()); - t.start(); - } - - } - - - private void performQuery(String query, String baseURI) - throws XPathException, TransformerException, IOException { - - if (enableLineComments.isSelected()) - query = parseLineComment(query); - - XQueryExpression exp = queryContext.compileQuery(query); - - if (null != baseURI && !"".equals(baseURI)) { - queryContext.setBaseURI(baseURI); - } - - DynamicQueryContext result = new DynamicQueryContext(queryContext.getConfiguration()); - // set context - String uri = contextField.getText().trim(); - if (null != uri && !("".equals(uri))) { - InputSource eis = new InputSource(uri); - Source sourceInput = new SAXSource(eis); - DocumentInfo doc = queryContext.buildDocument(sourceInput); - result.setContextNode(doc); - } - - queryResult = exp.iterator(result); - } - - /** - * Enabled line commenting with # as splitter - * @param query - * @return - */ - private String parseLineComment(String query){ - String[] temp = query.split("\\n"); - - StringBuilder sb = new StringBuilder(); - for (String line:temp){ - sb.append(line.split("#")[0]+"\n"); - } - - return sb.toString(); - } - - private class QueryThread extends Thread { - - private String query; - private String baseURI; - - QueryThread(String query, String baseURI) { - this.query = query; - this.baseURI = baseURI; - } - - synchronized void userCancelled() { - stop(); - // QueryProcessor may have been left in an inconsistent - // state, so reinitialize it - initQueryProcessor(); - hideProgressBar(); - } - - public void run() { - // should wait a second or two before popping up progress - // dialog in case it's a quick query???? use a Timer - showProgressBar(Messages.getString("Querying..._42")); - try { - performQuery(query, baseURI); - final String result = serialize(); - hideProgressBar(); - SwingUtilities.invokeLater( new Runnable() { - public void run() { - //rTextScrollPaneOutput.setAutoscrolls(false); - - outputArea.setText(result); - outputArea.setCaretPosition(1); - //TODO scroll to top - } - }); - }catch (IOException ex) { - hideProgressBar(); - JOptionPane.showMessageDialog(QueryFrame.this, - ex.getMessage(), Messages.getString("Error_while_executing_query_43"), - JOptionPane.ERROR_MESSAGE); - ex.printStackTrace(); - }catch (TransformerException ex) { - hideProgressBar(); - String lineInfo = Messages.getString("Error_on_line")+" "+ex.getLocator().getLineNumber()+ - ((ex.getLocator().getColumnNumber()!=-1)?" "+Messages.getString("column")+" "+ex.getLocator().getColumnNumber():""); - JOptionPane.showMessageDialog(QueryFrame.this,lineInfo+"\n"+ - ex.getMessage(), Messages.getString("Error_while_executing_query_43"), - JOptionPane.ERROR_MESSAGE); - ex.printStackTrace(); - } - - } - - private JDialog progress; - - private synchronized void showProgressBar(String message) { - - // arbitrary length - JProgressBar progressBar = new JProgressBar(0, 500); - progressBar.setValue(0); - progressBar.setIndeterminate(true); - progressBar.setString(Messages.getString("Querying..._45")); - - progress = new JDialog(QueryFrame.this, message, true); - progress.setResizable(false); - progress.getContentPane().setLayout(new GridLayout(3, 1)); - progress.getContentPane().add(BorderLayout.NORTH, progressBar); - JButton cancel = new JButton(Messages.getString("Cancel_46")); - cancel.addActionListener(new CancelQuery(this)); - - JPanel buttonPanel = new JPanel(); - buttonPanel.add(cancel); - progress.getContentPane().add(buttonPanel); - - progress.pack(); - progress.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); - progress.setLocationRelativeTo(null); - - // Need a modal dialog but don't want to block this thread - // when it's shown. - Thread dontBlockMe = new Thread(new Runnable() { - public void run() { - progress.show(); - } - }); - dontBlockMe.start(); - // need to make sure dontBlockMe shows the dialog - // before we continue. The dontBlockMe thread won't exit - // so check that the dialog is on the screen: - while (!(progress.isVisible())) { - try { - wait(50); - } - catch (InterruptedException ex) { - // try again - } - } - - } - - - private synchronized void hideProgressBar() { - progress.setVisible(false); - progress.dispose(); - } - - } - - /* private class LaunchProgressBar extends TimerTask { - - private QueryThread thread; - - public LaunchProgressBar(QueryThread thread) { - this.thread = thread; - } - - public void run() { - if (thread.isAlive()) { - showProgressBar("Querying...", thread); - } - } - - } */ - - private void turnOnWaitCursor() { - this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - } - - private void turnOffWaitCursor() { - this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - - private class NeedsSerialization - implements ActionListener, ItemListener, Runnable { - - public void itemStateChanged(ItemEvent evt) { - wrapItem.setState(doWrapping.isSelected()); - indentItem.setState(doIndenting.isSelected()); - commentItem.setSelected(enableLineComments.isSelected()); - startSerialize(); - } - - private void startSerialize() { - if (queryResult != null) { - Thread t = new Thread(this); - t.start(); - } - } - - public void run() { - try { - turnOnWaitCursor(); - final String result = serialize(); - SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - outputArea.setText(result); - } - }); - turnOffWaitCursor(); - } - catch (Exception ex) { - JOptionPane.showMessageDialog(QueryFrame.this, - ex.getMessage(), Messages.getString("Error_while_executing_query_43"), - JOptionPane.ERROR_MESSAGE); - } - } - - public void actionPerformed(ActionEvent evt) { - doWrapping.setSelected(wrapItem.getState()); - doIndenting.setSelected(indentItem.getState()); - enableLineComments.setSelected(commentItem.getState()); - startSerialize(); - } - - } - - - private String serialize() - throws TransformerException, XPathException, IOException { - StringWriter out = new StringWriter(); - - Properties indent; - if (doIndenting.isSelected()) { - indent = prettyPrint; - } - else { - indent = uglyPrint; - } - - // reset a copy of the results - SequenceIterator queryResult = this.queryResult.getAnother(); - - if (doWrapping.isSelected()) { - DocumentInfo resultDoc = QueryResult.wrap(queryResult, queryContext.getConfiguration()); - QueryResult.serialize(resultDoc, new StreamResult(out), indent, queryContext.getConfiguration()); - } - else { - while (true) { - Item next = queryResult.next(); - if (next == null) break; - // Check if item is a NodeInfo or a something else - // if (Type.isNodeType(next.getItemType())) { - QueryResult.serialize((NodeInfo) next, new StreamResult(out), indent, queryContext.getConfiguration()); - // This only works for document and element nodes???? - // Will this be improved in future Saxon's? if so - // this is all I need, and don't need to write my own. - /*} - else { - out.write(next.toString()); */ - // what about things where toString() is not - // a string representation; e.g. hexBinary or Date???? - // it appears the date time values are a special problem - /*net.sf.saxon.value.DateValue@c9290c78 - net.sf.saxon.value.TimeValue@6c76f794 - net.sf.saxon.value.GYearMonthValue@30283c79 - net.sf.saxon.value.GYearValue@781c3472*/ - // can I get the string value of any of these???? - - // } - out.write(lineSeparator); - } - } - out.flush(); - out.close(); - return out.toString(); - } - - private class AboutListener implements ActionListener { - - public void actionPerformed(ActionEvent evt) { - JDialog dialog = new AboutDialog(QueryFrame.this); - dialog.show(); - } - - } - - private class OpenListener implements ActionListener { - - public void actionPerformed(ActionEvent e) { - JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle(Messages.getString("Please_choose_query_file__50")); - if (chooser.showOpenDialog(QueryFrame.this) == JFileChooser.APPROVE_OPTION) { - File selected = chooser.getSelectedFile(); - try { - // stuff file in query box - Reader reader = new FileReader(selected); - reader = new BufferedReader(reader); - StringBuffer sb = new StringBuffer(); - for (int c = reader.read(); c != -1; c = reader.read()) { - sb.append((char) c); - } - outputArea.setText(sb.toString()); - queryFile = selected; - } - catch (IOException ex) { - JOptionPane.showMessageDialog(QueryFrame.this, - ex.getMessage(), - Messages.getString("I/O_Error_while_reading_query_51"), - JOptionPane.ERROR_MESSAGE); - } - } - - } - - } - - private class NewListener implements ActionListener { - - public void actionPerformed(ActionEvent evt) { - JFrame frame = new QueryFrame(); - // Is this really necessary since we're in the - // event queue/AWT thread already???? - Runnable runner = new FrameDisplayer(frame); - EventQueue.invokeLater(runner); - } - - } - - private class ExitListener implements ActionListener { - - public void actionPerformed(ActionEvent evt) { - quit(); - } - - } - - void quit() { - // need to adjust this on the Mac so you don't exit - // after last window closes???? - while (!(openWindows.isEmpty())) { - QueryFrame frame = (QueryFrame) openWindows.get(0); - frame.hide(); - } - } - - private void saveContextField(){ - prefs.put(PRF_CONTEXT, contextField.getText().trim()); - System.out.println("'" + contextField.getText().trim() + "'"); - System.out.println("context save"); - } - - private class CloseListener implements ActionListener { - - public void actionPerformed(ActionEvent evt) { - QueryFrame.this.hide(); - } - - } - - private class SaveListener implements ActionListener { - - private JTextComponent text; - private boolean saveAs; - - SaveListener(JTextComponent text, boolean saveAs) { - this.saveAs = saveAs; - this.text = text; - } - - public void actionPerformed(ActionEvent evt) { - JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle(Messages.getString("Save_query_to___52")); - if (contextFile != null) chooser.setSelectedFile(contextFile); // ???? - - saveFile(chooser); - } - - private void saveFile(JFileChooser chooser) { - - File outputFile = queryFile; - if ((outputFile == null || saveAs) && - chooser.showSaveDialog(text) == JFileChooser.APPROVE_OPTION) { - outputFile = new File( - chooser.getCurrentDirectory(), - chooser.getSelectedFile().getName() - ); - if (outputFile.exists()) { - int choice = JOptionPane.showConfirmDialog(text, - Messages.getString("Overwrite_file__53") - + outputFile.getName() - + Messages.getString("QuestionMark__54")); - if (choice == JOptionPane.CANCEL_OPTION) { - chooser.setVisible(false); - return; - } - else if (choice == JOptionPane.NO_OPTION) { - saveFile(chooser); - } - } - } - if (outputFile != null) { - try { - OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile)); - Writer writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); - String data = text.getText(); - writer.write(data); - writer.flush(); - writer.close(); - queryFile = outputFile; - } - catch (IOException ex) { - JOptionPane.showMessageDialog(text, - ex.getMessage(), - Messages.getString("I/O_Error_while_saving_data_56"), - JOptionPane.ERROR_MESSAGE); - } - } - } - - } - - private class UndoAction extends AbstractAction { - - public void actionPerformed(ActionEvent evt) { - try { - manager.undo(); - } - catch (CannotUndoException ex) { - getToolkit().beep(); - } - } - - - } - - private class RedoAction extends AbstractAction { - - public void actionPerformed(ActionEvent evt) { - try { - manager.redo(); - } - catch (CannotRedoException ex) { - getToolkit().beep(); - } - } - - } - - - private PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); - - private class PrintListener implements ActionListener { - - private JTextComponent source; - - PrintListener(JTextComponent source) { - this.source = source; - } - - public void actionPerformed(ActionEvent evt) { - - String data = source.getText(); - - DocFlavor myFormat = DocFlavor.STRING.TEXT_PLAIN; - Doc myDoc = new SimpleDoc(data, myFormat, null); - PrinterJob dialog = PrinterJob.getPrinterJob(); - if (!dialog.printDialog(attributes)) return; - - // landscape printing is flaky???? - PrintService[] services = PrintServiceLookup.lookupPrintServices(myFormat, attributes); - if (services.length > 0) { - DocPrintJob job = services[0].createPrintJob(); - try { - job.print(myDoc, attributes); - } - catch (PrintException ex) { - JOptionPane.showMessageDialog(QueryFrame.this, - ex.getMessage(), - Messages.getString("Printing_error_57"), - JOptionPane.ERROR_MESSAGE); - } - } - else { - JOptionPane.showMessageDialog(QueryFrame.this, - Messages.getString("Could_not_locate_a_printer._58"), - Messages.getString("Printing_error_57"), - JOptionPane.ERROR_MESSAGE); - } - - } - - } - - private class PageSetupListener implements ActionListener { - - public void actionPerformed(ActionEvent evt) { - PrinterJob job = PrinterJob.getPrinterJob(); - PageFormat result = job.pageDialog(attributes); - if (result == null) { // user canceled - return; - } - - } - - } - - private class FieldFocusListener extends FocusAdapter { - private String who; - - public FieldFocusListener(String who) { - this.who = who; - } - - @Override - public void focusLost(FocusEvent e) { - if (who.equals("base")) { - prefs.get(PRF_BASEURI,baseField.getText()); - }else if (who.equals("context")){ - saveContextField(); - } - System.out.println("Save stuff for next time"); - } - } - -} - - diff --git a/src/com/snilius/xquery/QueryFrame.properties b/src/com/snilius/xquery/QueryFrame.properties deleted file mode 100644 index 9d3025f..0000000 --- a/src/com/snilius/xquery/QueryFrame.properties +++ /dev/null @@ -1,54 +0,0 @@ -OK=OK -Wrap_output_1=Wrap output -Pretty_print_output_2=Pretty print output -wrap=Wrap -prettyPrint=Pretty Print -lineComment=Line comments with # -setBaseURI=Set Base URI... -setContextNode=Set Context Document... -XQuisitor_5=XQuisitor2 -Query_6=Query -Query_Result_7=Query Result -Base_URI___9=Base URI: -Context___10=Context: -..._11=... -..._12=... -Run_Query_13=Run Query -New_16=New -Open..._17=Open... -Close_18=Close -Save_19=Save -Save_As..._20=Save As... -Save_Query_Result..._21=Save Query Result... -Page_Setup..._22=Page Setup... -Print..._23=Print... -Print_Query..._24=Print Query... -Exit_25=Exit -Edit_26=Edit -Undo_27=Undo -Redo_28=Redo -Cut_29=Cut -Copy_30=Copy -Paste_31=Paste -Clear_32=Clear -Select_All_33=Select All -Help_35=Help -About_XQuisitor..._36=About XQuisitor... -Please_choose_context_document_or_directory__37=Please choose context document or directory: -Please_choose_directory_that_sets_base_URI__38=Please choose directory that sets base URI: -Querying..._42=Querying... -Error_while_executing_query_43=Error while executing query -Querying..._45=Querying... -Cancel_46=Cancel -About_XQuisitor_49=About XQuisitor -Please_choose_query_file__50=Please choose query file: -I/O_Error_while_reading_query_51=I/O Error while reading query -Save_query_to___52=Save query to: -Overwrite_file__53=Overwrite file -QuestionMark__54=? -I/O_Error_while_saving_data_56=I/O Error while saving data -Printing_error_57=Printing error -Could_not_locate_a_printer._58=Could not locate a printer. -gpl=XQuisitor2 is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published \nby the Free Software Foundation; either version 2 of the License, \nor (at your option) any later version.\n\nXQuisitor is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with XQuisitor; if not, write to the\n\nFree Software Foundation, Inc. \n59 Temple Place, Suite 330\nBoston, MA 02111-1307\nUSA -Error_on_line=Error on line -column=column \ No newline at end of file diff --git a/src/com/snilius/xquery/XQuisitor.java b/src/com/snilius/xquery/XQuisitor.java deleted file mode 100644 index f56a41d..0000000 --- a/src/com/snilius/xquery/XQuisitor.java +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2003, 2004 Elliotte Rusty Harold -// -// This file is part of XQuisitor. -// -// XQuisitor 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. -// -// XQuisitor 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 XQuisitor; if not, write to the -// -// Free Software Foundation, Inc. -// 59 Temple Place, Suite 330 -// Boston, MA 02111-1307 USA -// -// In addition, as a special exception, Elliotte Rusty Harold gives -// permission to link the code of this program with the Saxon-B library (or -// with modified versions of Saxon-B that use the same license as Saxon-B), -// and distribute linked combinations including the two. You must obey the -// GNU General Public License in all respects for all of the code used other -// than Saxon-B. If you modify this file, you may extend this exception to -// your version of the file, but you are not obligated to do so. If you do -// not wish to do so, delete this exception statement from your version. - -package com.snilius.xquery; - -import java.awt.EventQueue; - -import javax.swing.JOptionPane; -import javax.swing.UIManager; - -/** - *

- * The driver program for XQuisitor. - *

- * - * @author Elliotte Rusty Harold - * @version 1.0a5 - */ -class XQuisitor { - // write a shell script to launch it???? - - - public static void main(String[] args) { - - initAppleProperties(); - - try { - UIManager.setLookAndFeel( - UIManager.getSystemLookAndFeelClassName()); - } - catch (Exception ex) { - // no big deal; just use Metal - } - - try { - - QueryFrame frame = new QueryFrame(); - Runnable runner = new FrameDisplayer(frame); - EventQueue.invokeLater(runner); - } - catch (NoClassDefFoundError ex) { - if (ex.getMessage().indexOf("saxon") != -1) { - JOptionPane.showMessageDialog(null, - "Saxon 8 is not in the CLASSPATH. (Try using -Xbootclasspath/p:)" - ); - } - else { - ex.printStackTrace(); - } - System.exit(1); - } - - } - - private static void initAppleProperties() { - // see http://developer.apple.com/documentation/ReleaseNotes/Java/java141/system_properties/chapter_4_section_3.html - System.setProperty("apple.laf.useScreenMenuBar", "true"); - System.setProperty("com.apple.mrj.application.apple.menu.about.name", "XQuisitor"); - System.setProperty("apple.awt.showGrowBox", "true"); - } - -} diff --git a/src/main/java/com/snilius/xquery/FrameDisplayer.java b/src/main/java/com/snilius/xquery/FrameDisplayer.java new file mode 100644 index 0000000..cd9da75 --- /dev/null +++ b/src/main/java/com/snilius/xquery/FrameDisplayer.java @@ -0,0 +1,50 @@ +// Copyright 2003 Elliotte Rusty Harold +// Copyright 2013-2014 Victor Häggqvist +// This file is part of XQuisitor. +// +// XQuisitor 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. +// +// XQuisitor 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 XQuisitor; if not, write to the +// Free Software Foundation, Inc. +// 59 Temple Place, Suite 330 +// Boston, MA 02111-1307 USA +// +// In addition, as a special exception, Elliotte Rusty Harold gives +// permission to link the code of this program with the Saxon-B library (or +// with modified versions of Saxon-B that use the same license as Saxon-B), +// and distribute linked combinations including the two. You must obey the +// GNU General Public License in all respects for all of the code used other +// than Saxon-B. If you modify this file, you may extend this exception to +// your version of the file, but you are not obligated to do so. If you do +// not wish to do so, delete this exception statement from your version. + +package com.snilius.xquery; + +import java.awt.Frame; + +/** + * For an explanation of this class see John Zukowski's artile at + * http://java.sun.com/developer/JDCTechTips/2003/tt1208.html + */ +class FrameDisplayer implements Runnable { + + private final Frame frame; + + public FrameDisplayer(Frame frame) { + this.frame = frame; + } + + public void run() { + frame.show(); + } + +} diff --git a/src/main/java/com/snilius/xquery/MacOSHandler.java b/src/main/java/com/snilius/xquery/MacOSHandler.java new file mode 100644 index 0000000..2332c46 --- /dev/null +++ b/src/main/java/com/snilius/xquery/MacOSHandler.java @@ -0,0 +1,84 @@ +// Copyright 2004 Elliotte Rusty Harold +// Copyright 2013-2014 Victor Häggqvist +// +// This file is part of XQuisitor. +// +// XQuisitor 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. +// +// XQuisitor 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 XQuisitor; if not, write to the +// +// Free Software Foundation, Inc. +// 59 Temple Place, Suite 330 +// Boston, MA 02111-1307 +// USA +// +// In addition, as a special exception, Elliotte Rusty Harold gives +// permission to link the code of this program with the Saxon-B library (or +// with modified versions of Saxon-B that use the same license as Saxon-B), +// and distribute linked combinations including the two. You must obey the +// GNU General Public License in all respects for all of the code used other +// than Saxon-B. If you modify this file, you may extend this exception to +// your version of the file, but you are not obligated to do so. If you do +// not wish to do so, delete this exception statement from your version. + +package com.snilius.xquery; + +import java.awt.Dialog; +import java.awt.EventQueue; + +import com.apple.eawt.ApplicationAdapter; +import com.apple.eawt.ApplicationEvent; +import com.apple.eawt.Application; + +import javax.swing.*; + +/** + * @author Elliotte Rusty Harold + * @version 1.0a5 + * + * @author Victor Häggqvist + * @since 2013-12-18 + * @version 2.0 + */ +public class MacOSHandler extends Application { + + private QueryFrame frame; + private JFrame about; + + // can I add a hiddenFrame of some kind to keep the + // menu bar onscreen???? + + public MacOSHandler(QueryFrame frame) { + this.frame = frame; + about = new AboutDialog(); + addApplicationListener(new AboutBoxHandler()); + } + + class AboutBoxHandler extends ApplicationAdapter { + // what else can I handle here???? + + public void handleAbout(ApplicationEvent event) { + EventQueue.invokeLater(new Runnable() { + public void run() { + about.show(); + } + }); + event.setHandled(true); + } + + public void handleQuit(ApplicationEvent event) { + frame.quit(); + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/snilius/xquery/Messages.java b/src/main/java/com/snilius/xquery/Messages.java new file mode 100644 index 0000000..02ade7f --- /dev/null +++ b/src/main/java/com/snilius/xquery/Messages.java @@ -0,0 +1,59 @@ +// Copyright 2003 Elliotte Rusty Harold +// Copyright 2013-2014 Victor Häggqvist +// +// This file is part of XQuisitor. +// +// XQuisitor 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. +// +// XQuisitor 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 XQuisitor; if not, write to the +// Free Software Foundation, Inc. +// 59 Temple Place, Suite 330 +// +// In addition, as a special exception, Elliotte Rusty Harold gives +// permission to link the code of this program with the Saxon-B library (or +// with modified versions of Saxon-B that use the same license as Saxon-B), +// and distribute linked combinations including the two. You must obey the +// GNU General Public License in all respects for all of the code used other +// than Saxon-B. If you modify this file, you may extend this exception to +// your version of the file, but you are not obligated to do so. If you do +// not wish to do so, delete this exception statement from your version. + +package com.snilius.xquery; + +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +/** + * @author Elliotte Rusty Harold + * @version 1.0a5 + * + * @author Victor Häggqvist + * @since 2013-12-18 + * @version 2.0 + */ +class Messages { + + private static final String BUNDLE_NAME = "QueryFrame"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME,Locale.ENGLISH); + + private Messages() { } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/src/main/java/com/snilius/xquery/QueryFrame.java b/src/main/java/com/snilius/xquery/QueryFrame.java new file mode 100644 index 0000000..eb02396 --- /dev/null +++ b/src/main/java/com/snilius/xquery/QueryFrame.java @@ -0,0 +1,1181 @@ +// Copyright 2003-2005 Elliotte Rusty Harold +// Copyright 2013-2014 Victor Häggqvist +// +// This file is part of XQuisitor. +// +// XQuisitor 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. +// +// XQuisitor 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 XQuisitor; if not, write to the +// +// Free Software Foundation, Inc. +// 59 Temple Place, Suite 330 +// Boston, MA 02111-1307 +// USA +// +// In addition, as a special exception, Elliotte Rusty Harold gives +// permission to link the code of this program with the Saxon-B library (or +// with modified versions of Saxon-B that use the same license as Saxon-B), +// and distribute linked combinations including the two. You must obey the +// GNU General Public License in all respects for all of the code used other +// than Saxon-B. If you modify this file, you may extend this exception to +// your version of the file, but you are not obligated to do so. If you do +// not wish to do so, delete this exception statement from your version. + +package com.snilius.xquery; + +import net.sf.saxon.Configuration; +import net.sf.saxon.om.DocumentInfo; +import net.sf.saxon.om.Item; +import net.sf.saxon.om.NodeInfo; +import net.sf.saxon.om.SequenceIterator; +import net.sf.saxon.query.DynamicQueryContext; +import net.sf.saxon.query.QueryResult; +import net.sf.saxon.query.StaticQueryContext; +import net.sf.saxon.query.XQueryExpression; +import net.sf.saxon.trans.XPathException; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; +import org.fife.ui.rsyntaxtextarea.SyntaxConstants; +import org.fife.ui.rtextarea.RTextScrollPane; +import org.xml.sax.InputSource; + +import javax.print.*; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.swing.*; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; + +import javax.swing.text.DefaultEditorKit; +import javax.swing.text.JTextComponent; + +import javax.swing.undo.CannotRedoException; +import javax.swing.undo.CannotUndoException; +import javax.swing.undo.UndoManager; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.TransformerException; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamResult; +import java.awt.*; +import java.awt.event.*; +import java.awt.print.PageFormat; +import java.awt.print.PrinterJob; +import java.io.*; +import java.net.URI; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import java.util.prefs.Preferences; + +/** + *

+ * This is the primary class that implements most of the logic in + * XQuisitor. It represents an XQuisitor window and its menu bar. + *

+ * + * @author Elliotte Rusty Harold + * @version 1.0a5 + * + * @author Victor Häggqvist + * @since 2013-12-18 + * @version 2.0 + */ +final class QueryFrame extends JFrame { + + // cut and paste menu items should be disabled when queryPane gets the focus???? + // add to CVS???? + // Write a French translation???? + // add and check accessibility???? + // is the GPL binding to Saxon a license problem? + + + //constants + private final int bottomOffset = 64; + private final String PRF_CONTEXT ="context"; + private final String PRF_BASEURI ="baseUri"; + + Preferences prefs = Preferences.userNodeForPackage(com.snilius.xquery.QueryFrame.class); + + private static int preferredMetaKey; + private static List openWindows = new LinkedList(); + + private RSyntaxTextArea queryArea = new RSyntaxTextArea(); + private RSyntaxTextArea outputArea = new RSyntaxTextArea(); + private RTextScrollPane rTextScrollPaneOutput; + + private JTextField contextField = new JTextField(24); + private JTextField baseField = new JTextField(24); + private JCheckBox doWrapping = new JCheckBox(Messages.getString("wrap")); + private JCheckBox doIndenting = new JCheckBox(Messages.getString("prettyPrint")); + private JCheckBox enableLineComments = new JCheckBox(Messages.getString("lineComment")); + private static Font display = new Font("Monospaced", Font.BOLD, 16); + private static Insets margin = new Insets(4, 3, 2, 4); + private UndoManager manager = new UndoManager(); + private JCheckBoxMenuItem wrapItem + = new JCheckBoxMenuItem(Messages.getString("wrap")); + private JCheckBoxMenuItem indentItem + = new JCheckBoxMenuItem(Messages.getString("prettyPrint")); + private JCheckBoxMenuItem commentItem = new JCheckBoxMenuItem(Messages.getString("lineComment")); + + private File queryFile = null; + private File contextFile; + private SequenceIterator queryResult; + private StaticQueryContext queryContext; + + private final static Properties prettyPrint = new Properties(); + private final static Properties uglyPrint = new Properties(); + final static boolean thisIsAMac = System.getProperty("mrj.version") != null; + + static { + prettyPrint.setProperty(OutputKeys.INDENT, "yes"); + preferredMetaKey = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + } + + public QueryFrame() { + + super(Messages.getString("XQuisitor_5")); + if (thisIsAMac) new MacOSHandler(this); + this.setJMenuBar(makeMenuBar()); + + JSplitPane splitter = new JSplitPane(JSplitPane.VERTICAL_SPLIT, + makeQueryPanel(), + makeOutputPanel()); + this.getContentPane().add(splitter); + + loadPreferences(); + + Toolkit toolkit = this.getToolkit(); + Dimension screenSize = toolkit.getScreenSize(); + this.setSize(screenSize.width, screenSize.height-bottomOffset); + this.setLocation(0, 0); + + initQueryProcessor(); + + } + + private void loadPreferences() { + contextField.setText(prefs.get(PRF_CONTEXT,"")); + baseField.setText(prefs.get(PRF_BASEURI,getUserDir())); + } + + + private JPanel makeQueryPanel() { + + JPanel queryPanel = new JPanel(); + queryPanel.setLayout(new BorderLayout()); + queryArea.setTabSize(2); + queryArea.setCodeFoldingEnabled(true); + queryArea.getDocument().addUndoableEditListener(manager); + RTextScrollPane rTextScrollPane = new RTextScrollPane(queryArea); + + queryPanel.add(new JLabel(Messages.getString("Query_6")), BorderLayout.NORTH); + queryPanel.add(rTextScrollPane, BorderLayout.CENTER); + queryPanel.add(makeOptionsPanel(), BorderLayout.EAST); + return queryPanel; + + } + + + private JPanel makeOutputPanel() { + JPanel outputPanel = new JPanel(); + outputPanel.setLayout(new BorderLayout()); + outputPanel.add(new JLabel(Messages.getString("Query_Result_7")), BorderLayout.NORTH); + + outputArea.setCodeFoldingEnabled(true); + outputArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML); + outputArea.setTabSize(2); + outputArea.setCurrentLineHighlightColor(Color.WHITE); + + rTextScrollPaneOutput = new RTextScrollPane(outputArea); + + outputPanel.add(rTextScrollPaneOutput, BorderLayout.CENTER); + return outputPanel; + } + + private JPanel makeOptionsPanel() { + + JPanel options = new JPanel(); + GridBagLayout gbl = new GridBagLayout(); + options.setLayout(gbl); + + // It looks like each text field needs its own + // UndoManager which is active whenever that field has the focus. + // Otherwise, the undo crosses field boundaries???? + // baseField.getDocument().addUndoableEditListener(manager); + + JLabel baseLabel = new JLabel( + Messages.getString("Base_URI___9"), JLabel.LEFT); + baseLabel.setDisplayedMnemonic(KeyEvent.VK_B); + baseLabel.setLabelFor(baseField); + + JLabel chooserLabel = new JLabel( + Messages.getString("Context___10"), JLabel.LEFT); + chooserLabel.setDisplayedMnemonic(KeyEvent.VK_C); + chooserLabel.setLabelFor(contextField); + + // baseLabel + GridBagConstraints baseLabelConstraints = new GridBagConstraints(); + baseLabelConstraints.gridx=0; + baseLabelConstraints.gridy=0; + baseLabelConstraints.gridwidth=3; + baseLabelConstraints.gridheight=1; + baseLabelConstraints.anchor = GridBagConstraints.NORTHWEST; + baseLabelConstraints.insets = new Insets(0, 0, 0, 12); + gbl.setConstraints(baseLabel, baseLabelConstraints); + options.add(baseLabel); + + // baseField + GridBagConstraints baseFieldConstraints = new GridBagConstraints(); + baseFieldConstraints.anchor = GridBagConstraints.NORTHWEST; + baseFieldConstraints.gridx=3; + baseFieldConstraints.gridy=0; + baseFieldConstraints.gridwidth=4; + baseFieldConstraints.gridheight=1; + baseFieldConstraints.insets = new Insets(0, 0, 0, 6); + gbl.setConstraints(baseField, baseFieldConstraints); + options.add(baseField); + + // choose base + JButton chooseBase = new JButton(Messages.getString("..._11")); + GridBagConstraints chooseBaseConstraints = new GridBagConstraints(); + chooseBaseConstraints.anchor = GridBagConstraints.NORTHWEST; + chooseBaseConstraints.gridx=7; + chooseBaseConstraints.gridy=0; + chooseBaseConstraints.gridwidth=1; + chooseBaseConstraints.gridheight=1; + chooseBaseConstraints.insets = new Insets(0, 2, 2, 0); + gbl.setConstraints(chooseBase, chooseBaseConstraints); + options.add(chooseBase); + chooseBase.addActionListener(new BaseURIChooser()); + + // chooserLabel + GridBagConstraints chooserLabelConstraints = new GridBagConstraints(); + chooserLabelConstraints.gridx=0; + chooserLabelConstraints.gridy=1; + chooserLabelConstraints.gridwidth=3; + chooserLabelConstraints.gridheight=1; + chooserLabelConstraints.anchor = GridBagConstraints.NORTHWEST; + chooserLabelConstraints.insets = new Insets(0, 0, 0, 12); + gbl.setConstraints(chooserLabel, chooserLabelConstraints); + options.add(chooserLabel); + + + // contextField + // contextField.getDocument().addUndoableEditListener(manager); + GridBagConstraints contextFieldConstraints = new GridBagConstraints(); + contextFieldConstraints.anchor = GridBagConstraints.NORTHWEST; + contextFieldConstraints.gridx=3; + contextFieldConstraints.gridy=1; + contextFieldConstraints.gridwidth=4; + contextFieldConstraints.gridheight=1; + contextFieldConstraints.insets = new Insets(0, 0, 0, 6); + gbl.setConstraints(contextField, contextFieldConstraints); + options.add(contextField); + + // chooseFile button + JButton chooseFile = new JButton(Messages.getString("..._12")); + GridBagConstraints chooseFileConstraints = new GridBagConstraints(); + chooseFileConstraints.anchor = GridBagConstraints.NORTHWEST; + chooseFileConstraints.gridx=7; + chooseFileConstraints.gridy=1; + chooseFileConstraints.gridwidth=1; + chooseFileConstraints.gridheight=1; + chooseFileConstraints.insets = new Insets(0, 2, 2, 0); + gbl.setConstraints(chooseFile, chooseFileConstraints); + options.add(chooseFile); + chooseFile.addActionListener(new ContextChooser()); + + ItemListener redrawer = new NeedsSerialization(); + doWrapping.addItemListener(redrawer); + doWrapping.setMnemonic(KeyEvent.VK_W); + doIndenting.addItemListener(redrawer); + doIndenting.setMnemonic(KeyEvent.VK_P); + + // doWrapping checkbox + GridBagConstraints doWrappingConstraints = new GridBagConstraints(); + doWrappingConstraints.gridx=3; + doWrappingConstraints.gridy=2; + doWrappingConstraints.gridwidth=3; + doWrappingConstraints.gridheight=1; + doWrappingConstraints.anchor = GridBagConstraints.WEST; + gbl.setConstraints(doWrapping, doWrappingConstraints); + options.add(doWrapping); + + // doIndenting checkbox + GridBagConstraints doIndentingConstraints = new GridBagConstraints(); + doIndentingConstraints.gridx=3; + doIndentingConstraints.gridy=3; + doIndentingConstraints.gridwidth=2; + doIndentingConstraints.gridheight=1; + doWrappingConstraints.anchor = GridBagConstraints.WEST; + gbl.setConstraints(doIndenting, doIndentingConstraints); + doIndenting.setSelected(true); + options.add(doIndenting); + + GridBagConstraints enableLineCommentsConstraints = new GridBagConstraints(); + enableLineCommentsConstraints.gridx=3; + enableLineCommentsConstraints.gridy=4; + enableLineCommentsConstraints.gridwidth=3; + enableLineCommentsConstraints.gridheight=1; + gbl.setConstraints(enableLineComments,enableLineCommentsConstraints); + enableLineComments.setSelected(true); + options.add(enableLineComments); + + // executeButton + GridBagConstraints executeButtonConstraints = new GridBagConstraints(); + JButton executeButton = new JButton(Messages.getString("Run_Query_13")); + executeButton.addActionListener(new RunQuery()); + executeButtonConstraints.gridx=5; + executeButtonConstraints.gridy=5; + executeButtonConstraints.gridwidth=2; + executeButtonConstraints.gridheight=1; + executeButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; + executeButtonConstraints.insets = new Insets(17, 0, 0, 0); + gbl.setConstraints(executeButton, executeButtonConstraints); + options.add(executeButton); + + FieldFocusListener fieldFocusListenerContext = new FieldFocusListener("context"); + FieldFocusListener fieldFocusListenerBase = new FieldFocusListener("base"); + //register eventhandler for fields + contextField.addFocusListener(fieldFocusListenerContext); + baseField.addFocusListener(fieldFocusListenerBase); + + // baseField.set(KeyEvent.VK_B); + + JPanel master = new JPanel(); + master.add(options); + return master; + } + + private String getUserDir(){ + String userdir = System.getProperty("user.dir"); + String dir=""; + if (userdir != null) { + File baseDir = new File(userdir); + URI baseURI = baseDir.toURI(); + dir=baseURI.toASCIIString(); + } + return dir; + } + + + private void initQueryProcessor() { + Configuration config = new Configuration(); + config.setHostLanguage(Configuration.XQUERY); + queryContext = new StaticQueryContext(config); + + } + + + private JMenuBar makeMenuBar() { + JMenuBar jmb = new JMenuBar(); + jmb.add(makeFileMenu()); + jmb.add(makeEditMenu()); + jmb.add(makeQueryMenu()); + if (!thisIsAMac) jmb.add(makeHelpMenu()); + return jmb; + } + + + private JMenu makeFileMenu() { + + JMenu menu = new JMenu("File"); + menu.setMnemonic(KeyEvent.VK_F); + + JMenuItem newItem = new JMenuItem(Messages.getString("New_16")); + newItem.setMnemonic(KeyEvent.VK_N); + newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, preferredMetaKey)); + newItem.addActionListener(new NewListener()); + menu.add(newItem); + + JMenuItem openItem = new JMenuItem(Messages.getString("Open..._17")); + openItem.setMnemonic(KeyEvent.VK_O); + openItem.addActionListener(new OpenListener()); + openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, preferredMetaKey)); + menu.add(openItem); + + menu.addSeparator(); + + JMenuItem closeItem = new JMenuItem(Messages.getString("Close_18")); + closeItem.setMnemonic(KeyEvent.VK_C); + closeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, preferredMetaKey)); + closeItem.addActionListener(new CloseListener()); + menu.add(closeItem); + + menu.addSeparator(); + + JMenuItem saveItem = new JMenuItem(Messages.getString("Save_19")); + saveItem.setMnemonic(KeyEvent.VK_S); + saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, preferredMetaKey)); + saveItem.addActionListener(new SaveListener(queryArea, false)); + menu.add(saveItem); + + JMenuItem saveAsItem = new JMenuItem(Messages.getString("Save_As..._20")); + saveAsItem.setMnemonic(KeyEvent.VK_A); + saveAsItem.addActionListener(new SaveListener(queryArea, true)); + menu.add(saveAsItem); + + JMenuItem saveOutputItem = new JMenuItem(Messages.getString("Save_Query_Result..._21")); + saveOutputItem.setMnemonic(KeyEvent.VK_V); + saveOutputItem.addActionListener(new SaveListener(this.outputArea, true)); + menu.add(saveOutputItem); + + menu.addSeparator(); + + JMenuItem pageSetupItem = new JMenuItem(Messages.getString("Page_Setup..._22")); + pageSetupItem.setMnemonic(KeyEvent.VK_U); + pageSetupItem.addActionListener(new PageSetupListener()); + menu.add(pageSetupItem); + + JMenuItem printItem = new JMenuItem(Messages.getString("Print..._23")); + printItem.setMnemonic(KeyEvent.VK_P); + printItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, preferredMetaKey)); + printItem.addActionListener(new PrintListener(outputArea)); + menu.add(printItem); + + JMenuItem printQueryItem = new JMenuItem(Messages.getString("Print_Query..._24")); + printQueryItem.setMnemonic(KeyEvent.VK_Q); + printQueryItem.addActionListener(new PrintListener(queryArea)); + menu.add(printQueryItem); + + if (!thisIsAMac) { + // Mac OS X adds its own quit item + menu.addSeparator(); + + JMenuItem exitItem = new JMenuItem(Messages.getString("Exit_25")); + exitItem.setMnemonic(KeyEvent.VK_X); + exitItem.addActionListener(new ExitListener()); + menu.add(exitItem); + } + + return menu; + + } + + + private JMenu makeEditMenu() { + + JMenu menu = new JMenu(Messages.getString("Edit_26")); + menu.setMnemonic(KeyEvent.VK_E); + + JMenuItem undoItem = new JMenuItem(Messages.getString("Undo_27")); + undoItem.setMnemonic(KeyEvent.VK_U); + undoItem.setAccelerator(KeyStroke.getKeyStroke('Z', preferredMetaKey)); + undoItem.addActionListener(new UndoAction()); + menu.add(undoItem); + + JMenuItem redoItem = new JMenuItem(Messages.getString("Redo_28")); + redoItem.setMnemonic(KeyEvent.VK_R); + redoItem.setAccelerator(KeyStroke.getKeyStroke('Y', preferredMetaKey)); + redoItem.addActionListener(new RedoAction()); + menu.add(redoItem); + + menu.addSeparator(); + + JMenuItem cutItem = new JMenuItem(Messages.getString("Cut_29")); + cutItem.setMnemonic(KeyEvent.VK_C); + cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, preferredMetaKey)); + cutItem.addActionListener(queryArea.getActionMap().get(DefaultEditorKit.cutAction)); + menu.add(cutItem); + + JMenuItem copyItem = new JMenuItem(Messages.getString("Copy_30")); + copyItem.setMnemonic(KeyEvent.VK_O); + copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, preferredMetaKey)); + copyItem.addActionListener(queryArea.getActionMap().get(DefaultEditorKit.copyAction)); + menu.add(copyItem); + + JMenuItem pasteItem = new JMenuItem(Messages.getString("Paste_31")); + pasteItem.setMnemonic(KeyEvent.VK_P); + pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, preferredMetaKey)); + pasteItem.addActionListener(queryArea.getActionMap().get(DefaultEditorKit.pasteAction)); + menu.add(pasteItem); + + if (thisIsAMac) { + JMenuItem clearItem = new JMenuItem(Messages.getString("Clear_32")); + clearItem.setMnemonic(KeyEvent.VK_E); + // clearItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, ????)); + clearItem.setEnabled(false); // ???? + menu.add(clearItem); + } + + menu.addSeparator(); + + JMenuItem selectAllItem = new JMenuItem(Messages.getString("Select_All_33")); + selectAllItem.setMnemonic(KeyEvent.VK_A); + selectAllItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, preferredMetaKey)); + ActionListener selectAllAction = queryArea.getActionMap().get("select-all"); + selectAllItem.addActionListener(selectAllAction); + menu.add(selectAllItem); + + return menu; + } + + + private JMenu makeQueryMenu() { + + JMenu menu = new JMenu(Messages.getString("Query_6")); + menu.setMnemonic(KeyEvent.VK_Q); + + JMenuItem queryItem = new JMenuItem(Messages.getString("Run_Query_13")); + queryItem.setMnemonic(KeyEvent.VK_R); + queryItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, preferredMetaKey)); + queryItem.addActionListener(new RunQuery()); + menu.add(queryItem); + + menu.addSeparator(); + + JMenuItem baseItem = new JMenuItem(Messages.getString("setBaseURI")); + baseItem.setMnemonic(KeyEvent.VK_B); + baseItem.addActionListener(new BaseURIChooser()); + menu.add(baseItem); + + JMenuItem contextItem = new JMenuItem(Messages.getString("setContextNode")); + contextItem.setMnemonic(KeyEvent.VK_C); + contextItem.addActionListener(new ContextChooser()); + menu.add(contextItem); + + menu.addSeparator(); + + ActionListener changer = new NeedsSerialization(); + wrapItem.setMnemonic(KeyEvent.VK_W); + wrapItem.addActionListener(changer); + menu.add(wrapItem); + + indentItem.setMnemonic(KeyEvent.VK_P); + indentItem.addActionListener(changer); + menu.add(indentItem); + + commentItem.setMnemonic(KeyEvent.VK_L); + commentItem.addActionListener(changer); + + menu.add(commentItem); + + return menu; + } + + + private JMenu makeHelpMenu() { + + JMenu menu = new JMenu(Messages.getString("Help_35")); + menu.setMnemonic(KeyEvent.VK_H); + + JMenuItem aboutItem = new JMenuItem(Messages.getString("About_XQuisitor..._36")); + aboutItem.setMnemonic(KeyEvent.VK_A); + aboutItem.addActionListener(new AboutListener()); + menu.add(aboutItem); + // ???? + return menu; + } + + + public void show() { + openWindows.add(this); + super.show(); + } + + + public void hide() { + super.hide(); + openWindows.remove(this); + if (openWindows.isEmpty()) System.exit(0); + } + + + private class ContextChooser implements ActionListener { + + public void actionPerformed(ActionEvent evt) { + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(Messages.getString("Please_choose_context_document_or_directory__37")); + chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + if (contextFile != null) { + chooser.setCurrentDirectory(contextFile); + } + if (chooser.showOpenDialog(QueryFrame.this) == JFileChooser.APPROVE_OPTION) { + contextFile = new File( + chooser.getCurrentDirectory(), + chooser.getSelectedFile().getName() + ); + contextField.setText(contextFile.toURI().toString()); + saveContextField(); + } + + } + + } + + + private class CancelQuery implements ActionListener { + + private QueryThread t; + + CancelQuery(QueryThread t) { + this.t = t; + } + + public void actionPerformed(ActionEvent evt) { + t.userCancelled(); + } + + } + + private class BaseURIChooser implements ActionListener { + + private File uriFile; + + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(Messages.getString("Please_choose_directory_that_sets_base_URI__38")); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + if (uriFile != null) chooser.setSelectedFile(uriFile); + else if (contextFile != null) chooser.setSelectedFile(contextFile); + if (chooser.showOpenDialog(QueryFrame.this) == JFileChooser.APPROVE_OPTION) { + uriFile = new File( + chooser.getCurrentDirectory(), + chooser.getSelectedFile().getName() + ); + baseField.setText(uriFile.toURI().toString()); + } + + } + + } + + private static String lineSeparator = System.getProperty("line.separator"); + + private class RunQuery implements ActionListener { + + public void actionPerformed(ActionEvent evt) { + Thread t = new QueryThread(queryArea.getText(), baseField.getText().trim()); + t.start(); + } + + } + + + private void performQuery(String query, String baseURI) + throws XPathException, TransformerException, IOException { + + if (enableLineComments.isSelected()) + query = parseLineComment(query); + + XQueryExpression exp = queryContext.compileQuery(query); + + if (null != baseURI && !"".equals(baseURI)) { + queryContext.setBaseURI(baseURI); + } + + DynamicQueryContext result = new DynamicQueryContext(queryContext.getConfiguration()); + // set context + String uri = contextField.getText().trim(); + if (null != uri && !("".equals(uri))) { + InputSource eis = new InputSource(uri); + Source sourceInput = new SAXSource(eis); + DocumentInfo doc = queryContext.buildDocument(sourceInput); + result.setContextNode(doc); + } + + queryResult = exp.iterator(result); + } + + /** + * Enabled line commenting with # as splitter + * @param query + * @return + */ + private String parseLineComment(String query){ + String[] temp = query.split("\\n"); + + StringBuilder sb = new StringBuilder(); + for (String line:temp){ + sb.append(line.split("#")[0]+"\n"); + } + + return sb.toString(); + } + + private class QueryThread extends Thread { + + private String query; + private String baseURI; + + QueryThread(String query, String baseURI) { + this.query = query; + this.baseURI = baseURI; + } + + synchronized void userCancelled() { + stop(); + // QueryProcessor may have been left in an inconsistent + // state, so reinitialize it + initQueryProcessor(); + hideProgressBar(); + } + + public void run() { + // should wait a second or two before popping up progress + // dialog in case it's a quick query???? use a Timer + showProgressBar(Messages.getString("Querying..._42")); + try { + performQuery(query, baseURI); + final String result = serialize(); + hideProgressBar(); + SwingUtilities.invokeLater( new Runnable() { + public void run() { + //rTextScrollPaneOutput.setAutoscrolls(false); + + outputArea.setText(result); + outputArea.setCaretPosition(1); + //TODO scroll to top + } + }); + }catch (IOException ex) { + hideProgressBar(); + JOptionPane.showMessageDialog(QueryFrame.this, + ex.getMessage(), Messages.getString("Error_while_executing_query_43"), + JOptionPane.ERROR_MESSAGE); + ex.printStackTrace(); + }catch (TransformerException ex) { + hideProgressBar(); + String lineInfo = Messages.getString("Error_on_line")+" "+ex.getLocator().getLineNumber()+ + ((ex.getLocator().getColumnNumber()!=-1)?" "+Messages.getString("column")+" "+ex.getLocator().getColumnNumber():""); + JOptionPane.showMessageDialog(QueryFrame.this,lineInfo+"\n"+ + ex.getMessage(), Messages.getString("Error_while_executing_query_43"), + JOptionPane.ERROR_MESSAGE); + ex.printStackTrace(); + } + + } + + private JDialog progress; + + private synchronized void showProgressBar(String message) { + + // arbitrary length + JProgressBar progressBar = new JProgressBar(0, 500); + progressBar.setValue(0); + progressBar.setIndeterminate(true); + progressBar.setString(Messages.getString("Querying..._45")); + + progress = new JDialog(QueryFrame.this, message, true); + progress.setResizable(false); + progress.getContentPane().setLayout(new GridLayout(3, 1)); + progress.getContentPane().add(BorderLayout.NORTH, progressBar); + JButton cancel = new JButton(Messages.getString("Cancel_46")); + cancel.addActionListener(new CancelQuery(this)); + + JPanel buttonPanel = new JPanel(); + buttonPanel.add(cancel); + progress.getContentPane().add(buttonPanel); + + progress.pack(); + progress.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); + progress.setLocationRelativeTo(null); + + // Need a modal dialog but don't want to block this thread + // when it's shown. + Thread dontBlockMe = new Thread(new Runnable() { + public void run() { + progress.show(); + } + }); + dontBlockMe.start(); + // need to make sure dontBlockMe shows the dialog + // before we continue. The dontBlockMe thread won't exit + // so check that the dialog is on the screen: + while (!(progress.isVisible())) { + try { + wait(50); + } + catch (InterruptedException ex) { + // try again + } + } + + } + + + private synchronized void hideProgressBar() { + progress.setVisible(false); + progress.dispose(); + } + + } + + /* private class LaunchProgressBar extends TimerTask { + + private QueryThread thread; + + public LaunchProgressBar(QueryThread thread) { + this.thread = thread; + } + + public void run() { + if (thread.isAlive()) { + showProgressBar("Querying...", thread); + } + } + + } */ + + private void turnOnWaitCursor() { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + } + + private void turnOffWaitCursor() { + this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + + private class NeedsSerialization + implements ActionListener, ItemListener, Runnable { + + public void itemStateChanged(ItemEvent evt) { + wrapItem.setState(doWrapping.isSelected()); + indentItem.setState(doIndenting.isSelected()); + commentItem.setSelected(enableLineComments.isSelected()); + startSerialize(); + } + + private void startSerialize() { + if (queryResult != null) { + Thread t = new Thread(this); + t.start(); + } + } + + public void run() { + try { + turnOnWaitCursor(); + final String result = serialize(); + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + outputArea.setText(result); + } + }); + turnOffWaitCursor(); + } + catch (Exception ex) { + JOptionPane.showMessageDialog(QueryFrame.this, + ex.getMessage(), Messages.getString("Error_while_executing_query_43"), + JOptionPane.ERROR_MESSAGE); + } + } + + public void actionPerformed(ActionEvent evt) { + doWrapping.setSelected(wrapItem.getState()); + doIndenting.setSelected(indentItem.getState()); + enableLineComments.setSelected(commentItem.getState()); + startSerialize(); + } + + } + + + private String serialize() + throws TransformerException, XPathException, IOException { + StringWriter out = new StringWriter(); + + Properties indent; + if (doIndenting.isSelected()) { + indent = prettyPrint; + } + else { + indent = uglyPrint; + } + + // reset a copy of the results + SequenceIterator queryResult = this.queryResult.getAnother(); + + if (doWrapping.isSelected()) { + DocumentInfo resultDoc = QueryResult.wrap(queryResult, queryContext.getConfiguration()); + QueryResult.serialize(resultDoc, new StreamResult(out), indent, queryContext.getConfiguration()); + } + else { + while (true) { + Item next = queryResult.next(); + if (next == null) break; + // Check if item is a NodeInfo or a something else + // if (Type.isNodeType(next.getItemType())) { + QueryResult.serialize((NodeInfo) next, new StreamResult(out), indent, queryContext.getConfiguration()); + // This only works for document and element nodes???? + // Will this be improved in future Saxon's? if so + // this is all I need, and don't need to write my own. + /*} + else { + out.write(next.toString()); */ + // what about things where toString() is not + // a string representation; e.g. hexBinary or Date???? + // it appears the date time values are a special problem + /*net.sf.saxon.value.DateValue@c9290c78 + net.sf.saxon.value.TimeValue@6c76f794 + net.sf.saxon.value.GYearMonthValue@30283c79 + net.sf.saxon.value.GYearValue@781c3472*/ + // can I get the string value of any of these???? + + // } + out.write(lineSeparator); + } + } + out.flush(); + out.close(); + return out.toString(); + } + + private class AboutListener implements ActionListener { + + public void actionPerformed(ActionEvent evt) { + JFrame about = new AboutDialog(); + about.show(); + } + + } + + private class OpenListener implements ActionListener { + + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(Messages.getString("Please_choose_query_file__50")); + if (chooser.showOpenDialog(QueryFrame.this) == JFileChooser.APPROVE_OPTION) { + File selected = chooser.getSelectedFile(); + try { + // stuff file in query box + Reader reader = new FileReader(selected); + reader = new BufferedReader(reader); + StringBuffer sb = new StringBuffer(); + for (int c = reader.read(); c != -1; c = reader.read()) { + sb.append((char) c); + } + outputArea.setText(sb.toString()); + queryFile = selected; + } + catch (IOException ex) { + JOptionPane.showMessageDialog(QueryFrame.this, + ex.getMessage(), + Messages.getString("I/O_Error_while_reading_query_51"), + JOptionPane.ERROR_MESSAGE); + } + } + + } + + } + + private class NewListener implements ActionListener { + + public void actionPerformed(ActionEvent evt) { + JFrame frame = new QueryFrame(); + // Is this really necessary since we're in the + // event queue/AWT thread already???? + Runnable runner = new FrameDisplayer(frame); + EventQueue.invokeLater(runner); + } + + } + + private class ExitListener implements ActionListener { + + public void actionPerformed(ActionEvent evt) { + quit(); + } + + } + + void quit() { + // need to adjust this on the Mac so you don't exit + // after last window closes???? + while (!(openWindows.isEmpty())) { + QueryFrame frame = (QueryFrame) openWindows.get(0); + frame.hide(); + } + } + + private void saveContextField(){ + prefs.put(PRF_CONTEXT, contextField.getText().trim()); + System.out.println("'" + contextField.getText().trim() + "'"); + System.out.println("context save"); + } + + private class CloseListener implements ActionListener { + + public void actionPerformed(ActionEvent evt) { + QueryFrame.this.hide(); + } + + } + + private class SaveListener implements ActionListener { + + private JTextComponent text; + private boolean saveAs; + + SaveListener(JTextComponent text, boolean saveAs) { + this.saveAs = saveAs; + this.text = text; + } + + public void actionPerformed(ActionEvent evt) { + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(Messages.getString("Save_query_to___52")); + if (contextFile != null) chooser.setSelectedFile(contextFile); // ???? + + saveFile(chooser); + } + + private void saveFile(JFileChooser chooser) { + + File outputFile = queryFile; + if ((outputFile == null || saveAs) && + chooser.showSaveDialog(text) == JFileChooser.APPROVE_OPTION) { + outputFile = new File( + chooser.getCurrentDirectory(), + chooser.getSelectedFile().getName() + ); + if (outputFile.exists()) { + int choice = JOptionPane.showConfirmDialog(text, + Messages.getString("Overwrite_file__53") + + outputFile.getName() + + Messages.getString("QuestionMark__54")); + if (choice == JOptionPane.CANCEL_OPTION) { + chooser.setVisible(false); + return; + } + else if (choice == JOptionPane.NO_OPTION) { + saveFile(chooser); + } + } + } + if (outputFile != null) { + try { + OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile)); + Writer writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); + String data = text.getText(); + writer.write(data); + writer.flush(); + writer.close(); + queryFile = outputFile; + } + catch (IOException ex) { + JOptionPane.showMessageDialog(text, + ex.getMessage(), + Messages.getString("I/O_Error_while_saving_data_56"), + JOptionPane.ERROR_MESSAGE); + } + } + } + + } + + private class UndoAction extends AbstractAction { + + public void actionPerformed(ActionEvent evt) { + try { + manager.undo(); + } + catch (CannotUndoException ex) { + getToolkit().beep(); + } + } + + + } + + private class RedoAction extends AbstractAction { + + public void actionPerformed(ActionEvent evt) { + try { + manager.redo(); + } + catch (CannotRedoException ex) { + getToolkit().beep(); + } + } + + } + + + private PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); + + private class PrintListener implements ActionListener { + + private JTextComponent source; + + PrintListener(JTextComponent source) { + this.source = source; + } + + public void actionPerformed(ActionEvent evt) { + + String data = source.getText(); + + DocFlavor myFormat = DocFlavor.STRING.TEXT_PLAIN; + Doc myDoc = new SimpleDoc(data, myFormat, null); + PrinterJob dialog = PrinterJob.getPrinterJob(); + if (!dialog.printDialog(attributes)) return; + + // landscape printing is flaky???? + PrintService[] services = PrintServiceLookup.lookupPrintServices(myFormat, attributes); + if (services.length > 0) { + DocPrintJob job = services[0].createPrintJob(); + try { + job.print(myDoc, attributes); + } + catch (PrintException ex) { + JOptionPane.showMessageDialog(QueryFrame.this, + ex.getMessage(), + Messages.getString("Printing_error_57"), + JOptionPane.ERROR_MESSAGE); + } + } + else { + JOptionPane.showMessageDialog(QueryFrame.this, + Messages.getString("Could_not_locate_a_printer._58"), + Messages.getString("Printing_error_57"), + JOptionPane.ERROR_MESSAGE); + } + + } + + } + + private class PageSetupListener implements ActionListener { + + public void actionPerformed(ActionEvent evt) { + PrinterJob job = PrinterJob.getPrinterJob(); + PageFormat result = job.pageDialog(attributes); + if (result == null) { // user canceled + return; + } + + } + + } + + private class FieldFocusListener extends FocusAdapter { + private String who; + + public FieldFocusListener(String who) { + this.who = who; + } + + @Override + public void focusLost(FocusEvent e) { + if (who.equals("base")) { + prefs.get(PRF_BASEURI,baseField.getText()); + }else if (who.equals("context")){ + saveContextField(); + } + System.out.println("Save stuff for next time"); + } + } + +} + + diff --git a/src/main/java/com/snilius/xquery/XQuisitor.java b/src/main/java/com/snilius/xquery/XQuisitor.java new file mode 100644 index 0000000..2ce00d7 --- /dev/null +++ b/src/main/java/com/snilius/xquery/XQuisitor.java @@ -0,0 +1,87 @@ +// Copyright 2003, 2004 Elliotte Rusty Harold +// Copyright 2013-2014 Victor Häggqvist +// +// This file is part of XQuisitor. +// +// XQuisitor 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. +// +// XQuisitor 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 XQuisitor; if not, write to the +// +// Free Software Foundation, Inc. +// 59 Temple Place, Suite 330 +// Boston, MA 02111-1307 USA +// +// In addition, as a special exception, Elliotte Rusty Harold gives +// permission to link the code of this program with the Saxon-B library (or +// with modified versions of Saxon-B that use the same license as Saxon-B), +// and distribute linked combinations including the two. You must obey the +// GNU General Public License in all respects for all of the code used other +// than Saxon-B. If you modify this file, you may extend this exception to +// your version of the file, but you are not obligated to do so. If you do +// not wish to do so, delete this exception statement from your version. + +package com.snilius.xquery; + +import java.awt.EventQueue; + +import javax.swing.JOptionPane; +import javax.swing.UIManager; + +/** + *

+ * The driver program for XQuisitor. + *

+ * + * @author Elliotte Rusty Harold + * @version 1.0a5 + * + * @author Victor Häggqvist + * @since 2013-12-18 + * @version 2.0 + */ +class XQuisitor { + + public static void main(String[] args) { + initAppleProperties(); + + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + }catch (Exception ex) { + // no big deal; just use Metal + } + + try { + + QueryFrame frame = new QueryFrame(); + Runnable runner = new FrameDisplayer(frame); + EventQueue.invokeLater(runner); + }catch (NoClassDefFoundError ex) { + if (ex.getMessage().indexOf("saxon") != -1) { + JOptionPane.showMessageDialog(null, + "Saxon 8 is not in the CLASSPATH. (Try using -Xbootclasspath/p:)" + ); + }else { + ex.printStackTrace(); + } + System.exit(1); + } + + } + + private static void initAppleProperties() { + // see http://developer.apple.com/documentation/ReleaseNotes/Java/java141/system_properties/chapter_4_section_3.html + System.setProperty("apple.laf.useScreenMenuBar", "true"); + System.setProperty("com.apple.mrj.application.apple.menu.about.name", "XQuisitor"); + System.setProperty("apple.awt.showGrowBox", "true"); + } + +} diff --git a/src/main/resources/QueryFrame.properties b/src/main/resources/QueryFrame.properties new file mode 100644 index 0000000..9ce6d46 --- /dev/null +++ b/src/main/resources/QueryFrame.properties @@ -0,0 +1,55 @@ +OK=OK +Wrap_output_1=Wrap output +Pretty_print_output_2=Pretty print output +wrap=Wrap +prettyPrint=Pretty Print +lineComment=Line comments with # +setBaseURI=Set Base URI... +setContextNode=Set Context Document... +XQuisitor_5=XQuisitor2 +Query_6=Query +Query_Result_7=Query Result +Base_URI___9=Base URI: +Context___10=Context: +..._11=... +..._12=... +Run_Query_13=Run Query +New_16=New +Open..._17=Open... +Close_18=Close +Save_19=Save +Save_As..._20=Save As... +Save_Query_Result..._21=Save Query Result... +Page_Setup..._22=Page Setup... +Print..._23=Print... +Print_Query..._24=Print Query... +Exit_25=Exit +Edit_26=Edit +Undo_27=Undo +Redo_28=Redo +Cut_29=Cut +Copy_30=Copy +Paste_31=Paste +Clear_32=Clear +Select_All_33=Select All +Help_35=Help +About_XQuisitor..._36=About XQuisitor... +Please_choose_context_document_or_directory__37=Please choose context document or directory: +Please_choose_directory_that_sets_base_URI__38=Please choose directory that sets base URI: +Querying..._42=Querying... +Error_while_executing_query_43=Error while executing query +Querying..._45=Querying... +Cancel_46=Cancel +About_XQuisitor_49=About XQuisitor +Please_choose_query_file__50=Please choose query file: +I/O_Error_while_reading_query_51=I/O Error while reading query +Save_query_to___52=Save query to: +Overwrite_file__53=Overwrite file +QuestionMark__54=? +I/O_Error_while_saving_data_56=I/O Error while saving data +Printing_error_57=Printing error +Could_not_locate_a_printer._58=Could not locate a printer. +gpl=XQuisitor2 is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published \nby the Free Software Foundation; either version 2 of the License, \nor (at your option) any later version.\n\nXQuisitor is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with XQuisitor; if not, write to the\n\nFree Software Foundation, Inc. \n59 Temple Place, Suite 330\nBoston, MA 02111-1307\nUSA +Error_on_line=Error on line +column=column +copyright_credits=XQuisitor2
Version: 2.0

Copyright 2003-2005 Elliotte Rusty Harold
Copyright 2013-2014 Victor Häggqvist

Saxon-HE XSLT Processor http://www.saxonica.com/ Mozilla Public License Version 2.0
RSyntaxTextArea http://www.fifesoft.com/rsyntaxtextarea/ Modified BSD License

\ No newline at end of file diff --git a/src/packaging/Info.plist b/src/packaging/Info.plist deleted file mode 100644 index a82f64d..0000000 --- a/src/packaging/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - Run-Java-10.1 - CFBundleIconFile - GenericJavaApp.icns - CFBundleIdentifier - com.macfaq.xquery.XQuisitor - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - XQuisitor - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 2.0 -Java - - JVMVersion - 1.4* - ClassPath - - $JAVAROOT/xquisitor-1.0a3.jar - $JAVAROOT/saxon7.jar - - MainClass - com.macfaq.xquery.XQuisitor - Properties - - com.apple.mrj.application.apple.menu.about.name - XQuisitor - apple.laf.useScreenMenuBar - true - apple.awt.showGrowBox - true - - - - \ No newline at end of file diff --git a/src/packaging/JavaApplicationStub b/src/packaging/JavaApplicationStub deleted file mode 100644 index 345fffa..0000000 Binary files a/src/packaging/JavaApplicationStub and /dev/null differ diff --git a/src/packaging/PkgInfo b/src/packaging/PkgInfo deleted file mode 100644 index 1283317..0000000 --- a/src/packaging/PkgInfo +++ /dev/null @@ -1 +0,0 @@ -AAPL???? \ No newline at end of file -- cgit v1.2.3