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 }