fixed redundancy Undo and allowed it to work on UNALIGNED SEQUENCES
[jalview.git] / src / jalview / gui / RedundancyPanel.java
1 package jalview.gui;\r
2 \r
3 import jalview.jbgui.*;\r
4 import jalview.datamodel.*;\r
5 import java.awt.event.*;\r
6 import java.util.*;\r
7 import javax.swing.event.*;\r
8 \r
9 public class RedundancyPanel\r
10     extends GSliderPanel\r
11 {\r
12   AlignFrame af;\r
13   AlignmentPanel ap;\r
14   Stack historyList = new Stack(); // simpler than synching with alignFrame.\r
15 \r
16   public RedundancyPanel(AlignmentPanel ap, AlignFrame af)\r
17   {\r
18     this.ap = ap;\r
19     this.af = af;\r
20     label.setText("Enter the redundancy threshold");\r
21 \r
22     slider.addChangeListener(new ChangeListener()\r
23     {\r
24       public void stateChanged(ChangeEvent evt)\r
25       {\r
26         valueField.setText(slider.getValue() + "");\r
27       }\r
28     });\r
29 \r
30     slider.setMinimum(0);\r
31     slider.setMaximum(100);\r
32     slider.setValue(100);\r
33 \r
34   }\r
35 \r
36   public void applyButton_actionPerformed(ActionEvent e)\r
37   {\r
38     float threshold = slider.getValue();\r
39     Vector del;\r
40     historyList.push(new HistoryItem("Remove redundancy (" + threshold + "%)",\r
41                                       ap.av.alignment, HistoryItem.HIDE));\r
42 \r
43     undoButton.setEnabled(true);\r
44     SequenceGroup sg = ap.av.getSelectionGroup();\r
45     if (sg != null && sg.getSize() >= 1)\r
46     {\r
47 \r
48       del = ap.av.alignment.removeRedundancy(threshold, sg.sequences);\r
49       for (int i = 0; i < del.size(); i++)\r
50       {\r
51         if (sg.sequences.contains( (SequenceI) del.elementAt(i)))\r
52         {\r
53           sg.deleteSequence( (SequenceI) del.elementAt(i));\r
54         }\r
55       }\r
56 \r
57     }\r
58     else\r
59     {\r
60       Vector s = new Vector();\r
61       int i = 0;\r
62       while (i < ap.av.alignment.getHeight())\r
63       {\r
64         s.addElement(ap.av.alignment.getSequenceAt(i));\r
65         i++;\r
66       }\r
67       del = ap.av.alignment.removeRedundancy(threshold, s);\r
68     }\r
69 \r
70     // This has to be done before the restoreHistoryItem method of alignFrame will\r
71     // actually restore these sequences.\r
72 \r
73     if (del.size()>0)\r
74       for (int i=0,j=del.size(); i<j; i++) {\r
75         SequenceI sq = (SequenceI) del.elementAt(i);\r
76         sq.deleteChars(0,sq.getLength());\r
77       }\r
78 \r
79     ap.av.firePropertyChange("alignment", null,\r
80                              ap.av.getAlignment().getSequences());\r
81     ap.av.resetSeqLimits(ap.seqPanel.seqCanvas.getHeight());\r
82     if (ap.av.getAlignment().getHeight() < 1)\r
83     {\r
84       try\r
85       {\r
86         af.setClosed(true);\r
87       }\r
88       catch (Exception ex)\r
89       {}\r
90     }\r
91     ap.av.updateConservation();\r
92     ap.av.updateConsensus();\r
93     af.updateEditMenuBar();\r
94     ap.repaint();\r
95 \r
96   }\r
97 \r
98   public void undoButton_actionPerformed(ActionEvent e)\r
99   {\r
100     HistoryItem hi = (HistoryItem)historyList.pop();\r
101     af.restoreHistoryItem(hi);\r
102     if (historyList.size()==0)\r
103       undoButton.setEnabled(false);\r
104   }\r
105 \r
106   public void valueField_actionPerformed(ActionEvent e)\r
107   {\r
108     try\r
109     {\r
110       int i = Integer.parseInt(valueField.getText());\r
111       slider.setValue(i);\r
112     }\r
113     catch (Exception ex)\r
114     {\r
115       valueField.setText(slider.getValue() + "");\r
116     }\r
117   }\r
118 }\r