/* * SVGViewer.java * * * The Salamander Project - 2D and 3D graphics libraries in Java * Copyright (C) 2004 Mark McKay * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Mark McKay can be contacted at mark@kitfox.com. Salamander and other * projects can be found at http://www.kitfox.com * * Created on April 3, 2004, 5:28 PM */ package com.kitfox.svg.app; import com.kitfox.svg.SVGDiagram; import com.kitfox.svg.SVGDisplayPanel; import com.kitfox.svg.SVGElement; import com.kitfox.svg.SVGException; import com.kitfox.svg.SVGUniverse; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.io.File; import java.io.InputStream; import java.net.URI; import java.net.URL; import java.net.URLEncoder; import java.security.AccessControlException; import java.util.ArrayList; import java.util.List; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JFileChooser; import javax.swing.JOptionPane; /** * @author Mark McKay * @author Mark McKay */ public class SVGPlayer extends javax.swing.JFrame { public static final long serialVersionUID = 1; SVGDisplayPanel svgDisplayPanel = new SVGDisplayPanel(); final PlayerDialog playerDialog; SVGUniverse universe; /** FileChooser for running in trusted environments */ final JFileChooser fileChooser; { // fileChooser = new JFileChooser(new File(".")); JFileChooser fc = null; try { fc = new JFileChooser(); fc.setFileFilter( new javax.swing.filechooser.FileFilter() { final Matcher matchLevelFile = Pattern.compile(".*\\.svg[z]?").matcher(""); public boolean accept(File file) { if (file.isDirectory()) return true; matchLevelFile.reset(file.getName()); return matchLevelFile.matches(); } public String getDescription() { return "SVG file (*.svg, *.svgz)"; } } ); } catch (AccessControlException ex) { //Do not create file chooser if webstart refuses permissions } fileChooser = fc; } /** Backup file service for opening files in WebStart situations */ /* final FileOpenService fileOpenService; { try { fileOpenService = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService"); } catch (UnavailableServiceException e) { fileOpenService = null; } } */ /** Creates new form SVGViewer */ public SVGPlayer() { initComponents(); setSize(800, 600); svgDisplayPanel.setBgColor(Color.white); svgDisplayPanel.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { SVGDiagram diagram = svgDisplayPanel.getDiagram(); if (diagram == null) return; System.out.println("Picking at cursor (" + evt.getX() + ", " + evt.getY() + ")"); try { List paths = diagram.pick(new Point2D.Float(evt.getX(), evt.getY()), null); for (int i = 0; i < paths.size(); i++) { ArrayList path = (ArrayList)paths.get(i); System.out.println(pathToString(path)); } } catch (SVGException ex) { ex.printStackTrace(); } } } ); svgDisplayPanel.setPreferredSize(getSize()); scrollPane_svgArea.setViewportView(svgDisplayPanel); playerDialog = new PlayerDialog(this); } private String pathToString(List path) { if (path.size() == 0) return ""; StringBuffer sb = new StringBuffer(); sb.append(path.get(0)); for (int i = 1; i < path.size(); i++) { sb.append("/"); sb.append(((SVGElement)path.get(i)).getId()); } return sb.toString(); } public void updateTime(double curTime) { try { if (universe != null) { universe.setCurTime(curTime); universe.updateTime(); // svgDisplayPanel.updateTime(curTime); repaint(); } } catch (Exception e) { e.printStackTrace(); } } private void loadURL(URL url) { boolean verbose = cmCheck_verbose.isSelected(); universe = new SVGUniverse(); universe.setVerbose(verbose); SVGDiagram diagram = null; if (!CheckBoxMenuItem_anonInputStream.isSelected()) { //Load from a disk with a valid URL URI uri = universe.loadSVG(url); if (verbose) System.err.println(uri.toString()); diagram = universe.getDiagram(uri); } else { //Load from a stream with no particular valid URL try { InputStream is = url.openStream(); URI uri = universe.loadSVG(is, "defaultName"); if (verbose) System.err.println(uri.toString()); diagram = universe.getDiagram(uri); } catch (Exception e) { e.printStackTrace(); } } svgDisplayPanel.setDiagram(diagram); repaint(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { scrollPane_svgArea = new javax.swing.JScrollPane(); jMenuBar1 = new javax.swing.JMenuBar(); menu_file = new javax.swing.JMenu(); cm_loadFile = new javax.swing.JMenuItem(); cm_loadUrl = new javax.swing.JMenuItem(); menu_window = new javax.swing.JMenu(); cm_player = new javax.swing.JMenuItem(); jSeparator2 = new javax.swing.JSeparator(); cm_800x600 = new javax.swing.JMenuItem(); CheckBoxMenuItem_anonInputStream = new javax.swing.JCheckBoxMenuItem(); cmCheck_verbose = new javax.swing.JCheckBoxMenuItem(); menu_help = new javax.swing.JMenu(); cm_about = new javax.swing.JMenuItem(); setTitle("SVG Player - Salamander Project"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); getContentPane().add(scrollPane_svgArea, java.awt.BorderLayout.CENTER); menu_file.setMnemonic('f'); menu_file.setText("File"); cm_loadFile.setMnemonic('l'); cm_loadFile.setText("Load File..."); cm_loadFile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cm_loadFileActionPerformed(evt); } }); menu_file.add(cm_loadFile); cm_loadUrl.setText("Load URL..."); cm_loadUrl.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cm_loadUrlActionPerformed(evt); } }); menu_file.add(cm_loadUrl); jMenuBar1.add(menu_file); menu_window.setText("Window"); cm_player.setText("Player"); cm_player.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cm_playerActionPerformed(evt); } }); menu_window.add(cm_player); menu_window.add(jSeparator2); cm_800x600.setText("800 x 600"); cm_800x600.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cm_800x600ActionPerformed(evt); } }); menu_window.add(cm_800x600); CheckBoxMenuItem_anonInputStream.setText("Anonymous Input Stream"); menu_window.add(CheckBoxMenuItem_anonInputStream); cmCheck_verbose.setText("Verbose"); cmCheck_verbose.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cmCheck_verboseActionPerformed(evt); } }); menu_window.add(cmCheck_verbose); jMenuBar1.add(menu_window); menu_help.setText("Help"); cm_about.setText("About..."); cm_about.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cm_aboutActionPerformed(evt); } }); menu_help.add(cm_about); jMenuBar1.add(menu_help); setJMenuBar(jMenuBar1); pack(); }// //GEN-END:initComponents private void cm_loadUrlActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cm_loadUrlActionPerformed {//GEN-HEADEREND:event_cm_loadUrlActionPerformed String urlStrn = JOptionPane.showInputDialog(this, "Enter URL of SVG file"); if (urlStrn == null) return; try { URL url = new URL(URLEncoder.encode(urlStrn, "UTF-8")); loadURL(url); } catch (Exception e) { e.printStackTrace(); } }//GEN-LAST:event_cm_loadUrlActionPerformed private void cmCheck_verboseActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cmCheck_verboseActionPerformed {//GEN-HEADEREND:event_cmCheck_verboseActionPerformed // TODO add your handling code here: }//GEN-LAST:event_cmCheck_verboseActionPerformed private void cm_playerActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cm_playerActionPerformed {//GEN-HEADEREND:event_cm_playerActionPerformed playerDialog.setVisible(true); }//GEN-LAST:event_cm_playerActionPerformed private void cm_aboutActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cm_aboutActionPerformed {//GEN-HEADEREND:event_cm_aboutActionPerformed VersionDialog dia = new VersionDialog(this, true, cmCheck_verbose.isSelected()); dia.setVisible(true); // JOptionPane.showMessageDialog(this, "Salamander SVG - Created by Mark McKay\nhttp://www.kitfox.com"); }//GEN-LAST:event_cm_aboutActionPerformed private void cm_800x600ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cm_800x600ActionPerformed setSize(800, 600); }//GEN-LAST:event_cm_800x600ActionPerformed private void cm_loadFileActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cm_loadFileActionPerformed {//GEN-HEADEREND:event_cm_loadFileActionPerformed boolean verbose = cmCheck_verbose.isSelected(); try { int retVal = fileChooser.showOpenDialog(this); if (retVal == JFileChooser.APPROVE_OPTION) { File chosenFile = fileChooser.getSelectedFile(); URL url = chosenFile.toURI().toURL(); loadURL(url); } } catch (Exception e) { e.printStackTrace(); } }//GEN-LAST:event_cm_loadFileActionPerformed /** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm System.exit(0); }//GEN-LAST:event_exitForm /** * @param args the command line arguments */ public static void main(String args[]) { new SVGPlayer().setVisible(true); } public void updateTime(double curTime, double timeStep, int playState) { } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBoxMenuItem CheckBoxMenuItem_anonInputStream; private javax.swing.JCheckBoxMenuItem cmCheck_verbose; private javax.swing.JMenuItem cm_800x600; private javax.swing.JMenuItem cm_about; private javax.swing.JMenuItem cm_loadFile; private javax.swing.JMenuItem cm_loadUrl; private javax.swing.JMenuItem cm_player; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JSeparator jSeparator2; private javax.swing.JMenu menu_file; private javax.swing.JMenu menu_help; private javax.swing.JMenu menu_window; private javax.swing.JScrollPane scrollPane_svgArea; // End of variables declaration//GEN-END:variables }