clean up
[jalview.git] / forester / java / src / org / forester / development / MsaRenderer.java
1 // $Id:
2 // forester -- software libraries and applications
3 // for genomics and evolutionary biology research.
4 //
5 // Copyright (C) 2010 Christian M Zmasek
6 // Copyright (C) 2010 Sanford-Burnham Medical Research Institute
7 // All rights reserved
8 //
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.
13 //
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.
18 //
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
22 //
23 // Contact: phylosoft @ gmail . com
24 // WWW: www.phylosoft.org/forester
25
26 package org.forester.development;
27
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;
34
35 import javax.swing.JComponent;
36
37 import org.forester.msa.Msa;
38
39 public class MsaRenderer extends JComponent {
40
41     private static final long serialVersionUID = -68078011081748093L;
42
43     public static boolean isMouseEventAltered( final MouseEvent event ) {
44         return event.isShiftDown() || event.isAltDown() || event.isControlDown() || event.isAltGraphDown()
45                 || event.isMetaDown();
46     }
47     //private PlateDisplayPanel _heatMapPanel;
48     private final int        _rows;
49     private final int        _columns;
50     private int              _wellSize;
51     private AbstractRenderer _wells[][];
52     private double           _min;
53     private double           _max;
54     private double           _mean;
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;
62
63     public MsaRenderer( final Msa msa, final int unit_size, final JComponent parent ) {
64         _parent = parent;
65         _msa = msa;
66         _rows = _msa.getNumberOfSequences();
67         _columns = _msa.getLength();
68         setWellSize( unit_size );
69         addMouseListeners();
70         initializeWells();
71         //setRubberband( new RubberbandRectangle( this ) );
72     }
73
74     private void addMouseListeners() {
75         addMouseMotionListener( new MouseMotionAdapter() {
76
77             @Override
78             public void mouseDragged( final MouseEvent event ) {
79                 //  if ( ( ( event.getModifiers() & 0x10 ) != 0 ) && getRubberband().isActive()
80                 //          && !PlateRenderer.isMouseEventAltered( event ) ) {
81                 //     getRubberband().stretch( event.getPoint() );
82                 // }
83             }
84         } );
85         addMouseListener( new MouseAdapter() {
86
87             @Override
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 ) );
91                 //   }
92                 //   else {
93                 //   changeSelected( new Rectangle( event.getX(), event.getY(), 1, 1 ), true );
94                 //      event.consume();
95                 //  }
96             }
97
98             @Override
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 ) );
102                 // }
103                 // if ( ( ( event.getModifiers() & 0x10 ) != 0 ) && getRubberband().isActive() ) {
104                 //     getRubberband().anchor( event.getPoint() );
105                 // }
106             }
107
108             @Override
109             public void mouseReleased( final MouseEvent event ) {
110                 // if ( ( ( event.getModifiers() & 0x10 ) != 0 ) && getRubberband().isActive() ) {
111                 //     getRubberband().end( event.getPoint() );
112                 //     rubberbandEnded( getRubberband() );
113                 // }
114             }
115         } );
116     }
117
118     public AbstractRenderer getAbstractRenderer( final int row, final int col ) {
119         return _wells[ row ][ col ];
120     }
121
122     public int getColumns() {
123         return _columns;
124     }
125
126     private double getMax() {
127         return _max;
128     }
129
130     private Color getMaxColor() {
131         return _maxColor;
132     }
133
134     private double getMean() {
135         return _mean;
136     }
137
138     private Color getMeanColor() {
139         return _meanColor;
140     }
141
142     private double getMin() {
143         return _min;
144     }
145
146     private Color getMinColor() {
147         return _minColor;
148     }
149
150     @Override
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 );
155     }
156
157     public int getRows() {
158         return _rows;
159     }
160
161     //  private Rubberband getRubberband() {
162     //      return _rubberband;
163     //  }
164     private int getWellSize() {
165         return _wellSize;
166     }
167
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++ ) {
172                 AbstractRenderer r;
173                 if ( col == getColumns() ) {
174                     //  r = new LabelRenderer( PlateData.ALPHABET[ row % PlateData.ALPHABET.length ] + "", this );
175                 }
176                 //else if ( getPlateData().getData( row, col ) == null ) {
177                 //    r = new WellRenderer( new WellData(), this );
178                 // }
179                 else {
180                     r = new ResidueRenderer( getMsa().getResidueAt( row, col ), this );
181                 }
182                 //  r.setVisible( true );
183                 //  setAbstractRenderer( r, row, col );
184             }
185         }
186         for( int col = 0; col < getColumns() + 1; col++ ) {
187             //  AbstractRenderer r;
188             if ( col == getColumns() ) {
189                 //      r = new LabelRenderer( "", this );
190             }
191             else {
192                 //       r = new LabelRenderer( ( col + 1 ) + "", this );
193             }
194             //  r.setVisible( true );
195             // setAbstractRenderer( r, getRows(), col );
196         }
197     }
198
199     private Msa getMsa() {
200         return _msa;
201     }
202
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 );
207         }
208         else {
209             rend.setIsMarked( true );
210         }
211     }
212
213     private boolean isUseMean() {
214         return _useMean;
215     }
216
217     @Override
218     public void paint( final Graphics g ) {
219         g.setColor( Color.white );
220         //   g.setFont( getPlateDisplayPanel().getPlateTitleFont() );
221         // g
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 );
227             }
228         }
229     }
230
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 );
235                 if ( isUseMean() ) {
236                     r.resetWellColor( getMin(), getMax(), getMean(), getMinColor(), getMaxColor(), getMeanColor() );
237                 }
238                 else {
239                     r.resetWellColor( getMin(), getMax(), getMinColor(), getMaxColor() );
240                 }
241             }
242         }
243     }
244
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 );
254             }
255         }
256     }
257
258     //  private void rubberbandEnded( final Rubberband rb ) {
259     // changeSelected( rb.getBounds(), false );
260     //     repaint();
261     // }
262     private void setAbstractRenderer( final AbstractRenderer ar, final int row, final int col ) {
263         _wells[ row ][ col ] = ar;
264     }
265
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 );
272                 //  }
273             }
274         }
275     }
276
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 );
284                 }
285             }
286         }
287     }
288
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 );
294             }
295         }
296     }
297
298     private void setIsSelectedOfAll( final boolean isSelected ) {
299         for( int col = 0; col < getColumns() + 1; col++ ) {
300             setIsSelectedOfColumn( col, isSelected );
301         }
302     }
303
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 );
307         }
308     }
309
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 );
313         }
314     }
315
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;
321         }
322     }
323
324     private void setIsSelectedToQuarter( final int quarter ) {
325         boolean evenRow = false;
326         boolean evenColumn = false;
327         if ( quarter <= 1 ) {
328             evenRow = true;
329             evenColumn = true;
330         }
331         else if ( quarter == 2 ) {
332             evenColumn = true;
333         }
334         else if ( quarter == 3 ) {
335             evenRow = true;
336         }
337         for( int row = 0; row < getRows(); row++ ) {
338             if ( evenColumn ) {
339                 setIsSelectedOfRowAlternating( row, evenRow );
340             }
341             else {
342                 setIsSelectedOfRow( row, false );
343             }
344             evenColumn = !evenColumn;
345         }
346     }
347
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 );
353             }
354         }
355     }
356
357     public void setMax( final double max ) {
358         _max = max;
359     }
360
361     void setMaxColor( final Color maxColor ) {
362         _maxColor = maxColor;
363     }
364
365     void setMean( final double mean ) {
366         _mean = mean;
367     }
368
369     public void setMeanColor( final Color meanColor ) {
370         _meanColor = meanColor;
371     }
372
373     public void setMin( final double min ) {
374         _min = min;
375     }
376
377     void setMinColor( final Color minColor ) {
378         _minColor = minColor;
379     }
380
381     //    private void setRubberband( final Rubberband rb ) {
382     //        if ( _rubberband != null ) {
383     //            _rubberband.setActive( false );
384     //        }
385     //        _rubberband = rb;
386     //        if ( _rubberband != null ) {
387     //            _rubberband.setComponent( this );
388     //            _rubberband.setActive( true );
389     //        }
390     //    }
391     public void setUseMean( final boolean useMean ) {
392         _useMean = useMean;
393     }
394
395     private void setWellSize( final int wellSize ) {
396         _wellSize = wellSize;
397     }
398
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 );
405             }
406         }
407     }
408 }