Added OverviewPanel
[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=400, sequencesHeight=150;\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     setSize(sequencesWidth, sequencesHeight+graphHeight);\r
25     setLayout(null);\r
26 \r
27     updateOverviewImage();\r
28 \r
29     addComponentListener(new ComponentAdapter()\r
30    {\r
31 \r
32        public void componentResized(ComponentEvent evt)\r
33        {\r
34          if( getWidth()!=sequencesWidth || getHeight()!=sequencesHeight+graphHeight)\r
35            updateOverviewImage();\r
36        }\r
37    });\r
38 \r
39 \r
40     addMouseMotionListener(new MouseMotionAdapter()\r
41            {\r
42              public void mouseDragged(MouseEvent evt)\r
43              { doMouseDragged(evt);}\r
44            });\r
45 \r
46     addMouseListener(new MouseAdapter()\r
47     {\r
48       public void mousePressed(MouseEvent evt)\r
49       { doMousePressed(evt);}\r
50       public void mouseReleased(MouseEvent evt)\r
51       { doMouseReleased(evt);}\r
52     });\r
53 \r
54   }\r
55 \r
56   public void doMousePressed(MouseEvent evt)\r
57   {\r
58     checkValid(evt.getX(), evt.getY());\r
59     repaint();\r
60   }\r
61 \r
62   public void doMouseReleased(MouseEvent evt)\r
63   {\r
64     int x = evt.getX();\r
65     int y = evt.getY();\r
66     checkValid(x, y);\r
67     ap.setScrollValues( (int)(x/scalew/av.getCharWidth()), (int)(y/scaleh/av.getCharHeight()) );\r
68   }\r
69 \r
70   public void doMouseDragged(MouseEvent evt)\r
71   {\r
72     int x = evt.getX();\r
73     int y = evt.getY();\r
74     checkValid(x, y);\r
75     ap.setScrollValues( (int)(x/scalew/av.getCharWidth()), (int)(y/scaleh/av.getCharHeight()) );\r
76     repaint();\r
77   }\r
78 \r
79   void checkValid(int x, int y)\r
80   {\r
81 \r
82     if (y < 0)\r
83       y = 0;\r
84     if (y > sequencesHeight - boxHeight)\r
85       y = sequencesHeight- boxHeight;\r
86 \r
87 \r
88     if (x < 0)\r
89       x = 0;\r
90 \r
91     if (x > sequencesWidth - boxWidth)\r
92       x = sequencesWidth - boxWidth;\r
93 \r
94     boxX = x;\r
95     boxY = y;\r
96   }\r
97 \r
98   public void updateOverviewImage()\r
99   {\r
100    miniMe = null;\r
101    setPreferredSize (new Dimension(sequencesWidth, sequencesHeight+graphHeight));\r
102    sequencesWidth=getWidth();\r
103    sequencesHeight=this.getHeight()-graphHeight;\r
104 \r
105 \r
106     int fullsizeWidth = (int)(av.getAlignment().getWidth()*av.getCharWidth());\r
107     int fullsizeHeight = av.getAlignment().getHeight()*av.getCharHeight();\r
108 \r
109 \r
110     BufferedImage fullSize = new BufferedImage(fullsizeWidth,\r
111                                                fullsizeHeight,\r
112                                                BufferedImage.TYPE_INT_RGB);\r
113 \r
114     BufferedImage consensus = new BufferedImage(fullsizeWidth,\r
115                                                80,\r
116                                                BufferedImage.TYPE_INT_RGB);\r
117 \r
118 \r
119     Graphics g = fullSize.getGraphics();\r
120     ap.seqPanel.seqCanvas.drawPanel(g,0,av.getAlignment().getWidth(),0,av.getAlignment().getHeight(),0,0,0);\r
121 \r
122     g = consensus.getGraphics();\r
123     ap.scorePanel.drawScorePanel(g, fullsizeWidth, 0, av.getAlignment().getWidth());\r
124 \r
125     try{\r
126       miniMe = new BufferedImage(sequencesWidth, sequencesHeight + graphHeight,\r
127                                  BufferedImage.TYPE_INT_RGB);\r
128       Graphics mg = miniMe.getGraphics();\r
129 \r
130       mg.drawImage(fullSize, 0, 0, sequencesWidth, sequencesHeight, 0, 0,\r
131                    fullsizeWidth, fullsizeHeight, this);\r
132       mg.drawImage(consensus, 0, sequencesHeight, sequencesWidth,\r
133                    sequencesHeight + graphHeight, 0, 0, fullsizeWidth, 60, this);\r
134 \r
135       scalew = (float) sequencesWidth / (float) fullsizeWidth;\r
136       scaleh = (float) sequencesHeight / (float) fullsizeHeight;\r
137 \r
138       setBoxPosition();\r
139     }catch(Exception ex)\r
140     {// most likely the frame size is zero\r
141       miniMe = null;\r
142     }\r
143 \r
144   }\r
145 \r
146   public void setBoxPosition()\r
147   {\r
148       boxX = (int) (av.getStartRes() * av.getCharWidth() * scalew);\r
149       boxY = (int) (av.getStartSeq() * av.getCharHeight() * scaleh);\r
150       boxWidth = (int) (av.getEndRes() * av.getCharWidth() * scalew) - boxX;\r
151       boxHeight = (int) (av.getEndSeq() * av.getCharHeight() * scaleh) - boxY;\r
152       repaint();\r
153 \r
154   }\r
155 \r
156 \r
157   public void paintComponent(Graphics g)\r
158   {\r
159     if(miniMe!=null)\r
160       g.drawImage(miniMe, 0,0,this);\r
161 \r
162     g.setColor(Color.red);\r
163 \r
164     g.drawRect(boxX, boxY, boxWidth, boxHeight);\r
165     g.drawRect(boxX+1, boxY+1, boxWidth-2, boxHeight-2);\r
166   }\r
167 \r
168 }\r