no need for right mouse click
[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       AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
96        if(aa==null || aa.length==0)\r
97        {\r
98             JPopupMenu pop = new JPopupMenu("Annotations");\r
99             JMenuItem item = new JMenuItem(ADDNEW);\r
100             item.addActionListener(this);\r
101             pop.add(item);\r
102             pop.show(this, evt.getX(), evt.getY());\r
103             return;\r
104        }\r
105 \r
106        int height = 0;\r
107        for (int i = 0; i < aa.length; i++)\r
108        {\r
109          if(!aa[i].visible)\r
110            continue;\r
111 \r
112          height += aa[i].height;\r
113          if(y<height)\r
114          {\r
115            selectedRow = i;\r
116            break;\r
117          }\r
118        }\r
119 \r
120       JPopupMenu pop = new JPopupMenu("Annotations");\r
121       JMenuItem item = new JMenuItem(ADDNEW);\r
122       item.addActionListener(this);\r
123       pop.add(item);\r
124       item = new JMenuItem(HIDE);\r
125       item.addActionListener(this);\r
126       pop.add(item);\r
127       item = new JMenuItem(DELETE);\r
128       item.addActionListener(this);\r
129       pop.add(item);\r
130       item = new JMenuItem(SHOWALL);\r
131       item.addActionListener(this);\r
132       pop.add(item);\r
133       pop.show(this, evt.getX(), evt.getY());\r
134 \r
135     oldY = evt.getY();\r
136   }\r
137 \r
138   public void mouseReleased(MouseEvent evt){ active = false; repaint(); }\r
139   public void mouseEntered(MouseEvent evt) { active = true;  repaint();}\r
140   public void mouseExited(MouseEvent evt)  { active = false; repaint();}\r
141   public void mouseDragged(MouseEvent evt)\r
142   {\r
143     active = true;\r
144     Dimension d = ap.annotationScroller.getPreferredSize();\r
145     int dif = evt.getY() - oldY;\r
146 \r
147     dif /= ap.av.charHeight;\r
148     dif *= ap.av.charHeight;\r
149 \r
150     if(d.height-dif>20)\r
151     {\r
152       ap.annotationScroller.setPreferredSize(new Dimension(d.width,d.height - dif));\r
153       d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
154       ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(d.width,d.height - dif));\r
155       ap.repaint();\r
156     }\r
157     ap.addNotify();\r
158   }\r
159 \r
160   public void mouseMoved(MouseEvent evt)   {}\r
161   public void mouseClicked(MouseEvent evt) {}\r
162 \r
163   public void paintComponent(Graphics g1)\r
164   {\r
165     Graphics2D g = (Graphics2D)g1;\r
166     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
167 \r
168     drawComponent(g);\r
169   }\r
170 \r
171   public void drawComponent(Graphics2D g)\r
172   {\r
173     FontMetrics fm = g.getFontMetrics(g.getFont());\r
174     g.setColor(Color.white);\r
175     g.fillRect(0,0, getWidth(), getHeight());\r
176 \r
177     g.translate(0, scrollOffset);\r
178     g.setColor(Color.black);\r
179 \r
180    AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
181    int y = g.getFont().getSize();\r
182    int x = 0;\r
183 \r
184    if(aa!=null)\r
185    for(int i=0; i<aa.length; i++)\r
186    {\r
187      if(!aa[i].visible)\r
188        continue;\r
189 \r
190      x = getWidth() - fm.stringWidth(aa[i].label)-3;\r
191 \r
192      if(aa[i].isGraph)\r
193        y+=(aa[i].height/3);\r
194 \r
195      g.drawString(aa[i].label, x, y);\r
196 \r
197      if(aa[i].isGraph)\r
198        y+=(2*aa[i].height/3);\r
199     else\r
200        y+=aa[i].height;\r
201    }\r
202 \r
203    if (active)\r
204    {\r
205      if (image != null)\r
206        g.drawImage(image, 2, 0, this);\r
207    }\r
208 \r
209    if (aa == null || aa.length<1)\r
210    {\r
211      g.drawString("Right click", 2, 8);\r
212      g.drawString("to add annotation", 2, 18);\r
213    }\r
214 \r
215 \r
216 \r
217   }\r
218 \r
219 }\r