Feature Groups added
[jalview.git] / src / jalview / appletgui / FeatureSettings.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 package jalview.appletgui;\r
20 \r
21 import jalview.datamodel.*;\r
22 import java.awt.*;\r
23 import java.util.*;\r
24 import java.awt.event.*;\r
25 \r
26 \r
27 public class FeatureSettings extends Panel implements ItemListener,\r
28     MouseListener, MouseMotionListener\r
29 {\r
30   final FeatureRenderer fr;\r
31   final AlignmentPanel ap;\r
32   final AlignViewport av;\r
33   final Frame frame;\r
34   Panel groupPanel;\r
35   Panel featurePanel = new Panel();\r
36 \r
37   public FeatureSettings(AlignViewport av, final AlignmentPanel ap)\r
38   {\r
39     this.ap = ap;\r
40     this.av = av;\r
41     fr = ap.seqPanel.seqCanvas.getFeatureRenderer();\r
42 \r
43     setTableData();\r
44 \r
45     this.setLayout(new BorderLayout());\r
46     ScrollPane sp = new ScrollPane();\r
47     sp.add(featurePanel);\r
48     add(sp, BorderLayout.CENTER);\r
49     if(groupPanel!=null)\r
50     {\r
51       sp = new ScrollPane();\r
52       sp.add(groupPanel);\r
53 \r
54       add(sp, BorderLayout.NORTH);\r
55       sp.validate();\r
56       sp.setSize( 100, 55);\r
57     }\r
58     frame = new Frame();\r
59     frame.add(this);\r
60     int height = featurePanel.getComponentCount()*50 ;\r
61     if (height>400)\r
62       height = 400;\r
63 \r
64     jalview.bin.JalviewLite.addFrame(frame, "Feature Settings", 200,\r
65                                      height);\r
66   }\r
67 \r
68   void setTableData()\r
69   {\r
70     if(fr.featureGroups==null)\r
71       fr.featureGroups = new Hashtable();\r
72     else\r
73       fr.featureGroups.clear();\r
74 \r
75     Vector allFeatures = new Vector();\r
76     Enumeration tmpfeatures;\r
77     SequenceFeature sf;\r
78 \r
79     for (int i = 0; i < av.alignment.getHeight(); i++)\r
80     {\r
81       if (av.alignment.getSequenceAt(i).getSequenceFeatures() == null)\r
82         continue;\r
83 \r
84       tmpfeatures = av.alignment.getSequenceAt(i).getSequenceFeatures().elements();\r
85       while (tmpfeatures.hasMoreElements())\r
86       {\r
87         sf = (SequenceFeature) tmpfeatures.nextElement();\r
88         if (!allFeatures.contains(sf.getType()))\r
89         {\r
90           allFeatures.addElement(sf.getType());\r
91           Color col = fr.getColour(sf.getType());\r
92           boolean displayed = true;\r
93           if (fr.featuresDisplayed != null)\r
94             displayed = fr.featuresDisplayed.contains(sf.getType());\r
95 \r
96           Checkbox check = new Checkbox(sf.getType(), displayed);\r
97           check.addMouseListener(this);\r
98           check.addMouseMotionListener(this);\r
99           check.setBackground(col);\r
100           check.addItemListener(this);\r
101           featurePanel.add(check);\r
102         }\r
103         if(sf.getFeatureGroup()!=null\r
104            && !fr.featureGroups.containsKey(sf.getFeatureGroup()))\r
105         {\r
106           fr.featureGroups.put(sf.getFeatureGroup(), new Boolean(true));\r
107           if(groupPanel==null)\r
108             groupPanel = new Panel();\r
109 \r
110           Checkbox check = new Checkbox(sf.getFeatureGroup(), true);\r
111           check.setFont(new Font("Serif", Font.BOLD, 12));\r
112           check.addItemListener(this);\r
113           groupPanel.add(check);\r
114         }\r
115       }\r
116     }\r
117 \r
118     featurePanel.setLayout(new GridLayout(allFeatures.size(), 2, 10,5));\r
119     featurePanel.validate();\r
120   }\r
121 \r
122   public void itemStateChanged(ItemEvent evt)\r
123   {\r
124     if(evt!=null)\r
125     {\r
126       //Is the source a top level featureGroup?\r
127       Checkbox source = (Checkbox) evt.getSource();\r
128       if (fr.featureGroups.containsKey(source.getLabel()))\r
129       {\r
130         fr.featureGroups.put(source.getLabel(), new Boolean(source.getState()));\r
131         ap.seqPanel.seqCanvas.repaint();\r
132         if (ap.overviewPanel != null)\r
133           ap.overviewPanel.updateOverviewImage();\r
134 \r
135         return;\r
136       }\r
137     }\r
138 \r
139       Component[] comps = featurePanel.getComponents();\r
140       int cSize = comps.length;\r
141 \r
142       Object[][] data = new Object[cSize][3];\r
143 \r
144       for (int i = 0; i < cSize; i++)\r
145       {\r
146         Checkbox check = (Checkbox) comps[i];\r
147         data[i][0] = check.getLabel();\r
148         data[i][1] = fr.getColour(check.getLabel());\r
149         data[i][2] = new Boolean(check.getState());\r
150       }\r
151 \r
152       fr.setFeaturePriority(data);\r
153       ap.seqPanel.seqCanvas.repaint();\r
154       if (ap.overviewPanel != null)\r
155         ap.overviewPanel.updateOverviewImage();\r
156   }\r
157 \r
158   Checkbox selectedCheck;\r
159   boolean dragging = false;\r
160 \r
161   public void mousePressed(MouseEvent evt)\r
162   {\r
163     selectedCheck = (Checkbox)evt.getSource();\r
164   }\r
165 \r
166   public void mouseDragged(MouseEvent evt)\r
167   {\r
168       dragging = true;\r
169   }\r
170 \r
171   public void mouseReleased(MouseEvent evt)\r
172   {\r
173     Component comp = null;\r
174     Checkbox  target = null;\r
175 \r
176     int height = evt.getY()+evt.getComponent().getLocation().y;\r
177 \r
178 \r
179     if(height > this.getSize().height)\r
180      {\r
181        comp = featurePanel.getComponent(featurePanel.getComponentCount()-1);\r
182      }\r
183      else if(height < 0)\r
184      {\r
185        comp = featurePanel.getComponent(0);\r
186      }\r
187      else\r
188      {\r
189        comp = featurePanel.getComponentAt(evt.getX(),\r
190                                   evt.getY() +\r
191                                   evt.getComponent().getLocation().y);\r
192      }\r
193 \r
194     if(comp!=null && comp instanceof Checkbox)\r
195       target = (Checkbox)comp;\r
196 \r
197     if (selectedCheck != null && target != null && selectedCheck != target)\r
198     {\r
199       int targetIndex = -1;\r
200       for(int i=0; i<featurePanel.getComponentCount(); i++)\r
201       {\r
202           if(target==featurePanel.getComponent(i))\r
203           { targetIndex = i; break; }\r
204       }\r
205 \r
206 \r
207       featurePanel.remove(selectedCheck);\r
208       featurePanel.add(selectedCheck, targetIndex);\r
209       featurePanel.validate();\r
210       itemStateChanged(null);\r
211     }\r
212   }\r
213 \r
214 \r
215   public void mouseEntered(MouseEvent evt){}\r
216   public void mouseExited(MouseEvent evt){}\r
217   public void mouseClicked(MouseEvent evt){}\r
218   public void mouseMoved(MouseEvent evt){}\r
219 }\r