diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneComponentTree.java b/uk/ac/sanger/artemis/components/genebuilder/GeneComponentTree.java
index 9036142a651ed43083fe393189a920818f10f4ac..ab2d1eca880dff48ec3a7585a7c07c6a53bc2834 100644
--- a/uk/ac/sanger/artemis/components/genebuilder/GeneComponentTree.java
+++ b/uk/ac/sanger/artemis/components/genebuilder/GeneComponentTree.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/genebuilder/GeneComponentTree.java,v 1.18 2007-05-01 09:36:42 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/genebuilder/GeneComponentTree.java,v 1.19 2007-05-03 12:57:01 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components.genebuilder;
@@ -351,7 +351,11 @@ public class GeneComponentTree extends JTree
       if(feature == null)
         feature = new uk.ac.sanger.artemis.Feature(embl_feature);    
       
-      gene_builder.setActiveFeature(feature, true);
+      boolean isSet = true;
+      if(feature.isReadOnly())
+        isSet = false;
+      
+      gene_builder.setActiveFeature(feature, isSet);
       if(selection != null)
         selection.set(feature);
     }
diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneViewerPanel.java b/uk/ac/sanger/artemis/components/genebuilder/GeneViewerPanel.java
index 5ebfb1cfbad2ba8e79e34c5ecc9bc7de7771cd0e..dd0279de54d82116b26df21fcdf88adf52bd9bd7 100644
--- a/uk/ac/sanger/artemis/components/genebuilder/GeneViewerPanel.java
+++ b/uk/ac/sanger/artemis/components/genebuilder/GeneViewerPanel.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/genebuilder/GeneViewerPanel.java,v 1.50 2007-05-01 15:02:18 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/genebuilder/GeneViewerPanel.java,v 1.51 2007-05-03 12:57:01 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components.genebuilder;
@@ -1654,8 +1654,13 @@ public class GeneViewerPanel extends JPanel
           {
             selection.set(
                 (uk.ac.sanger.artemis.Feature)((Feature)feature).getUserData());
+            
+            boolean isSet = true;
+            if(((Feature)feature).isReadOnly())
+              isSet = false;
+            
             gene_builder.setActiveFeature(
-                (uk.ac.sanger.artemis.Feature)((Feature)feature).getUserData(), true);
+                (uk.ac.sanger.artemis.Feature)((Feature)feature).getUserData(), isSet);
           }
           else
           {
diff --git a/uk/ac/sanger/artemis/components/genebuilder/cv/CVPanel.java b/uk/ac/sanger/artemis/components/genebuilder/cv/CVPanel.java
index 02b0fddb87d4c7470037706d7b88d6f3b4305f3c..f3d11fe57d454fc7387dc8c1da4b3a3b26d33690 100644
--- a/uk/ac/sanger/artemis/components/genebuilder/cv/CVPanel.java
+++ b/uk/ac/sanger/artemis/components/genebuilder/cv/CVPanel.java
@@ -77,6 +77,10 @@ public class CVPanel extends JPanel
   
   private JExtendedComboBox evidenceList;
   
+  private JButton hide_show_CC;
+  private JButton hide_show_GO;
+  
+  
   public CVPanel(final Feature feature)
   {
     super(new BorderLayout());
@@ -141,6 +145,21 @@ public class CVPanel extends JPanel
 
       if(this_qualifier.getName().equals("GO"))
       {
+        final Box yBox = Box.createVerticalBox();
+        if(hide_show_GO == null)
+          hide_show_GO = new JButton("-");
+        
+        addHideShowButton(yBox, hide_show_GO);
+        
+        Box xLabel = Box.createHorizontalBox();
+        JLabel lab = new JLabel("GO terms");
+        lab.setFont(lab.getFont().deriveFont(Font.BOLD));
+        xLabel.add(lab);
+        xLabel.add(Box.createHorizontalGlue());
+        xLabel.add(hide_show_GO);
+
+        cvBox.add(xLabel);
+        
         n++;
         final StringVector qualifier_strings = this_qualifier.getValues();
         
@@ -161,8 +180,11 @@ public class CVPanel extends JPanel
           xBox.add(Box.createHorizontalGlue());
           xBox.add(getRemoveButton(this_qualifier, v_index));
           
-          cvBox.add(xBox);
+          yBox.add(xBox);
         }
+        cvBox.add(yBox);
+        if(hide_show_GO.getText().equals("+"))
+          yBox.setVisible(false);
       }
     }
     
