]> Dogcows Code - chaz/vimcoder/blobdiff - src/com/dogcows/VimCoder.java
retab to four spaces for indentation
[chaz/vimcoder] / src / com / dogcows / VimCoder.java
index e684746d9db73be189573310995694269c06ec4b..7c4afe341b3d88cc50ced9f3846aebb3a9d0b000 100644 (file)
@@ -1,20 +1,19 @@
 
 package com.dogcows;
 
-import javax.swing.*;
 import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.beans.PropertyChangeListener;
+import java.awt.event.*;
 import java.io.*;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import com.topcoder.client.contestant.ProblemComponentModel;
-import com.topcoder.shared.language.*;
-import com.topcoder.shared.problem.*;
-import com.topcoder.shared.problem.Renderer;
+import javax.swing.*;
+import javax.swing.border.*;
+
 import com.topcoder.client.contestApplet.common.Common;
 import com.topcoder.client.contestApplet.common.LocalPreferences;
+import com.topcoder.client.contestant.ProblemComponentModel;
+import com.topcoder.shared.language.Language;
+import com.topcoder.shared.problem.Renderer;
 
 /**
  * @author Charles McGarvey
@@ -28,71 +27,76 @@ public class VimCoder
     /**
      * The name and version of this plugin.
      */
-    public final static String     version = "VimCoder 0.2";
-    
-    /**
-     * The website of the plugin project.
-     */
-    public final static String     website = "http://www.dogcows.com/vimcoder";
-    
-    
+    public final static String version = "VimCoder 0.3.6";
+
+
     /**
      * The first part of the command used to invoke the Vim server.
      */
-    private static String   vimCommand = "gvim";
-    
+    private static String vimCommand = "gvim";
+
     /**
      * The path to the main VimCoder directory.
      */
-    private static File     rootDir;
+    private static File rootDir;
     static
     {
         if (System.getProperty("os.name").toLowerCase().equals("win"))
         {
             vimCommand = "C:\\WINDOWS\\gvim.bat";
         }
-        rootDir = new File(System.getProperty("user.home") +
-                           System.getProperty("file.separator") + ".vimcoder");
+        rootDir = new File(System.getProperty("user.home") + System.getProperty("file.separator") + ".vimcoder");
     }
-    
-    
+
+    /**
+     * Whether or not to use the contest name and point value as problem
+     * directory names.
+     */
+    private static boolean contestDirNames = false;
+
+
     /**
      * The panel given to the Arena applet when it is requested.
      */
-    private JPanel      panel;
-    
+    private JPanel panel;
+
     /**
      * The text widget where log messages are appended.
      */
-    private JTextArea   logArea;
-    
+    private JTextArea logArea;
+
     /**
      * The current editor object (or null if there is none).
      */
-    private Editor      editor;
-    
+    private Editor editor;
+
     /**
      * The configuration panel.
      */
-    private JDialog     configDialog;
-    
-    
+    private JDialog configDialog;
+
+
     /**
      * The key for the vim command preference.
      */
     private final static String VIMCOMMAND = "com.dogcows.VimCoder.config.vimcommand";
-    
+
     /**
      * The key for the root directory preference.
      */
     private final static String ROOTDIR = "com.dogcows.VimCoder.config.rootdir";
-    
+
+    /**
+     * The key for the problem directory name preference.
+     */
+    private final static String CONTESTDIRNAMES = "com.dogcows.VimCoder.config.contestdirnames";
+
     /**
      * The preferences object for storing plugin settings.
      */
     private static LocalPreferences prefs = LocalPreferences.getInstance();
