OpenFileAction.java

  1. /*
  2.  *  Copyright (c) 2001-2024, Jean Tessier
  3.  *  All rights reserved.
  4.  *  
  5.  *  Redistribution and use in source and binary forms, with or without
  6.  *  modification, are permitted provided that the following conditions
  7.  *  are met:
  8.  *  
  9.  *      * Redistributions of source code must retain the above copyright
  10.  *        notice, this list of conditions and the following disclaimer.
  11.  *  
  12.  *      * Redistributions in binary form must reproduce the above copyright
  13.  *        notice, this list of conditions and the following disclaimer in the
  14.  *        documentation and/or other materials provided with the distribution.
  15.  *  
  16.  *      * Neither the name of Jean Tessier nor the names of his contributors
  17.  *        may be used to endorse or promote products derived from this software
  18.  *        without specific prior written permission.
  19.  *  
  20.  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21.  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22.  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23.  *  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR
  24.  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25.  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26.  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27.  *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28.  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29.  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30.  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31.  */

  32. package com.jeantessier.dependencyfinder.gui;

  33. import java.awt.event.*;
  34. import java.io.*;
  35. import java.util.*;
  36. import javax.swing.*;
  37. import javax.xml.parsers.*;

  38. import org.xml.sax.*;

  39. import com.jeantessier.dependency.*;

  40. public class OpenFileAction extends AbstractAction implements Runnable, DependencyListener {
  41.     private final DependencyFinder model;
  42.     private File file;

  43.     public OpenFileAction(DependencyFinder model) {
  44.         this.model = model;

  45.         putValue(Action.LONG_DESCRIPTION, "Load dependency graph from XML file");
  46.         putValue(Action.NAME, "Open");
  47.         putValue(Action.SMALL_ICON, new ImageIcon(getClass().getResource("icons/openfile.gif")));
  48.     }

  49.     public void actionPerformed(ActionEvent e) {
  50.         JFileChooser chooser = new JFileChooser();
  51.         chooser.addChoosableFileFilter(new XMLFileFilter());
  52.         int returnValue = chooser.showOpenDialog(model);
  53.         if (returnValue == JFileChooser.APPROVE_OPTION) {
  54.             file = chooser.getSelectedFile();
  55.             new Thread(this).start();
  56.         }
  57.     }

  58.     public void run() {
  59.         model.setNewDependencyGraph();
  60.         model.addInputFile(file);

  61.         try {
  62.             Date start = new Date();

  63.             String filename = file.getCanonicalPath();

  64.             NodeLoader loader = new NodeLoader(model.getNodeFactory());
  65.             loader.addDependencyListener(this);

  66.             model.getProgressBar().setIndeterminate(true);

  67.             model.getStatusLine().showInfo("Loading " + filename + " ...");
  68.             ProgressMonitorInputStream in = new ProgressMonitorInputStream(model, "Reading " + filename, new FileInputStream(filename));
  69.             in.getProgressMonitor().setMillisToDecideToPopup(0);
  70.             loader.load(in);
  71.             model.setTitle("Dependency Finder - " + filename);

  72.             if (model.getMaximize()) {
  73.                 model.getStatusLine().showInfo("Maximizing ...");
  74.                 new LinkMaximizer().traverseNodes(model.getPackages());
  75.             } else if (model.getMinimize()) {
  76.                 model.getStatusLine().showInfo("Minimizing ...");
  77.                 new LinkMinimizer().traverseNodes(model.getPackages());
  78.             }

  79.             Date stop = new Date();

  80.             model.getStatusLine().showInfo("Done (" + ((stop.getTime() - start.getTime()) / (double) 1000) + " secs).");
  81.         } catch (SAXException | ParserConfigurationException ex) {
  82.             model.getStatusLine().showError("Cannot parse: " + ex.getClass().getName() + ": " + ex.getMessage());
  83.         } catch (IOException ex) {
  84.             model.getStatusLine().showError("Cannot load: " + ex.getClass().getName() + ": " + ex.getMessage());
  85.         } finally {
  86.             model.getProgressBar().setIndeterminate(false);

  87.             if (model.getPackages() == null) {
  88.                 model.setTitle("Dependency Finder");
  89.             }
  90.         }
  91.     }

  92.     public void beginClass(DependencyEvent event) {
  93.         model.getStatusLine().showInfo("Loading dependencies for " + event.getClassName() + " ...");
  94.     }
  95. }