001    /*
002     * SVGViewer.java
003     *
004     *
005     *  The Salamander Project - 2D and 3D graphics libraries in Java
006     *  Copyright (C) 2004 Mark McKay
007     *
008     *  This library is free software; you can redistribute it and/or
009     *  modify it under the terms of the GNU Lesser General Public
010     *  License as published by the Free Software Foundation; either
011     *  version 2.1 of the License, or (at your option) any later version.
012     *
013     *  This library is distributed in the hope that it will be useful,
014     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
015     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016     *  Lesser General Public License for more details.
017     *
018     *  You should have received a copy of the GNU Lesser General Public
019     *  License along with this library; if not, write to the Free Software
020     *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
021     *
022     *  Mark McKay can be contacted at mark@kitfox.com.  Salamander and other
023     *  projects can be found at http://www.kitfox.com
024     *
025     * Created on April 3, 2004, 5:28 PM
026     */
027    
028    package com.kitfox.svg.app;
029    
030    import com.kitfox.svg.SVGCache;
031    import com.kitfox.svg.SVGDiagram;
032    import com.kitfox.svg.SVGDisplayPanel;
033    import com.kitfox.svg.SVGElement;
034    import com.kitfox.svg.SVGException;
035    import com.kitfox.svg.SVGUniverse;
036    import java.awt.BorderLayout;
037    import java.awt.Color;
038    import java.awt.Point;
039    import java.io.File;
040    import java.io.InputStream;
041    import java.net.URI;
042    import java.net.URL;
043    import java.net.URLEncoder;
044    import java.security.AccessControlException;
045    import java.util.ArrayList;
046    import java.util.Iterator;
047    import java.util.List;
048    import java.util.regex.Matcher;
049    import java.util.regex.Pattern;
050    import javax.swing.JFileChooser;
051    import javax.swing.JOptionPane;
052    
053    
054    /**
055     * @author Mark McKay
056     * @author <a href="mailto:mark@kitfox.com">Mark McKay</a>
057     */
058    public class SVGViewer extends javax.swing.JFrame 
059    {
060        public static final long serialVersionUID = 1;
061    
062        SVGDisplayPanel svgDisplayPanel = new SVGDisplayPanel();
063    
064        /** FileChooser for running in trusted environments */
065        final JFileChooser fileChooser;
066        {
067    //        fileChooser = new JFileChooser(new File("."));
068            JFileChooser fc = null;
069            try
070            {
071                fc = new JFileChooser();
072                fc.setFileFilter(
073                    new javax.swing.filechooser.FileFilter() {
074                        final Matcher matchLevelFile = Pattern.compile(".*\\.svg[z]?").matcher("");
075    
076                        public boolean accept(File file)
077                        {
078                            if (file.isDirectory()) return true;
079    
080                            matchLevelFile.reset(file.getName());
081                            return matchLevelFile.matches();
082                        }
083    
084                        public String getDescription() { return "SVG file (*.svg, *.svgz)"; }
085                    }
086                );
087            }
088            catch (AccessControlException ex)
089            {
090                //Do not create file chooser if webstart refuses permissions
091            }
092            fileChooser = fc;
093        }
094    
095        /** Backup file service for opening files in WebStart situations */
096        /*
097        final FileOpenService fileOpenService;
098        {
099            try 
100            { 
101                fileOpenService = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService"); 
102            } 
103            catch (UnavailableServiceException e) 
104            { 
105                fileOpenService = null; 
106            } 
107        }
108         */
109        
110        /** Creates new form SVGViewer */
111        public SVGViewer() {
112            initComponents();
113    
114            setSize(800, 600);
115    
116            svgDisplayPanel.setBgColor(Color.white);
117    
118            svgDisplayPanel.setPreferredSize(getSize());
119            panel_svgArea.add(svgDisplayPanel, BorderLayout.CENTER);
120    //        scrollPane_svgArea.setViewportView(svgDisplayPanel);
121        }
122    
123        private void loadURL(URL url)
124        {
125            boolean verbose = cmCheck_verbose.isSelected();
126            
127    //                SVGUniverse universe = new SVGUniverse();
128            SVGUniverse universe = SVGCache.getSVGUniverse();
129            SVGDiagram diagram = null;
130            URI uri;
131    
132            if (!CheckBoxMenuItem_anonInputStream.isSelected())
133            {
134                //Load from a disk with a valid URL
135                uri = universe.loadSVG(url);
136    
137                if (verbose) System.err.println("Loading document " + uri.toString());
138    
139                diagram = universe.getDiagram(uri);
140            }
141            else
142            {
143                //Load from a stream with no particular valid URL
144                try
145                {
146                    InputStream is = url.openStream();
147                    uri = universe.loadSVG(is, "defaultName");
148    
149                    if (verbose) System.err.println("Loading document " + uri.toString());
150                }
151                catch (Exception e)
152                {
153                    e.printStackTrace();
154                    return;
155                }
156            }
157    /*
158    ByteArrayOutputStream bs = new ByteArrayOutputStream();
159    ObjectOutputStream os = new ObjectOutputStream(bs);
160    os.writeObject(universe);
161    os.close();
162    
163    ByteArrayInputStream bin = new ByteArrayInputStream(bs.toByteArray());
164    ObjectInputStream is = new ObjectInputStream(bin);
165    universe = (SVGUniverse)is.readObject();
166    is.close();
167    */
168    
169            diagram = universe.getDiagram(uri);
170    
171            svgDisplayPanel.setDiagram(diagram);
172            repaint();
173        }
174        
175        /** This method is called from within the constructor to
176         * initialize the form.
177         * WARNING: Do NOT modify this code. The content of this method is
178         * always regenerated by the Form Editor.
179         */
180        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
181        private void initComponents()
182        {
183            scrollPane_svgArea = new javax.swing.JScrollPane();
184            panel_svgArea = new javax.swing.JPanel();
185            jMenuBar1 = new javax.swing.JMenuBar();
186            menu_file = new javax.swing.JMenu();
187            cm_loadFile = new javax.swing.JMenuItem();
188            cm_loadUrl = new javax.swing.JMenuItem();
189            menu_window = new javax.swing.JMenu();
190            cm_800x600 = new javax.swing.JMenuItem();
191            CheckBoxMenuItem_anonInputStream = new javax.swing.JCheckBoxMenuItem();
192            cmCheck_verbose = new javax.swing.JCheckBoxMenuItem();
193            menu_help = new javax.swing.JMenu();
194            cm_about = new javax.swing.JMenuItem();
195    
196            setTitle("SVG Viewer - Salamander Project");
197            addWindowListener(new java.awt.event.WindowAdapter()
198            {
199                public void windowClosing(java.awt.event.WindowEvent evt)
200                {
201                    exitForm(evt);
202                }
203            });
204    
205            panel_svgArea.setLayout(new java.awt.BorderLayout());
206    
207            panel_svgArea.addMouseListener(new java.awt.event.MouseAdapter()
208            {
209                public void mousePressed(java.awt.event.MouseEvent evt)
210                {
211                    panel_svgAreaMousePressed(evt);
212                }
213                public void mouseReleased(java.awt.event.MouseEvent evt)
214                {
215                    panel_svgAreaMouseReleased(evt);
216                }
217            });
218    
219            scrollPane_svgArea.setViewportView(panel_svgArea);
220    
221            getContentPane().add(scrollPane_svgArea, java.awt.BorderLayout.CENTER);
222    
223            menu_file.setMnemonic('f');
224            menu_file.setText("File");
225            cm_loadFile.setMnemonic('l');
226            cm_loadFile.setText("Load File...");
227            cm_loadFile.addActionListener(new java.awt.event.ActionListener()
228            {
229                public void actionPerformed(java.awt.event.ActionEvent evt)
230                {
231                    cm_loadFileActionPerformed(evt);
232                }
233            });
234    
235            menu_file.add(cm_loadFile);
236    
237            cm_loadUrl.setText("Load URL...");
238            cm_loadUrl.addActionListener(new java.awt.event.ActionListener()
239            {
240                public void actionPerformed(java.awt.event.ActionEvent evt)
241                {
242                    cm_loadUrlActionPerformed(evt);
243                }
244            });
245    
246            menu_file.add(cm_loadUrl);
247    
248            jMenuBar1.add(menu_file);
249    
250            menu_window.setText("Window");
251            cm_800x600.setText("800 x 600");
252            cm_800x600.addActionListener(new java.awt.event.ActionListener()
253            {
254                public void actionPerformed(java.awt.event.ActionEvent evt)
255                {
256                    cm_800x600ActionPerformed(evt);
257                }
258            });
259    
260            menu_window.add(cm_800x600);
261    
262            CheckBoxMenuItem_anonInputStream.setText("Anonymous Input Stream");
263            menu_window.add(CheckBoxMenuItem_anonInputStream);
264    
265            cmCheck_verbose.setText("Verbose");
266            cmCheck_verbose.addActionListener(new java.awt.event.ActionListener()
267            {
268                public void actionPerformed(java.awt.event.ActionEvent evt)
269                {
270                    cmCheck_verboseActionPerformed(evt);
271                }
272            });
273    
274            menu_window.add(cmCheck_verbose);
275    
276            jMenuBar1.add(menu_window);
277    
278            menu_help.setText("Help");
279            cm_about.setText("About...");
280            cm_about.addActionListener(new java.awt.event.ActionListener()
281            {
282                public void actionPerformed(java.awt.event.ActionEvent evt)
283                {
284                    cm_aboutActionPerformed(evt);
285                }
286            });
287    
288            menu_help.add(cm_about);
289    
290            jMenuBar1.add(menu_help);
291    
292            setJMenuBar(jMenuBar1);
293    
294            pack();
295        }// </editor-fold>//GEN-END:initComponents
296    
297        private void cm_loadUrlActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cm_loadUrlActionPerformed
298        {//GEN-HEADEREND:event_cm_loadUrlActionPerformed
299            String urlStrn = JOptionPane.showInputDialog(this, "Enter URL of SVG file");
300            if (urlStrn == null) return;
301            
302            try
303            {
304                URL url = new URL(URLEncoder.encode(urlStrn, "UTF-8"));
305                loadURL(url);
306            }
307            catch (Exception e)
308            {
309                e.printStackTrace();
310            }
311    
312        }//GEN-LAST:event_cm_loadUrlActionPerformed
313    
314        private void panel_svgAreaMouseReleased(java.awt.event.MouseEvent evt)//GEN-FIRST:event_panel_svgAreaMouseReleased
315        {//GEN-HEADEREND:event_panel_svgAreaMouseReleased
316            SVGDiagram diagram = svgDisplayPanel.getDiagram();
317            List pickedElements;
318            try
319            {
320                pickedElements = diagram.pick(new Point(evt.getX(), evt.getY()), null);
321            } 
322            catch (SVGException ex)
323            {
324                ex.printStackTrace();
325                return;
326            }
327            
328            System.out.println("Pick results:");
329            for (Iterator it = pickedElements.iterator(); it.hasNext();)
330            {
331                ArrayList path = (ArrayList)it.next();
332                
333                System.out.print("  Path: ");
334                
335                for (Iterator it2 = path.iterator(); it2.hasNext();)
336                {
337                    SVGElement ele = (SVGElement)it2.next();
338    
339                    System.out.print("" + ele.getId() + "(" + ele.getClass().getName() + ") ");
340                }
341                System.out.println();
342            }
343        }//GEN-LAST:event_panel_svgAreaMouseReleased
344    
345        private void panel_svgAreaMousePressed(java.awt.event.MouseEvent evt)//GEN-FIRST:event_panel_svgAreaMousePressed
346        {//GEN-HEADEREND:event_panel_svgAreaMousePressed
347    
348        }//GEN-LAST:event_panel_svgAreaMousePressed
349    
350        private void cmCheck_verboseActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cmCheck_verboseActionPerformed
351        {//GEN-HEADEREND:event_cmCheck_verboseActionPerformed
352            SVGCache.getSVGUniverse().setVerbose(cmCheck_verbose.isSelected());
353        }//GEN-LAST:event_cmCheck_verboseActionPerformed
354    
355        private void cm_aboutActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cm_aboutActionPerformed
356        {//GEN-HEADEREND:event_cm_aboutActionPerformed
357            //JOptionPane.showMessageDialog(this, "Salamander SVG - Created by Mark McKay\nhttp://www.kitfox.com");
358            VersionDialog dlg = new VersionDialog(this, true, cmCheck_verbose.isSelected());
359            dlg.setVisible(true);
360        }//GEN-LAST:event_cm_aboutActionPerformed
361    
362        private void cm_800x600ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cm_800x600ActionPerformed
363            setSize(800, 600);
364        }//GEN-LAST:event_cm_800x600ActionPerformed
365        
366        private void cm_loadFileActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cm_loadFileActionPerformed
367        {//GEN-HEADEREND:event_cm_loadFileActionPerformed
368            try
369            {
370                int retVal = fileChooser.showOpenDialog(this);
371                if (retVal == JFileChooser.APPROVE_OPTION)
372                {
373                    File chosenFile = fileChooser.getSelectedFile();
374    
375                    URL url = chosenFile.toURI().toURL();
376    
377                    loadURL(url);
378                }
379            }
380            /*
381            catch (IOException ioe)
382            {
383                try
384                {
385                    //We may be in a WebStart app.  Try again with a FileOpenService
386                    FileContents fc = fileOpenService.openFileDialog(null, new String[]{"svg"});
387                    InputStream is = fc.getInputStream();
388                    String name = fc.getName();
389                }
390                catch (Exception e)
391                {
392                    e.printStackTrace();
393                }
394            }
395             */
396            catch (Exception e)
397            {
398                e.printStackTrace();
399            }
400    
401        }//GEN-LAST:event_cm_loadFileActionPerformed
402    
403        /** Exit the Application */
404        private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
405    //        setVisible(false);
406    //        dispose();
407            System.exit(0);
408        }//GEN-LAST:event_exitForm
409    
410        /**
411         * @param args the command line arguments
412         */
413        public static void main(String args[]) {
414            new SVGViewer().setVisible(true);
415        }
416    
417        // Variables declaration - do not modify//GEN-BEGIN:variables
418        private javax.swing.JCheckBoxMenuItem CheckBoxMenuItem_anonInputStream;
419        private javax.swing.JCheckBoxMenuItem cmCheck_verbose;
420        private javax.swing.JMenuItem cm_800x600;
421        private javax.swing.JMenuItem cm_about;
422        private javax.swing.JMenuItem cm_loadFile;
423        private javax.swing.JMenuItem cm_loadUrl;
424        private javax.swing.JMenuBar jMenuBar1;
425        private javax.swing.JMenu menu_file;
426        private javax.swing.JMenu menu_help;
427        private javax.swing.JMenu menu_window;
428        private javax.swing.JPanel panel_svgArea;
429        private javax.swing.JScrollPane scrollPane_svgArea;
430        // End of variables declaration//GEN-END:variables
431    
432    }