JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / RedundancyPanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3\r
10  * of the License, or (at your option) any later version.\r
11  *  \r
12  * Jalview is distributed in the hope that it will be useful, but \r
13  * WITHOUT ANY WARRANTY; without even the implied warranty \r
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
15  * PURPOSE.  See the GNU General Public License for more details.\r
16  * \r
17  * You should have received a copy of the GNU General Public License\r
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
19  * The Jalview Authors are detailed in the 'AUTHORS' file.\r
20  */\r
21 package jalview.appletgui;\r
22 \r
23 import jalview.analysis.AlignSeq;\r
24 import jalview.bin.JalviewLite;\r
25 import jalview.commands.CommandI;\r
26 import jalview.commands.EditCommand;\r
27 import jalview.commands.EditCommand.Action;\r
28 import jalview.datamodel.AlignmentI;\r
29 import jalview.datamodel.SequenceGroup;\r
30 import jalview.datamodel.SequenceI;\r
31 import jalview.util.MessageManager;\r
32 \r
33 import javax.swing.JFrame;\r
34 import java.awt.event.ActionEvent;\r
35 import java.awt.event.AdjustmentEvent;\r
36 import java.awt.event.AdjustmentListener;\r
37 import java.awt.event.WindowEvent;\r
38 import java.awt.event.WindowListener;\r
39 import java.util.ArrayList;\r
40 import java.util.List;\r
41 import java.util.Stack;\r
42 import java.util.Vector;\r
43 \r
44 public class RedundancyPanel extends SliderPanel implements Runnable,\r
45         WindowListener\r
46 {\r
47   Stack historyList = new Stack(); // simpler than synching with alignFrame.\r
48 \r
49   float[] redundancy;\r
50 \r
51   SequenceI[] originalSequences;\r
52 \r
53   JFrame frame;\r
54 \r
55   Vector redundantSeqs;\r
56 \r
57   public RedundancyPanel(AlignmentPanel ap)\r
58   {\r
59     super(ap, 0, false, null);\r
60 \r
61     redundantSeqs = new Vector();\r
62     this.ap = ap;\r
63     undoButton.setVisible(true);\r
64     applyButton.setVisible(true);\r
65     allGroupsCheck.setVisible(false);\r
66 \r
67     label.setText(MessageManager\r
68             .getString("label.enter_redundancy_threshold"));\r
69     valueField.setText("100");\r
70 \r
71     slider.setVisibleAmount(1);\r
72     slider.setMinimum(0);\r
73     slider.setMaximum(100 + slider.getVisibleAmount());\r
74     slider.setValue(100);\r
75 \r
76     slider.addAdjustmentListener(new AdjustmentListener()\r
77     {\r
78       public void adjustmentValueChanged(AdjustmentEvent evt)\r
79       {\r
80         valueField.setText(slider.getValue() + "");\r
81         sliderValueChanged();\r
82       }\r
83     });\r
84 \r
85     frame = new JFrame();\r
86     frame.add(this);\r
87     JalviewLite.addFrame(frame, MessageManager\r
88             .getString("label.redundancy_threshold_selection"), 400, 100);\r
89 \r
90     frame.addWindowListener(this);\r
91 \r
92     Thread worker = new Thread(this);\r
93     worker.start();\r
94   }\r
95 \r
96   /**\r
97    * This is a copy of remove redundancy in jalivew.datamodel.Alignment except\r
98    * we dont want to remove redundancy, just calculate once so we can use the\r
99    * slider to dynamically hide redundant sequences\r
100    * \r
101    * @param threshold\r
102    *          DOCUMENT ME!\r
103    * @param sel\r
104    *          DOCUMENT ME!\r
105    * \r
106    * @return DOCUMENT ME!\r
107    */\r
108   public void run()\r
109   {\r
110     label.setText(MessageManager.getString("label.calculating"));\r
111 \r
112     slider.setVisible(false);\r
113     applyButton.setEnabled(false);\r
114     valueField.setVisible(false);\r
115 \r
116     validate();\r
117 \r
118     String[] omitHidden = null;\r
119 \r
120     SequenceGroup sg = ap.av.getSelectionGroup();\r
121     int height;\r
122 \r
123     int start, end;\r
124 \r
125     if ((sg != null) && (sg.getSize() >= 1))\r
126     {\r
127       originalSequences = sg.getSequencesInOrder(ap.av.getAlignment());\r
128       start = sg.getStartRes();\r
129       end = sg.getEndRes();\r
130     }\r
131     else\r
132     {\r
133       originalSequences = ap.av.getAlignment().getSequencesArray();\r
134       start = 0;\r
135       end = ap.av.getAlignment().getWidth();\r
136     }\r
137 \r
138     height = originalSequences.length;\r
139 \r
140     redundancy = AlignSeq.computeRedundancyMatrix(originalSequences,\r
141             omitHidden, start, end, false);\r
142     label.setText(MessageManager\r
143             .getString("label.enter_redundancy_threshold"));\r
144     slider.setVisible(true);\r
145     applyButton.setEnabled(true);\r
146     valueField.setVisible(true);\r
147 \r
148     validate();\r
149     sliderValueChanged();\r
150     // System.out.println("blob done "+ (System.currentTimeMillis()-start));\r
151   }\r
152 \r
153   void sliderValueChanged()\r
154   {\r
155     if (redundancy == null)\r
156     {\r
157       return;\r
158     }\r
159 \r
160     float value = slider.getValue();\r
161 \r
162     List<SequenceI> redundantSequences = new ArrayList<SequenceI>();\r
163     for (int i = 0; i < redundancy.length; i++)\r
164     {\r
165       if (value <= redundancy[i])\r
166       {\r
167         redundantSequences.add(originalSequences[i]);\r
168       }\r
169     }\r
170 \r
171     ap.idPanel.idCanvas.setHighlighted(redundantSequences);\r
172     PaintRefresher.Refresh(this, ap.av.getSequenceSetId(), true, true);\r
173 \r
174   }\r
175 \r
176   public void applyButton_actionPerformed()\r
177   {\r
178     Vector del = new Vector();\r
179 \r
180     undoButton.setEnabled(true);\r
181 \r
182     float value = slider.getValue();\r
183     SequenceGroup sg = ap.av.getSelectionGroup();\r
184 \r
185     for (int i = 0; i < redundancy.length; i++)\r
186     {\r
187       if (value <= redundancy[i])\r
188       {\r
189         del.addElement(originalSequences[i]);\r
190       }\r
191     }\r
192 \r
193     // This has to be done before the restoreHistoryItem method of alignFrame\r
194     // will\r
195     // actually restore these sequences.\r
196     if (del.size() > 0)\r
197     {\r
198       SequenceI[] deleted = new SequenceI[del.size()];\r
199 \r
200       int width = 0;\r
201       for (int i = 0; i < del.size(); i++)\r
202       {\r
203         deleted[i] = (SequenceI) del.elementAt(i);\r
204         if (deleted[i].getLength() > width)\r
205         {\r
206           width = deleted[i].getLength();\r
207         }\r
208       }\r
209 \r
210       EditCommand cut = new EditCommand(MessageManager.getString("action.remove_redundancy"),\r
211               Action.CUT, deleted, 0, width, ap.av.getAlignment());\r
212       AlignmentI alignment = ap.av.getAlignment();\r
213       for (int i = 0; i < del.size(); i++)\r
214       {\r
215         alignment.deleteSequence(deleted[i]);\r
216         if (sg != null)\r
217         {\r
218           sg.deleteSequence(deleted[i], false);\r
219         }\r
220       }\r
221 \r
222       historyList.push(cut);\r
223 \r
224       ap.alignFrame.addHistoryItem(cut);\r
225 \r
226       PaintRefresher.Refresh(this, ap.av.getSequenceSetId(), true, true);\r
227        ap.av.firePropertyChange("alignment", null, ap.av.getAlignment().getSequences());\r
228     }\r
229 \r
230   }\r
231 \r
232   public void undoButton_actionPerformed()\r
233   {\r
234     CommandI command = (CommandI) historyList.pop();\r
235     command.undoCommand(null);\r
236 \r
237     if (ap.av.getHistoryList().contains(command))\r
238     {\r
239       ap.av.getHistoryList().remove(command);\r
240       ap.alignFrame.updateEditMenuBar();\r
241       ap.av.firePropertyChange("alignment", null, ap.av.getAlignment().getSequences());\r
242     }\r
243 \r
244     ap.paintAlignment(true);\r
245 \r
246     if (historyList.size() == 0)\r
247     {\r
248       undoButton.setEnabled(false);\r
249     }\r
250   }\r
251 \r
252   public void valueField_actionPerformed(ActionEvent e)\r
253   {\r
254     try\r
255     {\r
256       int i = Integer.parseInt(valueField.getText());\r
257       slider.setValue(i);\r
258     } catch (Exception ex)\r
259     {\r
260       valueField.setText(slider.getValue() + "");\r
261     }\r
262   }\r
263 \r
264   public void windowOpened(WindowEvent evt)\r
265   {\r
266   }\r
267 \r
268   public void windowClosing(WindowEvent evt)\r
269   {\r
270     ap.idPanel.idCanvas.setHighlighted(null);\r
271   }\r
272 \r
273   public void windowClosed(WindowEvent evt)\r
274   {\r
275   }\r
276 \r
277   public void windowActivated(WindowEvent evt)\r
278   {\r
279   }\r
280 \r
281   public void windowDeactivated(WindowEvent evt)\r
282   {\r
283   }\r
284 \r
285   public void windowIconified(WindowEvent evt)\r
286   {\r
287   }\r
288 \r
289   public void windowDeiconified(WindowEvent evt)\r
290   {\r
291   }\r
292 }\r