| 
6
 | 
     1 /**
 | 
| 
 | 
     2  *
 | 
| 
 | 
     3  * Copyright INRA-URGI 2009-2010
 | 
| 
 | 
     4  * 
 | 
| 
 | 
     5  * This software is governed by the CeCILL license under French law and
 | 
| 
 | 
     6  * abiding by the rules of distribution of free software. You can use,
 | 
| 
 | 
     7  * modify and/ or redistribute the software under the terms of the CeCILL
 | 
| 
 | 
     8  * license as circulated by CEA, CNRS and INRIA at the following URL
 | 
| 
 | 
     9  * "http://www.cecill.info".
 | 
| 
 | 
    10  * 
 | 
| 
 | 
    11  * As a counterpart to the access to the source code and rights to copy,
 | 
| 
 | 
    12  * modify and redistribute granted by the license, users are provided only
 | 
| 
 | 
    13  * with a limited warranty and the software's author, the holder of the
 | 
| 
 | 
    14  * economic rights, and the successive licensors have only limited
 | 
| 
 | 
    15  * liability.
 | 
| 
 | 
    16  * 
 | 
| 
 | 
    17  * In this respect, the user's attention is drawn to the risks associated
 | 
| 
 | 
    18  * with loading, using, modifying and/or developing or reproducing the
 | 
| 
 | 
    19  * software by the user in light of its specific status of free software,
 | 
| 
 | 
    20  * that may mean that it is complicated to manipulate, and that also
 | 
| 
 | 
    21  * therefore means that it is reserved for developers and experienced
 | 
| 
 | 
    22  * professionals having in-depth computer knowledge. Users are therefore
 | 
| 
 | 
    23  * encouraged to load and test the software's suitability as regards their
 | 
| 
 | 
    24  * requirements in conditions enabling the security of their systems and/or
 | 
| 
 | 
    25  * data to be ensured and, more generally, to use and operate it in the
 | 
| 
 | 
    26  * same conditions as regards security.
 | 
| 
 | 
    27  * 
 | 
| 
 | 
    28  * The fact that you are presently reading this means that you have had
 | 
| 
 | 
    29  * knowledge of the CeCILL license and that you accept its terms.
 | 
| 
 | 
    30  *
 | 
| 
 | 
    31  */
 | 
| 
 | 
    32 import java.util.*;
 | 
| 
 | 
    33 import java.awt.*;
 | 
| 
 | 
    34 import java.awt.event.ActionEvent;
 | 
| 
 | 
    35 import java.awt.event.ActionListener;
 | 
| 
 | 
    36 import java.io.*;
 | 
| 
 | 
    37 import javax.swing.*;
 | 
| 
 | 
    38 import javax.swing.filechooser.*;
 | 
| 
 | 
    39 import javax.swing.border.*;
 | 
| 
 | 
    40 import javax.swing.SwingUtilities;
 | 
| 
 | 
    41 
 | 
| 
 | 
    42 
 | 
