/* SCCS %W% --- %G% -- %U% */ // Copyright: Copyright (c) 1997 University of Southern California Brain Project. // Copyright: This software may be freely copied provided the toplevel // Copyright: COPYRIGHT file is included with each such copy. // Copyright: Email nsl@java.usc.edu. //-------------------------------------- // $Log: NslCanvas.java,v $ // Revision 1.5 1997/11/06 03:15:01 erhan // nsl3.0.b // // Revision 1.4 1997/05/09 22:30:24 danjie // add some comments and Log // //-------------------------------------- package nslj.src.display; import java.awt.*; import java.util.*; import java.lang.*; import java.awt.event.*; import java.lang.reflect.*; import nslj.src.lang.*; import nslj.src.system.*; /** * The Nsl Canvas * * Implement the general functions of nslj canvases * * @version 1.0 * @author Danjie Pan */ public class NslCanvas extends Canvas { // Variables public NslVariable var_in_canvas; public String canvas_name; public String windowName; public NslFrame nslDisplayFrame = null; public MouseAdapter mouseAdapter; protected Vector variable_list; protected int drawX, drawY, drawW, drawH, dx, dy; protected int x_dimension, y_dimension; protected int max_data_pos; protected String canvas_type; protected double C_min_y=0.0 ,C_max_y=1.0; // for transfering scale between different plots protected double C_min_x=0 ,C_max_x=1; // not used now private String name; private Color back_ground_color; private int mouseX0, mouseY0, mouseXcurrent, mouseYcurrent; private int mouseX1, mouseY1; private Stack zoomStack; private int colorIndex = 1; // Constructors public NslCanvas() { C_min_y=0; C_max_y=1; } public NslCanvas(NslFrame nslDisplayFrame, NslCanvas pre) { } public NslCanvas(NslFrame nslDisplayFrame,double min,double max) { this.nslDisplayFrame = nslDisplayFrame; set_min_max(min,max); } public NslCanvas(NslFrame frame, String fullName, NslVariableInfo varInfo) { canvas_type = "Normal"; canvas_name = fullName; name = canvas_name.substring(canvas_name.indexOf(".",1) + 1); nslDisplayFrame = frame; variable_list = new Vector(); NslData data= varInfo.getNslVar(); var_in_canvas = new NslVariable(nslDisplayFrame, this, varInfo); variable_list.addElement(var_in_canvas); mouseX0=0; mouseY0=0; mouseX1=0; mouseY1=0; } // end constructor // Methods public String nslGetName() { return name; } // Event handeler public void mousePressed(MouseEvent evt) { if(canvas_type.equals("Zoom")) { Graphics g = getGraphics(); g.setXORMode(getBackground()); g.drawRect(mouseX0, mouseY0, (mouseX1-mouseX0), (mouseY1-mouseY0)); mouseX0 = evt.getX(); mouseY0 = evt.getY(); mouseXcurrent = evt.getX(); mouseYcurrent = evt.getY(); } } public void mouseDragged(MouseEvent evt) { if (canvas_type.equals("Zoom")) { Graphics g = getGraphics(); g.setXORMode(getBackground()); // for flexible area selection - nikunj int xLeft, xRight, yTop, yBottom; xLeft = (mouseX0 < mouseXcurrent) ? mouseX0 : mouseXcurrent; xRight = (mouseX0 > mouseXcurrent) ? mouseX0 : mouseXcurrent; yTop = (mouseY0 < mouseYcurrent) ? mouseY0 : mouseYcurrent; yBottom = (mouseY0 > mouseYcurrent) ? mouseY0 : mouseYcurrent; g.drawRect(xLeft, yTop, (xRight - xLeft), (yBottom - yTop)); mouseXcurrent = evt.getX(); mouseYcurrent = evt.getY(); // for flexible area selection - nikunj g.setColor(Color.black); xLeft = (mouseX0 < mouseXcurrent) ? mouseX0 : mouseXcurrent; xRight = (mouseX0 > mouseXcurrent) ? mouseX0 : mouseXcurrent; yTop = (mouseY0 < mouseYcurrent) ? mouseY0 : mouseYcurrent; yBottom = (mouseY0 > mouseYcurrent) ? mouseY0 : mouseYcurrent; g.drawRect(xLeft, yTop, (xRight - xLeft), (yBottom - yTop)); g.dispose(); } } public void mouseReleased(MouseEvent evt) { if (canvas_type.equals("Zoom")) { mouseX1 = evt.getX(); mouseY1 = evt.getY(); // for flexible area selection - nikunj int xLeft, xRight, yTop, yBottom; xLeft = (mouseX0 < mouseX1) ? mouseX0 : mouseX1; xRight = (mouseX0 > mouseX1) ? mouseX0 : mouseX1; yTop = (mouseY0 < mouseY1) ? mouseY0 : mouseY1; yBottom = (mouseY0 > mouseY1) ? mouseY0 : mouseY1; mouseX0 = xLeft; mouseX1 = xRight; mouseY0 = yTop; mouseY1 = yBottom; } } public void set_min_max(double dmin, double dmax) { C_min_y = dmin; C_max_y = dmax; } public void initCanvas() { // must be implemented in each canvas type } public void initEpochCanvas() { // must be implemented in each canvas type } public void init() { // must be implemented in each canvas type } public void refresh() { // ERH: must be implemented in each canvas type } public void update() { Graphics g = getGraphics(); update(g); } public void paint(Graphics g, int val) { Rectangle b = getBounds(); if(canvas_type.equals("Normal")) { set_draw_size(b); } else if(canvas_type.equals("Zoom")) { double[] lastVCDimen =(double[]) zoomStack.peek(); double x0 = lastVCDimen[0]; double y0 = lastVCDimen[1]; double dw = lastVCDimen[2]; double dh = lastVCDimen[3]; double mx0 = lastVCDimen[4]; double my0 = lastVCDimen[5]; double mdw = lastVCDimen[6]; double mdh = lastVCDimen[7]; mouseX0 = (int)(mx0*(double)b.width); mouseY0 = (int)(my0*(double)b.height); mouseX1 = (int)((mx0+mdw)*(double)b.width); mouseY1 = (int)((my0+mdh)*(double)b.height); g.setColor(Color.black); g.drawRect(mouseX0, mouseY0, (mouseX1-mouseX0), (mouseY1-mouseY0)); zoom_draw_size(x0, y0, dw, dh); } if (val == 99) draw_rectangle(g); else if (val > 0) draw_box(g); // draw title here g.setColor(Color.black); if (canvas_type.equals("Normal")) g.drawString(name,10,20); } public void draw_rectangle(Graphics g) { // draw box g.setColor(Color.lightGray); g.drawRect(drawX,drawY, dx * var_in_canvas.info.getDimension(1), dy * var_in_canvas.info.getDimension(0)); } public void draw_box(Graphics g) { // draw box g.setColor(Color.lightGray); g.drawRect(drawX,drawY, dx * var_in_canvas.info.getDimension(1), dy * var_in_canvas.info.getDimension(0)); for(int i=0; i1) { double[] lastVCDimen = (double[])zoomStack.pop(); //(double[])zoomStack.peek(); double x0 = lastVCDimen[0]; double y0 = lastVCDimen[1]; double dw = lastVCDimen[2]; double dh = lastVCDimen[3]; double mx0 = lastVCDimen[4]; double my0 = lastVCDimen[5]; double mdw = lastVCDimen[6]; double mdh = lastVCDimen[7]; zoom_draw_size(x0, y0, dw, dh); update(); } } /** * To calculate the parameters for paint() accoding to virtual canvas parameters * and actrual zoom canvas size. */ public void zoom_draw_size(double x0, double y0, double dw, double dh) { Rectangle b = getBounds(); var_in_canvas=(NslVariable)variable_list.elementAt(0); drawX = (int)((x0+dw/20.0)*(double)b.width); drawY = (int)((y0+dh/10.0)*(double)b.height); drawW = (int)((dw-2.0*dw/20.0)*(double)b.width); drawH = (int)((dh-3.0*dh/20.0)*(double)b.height); dx = (int)((dw-2.0*dw/20.0)* (double)b.width/(double)var_in_canvas.info.getDimension(1)); dy = (int)((dh-3.0*dh/20.0)* (double)b.height/(double)var_in_canvas.info.getDimension(0)); } public void zoom_draw_size() { double[] lastVCDimen = (double[]) zoomStack.peek(); double x0 = lastVCDimen[0]; double y0 = lastVCDimen[1]; double dw = lastVCDimen[2]; double dh = lastVCDimen[3]; zoom_draw_size(x0, y0, dw, dh); } // Change the canvas type and create the zoomStack accordingly public void set_canvas_type(String ct) { canvas_type = ct; if (canvas_type.equals("Zoom")) { zoomStack = new Stack(); double[] initArray = new double[8]; initArray[0] = 0.0; // virtual canvas left-up corner x0(0) initArray[1] = 0.0; // virtual canvas left-up corner y0(0) initArray[2] = 1.0; // virtual canvas width (normalized) initArray[3] = 1.0; // virtual canvas height (normalized) initArray[4] = 0.0; // zoom box mx0(0) initArray[5] = 0.0; // zoom box my0(0) initArray[6] = 1.0; // zoom box width (normalized) initArray[7] = 1.0; // zoom box height (normalized) zoomStack.push(initArray); } } public Vector get_variable_list() { return variable_list; } public void collect() { for(int i=0; i