-    
-    
+
+
     /**
      * Get the command for invoking vim.
      * @return The command.
@@ -101,7 +105,7 @@ public class VimCoder
     {
         return vimCommand;
     }
-    
+
     /**
      * Get the storage directory.
      * @return The directory.
@@ -111,10 +115,20 @@ public class VimCoder
         return rootDir;
     }
 
-   
     /**
-     * Instantiate the entry point of the editor plugin.  Sets up the log widget
-     * and panel.
+     * Get whether or not to save problems in a human-readable directory
+     * structure.
+     * @return The directory name setting.
+     */
+    public static boolean isContestDirNames()
+    {
+        return contestDirNames;
+    }
+
+
+    /**
+     * Instantiate the entry point of the editor plugin.
+     * Sets up the log widget and panel.
      */
     public VimCoder()
     {
@@ -124,12 +138,12 @@ public class VimCoder
         logArea.setEditable(false);
         Font font = new Font("Courier", Font.PLAIN, 12);
         if (font != null) logArea.setFont(font);
-           
+
         panel = new JPanel(new BorderLayout());
         panel.add(new JScrollPane(logArea), BorderLayout.CENTER);
     }
 
-    
+
     /**
      * Called by the Arena when the plugin is about to be used.
      */
@@ -152,7 +166,7 @@ public class VimCoder
         }
         loadConfiguration();
     }
-    
+
     /**
      * Called by the Arena when the plugin is no longer needed.
      */
@@ -160,20 +174,20 @@ public class VimCoder
     {
         editor = null;
     }
-    
+
     /**
-     * Called by the Arena to obtain the editor panel which we will use to show
-     * log messages.
+     * Called by the Arena to obtain the editor panel which we will use to
+     * show log messages.
      * @return The editor panel.
      */
     public JPanel getEditorPanel()
     {
         return panel;
     }
-   
+
     /**
-     * Called by the Arena to obtain the current source.  This happens when the
-     * user is saving, compiling, and/or submitting.
+     * Called by the Arena to obtain the current source.
+     * This happens when the user is saving, compiling, and/or submitting.
      * @return The current source code.
      * @throws Exception If the source file edited by Vim couldn't be read.
      */
@@ -187,12 +201,11 @@ public class VimCoder
         }
         catch (Exception exception)
         {
-            logError("Failed to get source code: " +
-                     exception.getLocalizedMessage());
+            logError("Failed to get source code: " + exception.getLocalizedMessage());
             throw exception;
         }
     }
-    
+
     /**
      * Called by the Arena to pass the source it has.
      * @param source The source code.
@@ -206,21 +219,21 @@ public class VimCoder
         }
         catch (Exception exception)
         {
-            logError("Failed to save the source given by the server: " +
-                     exception.getLocalizedMessage());
+            logError("Failed to save the source given by the server: " + exception.getLocalizedMessage());
             return;
         }
     }
-    
+
     /**
-     * Called by the Arena to pass along information about the current problem.
+     * Called by the Arena to pass along information about the current
+     * problem.
      * @param component A container for the particulars of the problem.
      * @param language The currently selected language.
-     * @param renderer A helper object to help format the problem statement.
+     * @param renderer A helper object to help format the problem
+     * statement.
      */
-    public void setProblemComponent(ProblemComponentModel component, 
-                                    Language language,
-                                    Renderer renderer)
+    public void setProblemComponent(ProblemComponentModel component,
+                    Language language, Renderer renderer)
     {
         try
         {
@@ -228,76 +241,99 @@ public class VimCoder
         }
         catch (Exception exception)
         {
-            logError("An error occured while loading the problem: " +
-                     exception.getLocalizedMessage());
+            logError("An error occurred while loading the problem: " + exception.getLocalizedMessage());
         }
     }
