You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ju...@apache.org on 2011/04/07 15:43:53 UTC
svn commit: r1089878 - in
/tika/trunk/tika-app/src/main/java/org/apache/tika/gui:
ParsingTransferHandler.java TikaGUI.java
Author: jukka
Date: Thu Apr 7 13:43:53 2011
New Revision: 1089878
URL: http://svn.apache.org/viewvc?rev=1089878&view=rev
Log:
TIKA-635: Tika GUI improvements
Add a simple menu system to replace the tab layout
Modified:
tika/trunk/tika-app/src/main/java/org/apache/tika/gui/ParsingTransferHandler.java
tika/trunk/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java
Modified: tika/trunk/tika-app/src/main/java/org/apache/tika/gui/ParsingTransferHandler.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-app/src/main/java/org/apache/tika/gui/ParsingTransferHandler.java?rev=1089878&r1=1089877&r2=1089878&view=diff
==============================================================================
--- tika/trunk/tika-app/src/main/java/org/apache/tika/gui/ParsingTransferHandler.java (original)
+++ tika/trunk/tika-app/src/main/java/org/apache/tika/gui/ParsingTransferHandler.java Thu Apr 7 13:43:53 2011
@@ -21,21 +21,16 @@ import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.InputEvent;
import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.ArrayList;
-import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
-import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.metadata.Metadata;
-
/**
* Utility class that turns drag-and-drop events into Tika parse requests.
*/
@@ -83,10 +78,7 @@ class ParsingTransferHandler extends Tra
DataFlavor.javaFileListFlavor));
} else if (transferable.isDataFlavorSupported(urlListFlavor)) {
Object data = transferable.getTransferData(urlListFlavor);
- URL url = new URL(data.toString());
- Metadata metadata = new Metadata();
- TikaInputStream stream = TikaInputStream.get(url, metadata);
- tika.importStream(stream, metadata);
+ tika.openURL(new URL(data.toString()));
} else if (transferable.isDataFlavorSupported(uriListFlavor)) {
importFiles(uriToFileList(
transferable.getTransferData(uriListFlavor)));
@@ -97,12 +89,9 @@ class ParsingTransferHandler extends Tra
}
}
- private void importFiles(List<File> files)
- throws MalformedURLException, IOException {
+ private void importFiles(List<File> files) {
for (File file : files) {
- Metadata metadata = new Metadata();
- TikaInputStream stream = TikaInputStream.get(file, metadata);
- tika.importStream(stream, metadata);
+ tika.openFile(file);
}
}
Modified: tika/trunk/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java?rev=1089878&r1=1089877&r2=1089878&view=diff
==============================================================================
--- tika/trunk/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java (original)
+++ tika/trunk/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java Thu Apr 7 13:43:53 2011
@@ -16,7 +16,14 @@
*/
package org.apache.tika.gui;
+import java.awt.CardLayout;
+import java.awt.Color;
import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -24,16 +31,25 @@ import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+import javax.swing.Box;
+import javax.swing.ButtonGroup;
import javax.swing.JEditorPane;
+import javax.swing.JFileChooser;
import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
import javax.swing.ProgressMonitorInputStream;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
@@ -46,6 +62,7 @@ import javax.xml.transform.stream.Stream
import org.apache.tika.exception.TikaException;
import org.apache.tika.extractor.DocumentSelector;
import org.apache.tika.io.IOUtils;
+import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.AbstractParser;
@@ -66,7 +83,7 @@ import org.xml.sax.helpers.AttributesImp
* Simple Swing GUI for Apache Tika. You can drag and drop files on top
* of the window to have them parsed.
*/
-public class TikaGUI extends JFrame {
+public class TikaGUI extends JFrame implements ActionListener {
/**
* Serial version UID.
@@ -106,9 +123,14 @@ public class TikaGUI extends JFrame {
private final ImageSavingParser imageParser;
/**
- * Tabs in the Tika GUI window.
+ * The card layout for switching between different views.
*/
- private final JTabbedPane tabs;
+ private final CardLayout layout = new CardLayout();
+
+ /**
+ * Container for the editor cards.
+ */
+ private final JPanel cards;
/**
* Formatted XHTML output.
@@ -140,95 +162,220 @@ public class TikaGUI extends JFrame {
*/
private final JEditorPane errors;
+ /**
+ * File chooser.
+ */
+ private final JFileChooser chooser = new JFileChooser();
+
public TikaGUI(Parser parser) {
super("Apache Tika");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- tabs = new JTabbedPane();
- add(tabs);
+ addMenuBar();
- html = createEditor("Formatted text", "text/html");
- text = createEditor("Plain text", "text/plain");
- textMain = createEditor("Main content", "text/plain");
- xml = createEditor("Structured text", "text/plain");
- metadata = createEditor("Metadata", "text/plain");
- errors = createEditor("Errors", "text/plain");
+ cards = new JPanel(layout);
+ html = addCard(cards, "text/html", "html");
+ text = addCard(cards, "text/plain", "text");
+ textMain = addCard(cards, "text/plain", "main");
+ xml = addCard(cards, "text/plain", "xhtml");
+ metadata = addCard(cards, "text/plain", "metadata");
+ errors = addCard(cards, "text/plain", "error");
+ add(cards);
+ layout.show(cards, "html");
- setPreferredSize(new Dimension(500, 400));
+ setPreferredSize(new Dimension(640, 480));
pack();
this.context = new ParseContext();
this.parser = parser;
-
+
this.imageParser = new ImageSavingParser(parser);
this.context.set(DocumentSelector.class, new ImageDocumentSelector());
this.context.set(Parser.class, imageParser);
}
- public void importStream(InputStream input, Metadata md)
- throws IOException {
+ private void addMenuBar() {
+ JMenuBar bar = new JMenuBar();
+
+ JMenu file = new JMenu("File");
+ file.setMnemonic(KeyEvent.VK_F);
+ addMenuItem(file, "Open...", "openfile", KeyEvent.VK_O);
+ addMenuItem(file, "Open URL...", "openurl", KeyEvent.VK_U);
+ file.addSeparator();
+ addMenuItem(file, "Exit", "exit", KeyEvent.VK_X);
+ bar.add(file);
+
+ JMenu view = new JMenu("View");
+ view.setMnemonic(KeyEvent.VK_V);
+ ButtonGroup group = new ButtonGroup();
+ addRadioItem(view, group, true, "Formatted text", "html", KeyEvent.VK_F);
+ addRadioItem(view, group, false, "Plain text", "text", KeyEvent.VK_P);
+ addRadioItem(view, group, false, "Main content", "main", KeyEvent.VK_C);
+ addRadioItem(view, group, false, "Structured text", "xhtml", KeyEvent.VK_S);
+ addRadioItem(view, group, false, "Metadata", "metadata", KeyEvent.VK_M);
+ addRadioItem(view, group, false, "Errors", "error", KeyEvent.VK_E);
+ bar.add(view);
+
+ bar.add(Box.createHorizontalGlue());
+ JMenu help = new JMenu("Help");
+ help.setMnemonic(KeyEvent.VK_H);
+ bar.add(help);
+
+ setJMenuBar(bar);
+ }
+
+ private void addMenuItem(
+ JMenu menu, String title, String command, int key) {
+ JMenuItem item = new JMenuItem(title, key);
+ item.setActionCommand(command);
+ item.addActionListener(this);
+ menu.add(item);
+ }
+
+ private void addRadioItem(
+ JMenu menu, ButtonGroup group, boolean selected,
+ String title, String command, int key) {
+ JRadioButtonMenuItem item = new JRadioButtonMenuItem(title, selected);
+ item.setMnemonic(key);
+ item.setActionCommand(command);
+ item.addActionListener(this);
+ group.add(item);
+ menu.add(item);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ String command = e.getActionCommand();
+ if ("openfile".equals(command)) {
+ int rv = chooser.showOpenDialog(this);
+ if (rv == JFileChooser.APPROVE_OPTION) {
+ openFile(chooser.getSelectedFile());
+ }
+ } else if ("openurl".equals(command)) {
+ Object rv = JOptionPane.showInputDialog(
+ this, "Enter the URL of the resource to be parsed:",
+ "Open URL", JOptionPane.PLAIN_MESSAGE,
+ null, null, "");
+ if (rv != null && rv.toString().length() > 0) {
+ try {
+ openURL(new URL(rv.toString().trim()));
+ } catch (MalformedURLException exception) {
+ JOptionPane.showMessageDialog(
+ this, "The given string is not a valid URL",
+ "Invalid URL", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ } else if ("html".equals(command)) {
+ layout.show(cards, command);
+ ((JRadioButtonMenuItem) e.getSource()).setSelected(true);
+ } else if ("text".equals(command)) {
+ layout.show(cards, command);
+ ((JRadioButtonMenuItem) e.getSource()).setSelected(true);
+ } else if ("main".equals(command)) {
+ layout.show(cards, command);
+ ((JRadioButtonMenuItem) e.getSource()).setSelected(true);
+ } else if ("xhtml".equals(command)) {
+ layout.show(cards, command);
+ ((JRadioButtonMenuItem) e.getSource()).setSelected(true);
+ } else if ("metadata".equals(command)) {
+ layout.show(cards, command);
+ ((JRadioButtonMenuItem) e.getSource()).setSelected(true);
+ } else if ("error".equals(command)) {
+ layout.show(cards, command);
+ ((JRadioButtonMenuItem) e.getSource()).setSelected(true);
+ } else if ("exit".equals(command)) {
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(
+ new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
+ }
+ }
+
+ public void openFile(File file) {
try {
- StringWriter htmlBuffer = new StringWriter();
- StringWriter textBuffer = new StringWriter();
- StringWriter textMainBuffer = new StringWriter();
- StringWriter xmlBuffer = new StringWriter();
- StringBuilder metadataBuffer = new StringBuilder();
-
- ContentHandler handler = new TeeContentHandler(
- getHtmlHandler(htmlBuffer),
- getTextContentHandler(textBuffer),
- getTextMainContentHandler(textMainBuffer),
- getXmlContentHandler(xmlBuffer));
-
- context.set(DocumentSelector.class, new ImageDocumentSelector());
-
- input = new ProgressMonitorInputStream(
- this, "Parsing stream", input);
- parser.parse(input, handler, md, context);
-
- String[] names = md.names();
- Arrays.sort(names);
- for (String name : names) {
- metadataBuffer.append(name);
- metadataBuffer.append(": ");
- metadataBuffer.append(md.get(name));
- metadataBuffer.append("\n");
+ Metadata metadata = new Metadata();
+ TikaInputStream stream = TikaInputStream.get(file, metadata);
+ try {
+ handleStream(stream, metadata);
+ } finally {
+ stream.close();
}
+ } catch (Throwable t) {
+ handleError(t);
+ }
+ }
- setText(errors, "");
- setText(metadata, metadataBuffer.toString());
- setText(xml, xmlBuffer.toString());
- setText(text, textBuffer.toString());
- setText(textMain, textMainBuffer.toString());
- setText(html, htmlBuffer.toString());
- tabs.setSelectedIndex(0);
- } catch (Exception e) {
- StringWriter writer = new StringWriter();
- e.printStackTrace(new PrintWriter(writer));
- setText(errors, writer.toString());
- setText(metadata, "");
- setText(xml, "");
- setText(text, "");
- setText(html, "");
- tabs.setSelectedIndex(tabs.getTabCount() - 1);
- JOptionPane.showMessageDialog(
- this,
- "Apache Tika was unable to parse the file or url.\n "
- + " See the errors tab for"
- + " the detailed stack trace of this error.",
- "Parse error",
- JOptionPane.ERROR_MESSAGE);
- } finally {
- input.close();
+ public void openURL(URL url) {
+ try {
+ Metadata metadata = new Metadata();
+ TikaInputStream stream = TikaInputStream.get(url, metadata);
+ try {
+ handleStream(stream, metadata);
+ } finally {
+ stream.close();
+ }
+ } catch (Throwable t) {
+ handleError(t);
}
}
- private JEditorPane createEditor(String title, String type) {
+ private void handleStream(InputStream input, Metadata md)
+ throws Exception {
+ StringWriter htmlBuffer = new StringWriter();
+ StringWriter textBuffer = new StringWriter();
+ StringWriter textMainBuffer = new StringWriter();
+ StringWriter xmlBuffer = new StringWriter();
+ StringBuilder metadataBuffer = new StringBuilder();
+
+ ContentHandler handler = new TeeContentHandler(
+ getHtmlHandler(htmlBuffer),
+ getTextContentHandler(textBuffer),
+ getTextMainContentHandler(textMainBuffer),
+ getXmlContentHandler(xmlBuffer));
+
+ context.set(DocumentSelector.class, new ImageDocumentSelector());
+
+ input = new ProgressMonitorInputStream(
+ this, "Parsing stream", input);
+ parser.parse(input, handler, md, context);
+
+ String[] names = md.names();
+ Arrays.sort(names);
+ for (String name : names) {
+ metadataBuffer.append(name);
+ metadataBuffer.append(": ");
+ metadataBuffer.append(md.get(name));
+ metadataBuffer.append("\n");
+ }
+
+ setText(errors, "");
+ setText(metadata, metadataBuffer.toString());
+ setText(xml, xmlBuffer.toString());
+ setText(text, textBuffer.toString());
+ setText(textMain, textMainBuffer.toString());
+ setText(html, htmlBuffer.toString());
+ }
+
+ private void handleError(Throwable t) {
+ StringWriter writer = new StringWriter();
+ t.printStackTrace(new PrintWriter(writer));
+ setText(errors, writer.toString());
+ setText(metadata, "");
+ setText(xml, "");
+ setText(text, "");
+ setText(html, "");
+ JOptionPane.showMessageDialog(
+ this,
+ "Apache Tika was unable to parse this document.\n "
+ + " See the errors tab for the details of this error.",
+ "Parse error",
+ JOptionPane.ERROR_MESSAGE);
+ }
+
+ private JEditorPane addCard(JPanel panel, String type, String name) {
JEditorPane editor = new JEditorPane();
+ editor.setBackground(Color.WHITE);
editor.setContentType(type);
editor.setTransferHandler(new ParsingTransferHandler(
editor.getTransferHandler(), this));
- tabs.add(title, new JScrollPane(editor));
+ panel.add(new JScrollPane(editor), name);
return editor;
}
@@ -397,4 +544,5 @@ public class TikaGUI extends JFrame {
}
}
+
}