3 import javax.swing.*;
\r
4 import java.awt.event.*;
\r
5 import java.awt.image.*;
\r
8 public class OverviewPanel extends JPanel implements Runnable
\r
10 BufferedImage miniMe;
\r
16 int width, sequencesHeight;
\r
18 int boxX=-1, boxY=-1, boxWidth=-1, boxHeight=-1;
\r
20 boolean resizing = false;
\r
22 public OverviewPanel(AlignmentPanel ap)
\r
28 // scale the initial size of overviewpanel to shape of alignment
\r
29 float initialScale = (float)av.alignment.getWidth()/(float)av.alignment.getHeight();
\r
30 if(av.alignment.getWidth() > av.alignment.getHeight())
\r
34 sequencesHeight = (int)(400f/initialScale);
\r
39 width = (int)(400f*initialScale);
\r
40 sequencesHeight = 300;
\r
45 addComponentListener(new ComponentAdapter()
\r
48 public void componentResized(ComponentEvent evt)
\r
50 if( getWidth()!=width || getHeight()!=sequencesHeight+graphHeight)
\r
52 updateOverviewImage();
\r
57 addMouseMotionListener(new MouseMotionAdapter()
\r
59 public void mouseDragged(MouseEvent evt)
\r
60 { doMouseDragged(evt);}
\r
63 addMouseListener(new MouseAdapter()
\r
65 public void mousePressed(MouseEvent evt)
\r
66 { doMousePressed(evt);}
\r
67 public void mouseReleased(MouseEvent evt)
\r
68 { doMouseReleased(evt);}
\r
71 updateOverviewImage();
\r
75 public void doMousePressed(MouseEvent evt)
\r
84 public void doMouseReleased(MouseEvent evt)
\r
90 ap.setScrollValues( (int)(boxX/scalew/av.getCharWidth()),
\r
91 (int)(boxY/scaleh/av.getCharHeight()) );
\r
94 public void doMouseDragged(MouseEvent evt)
\r
100 ap.setScrollValues( (int)(boxX/scalew/av.getCharWidth()),
\r
101 (int)(boxY/scaleh/av.getCharHeight()) );
\r
109 if (boxY > sequencesHeight - boxHeight)
\r
110 boxY = sequencesHeight - boxHeight+1;
\r
115 if (boxX > width - boxWidth)
\r
116 boxX = width - boxWidth;
\r
119 public void updateOverviewImage()
\r
127 Thread thread = new Thread(this);
\r
135 int alwidth = av.alignment.getWidth();
\r
136 int alheight = av.alignment.getHeight();
\r
138 if(getWidth()>0 && getHeight()>0)
\r
140 width = getWidth();
\r
141 sequencesHeight = getHeight() - graphHeight;
\r
144 setPreferredSize (new Dimension(width, sequencesHeight+graphHeight));
\r
146 int fullsizeWidth = alwidth * av.getCharWidth();
\r
147 int fullsizeHeight = alheight * av.getCharHeight();
\r
149 scalew = (float) width / (float) fullsizeWidth;
\r
150 scaleh = (float) sequencesHeight / (float) fullsizeHeight;
\r
152 miniMe = new BufferedImage(width, sequencesHeight + graphHeight,
\r
153 BufferedImage.TYPE_INT_RGB);
\r
155 Graphics mg = miniMe.getGraphics();
\r
156 BufferedImage consensus = new BufferedImage(fullsizeWidth,
\r
158 BufferedImage.TYPE_3BYTE_BGR);
\r
159 Graphics g = consensus.getGraphics();
\r
160 ap.annotationPanel.drawGraph(g, av.conservation, fullsizeWidth, 60);
\r
161 mg.drawImage(consensus, 0, sequencesHeight, width,
\r
162 sequencesHeight + graphHeight, 0, 0, fullsizeWidth, 60, this);
\r
165 boolean oldRenderGaps = av.renderGaps;
\r
167 // We'll have to draw the full size alignment in chunks, as an image of the
\r
168 // whole alignment requires too much memory
\r
170 // Max size depends on the font size, the following is a
\r
171 // guess at a size which works
\r
172 int maxSize = 2000 / av.getFont().getSize();
\r
173 BufferedImage block;
\r
174 int blockx=0, blocky=0, blockw=0, blockh=0, eRes=0, eSeq=0;
\r
176 av.setRenderGaps(false);
\r
177 for(int sRes=0, chunkx=0; sRes<alwidth; sRes+=maxSize, chunkx++)
\r
184 for(int sSeq=0, chunky=0; sSeq<alheight; sSeq+=maxSize, chunky++)
\r
191 blockx = (int)((float)sRes/(float)alwidth * width);
\r
193 block = new BufferedImage((eRes-sRes)*av.charWidth,
\r
194 (eSeq-sSeq)*av.charHeight,
\r
195 BufferedImage.TYPE_3BYTE_BGR);
\r
196 g = block.getGraphics();
\r
198 ap.seqPanel.seqCanvas.drawPanel(g, sRes, eRes, sSeq, eSeq, sRes, sSeq, 0);
\r
200 blockh = (int)( (float)(eSeq-sSeq)/(float)alheight * sequencesHeight )+1 ;
\r
201 blockw = (int)( (float)(eRes-sRes)/(float)alwidth * width )+1;
\r
203 blocky += (int) ((float)sSeq/(float)alheight* sequencesHeight);
\r
205 mg.drawImage(block, blockx,
\r
210 0, 0, block.getWidth(),block.getHeight(), this);
\r
217 }catch(OutOfMemoryError error)
\r
218 { System.err.println("Out of memory when trying to calculate the overview window image!"); }
\r
221 av.setRenderGaps(oldRenderGaps);
\r
227 public void setBoxPosition()
\r
229 boxX = (int) (av.getStartRes() * av.getCharWidth() * scalew);
\r
230 boxY = (int) (av.getStartSeq() * av.getCharHeight() * scaleh);
\r
231 boxWidth = (int) ((av.getEndRes()-av.getStartRes()+1)* av.getCharWidth() * scalew) ;
\r
232 boxHeight = (int) (av.getEndSeq() * av.getCharHeight() * scaleh) - boxY;
\r
237 public void paintComponent(Graphics g)
\r
239 g.setColor(Color.white);
\r
240 g.fillRect(0,0,getWidth(),getHeight());
\r
241 g.setColor(Color.black);
\r
245 g.setFont(new Font("Verdana", Font.BOLD, 15));
\r
246 g.drawString("Recalculating", 5, sequencesHeight/2);
\r
247 g.drawString("Overview.....", 5, sequencesHeight/2 +20);
\r
252 g.drawImage(miniMe, 0,0,this);
\r
254 g.setColor(Color.red);
\r
255 g.drawRect(boxX, boxY, boxWidth, boxHeight);
\r
256 g.drawRect(boxX+1, boxY+1, boxWidth-2, boxHeight-2);
\r