@@ -179,7 +201,21 @@ public class CVPanel extends JPanel
       if(this_qualifier.getName().equals("controlled_curation"))
       {
         final StringVector qualifier_strings = this_qualifier.getValues();
-    
+        
+        final Box yBox = Box.createVerticalBox();
+        if(hide_show_CC == null)
+          hide_show_CC = new JButton("-");
+        
+        addHideShowButton(yBox, hide_show_CC);
+        
+        Box xLabel = Box.createHorizontalBox();
+        JLabel lab = new JLabel("Controlled Curation");
+        lab.setFont(lab.getFont().deriveFont(Font.BOLD));
+        xLabel.add(lab);
+        xLabel.add(Box.createHorizontalGlue());
+        xLabel.add(hide_show_CC);
+        cvBox.add(xLabel);
+        
         for(int value_index = 0; value_index < qualifier_strings.size();
             ++value_index)
         {
@@ -192,14 +228,17 @@ public class CVPanel extends JPanel
           
           ControlledCurationBox ccBox = new ControlledCurationBox(this_qualifier,
                   qualifierString, value_index, 
-                  dimension4, go_dimension);
+                  dimension, go_dimension);
           editableComponents.add(ccBox);
           
           xBox = ccBox.getBox();
           xBox.add(Box.createHorizontalGlue());
           xBox.add(getRemoveButton(this_qualifier, v_index));         
-          cvBox.add(xBox);         
+          yBox.add(xBox);
         }
+        cvBox.add(yBox); 
+        if(hide_show_CC.getText().equals("+"))
+          yBox.setVisible(false);
       }
     }
     
@@ -306,6 +345,42 @@ public class CVPanel extends JPanel
     return cvBox;
   }
 
+  /**
+   * Add hide/show button to CV section
+   * @param box
+   */
+  private void addHideShowButton(final Box box, final JButton hide_show)
+  {
+    hide_show.setOpaque(false);
+    
+    // remove any old listeners
+    ActionListener l[] = hide_show.getActionListeners();
+    if(l != null)
+      for(int i=0;i<l.length;i++)
+        hide_show.removeActionListener(l[i]);
+    
+    hide_show.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        if(hide_show.getText().equals("-"))
+        {
+          hide_show.setText("+");
+          box.setVisible(false);
+        }
+        else
+        {
+          hide_show.setText("-");
+          box.setVisible(true);
+        }
+      }
+    });
+  }
+  
+  /**
+   * Separator between CV's
+   * @param cvBox
+   */
   private void addSeparator(final Box cvBox)
   {
     JSeparator separator = new JSeparator();
diff --git a/uk/ac/sanger/artemis/components/genebuilder/cv/ControlledCurationBox.java b/uk/ac/sanger/artemis/components/genebuilder/cv/ControlledCurationBox.java
index a7e292efc68e4ea0b1f856e4d7d05a6a53956638..2fdc9ec40f28cca2179d2130e124ba5227f9a5e3 100644
--- a/uk/ac/sanger/artemis/components/genebuilder/cv/ControlledCurationBox.java
+++ b/uk/ac/sanger/artemis/components/genebuilder/cv/ControlledCurationBox.java
@@ -27,10 +27,10 @@ package uk.ac.sanger.artemis.components.genebuilder.cv;
 import java.awt.Dimension;
 
 import javax.swing.Box;
-import javax.swing.JLabel;
 import javax.swing.JTextField;
 
 import uk.ac.sanger.artemis.components.Splash;
+import uk.ac.sanger.artemis.components.genebuilder.JExtendedComboBox;
 import uk.ac.sanger.artemis.io.Qualifier;
 import uk.ac.sanger.artemis.io.QualifierVector;
 import uk.ac.sanger.artemis.util.StringVector;
@@ -40,6 +40,9 @@ class ControlledCurationBox extends AbstractCvBox
   private Box xBox;
   private int value_index;
   private JTextField termTextField;
+  private JTextField dbxrefTextField;
+  private JExtendedComboBox evidenceList;
+  private JTextField qualfTextField;
   private DatePanel dateField;
   private String origQualifierString;
   private Qualifier origQualifier;
@@ -55,23 +58,66 @@ class ControlledCurationBox extends AbstractCvBox
     this.value_index  = value_index;
     this.xBox = Box.createHorizontalBox();
     
-    JLabel cclabel = new JLabel("controlled_curation");
-    if(go_dimension != null)
-      cclabel.setPreferredSize(go_dimension);
+    //JLabel cclabel = new JLabel("controlled_curation");
+    //if(go_dimension != null)
+    //  cclabel.setPreferredSize(go_dimension);
       
-    xBox.add(cclabel);
+    //xBox.add(cclabel);
     
     String term = getField("term=", qualifierString);
     termTextField = new JTextField(term);
     termTextField.setOpaque(false);
     termTextField.setEditable(false);
     termTextField.setToolTipText("term column");
-    termTextField.setPreferredSize(dimension);
-    termTextField.setMaximumSize(dimension);
+    
+    if(go_dimension != null)
+    {
+      final Dimension d = new Dimension(go_dimension.width+dimension.width,
+                                        dimension.height);
+      termTextField.setPreferredSize(d);
+      termTextField.setMaximumSize(d);
+    }
+    else
+    {
+      termTextField.setPreferredSize(dimension);
+      termTextField.setMaximumSize(dimension);
+    }
     termTextField.setCaretPosition(0);
     xBox.add(termTextField);
     
 
+    String dbxref = getField("db_xref=", qualifierString);
+    dbxrefTextField = new JTextField(dbxref);
+    dbxrefTextField.setToolTipText("dbxref column");
+    dbxrefTextField.setPreferredSize(dimension);
+    dbxrefTextField.setMaximumSize(dimension);
+    dbxrefTextField.setActionCommand("db_xref=");
+    xBox.add(dbxrefTextField);
+ 
+    // feature_cvterm_prop's
+    String evidence = getField("evidence=", qualifierString);
+    
+    evidenceList = new JExtendedComboBox(GoBox.evidenceCodes[1]);
+    evidenceList.setOpaque(false);
+    evidenceList.setToolTipText("evidence column");
+    evidenceList.setSelectedIndex( GoBox.getEvidenceIndex(evidence) );
+  
+    Dimension d = evidenceList.getPreferredSize();
+    d = new Dimension(80,(int)d.getHeight());
+    evidenceList.setPreferredSize(d);
+    evidenceList.setMaximumSize(d);
+    evidenceList.setActionCommand("evidence=");
+    xBox.add(evidenceList);
+    
+    String qual = getField("qualifier=", qualifierString);
+    qualfTextField = new JTextField(qual);      
+    qualfTextField.setToolTipText("qualifier column");
+    qualfTextField.setPreferredSize(dimension);
+    qualfTextField.setMaximumSize(dimension);
+    qualfTextField.setActionCommand("qualifier=");
+    xBox.add(qualfTextField);
+    
+
     dateField = new DatePanel(getField("date=", qualifierString),
                               dimension.height);
 
@@ -82,9 +128,23 @@ class ControlledCurationBox extends AbstractCvBox
   
   protected boolean isQualifierChanged()
   {
-    String old = getField("date=", origQualifierString);
+    String old = getField("db_xref=", origQualifierString);
+    if(!old.equals(dbxrefTextField.getText().trim()))
+      return true;
+    
+    old = getField("evidence=", origQualifierString);
+    if(!(old.equals("") && evidenceList.getSelectedIndex() == -1) )
+      if(!old.equals(GoBox.evidenceCodes[2][ evidenceList.getSelectedIndex() ]))
+        return true;
+    
+    old = getField("qualifier=", origQualifierString);
+    if(!old.equals(qualfTextField.getText()))
+      return true;
+    
+    old = getField("date=", origQualifierString);
     if(!old.equals(dateField.getText()))
       return true;
+    
     return false;
   }
 
@@ -116,6 +176,28 @@ class ControlledCurationBox extends AbstractCvBox
                                        newQualifierString);
     }
     
