Overview displays features
[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     if(ap.overviewPanel!=null)\r
118       ap.overviewPanel.updateOverviewImage();\r
119   }\r
120 \r
121   Checkbox selectedCheck;\r
122   boolean dragging = false;\r
123 \r
124   public void mousePressed(MouseEvent evt)\r
125   {\r
126     selectedCheck = (Checkbox)evt.getSource();\r
127   }\r
128 \r
129   public void mouseDragged(MouseEvent evt)\r
130   {\r
131       dragging = true;\r
132   }\r
133 \r
134   public void mouseReleased(MouseEvent evt)\r
135   {\r
136     Component comp = null;\r
137     Checkbox  target = null;\r
138 \r
139     int height = evt.getY()+evt.getComponent().getLocation().y;\r
140 \r
141     if(height > this.getSize().height)\r
142      {\r
143        comp = this.getComponent(this.getComponentCount()-1);\r
144      }\r
145      else if(height < 0)\r
146      {\r
147        comp = this.getComponent(0);\r
148      }\r
149      else\r
150      {\r
151        comp = this.getComponentAt(evt.getX(),\r
152                                   evt.getY() +\r
153                                   evt.getComponent().getLocation().y);\r
154      }\r
155 \r
156     if(comp!=null && comp instanceof Checkbox)\r
157       target = (Checkbox)comp;\r
158 \r
159     if (selectedCheck != null && target != null && selectedCheck != target)\r
160     {\r
161       int targetIndex = -1;\r
162       for(int i=0; i<this.getComponentCount(); i++)\r
163       {\r
164           if(target==this.getComponent(i))\r
165           { targetIndex = i; break; }\r
166       }\r
167 \r
168 \r
169       this.remove(selectedCheck);\r
170       this.add(selectedCheck, targetIndex);\r
171       validate();\r
172       itemStateChanged(null);\r
173     }\r
174   }\r
175 \r
176 \r
177   public void mouseEntered(MouseEvent evt){}\r
178   public void mouseExited(MouseEvent evt){}\r
179   public void mouseClicked(MouseEvent evt){}\r
180   public void mouseMoved(MouseEvent evt){}\r
181 }\r