diff --git a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java index aa5ac8292193ec968b1c8a09855e9b646a729f1d..bd01b611a6f869c34522bf11c77c8ec66bcd2d3e 100644 --- a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java +++ b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java @@ -1,10 +1,10 @@ /* TransferAnnotationTool.java * - * created: 2008 + * created: 2009 * * This file is part of Artemis * - * Copyright (C) 2008 Genome Research Limited + * Copyright (C) 2009 Genome Research Limited * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,6 +25,7 @@ package uk.ac.sanger.artemis.components; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; @@ -44,11 +45,13 @@ import java.util.Vector; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.JTextArea; import javax.swing.SwingConstants; import uk.ac.sanger.artemis.Entry; @@ -95,12 +98,21 @@ class TransferAnnotationTool extends JFrame "transmembrane", "previous_systematic_id" }; + private static org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getLogger(TransferAnnotationTool.class); + private Color STEEL_BLUE = new Color(25, 25, 112); + + /** + * Tool for transferring annotation from one feature to other feature(s) + * @param feature + * @param entryGroup + * @param geneNames + */ public TransferAnnotationTool(final Feature feature, - final EntryGroup entryGroup, - final List geneNames) + final EntryGroup entryGroup, + final List geneNames) { super("Transfer Annotation Tool :: " + feature.getIDString()); @@ -109,20 +121,49 @@ class TransferAnnotationTool extends JFrame JPanel panel = new JPanel(flow); JPanel pane = new JPanel(new GridBagLayout()); JScrollPane jsp = new JScrollPane(panel); - + panel.setBackground(Color.white); + pane.setBackground(Color.white); panel.add(pane); JPanel framePanel = (JPanel)getContentPane(); framePanel.add(jsp, BorderLayout.CENTER); framePanel.setPreferredSize(new Dimension(600,600)); + final Vector geneNameCheckBoxes = new Vector(); + final Hashtable qualifierCheckBoxes = new Hashtable(); + + addMainPanel(feature, pane, qualifierCheckBoxes, + geneNameCheckBoxes, geneNames); + addBottomButtons(qualifierCheckBoxes, geneNameCheckBoxes, + framePanel, feature, entryGroup); + + pack(); + setVisible(true); + } + + /** + * Construct the panel for setting up the gene list and the + * list of qualifiers to transfer. + * @param feature + * @param pane + * @param qualifierCheckBoxes + * @param geneNameCheckBoxes + * @param geneNames + */ + private void addMainPanel(final Feature feature, + final JPanel pane, + final Hashtable qualifierCheckBoxes, + final Vector geneNameCheckBoxes, + final List geneNames) + { GridBagConstraints c = new GridBagConstraints(); int nrows = 0; c.anchor = GridBagConstraints.NORTHWEST; c.gridx = 2; c.gridy = 0; - + c.ipadx = 0; + JLabel geneLabel = new JLabel(feature.getIDString() + " Qualifiers"); geneLabel.setFont(geneLabel.getFont().deriveFont(Font.BOLD)); pane.add(geneLabel, c); @@ -135,8 +176,7 @@ class TransferAnnotationTool extends JFrame c.gridy = ++nrows; c.gridy = ++nrows; c.anchor = GridBagConstraints.WEST; - - final Hashtable qualifierCheckBoxes = new Hashtable(); + final QualifierVector qualifiers = feature.getQualifiers(); for(int i = 0; i < qualifiers.size(); i++) { @@ -179,7 +219,6 @@ class TransferAnnotationTool extends JFrame c.gridheight = nrows; c.fill = GridBagConstraints.BOTH; - final Vector geneNameCheckBoxes = new Vector(); final Box geneNameBox = Box.createVerticalBox(); pane.add(geneNameBox, c); @@ -213,7 +252,7 @@ class TransferAnnotationTool extends JFrame }); pane.add(toggle, c); - + Box xBox = Box.createHorizontalBox(); final JButton toggleGeneList = new JButton("Toggle"); toggleGeneList.addActionListener(new ActionListener() { @@ -226,25 +265,76 @@ class TransferAnnotationTool extends JFrame } } }); - c.gridx = 0; - pane.add(toggleGeneList, c); + xBox.add(toggleGeneList); + final JButton addGenes = new JButton("Add"); + addGenes.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + JTextArea geneNameTextArea = new JTextArea(); + geneNameTextArea.setEditable(true); + JScrollPane jsp = new JScrollPane(geneNameTextArea); + + int res = JOptionPane.showConfirmDialog(TransferAnnotationTool.this, + jsp, "Paste Features to Add", + JOptionPane.OK_CANCEL_OPTION); + if(res == JOptionPane.CANCEL_OPTION) + return; + + String geneNames[] = geneNameTextArea.getText().split("\\s"); + for(int i=0;i<geneNames.length; i++) + { + if(geneNames[i] == null || geneNames[i].equals("")) + continue; + JCheckBox cb = new JCheckBox(geneNames[i],true); + geneNameBox.add(cb); + geneNameCheckBoxes.add(cb); + } + pane.revalidate(); + } + }); + xBox.add(addGenes); + c.gridx = 0; + pane.add(xBox, c); + } + + /** + * Add panel for the transfer and close button. + * @param qualifierCheckBoxes + * @param geneNameCheckBoxes + * @param framePanel + * @param feature + * @param entryGroup + */ + private void addBottomButtons(final Hashtable qualifierCheckBoxes, + final Vector geneNameCheckBoxes, + final JPanel framePanel, + final Feature feature, + final EntryGroup entryGroup) + { final JCheckBox sameKeyCheckBox = new JCheckBox("Add to feature of same key", true); + final JCheckBox overwriteCheckBox = new JCheckBox("Overwrite", false); + overwriteCheckBox.setToolTipText("overwrite rather than append values"); + Box buttonBox = Box.createHorizontalBox(); final JButton transfer = new JButton(">>TRANSFER"); + transfer.setToolTipText("transfer annotation"); transfer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { transferAnnotation(qualifierCheckBoxes, geneNameCheckBoxes, feature, - entryGroup, sameKeyCheckBox.isSelected()); + entryGroup, sameKeyCheckBox.isSelected(), + overwriteCheckBox.isSelected()); } }); Box yBox = Box.createVerticalBox(); yBox.add(transfer); yBox.add(sameKeyCheckBox); + yBox.add(overwriteCheckBox); buttonBox.add(yBox); final JButton close = new JButton("CLOSE"); @@ -261,49 +351,53 @@ class TransferAnnotationTool extends JFrame buttonBox.add(yBox); buttonBox.add(Box.createHorizontalGlue()); framePanel.add(buttonBox, BorderLayout.SOUTH); - - pack(); - setVisible(true); } - + + /** + * Set up the expander button to display qualifier values. + * @param butt - expander button + * @param qualifier - the qualifer that is being displayed + * @param qualifierValueBox - Box containing the values + * @param qualifierNameCheckBox - JCheckBox for the given qualifier + * @param pane + * @return + */ private Vector setExpanderButton(final JButton butt, final Qualifier qualifier, final Box qualifierValueBox, - final JCheckBox qualifierNameCheckBox, + final JCheckBox qualifierNameCheckBox, final JPanel pane) { - butt.setMargin(new Insets(0,0,0,0)); + butt.setMargin(new Insets(0, 0, 0, 0)); butt.setHorizontalAlignment(SwingConstants.RIGHT); + butt.setHorizontalTextPosition(SwingConstants.RIGHT); butt.setBorderPainted(false); - butt.setFont(new Font("SansSerif", Font.BOLD, 11)); - butt.setPreferredSize(new Dimension(butt.getPreferredSize().width,11)); + butt.setFont(butt.getFont().deriveFont(Font.BOLD)); + butt.setForeground(STEEL_BLUE); butt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - if(butt.getText().equals("+")) - { + if (butt.getText().equals("+")) butt.setText("-"); - qualifierValueBox.setVisible(true); - } else - { butt.setText("+"); - qualifierValueBox.setVisible(false); - } + + qualifierValueBox.setVisible(butt.getText().equals("-")); pane.revalidate(); } }); - + // set-up qualifier values list qualifierValueBox.setVisible(false); Vector qualifierValuesCheckBox = new Vector(); StringVector values = qualifier.getValues(); - for(int i=0; i<values.size(); i++) + for (int i = 0; i < values.size(); i++) { - JCheckBox cb = new JCheckBox((String)values.get(i), - qualifierNameCheckBox.isSelected()); + JCheckBox cb = new JCheckBox((String) values.get(i), + qualifierNameCheckBox.isSelected()); + cb.setFont(cb.getFont().deriveFont(Font.ITALIC)); qualifierValueBox.add(cb); qualifierValuesCheckBox.add(cb); } @@ -327,17 +421,20 @@ class TransferAnnotationTool extends JFrame /** * Transfer selected qualifiers to the list of features defined - * by the names in the JTextArea + * by the selected names. * @param qualifierCheckBoxes - list of qualifier check boxes * @param geneNameTextArea - text with a list of feature names to transfer to * @param feature - feature to copy from * @param entryGroup + * @param sameKey + * @param overwrite */ private void transferAnnotation(final Hashtable qualifierCheckBoxes, final Vector geneNameCheckBoxes, final Feature orginatingFeature, final EntryGroup entryGroup, - final boolean sameKey) + final boolean sameKey, + final boolean overwrite) { setCursor(new Cursor(Cursor.WAIT_CURSOR)); // transfer selected annotation to genes @@ -407,7 +504,8 @@ class TransferAnnotationTool extends JFrame // transfer selected annotation entryGroup.getActionController().startAction(); geneNames = transfer(features, qualifiersToTransfer, key, - sameKey, GeneUtils.isDatabaseEntry(entryGroup), geneNames); + sameKey, overwrite, + GeneUtils.isDatabaseEntry(entryGroup), geneNames); entryGroup.getActionController().endAction(); // @@ -453,7 +551,7 @@ class TransferAnnotationTool extends JFrame ctm.setEntryGroup(entry_group); transfer(entry.getAllFeatures(), qualifiersToTransfer, key, sameKey, - true, geneNames); + overwrite, true, geneNames); ChadoTransactionManager.commit((DatabaseDocument) newDbEntry .getDocument(), false, ctm); @@ -484,7 +582,8 @@ class TransferAnnotationTool extends JFrame private String[] transfer(final FeatureVector features, final QualifierVector qualifiersToTransfer, final String key, - final boolean sameKey, + final boolean sameKey, + final boolean overwrite, final boolean isDatabaseEntry, String[] geneNames) { @@ -502,18 +601,23 @@ class TransferAnnotationTool extends JFrame try { - final StringVector oldValues; - if(thisFeature.getQualifierByName(newQualifier.getName()) == null) - oldValues = null; - else - oldValues = - thisFeature.getQualifierByName(newQualifier.getName()).getValues(); - - final Qualifier newQualifierTmp = - getQualifierWithoutDuplicateValues(newQualifier, oldValues); - if(newQualifierTmp == null) - continue; - thisFeature.addQualifierValues(newQualifierTmp); + if(overwrite) + thisFeature.setQualifier(newQualifier); + else + { + final StringVector oldValues; + if (thisFeature.getQualifierByName(newQualifier.getName()) == null) + oldValues = null; + else + oldValues = thisFeature.getQualifierByName( + newQualifier.getName()).getValues(); + + final Qualifier newQualifierTmp = getQualifierWithoutDuplicateValues( + newQualifier, oldValues); + if (newQualifierTmp == null) + continue; + thisFeature.addQualifierValues(newQualifierTmp); + } } catch (Exception e1) { @@ -647,4 +751,5 @@ class TransferAnnotationTool extends JFrame return geneName; } } + }