/* * Created on Jul 4, 2005 * */ package atujplag.view; import java.awt.CardLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.awt.event.WindowListener; import java.io.File; import java.io.FilenameFilter; import java.util.NoSuchElementException; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JRootPane; import javax.swing.JSpinner; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import jplagWsClient.jplagClient.Option; import atujplag.ATUJPLAG; import atujplag.client.SimpleClient; import atujplag.util.LanguageSetting; import atujplag.util.Messages; import atujplag.util.SubmissionManager; import atujplag.util.TagParser; /** * @author Emeric Kwemou */ public class OptionPanel extends JDialog implements ActionListener, DocumentListener { /* * Constants describing error messages of validateOptions() */ private static final long serialVersionUID = -6556063048578752374L; private static final int NOERROR = 0; private static final int GENOPTERROR = 1; private static final int ADVOPTERROR = 2; private static final int SCAN_DELAY = 500; // in milliseconds private ATUJPLAG atujplag = null; private View view = null; private SimpleClient client = null; private SubmissionTree treePreview = null; private boolean reopenPreview = false; private boolean isSubmitted = false; private String oldBasecodeDir = ""; //$NON-NLS-1$ private boolean advOptionsUpToDate = false; private Vector<SubmissionManager> previewSubs = null; private Thread scanThread; private boolean firstScan = false; // if true, doesn't override oldBasecodeDir private boolean updatingSubDirCB = false; private Timer validateTitleTimer = null; private Timer updatePreviewTimer = null; /* * GUI components */ // Content panel private JPanel jContentPane = null; private JPanel jOptionPanel = null; private JPanel jOptionButtonsPanel = null; private JPanel jControlPanel = null; // Option panel private JPanel jGeneralOptionsPanel = null; private JPanel jAdvancedOptionsPanel = null; // General options panel private JComboBox<String> jLanguageCB = null; private JComboBox<String> jCompModeCB = null; private ItemListener languageItemListener = null; private JTextField jTitleField = null; private DocumentListener titleListener = null; private JTextField jSubmissionDirField = null; private JButton jFileChooserButton = null; private JCheckBox jRecurseDirCBBox = null; private ItemListener recurseDirCBListener = null; // Advanced options panel private JTextField jSuffixesField = null; private JPanel jSufAndBCPanel = null; private DocumentListener suffixesListener = null; private JComboBox<String> jBasecodeCB = null; private JPanel jMmlAndClusterPanel = null; private JSpinner jMinMatchLenSpinner = null; private JComboBox<String> jClusterTypeCB = null; private JComboBox<String> jStoreCB = null; private JSpinner jStoreSpinner = null; private JComboBox<String> jSubdirCB = null; private ItemListener subdirCBListener = null; private JButton jApplyDefaultsButton = null; // Option buttons panel private JButton jGeneralOptionsButton = null; private JButton jAdvancedOptionsButton = null; private JButton jCancelButton = null; // Control panel private JPanel jStatusCardPanel = null; private JProgressBar jProgressBar = null; // Status card panel private JPanel jStatusPanel = null; private JPanel jErrorPanel = null; // Status panel private JTextField jStatusTextField = null; private JTextField jNumValidProgramsField = null; private JTextField jNumFilesField = null; private JTextField jSubmissionSizeField = null; private JButton previewButton = null; private JButton submitButton = null; // Error panel private JTextArea jErrorArea = null; private JButton jOverwriteDirButton = null; /** * OptionPanel constructor for a new submission with the given title */ public OptionPanel(String title, View view) { super(view); this.view = view; atujplag = view.getATUJPLAG(); this.client = new SimpleClient(title, atujplag); this.client.setSubmissionDirectory(""); //$NON-NLS-1$ initialize(); } /** * OptionPanel constructor for an existing completed submission, which * is going to be changed by the user. The title will not be changeable */ public OptionPanel(SimpleClient client, View view) { super(view); this.overwrite = true; this.client = client; this.view = view; atujplag = view.getATUJPLAG(); initialize(); } /** * Make dialog close on ESCAPE */ protected JRootPane createRootPane() { KeyStroke stroke=KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); JRootPane rootPane=new JRootPane(); rootPane.registerKeyboardAction(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { jCancelButton.doClick(); } }, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW); return rootPane; } /** * This method initializes this */ private void initialize() { view.blockNewSubmissions(); // TODO: this shouldn't be done here! setResizable(false); setContentPane(getJContentPane()); addWindowListener(new WindowListener() { public void windowClosing(WindowEvent arg0) { if (!OptionPanel.this.isSubmitted) OptionPanel.this.jCancelButton.doClick(); } public void windowActivated(WindowEvent arg0) {} public void windowClosed(WindowEvent arg0) {} public void windowDeactivated(WindowEvent arg0) {} public void windowDeiconified(WindowEvent arg0) {} public void windowIconified(WindowEvent arg0) {} public void windowOpened(WindowEvent arg0) {} }); // TODO: Just make the dialog modal?? Would this work with treePreview? addWindowFocusListener(new WindowFocusListener() { public void windowGainedFocus(WindowEvent arg0) { if (arg0.getWindow() == view) requestFocus(); } public void windowLostFocus(WindowEvent arg0) { if (arg0.getWindow() == OptionPanel.this) { if (arg0.getOppositeWindow() != treePreview) requestFocus(); } if (arg0.getWindow() == treePreview) requestFocus(); } }); } /** * @return Returns the jContentPane. */ public JPanel getJContentPane() { if (jContentPane == null) { jContentPane = JPlagCreator.createPanelWithoutBorder(700, 402, 5, 0, FlowLayout.CENTER); jContentPane.add(getJOptionPanel(), null); jContentPane.add(getJOptionButtonsPanel()); jContentPane.add(getJControlPanel(), null); } return jContentPane; } /** * This method initializes jOptionPanel * * @return javax.swing.JPanel */ private JPanel getJOptionPanel() { if (jOptionPanel == null) { jOptionPanel = new JPanel(); jOptionPanel.setLayout(new CardLayout()); jOptionPanel.setMinimumSize(new java.awt.Dimension(300, 200)); jOptionPanel.add(getJGeneralOptionsPanel(), getJGeneralOptionsPanel().getName()); jOptionPanel.add(getJAdvancedOptionsPanel(), getJAdvancedOptionsPanel().getName()); jOptionPanel.setPreferredSize(new Dimension(700, 200)); } return jOptionPanel; } private JPanel getJGeneralOptionsPanel() { if (jGeneralOptionsPanel == null) { jGeneralOptionsPanel = JPlagCreator.createPanel( Messages.getString("OptionPanel.Basic_options_Panel"), //$NON-NLS-1$ 700, 130, 10, 20, FlowLayout.LEFT, JPlagCreator.WITH_TITLEBORDER); jGeneralOptionsPanel.setName("jGeneralOptionsPanel"); //$NON-NLS-1$ jGeneralOptionsPanel.addComponentListener(new ComponentListener() { public void componentShown(ComponentEvent arg0) { OptionPanel.this.setAdvPanelListenersActive(false); } public void componentHidden(ComponentEvent arg0) { OptionPanel.this.setAdvPanelListenersActive(true); } public void componentMoved(ComponentEvent arg0) {} public void componentResized(ComponentEvent arg0) {} }); jGeneralOptionsPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Language") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 280, 20), null); jLanguageCB = JPlagCreator.createJComboBox( atujplag.getLanguageNames(), 350, 20, Messages.getString( "OptionPanel.Programming_languages_combobox_TIP")); //$NON-NLS-1$ jGeneralOptionsPanel.add(jLanguageCB, null); jGeneralOptionsPanel.add( JPlagCreator.createLabel( Messages.getString("OptionPanel.Comparison_mode") + ":", 280, 20), //$NON-NLS-1$ //$NON-NLS-2$ null); jCompModeCB = JPlagCreator.createJComboBox( ATUJPLAG.COMPARE_MODES, 350, 20, Messages.getString(ATUJPLAG.COMPARE_MODE_TIPNAMES[0])); jCompModeCB.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { jCompModeCB.setToolTipText(Messages.getString(ATUJPLAG.COMPARE_MODE_TIPNAMES[jCompModeCB.getSelectedIndex()])); } }); jGeneralOptionsPanel.add(jCompModeCB, null); jGeneralOptionsPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Submission_title") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 280, 20), null); jTitleField = JPlagCreator.createTextField(350, 20, Messages.getString("OptionPanel.Submission_title_TIP")); //$NON-NLS-1$ jGeneralOptionsPanel.add(jTitleField, null); jGeneralOptionsPanel.add(JPlagCreator.createLabel( Messages.getString("OptionPanel.Submission_directory") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 280, 20), null); jSubmissionDirField = JPlagCreator.createTextField(310, 20, Messages.getString("OptionPanel.Submission_directory_TIP")); //$NON-NLS-1$ jGeneralOptionsPanel.add(jSubmissionDirField, null); jFileChooserButton = JPlagCreator.createOpenFileButton( Messages.getString( "OptionPanel.Submission_directory_file_browser_TIP")); //$NON-NLS-1$ jGeneralOptionsPanel.add(jFileChooserButton, null); jGeneralOptionsPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Recurse_into_directories") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 280, 20), null); jGeneralOptionsPanel.add(getJRecurseDirCBBox(), null); } return jGeneralOptionsPanel; } private JCheckBox getJRecurseDirCBBox() { if (jRecurseDirCBBox == null) { jRecurseDirCBBox = JPlagCreator.createCheckBox( Messages.getString("OptionPanel.Recurse_into_directories_TIP")); //$NON-NLS-1$ } return jRecurseDirCBBox; } /** * This method initializes jOptionButtonsPanel * * @return javax.swing.JPanel */ private JPanel getJOptionButtonsPanel() { if (jOptionButtonsPanel == null) { jOptionButtonsPanel = JPlagCreator.createPanel(null, 696, 25, 0, 50, FlowLayout.CENTER, -1); jOptionButtonsPanel.add(getJGeneralOptionsButton(), null); jOptionButtonsPanel.add(getJAdvancedOptionsButton(), null); jOptionButtonsPanel.add(getJCancelButton(), null); } return jOptionButtonsPanel; } /** * This method initializes jGeneralOptionsButton * * @return javax.swing.JButton */ private JButton getJGeneralOptionsButton() { if (jGeneralOptionsButton == null) { jGeneralOptionsButton = JPlagCreator.createButton( Messages.getString("OptionPanel.Basic_options"), //$NON-NLS-1$ Messages.getString("OptionPanel.Basic_options_TIP"), //$NON-NLS-1$ 180, 20); jGeneralOptionsButton.setEnabled(false); jGeneralOptionsButton.addActionListener(this); } return jGeneralOptionsButton; } /** * This method initializes jAdvancedOptionsButton * * @return javax.swing.JButton */ private JButton getJAdvancedOptionsButton() { if (jAdvancedOptionsButton == null) { jAdvancedOptionsButton = JPlagCreator.createButton( Messages.getString("OptionPanel.Advanced_options"), //$NON-NLS-1$ Messages.getString("OptionPanel.Advanced_options_TIP"), //$NON-NLS-1$ 180, 20); jAdvancedOptionsButton.setEnabled(false); jAdvancedOptionsButton.addActionListener(this); } return jAdvancedOptionsButton; } /** * This method initializes jCancelButton * * @return javax.swing.JButton */ private JButton getJCancelButton() { if (jCancelButton == null) { jCancelButton = JPlagCreator.createButton( Messages.getString("OptionPanel.Cancel"), //$NON-NLS-1$ Messages.getString("OptionPanel.Cancel_TIP"), //$NON-NLS-1$ 180, 20); jCancelButton.addActionListener(this); } return jCancelButton; } /** * This method initializes jAdvancedOptionsPanel * * @return javax.swing.JPanel */ private JPanel getJAdvancedOptionsPanel() { if (jAdvancedOptionsPanel == null) { jAdvancedOptionsPanel = JPlagCreator.createPanel(Messages.getString( "OptionPanel.Advanced_options_Panel"), //$NON-NLS-1$ 700, 250, 10, 5, FlowLayout.CENTER, JPlagCreator.WITH_TITLEBORDER); jAdvancedOptionsPanel.setName("advancedOptions"); //$NON-NLS-1$ jAdvancedOptionsPanel.add(getJSufAndBCPanel(), null); jAdvancedOptionsPanel.add(getJMmlAndClusterPanel(), null); jStoreCB = JPlagCreator.createJComboBox(new String[] { Messages.getString( "OptionPanel.Maximal_number_of_matches") + ":", //$NON-NLS-1$ //$NON-NLS-2$ Messages.getString( "OptionPanel.Minimal_similarity_of_matches") + ":" }, //$NON-NLS-1$ //$NON-NLS-2$ 500, 20, null); jStoreCB.setBackground(JPlagCreator.SYSTEMCOLOR); jAdvancedOptionsPanel.add(jStoreCB, null); jAdvancedOptionsPanel.add(getJStoreSpinner(), null); jAdvancedOptionsPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Path_to_files") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 500, 20), null); jAdvancedOptionsPanel.add(getJSubdirCB(), null); jAdvancedOptionsPanel.add(getJApplyDefaultsButton(), null); } return this.jAdvancedOptionsPanel; } /** * This method initializes jSufAndBCPanel * * @return javax.swing.JPanel */ private JPanel getJSufAndBCPanel() { if (jSufAndBCPanel == null) { jSufAndBCPanel = JPlagCreator.createPanelWithoutBorder(330, 60, 10, 5, FlowLayout.LEFT); jSufAndBCPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Suffixes") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 170, 20)); jSufAndBCPanel.add(getJSuffixesField()); jSufAndBCPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Basecode_directory") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 170, 20)); jSufAndBCPanel.add(getJBasecodeCB()); } return jSufAndBCPanel; } private JTextField getJSuffixesField() { if (jSuffixesField == null) { jSuffixesField = JPlagCreator.createTextField(150, 20, Messages.getString("OptionPanel.Suffixes_TIP")); //$NON-NLS-1$ } return jSuffixesField; } private JComboBox<String> getJBasecodeCB() { if (this.jBasecodeCB == null) { this.jBasecodeCB = JPlagCreator.createJComboBox(new String[] { Messages.getString("OptionPanel.none") }, 150, 20, //$NON-NLS-1$ Messages.getString("OptionPanel.Basecode_directory_TIP")); //$NON-NLS-1$ } return this.jBasecodeCB; } /** * This method initializes jMmlAndClusterPanel * * @return javax.swing.JPanel */ private JPanel getJMmlAndClusterPanel() { if (jMmlAndClusterPanel == null) { jMmlAndClusterPanel = JPlagCreator.createPanelWithoutBorder(330, 60, 10, 5, FlowLayout.RIGHT); jMmlAndClusterPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Minimum_match_length") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 200, 20), null); jMmlAndClusterPanel.add(getJMinMatchLenSpinner(), null); jMmlAndClusterPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Cluster_type") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 200, 20)); jClusterTypeCB = JPlagCreator.createJComboBox(new String[] { Messages.getString("OptionPanel.none"), //$NON-NLS-1$ "min", "avr", "max" }, 100, 20, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ Messages.getString("OptionPanel.Cluster_type_TIP")); //$NON-NLS-1$ jMmlAndClusterPanel.add(jClusterTypeCB, null); } return jMmlAndClusterPanel; } private JSpinner getJMinMatchLenSpinner() { if (jMinMatchLenSpinner == null) { this.jMinMatchLenSpinner = JPlagCreator.createSpinner(100, 20, Messages.getString("OptionPanel.Minimum_match_length_TIP")); //$NON-NLS-1$ } return jMinMatchLenSpinner; } private JSpinner getJStoreSpinner() { if (jStoreSpinner == null) { jStoreSpinner = JPlagCreator.createSpinner(150, 20, Messages.getString( "OptionPanel.Maximal_number_or_minimal_similarity_of_matches_to_be_stored_TIP")); //$NON-NLS-1$ } return this.jStoreSpinner; } private JComboBox<String> getJSubdirCB() { if (jSubdirCB == null) { jSubdirCB = JPlagCreator.createJComboBox(new String[] { Messages.getString("OptionPanel.none") }, 150, 20, //$NON-NLS-1$ Messages.getString("OptionPanel.Path_to_files_TIP")); //$NON-NLS-1$ } return jSubdirCB; } /** * This method initializes jApplyDefaultsButton * * @return javax.swing.JButton */ private JButton getJApplyDefaultsButton() { if (jApplyDefaultsButton == null) { jApplyDefaultsButton = JPlagCreator.createButton( Messages.getString("OptionPanel.Default"), //$NON-NLS-1$ Messages.getString("OptionPanel.Default_TIP"), 180, 20); //$NON-NLS-1$ jApplyDefaultsButton.addActionListener(this); } return jApplyDefaultsButton; } /** * This method initializes jControlPanel * * @return javax.swing.JPanel */ private JPanel getJControlPanel() { if (jControlPanel == null) { jControlPanel = JPlagCreator.createPanel(696, 160, 5, 0, FlowLayout.CENTER); jControlPanel.add(getJStatusCardPanel(), null); jControlPanel.add(getJProgressBar(), null); } return jControlPanel; } /** * This method initializes jStatusCardPanel * * @return javax.swing.JPanel */ private JPanel getJStatusCardPanel() { if (jStatusCardPanel == null) { jStatusCardPanel = new JPanel(); jStatusCardPanel.setLayout(new CardLayout()); jStatusCardPanel.add(getJStatusPanel(), getJStatusPanel().getName()); jStatusCardPanel.add(getJErrorPanel(), getJErrorPanel().getName()); } return jStatusCardPanel; } /** * This method initializes jStatusPanel * * @return javax.swing.JPanel */ private JPanel getJStatusPanel() { if (jStatusPanel == null) { jStatusPanel = JPlagCreator.createPanel(null, 690, 140, 7, 20, FlowLayout.CENTER, -1); jStatusPanel.setName("ScanStatus"); //$NON-NLS-1$ jStatusPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Status") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 330, 20), null); jStatusPanel.add(getStatusTextField(), null); jStatusPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Number_of_programs") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 330, 20), null); jStatusPanel.add(getJNumValidProgramsField(), null); jStatusPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Total_number_of_files") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 330, 20), null); jStatusPanel.add(getJNumFilesField(), null); jStatusPanel.add(JPlagCreator.createLabel(Messages.getString( "OptionPanel.Total_size_of_submission") + ":", //$NON-NLS-1$ //$NON-NLS-2$ 330, 20), null); jStatusPanel.add(getJSubmissionSizeField(), null); jStatusPanel.add(getPreviewButton(), null); jStatusPanel.add(getSubmitButton(), null); } return jStatusPanel; } /** * This method initializes jStatusTextField * * @return javax.swing.JTextField */ private JTextField getStatusTextField() { if (jStatusTextField == null) { jStatusTextField = JPlagCreator.createTextField(300, 20, Messages.getString("OptionPanel.Status_TIP")); //$NON-NLS-1$ jStatusTextField.setEditable(false); jStatusTextField.setBackground(Color.WHITE); } return jStatusTextField; } /** * This method initializes jNumValidProgramsField * * @return javax.swing.JTextField */ private JTextField getJNumValidProgramsField() { if (jNumValidProgramsField == null) { jNumValidProgramsField = JPlagCreator.createTextField(300, 20, Messages.getString("OptionPanel.Number_of_programs_TIP")); //$NON-NLS-1$ jNumValidProgramsField.setEditable(false); jNumValidProgramsField.setBackground(Color.WHITE); } return jNumValidProgramsField; } /** * This method initializes jNumFilesField * * @return javax.swing.JTextField */ private JTextField getJNumFilesField() { if (jNumFilesField == null) { jNumFilesField = JPlagCreator.createTextField(300, 20, Messages.getString( "OptionPanel.Total_number_of_files_TIP")); //$NON-NLS-1$ jNumFilesField.setEditable(false); jNumFilesField.setBackground(Color.WHITE); } return jNumFilesField; } /** * This method initializes jSubmissionSizeField * * @return javax.swing.JTextField */ private JTextField getJSubmissionSizeField() { if (jSubmissionSizeField == null) { jSubmissionSizeField = JPlagCreator.createTextField( 300, 20, Messages.getString( "OptionPanel.Total_size_of_submission_TIP")); //$NON-NLS-1$ jSubmissionSizeField.setEditable(false); jSubmissionSizeField.setBackground(Color.WHITE); } return jSubmissionSizeField; } /** * This method initializes previewButton * * @return javax.swing.JButton */ private JButton getPreviewButton() { if (previewButton == null) { previewButton = JPlagCreator.createButton( Messages.getString("OptionPanel.Files_preview"), //$NON-NLS-1$ Messages.getString("OptionPanel.Files_preview_TIP"), //$NON-NLS-1$ 180, 20); previewButton.setEnabled(false); previewButton.addActionListener(this); } return previewButton; } /** * This method initializes submitButton * * @return javax.swing.JButton */ private JButton getSubmitButton() { if (submitButton == null) { submitButton = JPlagCreator.createButton( Messages.getString("OptionPanel.Submit"), //$NON-NLS-1$ Messages.getString("OptionPanel.Submit_TIP"), 180, 20); //$NON-NLS-1$ submitButton.setEnabled(false); submitButton.addActionListener(this); } return submitButton; } /** * This method initializes jErrorPanel * * @return javax.swing.JPanel */ private JPanel getJErrorPanel() { if (jErrorPanel == null) { jErrorPanel = JPlagCreator.createPanel(null, 690, 140, 7, 20, FlowLayout.CENTER, -1); jErrorPanel.setName("status"); //$NON-NLS-1$ jErrorPanel.add(getJErrorArea(), null); jErrorPanel.add(getJOverwriteDirButton(), null); } return jErrorPanel; } /** * This method initializes jErrorArea * * @return javax.swing.JEditorPane */ private JTextArea getJErrorArea() { if (jErrorArea == null) { jErrorArea = new JTextArea(); jErrorArea.setPreferredSize(new java.awt.Dimension(656, 95)); jErrorArea.setLineWrap(true); jErrorArea.setWrapStyleWord(true); jErrorArea.setEditable(false); jErrorArea.setBackground(JPlagCreator.SYSTEMCOLOR); jErrorArea.setFont(JPlagCreator.SYSTEM_FONT); } return jErrorArea; } private boolean overwrite = false; /** * This method initializes jOverwriteDirButton * * @return javax.swing.JButton */ private JButton getJOverwriteDirButton() { if (jOverwriteDirButton == null) { jOverwriteDirButton = JPlagCreator.createButton( Messages.getString("OptionPanel.Overwrite"), //$NON-NLS-1$ Messages.getString("OptionPanel.Overwrite_TIP"), 150, 20); //$NON-NLS-1$ jOverwriteDirButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { overwrite = true; OptionPanel.this.validateTitleTimer.restart(); } }); } return jOverwriteDirButton; } /** * This method initializes jProgressBar * * @return javax.swing.JProgressBar */ private JProgressBar getJProgressBar() { if (jProgressBar == null) { jProgressBar = new JProgressBar(); jProgressBar.setPreferredSize(new java.awt.Dimension(590, 7)); jProgressBar.setBackground(JPlagCreator.SYSTEMCOLOR); jProgressBar.setForeground(java.awt.Color.black); jProgressBar.setIndeterminate(false); jProgressBar.setMaximum(100); } return jProgressBar; } private void selectLanguageCB(String lang) { for(int i=0; i<jLanguageCB.getItemCount(); i++) { if(jLanguageCB.getItemAt(i).toString().equals(lang)) { jLanguageCB.setSelectedIndex(i); break; } } } public void initOptions(boolean isChangingOptions) { Option options = client.getOptions(); jTitleField.setText(client.getClientName()); if (isChangingOptions) { setTitle(Messages.getString("OptionPanel.JPlag_change_options")); //$NON-NLS-1$ jTitleField.setEditable(false); jTitleField.setBackground(JPlagCreator.SYSTEMCOLOR); selectLanguageCB(options.getLanguage()); Integer compmode = options.getComparisonMode(); if(compmode != null && compmode >= 0 && compmode < ATUJPLAG.COMPARE_MODES.length) jCompModeCB.setSelectedIndex(compmode); jSubmissionDirField.setText(client.getSubmissionDirectory()); changeOptions(new LanguageSetting(options)); doGenerateAdvancedOptions(); firstScan = true; oldBasecodeDir = options.getBasecodeDir(); if(oldBasecodeDir == null) oldBasecodeDir = ""; //$NON-NLS-1$ String path = options.getPathToFiles(); if (path != null && path.length()!=0) { for (int i = 0; i < getJSubdirCB().getItemCount(); i++) { if (path.equals(getJSubdirCB().getItemAt(i))) { getJSubdirCB().setSelectedIndex(i); break; } } } } else { setTitle(Messages.getString("OptionPanel.JPlag_new_submission")); //$NON-NLS-1$ selectLanguageCB(atujplag.getLastLanguageName()); changeOptions(atujplag.getLastLanguageSetting()); options.setTitle(client.getClientName()); } validateTitleTimer = new Timer(SCAN_DELAY, new ActionListener() { public void actionPerformed(ActionEvent arg0) { if(OptionPanel.this.checkOptions() && previewSubs == null) { // options were invalid before -> update preview applyOptions(); } } }); validateTitleTimer.setRepeats(false); updatePreviewTimer = new Timer(SCAN_DELAY, new ActionListener() { public void actionPerformed(ActionEvent arg0) { applyOptions(); } }); updatePreviewTimer.setRepeats(false); createListeners(); jTitleField.getDocument().addDocumentListener(titleListener); jLanguageCB.addItemListener(languageItemListener); jRecurseDirCBBox.addItemListener(recurseDirCBListener); jSubmissionDirField.getDocument().addDocumentListener( new DocumentListener() { public void changedUpdate(DocumentEvent arg0) { invalidatePreview(); } public void insertUpdate(DocumentEvent arg0) { changedUpdate(arg0); } public void removeUpdate(DocumentEvent arg0) { changedUpdate(arg0); } }); jFileChooserButton.addActionListener(this); invalidatePreview(); } private void createListeners() { languageItemListener = new ItemListener() { public void itemStateChanged(ItemEvent arg0) { if(arg0.getStateChange() == ItemEvent.SELECTED) { getJRecurseDirCBBox().removeItemListener(recurseDirCBListener); changeOptions(atujplag.getLanguageSettingForName( jLanguageCB.getSelectedItem().toString())); getJRecurseDirCBBox().addItemListener(recurseDirCBListener); OptionPanel.this.changedUpdate(null); } } }; titleListener = new DocumentListener() { public void changedUpdate(DocumentEvent arg0) { overwrite = false; OptionPanel.this.validateTitleTimer.restart(); } public void insertUpdate(DocumentEvent arg0) { this.changedUpdate(arg0); } public void removeUpdate(DocumentEvent arg0) { this.changedUpdate(arg0); } }; subdirCBListener = new ItemListener() { public void itemStateChanged(ItemEvent arg0) { if(!updatingSubDirCB && arg0.getStateChange() == ItemEvent.SELECTED) invalidatePreview(); } }; recurseDirCBListener = new ItemListener() { public void itemStateChanged(ItemEvent arg0) { invalidatePreview(); } }; suffixesListener = new DocumentListener() { public void changedUpdate(DocumentEvent arg0) { advOptionsUpToDate = false; invalidatePreview(); } public void insertUpdate(DocumentEvent arg0) { this.changedUpdate(arg0); } public void removeUpdate(DocumentEvent arg0) { this.changedUpdate(arg0); } }; } public void changedUpdate(DocumentEvent arg0) { System.out.println("changedUpdate"); if(!SwingUtilities.isEventDispatchThread()) { System.out.println("OptionPanel.changedUpdate called from a thread" + " other than the event dispatching thread!!!"); // TODO: hmm... } invalidatePreview(); } public void insertUpdate(DocumentEvent arg0) { changedUpdate(arg0); } public void removeUpdate(DocumentEvent arg0) { changedUpdate(arg0); } private void changeOptions(LanguageSetting lang) { int setCTyp = 0; String clusterType = lang.getClusterType(); if (clusterType.equals("min")) //$NON-NLS-1$ setCTyp = 1; else if (clusterType.equals("avr")) //$NON-NLS-1$ setCTyp = 2; else if (clusterType.equals("max")) //$NON-NLS-1$ setCTyp = 3; getJMinMatchLenSpinner().setValue(new Integer(lang.getMinMatchLen())); String storestr = lang.getStoreMatches(); if (storestr.endsWith("%")) { storestr = storestr.substring(0, storestr.length() - 1); jStoreCB.setSelectedIndex(1); } else { jStoreCB.setSelectedIndex(0); } Integer storestr_integer; if (storestr.length() > 0) { storestr_integer = new Integer(storestr); } else { storestr_integer = new Integer(0); } getJStoreSpinner().setValue(storestr_integer); getJRecurseDirCBBox().setSelected(lang.isReadSubdirs()); getJSuffixesField().setText(lang.getSuffixes()); getJSuffixesField().setCaretPosition(0); jClusterTypeCB.setSelectedIndex(setCTyp); } public void actionPerformed(ActionEvent arg0) { Object source = arg0.getSource(); if (source == getSubmitButton()) { submit(); System.gc(); dispose(); } else if (source == this.getPreviewButton()) { if (treePreview != null) { treePreview.dispose(); treePreview = null; } else treePreview = new SubmissionTree(this); } else if (source == this.jFileChooserButton) { String subloc = jSubmissionDirField.getText(); if (subloc.length() == 0) subloc = atujplag.getLastSubmissionLocation(); String file = new File(subloc).getParent(); JFileChooser chooser; if (file == null || !(new File(file)).exists()) chooser = new JFileChooser(); else chooser = new JFileChooser(new File(file)); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); /* chooser.setBackground(JPlagCreator.SYSTEMCOLOR); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.setFileFilter(new FileFilter() { public boolean accept(File arg0) { return true; //arg0.isDirectory(); } public String getDescription() { return Messages.getString( "OptionPanel.Directories"); } }); chooser.setAcceptAllFileFilterUsed(false); chooser.setSelectedFile(new File(subloc));*/ chooser.setDialogTitle(Messages.getString( "OptionPanel.Select_the_submission_directory")); //$NON-NLS-1$ int retval = chooser.showOpenDialog(this); if (retval == JFileChooser.APPROVE_OPTION) { jSubmissionDirField.setText( chooser.getSelectedFile().getPath()); } requestFocus(); } else if (source == getJCancelButton()) { view.unblockNewSubmissions(); if (treePreview != null) { treePreview.dispose(); treePreview = null; } dispose(); } else if (source == getJGeneralOptionsButton()) { CardLayout layout = (CardLayout) getJOptionPanel().getLayout(); layout.previous(getJOptionPanel()); getJGeneralOptionsButton().setEnabled(false); getJAdvancedOptionsButton().setEnabled(true); } else if (source == getJAdvancedOptionsButton()) { // Collecting options /* client.getOptions().setLanguage( jLanguageCB.getSelectedItem().toString()); client.getOptions().setReadSubdirs( getJRecurseDirCBBox().isSelected());*/ getJGeneralOptionsButton().setEnabled(true); getJAdvancedOptionsButton().setEnabled(false); CardLayout layout = (CardLayout) this.getJOptionPanel().getLayout(); generateAdvancedOptions(); layout.next(getJOptionPanel()); } else if (source == getJApplyDefaultsButton()) { changeOptions(atujplag.getDefaultLanguageSettingForName( jLanguageCB.getSelectedItem().toString())); } } private void submit() { if (treePreview != null) treePreview.dispose(); Option option = getClient().getOptions(); client.getOptions().setLanguage( jLanguageCB.getSelectedItem().toString()); client.setClientName(jTitleField.getText()); option.setComparisonMode(jCompModeCB.getSelectedIndex()); // Cluster type String x = jClusterTypeCB.getSelectedItem().toString(); if (x.equals(Messages.getString("OptionPanel.none"))) //$NON-NLS-1$ x = ""; //$NON-NLS-1$ option.setClustertype(x); // Basecode String bc = getJBasecodeCB().getSelectedItem().toString(); if (bc.equals(Messages.getString("OptionPanel.none"))) //$NON-NLS-1$ bc = ""; //$NON-NLS-1$ option.setBasecodeDir(bc); // Minimum match length int value = ((Integer) getJMinMatchLenSpinner().getModel().getValue()) .intValue(); if (value >= 2 && value <= 100) option.setMinimumMatchLength(value); // Storage int value2 = ((Integer) getJStoreSpinner().getModel().getValue()) .intValue(); String typ1 = (jStoreCB.getSelectedIndex() == 0) ? "" //$NON-NLS-1$ : "%"; //$NON-NLS-1$ if (value >= 2 && value2 <= 100) option.setStoreMatches(value2 + typ1); option.setCountryLang(atujplag.getCountryLanguageValue()); client.setSubmissions(previewSubs); option.setReadSubdirs(getJRecurseDirCBBox().isSelected()); client.getOptions().setOriginalDir( client.getSubmissionDirectory()); atujplag.updateLastSubmissionInfos(option); isSubmitted = true; if (overwrite) { ATUJPLAG.delete(new File(atujplag.getResultLocation(), jTitleField.getText())); view.updateTable(null); } InfoPanel inf = new InfoPanel(client, view); view.startInfoPanel(inf); } private void applyOptions() { getClient().setSubmissionDirectory(jSubmissionDirField.getText()); // Suffixes getClient().getOptions().setSuffixes(parseCommaString( getJSuffixesField().getText())); // Recurse getClient().getOptions().setReadSubdirs(getJRecurseDirCBBox().isSelected()); // Path to files String subdir = getJSubdirCB().getSelectedItem().toString(); if (!subdir.equals(Messages.getString("OptionPanel.none"))) { //$NON-NLS-1$ getClient().getOptions().setPathToFiles(subdir); } else getClient().getOptions().setPathToFiles(""); //$NON-NLS-1$ if(!firstScan) oldBasecodeDir = getJBasecodeCB().getSelectedItem().toString(); else firstScan = false; previewSubs = null; updateBasecodeCombo(); updateSubdirCombo(); updateScanThread(); } private void requestPreviewUpdate() { this.updatePreviewTimer.restart(); } /** * Invalidates status infos and requests preview update */ private void invalidatePreview() { updatePreviewTimer.stop(); if(scanThread != null) { scanThread.interrupt(); try { scanThread.join(200); } catch(InterruptedException e) {} scanThread = null; } getSubmitButton().setEnabled(false); getPreviewButton().setEnabled(false); getJNumValidProgramsField().setText(""); //$NON-NLS-1$ getJNumFilesField().setText(""); //$NON-NLS-1$ getJSubmissionSizeField().setText(""); //$NON-NLS-1$ getJProgressBar().setValue(0); if(treePreview != null) { treePreview.dispose(); treePreview = null; reopenPreview = true; } else reopenPreview = false; previewSubs = null; if(!checkOptions()) { // invalid options? return; } getStatusTextField().setText(Messages.getString("OptionPanel.OK")); //$NON-NLS-1$ requestPreviewUpdate(); } private void updateBasecodeCombo() { int selindex = 0, numadded = 1; JComboBox<String> cb = getJBasecodeCB(); cb.removeAllItems(); cb.addItem(Messages.getString("OptionPanel.none")); //$NON-NLS-1$ if(previewSubs == null) return; for(int i = 0; i < previewSubs.size(); i++) { SubmissionManager sub = previewSubs.get(i); if(sub.isValid() && sub.isDirectory()) { cb.addItem(sub.name); if(sub.name.equals(oldBasecodeDir)) selindex = numadded; numadded++; } } cb.setSelectedIndex(selindex); } /** * Updates the subdirectory combo box. * The data depends on the following options: * - client.getSubmissionDirectory() * - client.getOptions().getSuffixes() * - client.getOptions().isReadSubdirs() (recurse) */ private void updateSubdirCombo() { updatingSubDirCB = true; JComboBox<String> cb = getJSubdirCB(); String selItem = (String) cb.getSelectedItem(); // will be null, if none selected cb.removeAllItems(); cb.addItem(Messages.getString("OptionPanel.none")); //$NON-NLS-1$ File[] files = (new File(client.getSubmissionDirectory())).listFiles(); if(files == null) { System.out.println("No file found"); System.out.println("Directory: " + jSubmissionDirField.getText()); } genAOSuffixes = getSuffixes(); if(genAOSuffixes != null) { int addedItems = 1, selIndex = 0; for(int i = 0; i < files.length; i++) { if(files[i].isDirectory()) { File[] subfiles = files[i].listFiles(); subfilesloop: for(int j = 0; j < subfiles.length; j++) { if(subfiles[j].isDirectory()) { // Check whether this directory is already in subdircb String dirname = subfiles[j].getName(); for(int k = 0; k < cb.getItemCount(); k++) { if(dirname.equals(cb.getItemAt(k).toString())) continue subfilesloop; // already in combo box } if(hasDirValidFiles(subfiles[j])) { cb.addItem(dirname); if(dirname.equals(selItem)) selIndex = addedItems; addedItems++; } } } } } cb.setSelectedIndex(selIndex); } updatingSubDirCB = false; } String[] genAOSuffixes; private boolean hasDirValidFiles(File aktDir) { String[] newFiles = aktDir.list(new FilenameFilter() { public boolean accept(File dir, String name) { if (!new File(dir, name).isFile()) return false; for (int i = 0; i < genAOSuffixes.length; i++) if (name.endsWith(genAOSuffixes[i])) return true; return false; } }); if(newFiles.length != 0) return true; if(client.getOptions().isReadSubdirs()) { String[] dirs = aktDir.list(new FilenameFilter() { public boolean accept(File dir, String name) { return (new File(dir, name).isDirectory()); // all sub-dirs } }); if (dirs != null) { for (int k = 0; k < dirs.length; k++) { if(hasDirValidFiles(new File(aktDir, dirs[k]))) return true; } } } return false; } private void doGenerateAdvancedOptions() { if(advOptionsUpToDate) return; this.client.setSubmissionDirectory(jSubmissionDirField.getText()); oldBasecodeDir = ""; updateBasecodeCombo(); updateSubdirCombo(); advOptionsUpToDate = true; } private void generateAdvancedOptions() { this.getJProgressBar().setIndeterminate(true); doGenerateAdvancedOptions(); this.getJProgressBar().setIndeterminate(false); } public SimpleClient getClient() { return client; } public Vector<SubmissionManager> getSubmissions() { return previewSubs; } private String[] parseCommaString(String str) { String tmp; if (str.length() == 0) return null; Vector<String> strs = new Vector<String>(); try { StringTokenizer st = new StringTokenizer(str, ","); //$NON-NLS-1$ while (st.hasMoreTokens()) { tmp = st.nextToken().trim(); if (tmp.length() == 0) continue; strs.addElement(tmp); } } catch (NoSuchElementException e) { // This should never happen... return null; } String[] strlist = new String[strs.size()]; strs.copyInto(strlist); return strlist; } private String[] getSuffixes() { return client.getOptions().getSuffixes(); } /** * @return true and shows the status panel, if options are valid. * false and shows the general options panel and error panel with * an error message, otherwise */ private boolean checkOptions() { CardLayout layout = (CardLayout) getJStatusCardPanel().getLayout(); int error = validateOptions(); if (error == NOERROR) { layout.show(getJStatusCardPanel(), getJStatusPanel().getName()); // Activate advanced options button, if general options were not // valid before if(!getJGeneralOptionsButton().isEnabled() && !getJAdvancedOptionsButton().isEnabled()) getJAdvancedOptionsButton().setEnabled(true); return true; } else { // Do not overwrite if change options called //TODO was will dieser kommentar sagen?? // General options are invalid -> show error and general options // panel and disable option buttons layout.show(getJStatusCardPanel(), getJErrorPanel().getName()); layout = (CardLayout) getJOptionPanel().getLayout(); layout.show(getJOptionPanel(), (error == GENOPTERROR) ? getJGeneralOptionsPanel().getName() : getJAdvancedOptionsPanel().getName()); if(error == GENOPTERROR) { getJGeneralOptionsButton().setEnabled(false); getJAdvancedOptionsButton().setEnabled(false); } return false; } } /** * @return true, if the options appear to be valid * TODO: shouldn't "validate"Options only "validate" the options and not * apply them as "apply"Options should do?? */ private int validateOptions() { // check title String title = this.jTitleField.getText(); if (title.length() == 0) { getJErrorArea().setText(Messages.getString("OptionPanel.Title_missing")); //$NON-NLS-1$ this.getJOverwriteDirButton().setVisible(false); return GENOPTERROR; } // if(title.matches(".*[\\\\/:\\*\\?\"%&<>\\|].*|\\s.*|.*\\s")) { if(!title.matches("[\\w\\.,!-][\\w\\s\\.,!-]*[\\w\\.,!-]")) { getJErrorArea().setText(Messages.getString("OptionPanel.Illegal_title")); //$NON-NLS-1$ this.getJOverwriteDirButton().setVisible(false); return GENOPTERROR; } File f = new File(atujplag.getResultLocation()); File f1 = null; if (f.exists()) { if (!f.isDirectory()) { getJErrorArea().setText(TagParser.parse(Messages.getString( "OptionPanel.Report_directory_is_not_a_directory_{1_PATH}"), //$NON-NLS-1$ new String[] { f.getPath() })); this.getJOverwriteDirButton().setVisible(false); return GENOPTERROR; } else if ((f1 = new File(f, title)).exists()) { if (!this.overwrite) { getJErrorArea().setText(TagParser.parse(Messages.getString( "OptionPanel.Title_directory_already_exists_in_Ask_overwrite_{1_TITLE}_{2_PATH}"), //$NON-NLS-1$ new String[] { f1.getName(), f.getPath() })); this.getJOverwriteDirButton().setVisible(true); return GENOPTERROR; } } } else { getJErrorArea().setText(TagParser.parse(Messages.getString( "OptionPanel.Report_directory_does_not_exist_{1_PATH}"), //$NON-NLS-1$ new String[] { f.getPath() })); this.getJOverwriteDirButton().setVisible(false); return GENOPTERROR; } // check submission directory String t = jSubmissionDirField.getText(); if (t.length() == 0) { getJErrorArea().setText(Messages.getString( "OptionPanel.Submission_directory_No_directory_given")); //$NON-NLS-1$ this.getJOverwriteDirButton().setVisible(false); previewSubs = null; return GENOPTERROR; } f = new File(t); if (f.exists()) { if (!f.isDirectory()) { getJErrorArea().setText(TagParser.parse(Messages.getString( "OptionPanel.Submission_directory_is_not_a_directory_{1_PATH}"), //$NON-NLS-1$ new String[] { f.getName() })); this.getJOverwriteDirButton().setVisible(false); previewSubs = null; return GENOPTERROR; } } else { getJErrorArea().setText(TagParser.parse(Messages.getString( "OptionPanel.Submission_directory_does_not_exist_{1_PATH}"), //$NON-NLS-1$ new String[] { f.getName() })); this.getJOverwriteDirButton().setVisible(false); previewSubs = null; return GENOPTERROR; } this.client.getOptions().setLanguage( this.jLanguageCB.getSelectedItem().toString()); // check suffixes if(getJSuffixesField().getText().length()==0) { getJErrorArea().setText(Messages.getString( "OptionPanel.Illegal_suffixes")); //$NON-NLS-1$ this.getJOverwriteDirButton().setVisible(false); return ADVOPTERROR; } getClient().getOptions().setSuffixes(parseCommaString( getJSuffixesField().getText())); return NOERROR; } protected void previewClosed() { treePreview = null; } private void setAdvPanelListenersActive(boolean bol) { this.getJProgressBar().setIndeterminate(false); if (bol) { this.getJSubdirCB().addItemListener( this.subdirCBListener); this.getJSuffixesField().getDocument().addDocumentListener( this.suffixesListener); this.getJRecurseDirCBBox().addItemListener(this.recurseDirCBListener); } else { this.getJRecurseDirCBBox().removeItemListener(this.recurseDirCBListener); this.getJSubdirCB().removeItemListener( this.subdirCBListener); this.getJSuffixesField().getDocument().removeDocumentListener( this.suffixesListener); } } private synchronized void setStatus(String message) { this.getJErrorArea().setText(message); } private synchronized void setStatus(String[] result) { this.getStatusTextField().setText(result[0]); this.getJNumValidProgramsField().setText(result[4]); this.getJNumFilesField().setText(result[2]); this.getJSubmissionSizeField().setText(result[3]); } protected void updateScanThread() { if (this.scanThread != null) { scanThread.interrupt(); try { scanThread.join(200); } catch(InterruptedException e) {} } this.scanThread = new ScanThread(this); System.gc(); this.getSubmitButton().setEnabled(false); this.getPreviewButton().setEnabled(false); getStatusTextField().setText( Messages.getString("OptionPanel.Scanning_directories")); //$NON-NLS-1$ this.getJNumValidProgramsField().setText(""); this.getJNumFilesField().setText(""); this.getJSubmissionSizeField().setText(""); this.scanThread.start(); } private synchronized Vector<SubmissionManager> scanFiles() throws InterruptedException { this.getJProgressBar().setIndeterminate(false); Vector<SubmissionManager> res = new Vector<SubmissionManager>(); String subDir = this.client.getOptions().getPathToFiles(); if (subDir != null && subDir.length()==0) subDir = null; File f = new File(this.client.getSubmissionDirectory()); if (f == null || !f.isDirectory()) { this.setStatus(Messages.getString( "OptionPanel.Unable_to_retrieve_directory") //$NON-NLS-1$ + ": " + client.getSubmissionDirectory()); //$NON-NLS-1$ return null; } String[] list = null; try { list = f.list(); } catch (SecurityException e) { setStatus(Messages.getString( "OptionPanel.Unable_to_access_directory") //$NON-NLS-1$ + ": " + f.getPath()); //$NON-NLS-1$ return null; } String[] suffixes = getSuffixes(); if(suffixes == null) { EventQueue.invokeLater(new Runnable() { public void run() { getStatusTextField().setText(Messages.getString( "OptionPanel.Illegal_suffixes")); //$NON-NLS-1$ doGenerateAdvancedOptions(); } }); return null; } boolean recurse = client.getOptions().isReadSubdirs(); for (int i = 0; i < list.length; i++) { if (Thread.currentThread().isInterrupted()) throw new InterruptedException(); File subm_dir = new File(f, list[i]); getJProgressBar().setValue((i + 1) * 100 / list.length); getStatusTextField().setText(TagParser.parse( Messages.getString("OptionPanel.Scanning_directory_{1_DIR}"), //$NON-NLS-1$ new String[] { list[i] })); if (!subm_dir.isDirectory()) { boolean ok = false; String name = subm_dir.getName(); for (int j = 0; j < suffixes.length; j++) if (name.endsWith(suffixes[j])) { ok = true; break; } if (ok) { if(subDir != null) res.addElement(new SubmissionManager(name, SubmissionManager.FILENOTINSUBDIR)); else res.addElement(new SubmissionManager(name, f)); } } else { File file_dir = (subDir == null) ? subm_dir : new File(subm_dir, subDir); if (file_dir.isDirectory()) { res.addElement(new SubmissionManager(subm_dir.getName(), file_dir, recurse, suffixes)); } else if(subDir != null) res.addElement(new SubmissionManager(subm_dir.getName(), SubmissionManager.DIRHASNOTSUBDIR)); } } // end for return res; } private void scanThreadEnds(Vector<SubmissionManager> subs, String[] result) { int t = Integer.parseInt(result[4]); if (subs != null) { this.previewSubs = subs; getPreviewButton().setEnabled(true); if(t>=2 && result[0] == null) { result[0] = Messages.getString("OptionPanel.OK"); //$NON-NLS-1$ getSubmitButton().setEnabled(true); } updateBasecodeCombo(); } else { getPreviewButton().setEnabled(false); getSubmitButton().setEnabled(false); } setStatus(result); if (scanThread == Thread.currentThread()) { scanThread = null; if (reopenPreview) { // was treePreview open? treePreview = new SubmissionTree(this); } } else { System.out.println("scanThread != currentThread !?!?!"); // TODO: hmm... } } class ScanThread extends Thread { private static final long FILE_LIMIT = 10000; private static final long SIZE_LIMIT = 100 * 1024 * 1024; private OptionPanel gui; public ScanThread(OptionPanel gui) { super(); this.gui = gui; } /* * returns in element: 0: error message or null 1: # of files 2: size of * submission */ public String[] checkSubmissions(Vector<SubmissionManager> subs) { String[] result = new String[6]; int n = subs.size(); // test size and number of files long size = 0; int anz = 0; int valid = 0; result[0] = result[2] = result[3] = result[4] = null; result[1] = String.valueOf(subs.size()); for (int i = 0; i < n; i++) { SubmissionManager s = subs.elementAt(i); if (s.isValid()) valid++; for (int j = (s.files.length - 1); j >= 0; j--) { File f = new File(s.dir, s.files[j]); size += f.length(); anz++; } } result[2] = TagParser.parse(Messages .getString("OptionPanel.Files_{1_NUMBER}"), //$NON-NLS-1$ new String[] { anz + "" }); //$NON-NLS-2$ result[3] = (size / 1024) + " KB"; //$NON-NLS-1$ if (anz == 0 || size == 0) { result[0] = Messages.getString("OptionPanel.Not_enough_files"); //$NON-NLS-1$ } else if (anz > FILE_LIMIT) { result[0] = TagParser.parse(Messages.getString( "OptionPanel.Too_many_files_Current_file_limit_is_{1_MAXFILES}"), //$NON-NLS-1$ new String[] { FILE_LIMIT + "" }); //$NON-NLS-1$ } else if (size > SIZE_LIMIT) { result[0] = TagParser.parse(Messages.getString( "OptionPanel.The_submission_is_too_large_Current_size_limit_is_{1_KBSIZE}"), //$NON-NLS-1$ new String[] { (SIZE_LIMIT / 1024) + "" }); //$NON-NLS-1$ } else if (valid < 2) result[0] = Messages.getString( "OptionPanel.Not_enough_valid_programs"); //$NON-NLS-1$ result[4] = String.valueOf(valid); return result; } public void run() { Vector<SubmissionManager> subs = null; String[] result = null; try { subs = scanFiles(); if (subs == null) { /* gui.setStatus(Messages.getString( "OptionPanel.No_files_found")); //$NON-NLS-1$*/ return; } result = checkSubmissions(subs); } catch (InterruptedException t) { // gui.setStatus("(interrupted)", false); return; } // Only apply result when scanning was not interrupted if (!Thread.currentThread().isInterrupted()) gui.scanThreadEnds(subs, result); } } }