Feature Settings added to Applet
[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 \r
35   public FeatureSettings(AlignViewport av, final AlignmentPanel ap)\r
36   {\r
37     this.ap = ap;\r
38     this.av = av;\r
39     fr = ap.seqPanel.seqCanvas.getFeatureRenderer();\r
40 \r
41     setTableData();\r
42 \r
43     frame = new Frame();\r
44     frame.add(this);\r
45     int height = this.getComponentCount()*50;\r
46     if (height>400)\r
47       height = 400;\r
48 \r
49     jalview.bin.JalviewLite.addFrame(frame, "Feature Settings", 200,\r
50                                      height);\r
51   }\r
52 \r
53   void setTableData()\r
54   {\r
55     Vector allFeatures = new Vector();\r
56     Vector features;\r
57     Enumeration e;\r
58     SequenceFeature sf;\r
59 \r
60     for (int i = 0; i < av.alignment.getHeight(); i++)\r
61     {\r
62       features = av.alignment.getSequenceAt(i).getSequenceFeatures();\r
63       if (features == null)\r
64         continue;\r
65 \r
66       e = features.elements();\r
67       while (e.hasMoreElements())\r
68       {\r
69         sf = (SequenceFeature) e.nextElement();\r
70         if (!allFeatures.contains(sf.getType()))\r
71         {\r
72           allFeatures.addElement(sf.getType());\r
73         }\r
74       }\r
75     }\r
76 \r
77     int fSize = allFeatures.size();\r
78 \r
79     String type;\r
80     this.setLayout(new GridLayout(fSize, 2, 10,5));\r
81 \r
82     for (int i = 0; i < fSize; i++)\r
83     {\r
84       type = allFeatures.elementAt(i).toString();\r
85       Color col = fr.getColour(type);\r
86       boolean displayed = true;\r
87       if(fr.featuresDisplayed!=null)\r
88         displayed = fr.featuresDisplayed.contains(type);\r
89 \r
90       Checkbox check = new Checkbox(type, displayed);\r
91       check.addMouseListener(this);\r
92       check.addMouseMotionListener(this);\r
93       check.setBackground(col);\r
94       check.addItemListener(this);\r
95       add(check);\r
96     }\r
97     validate();\r
98   }\r
99 \r
100   public void itemStateChanged(ItemEvent evt)\r
101   {\r
102     Component [] comps = this.getComponents();\r
103     int cSize = comps.length;\r
104 \r
105     Object [][] data = new Object[cSize][3];\r
106 \r
107     for(int i=0; i<cSize; i++)\r
108     {\r
109       Checkbox check = (Checkbox)comps[i];\r
110       data[i][0] = check.getLabel();\r
111       data[i][1] = fr.getColour(check.getLabel());\r
112       data[i][2] = new Boolean(check.getState());\r
113     }\r
114 \r
115     fr.setFeaturePriority(data);\r
116     ap.seqPanel.seqCanvas.repaint();\r
117   }\r
118 \r
119   Checkbox selectedCheck;\r
120   boolean dragging = false;\r
121 \r
122   public void mousePressed(MouseEvent evt)\r
123   {\r
124     selectedCheck = (Checkbox)evt.getSource();\r
125   }\r
126 \r
127   public void mouseDragged(MouseEvent evt)\r
128   {\r
129       dragging = true;\r
130   }\r
131 \r
132   public void mouseReleased(MouseEvent evt)\r
133   {\r
134     Component comp = null;\r
135     Checkbox  target = null;\r
136 \r
137     int height = evt.getY()+evt.getComponent().getLocation().y;\r
138 \r
139     if(height > this.getSize().height)\r
140      {\r
141        comp = this.getComponent(this.getComponentCount()-1);\r
142      }\r
143      else if(height < 0)\r
144      {\r
145        comp = this.getComponent(0);\r
146      }\r
147      else\r
148      {\r
149        comp = this.getComponentAt(evt.getX(),\r
150                                   evt.getY() +\r
151                                   evt.getComponent().getLocation().y);\r
152      }\r
153 \r
154     if(comp!=null && comp instanceof Checkbox)\r
155       target = (Checkbox)comp;\r
156 \r
157     if (selectedCheck != null && target != null && selectedCheck != target)\r
158     {\r
159       int targetIndex = -1;\r
160       for(int i=0; i<this.getComponentCount(); i++)\r
161       {\r
162           if(target==this.getComponent(i))\r
163           { targetIndex = i; break; }\r
164       }\r
165 \r
166 \r
167       this.remove(selectedCheck);\r
168       this.add(selectedCheck, targetIndex);\r
169       validate();\r
170     }\r
171   }\r
172 \r
173 \r
174   public void mouseEntered(MouseEvent evt){}\r
175   public void mouseExited(MouseEvent evt){}\r
176   public void mouseClicked(MouseEvent evt){}\r
177   public void mouseMoved(MouseEvent evt){}\r
178 }\r