AlignPanel RefreshPanels put into paintComponent
[jalview.git] / src / jalview / gui / AnnotationLabels.java
1 \r
2 package jalview.gui;\r
3 \r
4 import javax.swing.*;\r
5 import java.awt.event.*;\r
6 import java.awt.*;\r
7 import java.awt.image.*;\r
8 import jalview.datamodel.*;\r
9 \r
10 public class AnnotationLabels extends JPanel implements MouseListener, MouseMotionListener, ActionListener\r
11 {\r
12   boolean active = false;\r
13   Image image;\r
14   AlignmentPanel ap ;\r
15   boolean resizing = false;\r
16   int oldY, mouseX;\r
17   static String ADDNEW = "Add new row";\r
18   static String HIDE = "Hide this row";\r
19   static String DELETE = "Delete this row";\r
20   static String SHOWALL="Show all hidden rows";\r
21   int selectedRow = 0;\r
22   int scrollOffset = 0;\r
23 \r
24   public AnnotationLabels(AlignmentPanel ap)\r
25   {\r
26     this.ap = ap;\r
27 \r
28     java.net.URL url = getClass().getResource("/images/idwidth.gif");\r
29     Image temp = null;\r
30     if (url != null)\r
31       temp = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
32 \r
33     try\r
34     {\r
35       MediaTracker mt = new MediaTracker(this);\r
36       mt.addImage(temp, 0);\r
37       mt.waitForID(0);\r
38     }\r
39     catch (Exception ex) {}\r
40 \r
41     BufferedImage bi = new BufferedImage(temp.getHeight(this), temp.getWidth(this),\r
42                                          BufferedImage.TYPE_INT_RGB);\r
43     Graphics2D g = (Graphics2D) bi.getGraphics();\r
44     g.rotate(Math.toRadians(90));\r
45     g.drawImage(temp, 0, -bi.getWidth(this), this);\r
46     image = (Image) bi;\r
47 \r
48     addMouseListener(this);\r
49     addMouseMotionListener(this);\r
50   }\r
51 \r
52   public void setScrollOffset(int y)\r
53   {\r
54     scrollOffset = y;\r
55     repaint();\r
56   }\r
57 \r
58   public void actionPerformed(ActionEvent evt)\r
59   {\r
60     AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
61 \r
62     if(evt.getActionCommand().equals(ADDNEW))\r
63     {\r
64       String label = JOptionPane.showInputDialog(this, "Label for annotation");\r
65       if(label==null)\r
66         label = "";\r
67       ap.av.alignment.addAnnotation(new AlignmentAnnotation\r
68                                       (label,\r
69                                        "New description",\r
70                                        new Annotation[ap.av.alignment.getWidth()]));\r
71     }\r
72    else if(evt.getActionCommand().equals(HIDE))\r
73    {\r
74      aa[selectedRow].visible = false;\r
75    }\r
76    else if(evt.getActionCommand().equals(DELETE))\r
77    {\r
78      ap.av.alignment.deleteAnnotation(aa[selectedRow]);\r
79    }\r
80    else if(evt.getActionCommand().equals(SHOWALL))\r
81    {\r
82        for(int i=0; i<aa.length; i++)\r
83          aa[i].visible = true;\r
84    }\r
85 \r
86    ap.annotationPanel.adjustPanelHeight();\r
87    ap.repaint();\r
88 \r
89   }\r
90 \r
91   public void mousePressed(MouseEvent evt)\r
92   {\r
93     int y = evt.getY() - scrollOffset;\r
94 \r
95     if (SwingUtilities.isRightMouseButton(evt))\r
96     {\r
97        AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
98        if(aa==null || aa.length==0)\r
99        {\r
100             JPopupMenu pop = new JPopupMenu("Annotations");\r
101             JMenuItem item = new JMenuItem(ADDNEW);\r
102             item.addActionListener(this);\r
103             pop.add(item);\r
104             pop.show(this, evt.getX(), evt.getY());\r
105             return;\r
106        }\r
107 \r
108        int height = 0;\r
109        for (int i = 0; i < aa.length; i++)\r
110        {\r
111          if(!aa[i].visible)\r
112            continue;\r
113 \r
114          height += aa[i].height;\r
115          if(y<height)\r
116          {\r
117            selectedRow = i;\r
118            break;\r
119          }\r
120        }\r
121 \r
122       JPopupMenu pop = new JPopupMenu("Annotations");\r
123       JMenuItem item = new JMenuItem(ADDNEW);\r
124       item.addActionListener(this);\r
125       pop.add(item);\r
126       item = new JMenuItem(HIDE);\r
127       item.addActionListener(this);\r
128       pop.add(item);\r
129       item = new JMenuItem(DELETE);\r
130       item.addActionListener(this);\r
131       pop.add(item);\r
132       item = new JMenuItem(SHOWALL);\r
133       item.addActionListener(this);\r
134       pop.add(item);\r
135       pop.show(this, evt.getX(), evt.getY());\r
136       return;\r
137     }\r
138 \r
139     oldY = evt.getY();\r
140   }\r
141 \r
142   public void mouseReleased(MouseEvent evt){ active = false; repaint(); }\r
143   public void mouseEntered(MouseEvent evt) { active = true;  repaint();}\r
144   public void mouseExited(MouseEvent evt)  { active = false; repaint();}\r
145   public void mouseDragged(MouseEvent evt)\r
146   {\r
147     active = true;\r
148     Dimension d = ap.annotationScroller.getPreferredSize();\r
149     int dif = evt.getY() - oldY;\r
150 \r
151     dif /= ap.av.charHeight;\r
152     dif *= ap.av.charHeight;\r
153 \r
154     if(d.height-dif>20)\r
155     {\r
156       ap.annotationScroller.setPreferredSize(new Dimension(d.width,d.height - dif));\r
157       d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
158       ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(d.width,d.height - dif));\r
159       ap.repaint();\r
160     }\r
161     ap.addNotify();\r
162   }\r
163 \r
164   public void mouseMoved(MouseEvent evt)   {}\r
165   public void mouseClicked(MouseEvent evt) {}\r
166 \r
167   public void paintComponent(Graphics g1)\r
168   {\r
169     Graphics2D g = (Graphics2D)g1;\r
170     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
171 \r
172     drawComponent(g);\r
173   }\r
174 \r
175   public void drawComponent(Graphics2D g)\r
176   {\r
177     FontMetrics fm = g.getFontMetrics(g.getFont());\r
178     g.setColor(Color.white);\r
179     g.fillRect(0,0, getWidth(), getHeight());\r
180 \r
181     g.translate(0, scrollOffset);\r
182     g.setColor(Color.black);\r
183 \r
184    AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
185    int y = g.getFont().getSize();\r
186    int x = 0;\r
187 \r
188    if(aa!=null)\r
189    for(int i=0; i<aa.length; i++)\r
190    {\r
191      if(!aa[i].visible)\r
192        continue;\r
193 \r
194      x = getWidth() - fm.stringWidth(aa[i].label)-3;\r
195 \r
196      if(aa[i].isGraph)\r
197        y+=(aa[i].height/3);\r
198 \r
199      g.drawString(aa[i].label, x, y);\r
200 \r
201      if(aa[i].isGraph)\r
202        y+=(2*aa[i].height/3);\r
203     else\r
204        y+=aa[i].height;\r
205    }\r
206 \r
207    if (active)\r
208    {\r
209      if (image != null)\r
210        g.drawImage(image, 2, 0, this);\r
211    }\r
212 \r
213    if (aa == null || aa.length<1)\r
214    {\r
215      g.drawString("Right click", 2, 8);\r
216      g.drawString("to add annotation", 2, 18);\r
217    }\r
218 \r
219 \r
220 \r
221   }\r
222 \r
223 }\r