diff --git a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java index fdde6c8b6259b9419efcbf214d7162bc035a845e..aa5ac8292193ec968b1c8a09855e9b646a729f1d 100644 --- a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java +++ b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java @@ -24,22 +24,32 @@ package uk.ac.sanger.artemis.components; +import java.awt.BorderLayout; import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.Enumeration; +import java.util.Hashtable; import java.util.List; import java.util.Vector; +import javax.swing.Box; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; -import javax.swing.JTextArea; +import javax.swing.JScrollPane; +import javax.swing.SwingConstants; import uk.ac.sanger.artemis.Entry; import uk.ac.sanger.artemis.EntryGroup; @@ -72,6 +82,7 @@ class TransferAnnotationTool extends JFrame "isObsolete", "timelastmodified", "cytoplasm_location", + "membrane_structure", "non_cytoplasm_location", "orthologous_to", "paralogous_to", @@ -84,6 +95,8 @@ class TransferAnnotationTool extends JFrame "transmembrane", "previous_systematic_id" }; + private static org.apache.log4j.Logger logger4j = + org.apache.log4j.Logger.getLogger(TransferAnnotationTool.class); public TransferAnnotationTool(final Feature feature, final EntryGroup entryGroup, @@ -92,27 +105,38 @@ class TransferAnnotationTool extends JFrame super("Transfer Annotation Tool :: " + feature.getIDString()); - JPanel pane = (JPanel) getContentPane(); - pane.setLayout(new GridBagLayout()); + FlowLayout flow = new FlowLayout(FlowLayout.LEFT); + JPanel panel = new JPanel(flow); + JPanel pane = new JPanel(new GridBagLayout()); + JScrollPane jsp = new JScrollPane(panel); + + panel.add(pane); + + JPanel framePanel = (JPanel)getContentPane(); + framePanel.add(jsp, BorderLayout.CENTER); + framePanel.setPreferredSize(new Dimension(600,600)); + GridBagConstraints c = new GridBagConstraints(); int nrows = 0; - c.gridx = 0; + c.anchor = GridBagConstraints.NORTHWEST; + c.gridx = 2; c.gridy = 0; + JLabel geneLabel = new JLabel(feature.getIDString() + " Qualifiers"); geneLabel.setFont(geneLabel.getFont().deriveFont(Font.BOLD)); pane.add(geneLabel, c); - c.gridx = 1; + c.gridx = 0; JLabel label = new JLabel("Gene List"); label.setFont(label.getFont().deriveFont(Font.BOLD)); pane.add(label, c); - c.gridx = 0; + c.gridy = ++nrows; c.gridy = ++nrows; c.anchor = GridBagConstraints.WEST; - final Vector qualifierCheckBoxes = new Vector(); + final Hashtable qualifierCheckBoxes = new Hashtable(); final QualifierVector qualifiers = feature.getQualifiers(); for(int i = 0; i < qualifiers.size(); i++) { @@ -121,66 +145,108 @@ class TransferAnnotationTool extends JFrame if(isNonTransferable(qualifier.getName())) continue; - JCheckBox checkBox = new JCheckBox(qualifier.getName(), false); - pane.add(checkBox, c); - qualifierCheckBoxes.add(checkBox); + final JCheckBox qualifierNameCheckBox = new JCheckBox(qualifier.getName(), false); + c.gridx = 1; + Box qualifierValueBox = Box.createVerticalBox(); + + JButton detailsShowHide = new JButton("+"); + final Vector qualifierValuesCheckBox = setExpanderButton(detailsShowHide, + qualifier, qualifierValueBox, qualifierNameCheckBox, pane); + + qualifierNameCheckBox.addItemListener(new ItemListener() + { + public void itemStateChanged(ItemEvent e) + { + for(int i=0; i<qualifierValuesCheckBox.size(); i++) + { + JCheckBox cb = (JCheckBox) qualifierValuesCheckBox.get(i); + cb.setSelected(qualifierNameCheckBox.isSelected()); + } + } + }); + pane.add(detailsShowHide, c); + c.gridx = 2; + + pane.add(qualifierNameCheckBox, c); + qualifierCheckBoxes.put(qualifierNameCheckBox, qualifierValuesCheckBox); + c.gridy = ++nrows; + pane.add(qualifierValueBox, c); c.gridy = ++nrows; } - - c.gridx = 1; - c.gridy = 1; + c.gridx = 0; + c.gridy = 2; c.gridheight = nrows; c.fill = GridBagConstraints.BOTH; - final JTextArea geneNameTextArea = new JTextArea("gene1"); - geneNameTextArea.setEditable(true); - pane.add(geneNameTextArea, c); + + final Vector geneNameCheckBoxes = new Vector(); + final Box geneNameBox = Box.createVerticalBox(); + pane.add(geneNameBox, c); + if(geneNames != null) { - geneNameTextArea.setText(""); - for(int i=0;i<geneNames.size(); i++) - { - geneNameTextArea.append((String) geneNames.get(i)+"\n"); - } + for(int i = 0; i < geneNames.size(); i++) + { + JCheckBox cb = new JCheckBox((String) geneNames.get(i),true); + geneNameBox.add(cb); + geneNameCheckBoxes.add(cb); + } } - c.gridy = ++nrows; + c.gridy = 1; c.gridheight = 1; c.fill = GridBagConstraints.NONE; - c.gridx = 0; - final JButton toggle = new JButton("Toggle Selection"); + c.gridx = 2; + final JButton toggle = new JButton("Toggle"); toggle.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - for(int i = 0; i < qualifierCheckBoxes.size(); i++) + Enumeration enumQualifiers = qualifierCheckBoxes.keys(); + while(enumQualifiers.hasMoreElements()) { - JCheckBox cb = (JCheckBox) qualifierCheckBoxes.get(i); + JCheckBox cb = (JCheckBox) enumQualifiers.nextElement(); cb.setSelected(!cb.isSelected()); } } }); pane.add(toggle, c); + + + final JButton toggleGeneList = new JButton("Toggle"); + toggleGeneList.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + for(int i = 0; i < geneNameCheckBoxes.size(); i++) + { + JCheckBox cb = (JCheckBox) geneNameCheckBoxes.get(i); + cb.setSelected(!cb.isSelected()); + } + } + }); + c.gridx = 0; + pane.add(toggleGeneList, c); + final JCheckBox sameKeyCheckBox = new JCheckBox("Add to feature of same key", true); - + + Box buttonBox = Box.createHorizontalBox(); final JButton transfer = new JButton(">>TRANSFER"); transfer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - transferAnnotation(qualifierCheckBoxes, geneNameTextArea, feature, + transferAnnotation(qualifierCheckBoxes, geneNameCheckBoxes, feature, entryGroup, sameKeyCheckBox.isSelected()); } }); - c.gridx = 1; - pane.add(transfer, c); + Box yBox = Box.createVerticalBox(); + yBox.add(transfer); + yBox.add(sameKeyCheckBox); + buttonBox.add(yBox); - c.gridy = ++nrows; - c.gridx = 1; - pane.add(sameKeyCheckBox, c); - final JButton close = new JButton("CLOSE"); close.addActionListener(new ActionListener() { @@ -189,12 +255,61 @@ class TransferAnnotationTool extends JFrame dispose(); } }); - c.gridy = ++nrows; - pane.add(close, c); + yBox = Box.createVerticalBox(); + yBox.add(close); + yBox.add(Box.createVerticalGlue()); + buttonBox.add(yBox); + buttonBox.add(Box.createHorizontalGlue()); + framePanel.add(buttonBox, BorderLayout.SOUTH); + pack(); setVisible(true); } + private Vector setExpanderButton(final JButton butt, + final Qualifier qualifier, + final Box qualifierValueBox, + final JCheckBox qualifierNameCheckBox, + final JPanel pane) + { + butt.setMargin(new Insets(0,0,0,0)); + butt.setHorizontalAlignment(SwingConstants.RIGHT); + butt.setBorderPainted(false); + butt.setFont(new Font("SansSerif", Font.BOLD, 11)); + butt.setPreferredSize(new Dimension(butt.getPreferredSize().width,11)); + + butt.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + if(butt.getText().equals("+")) + { + butt.setText("-"); + qualifierValueBox.setVisible(true); + } + else + { + butt.setText("+"); + qualifierValueBox.setVisible(false); + } + 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++) + { + JCheckBox cb = new JCheckBox((String)values.get(i), + qualifierNameCheckBox.isSelected()); + qualifierValueBox.add(cb); + qualifierValuesCheckBox.add(cb); + } + return qualifierValuesCheckBox; + } + /** * Returns true if this qualifier is non-transferable * @param qualifierName @@ -218,27 +333,73 @@ class TransferAnnotationTool extends JFrame * @param feature - feature to copy from * @param entryGroup */ - private void transferAnnotation(final Vector qualifierCheckBoxes, - final JTextArea geneNameTextArea, - final Feature orginatingFeature, - final EntryGroup entryGroup, - final boolean sameKey) + private void transferAnnotation(final Hashtable qualifierCheckBoxes, + final Vector geneNameCheckBoxes, + final Feature orginatingFeature, + final EntryGroup entryGroup, + final boolean sameKey) { setCursor(new Cursor(Cursor.WAIT_CURSOR)); // transfer selected annotation to genes - final QualifierVector qualifiers = orginatingFeature.getQualifiers(); - final QualifierVector qualifiersToTransfer = new QualifierVector(); - for(int i = 0; i < qualifierCheckBoxes.size(); i++) + final QualifierVector qualifiers = orginatingFeature.getQualifiers(); + final QualifierVector qualifiersToTransfer = new QualifierVector(); + + Enumeration enumQualifiers = qualifierCheckBoxes.keys(); + while(enumQualifiers.hasMoreElements()) { - JCheckBox cb = (JCheckBox) qualifierCheckBoxes.get(i); - if(cb.isSelected()) - { - qualifiersToTransfer.addElement( - qualifiers.getQualifierByName(cb.getText()).copy()); - } + JCheckBox cb = (JCheckBox) enumQualifiers.nextElement(); + if (cb.isSelected()) + { + Vector qualifierValuesCheckBox = (Vector)qualifierCheckBoxes.get(cb); + StringVector values = qualifiers.getQualifierByName(cb.getText()).getValues(); + StringVector valuesToTransfer = new StringVector(values); + + logger4j.debug("TRANSFER "+cb.getText()); + for(int i=0; i<qualifierValuesCheckBox.size(); i++) + { + JCheckBox valuesCb = (JCheckBox) qualifierValuesCheckBox.get(i); + if(!valuesCb.isSelected()) + { + valuesToTransfer.remove(valuesCb.getText()); + logger4j.debug("NOT TRANSFERING "+valuesCb.getText()); + } + } + + if(valuesToTransfer.size() < 1) + continue; + qualifiersToTransfer.addElement(new Qualifier(cb.getText(), valuesToTransfer)); + } } + + int count = 0; + for(int i =0; i<geneNameCheckBoxes.size(); i++) + { + if( ((JCheckBox)geneNameCheckBoxes.get(i)).isSelected() ) + count++; + } + + if(count < 1) + { + setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + JOptionPane.showMessageDialog(this, + "No genes selected.", + "Warning", JOptionPane.WARNING_MESSAGE); + return; + } - String geneNames[] = geneNameTextArea.getText().split("\\s"); + String geneNames[] = new String[count]; + count = 0; + for(int i =0; i<geneNameCheckBoxes.size(); i++) + { + JCheckBox cb = (JCheckBox)geneNameCheckBoxes.get(i); + if( cb.isSelected() ) + { + geneNames[count] = cb.getText(); + logger4j.debug("TRANSFER ANNOTATION TO "+geneNames[count]); + count++; + } + } + //geneNameTextArea.getText().split("\\s"); final String key = orginatingFeature.getKey().getKeyString(); final FeatureVector features = entryGroup.getAllFeatures(); @@ -257,20 +418,20 @@ class TransferAnnotationTool extends JFrame DatabaseDocument doc = (DatabaseDocument) db_entry.getDocument(); Vector genesNotFound = null; - for(int i=0; i<geneNames.length; i++) - { - DatabaseDocumentEntry newDbEntry = - GeneEdit.makeGeneEntry(null, geneNames[i], doc, null); - - if(newDbEntry == null) - { - if(genesNotFound == null) - genesNotFound = new Vector(); - genesNotFound.add(geneNames[i]); - continue; - } - - char[] c = new char[1]; + for (int i = 0; i < geneNames.length; i++) + { + DatabaseDocumentEntry newDbEntry = GeneEdit.makeGeneEntry(null, + geneNames[i], doc, null); + + if (newDbEntry == null) + { + if (genesNotFound == null) + genesNotFound = new Vector(); + genesNotFound.add(geneNames[i]); + continue; + } + + char[] c = new char[1]; PartialSequence ps = new PartialSequence(c, 100, 0, null, null); newDbEntry.setPartialSequence(ps); Entry entry = null; @@ -278,26 +439,29 @@ class TransferAnnotationTool extends JFrame { entry = new Entry(newDbEntry); } - catch(Exception e) { e.printStackTrace(); } - + catch (Exception e) + { + e.printStackTrace(); + } + SimpleEntryGroup entry_group = new SimpleEntryGroup(); entry_group.addElement(entry); - + ChadoTransactionManager ctm = new ChadoTransactionManager(); entry_group.addFeatureChangeListener(ctm); entry_group.addEntryChangeListener(ctm); ctm.setEntryGroup(entry_group); - - transfer(entry.getAllFeatures(), qualifiersToTransfer, key, - sameKey, true, geneNames); - ChadoTransactionManager.commit( - (DatabaseDocument)newDbEntry.getDocument(), false, ctm); - - entry_group.removeFeatureChangeListener(ctm); - entry_group.removeEntryChangeListener(ctm); - //if(newDbEntry != null) - // GeneEdit.showGeneEditor(null, geneNames[i], newDbEntry); - } + + transfer(entry.getAllFeatures(), qualifiersToTransfer, key, sameKey, + true, geneNames); + ChadoTransactionManager.commit((DatabaseDocument) newDbEntry + .getDocument(), false, ctm); + + entry_group.removeFeatureChangeListener(ctm); + entry_group.removeEntryChangeListener(ctm); + // if(newDbEntry != null) + // GeneEdit.showGeneEditor(null, geneNames[i], newDbEntry); + } setCursor(new Cursor(Cursor.DEFAULT_CURSOR));