-    
+
     /**
      * Called by the Arena when it's time to show our configuration panel.
      */
     public void configure()
     {
+        final int border = 10;
+        final int inset = 2;
+
         loadConfiguration();
-        
+
         configDialog = new JDialog();
-        Container pane = configDialog.getContentPane();
-        
-        pane.setPreferredSize(new Dimension(550, 135));
-        pane.setLayout(new GridBagLayout());
-        pane.setForeground(Common.FG_COLOR);
-        pane.setBackground(Common.WPB_COLOR);
+        Container container = configDialog.getContentPane();
+        container.setForeground(Common.FG_COLOR);
+        container.setBackground(Common.WPB_COLOR);
+
+        JPanel pane = new JPanel();
+        container.add(pane);
+
+        BoxLayout boxLayout = new BoxLayout(pane, BoxLayout.Y_AXIS);
+        pane.setLayout(boxLayout);
+        pane.setBorder(BorderFactory.createEmptyBorder(border, border, border, border));
+
+        JPanel fieldPanel = new JPanel(new GridBagLayout());
+        pane.add(fieldPanel);
+        pane.add(Box.createRigidArea(new Dimension(0, border)));
+
         GridBagConstraints c = new GridBagConstraints();
-        
-        JLabel vimCommandLabel = new JLabel("Vim Command:");
-        vimCommandLabel.setForeground(Common.FG_COLOR);
-        vimCommandLabel.setAlignmentX(1.0f);
         c.fill = GridBagConstraints.HORIZONTAL;
-        c.gridx = 0;
-        c.gridy = 0;
-        c.insets = new Insets(5, 5, 5, 5);
-        pane.add(vimCommandLabel, c);
-        
-        final JTextField vimCommandField = new JTextField(vimCommand, 25);
-        c.gridx = 1;
-        c.gridy = 0;
-        c.gridwidth = 3;
-        pane.add(vimCommandField, c);
-        
+        c.insets = new Insets(inset, inset, inset, inset);
+
         JLabel rootDirLabel = new JLabel("Storage Directory:");
         rootDirLabel.setForeground(Common.FG_COLOR);
         c.gridx = 0;
-        c.gridy = 1;
+        c.gridy = 0;
         c.gridwidth = 1;
-        pane.add(rootDirLabel, c);
-        
-        final JTextField rootDirField = new JTextField(rootDir.getPath(), 25);
+        fieldPanel.add(rootDirLabel, c);
+
+        final JTextField rootDirField = new JTextField(rootDir.getPath());
+        rootDirField.setPreferredSize(new Dimension(0, 24));
         c.gridx = 1;
-        c.gridy = 1;
-        c.gridwidth = 2;
-        pane.add(rootDirField, c);
-        
+        c.gridy = 0;
+        c.weightx = 1.0;
+        fieldPanel.add(rootDirField, c);
+
         JButton browseButton = new JButton("Browse");
-        c.fill = GridBagConstraints.NONE;
-        c.gridx = 3;
-        c.gridy = 1;
-        c.gridwidth = 1;
+        c.gridx = 2;
+        c.gridy = 0;
+        c.weightx = 0.0;
         c.anchor = GridBagConstraints.BASELINE_LEADING;
-        pane.add(browseButton, c);
-        
-        JButton closeButton = new JButton("Close");
-        c.fill = GridBagConstraints.HORIZONTAL;
+        fieldPanel.add(browseButton, c);
+
+        final JCheckBox contestDirNamesButton = new JCheckBox(
+            "Store problems according to contest name and point value.",
+            contestDirNames
+        );
+        contestDirNamesButton.setForeground(Common.FG_COLOR);
+        contestDirNamesButton.setBackground(Common.WPB_COLOR);
+        contestDirNamesButton.setFont(rootDirLabel.getFont());
         c.gridx = 1;
+        c.gridy = 1;
+        c.gridwidth = 2;
+        fieldPanel.add(contestDirNamesButton, c);
+
+        JLabel vimCommandLabel = new JLabel("Vim Command:");
+        vimCommandLabel.setForeground(Common.FG_COLOR);
+        c.gridx = 0;
         c.gridy = 2;
-        c.anchor = GridBagConstraints.PAGE_END;
-        pane.add(closeButton, c);
-        
-        JButton saveButton = new JButton("Save");
-        c.gridx = 2;
+        c.gridwidth = 1;
+        fieldPanel.add(vimCommandLabel, c);
+
+        final JTextField vimCommandField = new JTextField(vimCommand);
+        vimCommandField.setPreferredSize(new Dimension(0, 24));
+        c.gridx = 1;
         c.gridy = 2;
+        c.weightx = 1.0;
         c.gridwidth = 2;
-        pane.add(saveButton, c);
-        
+        fieldPanel.add(vimCommandField, c);
+
+        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING, inset, inset));
+        buttonPanel.setPreferredSize(new Dimension(400, 24 + 2 * inset));
+        pane.add(buttonPanel);
+
+        JButton saveButton = new JButton("Save");
+        buttonPanel.add(saveButton);
+        buttonPanel.add(Box.createRigidArea(new Dimension(1, 0)));
+
+        JButton closeButton = new JButton("Close");
+        buttonPanel.add(closeButton);
+
         browseButton.addActionListener(new ActionListener()
         {
             public void actionPerformed(ActionEvent actionEvent)
@@ -307,14 +343,14 @@ public class VimCoder
                 chooser.setDialogTitle("Choose Storage Directory");
                 chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                 chooser.setAcceptAllFileFilterUsed(false);
-                
+
                 if (chooser.showOpenDialog(configDialog) == JFileChooser.APPROVE_OPTION)
                 {
                     rootDirField.setText(chooser.getSelectedFile().getPath());
                 }
             }
         });
