JAL-1620 version bump and release notes
[jalview.git] / src / jalview / jbgui / GPreferences.java
index f3289a3..26bd0cc 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
  * Copyright (C) 2014 The Jalview Authors
  * 
  * This file is part of Jalview.
@@ -26,6 +26,7 @@ import jalview.util.MessageManager;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
+import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.Font;
@@ -36,6 +37,7 @@ import java.awt.Insets;
 import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -45,6 +47,7 @@ import javax.swing.DefaultListCellRenderer;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
+import javax.swing.JFileChooser;
 import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JPanel;
@@ -56,6 +59,8 @@ import javax.swing.SwingConstants;
 import javax.swing.border.Border;
 import javax.swing.border.EmptyBorder;
 import javax.swing.border.TitledBorder;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
@@ -128,8 +133,10 @@ public class GPreferences extends JPanel
   protected JCheckBox showNpTooltip = new JCheckBox();
 
   /*
-   * Annotations tab components
+   * Structure tab and components
    */
+  protected JPanel structureTab;
+
   protected JCheckBox structFromPdb = new JCheckBox();
 
   protected JCheckBox useRnaView = new JCheckBox();
@@ -140,6 +147,8 @@ public class GPreferences extends JPanel
 
   protected JComboBox<String> structViewer = new JComboBox<String>();
 
+  protected JTextField chimeraPath = new JTextField();
+
   /*
    * Colours tab components
    */
@@ -237,7 +246,7 @@ public class GPreferences extends JPanel
    */
   private void jbInit() throws Exception
   {
-    JTabbedPane tabbedPane = new JTabbedPane();
+    final JTabbedPane tabbedPane = new JTabbedPane();
     this.setLayout(new BorderLayout());
     JPanel okCancelPanel = initOkCancelPanel();
     this.add(tabbedPane, BorderLayout.CENTER);
@@ -271,6 +280,31 @@ public class GPreferences extends JPanel
      */
     wsTab.setLayout(new BorderLayout());
     tabbedPane.add(wsTab, MessageManager.getString("label.web_services"));
+
+    /*
+     * Handler to validate a tab before leaving it - currently only for
+     * Structure.
+     */
+    tabbedPane.addChangeListener(new ChangeListener()
+    {
+      private Component lastTab;
+
+      @Override
+      public void stateChanged(ChangeEvent e)
+      {
+        if (lastTab == structureTab
+                && tabbedPane.getSelectedComponent() != structureTab)
+        {
+          if (!validateStructure())
+          {
+            tabbedPane.setSelectedComponent(structureTab);
+            return;
+          }
+        }
+        lastTab = tabbedPane.getSelectedComponent();
+      }
+
+    });
   }
 
   /**
@@ -689,7 +723,8 @@ public class GPreferences extends JPanel
    */
   private JPanel initStructureTab()
   {
-    JPanel structureTab = new JPanel();
+    structureTab = new JPanel();
+
     structureTab.setBorder(new TitledBorder(MessageManager
             .getString("label.structure_options")));
     structureTab.setLayout(null);
@@ -744,15 +779,109 @@ public class GPreferences extends JPanel
     structureTab.add(viewerLabel);
 
     structViewer.setFont(verdana11);
-    structViewer.setBounds(new Rectangle(150, ypos, 120, height));
+    structViewer.setBounds(new Rectangle(160, ypos, 120, height));
     structViewer.addItem(Viewer.JMOL.name());
     structViewer.addItem(Viewer.CHIMERA.name());
+    structViewer.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        structureViewer_actionPerformed((String) structViewer
+                .getSelectedItem());
+      }
+    });
     structureTab.add(structViewer);
 
