45edace5fdbaad3890e30635dcad16bd424a4903
[jalview.git] / src / jalview / gui / OverviewPanel.java
1 package jalview.gui;\r
2 \r
3 import javax.swing.*;\r
4 import java.awt.event.*;\r
5 import java.awt.image.*;\r
6 import java.awt.*;\r
7 \r
8 public class OverviewPanel extends JPanel\r
9 {\r
10   BufferedImage miniMe;\r
11   AlignViewport av;\r
12   AlignmentPanel ap;\r
13   float scalew = 1f;\r
14   float scaleh = 1f;\r
15 \r
16   int sequencesWidth, sequencesHeight;\r
17   int graphHeight=30;\r
18   int boxX=-1, boxY=-1, boxWidth=-1, boxHeight=-1;\r
19 \r
20   public OverviewPanel(AlignmentPanel ap, AlignViewport av)\r
21   {\r
22     this.av = av;\r
23     this.ap = ap;\r
24 \r
25     // scale the initial size of overviewpanel to shape of alignment\r
26 \r
27     float initialScale = (float)av.getAlignment().getWidth()/(float)av.getAlignment().getHeight();\r
28     if(av.getAlignment().getWidth() > av.getAlignment().getHeight())\r
29     {\r
30       // wider\r
31       sequencesWidth = 400;\r
32       sequencesHeight = (int)(400f/initialScale);\r
33     }\r
34     else\r
35     {\r
36       // taller\r
37       sequencesWidth = (int)(400f*initialScale);\r
38       sequencesHeight = 300;\r
39     }\r
40 \r
41 \r
42 \r
43     setSize(sequencesWidth, sequencesHeight+graphHeight);\r
44     setLayout(null);\r
45 \r
46     updateOverviewImage();\r
47 \r
48     addComponentListener(new ComponentAdapter()\r
49    {\r
50 \r
51        public void componentResized(ComponentEvent evt)\r
52        {\r
53          if( getWidth()!=sequencesWidth || getHeight()!=sequencesHeight+graphHeight)\r
54            updateOverviewImage();\r
55        }\r
56    });\r
57 \r
58 \r
59     addMouseMotionListener(new MouseMotionAdapter()\r
60            {\r
61              public void mouseDragged(MouseEvent evt)\r
62              { doMouseDragged(evt);}\r
63            });\r
64 \r
65     addMouseListener(new MouseAdapter()\r
66     {\r
67       public void mousePressed(MouseEvent evt)\r
68       { doMousePressed(evt);}\r
69       public void mouseReleased(MouseEvent evt)\r
70       { doMouseReleased(evt);}\r
71     });\r
72 \r
73   }\r
74 \r
75   public void doMousePressed(MouseEvent evt)\r
76   {\r
77     checkValid(evt.getX(), evt.getY());\r
78     repaint();\r
79   }\r
80 \r
81   public void doMouseReleased(MouseEvent evt)\r
82   {\r
83     int x = evt.getX();\r
84     int y = evt.getY();\r
85     checkValid(x, y);\r
86     ap.setScrollValues( (int)(x/scalew/av.getCharWidth()), (int)(y/scaleh/av.getCharHeight()) );\r
87   }\r
88 \r
89   public void doMouseDragged(MouseEvent evt)\r
90   {\r
91     int x = evt.getX();\r
92     int y = evt.getY();\r
93     checkValid(x, y);\r
94     ap.setScrollValues( (int)(x/scalew/av.getCharWidth()), (int)(y/scaleh/av.getCharHeight()) );\r
95     repaint();\r
96   }\r
97 \r
98   void checkValid(int x, int y)\r
99   {\r
100 \r
101     if (y < 0)\r
102       y = 0;\r
103     if (y > sequencesHeight - boxHeight)\r
104       y = sequencesHeight- boxHeight;\r
105 \r
106 \r
107     if (x < 0)\r
108       x = 0;\r
109 \r
110     if (x > sequencesWidth - boxWidth)\r
111       x = sequencesWidth - boxWidth;\r
112 \r
113     boxX = x;\r
114     boxY = y;\r
115   }\r
116 \r
117   public void updateOverviewImage()\r
118   {\r
119 \r
120   boolean oldRenderGaps = av.renderGaps;\r
121   av.setRenderGaps(false);\r
122    miniMe = null;\r
123    setPreferredSize (new Dimension(sequencesWidth, sequencesHeight+graphHeight));\r
124    sequencesWidth=getWidth();\r
125    sequencesHeight=this.getHeight()-graphHeight;\r
126 \r
127 \r
128     int fullsizeWidth  = av.getAlignment().getWidth() * av.getCharWidth();\r
129     int fullsizeHeight = av.getAlignment().getHeight()* av.getCharHeight();\r
130 \r
131 \r
132     BufferedImage fullSize = new BufferedImage(fullsizeWidth,\r
133                                                fullsizeHeight,\r
134                                                BufferedImage.TYPE_INT_RGB);\r
135 \r
136     BufferedImage consensus = new BufferedImage(fullsizeWidth,\r
137                                                60,\r
138                                                BufferedImage.TYPE_INT_RGB);\r
139 \r
140 \r
141     Graphics g = fullSize.getGraphics();\r
142     ap.seqPanel.seqCanvas.drawPanel(g,0,av.getAlignment().getWidth(),0,av.getAlignment().getHeight(),0,0,0);\r
143 \r
144     g = consensus.getGraphics();\r
145 \r
146     ap.annotationPanel.drawGraph(g, av.conservation, fullsizeWidth, 60);\r
147 \r
148     try{\r
149       miniMe = new BufferedImage(sequencesWidth, sequencesHeight + graphHeight,\r
150                                  BufferedImage.TYPE_INT_RGB);\r
151       Graphics mg = miniMe.getGraphics();\r
152 \r
153       mg.drawImage(fullSize, 0, 0, sequencesWidth, sequencesHeight, 0, 0,\r
154                    fullsizeWidth, fullsizeHeight, this);\r
155       mg.drawImage(consensus, 0, sequencesHeight, sequencesWidth,\r
156                    sequencesHeight + graphHeight, 0, 0, fullsizeWidth, 60, this);\r
157 \r
158       scalew = (float) sequencesWidth / (float) fullsizeWidth;\r
159       scaleh = (float) sequencesHeight / (float) fullsizeHeight;\r
160 \r
161       setBoxPosition();\r
162     }catch(Exception ex)\r
163     {// most likely the frame size is zero\r
164       miniMe = null;\r
165     }\r
166 \r
167     av.setRenderGaps(oldRenderGaps);\r
168 \r
169   }\r
170 \r
171   public void setBoxPosition()\r
172   {\r
173       boxX = (int) (av.getStartRes() * av.getCharWidth() * scalew);\r
174       boxY = (int) (av.getStartSeq() * av.getCharHeight() * scaleh);\r
175       boxWidth = (int) (av.getEndRes() * av.getCharWidth() * scalew) - boxX;\r
176       boxHeight = (int) (av.getEndSeq() * av.getCharHeight() * scaleh) - boxY;\r
177       repaint();\r
178 \r
179   }\r
180 \r
181 \r
182   public void paintComponent(Graphics g)\r
183   {\r
184     g.setColor(Color.white);\r
185     g.fillRect(0,0,getWidth(),getHeight());\r
186     if(miniMe!=null)\r
187       g.drawImage(miniMe, 0,0,this);\r
188 \r
189     g.setColor(Color.red);\r
190 \r
191     g.drawRect(boxX, boxY, boxWidth, boxHeight);\r
192     g.drawRect(boxX+1, boxY+1, boxWidth-2, boxHeight-2);\r
193   }\r
194 \r
195 }\r