GPL license added
[jalview.git] / src / jalview / gui / RedundancyPanel.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4 *\r
5 * This program is free software; you can redistribute it and/or\r
6 * modify it under the terms of the GNU General Public License\r
7 * as published by the Free Software Foundation; either version 2\r
8 * of the License, or (at your option) any later version.\r
9 *\r
10 * This program is distributed in the hope that it will be useful,\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 * GNU General Public License for more details.\r
14 *\r
15 * You should have received a copy of the GNU General Public License\r
16 * along with this program; if not, write to the Free Software\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18 */\r
19 \r
20 package jalview.gui;\r
21 \r
22 import jalview.jbgui.*;\r
23 import jalview.datamodel.*;\r
24 import java.awt.event.*;\r
25 import java.util.*;\r
26 import javax.swing.event.*;\r
27 \r
28 public class RedundancyPanel\r
29     extends GSliderPanel\r
30 {\r
31   AlignFrame af;\r
32   AlignmentPanel ap;\r
33   Stack historyList = new Stack(); // simpler than synching with alignFrame.\r
34 \r
35   public RedundancyPanel(AlignmentPanel ap, AlignFrame af)\r
36   {\r
37     this.ap = ap;\r
38     this.af = af;\r
39     label.setText("Enter the redundancy threshold");\r
40 \r
41     slider.addChangeListener(new ChangeListener()\r
42     {\r
43       public void stateChanged(ChangeEvent evt)\r
44       {\r
45         valueField.setText(slider.getValue() + "");\r
46       }\r
47     });\r
48 \r
49     slider.setMinimum(0);\r
50     slider.setMaximum(100);\r
51     slider.setValue(100);\r
52 \r
53   }\r
54 \r
55   public void applyButton_actionPerformed(ActionEvent e)\r
56   {\r
57     float threshold = slider.getValue();\r
58     Vector del;\r
59     HistoryItem it;\r
60     historyList.push(it=new HistoryItem("Remove redundancy",\r
61                                       ap.av.alignment, HistoryItem.HIDE));\r
62     if (historyList.size()==1\r
63         || !af.historyList.contains(historyList.firstElement())) {\r
64       af.addHistoryItem((HistoryItem) historyList.firstElement());\r
65       af.updateEditMenuBar();\r
66     }\r
67     undoButton.setEnabled(true);\r
68     SequenceGroup sg = ap.av.getSelectionGroup();\r
69     if (sg != null && sg.getSize() >= 1)\r
70     {\r
71 \r
72       del = ap.av.alignment.removeRedundancy(threshold, sg.sequences);\r
73       for (int i = 0; i < del.size(); i++)\r
74       {\r
75         if (sg.sequences.contains( (SequenceI) del.elementAt(i)))\r
76         {\r
77           sg.deleteSequence( (SequenceI) del.elementAt(i));\r
78         }\r
79       }\r
80 \r
81     }\r
82     else\r
83     {\r
84       Vector s = new Vector();\r
85       int i = 0;\r
86       while (i < ap.av.alignment.getHeight())\r
87       {\r
88         s.addElement(ap.av.alignment.getSequenceAt(i));\r
89         i++;\r
90       }\r
91       del = ap.av.alignment.removeRedundancy(threshold, s);\r
92     }\r
93 \r
94     // This has to be done before the restoreHistoryItem method of alignFrame will\r
95     // actually restore these sequences.\r
96 \r
97     if (del.size()>0)\r
98       for (int i=0,j=del.size(); i<j; i++) {\r
99         SequenceI sq = (SequenceI) del.elementAt(i);\r
100         sq.deleteChars(0,sq.getLength());\r
101       }\r
102 \r
103     ap.av.firePropertyChange("alignment", null,\r
104                              ap.av.getAlignment().getSequences());\r
105     ap.av.resetSeqLimits(ap.seqPanel.seqCanvas.getHeight());\r
106     if (ap.av.getAlignment().getHeight() < 1)\r
107     {\r
108       try\r
109       {\r
110         af.setClosed(true);\r
111       }\r
112       catch (Exception ex)\r
113       {}\r
114     }\r
115     ap.av.updateConservation();\r
116     ap.av.updateConsensus();\r
117     af.updateEditMenuBar();\r
118     ap.repaint();\r
119 \r
120   }\r
121 \r
122   public void undoButton_actionPerformed(ActionEvent e)\r
123   {\r
124     HistoryItem hi = (HistoryItem) historyList.pop();\r
125     af.restoreHistoryItem(hi);\r
126     if (historyList.size() == 0)\r
127     {\r
128       undoButton.setEnabled(false);\r
129       if (af.historyList.contains(hi))\r
130       {\r
131         af.historyList.remove(hi);\r
132         af.updateEditMenuBar();\r
133       }\r
134     }\r
135   }\r
136   public void valueField_actionPerformed(ActionEvent e)\r
137   {\r
138     try\r
139     {\r
140       int i = Integer.parseInt(valueField.getText());\r
141       slider.setValue(i);\r
142     }\r
143     catch (Exception ex)\r
144     {\r
145       valueField.setText(slider.getValue() + "");\r
146     }\r
147   }\r
148 }\r