mev-4.0.01/source/org/tigr/microarray/mev/cgh/CGHGuiObj/CGHPositionGraph/CGHPositionGraphCombinedCanvas.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2  * CGHPositionGraphCombinedCanvas.java
2 26 Feb 07 jari 3  *
2 26 Feb 07 jari 4  * Created on March 20, 2003, 12:04 AM
2 26 Feb 07 jari 5  */
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 package org.tigr.microarray.mev.cgh.CGHGuiObj.CGHPositionGraph;
2 26 Feb 07 jari 8
2 26 Feb 07 jari 9 import java.awt.Dimension;
2 26 Feb 07 jari 10 import java.awt.Font;
2 26 Feb 07 jari 11 import java.awt.Graphics;
2 26 Feb 07 jari 12 import java.awt.Graphics2D;
2 26 Feb 07 jari 13 import java.awt.Insets;
2 26 Feb 07 jari 14 import java.awt.Point;
2 26 Feb 07 jari 15 import java.awt.Rectangle;
2 26 Feb 07 jari 16 import java.awt.event.ActionListener;
2 26 Feb 07 jari 17 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 18
2 26 Feb 07 jari 19 import org.tigr.microarray.mev.cgh.CGHDataModel.CGHBrowserModelAdaptor;
2 26 Feb 07 jari 20 import org.tigr.microarray.mev.cgh.CGHDataObj.CGHClone;
2 26 Feb 07 jari 21 import org.tigr.microarray.mev.cgh.CGHDataObj.CGHDataRegionInfo;
2 26 Feb 07 jari 22 import org.tigr.microarray.mev.cgh.CGHDataObj.FlankingRegion;
2 26 Feb 07 jari 23 import org.tigr.microarray.mev.cgh.CGHDataObj.ICGHDataRegion;
2 26 Feb 07 jari 24 import org.tigr.microarray.mev.cgh.CGHGuiObj.GuiUtil.PositionDataRegionClickedPopup;
2 26 Feb 07 jari 25 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 26
2 26 Feb 07 jari 27 /**
2 26 Feb 07 jari 28  *
2 26 Feb 07 jari 29  * @author  Adam Margolin
2 26 Feb 07 jari 30  * @author Raktim Sinha
2 26 Feb 07 jari 31  */
2 26 Feb 07 jari 32
2 26 Feb 07 jari 33 public class CGHPositionGraphCombinedCanvas extends CGHPositionGraphCanvas implements ActionListener{
2 26 Feb 07 jari 34
2 26 Feb 07 jari 35     PositionDataRegionClickedPopup regionClickedPopup;
2 26 Feb 07 jari 36
2 26 Feb 07 jari 37     IData data;
2 26 Feb 07 jari 38
2 26 Feb 07 jari 39     int annotationsRectWidth = 10;
2 26 Feb 07 jari 40
2 26 Feb 07 jari 41     public static final int COLUMN_NOT_FOUND = -1;
2 26 Feb 07 jari 42     public static final int ANNOTATIONS_COLUMN = -2;
2 26 Feb 07 jari 43
2 26 Feb 07 jari 44     /** Creates a new instance of CGHPositionGraphCombinedCanvas */
2 26 Feb 07 jari 45     public CGHPositionGraphCombinedCanvas(Insets insets) {
2 26 Feb 07 jari 46         super(insets);
2 26 Feb 07 jari 47         regionClickedPopup = new PositionDataRegionClickedPopup(this);
2 26 Feb 07 jari 48     }
2 26 Feb 07 jari 49
2 26 Feb 07 jari 50     public void paint(Graphics g) {
2 26 Feb 07 jari 51         super.paint(g);
2 26 Feb 07 jari 52
2 26 Feb 07 jari 53         Graphics2D g2D = (Graphics2D)g;
2 26 Feb 07 jari 54
2 26 Feb 07 jari 55         drawColumns(g2D);
2 26 Feb 07 jari 56     }
2 26 Feb 07 jari 57
2 26 Feb 07 jari 58     private void drawColumns(Graphics2D g) {
2 26 Feb 07 jari 59
2 26 Feb 07 jari 60         for (int column = 0; column < model.getNumExperiments(); column++) {
2 26 Feb 07 jari 61             int columnIndex = model.getExperimentIndexAt(column);
2 26 Feb 07 jari 62             drawColumn(g, columnIndex);
2 26 Feb 07 jari 63         }
2 26 Feb 07 jari 64
2 26 Feb 07 jari 65         drawAnnotations(g);
2 26 Feb 07 jari 66     }
2 26 Feb 07 jari 67
2 26 Feb 07 jari 68     /**
2 26 Feb 07 jari 69      * Draws a specified column.
2 26 Feb 07 jari 70      */
2 26 Feb 07 jari 71     private void drawColumn(Graphics2D g, int column) {
2 26 Feb 07 jari 72         int columnIndex = model.getExperimentIndexAt(column);
2 26 Feb 07 jari 73
2 26 Feb 07 jari 74         for (int row = 0; row < model.getNumElements(); row++) {
2 26 Feb 07 jari 75             drawSlideDataElement(g, row, column, columnIndex);
2 26 Feb 07 jari 76         }
2 26 Feb 07 jari 77
2 26 Feb 07 jari 78         if(showFlankingRegions){
2 26 Feb 07 jari 79             for(int flankingRegion = 0; flankingRegion < model.getNumFlankingRegions(columnIndex); flankingRegion++){
2 26 Feb 07 jari 80                 drawFlankingRegion(g, flankingRegion, column, columnIndex);
2 26 Feb 07 jari 81             }
2 26 Feb 07 jari 82         }
2 26 Feb 07 jari 83     }
2 26 Feb 07 jari 84
2 26 Feb 07 jari 85     private void drawSlideDataElement(Graphics2D g2, final int row, int column, int columnIndex) {
2 26 Feb 07 jari 86
2 26 Feb 07 jari 87         int cloneStart = model.getStart(row);
2 26 Feb 07 jari 88         int cloneStop = model.getStop(row);
2 26 Feb 07 jari 89
2 26 Feb 07 jari 90         Dimension d = getSize();
2 26 Feb 07 jari 91
2 26 Feb 07 jari 92         double width = d.width;
2 26 Feb 07 jari 93         double height = d.height - 50;
2 26 Feb 07 jari 94
2 26 Feb 07 jari 95         double maxVal = model.getMaxClonePosition();
2 26 Feb 07 jari 96
2 26 Feb 07 jari 97         int rectX = insets.left + column * (elementWidth + rectSpacing);
2 26 Feb 07 jari 98         int rectY = (int) (insets.top + cloneStart * unitLength);
2 26 Feb 07 jari 99         double dRectHeight = (cloneStop - cloneStart) * unitLength;
2 26 Feb 07 jari 100         int rectHeight;
2 26 Feb 07 jari 101         if(dRectHeight < 1 && dRectHeight > 0){
2 26 Feb 07 jari 102             rectHeight = 1;
2 26 Feb 07 jari 103         }else{
2 26 Feb 07 jari 104             rectHeight = (int)dRectHeight;
2 26 Feb 07 jari 105         }
2 26 Feb 07 jari 106
2 26 Feb 07 jari 107         Rectangle curRect = new Rectangle(rectX, rectY, elementWidth, rectHeight);
2 26 Feb 07 jari 108
2 26 Feb 07 jari 109         g2.setPaint(model.getDataPointColor(row, columnIndex));
2 26 Feb 07 jari 110         g2.fill(curRect);
2 26 Feb 07 jari 111     }
2 26 Feb 07 jari 112
2 26 Feb 07 jari 113     private void drawFlankingRegion(Graphics2D g2, int frIndex, int column, int columnIndex){
2 26 Feb 07 jari 114
2 26 Feb 07 jari 115         FlankingRegion fr = model.getFlankingRegionAt(columnIndex, frIndex);
2 26 Feb 07 jari 116
2 26 Feb 07 jari 117         int frStart = fr.getStart();
2 26 Feb 07 jari 118         int frStop = fr.getStop();
2 26 Feb 07 jari 119
2 26 Feb 07 jari 120         Dimension d = getSize();
2 26 Feb 07 jari 121
2 26 Feb 07 jari 122         double width = d.width;
2 26 Feb 07 jari 123         double height = d.height - 50;
2 26 Feb 07 jari 124
2 26 Feb 07 jari 125         double maxVal = model.getMaxClonePosition();
2 26 Feb 07 jari 126
2 26 Feb 07 jari 127         int rectX = insets.left + column * (elementWidth + rectSpacing);
2 26 Feb 07 jari 128         int rectY = (int) (insets.top + frStart * unitLength);
2 26 Feb 07 jari 129         double dRectHeight = (frStop - frStart) * unitLength;
2 26 Feb 07 jari 130         int rectHeight;
2 26 Feb 07 jari 131         if(dRectHeight < 1 && dRectHeight > 0){
2 26 Feb 07 jari 132             rectHeight = 1;
2 26 Feb 07 jari 133         }else{
2 26 Feb 07 jari 134             rectHeight = (int)dRectHeight;
2 26 Feb 07 jari 135         }
2 26 Feb 07 jari 136
2 26 Feb 07 jari 137         Rectangle curRect = new Rectangle(rectX, rectY, elementWidth, rectHeight);
2 26 Feb 07 jari 138
2 26 Feb 07 jari 139         g2.setPaint(model.getFlankingRegionColor(columnIndex, frIndex));
2 26 Feb 07 jari 140         g2.fill(curRect);
2 26 Feb 07 jari 141     }
2 26 Feb 07 jari 142
2 26 Feb 07 jari 143     private void drawAnnotations(Graphics2D g2){
2 26 Feb 07 jari 144         int annotationsX = getAnnotationsXCoord();
2 26 Feb 07 jari 145
2 26 Feb 07 jari 146         int fontSize = 8;
2 26 Feb 07 jari 147
2 26 Feb 07 jari 148         for(int i = 0; i < annotationsModel.getNumAnnotations(); i++){
2 26 Feb 07 jari 149             ICGHDataRegion dataRegion = annotationsModel.getAnnotationAt(i);
2 26 Feb 07 jari 150             String name = dataRegion.getName();
2 26 Feb 07 jari 151
2 26 Feb 07 jari 152             int start = dataRegion.getStart();
2 26 Feb 07 jari 153             int stop = dataRegion.getStop();
2 26 Feb 07 jari 154
2 26 Feb 07 jari 155             int rectY = (int) (insets.top + start * unitLength);
2 26 Feb 07 jari 156             double dRectHeight = (stop - start) * unitLength;
2 26 Feb 07 jari 157             int rectHeight;
2 26 Feb 07 jari 158             if(dRectHeight < 1 && dRectHeight > 0){
2 26 Feb 07 jari 159                 rectHeight = 1;
2 26 Feb 07 jari 160             }else{
2 26 Feb 07 jari 161                 rectHeight = (int)dRectHeight;
2 26 Feb 07 jari 162             }
2 26 Feb 07 jari 163
2 26 Feb 07 jari 164             Rectangle curRect = new Rectangle(annotationsX, rectY, annotationsRectWidth, rectHeight);
2 26 Feb 07 jari 165             g2.setPaint(annotationsModel.getAnnotationColorAt(i));
2 26 Feb 07 jari 166             g2.fill(curRect);
2 26 Feb 07 jari 167
2 26 Feb 07 jari 168             g2.setFont(new Font("", 0, fontSize));
2 26 Feb 07 jari 169             g2.drawString(name, annotationsX + annotationsRectWidth + 5, rectY);
2 26 Feb 07 jari 170         }
2 26 Feb 07 jari 171     }
2 26 Feb 07 jari 172
2 26 Feb 07 jari 173     protected void formMouseClicked(java.awt.event.MouseEvent evt) {
2 26 Feb 07 jari 174
2 26 Feb 07 jari 175         if(evt.getButton() == MouseEvent.BUTTON3  ){
2 26 Feb 07 jari 176         //if(evt.isPopupTrigger() ){
2 26 Feb 07 jari 177             Point point = evt.getPoint();
2 26 Feb 07 jari 178
2 26 Feb 07 jari 179             int selectedColumn = getSelectedColumn(point.x);
2 26 Feb 07 jari 180             int selectedPosition = getSelectedPosition(point.y);
2 26 Feb 07 jari 181
2 26 Feb 07 jari 182
2 26 Feb 07 jari 183             if(selectedColumn == COLUMN_NOT_FOUND || selectedPosition < 0 || selectedPosition > model.getMaxClonePosition()){
2 26 Feb 07 jari 184                 selectedDataRegion = null;
2 26 Feb 07 jari 185                 return;
2 26 Feb 07 jari 186             }
2 26 Feb 07 jari 187
2 26 Feb 07 jari 188             if(selectedColumn == ANNOTATIONS_COLUMN){
2 26 Feb 07 jari 189                 selectedDataRegion = getAnnotationAtLocation(selectedPosition);
2 26 Feb 07 jari 190             }else{
2 26 Feb 07 jari 191                 int experimentIndex = model.getExperimentIndexAt(selectedColumn);
2 26 Feb 07 jari 192
2 26 Feb 07 jari 193                 if(isShowFlankingRegions()){
2 26 Feb 07 jari 194                     selectedDataRegion = getFlankingRegionAtLocation(experimentIndex, selectedPosition);
2 26 Feb 07 jari 195                 }
2 26 Feb 07 jari 196
2 26 Feb 07 jari 197                 if(!isShowFlankingRegions() || selectedDataRegion == null){
2 26 Feb 07 jari 198                     selectedDataRegion = getCloneAtLocation(experimentIndex, selectedPosition);
2 26 Feb 07 jari 199                 }
2 26 Feb 07 jari 200             }
2 26 Feb 07 jari 201
2 26 Feb 07 jari 202             if(selectedDataRegion != null){
2 26 Feb 07 jari 203                 regionClickedPopup.show(evt.getComponent(), evt.getX(), evt.getY());
2 26 Feb 07 jari 204             }
2 26 Feb 07 jari 205
2 26 Feb 07 jari 206         }
2 26 Feb 07 jari 207     }
2 26 Feb 07 jari 208
2 26 Feb 07 jari 209
2 26 Feb 07 jari 210     private CGHDataRegionInfo getCloneAtLocation(int experimentIndex, int selectedPosition){
2 26 Feb 07 jari 211
2 26 Feb 07 jari 212         int selectedRow = -1;
2 26 Feb 07 jari 213         for(int i = 0; i < model.getNumElements(); i++){
2 26 Feb 07 jari 214             if(selectedPosition >= model.getStart(i) && selectedPosition <= model.getStop(i)){
2 26 Feb 07 jari 215                 selectedRow = i;
2 26 Feb 07 jari 216             }
2 26 Feb 07 jari 217         }
2 26 Feb 07 jari 218
2 26 Feb 07 jari 219         if(selectedRow != -1){
2 26 Feb 07 jari 220             CGHClone selectedClone = model.getCloneAt(selectedRow);
2 26 Feb 07 jari 221             return new CGHDataRegionInfo(selectedClone, experimentIndex);
2 26 Feb 07 jari 222         }
2 26 Feb 07 jari 223
2 26 Feb 07 jari 224         return null;
2 26 Feb 07 jari 225         //System.out.println("selected col " + selectedColumn + " position " + selectedPosition);
2 26 Feb 07 jari 226     }
2 26 Feb 07 jari 227
2 26 Feb 07 jari 228     private CGHDataRegionInfo getFlankingRegionAtLocation(int experimentIndex, int selectedPosition){
2 26 Feb 07 jari 229
2 26 Feb 07 jari 230         int selectedFrIndex = -1;
2 26 Feb 07 jari 231         for(int i = 0; i < model.getNumFlankingRegions(experimentIndex); i++){
2 26 Feb 07 jari 232             FlankingRegion fr = model.getFlankingRegionAt(experimentIndex, i);
2 26 Feb 07 jari 233             if(selectedPosition >= fr.getStart() && selectedPosition <= fr.getStop()){
2 26 Feb 07 jari 234                 selectedFrIndex = i;
2 26 Feb 07 jari 235             }
2 26 Feb 07 jari 236         }
2 26 Feb 07 jari 237
2 26 Feb 07 jari 238         if(selectedFrIndex != -1){
2 26 Feb 07 jari 239             FlankingRegion fr = model.getFlankingRegionAt(experimentIndex, selectedFrIndex);
2 26 Feb 07 jari 240             return new CGHDataRegionInfo(fr, experimentIndex);
2 26 Feb 07 jari 241         }
2 26 Feb 07 jari 242
2 26 Feb 07 jari 243         return null;
2 26 Feb 07 jari 244     }
2 26 Feb 07 jari 245
2 26 Feb 07 jari 246     private CGHDataRegionInfo getAnnotationAtLocation(int selectedPosition){
2 26 Feb 07 jari 247         int selectedAnnotationIndex = -1;
2 26 Feb 07 jari 248
2 26 Feb 07 jari 249         for(int i = 0; i < annotationsModel.getNumAnnotations(); i++){
2 26 Feb 07 jari 250             ICGHDataRegion dataRegion = annotationsModel.getAnnotationAt(i);
2 26 Feb 07 jari 251             if(selectedPosition >= dataRegion.getStart() && selectedPosition <= dataRegion.getStop()){
2 26 Feb 07 jari 252                 return new CGHDataRegionInfo(dataRegion, CGHBrowserModelAdaptor.ALL_EXPERIMENTS);
2 26 Feb 07 jari 253             }
2 26 Feb 07 jari 254         }
2 26 Feb 07 jari 255
2 26 Feb 07 jari 256         return null;
2 26 Feb 07 jari 257     }
2 26 Feb 07 jari 258
2 26 Feb 07 jari 259     private int getSelectedColumn(int xCoord){
2 26 Feb 07 jari 260         //Calculate if the point falls in any column
2 26 Feb 07 jari 261         for(int column = 0; column < model.getNumExperiments(); column++){
2 26 Feb 07 jari 262             int rectX = insets.left + column * (elementWidth + rectSpacing);
2 26 Feb 07 jari 263             if(xCoord >= rectX && xCoord <= rectX + elementWidth){
2 26 Feb 07 jari 264                 return column;
2 26 Feb 07 jari 265             }
2 26 Feb 07 jari 266         }
2 26 Feb 07 jari 267
2 26 Feb 07 jari 268         //check if it corresponds to an annotation
2 26 Feb 07 jari 269         int annotationsX = getAnnotationsXCoord();
2 26 Feb 07 jari 270
2 26 Feb 07 jari 271         if(xCoord >= annotationsX && xCoord <= annotationsX + annotationsRectWidth){
2 26 Feb 07 jari 272             return ANNOTATIONS_COLUMN;
2 26 Feb 07 jari 273         }
2 26 Feb 07 jari 274
2 26 Feb 07 jari 275         return COLUMN_NOT_FOUND;
2 26 Feb 07 jari 276     }
2 26 Feb 07 jari 277
2 26 Feb 07 jari 278     private int getAnnotationsXCoord(){
2 26 Feb 07 jari 279         return insets.left + model.getNumExperiments() * (elementWidth + rectSpacing);
2 26 Feb 07 jari 280     }
2 26 Feb 07 jari 281
2 26 Feb 07 jari 282     private int getSelectedPosition(int yCoord){
2 26 Feb 07 jari 283         return (int) ((yCoord - insets.top) / unitLength);
2 26 Feb 07 jari 284     }
2 26 Feb 07 jari 285
2 26 Feb 07 jari 286
2 26 Feb 07 jari 287
2 26 Feb 07 jari 288     /** Getter for property data.
2 26 Feb 07 jari 289      * @return Value of property data.
2 26 Feb 07 jari 290      */
2 26 Feb 07 jari 291     public IData getData() {
2 26 Feb 07 jari 292         return data;
2 26 Feb 07 jari 293     }
2 26 Feb 07 jari 294
2 26 Feb 07 jari 295     /** Setter for property data.
2 26 Feb 07 jari 296      * @param data New value of property data.
2 26 Feb 07 jari 297      */
2 26 Feb 07 jari 298     public void setData(IData data) {
2 26 Feb 07 jari 299         this.data = data;
2 26 Feb 07 jari 300     }
2 26 Feb 07 jari 301
2 26 Feb 07 jari 302 }