+    old = getField("db_xref=", origQualifierString);
+    if(!old.equals(dbxrefTextField.getText().trim()))
+    {    
+      newQualifierString = changeField("db_xref=", dbxrefTextField.getText().trim(), 
+                                       newQualifierString);
+    }
+    
+    old = getField("evidence=", origQualifierString);
+    if(evidenceList.getSelectedIndex() > -1 &&
+       !old.equals(GoBox.evidenceCodes[2][ evidenceList.getSelectedIndex() ]))
+    {
+      newQualifierString = changeField("evidence=", GoBox.evidenceCodes[2][ evidenceList.getSelectedIndex() ], 
+                                       newQualifierString);
+    }
+    
+    old = getField("qualifier=", origQualifierString);
+    if(!old.equals(qualfTextField.getText()))
+    {
+      newQualifierString = changeField("qualifier=", qualfTextField.getText().trim(), 
+                                       newQualifierString);
+    }
+    
     return newQualifierString;
   }
   
diff --git a/uk/ac/sanger/artemis/components/genebuilder/cv/GoBox.java b/uk/ac/sanger/artemis/components/genebuilder/cv/GoBox.java
index 35dd50d43084a1275ecb632320d936c3a1441f5b..6453a0d2dd40803f5def317c62d5041c708d9fb2 100644
--- a/uk/ac/sanger/artemis/components/genebuilder/cv/GoBox.java
+++ b/uk/ac/sanger/artemis/components/genebuilder/cv/GoBox.java
@@ -198,13 +198,21 @@ class GoBox extends AbstractCvBox
     xBox.add(dateField.getDateSpinner());
   }
   
-  private int getEvidenceIndex(String evidence)
+  protected static int getEvidenceIndex(String evidence)
   {
     for(int i=0; i<evidenceCodes[2].length; i++)
     {
-      if(evidenceCodes[2][i].equals(evidence))
+      if(evidenceCodes[2][i].equalsIgnoreCase(evidence))
         return i;
     }
+    
+    // this is mainly to catch RCA
+    // - reviewed computational analysis (inferred from missing)
+    /*for(int i=0; i<evidenceCodes[2].length; i++)
+    {
+      if(evidenceCodes[2][i].indexOf(evidence) > -1)
+        return i;
+    }*/
     return -1;
   }
   
@@ -229,7 +237,7 @@ class GoBox extends AbstractCvBox
       return true;
     
     old = getField("evidence=", origQualifierString);
-    if(!old.equals(evidenceCodes[2][ evidenceList.getSelectedIndex() ]))
+    if(!old.equalsIgnoreCase(evidenceCodes[2][ evidenceList.getSelectedIndex() ]))
       return true;
     
     old = getField("qualifier=", origQualifierString);