Initial size of overview
[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    miniMe = null;\r
120    setPreferredSize (new Dimension(sequencesWidth, sequencesHeight+graphHeight));\r
121    sequencesWidth=getWidth();\r
122    sequencesHeight=this.getHeight()-graphHeight;\r
123 \r
124 \r
125     int fullsizeWidth = (int)(av.getAlignment().getWidth()*av.getCharWidth());\r
126     int fullsizeHeight = av.getAlignment().getHeight()*av.getCharHeight();\r
127 \r
128 \r
129     BufferedImage fullSize = new BufferedImage(fullsizeWidth,\r
130                                                fullsizeHeight,\r
131                                                BufferedImage.TYPE_INT_RGB);\r
132 \r
133     BufferedImage consensus = new BufferedImage(fullsizeWidth,\r
134                                                80,\r
135                                                BufferedImage.TYPE_INT_RGB);\r
136 \r
137 \r
138     Graphics g = fullSize.getGraphics();\r
139     ap.seqPanel.seqCanvas.drawPanel(g,0,av.getAlignment().getWidth(),0,av.getAlignment().getHeight(),0,0,0);\r
140 \r
141     g = consensus.getGraphics();\r
142     ap.scorePanel.drawScorePanel(g, fullsizeWidth, 0, av.getAlignment().getWidth());\r
143 \r
144     try{\r
145       miniMe = new BufferedImage(sequencesWidth, sequencesHeight + graphHeight,\r
146                                  BufferedImage.TYPE_INT_RGB);\r
147       Graphics mg = miniMe.getGraphics();\r
148 \r
149       mg.drawImage(fullSize, 0, 0, sequencesWidth, sequencesHeight, 0, 0,\r
150                    fullsizeWidth, fullsizeHeight, this);\r
151       mg.drawImage(consensus, 0, sequencesHeight, sequencesWidth,\r
152                    sequencesHeight + graphHeight, 0, 0, fullsizeWidth, 60, this);\r
153 \r
154       scalew = (float) sequencesWidth / (float) fullsizeWidth;\r
155       scaleh = (float) sequencesHeight / (float) fullsizeHeight;\r
156 \r
157       setBoxPosition();\r
158     }catch(Exception ex)\r
159     {// most likely the frame size is zero\r
160       miniMe = null;\r
161     }\r
162 \r
163   }\r
164 \r
165   public void setBoxPosition()\r
166   {\r
167       boxX = (int) (av.getStartRes() * av.getCharWidth() * scalew);\r
168       boxY = (int) (av.getStartSeq() * av.getCharHeight() * scaleh);\r
169       boxWidth = (int) (av.getEndRes() * av.getCharWidth() * scalew) - boxX;\r
170       boxHeight = (int) (av.getEndSeq() * av.getCharHeight() * scaleh) - boxY;\r
171       repaint();\r
172 \r
173   }\r
174 \r
175 \r
176   public void paintComponent(Graphics g)\r
177   {\r
178     if(miniMe!=null)\r
179       g.drawImage(miniMe, 0,0,this);\r
180 \r
181     g.setColor(Color.red);\r
182 \r
183     g.drawRect(boxX, boxY, boxWidth, boxHeight);\r
184     g.drawRect(boxX+1, boxY+1, boxWidth-2, boxHeight-2);\r
185   }\r
186 \r
187 }\r