/*
* Copyright 2001-2014 Aspose Pty Ltd. All Rights Reserved.
*
* This file is part of Aspose.Words. The source code in this file
* is only intended as a supplement to the documentation, and is provided
* "as is", without warranty of any kind, either expressed or implied.
*/
package com.aspose.words.examples.viewers_visualizers.document_explorer;
import com.aspose.words.Document;
import com.aspose.words.License;
import javax.swing.*;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.Enumeration;
/**
* The main form of the DocumentExplorer demo.
*
* DocumentExplorer allows to open DOC, DOT, DOCX, XML, WML, RTF, ODT, OTT,
* HTML, XHTML and MHTML files using Aspose.Words.
*
* Once a document is opened, you can explore its object model in the tree. You
* can also save the document into DOC, DOCX, ODF, EPUB, PDF, SWF, RTF, WordML,
* HTML, MHTML and plain text formats.
*
*/
public class Main implements TreeWillExpandListener, TreeSelectionListener, KeyListener {
String imgPath = com.aspose.words.examples.Utils.getDataDir(DocumentExplorer.class) + "images" + File.separator;
public Main() throws Exception {
// Search for an Aspose.Words license in the application directory.
// The File.Exists check is only needed in this demo so it will work
// both when the license file is present as well as when it's missing.
// In your real application you just need to call the SetLicense method.
File licenseFile = new File(System.getProperty("user.dir") + "\\Aspose.Words.lic");
if (licenseFile.exists()) {
// This shows how to license Aspose.Words.
// If you don't specify a license, Aspose.Words works in evaluation mode.
License license = new License();
license.setLicense(licenseFile.getAbsolutePath());
}
Globals.mMainForm = new MainForm();
// Get the screen size
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screenSize = toolkit.getScreenSize();
// Calculate the frame location
int x = (screenSize.width - Globals.mMainForm.getWidth()) / 2;
int y = (screenSize.height - Globals.mMainForm.getHeight()) / 2;
// Set the new frame location
Globals.mMainForm.setLocation(x, y);
Globals.mMainForm.setTitle(Globals.APPLICATION_TITLE);
Globals.mMainForm.setIconImage(new ImageIcon(imgPath + "App.gif").getImage());
Globals.mMainForm.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
onClose();
}
});
Globals.mMainForm.toolOpenDocument.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onOpen();
}
});
Globals.mMainForm.toolSaveAs.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onSaveAs();
}
});
Globals.mMainForm.toolExpandAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onExpandAll();
}
});
Globals.mMainForm.toolCollapseAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onCollapseAll();
}
});
Globals.mMainForm.toolRemove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onRemove();
}
});
Globals.mMainForm.menuOpen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onOpen();
}
});
Globals.mMainForm.menuSaveAs.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onSaveAs();
}
});
Globals.mMainForm.menuExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onClose();
}
});
Globals.mMainForm.menuRemoveNode.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onRemove();
}
});
Globals.mMainForm.menuExpandAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onExpandAll();
}
});
Globals.mMainForm.menuCollapseAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onCollapseAll();
}
});
Globals.mMainForm.menuAbout.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
onAbout();
}
});
Globals.mMainForm.setVisible(true);
}
private void onClose() {
Globals.mMainForm.dispose();
}
/**
* Opens a document with the name and format provided in a standard Save As
* dialog.
*/
private void onOpen() {
try {
String fileName = Dialogs.openDocument();
if (!"".equals(fileName)) {
Globals.mMainForm.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Globals.mDocument = new Document(fileName);
Globals.mMainForm.setTitle(Globals.APPLICATION_TITLE + " - " + fileName);
Globals.mRootNode = Item.createItem(Globals.mDocument).getTreeNode();
Globals.mTreeModel = new DefaultTreeModel(Globals.mRootNode);
Globals.mTree = new JTree(Globals.mTreeModel);
Globals.mTree.setExpandsSelectedPaths(false);
Globals.mTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
Globals.mTree.setCellRenderer(new OurCellRenderer());
Globals.mTree.setShowsRootHandles(true);
Globals.mTree.addTreeWillExpandListener(this);
Globals.mTree.addTreeSelectionListener(this);
Globals.mTree.addKeyListener(this);
Globals.mMainForm.treeScrollPane.setViewportView(Globals.mTree);
TreePath path = new TreePath(Globals.mRootNode);
((Item) Globals.mRootNode.getUserObject()).onExpand();
Globals.mTree.expandPath(path);
Globals.mTree.setSelectionPath(path);
// Enable all toolbar buttons and menu items
Globals.mMainForm.menuSaveAs.setEnabled(true);
Globals.mMainForm.menuExpandAll.setEnabled(true);
Globals.mMainForm.menuCollapseAll.setEnabled(true);
Globals.mMainForm.toolSaveAs.setEnabled(true);
Globals.mMainForm.toolExpandAll.setEnabled(true);
Globals.mMainForm.toolCollapseAll.setEnabled(true);
}
} catch (Exception e) {
new ErrorDialog(e);
} finally {
// Set the cursor back to normal even if an exception occurs.
Globals.mMainForm.setCursor(null);
}
}
/**
* Saves the document with the name and format provided in standard Save As
* dialog.
*/
private void onSaveAs() {
String fileName = Dialogs.saveDocument();
if ("".equals(fileName) || Globals.mDocument == null) {
return;
}
Globals.mMainForm.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
Globals.mDocument.save(fileName);
} catch (Exception e) {
new ErrorDialog(e);
} finally {
// Set the cursor back to normal even if an exception occurs.
Globals.mMainForm.setCursor(null);
}
}
/**
* Expand all child nodes under the selected node.
*/
private void onExpandAll() {
TreePath path = Globals.mTree.getSelectionPath();
if (path != null) {
Globals.mMainForm.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
expandAll(Globals.mTree, path, true);
Globals.mMainForm.setCursor(null);
}
}
/**
* Collapse all child nodes under the selected node
*/
private void onCollapseAll() {
TreePath path = Globals.mTree.getSelectionPath();
if (path != null) {
Globals.mMainForm.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
expandAll(Globals.mTree, path, false);
Globals.mMainForm.setCursor(null);
}
}
private void expandAll(JTree tree, TreePath parent, boolean expand) {
// Traverse children.
TreeNode node = (TreeNode) parent.getLastPathComponent();
// Expansion or collapse must be done from the bottom-up
if (expand) {
tree.expandPath(parent);
}
if (node.getChildCount() >= 0) {
for (Enumeration e = node.children(); e.hasMoreElements();) {
TreeNode n = (TreeNode) e.nextElement();
TreePath path = parent.pathByAddingChild(n);
expandAll(tree, path, expand);
}
}
if (!expand) {
tree.collapsePath(parent);
}
}
/**
* Informs Item class, which provides GUI representation of a document node,
* that the corresponding TreeNode is about being expanded.
*/
public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) event.getPath().getLastPathComponent();
if (node != null) {
try {
((Item) node.getUserObject()).onExpand();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
}
/**
* Informs Item class, which provides GUI representation of a document node,
* that the corresponding TreeNode was selected.
*/
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) Globals.mTree.getLastSelectedPathComponent();
if (node == null) {
return;
}
try {
// This operation can take some time so we set the Cursor to WaitCursor.
Globals.mMainForm.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
// Show the text contained by selected document node.
Item selectedItem = (Item) node.getUserObject();
Globals.mMainForm.textArea.setText(selectedItem.getText());
Globals.mMainForm.textArea.moveCaretPosition(0);
Globals.mMainForm.toolRemove.setEnabled(selectedItem.isRemovable());
Globals.mMainForm.menuRemoveNode.setEnabled(selectedItem.isRemovable());
// Restore cursor.
Globals.mMainForm.setCursor(null);
} catch (Exception ex) {
Globals.mMainForm.textArea.setText("");
}
}
/**
* Removes the currently selected node.
*/
private void onRemove() {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) Globals.mTree.getSelectionPath().getLastPathComponent();
if (node != null) {
try {
((Item) node.getUserObject()).remove();
} catch (Exception e) {
}
}
}
/**
* Show the About dialog
*/
private void onAbout() {
new About();
}
public void keyTyped(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_TYPED && e.getKeyChar() == 127) {
onRemove();
}
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
/**
* Change the icon for the current node according to the node type.
*/
private class OurCellRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
super.getTreeCellRendererComponent(
tree, value, sel,
expanded, leaf, row,
hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object userObject = node.getUserObject();
if (userObject instanceof Item) {
ImageIcon icon = null;
try {
icon = ((Item) userObject).getIcon();
} catch (Exception e) {
throw new RuntimeException(e);
}
if (icon != null) {
setIcon(icon);
}
}
return this;
}
}
}