| 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 } |