-        
+
         closeButton.addActionListener(new ActionListener()
         {
             public void actionPerformed(ActionEvent actionEvent)
@@ -322,26 +358,27 @@ public class VimCoder
                 configDialog.dispose();
             }
         });
-        
+
         saveButton.addActionListener(new ActionListener()
         {
             public void actionPerformed(ActionEvent actionEvent)
             {
                 prefs.setProperty(VIMCOMMAND, vimCommandField.getText());
                 prefs.setProperty(ROOTDIR, rootDirField.getText());
-                configDialog.dispose();
+                prefs.setProperty(CONTESTDIRNAMES, String.valueOf(contestDirNamesButton.isSelected()));
+                JOptionPane.showMessageDialog(null, "Preferences were saved successfully.");
             }
         });
-         
+
         configDialog.setTitle("VimCoder Preferences");
         configDialog.pack();
-        configDialog.setLocationByPlatform(true);
+        configDialog.setLocationRelativeTo(null);   // Center dialog in screen.
         configDialog.setModalityType(Dialog.DEFAULT_MODALITY_TYPE);
         configDialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
         configDialog.setVisible(true);
     }
-    
-    
+
+
     /**
      * Load the local preferences related to this plugin.
      */
@@ -349,12 +386,15 @@ public class VimCoder
     {
         String vc  = prefs.getProperty(VIMCOMMAND);
         if (vc != null) vimCommand = vc;
-        
+
         String dir = prefs.getProperty(ROOTDIR);
         if (dir != null) rootDir = new File(dir);
+
+        String cn  = prefs.getProperty(CONTESTDIRNAMES);
+        if (cn != null) contestDirNames = Boolean.parseBoolean(cn);
     }
 
-    
+
     /**
      * A generic logging function, appends text to the text area.  A timestamp
      * is also prepended to the next text.
@@ -379,7 +419,7 @@ public class VimCoder
             SwingUtilities.invokeLater(task);
         }
     }
-    
+
     /**
      * Output non-critical messages to the log.
      * @param what The text of the message.
@@ -388,16 +428,7 @@ public class VimCoder
     {
         log(" INFO: " + what + System.getProperty("line.separator"));
     }
-    
-    /**
-     * Output potentially important messages to the log.
-     * @param what The text of the message.
-     */
-    private void logWarning(String what)
-    {
-        log(" WARN: " + what + System.getProperty("line.separator"));
-    }
-    
+
     /**
      * Output critical messages and errors to the log.
      * @param what The text of the message.
@@ -408,3 +439,4 @@ public class VimCoder
     }
 }
 
+// vim:et:ts=8:sts=4:sw=4
This page took 0.033585 seconds and 4 git commands to generate.