+    ypos += lineSpacing;
+    JLabel pathLabel = new JLabel();
+    pathLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
+    pathLabel.setHorizontalAlignment(SwingConstants.LEFT);
+    pathLabel.setText(MessageManager.getString("label.chimera_path"));
+    final String tooltip = JvSwingUtils.wrapTooltip(true,
+            MessageManager.getString("label.chimera_path_tip"));
+    pathLabel.setToolTipText(tooltip);
+    pathLabel.setBounds(new Rectangle(10, ypos, 140, height));
+    structureTab.add(pathLabel);
+
+    chimeraPath.setFont(verdana11);
+    chimeraPath.setText("");
+    chimeraPath.setBounds(new Rectangle(160, ypos, 300, height));
+    chimeraPath.addMouseListener(new MouseAdapter()
+    {
+      @Override
+      public void mouseClicked(MouseEvent e)
+      {
+        if (e.getClickCount() == 2)
+        {
+          String chosen = openFileChooser();
+          if (chosen != null)
+          {
+            chimeraPath.setText(chosen);
+          }
+        }
+      }
+    });
+    structureTab.add(chimeraPath);
+
     return structureTab;
   }
 
   /**
+   * Action on choosing a structure viewer from combobox options.
+   * 
+   * @param selectedItem
+   */
+  protected void structureViewer_actionPerformed(String selectedItem)
+  {
+  }
+
+  /**
+   * Show a dialog for the user to choose a file. Returns the chosen path, or
+   * null on Cancel.
+   * 
+   * @return
+   */
+  protected String openFileChooser()
+  {
+    String choice = null;
+    JFileChooser chooser = new JFileChooser();
+
+    // chooser.setFileView(new JalviewFileView());
+    chooser.setDialogTitle(MessageManager
+            .getString("label.open_local_file"));
+    chooser.setToolTipText(MessageManager.getString("action.open"));
+
+    int value = chooser.showOpenDialog(this);
+
+    if (value == JFileChooser.APPROVE_OPTION)
+    {
+      choice = chooser.getSelectedFile().getPath();
+    }
+    return choice;
+  }
+
+  /**
+   * Validate the structure tab preferences; if invalid, set focus on this tab.
+   * 
+   * @param e
+   */
+  protected boolean validateStructure(FocusEvent e)
+  {
+    if (!validateStructure())
+    {
+      e.getComponent().requestFocusInWindow();
+      return false;
+    }
+    return true;
+  }
+
+  protected boolean validateStructure()
+  {
+    return false;
+  }
+
+  /**
    * Initialises the Visual tabbed panel.
    * 
    * @return
@@ -912,9 +1041,9 @@ public class GPreferences extends JPanel
     fontLabel.setHorizontalAlignment(SwingConstants.RIGHT);
     fontLabel.setText(MessageManager.getString("label.font"));
     fontSizeCB.setFont(verdana11);
-    fontSizeCB.setBounds(new Rectangle(319, 104, 49, 23));
+    fontSizeCB.setBounds(new Rectangle(320, 104, 65, 23));
     fontStyleCB.setFont(verdana11);
-    fontStyleCB.setBounds(new Rectangle(367, 104, 70, 23));
+    fontStyleCB.setBounds(new Rectangle(382, 104, 80, 23));
     fontNameCB.setFont(verdana11);
     fontNameCB.setBounds(new Rectangle(172, 104, 147, 23));
     gapSymbolCB.setFont(verdana11);
@@ -948,13 +1077,13 @@ public class GPreferences extends JPanel
     sortLabel.setHorizontalAlignment(SwingConstants.RIGHT);
     sortLabel.setText(MessageManager.getString("label.sort_by"));
     sortAnnBy.setFont(verdana11);
-    sortAnnBy.setBounds(new Rectangle(172, 265, 120, 21));
+    sortAnnBy.setBounds(new Rectangle(172, 265, 110, 21));
     JLabel sortAnnLabel = new JLabel();
     sortAnnLabel.setFont(verdana11);
     sortAnnLabel.setHorizontalAlignment(SwingConstants.RIGHT);
     sortAnnLabel.setText(MessageManager.getString("label.sort_ann_by"));
     sortAutocalc.setFont(verdana11);
-    sortAutocalc.setBounds(new Rectangle(300, 265, 185, 21));
+    sortAutocalc.setBounds(new Rectangle(290, 265, 165, 21));
     JPanel annsettingsPanel = new JPanel();
     annsettingsPanel.setBounds(new Rectangle(173, 34, 300, 61));
     annsettingsPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));