| 
 | 
    43 public class Smart extends JPanel implements ActionListener {
 | 
| 
 | 
    44 
 | 
| 
 | 
    45   String version = "1.0.2";
 | 
| 
 | 
    46 
 | 
| 
 | 
    47   JFrame mainFrame;
 | 
| 
 | 
    48   JButton openButton;
 | 
| 
 | 
    49   JButton comparisonGoButton;
 | 
| 
 | 
    50 
 | 
| 
 | 
    51   JComboBox formatTypes;
 | 
| 
 | 
    52   JComboBox fileFormats;
 | 
| 
 | 
    53   String[]  emptyFormats = {"Choose a type first..."};
 | 
| 
 | 
    54 
 | 
| 
 | 
    55   JFrame  askFrame;
 | 
| 
 | 
    56   JButton pythonButton;
 | 
| 
 | 
    57   JButton mySqlButton;
 | 
| 
 | 
    58   JButton rButton;
 | 
| 
 | 
    59 
 | 
| 
 | 
    60   HashMap <JButton, Program> callingProgram;
 | 
| 
 | 
    61 
 | 
| 
 | 
    62   // comparison
 | 
| 
 | 
    63   JList comparisonFile1List;
 | 
| 
 | 
    64   JList comparisonFile2List;
 | 
| 
 | 
    65   JTextField comparisonOutputTextField;
 | 
| 
 | 
    66   JTextField comparisonFiveQueryExtensionTextField;
 | 
| 
 | 
    67   JCheckBox comparisonColinearCheckBox;
 | 
| 
 | 
    68   JCheckBox comparisonAntisenseCheckBox;
 | 
| 
 | 
    69   JCheckBox comparisonInvertCheckBox;
 | 
| 
 | 
    70 
 | 
| 
 | 
    71   JList        fileList;
 | 
| 
 | 
    72   JTextArea    logArea;
 | 
| 
 | 
    73 
 | 
| 
 | 
    74   // progress bar
 | 
| 
 | 
    75   JLabel       messageField;
 | 
| 
 | 
    76   JProgressBar progressBar;
 | 
| 
 | 
    77   JLabel       etaField;
 | 
| 
 | 
    78 
 | 
| 
 | 
    79   // process
 | 
| 
 | 
    80   Program           currentProgram;
 | 
| 
 | 
    81   Process           process;
 | 
| 
 | 
    82   javax.swing.Timer processTimer;
 | 
| 
 | 
    83 
 | 
| 
 | 
    84 
 | 
| 
 | 
    85   int previousStatus;
 | 
| 
 | 
    86 
 | 
| 
 | 
    87   public Smart() {
 | 
| 
 | 
    88     super(new BorderLayout());
 | 
| 
 | 
    89 
 | 
| 
 | 
    90     callingProgram = new HashMap <JButton, Program> ();
 | 
| 
 | 
    91 
 | 
| 
 | 
    92     previousStatus = -1;
 | 
| 
 | 
    93 
 | 
| 
 | 
    94     processTimer = new javax.swing.Timer(1000, this);
 | 
| 
 | 
    95     processTimer.stop();
 | 
| 
 | 
    96 
 | 
| 
 | 
    97     // Ask frame buttons
 | 
| 
 | 
    98     pythonButton = new JButton("find...");
 | 
| 
 | 
    99     mySqlButton  = new JButton("find...");
 | 
| 
 | 
   100     rButton      = new JButton("find...");
 | 
| 
 | 
   101 
 | 
| 
 | 
   102     // Get available formats
 | 
| 
 | 
   103     FormatsReader formatReader = new FormatsReader(Global.smartFormatsFileName);
 | 
| 
 | 
   104     if (! formatReader.read()) {
 | 
| 
 | 
   105       System.out.println("Something was wrong while reading file format...");
 | 
| 
 | 
   106     }
 | 
| 
 | 
   107 
 | 
| 
 | 
   108     // Get screen size
 | 
| 
 | 
   109     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 | 
| 
 | 
   110 
 | 
| 
 | 
   111     // Log
 | 
| 
 | 
   112     logArea = new JTextArea(512, Global.logAreaSize);
 | 
| 
 | 
   113     logArea.setPreferredSize(new Dimension(screenSize.width, (int) (screenSize.height * 0.22)));
 | 
| 
 | 
   114     logArea.setFont(new Font("Monospaced", logArea.getFont().getStyle(), logArea.getFont().getSize()));
 | 
| 
 | 
   115     JScrollPane logScroll  = new JScrollPane(logArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 | 
| 
 | 
   116     TitledBorder logBorder = BorderFactory.createTitledBorder("Log");
 | 
| 
 | 
   117     logScroll.setBorder(logBorder);
 | 
| 
 | 
   118     logArea.append("Using S-MART " + version + "\n");
 | 
| 
 | 
   119 
 | 
| 
 | 
   120     GridLayout horizontalLayout = new GridLayout(1, 0);
 | 
| 
 | 
   121 
 | 
| 
 | 
   122     // check configuration
 | 
| 
 | 
   123     this.readConfigurationFile();
 | 
| 
 | 
   124     this.checkConfiguration();
 | 
| 
 | 
   125 
 | 
| 
 | 
   126     // Tabs
 | 
| 
 | 
   127     JTabbedPane tabbedPane = new JTabbedPane();
 | 
| 
 | 
   128     tabbedPane.setPreferredSize(new Dimension(screenSize.width, (int) (screenSize.height * 0.75)));
 | 
| 
 | 
   129 
 | 
| 
 | 
   130     // File panel
 | 
| 
 | 
   131     JPanel filePanel = new JPanel(false);
 | 
| 
 | 
   132     filePanel.setLayout(new FlowLayout());
 | 
| 
 | 
   133     tabbedPane.add("Files", filePanel);
 | 
| 
 | 
   134 
 | 
| 
 | 
   135     // Format sub-panel
 | 
| 
 | 
   136     JPanel         formatComboPanel  = new JPanel(false);
 | 
| 
 | 
   137     JPanel         formatPanel       = new JPanel(false);
 | 
| 
 | 
   138     Vector<String> formatTypesString = Global.formats.getFormatTypes();
 | 
| 
 | 
   139     formatPanel.setLayout(horizontalLayout);
 | 
| 
 | 
   140     formatTypesString.insertElementAt("Choose the format type", 0);
 | 
| 
 | 
   141     JLabel formatLabel = new JLabel("Format");
 | 
| 
 | 
   142     formatTypes        = new JComboBox(formatTypesString);
 | 
| 
 | 
   143     fileFormats        = new JComboBox(emptyFormats);
 | 
| 
 | 
   144     formatLabel.setLabelFor(fileFormats);
 | 
| 
 | 
   145     formatTypes.addActionListener(this);
 | 
| 
 | 
   146     formatComboPanel.add(formatTypes);
 | 
| 
 | 
   147     formatComboPanel.add(fileFormats);
 | 
| 
 | 
   148 
 | 
| 
 | 
   149     formatPanel.add(formatLabel);
 | 
| 
 | 
   150     formatPanel.add(formatComboPanel);
 | 
| 
 | 
   151 
 | 
| 
 | 
   152     // File chooser sub-panel
 | 
| 
 | 
   153     JPanel fileChooserPanel = new JPanel(false);
 | 
| 
 | 
   154     fileChooserPanel.setLayout(horizontalLayout);
 | 
| 
 | 
   155     JLabel fileLabel = new JLabel("File");
 | 
| 
 | 
   156     openButton = new JButton("Open a File...");
 | 
| 
 | 
   157     openButton.addActionListener(this);
 | 
| 
 | 
   158 
 | 
| 
 | 
   159     fileChooserPanel.add(fileLabel);
 | 
| 
 | 
   160     fileChooserPanel.add(openButton);
 | 
| 
 | 
   161 
 | 
| 
 | 
   162     // File list sub-panel
 | 
| 
 | 
   163     JPanel existingFilesPanel = new JPanel(false);
 | 
| 
 | 
   164     existingFilesPanel.setLayout(horizontalLayout);
 | 
| 
 | 
   165     existingFilesPanel.setMinimumSize(new Dimension(10000, 10000));
 | 
| 
 | 
   166     JLabel existingFilesLabel = new JLabel("Existing files");
 | 
| 
 | 
   167     Box fileListBox = Box.createHorizontalBox();
 | 
| 
 | 
   168     fileListBox.add(Box.createRigidArea(new Dimension(0, 100)));
 | 
| 
 | 
   169     JList fileList = new JList(Global.fileNames);
 | 
| 
 | 
   170     fileList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
 | 
| 
 | 
   171     fileList.setVisibleRowCount(4);
 | 
| 
 | 
   172     JScrollPane listScroller = new JScrollPane(fileList);
 | 
| 
 | 
   173     fileListBox.add(listScroller);
 | 
| 
 | 
   174 
 | 
| 
 | 
   175     existingFilesPanel.add(existingFilesLabel);
 | 
| 
 | 
   176     existingFilesPanel.add(fileListBox);
 | 
| 
 | 
   177 
 | 
| 
 | 
   178     // File panel layout
 | 
| 
 | 
   179     Box box = Box.createVerticalBox();
 | 
| 
 | 
   180     box.add(formatPanel);
 | 
| 
 | 
   181     box.add(fileChooserPanel);
 | 
| 
 | 
   182     box.add(existingFilesPanel);
 | 
| 
 | 
   183     filePanel.add(box);
 | 
| 
 | 
   184 
 | 
| 
 | 
   185     // Program panels
 | 
| 
 | 
   186     TreeMap < String, JTabbedPane > panels = new TreeMap < String, JTabbedPane >();
 | 
| 
 | 
   187     PythonProgramFinder programFinder = new PythonProgramFinder("Python");
 | 
| 
 | 
   188     String comments = programFinder.findPrograms();
 | 
| 
 | 
   189     if (comments != null) {
 | 
| 
 | 
   190       logArea.append(comments);
 | 
| 
 | 
   191     }
 | 
| 
 | 
   192     for (int i = 0; i < programFinder.getPrograms().size(); i++) {
 | 
| 
 | 
   193       Program program         = programFinder.getPrograms().get(i);
 | 
| 
 | 
   194       JPanel programPanel     = program.getPanel();
 | 
| 
 | 
   195       String section          = program.getSection();
 | 
| 
 | 
   196       JTabbedPane sectionPane = null;
 | 
| 
 | 
   197       if (panels.containsKey(section)) {
 | 
| 
 | 
   198         sectionPane = panels.get(section);
 | 
| 
 | 
   199       }
 | 
| 
 | 
   200       else {
 | 
| 
 | 
   201         sectionPane = new JTabbedPane();
 | 
| 
 | 
   202         tabbedPane.addTab(section, sectionPane);
 | 
| 
 | 
   203         panels.put(section, sectionPane);
 | 
| 
 | 
   204       }
 | 
| 
 | 
   205 
 | 
| 
 | 
   206       JScrollPane programScroll  = new JScrollPane(programPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 | 
| 
 | 
   207       sectionPane.addTab(program.getName(), programScroll);
 | 
| 
 | 
   208 
 | 
| 
 | 
   209       JButton button  = program.getButton();
 | 
| 
 | 
   210       button.addActionListener(this);
 | 
| 
 | 
   211       callingProgram.put(button, program);
 | 
| 
 | 
   212     }
 | 
| 
 | 
   213 
 | 
| 
 | 
   214     // Progress bar
 | 
| 
 | 
   215     JPanel progressPanel = new JPanel(new GridLayout(1, 0), false);
 | 
| 
 | 
   216     progressPanel.setPreferredSize(new Dimension(screenSize.width, (int) (screenSize.height * 0.02)));
 | 
| 
 | 
   217     messageField = new JLabel();
 | 
| 
 | 
   218     progressBar  = new JProgressBar(0, 100);
 | 
| 
 | 
   219     etaField     = new JLabel();
 | 
| 
 | 
   220     messageField.setHorizontalAlignment(JLabel.LEFT);
 | 
| 
 | 
   221     progressBar.setValue(0);
 | 
| 
 | 
   222     etaField.setHorizontalAlignment(JLabel.RIGHT);
 | 
| 
 | 
   223     progressBar.setStringPainted(true);
 | 
| 
 | 
   224     progressPanel.add(messageField);
 | 
| 
 | 
   225     progressPanel.add(progressBar);
 | 
| 
 | 
   226     progressPanel.add(etaField);
 | 
| 
 | 
   227       
 | 
| 
 | 
   228     add(tabbedPane, BorderLayout.PAGE_START);
 | 
| 
 | 
   229     add(logScroll, BorderLayout.CENTER);
 | 
| 
 | 
   230     add(progressPanel, BorderLayout.PAGE_END);
 | 
| 
 | 
   231   }
 | 
| 
 | 
   232 
 | 
| 
 | 
   233 
 | 
| 
 | 
   234   public boolean checkConfiguration() {
 | 
| 
 | 
   235     int status = this.testConfiguration();
 | 
| 
 | 
   236   
 | 
| 
 | 
   237     if (status == previousStatus) {
 | 
| 
 | 
   238       logArea.append("S-MART does not seem to work properly... Tried to manage it by myself, unsuccessfully... Check documentation for further explanation...\n");
 | 
| 
 | 
   239       return false;
 | 
| 
 | 
   240     }
 | 
| 
 | 
   241 
 | 
| 
 | 
   242     switch (status) {
 | 
| 
 | 
   243       case 0:
 | 
| 
 | 
   244         return true;
 | 
| 
 | 
   245       case 1:
 | 
| 
 | 
   246         logArea.append("S-MART does not seem to work properly... Check documentation for further explanation...\n");
 | 
| 
 | 
   247         break;
 | 
| 
 | 
   248       case 3:
 | 
| 
 | 
   249         this.askWhereIsProgram("python");
 | 
| 
 | 
   250         break;
 | 
| 
 | 
   251       case 4:
 | 
| 
 | 
   252         break;
 | 
| 
 | 
   253       case 5:
 | 
| 
 | 
   254         this.askWhereIsProgram("mySQL");
 | 
| 
 | 
   255         break;
 | 
| 
 | 
   256       case 6:
 | 
| 
 | 
   257         this.askWhereIsProgram("R");
 | 
| 
 | 
   258         break;
 | 
| 
 | 
   259       case 7:
 | 
| 
 | 
   260         logArea.append("Please install 'ColorBrewer' R package...\n");
 | 
| 
 | 
   261         break;
 | 
| 
 | 
   262       default:
 | 
| 
 | 
   263         logArea.append("Weird configuration test status: " + status + "...\n");
 | 
| 
 | 
   264     }
 | 
| 
 | 
   265     previousStatus = status;
 | 
| 
 | 
   266     return true;
 | 
| 
 | 
   267   }
 | 
| 
 | 
   268 
 | 
| 
 | 
   269 
 | 
| 
 | 
   270   public int testConfiguration() {
 | 
| 
 | 
   271     String[]        command  = {Global.pythonCommand, "Python" + java.io.File.separator + "testInstall.py"};
 | 
| 
 | 
   272     ProgramLauncher launcher = new ProgramLauncher(command, logArea, messageField, progressBar, etaField);
 | 
| 
 | 
   273     String          line;
 | 
| 
 | 
   274     launcher.execute();
 | 
| 
 | 
   275     (new Exception("hello")).printStackTrace();
 | 
| 
 | 
   276     return launcher.getExitValue();
 | 
| 
 | 
   277   }
 | 
| 
 | 
   278 
 | 
| 
 | 
   279 
 | 
| 
 | 
   280   public void readConfigurationFile() {
 | 
| 
 | 
   281     java.io.File   file      = new java.io.File(Global.smartConfFileName);
 | 
| 
 | 
   282     String         line      = null;
 | 
| 
 | 
   283 
 | 
| 
 | 
   284     if (! file.exists()) {
 | 
| 
 | 
   285       return;
 | 
| 
 | 
   286     }
 | 
| 
 | 
   287 
 | 
| 
 | 
   288     try {
 | 
| 
 | 
   289       BufferedReader reader = new BufferedReader(new FileReader(file));
 | 
| 
 | 
   290 
 | 
| 
 | 
   291       while ((line = reader.readLine()) != null) {
 | 
| 
 | 
   292         line = line.trim();
 | 
| 
 | 
   293         if      (line.startsWith("python:")) Global.pythonCommand = line.substring("python:".length()).trim();
 | 
| 
 | 
   294         else if (line.startsWith("mysql:"))  Global.mysqlCommand  = line.substring("mysql:".length()).trim();
 | 
| 
 | 
   295         else if (line.startsWith("r:"))      Global.rCommand      = line.substring("r:".length()).trim();
 | 
| 
 | 
   296       }
 | 
| 
 | 
   297       reader.close();
 | 
| 
 | 
   298     }
 | 
| 
 | 
   299     catch (FileNotFoundException e) {
 | 
| 
 | 
   300       logArea.append("Configuration file is empty: " + e.getMessage() + "!\n");
 | 
| 
 | 
   301       return;
 | 
| 
 | 
   302     }
 | 
| 
 | 
   303     catch (IOException e) {
 | 
| 
 | 
   304       logArea.append("Weird with configuration file: " + e.getMessage() + "!\n");
 | 
| 
 | 
   305       return;
 | 
| 
 | 
   306     }
 | 
| 
 | 
   307   }
 | 
| 
 | 
   308 
 | 
| 
 | 
   309 
 | 
| 
 | 
   310   public void askWhereIsProgram(String program) {
 | 
| 
 | 
   311     askFrame = new JFrame("Where is " + program + "?");
 | 
| 
 | 
   312     askFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 | 
| 
 | 
   313     JLabel label = new JLabel("Where is your " + program + " (or " + program + ".exe) file?");
 | 
| 
 | 
   314     JButton button = null;
 | 
| 
 | 
   315     if ("python".equals(program)) {
 | 
| 
 | 
   316       button = pythonButton;
 | 
| 
 | 
   317     }
 | 
| 
 | 
   318     else if ("mySQL".equals(program)) {
 | 
| 
 | 
   319       button = mySqlButton;
 | 
| 
 | 
   320     }
 | 
| 
 | 
   321     else if ("R".equals(program)) {
 | 
| 
 | 
   322       button = rButton;
 | 
| 
 | 
   323     }
 | 
| 
 | 
   324     else {
 | 
| 
 | 
   325       logArea.append("Problem with the button!\n");
 | 
| 
 | 
   326     }
 | 
| 
 | 
   327     askFrame.getContentPane().add(label, BorderLayout.WEST);
 | 
| 
 | 
   328     askFrame.getContentPane().add(button, BorderLayout.EAST);
 | 
| 
 | 
   329     button.addActionListener(this);
 | 
| 
 | 
   330     askFrame.pack();
 | 
| 
 | 
   331     askFrame.setVisible(true);
 | 
| 
 | 
   332     askFrame.setAlwaysOnTop(true);
 | 
| 
 | 
   333   }
 | 
| 
 | 
   334 
 | 
| 
 | 
   335 
 | 
| 
 | 
   336   public void actionPerformed(ActionEvent e) {
 | 
| 
 | 
   337 
 | 
| 
 | 
   338     // Python command chooser
 | 
| 
 | 
   339     if (e.getSource() == pythonButton) {
 | 
| 
 | 
   340       JFileChooser chooser = new JFileChooser();
 | 
| 
 | 
   341       if (chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
 | 
| 
 | 
   342         Global.pythonCommand = chooser.getSelectedFile().getPath();
 | 
| 
 | 
   343         askFrame.setVisible(false);
 | 
| 
 | 
   344         askFrame.dispose();
 | 
| 
 | 
   345         try {
 | 
| 
 | 
   346           BufferedWriter out = new BufferedWriter(new FileWriter(Global.smartConfFileName, true));
 | 
| 
 | 
   347           out.write("python: " + Global.pythonCommand + "\n");
 | 
| 
 | 
   348           out.close();
 | 
| 
 | 
   349         }
 | 
| 
 | 
   350         catch (IOException exception) {
 | 
| 
 | 
   351           logArea.append("Cannot write configuration file!\n");
 | 
| 
 | 
   352         }
 | 
| 
 | 
   353       }
 | 
| 
 | 
   354       this.checkConfiguration();
 | 
| 
 | 
   355     }
 | 
| 
 | 
   356     // MySQL command chooser
 | 
| 
 | 
   357     else if (e.getSource() == mySqlButton) {
 | 
| 
 | 
   358       JFileChooser chooser = new JFileChooser();
 | 
| 
 | 
   359       if (chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
 | 
| 
 | 
   360         Global.mysqlCommand = chooser.getSelectedFile().getPath();
 | 
| 
 | 
   361         askFrame.setVisible(false);
 | 
| 
 | 
   362         askFrame.dispose();
 | 
| 
 | 
   363         try {
 | 
| 
 | 
   364           BufferedWriter out = new BufferedWriter(new FileWriter(Global.smartConfFileName, true));
 | 
| 
 | 
   365           out.write("mysql: " + Global.mysqlCommand + "\n");
 | 
| 
 | 
   366           out.close();
 | 
| 
 | 
   367         }
 | 
| 
 | 
   368         catch (IOException exception) {
 | 
| 
 | 
   369           logArea.append("Cannot write configuration file!\n");
 | 
| 
 | 
   370         }
 | 
| 
 | 
   371       }
 | 
| 
 | 
   372       this.checkConfiguration();
 | 
| 
 | 
   373     }
 | 
| 
 | 
   374     // R command chooser
 | 
| 
 | 
   375     else if (e.getSource() == rButton) {
 | 
| 
 | 
   376       JFileChooser chooser = new JFileChooser();
 | 
| 
 | 
   377       if (chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
 | 
| 
 | 
   378         Global.rCommand = chooser.getSelectedFile().getPath();
 | 
| 
 | 
   379         askFrame.setVisible(false);
 | 
| 
 | 
   380         askFrame.dispose();
 | 
| 
 | 
   381         try {
 | 
| 
 | 
   382           BufferedWriter out = new BufferedWriter(new FileWriter(Global.smartConfFileName, true));
 | 
| 
 | 
   383           out.write("r: " + Global.rCommand + "\n");
 | 
| 
 | 
   384           out.close();
 | 
| 
 | 
   385         }
 | 
| 
 | 
   386         catch (IOException exception) {
 | 
| 
 | 
   387           logArea.append("Cannot write configuration file!\n");
 | 
| 
 | 
   388         }
 | 
| 
 | 
   389       }
 | 
| 
 | 
   390       this.checkConfiguration();
 | 
| 
 | 
   391     }
 | 
| 
 | 
   392     // Format type
 | 
| 
 | 
   393     else if (e.getSource() == formatTypes) {
 | 
| 
 | 
   394       fileFormats.removeAllItems();
 | 
| 
 | 
   395       Vector < String > selectedFormats = Global.formats.getFormats((String) formatTypes.getSelectedItem()).getFormats();
 | 
| 
 | 
   396       for (int i = 0; i < selectedFormats.size(); i++) {
 | 
| 
 | 
   397         fileFormats.addItem(selectedFormats.get(i));
 | 
| 
 | 
   398       }
 | 
| 
 | 
   399     }
 | 
| 
 | 
   400     // Main file chooser
 | 
| 
 | 
   401     else if (e.getSource() == openButton) {
 | 
| 
 | 
   402       JFileChooser chooser = new JFileChooser();
 | 
| 
 | 
   403       if (chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
 | 
| 
 | 
   404         String fileName = chooser.getSelectedFile().getPath();
 | 
| 
 | 
   405         Global.fileNames.addElement(fileName);
 | 
| 
 | 
   406         Global.files.addFile(fileName, (String) formatTypes.getSelectedItem(), (String) fileFormats.getSelectedItem());
 | 
| 
 | 
   407       }
 | 
| 
 | 
   408     }
 | 
| 
 | 
   409     // Other file choosers
 | 
| 
 | 
   410     else if (Global.otherFilesChooser.containsKey(e.getSource())) {
 | 
| 
 | 
   411       JTextField textField = Global.otherFilesChooser.get(e.getSource());
 | 
| 
 | 
   412       JFileChooser chooser = new JFileChooser();
 | 
| 
 | 
   413       if (chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
 | 
| 
 | 
   414         textField.setText(chooser.getSelectedFile().getPath());
 | 
| 
 | 
   415       }
 | 
| 
 | 
   416     }
 | 
| 
 | 
   417     // Other directories choosers
 | 
| 
 | 
   418     else if (Global.otherDirectoriesChooser.containsKey(e.getSource())) {
 | 
| 
 | 
   419       JTextField textField = Global.otherDirectoriesChooser.get(e.getSource());
 | 
| 
 | 
   420       JFileChooser chooser = new JFileChooser();
 | 
| 
 | 
   421       chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
 | 
| 
 | 
   422       if (chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
 | 
| 
 | 
   423         textField.setText(chooser.getSelectedFile().getPath());
 | 
| 
 | 
   424       }
 | 
| 
 | 
   425     }
 | 
| 
 | 
   426     else if (Global.otherFileConcatenationChooser.containsKey(e.getSource())) {
 | 
| 
 | 
   427       JTextField textField = Global.otherDirectoriesChooser.get(e.getSource());
 | 
| 
 | 
   428       JFileChooser chooser = new JFileChooser();
 | 
| 
 | 
   429       chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
 | 
| 
 | 
   430       if (chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
 | 
| 
 | 
   431         String text = textField.getText();
 | 
| 
 | 
   432         if ((text == null) || ("".equals(text))) {
 | 
| 
 | 
   433           textField.setText(chooser.getSelectedFile().getPath());
 | 
| 
 | 
   434         }
 | 
| 
 | 
   435         else {
 | 
| 
 | 
   436           textField.setText(text + "," + chooser.getSelectedFile().getPath());
 | 
| 
 | 
   437         }
 | 
| 
 | 
   438       }
 | 
| 
 | 
   439     }
 | 
| 
 | 
   440     // Programs
 | 
| 
 | 
   441     else {
 | 
| 
 | 
   442       currentProgram = callingProgram.get(e.getSource());
 | 
| 
 | 
   443       String comment = currentProgram.checkValues();
 | 
| 
 | 
   444       if (comment != null) {
 | 
| 
 | 
   445         logArea.append(comment);
 | 
| 
 | 
   446         return;
 | 
| 
 | 
   447       }
 | 
| 
 | 
   448       LinkedList <String> command = currentProgram.getCommand();
 | 
| 
 | 
   449       ProgramLauncher launcher = new ProgramLauncher(command, logArea, messageField, progressBar, etaField);
 | 
| 
 | 
   450       launcher.execute();
 | 
| 
 | 
   451       Vector < File > outputFiles = currentProgram.getOutputFiles();
 | 
| 
 | 
   452       for (int i = 0; i < outputFiles.size(); i++) {
 | 
| 
 | 
   453         File file = outputFiles.get(i);
 | 
| 
 | 
   454         if (file.getFormatType().compareToIgnoreCase("other") != 0) {
 | 
| 
 | 
   455           Global.fileNames.addElement(file.getName());
 | 
| 
 | 
   456           Global.files.addFile(file);
 | 
| 
 | 
   457         }
 | 
| 
 | 
   458       }
 | 
| 
 | 
   459       currentProgram = null;
 | 
| 
 | 
   460     }
 | 
| 
 | 
   461   }
 | 
| 
 | 
   462 
 | 
| 
 | 
   463 
 | 
| 
 | 
   464   private static void createAndShowGUI() {
 | 
| 
 | 
   465     // Create and set up the window.
 | 
| 
 | 
   466     JFrame mainFrame = new JFrame("S-Mart");
 | 
| 
 | 
   467     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 | 
| 
 | 
   468 
 | 
| 
 | 
   469     //Create and set up the content pane.
 | 
| 
 | 
   470     JComponent newContentPane = new Smart();
 | 
| 
 | 
   471     newContentPane.setOpaque(true);
 | 
| 
 | 
   472     mainFrame.setContentPane(newContentPane);
 | 
| 
 | 
   473 
 | 
| 
 | 
   474     // Display the window.
 | 
| 
 | 
   475     mainFrame.pack();
 | 
| 
 | 
   476     mainFrame.setVisible(true);
 | 
| 
 | 
   477     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 | 
| 
 | 
   478     mainFrame.setBounds(0, 0, screenSize.width, screenSize.height);
 | 
| 
 | 
   479   }
 | 
| 
 | 
   480 
 | 
| 
 | 
   481 
 | 
| 
 | 
   482   public static void main(String[] args) {
 | 
| 
 | 
   483     javax.swing.SwingUtilities.invokeLater(new Runnable() {
 | 
| 
 | 
   484       public void run() {
 | 
| 
 | 
   485         createAndShowGUI();
 | 
| 
 | 
   486       }
 | 
| 
 | 
   487     });
 | 
| 
 | 
   488   }
 | 
| 
 | 
   489 }
 |