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 }