ForegroundColor is darker.darker.darker
[jalview.git] / src / jalview / gui / SecondaryStructurePanel.java
1 package jalview.gui;\r
2 \r
3 import javax.swing.JPanel;\r
4 import java.awt.event.*;\r
5 import java.awt.*;\r
6 import java.util.*;\r
7 import javax.swing.*;\r
8 import jalview.datamodel.*;\r
9 \r
10 public class SecondaryStructurePanel extends JPanel implements ActionListener\r
11 {\r
12   AlignViewport av;\r
13   Vector structures;\r
14 \r
15   SecondaryStructure amend;\r
16 \r
17   public SecondaryStructurePanel(AlignViewport av)\r
18   {\r
19     this.av = av;\r
20     structures = new Vector();\r
21     setPreferredSize(new Dimension(500,30));\r
22 \r
23     addMouseListener(new MouseAdapter()\r
24     {\r
25       public void mousePressed(MouseEvent evt)\r
26       { doMousePressed(evt); }\r
27       public void mouseReleased(MouseEvent evt)\r
28       { doMouseReleased(evt); }\r
29     });\r
30     addMouseMotionListener(new MouseMotionAdapter()\r
31     {\r
32       public void mouseDragged(MouseEvent evt)\r
33       { doMouseDragged(evt);  }\r
34     });\r
35   }\r
36 \r
37   int startRes = 0;\r
38   int endRes = 0;\r
39   boolean amendStart = false;\r
40   boolean amendEnd = false;\r
41 \r
42   public void doMousePressed(MouseEvent evt)\r
43   {\r
44     amend = null;\r
45     amendStart =false;\r
46     amendEnd = false;\r
47 \r
48     startRes = evt.getX() / av.getCharWidth() + av.getStartRes();\r
49     for(int i=0; i<structures.size(); i++)\r
50     {\r
51       SecondaryStructure ss = (SecondaryStructure) structures.get(i);\r
52       if(startRes>=ss.start && startRes<=ss.end)\r
53       {\r
54         amend = ss;\r
55         if(startRes==ss.start)\r
56           amendStart = true;\r
57 \r
58         if(startRes==ss.end)\r
59           amendEnd = true;\r
60 \r
61         if(evt.getClickCount()==2)\r
62         {\r
63           String label = JOptionPane.showInputDialog(this, "Amend label", "Amend label", JOptionPane.QUESTION_MESSAGE );\r
64           if(label==null)\r
65             label = "";\r
66           ss.label = label;\r
67         }\r
68         break;\r
69       }\r
70     }\r
71     repaint();\r
72 \r
73   }\r
74 \r
75   public void doMouseReleased(MouseEvent evt)\r
76   {\r
77     endRes = evt.getX() / av.getCharWidth() + av.getStartRes();\r
78 \r
79     if(amend!=null)\r
80     {\r
81       if(amendStart)\r
82         amend.start = endRes;\r
83       if(amendEnd)\r
84         amend.end = endRes;\r
85 \r
86       amend=null;\r
87       repaint();\r
88       return;\r
89     }\r
90 \r
91     endRes = evt.getX() / av.getCharWidth() + av.getStartRes();\r
92 \r
93     JPopupMenu pop = new JPopupMenu("Structure type");\r
94     JMenuItem item = new JMenuItem("Helix");\r
95     item.addActionListener(this);\r
96     pop.add(item);\r
97     item = new JMenuItem("Sheet");\r
98     item.addActionListener(this);\r
99     pop.add(item);\r
100     pop.show(this, evt.getX(), evt.getY());\r
101 \r
102   }\r
103 \r
104   public void actionPerformed(ActionEvent evt)\r
105   {\r
106 \r
107     int type = 0;\r
108     if(evt.getActionCommand().equals("Helix"))\r
109        type = SecondaryStructure.HELIX;\r
110     else if(evt.getActionCommand().equals("Sheet"))\r
111       type = SecondaryStructure.SHEET;\r
112 \r
113     String label = JOptionPane.showInputDialog(this, "Enter a label for the structure?", "Enter label", JOptionPane.QUESTION_MESSAGE );\r
114     if(label==null)\r
115       label = "";\r
116 \r
117     SecondaryStructure ss = new SecondaryStructure(startRes, endRes, type, label);\r
118     structures.add(ss);\r
119     repaint();\r
120 \r
121   }\r
122 \r
123   public void doMouseDragged(MouseEvent evt)\r
124   {\r
125     paintNow(getGraphics());\r
126   }\r
127 \r
128   void paintNow(Graphics g)\r
129   {\r
130     g.setColor(Color.white);\r
131     g.setFont(new Font("Verdana", Font.PLAIN, 10));\r
132     g.fillRect(0,0,getWidth(),getHeight());\r
133     for(int i=0; i<structures.size(); i++)\r
134     {\r
135       SecondaryStructure ss = (SecondaryStructure)structures.get(i);\r
136 \r
137 \r
138       if(ss.type==SecondaryStructure.SHEET)\r
139       {\r
140         g.setColor(Color.orange);\r
141         if(ss==amend)\r
142           g.setColor(Color.red);\r
143 \r
144         g.fillRect( (  ss.start - av.startRes) * av.charWidth,          4,\r
145                     (ss.end - ss.start) * av.charWidth, 7);\r
146 \r
147         g.fillPolygon( new int[]{ (ss.end - av.startRes )* av.charWidth,\r
148                        ( ss.end - av.startRes )* av.charWidth,\r
149                        ( ss.end - av.startRes )* av.charWidth+7},\r
150                        new int[]{0,14,7}, 3);\r
151       }\r
152 \r
153       if(ss.type==SecondaryStructure.HELIX)\r
154       {\r
155         g.setColor(Color.magenta);\r
156         if(ss==amend)\r
157           g.setColor(Color.red);\r
158         g.fillRoundRect((ss.start -av.startRes)* av.charWidth, 4,\r
159                    (ss.end - ss.start) * av.charWidth, 7, 8,8);\r
160       }\r
161 \r
162 \r
163 \r
164       g.setColor(Color.black);\r
165 \r
166       int labelWidth = g.getFontMetrics().stringWidth(ss.label);\r
167 \r
168       g.drawString( ss.label,  (ss.start +(ss.end-ss.start)/2 -av.startRes)*av.charWidth - labelWidth/2, 24);\r
169     }\r
170   }\r
171 \r
172   public void paintComponent(Graphics g)\r
173   {\r
174     paintNow(g);\r
175   }\r
176 }\r
177 \r
178 class SecondaryStructure\r
179 {\r
180   public static int HELIX = 1;\r
181   public static int SHEET = 2;\r
182   public String label="";\r
183   public int start= 20;\r
184   public int end  = 40;\r
185   public int type = HELIX;\r
186 \r
187   public SecondaryStructure(int s, int e, int t, String l)\r
188   {\r
189     start = s; end = e; type = t; label = l;\r
190   }\r
191 \r
192 }\r
193 \r
194 \r