2 // forester -- software libraries and applications
3 // for genomics and evolutionary biology research.
5 // Copyright (C) 2010 Christian M Zmasek
6 // Copyright (C) 2010 Sanford-Burnham Medical Research Institute
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU Lesser General Public
11 // License as published by the Free Software Foundation; either
12 // version 2.1 of the License, or (at your option) any later version.
14 // This library is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 // Lesser General Public License for more details.
19 // You should have received a copy of the GNU Lesser General Public
20 // License along with this library; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 // Contact: phylosoft @ gmail . com
24 // WWW: www.phylosoft.org/forester
26 package org.forester.development;
28 import java.awt.Color;
29 import java.awt.Dimension;
30 import java.awt.Graphics;
31 import java.awt.event.MouseAdapter;
32 import java.awt.event.MouseEvent;
33 import java.awt.event.MouseMotionAdapter;
35 import javax.swing.JComponent;
37 import org.forester.msa.Msa;
39 public class MsaRenderer extends JComponent {
41 private static final long serialVersionUID = -68078011081748093L;
43 public static boolean isMouseEventAltered( final MouseEvent event ) {
44 return event.isShiftDown() || event.isAltDown() || event.isControlDown() || event.isAltGraphDown()
45 || event.isMetaDown();
47 //private PlateDisplayPanel _heatMapPanel;
48 private final int _rows;
49 private final int _columns;
50 private int _wellSize;
51 private AbstractRenderer _wells[][];
55 private Color _minColor;
56 private Color _maxColor;
57 private Color _meanColor;
58 private boolean _useMean;
59 // private Rubberband _rubberband;
60 private final Msa _msa;
61 private final JComponent _parent;
63 public MsaRenderer( final Msa msa, final int unit_size, final JComponent parent ) {
66 _rows = _msa.getNumberOfSequences();
67 _columns = _msa.getLength();
68 setWellSize( unit_size );
71 //setRubberband( new RubberbandRectangle( this ) );
74 private void addMouseListeners() {
75 addMouseMotionListener( new MouseMotionAdapter() {
78 public void mouseDragged( final MouseEvent event ) {
79 // if ( ( ( event.getModifiers() & 0x10 ) != 0 ) && getRubberband().isActive()
80 // && !PlateRenderer.isMouseEventAltered( event ) ) {
81 // getRubberband().stretch( event.getPoint() );
85 addMouseListener( new MouseAdapter() {
88 public void mouseClicked( final MouseEvent event ) {
89 // if ( ( ( event.getModifiers() & 4 ) != 0 ) || PlateRenderer.isMouseEventAltered( event ) ) {
90 // getInfo( new Rectangle( event.getX(), event.getY(), 1, 1 ) );
93 // changeSelected( new Rectangle( event.getX(), event.getY(), 1, 1 ), true );
99 public void mousePressed( final MouseEvent event ) {
100 // if ( ( ( event.getModifiers() & 4 ) != 0 ) || PlateRenderer.isMouseEventAltered( event ) ) {
101 // getInfo( new Rectangle( event.getX(), event.getY(), 1, 1 ) );
103 // if ( ( ( event.getModifiers() & 0x10 ) != 0 ) && getRubberband().isActive() ) {
104 // getRubberband().anchor( event.getPoint() );
109 public void mouseReleased( final MouseEvent event ) {
110 // if ( ( ( event.getModifiers() & 0x10 ) != 0 ) && getRubberband().isActive() ) {
111 // getRubberband().end( event.getPoint() );
112 // rubberbandEnded( getRubberband() );
118 public AbstractRenderer getAbstractRenderer( final int row, final int col ) {
119 return _wells[ row ][ col ];
122 public int getColumns() {
126 private double getMax() {
130 private Color getMaxColor() {
134 private double getMean() {
138 private Color getMeanColor() {
142 private double getMin() {
146 private Color getMinColor() {
151 public Dimension getPreferredSize() {
152 final int width = ( getWellSize() + 1 ) * ( getColumns() + 1 );
153 final int hight = ( getWellSize() + 1 ) * ( getRows() + 1 ) + 30;
154 return new Dimension( width, hight );
157 public int getRows() {
161 // private Rubberband getRubberband() {
162 // return _rubberband;
164 private int getWellSize() {
168 private void initializeWells() {
169 _wells = new AbstractRenderer[ getRows() + 1 ][ getColumns() + 1 ];
170 for( int row = 0; row < getRows(); row++ ) {
171 for( int col = 0; col < getColumns() + 1; col++ ) {
173 if ( col == getColumns() ) {
174 // r = new LabelRenderer( PlateData.ALPHABET[ row % PlateData.ALPHABET.length ] + "", this );
176 //else if ( getPlateData().getData( row, col ) == null ) {
177 // r = new WellRenderer( new WellData(), this );
180 r = new ResidueRenderer( getMsa().getResidueAt( row, col ), this );
182 // r.setVisible( true );
183 // setAbstractRenderer( r, row, col );
186 for( int col = 0; col < getColumns() + 1; col++ ) {
187 // AbstractRenderer r;
188 if ( col == getColumns() ) {
189 // r = new LabelRenderer( "", this );
192 // r = new LabelRenderer( ( col + 1 ) + "", this );
194 // r.setVisible( true );
195 // setAbstractRenderer( r, getRows(), col );
199 private Msa getMsa() {
203 public void inverseMarkedOfWell( final int well_row, final int well_col ) {
204 final ResidueRenderer rend = ( ResidueRenderer ) getAbstractRenderer( well_row, well_col );
205 if ( rend.isMarked() ) {
206 rend.setIsMarked( false );
209 rend.setIsMarked( true );
213 private boolean isUseMean() {
218 public void paint( final Graphics g ) {
219 g.setColor( Color.white );
220 // g.setFont( getPlateDisplayPanel().getPlateTitleFont() );
222 // .drawString( "Number:" + getPlateData().getName() + " Replicate:"
223 // + ( getPlateData().getReplicateNumber() + 1 ), 10, 20 );
224 for( int row = 0; row < getRows() + 1; row++ ) {
225 for( int col = 0; col < getColumns() + 1; col++ ) {
226 getAbstractRenderer( row, col ).paint( g );
231 public void resetWellColors() {
232 for( int row = 0; row < getRows(); row++ ) {
233 for( int col = 0; col < getColumns(); col++ ) {
234 final ResidueRenderer r = ( ResidueRenderer ) getAbstractRenderer( row, col );
236 r.resetWellColor( getMin(), getMax(), getMean(), getMinColor(), getMaxColor(), getMeanColor() );
239 r.resetWellColor( getMin(), getMax(), getMinColor(), getMaxColor() );
245 public void resetWellSize( final int well_size ) {
246 setWellSize( well_size );
247 final int factor = well_size + 0;
248 for( int row = 0; row < getRows() + 1; row++ ) {
249 for( int col = 0; col < getColumns() + 1; col++ ) {
250 final AbstractRenderer r = getAbstractRenderer( row, col );
251 r.setX( 10 + factor * col );
252 r.setY( factor * row + 30 );
253 r.setWellSize( well_size );
258 // private void rubberbandEnded( final Rubberband rb ) {
259 // changeSelected( rb.getBounds(), false );
262 private void setAbstractRenderer( final AbstractRenderer ar, final int row, final int col ) {
263 _wells[ row ][ col ] = ar;
266 public void setFlaggedStatusOfOutlierWells( final boolean set_flagged_to_this ) {
267 for( int row = 0; row < getRows(); row++ ) {
268 for( int col = 0; col < getColumns(); col++ ) {
269 final ResidueRenderer wr = ( ResidueRenderer ) getAbstractRenderer( row, col );
270 // if ( wr.isFlaggedByStatisticalAnalysis() ) {
271 // wr.setIsUserFlagged( set_flagged_to_this );
277 public void setFlaggedStatusOfSelectedWells( final boolean set_flagged_to_this ) {
278 for( int row = 0; row < getRows(); row++ ) {
279 for( int col = 0; col < getColumns(); col++ ) {
280 final ResidueRenderer wr = ( ResidueRenderer ) getAbstractRenderer( row, col );
281 if ( wr.isSelected() ) {
282 // wr.setIsUserFlagged( set_flagged_to_this );
283 wr.setIsSelected( false );
289 public void setIsFlaggingStatusChangedToFalse() {
290 for( int row = 0; row < getRows(); row++ ) {
291 for( int col = 0; col < getColumns(); col++ ) {
292 final ResidueRenderer wr = ( ResidueRenderer ) getAbstractRenderer( row, col );
293 // wr.setIsFlaggingStatusChanged( false );
298 private void setIsSelectedOfAll( final boolean isSelected ) {
299 for( int col = 0; col < getColumns() + 1; col++ ) {
300 setIsSelectedOfColumn( col, isSelected );
304 private void setIsSelectedOfColumn( final int column, final boolean isSelected ) {
305 for( int row = 0; row < getRows() + 1; row++ ) {
306 getAbstractRenderer( row, column ).setIsSelected( isSelected );
310 private void setIsSelectedOfRow( final int row, final boolean isSelected ) {
311 for( int col = 0; col < getColumns() + 1; col++ ) {
312 getAbstractRenderer( row, col ).setIsSelected( isSelected );
316 private void setIsSelectedOfRowAlternating( final int row, final boolean even ) {
317 boolean selected = even;
318 for( int col = 0; col < getColumns(); col++ ) {
319 getAbstractRenderer( row, col ).setIsSelected( selected );
320 selected = !selected;
324 private void setIsSelectedToQuarter( final int quarter ) {
325 boolean evenRow = false;
326 boolean evenColumn = false;
327 if ( quarter <= 1 ) {
331 else if ( quarter == 2 ) {
334 else if ( quarter == 3 ) {
337 for( int row = 0; row < getRows(); row++ ) {
339 setIsSelectedOfRowAlternating( row, evenRow );
342 setIsSelectedOfRow( row, false );
344 evenColumn = !evenColumn;
348 public void setMarkedOfAllWellsToFalse() {
349 for( int row = 0; row < getRows(); row++ ) {
350 for( int col = 0; col < getColumns(); col++ ) {
351 final ResidueRenderer wr = ( ResidueRenderer ) getAbstractRenderer( row, col );
352 // rend.setIsMarked( false );
357 public void setMax( final double max ) {
361 void setMaxColor( final Color maxColor ) {
362 _maxColor = maxColor;
365 void setMean( final double mean ) {
369 public void setMeanColor( final Color meanColor ) {
370 _meanColor = meanColor;
373 public void setMin( final double min ) {
377 void setMinColor( final Color minColor ) {
378 _minColor = minColor;
381 // private void setRubberband( final Rubberband rb ) {
382 // if ( _rubberband != null ) {
383 // _rubberband.setActive( false );
386 // if ( _rubberband != null ) {
387 // _rubberband.setComponent( this );
388 // _rubberband.setActive( true );
391 public void setUseMean( final boolean useMean ) {
395 private void setWellSize( final int wellSize ) {
396 _wellSize = wellSize;
399 public void unSelectUnMarkAll() {
400 for( int row = 0; row < getRows(); row++ ) {
401 for( int col = 0; col < getColumns(); col++ ) {
402 final ResidueRenderer wr = ( ResidueRenderer ) getAbstractRenderer( row, col );
403 wr.setIsSelected( false );
404 wr.setIsMarked( false );