/* (C) 2001-2002, DIUF, http://www.unifr.ch/diuf
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package iiuf.xmillum;
import iiuf.dom.DOM;
import iiuf.xmillum.tool.XMLTree;
import iiuf.util.FilePreferences;
import iiuf.util.Preferences;
import iiuf.util.Queue;
import iiuf.util.Util;
import iiuf.awt.BorderLayout;
import iiuf.swing.JWindowToolBarUI;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
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.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.InputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.media.jai.PlanarImage;
import javax.media.jai.JAI;
import javax.media.jai.TileCache;
import javax.swing.AbstractAction;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDesktopPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.filechooser.FileFilter;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* XMIllumDesktop
*
* JDesktop implementation of xmillum.
*
* @author $Author: ohitz $
* @version $Revision: 1.1 $
*/
public class XMIllumDesktop implements StatusListener, DocumentChangeListener, IllumSource, WindowCreator {
static final String XSLT_DIRECTORY = "xslt_directory";
static final String XSLT_LASTUSED = "xslt_lastused";
static final String XML_DIRECTORY = "xml_directory";
JDesktopPane desktop = setupDesktop();
BrowserContext context = new BrowserContext();
JLabel status = new JLabel();
JComboBox stylesheetList;
JComboBox layersList;
public XMIllumDesktop() {
context.addStatusListener(this);
context.addDocumentChangeListener(this);
context.setWindowCreator(this);
setStatus("Welcome to XMIllum!");
JPanel main = new JPanel();
main.setLayout(new BorderLayout());
main.add(new BrowserPanel(context), BorderLayout.CENTER);
main.add(status, BorderLayout.SOUTH);
Window w = createWindow("XMIllum");
w.setMenu(setupMenubar());
w.getContentPane().setLayout(new BorderLayout());
w.getContentPane().add(setupToolbar(), BorderLayout.NORTH);
w.getContentPane().add(main, BorderLayout.CENTER);
w.open();
}
/** Sets up the desktop */
public JDesktopPane setupDesktop() {
JDesktopPane desktop = new JDesktopPane();
Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
size.width = size.width - 80;
size.height = size.height - 40;
JFrame window = new JFrame("XMIllum");
window.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
Preferences.store();
System.exit(0);
}
});
window.setContentPane(desktop);
window.pack();
window.setSize(size);
window.setLocation(0, 0);
window.show();
Preferences.watch(window);
return desktop;
}
/** Sets up a toolbar */
public JToolBar setupToolbar() {
JToolBar toolbar = new JToolBar();
toolbar.setUI(new JWindowToolBarUI());
toolbar.add(new JLabel("Stylesheet:"));
stylesheetList = new JComboBox((String[]) Preferences.get(XSLT_LASTUSED, new String[0]));
stylesheetList.setEditable(false);
stylesheetList.setLightWeightPopupEnabled(true);
stylesheetList.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
File file = new File((String) stylesheetList.getSelectedItem());
try {
context.loadStylesheet(file.toURL());
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
}
});
stylesheetList.setRenderer(new DefaultListCellRenderer() {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
String filename = "";
try {
filename = (new File((String) value)).getName();
} catch (NullPointerException e) {
}
return super.getListCellRendererComponent(list, filename, index, isSelected, cellHasFocus);
}
});
toolbar.add(stylesheetList);
JButton stylesheetButton = new JButton("Load new");
stylesheetButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File((String) Preferences.get(XSLT_DIRECTORY, "")));
fc.addChoosableFileFilter(new FileFilter() {
public boolean accept(File f) {
return f.isDirectory() || f.getName().endsWith(".xsl");
}
public String getDescription() {
return ".xsl Stylesheets";
}
});
if (JFileChooser.APPROVE_OPTION == fc.showOpenDialog(null)) {
Preferences.set(XSLT_DIRECTORY, fc.getCurrentDirectory().getAbsolutePath());
File file = fc.getSelectedFile();
stylesheetList.insertItemAt(file.getAbsolutePath(), 0);
stylesheetList.setSelectedIndex(0);
// Save combobox contents to preferences
ComboBoxModel model = stylesheetList.getModel();
int size = model.getSize();
String[] lastUsed = new String[(model.getSize() <= 10) ? model.getSize() : 10];
for (int i = 0; i < lastUsed.length; i++) {
lastUsed[i] = (String) model.getElementAt(i);
}
Preferences.set(XSLT_LASTUSED, lastUsed);
}
}
});
toolbar.add(stylesheetButton);
toolbar.addSeparator();
toolbar.add(new JLabel("Layer:"));
layersList = new JComboBox();
layersList.setEditable(false);
layersList.setLightWeightPopupEnabled(true);
layersList.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// context.displayLayer((String) layersList.getSelectedItem());
}
});
toolbar.add(layersList);
return toolbar;
}
/** Sets up a menubar */
public JMenuBar setupMenubar() {
JMenuBar menubar = new JMenuBar();
JMenu menu;
JMenuItem menuItem;
menu = menubar.add(new JMenu("File"));
menu.setMnemonic(KeyEvent.VK_F);
// File / Open
menuItem = menu.add(new AbstractAction("Open File...") {
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File((String) Preferences.get(XML_DIRECTORY, "")));
fc.addChoosableFileFilter(new FileFilter() {
public boolean accept(File f) {
return f.isDirectory() || f.getName().endsWith(".xml");
}
public String getDescription() {
return ".xml Files";
}
});
if (JFileChooser.APPROVE_OPTION == fc.showOpenDialog(desktop)) {
Preferences.set(XML_DIRECTORY, fc.getCurrentDirectory().getAbsolutePath());
try {
sourceDocument = fc.getSelectedFile().toURL();
context.setSource(XMIllumDesktop.this);
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
}
}
});
menuItem.setMnemonic(KeyEvent.VK_O);
menuItem = menu.add(new AbstractAction("Open Location...") {
public void actionPerformed(ActionEvent e) {
}
});
// File / Close
menuItem = menu.add(new AbstractAction("Close") {
public void actionPerformed(ActionEvent e) {
sourceDocument = null;
context.setSource(XMIllumDesktop.this);
}
});
menuItem.setMnemonic(KeyEvent.VK_C);
menu.addSeparator();
// File / Save
menuItem = menu.add(new AbstractAction("Save") {
public void actionPerformed(ActionEvent e) {
// System.out.println(iiuf.dom.DOMUtils.toString(context.document.getStrippedOriginalDocument().getDocumentElement()));
}
});
menuItem.setMnemonic(KeyEvent.VK_S);
// File / Save As...
menuItem = menu.add(new AbstractAction("Save As...") {
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File((String) Preferences.get(XML_DIRECTORY, "")));
fc.addChoosableFileFilter(new FileFilter() {
public boolean accept(File f) {
return f.isDirectory() || f.getName().endsWith(".xml");
}
public String getDescription() {
return ".xml Files";
}
});
if (JFileChooser.APPROVE_OPTION == fc.showSaveDialog(desktop)) {
Preferences.set(XML_DIRECTORY, fc.getCurrentDirectory().getAbsolutePath());
// ...Save the file...
}
}
});
menuItem.setMnemonic(KeyEvent.VK_A);
menu.addSeparator();
// File / Print...
menuItem = menu.add(new AbstractAction("Print...") {
public void actionPerformed(ActionEvent e) {
}
});
menuItem.setMnemonic(KeyEvent.VK_P);
menu.addSeparator();
// File / Exit
menuItem = menu.add(new AbstractAction("Exit") {
public void actionPerformed(ActionEvent e) {
Preferences.store();
System.exit(0);
}
});
menuItem.setMnemonic(KeyEvent.VK_X);
// Display
menu = menubar.add(new JMenu("Display"));
// Display / 100%
menuItem = menu.add(new AbstractAction("100%") {
public void actionPerformed(ActionEvent e) { context.setScale(1.0D); }
});
menuItem.setMnemonic(KeyEvent.VK_1);
// Display / 50%
menuItem = menu.add(new AbstractAction("50%") {
public void actionPerformed(ActionEvent e) { context.setScale(0.5D); }
});
menuItem.setMnemonic(KeyEvent.VK_2);
// Display / 25%
menuItem = menu.add(new AbstractAction("25%") {
public void actionPerformed(ActionEvent e) { context.setScale(0.25D); }
});
menuItem.setMnemonic(KeyEvent.VK_3);
// Display / 10%
menuItem = menu.add(new AbstractAction("10%") {
public void actionPerformed(ActionEvent e) { context.setScale(0.1D); }
});
menuItem.setMnemonic(KeyEvent.VK_4);
// Windows
menu = menubar.add(new JMenu("Windows"));
// Windows / Original XML
menuItem = menu.add(new AbstractAction("Original XML") {
public void actionPerformed(ActionEvent e) {
XMLTree panel = new XMLTree() {
protected Element selectionElementToTree(Element e) {
if (!e.hasAttribute("ref")) return null;
return this.context.getSourceElementByReference(e.getAttribute("ref"));
}
protected Element treeToSelectionElement(Element e) {
NodeList nl = this.context.getInternalElementsWhichReference(e.getAttributeNS("tmp", "refvalue"));
if (nl.getLength() > 0) {
return (Element) nl.item(0);
} else {
return null;
}
}
};
panel.activateTool(context, context.getDocument().getSourceDocument());
}
});
// Windows / Transformed XML
menuItem = menu.add(new AbstractAction("Transformed XML") {
public void actionPerformed(ActionEvent e) {
XMLTree panel = new XMLTree();
// panel.activateTool(context, context.getDocument().getBrowserSection());
}
});
// Windows / Stylesheet
menuItem = menu.add(new AbstractAction("Stylesheet") {
public void actionPerformed(ActionEvent e) {
XMLTree panel = new XMLTree();
// panel.activateTool(context, context.getDocument().getStylesheetDocument().getDocumentElement());
}
});
return menubar;
}
// StatusListener interface
public void setStatus(String message) {
status.setText(message);
}
// DocumentChangeListener interface
public void documentChanged(DocumentChangeEvent e) {
switch (e.getType()) {
case DocumentChangeEvent.DOCUMENT_CHANGED:
String[] layers = context.getDocument().getLayerNames();
layersList.removeAllItems();
for (int i = 0; i < layers.length; i++) {
layersList.insertItemAt(layers[i], i);
}
if (layers.length > 0) layersList.setSelectedIndex(0);
break;
}
}
// IllumSource interface
private URL sourceDocument;
public Element getData() throws IllumException {
if (sourceDocument == null) return null;
try {
DOM dom = DOM.getInstance();
InputSource isource = new InputSource(sourceDocument.openStream());
return dom.parseDocument(isource, false).getDocumentElement();
} catch (IOException e) {
throw new IllumException(e);
} catch (SAXException e) {
throw new IllumException(e);
}
}
public URL getBaseURL() {
return sourceDocument;
}
public PlanarImage getImage(String id, double scale) {
return null;
}
// WindowCreator interface
public Window createWindow(String title) {
return new IWindow(title);
}
class IWindow extends JInternalFrame implements Window {
public IWindow(String title) {
super("title", true, false, true, true);
}
public void setMenu(JMenuBar menubar) {
setJMenuBar(menubar);
}
public void open() {
pack();
show();
desktop.add(this);
}
public void close() {
setVisible(false);
dispose();
}
public Container getContentPane() {
return super.getContentPane();
}
}
/** Main entry point */
public static void main(String arg[]) {
System.setProperty(DOM.DEFAULT_DOM_PROPERTY, "iiuf.dom.Xerces");
TileCache cache = JAI.createTileCache(64000000);
cache.setMemoryThreshold(0.75F);
JAI.getDefaultInstance().setTileCache(cache);
Preferences.addStore(new FilePreferences("xmillum"));
new XMIllumDesktop();
}
}