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