White Board Source Code

//***************************************************************************
// Application:	Villanova Cat Cave Conference Center
// File: 	whiteBoard.java 
// Module:	whiteBoard
// Version:	1.0 
// Written by:  Mark Juliano and Sharon Morris and
//		Graham Mehl and Dharmendra Katkuri and
//		Thomas Di Sessa
//              Villanova Master of Science Candidate
//              Independent Study project
//
//		Rob LaRubbio
//              Villanova Bachelor of Science Candidate
//              Independent Study project
//
// Date:        3/31/96
// 
// Purpose:     This file controls all the actions and communication that
//		occurs with the white board.  All forms of communication
//		goes through the white board be it in bound or out bound
//		All Objects that are created are stored by each white board
//		The white board communicates with the tool kit to ensure
//		all actions and modes are being interpretted properly.
// 
//***************************************************************************

import java.awt.*;
import java.util.*;
import java.lang.*;

class whiteBoard extends Panel
{
	private Vector items = new Vector();
	private toolKit tk;
        Color Active_Color = Color.black;

	/*
	 * This is bad design, but we don't know how else to do it
	 */
	obj moveMe = null; 
	obj moveSe = null; 

	int skip, firstX, firstY;
        boolean stat = true;

// ********************* Dharma's code (start) *****************

	int firstClick = 0;
	boolean Permit_cont_line = false;
	private StringBuffer Cont_line_send;

	int prevX = 0, prevY = 0;

	int backupX1, backupY1, backupX2, backupY2;
	String backupMode = " ";
	Vector backupPoints = new Vector();
	obj backupObj = null;
	int findIndex;
	int findIndex1;

// ********************* Dharma's code (end)********************

	zClientDef clientDef;
	CardWindow card;
	private StringBuffer SendMe;

	/* 
	 * This method assists in determining at what index of
	 * the string passed the next comma is located
	 */
	int NextComma( String message )
	{
		int index = 0;

		while( message.charAt( index++ ) != ',' );

		return( --index );
	}

	/* 
	 * This method assists in determining the numeric value
	 * of the string passed, which will be a X or Y 
	 * coordinate 
	 */
	int GetNextCoordinate( String message )
	{
		int index = 0;
		String coord;
	
		index = this.NextComma( message );

		coord = message.substring( 0, index );

		return( Integer.parseInt( coord, 10 ) );
	}

// ************** Graham Mehl made changes below this line ****************** 
	/*
	 * This method retrieves the message being
	 * transmitted across the network for drawing on
	 * white boards in the conference room
	 */
	String getMessage(String msg)
	{
	String tempString = "Temp String Value";
	int index; 

		index = this.NextComma( msg );
		tempString = msg.substring( 0, index );
		return (tempString);
	}

	/*
	 * This method retrieves the value of the fontSize being
	 * transmitted across the network for drawing on
	 * white boards in the conference room
	 */
	int getFontSize (String stringFontSize)
	{
		String font;
	
		font = stringFontSize.substring( 0, 2 );

		return( Integer.parseInt( font, 10 ) );
	}

// ************** Graham Mehl made changes above this line ****************** 

	/*
	 * returns the active color of the objects on the 
	 * White board 
	 */
        Color getColor( )
	{
               Active_Color = tk.getColor();
               return ( Active_Color );
        }

	/*
	 * This method converts a color in to a literal allowing
	 * it to become part of a string to be transmitted across
	 * the network to another white board
	 */
	char GetColor( Color color )
	{
		if( color == Color.blue )
		{
			return( '0' );
		}

		if( color == Color.red )
		{
			return( '1' );
		}

		if( color == Color.black )
		{
			return( '2' );
		}

		if( color == Color.yellow )
		{
			return( '3' );
		}

		if( color == Color.cyan )
		{
			return( '4' );
		}

		if( color == Color.magenta )
		{
			return( '5' );
		}

		if( color == Color.green )
		{
			return( '6' );
		}

		if( color == Color.gray )
		{
			return( '7' );
		}

		if( color == Color.orange )
		{
			return( '8' );
		}

		if( color == Color.pink )
		{
			return( '9' );
		}

		return( '0' );
	}

	/*
	 * This method converts a literal in to a color allowing
	 * it to be pealed off a string that has been transmitted
	 * across the network to another white board
	 */
	Color GetColor( String message )
	{
		Color color = Color.black;

		switch( message.charAt( 0 ) )
		{
			case '0': // blue
				color = Color.blue;
				break;
			case '1': // red
				color = Color.red;
				break;
			case '2': // black
				color = Color.black;
				break;
			case '3': // yellow
				color = Color.yellow;
				break;
			case '4': // cyan
				color = Color.cyan;
				break;
			case '5': // magenta
				color = Color.magenta;
				break;
			case '6': // green
				color = Color.green;
				break;
			case '7': // gray
				color = Color.gray;
				break;
			case '8': // orange
				color = Color.orange;
				break;
			case '9': // pink
				color = Color.pink;
				break;
		}

		return( color );
	}

	public void DrawObject( String message )
	{
		char firstChar =  message.charAt( 0 );
		int x1=0, y1=0, x2=0, y2=0, nextComma = 0, nextStart = 0;
		int x, y, loop=0;
		Color color= getColor();

		
		if (firstChar != 'Q')
		{

		x1 = this.GetNextCoordinate( message.substring( 1 ) );
		nextComma = this.NextComma( message.substring( 0 ) );	
		
		nextStart = nextComma + 1;

		y1 = this.GetNextCoordinate( message.substring( nextStart ) ); 
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

		x2 = this.GetNextCoordinate( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

		y2 = this.GetNextCoordinate( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;
	
		color = this.GetColor( message.substring( nextStart ) );
		}
		else
		{
			loop = this.GetNextCoordinate( message.substring( 1 ) );
			nextComma = this.NextComma( message.substring( 0 ) );	
			nextStart = nextComma + 1;
		}

		switch( firstChar )
		{
			case 'L': // line
				line l = new line( x1, y1, x2, y2, color ); 
				items.addElement( l );
				backupMode = "D";
				break;
			case 'R': // rectangle
				rect r = new rect( x1, y1, x2, y2, color );
				items.addElement( r );
				backupMode = "D";
				break;
			case 'C': // circle
				circle c = new circle( x1, y1, x2, y2, color );
				items.addElement( c );
				backupMode = "D";
				break;
			case 'O': // oval
				oval o = new oval( x1, y1, x2, y2, color );
				items.addElement( o );
				backupMode = "D";
				break;
			case 'Q':
                               	contline cl = new contline( x1, y1, 0, 0, color); 

				while (loop > 0)
				{
				x = this.GetNextCoordinate( message.substring( nextStart ) );
				nextComma = this.NextComma( message.substring( nextStart ) );	
		
				nextStart = nextStart + nextComma + 1;

				y = this.GetNextCoordinate( message.substring( nextStart ) ); 
				nextComma = this.NextComma( message.substring( nextStart ) );
				nextStart = nextStart + nextComma + 1;

				cl.storePoint(x,y);
				cl.setX2(x);
				cl.setY2(y);
				loop--;
				}
				color = this.GetColor( message.substring( nextStart ) );
				cl.setColor( color );
				items.addElement( cl );
				backupMode = "D";
				break;
		}
		this.repaint();
		
	}

	public void CutObject( String message )
	{
		int x1, y1, x2, y2, nextComma = 0, nextStart = 0;
		Color color;
		obj Mv1=null, Mv2=null;
		Point last_point = new Point(0,0);
		Graphics g; // get Graphics Context
		g = getGraphics();

		x1 = this.GetNextCoordinate( message.substring( 0 ) );
		nextComma = this.NextComma( message.substring( 0 ) );	
		
		nextStart = nextComma + 1;

		y1 = this.GetNextCoordinate( message.substring( nextStart ) ); 
		nextComma = this.NextComma( message.substring( nextStart ) );

		Mv1 = findObject(x1,y1);
		backupX1 = Mv1.getX1();
		backupY1 = Mv1.getY1();
		backupX2 = Mv1.getX2();
		backupY2 = Mv1.getY2();
                backupObj = (obj) Mv1.Assign(getColor());
		backupMode = "C";
		if (Mv1.type.equals("Contline"))
		{
			backupPoints.removeAllElements();
			int i;
			for (i=0;i< backupObj.pts.size();i++)
			{
				backupPoints.addElement(backupObj.pts.elementAt(i));
			}		
			last_point = (Point) Mv1.pts.elementAt((Mv1.pts.size()-1));
			backupObj.setX2(last_point.x);
			backupObj.setY2(last_point.y);
		}
		Mv1.erase( g, this );
		items.removeElement( Mv1 );
	}

	public void CopyObject( String message )
	{
		int x1, y1, x2, y2, nextComma = 0, nextStart = 0;
		Color color;
		obj Mv1=null, Mv2=null;
		Point last_point = new Point(0,0);
		Graphics g; // get Graphics Context
		g = getGraphics();

		x1 = this.GetNextCoordinate( message.substring( 0 ) );
		nextComma = this.NextComma( message.substring( 0 ) );	
		
		nextStart = nextComma + 1;

		y1 = this.GetNextCoordinate( message.substring( nextStart ) ); 
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

		x2 = this.GetNextCoordinate( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

		y2 = this.GetNextCoordinate( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

		color = this.GetColor( message.substring( nextStart ) );

		Mv1 = findObject(x1,y1);
		backupX1 = Mv1.getX1();
		backupY1 = Mv1.getY1();
		backupX2 = Mv1.getX2();
		backupY2 = Mv1.getY2();
                backupObj = (obj) Mv1.Assign(getColor());
                Mv2 = (obj) Mv1.Assign(getColor());
		backupMode = "D";
		int firstX = x1, firstY = y1;
		if (Mv2.type.equals("Contline"))
		{
			backupPoints.removeAllElements();
			int i;
			for (i=0;i< backupObj.pts.size();i++)
			{
				backupPoints.addElement(backupObj.pts.elementAt(i));
			}		
			Mv2.rePosition(firstX, firstY, x2, y2);
			last_point = (Point) Mv2.pts.elementAt((Mv2.pts.size()-1));
			backupObj.setX2(last_point.x);
			backupObj.setY2(last_point.y);
		}
		else
		{
			if( x2 < firstX )
			{
                                  Mv2.setX1( Mv2.getX1() - ( firstX - x2 ) );
                                  Mv2.setX2( Mv2.getX2() - ( firstX - x2 ) );

			}

			if( x2 > firstX )
			{
                                  Mv2.setX1( Mv2.getX1() + ( x2 - firstX ) );
                                  Mv2.setX2( Mv2.getX2() + ( x2 - firstX ) );
			}

			if( y2 < firstY )
			{
                                  Mv2.setY1( Mv2.getY1() - ( firstY - y2 ) );
                                  Mv2.setY2( Mv2.getY2() - ( firstY - y2 ) );
			}

			if( y2 > firstY )
			{
                                  Mv2.setY1( Mv2.getY1() + ( y2 - firstY ) );
                                  Mv2.setY2( Mv2.getY2() + ( y2 - firstY ) );
			}
		}
			Mv2.setColor( color );
			Mv2.draw(g);
			items.addElement( Mv2 );

		this.repaint();
	}

	public void MoveObject( String message )
	{

		int x1, y1, x2, y2, nextComma = 0, nextStart = 0;
		Color color;
		obj Mv1=null, Mv2=null;
		Point last_point = new Point(0,0);
		Graphics g; // get Graphics Context
		g = getGraphics();

		x1 = this.GetNextCoordinate( message.substring( 0 ) );
		nextComma = this.NextComma( message.substring( 0 ) );	
		
		nextStart = nextComma + 1;

		y1 = this.GetNextCoordinate( message.substring( nextStart ) ); 
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

		x2 = this.GetNextCoordinate( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

		y2 = this.GetNextCoordinate( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

		color = this.GetColor( message.substring( nextStart ) );

		Mv1 = findObject(x1,y1);
		backupX1 = Mv1.getX1();
		backupY1 = Mv1.getY1();
		backupX2 = Mv1.getX2();
		backupY2 = Mv1.getY2();
                backupObj = (obj) Mv1.Assign(getColor());
		backupMode = "M";
		int firstX = x1, firstY = y1;
		if (Mv1.type.equals("Contline"))
		{
			Mv1.erase(g, this);
			backupPoints.removeAllElements();
			int i;
			for (i=0;i< backupObj.pts.size();i++)
			{
				backupPoints.addElement(backupObj.pts.elementAt(i));
			}		
			Mv1.rePosition(firstX, firstY, x2, y2);
			last_point = (Point) Mv1.pts.elementAt((Mv1.pts.size()-1));
			backupObj.setX2(last_point.x);
			backupObj.setY2(last_point.y);
		}
		else
		{
		if (Mv1 != null)
		{
			Mv1.erase(g, this);
			if( x2 < firstX )
			{
                                  Mv1.setX1( Mv1.getX1() - ( firstX - x2 ) );
                                  Mv1.setX2( Mv1.getX2() - ( firstX - x2 ) );

			}

			if( x2 > firstX )
			{
                                  Mv1.setX1( Mv1.getX1() + ( x2 - firstX ) );
                                  Mv1.setX2( Mv1.getX2() + ( x2 - firstX ) );
			}

			if( y2 < firstY )
			{
                                  Mv1.setY1( Mv1.getY1() - ( firstY - y2 ) );
                                  Mv1.setY2( Mv1.getY2() - ( firstY - y2 ) );
			}

			if( y2 > firstY )
			{
                                  Mv1.setY1( Mv1.getY1() + ( y2 - firstY ) );
                                  Mv1.setY2( Mv1.getY2() + ( y2 - firstY ) );
			}
		}
			Mv1.draw(g);
		}

		this.repaint();
	}

// ************** Graham Mehl made changes below this line ****************** 
	/* 
	 * This method receives a string as input.  This String
	 * is a message that has been determine it contains a
	 * text message that was semt across the network and 
	 * must be added to the users white board.
	 */
	public void TextObject( String message )
	{
		obj txt=null;
		Graphics g; // get Graphics Context
		g = getGraphics();
	   /* 
	    * Prepare the variables of a text object
	    */
	    int x1, y1, x2, y2;
	    int nextComma = 0, nextStart = 0;
	    char fontSizeChar;
	    int fontSize = 12;
	    Color color;
	    String a_message; 

	    char firstChar =  message.charAt( 0 );

	   /* 
	    * Peal off the X1 coordinate from the String
	    */
		x1 = this.GetNextCoordinate( message.substring( 1 ) );
		nextComma = this.NextComma( message.substring( 0 ) );	
		
		nextStart = nextComma + 1;

	   /* 
	    * Peal off the Y1 coordinate from the String
	    */
		y1 = this.GetNextCoordinate( message.substring( nextStart ) ); 
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

	   /* 
	    * Peal off the font size from the String
	    */
		fontSize = this.getFontSize( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

	   /* 
	    * Peal off the text message from the String
	    */
		a_message = this.getMessage( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

	   /* 
	    * Peal off the X2 coordinate from the String
	    */
		x2 = this.GetNextCoordinate( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

	   /* 
	    * Peal off the Y2 coordinate from the String
	    */
		y2 = this.GetNextCoordinate( message.substring( nextStart ) );
		nextComma = this.NextComma( message.substring( nextStart ) );

		nextStart = nextStart + nextComma + 1;

	   /* 
	    * Peal off the color of the text from the String
	    */
		color = this.GetColor( message.substring( nextStart ) );

		switch( firstChar )
		{
			case 'F': // Text 
				textBox text = new textBox( x1, y1, x2, 
					y2, color, fontSize, a_message ); 
				text.setX1(x1);
				text.setY1(y1);
				text.setX2(x2);
				text.setY2(y2);
				text.setColor(color);

				items.addElement( text );
				break;
			case 'S': // Update Text message
				txt = findObject(x1,y1);
				int firstX = x1, firstY = y1;
				if (txt != null)
				{
				     txt.erase(g, this);

                        	     txt.setX1( x1 );
                        	     txt.setX2( x2 );
                        	     txt.setY1( y1 );
                        	     txt.setY2( y2 );
				     txt.setFontSize( fontSize );
				     txt.setMessage( a_message );
				     txt.setColor( color );
			
				     txt.draw(g);
				}

				break;
			default:  // error
 			   //System.out.println( "Error in text receive\n");
				break;
		}

		this.repaint();
	}

// ************** Graham Mehl made changes above this line ****************** 

	public void SendPage( int pageNumber )
	{
		obj item = null;
		int itemCount = items.size();

		itemCount--;

		while( itemCount >= 0 )
		{
			StringBuffer SendMe = new StringBuffer();

			SendMe.append( "IW" );
			SendMe.append( pageNumber );
			SendMe.append( ":" );


			item = ( obj ) items.elementAt( itemCount );
			item.getType();

			if( item.type.equals( "Text" ) )
			{
				SendMe.append( "T" );
			}
			else
			{
				SendMe.append( "D" );
			}

			if( item.type.equals( "Line" ) )
			{
				SendMe.append( "L" );
			}
			
			if( item.type.equals( "Rect" ) )
			{
				SendMe.append( "R" );
			}

			if( item.type.equals( "Circle" ) )
			{
				SendMe.append( "C" );
			}

			if( item.type.equals( "Oval" ) )
			{
				SendMe.append( "O" );
			}

			if( item.type.equals( "Text" ) )
			{
				SendMe.append( "F" );
			}

			if (item.type.equals("Contline"))
			{
				int i;
				Point send_pt = new Point(0,0);

				SendMe.append( "Q" );
				SendMe.append( item.pts.size() );
				SendMe.append( ',' );
			
				for (i=0; i < item.pts.size(); i++)
				{	
					send_pt = (Point) item.pts.elementAt(i); 	
					
			 		SendMe.append( send_pt.x );
					SendMe.append( ',' );
					SendMe.append( send_pt.y );
					SendMe.append( ',' );
				}

			}

			else
			{
			SendMe.append( item.getX1() );
			SendMe.append( "," );
			SendMe.append( item.getY1() );
			SendMe.append( "," );

			if( item.type.equals( "Text" ) )
			{
			SendMe.append( item.getFontSize() );
			SendMe.append( "," );
			SendMe.append( item.getMessage() );
			SendMe.append( "," );
			}

			SendMe.append( item.getX2() );
			SendMe.append( "," );
			SendMe.append( item.getY2() );
			SendMe.append( "," );
			}
			SendMe.append( this.GetColor( item.getColor() ) );

			clientDef.zCommDispatch( "_PM_", SendMe.length(), 
				SendMe.toString() );

			itemCount--;
		}
	}

	public void ClearPage()
	{
		obj clearMe = null;
		int itemCount = items.size();
		Graphics g; // get Graphics Context

		g = getGraphics();

		itemCount--;

		while( itemCount >= 0 )
		{
			clearMe = ( obj ) items.elementAt( itemCount );
			clearMe.erase( g, this );
			items.removeElement( clearMe );
			itemCount--;
		}
		this.repaint();
		g.dispose();
	}

	public void Undo()
	{
// ********************************* Dharma's **************************

				
		obj cc = null;	
		int yy=items.size()-1, index,i;	

		Graphics g;

		g = getGraphics();

						
		if (backupMode.equals("D"))
		{
							
			cc = ( obj ) items.elementAt( yy );
			cc.erase( g, this );
			items.removeElement( cc );
		}
		else if (backupMode.equals("C"))
		     {
			if (backupObj.type.equals("Contline"))
			{
				backupObj.pts.removeAllElements();
				for (i=0;i < backupPoints.size(); i++)
				{
					backupObj.storePoint(backupPoints.elementAt(i));
				}
				Point tp_pt = new Point(0,0);
				tp_pt = (Point) backupPoints.elementAt(backupPoints.size()-1);
				backupObj.setX2(tp_pt.x);
				backupObj.setY2(tp_pt.y);
						
			}
			else
			{
								
				backupObj.setX1(backupX1);
				backupObj.setY1(backupY1);
				backupObj.setX2(backupX2);
				backupObj.setY2(backupY2);
			}
			backupObj.draw(g);
			items.addElement(backupObj);
		     }
		     else if (backupMode.equals("M"))
		     	  {

				cc = ( obj ) items.elementAt( findIndex );
				cc.erase( g, this );
				if (cc.type.equals("Contline"))
				{
					Point temp_pt = new Point(0,0);

					cc.pts.removeAllElements();

					for (i=0;i < backupPoints.size(); i++)
					{
						temp_pt = (Point) backupPoints.elementAt(i);
						cc.storePoint(temp_pt.x,temp_pt.y);
						cc.setX2(temp_pt.x);
						cc.setY2(temp_pt.y);
					}
				}
				else
				{
					cc.setX1(backupX1);
					cc.setY1(backupY1);
					cc.setX2(backupX2);
					cc.setY2(backupY2);
				}
				cc.draw(g);

			   }
			backupMode = "disabled";
								
									
	}							

// ************************************* D *****************************8

	public void Receive( String message )
	{
	    int msgLength = message.length();


	    switch( message.charAt( 0 ) )
	    {
		case 'D': // draw	
		    this.DrawObject( message.substring( 1 ) );
		    break;
		case 'C': // cut
		    this.CutObject( message.substring( 1 ) );
		    break;
		case 'M': // move
		    this.MoveObject( message.substring( 1 ) );
		    break;
		case 'P': // copy
		    this.CopyObject( message.substring( 1 ) );
		    break;
		case 'T': // text
		    this.TextObject( message.substring( 1 ) );
		    break;
		case 'R': // clear
		    this.ClearPage();
		    break;
		case 'U': // undo 
		    this.Undo();
		    break;
		default: // Error
		    break;
		}
	}

	/*
	 * You need to pass the toolKit to the whiteBoard
	 * so that the whiteBoard can call the toolKit's methods
	 */
	public whiteBoard( toolKit a_toolKit, CardWindow c, 
				zClientDef commHandler )
	{
	    setBackground( Color.white );
            Active_Color = Color.black;
	    tk = a_toolKit;
	    clientDef = commHandler;
	    card = c;
	}

	private obj findObject( int x, int y )
	{
           int itemCount = 0, itemSize = items.size();
           obj temp = null, temp1 = null, temp2 = null;
           int X1, Y1, X2, Y2 , area;

           while(itemCount != itemSize)
           {
		temp = ( obj ) items.elementAt( itemCount );
		findIndex = itemCount;
		if( temp.isPointIn( x, y ) == true )
		{
                    temp1 = temp; 
                    for(itemCount++; itemCount != itemSize; itemCount++ )
                    {
                        X1 = temp.getX1();
                        Y1 = temp.getY1();
                        X2 = temp.getX2();
                        Y2 = temp.getY2();
			area = temp.Area(X1,Y1,X2,Y2);

                        temp = ( obj ) items.elementAt( itemCount);
                        if (temp.isPointIn( x,y ) == true)
                        {

		            if (temp.Area(temp.getX1(), temp.getY1(),
				temp.getX2(),temp.getY2()) <= area)
			    {
			        area = temp.Area(temp.getX1(), temp.getY1(),
					temp.getX2(),temp.getY2()); 
                                temp2 = temp;
			        findIndex = itemCount;
			    }
			}
                    }
                    if (temp2 != null)
                         return(temp2);
                    else{
                         return(temp1);}
                             
                    }
                  
                    itemCount++;
		}

		return( null );
	}

	/*
	 * this function redraws all the items on the white board
	 */
	public void paint( Graphics g )
	{
		int itemCount, itemSize = items.size();
		obj temp = null;

		this.setBackground( Color.white );
		for( itemCount = 0; itemCount != itemSize; itemCount++ )
		{
			temp = ( obj ) items.elementAt( itemCount );
			temp.draw( g );
		}
	}

	public boolean handleEvent( Event e )
	{
		obj temp = null; // points to last item in the Vector
		obj findMe = null;
		Point last_pt = new Point(0,0);

		int it;

		/*
		 * get the position of the last item in the list
		 */
		int itemSize = items.size();

		/*
		 * since list starts at zero, we need to subtract one
		 */
		itemSize--;

		/*
		 * since you can drag the mouse across the white board
		 * without being in the process of drawing a shape and 
		 * this function is called when you drag the mouse, 
		 * MOUSE_DRAG, we need to make sure that there are 
		 * items in our Vector prior to getting the last item 
		 * in the list....
		 */
		if( ( itemSize >= 0 ) && ( ( tk.getMode() != 0 ) || 
			( tk.getMode() != 10 ) ) )
		{
	 	    /*
		     * create a variable of type object to point 
		     * to last item in list
		     */
			temp = ( obj ) items.elementAt( itemSize );
		}

		Graphics g; // get Graphics Context
		g = getGraphics();

		switch( e.id )
		{
		   case Event.MOUSE_ENTER:
		      show();
		      switch( tk.getMode() )
		      {
			case 0: // lines
			   //setCursor(CROSSHAIR_CURSOR);
			   break; 
			case 1:// rectangle
                           //setCursor(CROSSHAIR_CURSOR);
			   break; 
			case 2:// circle
                           //setCursor(CROSSHAIR_CURSOR);
			   break; 
			case 3:// cut
			   //setCursor(HAND_CURSOR);
			   break; 
			case 4://move
			   //setCursor(MOVE_CURSOR);
			   break;
                        case 5: // text
                           //setCursor(CROSSHAIR_CURSOR);
			   break; 
			default:
			   //setCursor(DEFAULT_CURSOR);
			   break;
			}
			break;
		    case Event.WINDOW_EXPOSE:
			/*
			 * if one window cover our white board and then 
			 * is moved, we need to redraw all the items on 
			 * the white board
			 */
			repaint();
			break;

// ********************* Dharma's ******************************************


			case Event.MOUSE_MOVE:
					if ((tk.getMode() == 5) && (itemSize >= 0) && (temp.type.equals("Contline")) && (Permit_cont_line == true))		
					{	
						temp.erase(g, this);
						temp.setX2( e.x );
						temp.setY2( e.y );
						temp.draw(g);
					}

						break;

// ************************ D ****************************************

		   case Event.MOUSE_DOWN:
			/*
			 * need to add code here to change cursor to across
			 */
// This Dharma's addition **************** START ***************
			if (itemSize > 0)
			{
                           for( it = 0; it <= itemSize; it++ )
			   {
				temp = ( obj ) items.elementAt(it);
				if (temp.Select == true)
                                {
				    temp.borderErase(g , this);
				    temp.Select = false;
                                    break;
                                }
			   }
			}
			findIndex1 = findIndex;
			findMe = this.findObject( e.x, e.y );

			if (findMe != null)
			{ 
				findMe.hilightObject(g);
			    	findMe.Select = true;
			}

// This is Dharma's addition *************** END ************************

			SendMe = new StringBuffer();

			SendMe.append( "W" );
			SendMe.append( card.returnpg() );
			SendMe.append( ":" );

			switch( tk.getMode() )
			{
			    case 4: // lines
                                   line l = new line( e.x, e.y, e.x, 
					e.y, getColor() ); 
				   items.addElement( l );
				   backupMode = "D";
				   SendMe.append( "DL" );
				   SendMe.append( e.x );
				   SendMe.append( ',' );
				   SendMe.append( e.y );
				   SendMe.append( ',' );
				   break;
			    case 1: // rectangle
                                   rect r = new rect( e.x, e.y, e.x, 
					e.y, getColor() );
				   items.addElement( r );
				   backupMode = "D";
				   SendMe.append( "DR" );
				   SendMe.append( e.x );
				   SendMe.append( ',' );
				   SendMe.append( e.y );
				   SendMe.append( ',' );
				   break;
			    case 2: // circle
                                   circle c = new circle( e.x, e.y, e.x, 
					e.y, getColor() );
				   items.addElement( c );
				   backupMode = "D";
				   SendMe.append( "DC" );
				   SendMe.append( e.x );
				   SendMe.append( ',' );
				   SendMe.append( e.y );
				   SendMe.append( ',' );
				   break;
			    case 7: //cut
				   findMe = this.findObject( e.x, e.y );
				   if( findMe != null )
				   {
					backupX1 = findMe.getX1();
					backupY1 = findMe.getY1();
					backupX2 = findMe.getX2();
					backupY2 = findMe.getY2();
					backupMode = "C";
                                        backupObj = (obj) findMe.Assign(getColor());
					backupObj.setColor( findMe.getColor() );
					backupPoints.removeAllElements();
					int j;
					for (j=0;j< backupObj.pts.size();j++)
					{
						backupPoints.addElement(backupObj.pts.elementAt(j));
					}		
					SendMe.append( "C" );
					SendMe.append( e.x );
					SendMe.append( ',' );
					SendMe.append( e.y );
					SendMe.append( ',' );
					findMe.erase( g, this );
					items.removeElement( findMe );
					this.repaint();
				   }
				   break;
			     case 0: //move
				   findMe = this.findObject( e.x, e.y );
				   if( findMe != null )
				   {
				        findMe.Select = true;	
					SendMe.append( "M" );
					SendMe.append( e.x );
					SendMe.append( ',' );
					SendMe.append( e.y );
					SendMe.append( ',' );
					firstX = e.x;
					firstY = e.y;
					moveMe = findMe;
					backupX1 = findMe.getX1();
					backupY1 = findMe.getY1();
					backupX2 = findMe.getX2();
					backupY2 = findMe.getY2();
                                       	backupObj = (obj) findMe.Assign(getColor());
					backupPoints.removeAllElements();
					int i;
					for (i=0;i< backupObj.pts.size();i++)
					{
						backupPoints.addElement(backupObj.pts.elementAt(i));
					}		
					backupMode = "M";
					skip = 0;
				   }
				   break;
                             case 9: //text
                             /* 
			      * This case sets a default message and adds 
			      * it to the list of objects on the white board. 
			      */
				   String tempString;
				   tempString = SendMe.toString();
				   StringBuffer TextSendMe;
				   TextSendMe = new StringBuffer(tempString);

                                   String message;
                                    message = " ";

				   textBox text_message = new textBox(e.x, 
						e.y, e.x, e.y, getColor(), 
						10, message );

                                    text_message.setMessage();
				    text_message.type = "Text";

                                    TxtWrite messageBoard = new TxtWrite(
						clientDef, TextSendMe, 
						text_message, this);
                                    messageBoard.resize(600,100);
                                    messageBoard.setTitle("Message Board");
                                    messageBoard.show();

				    items.addElement( text_message );
				    SendMe.append( "TF" );
				    SendMe.append( e.x );
				    SendMe.append( ',' );
				    SendMe.append( e.y );
				    SendMe.append( ',' );

				    SendMe.append( "12" );
				    SendMe.append( ',' );
				    SendMe.append( message );
				    SendMe.append( ',' ); 
				    break;

				case 3: // oval
                                    oval o = new oval( e.x, e.y, 
						e.x, e.y, getColor() );
				    items.addElement( o );
				    SendMe.append( "DO" );
				    SendMe.append( e.x );
				    SendMe.append( ',' );
				    SendMe.append( e.y );
				    SendMe.append( ',' );
				    backupMode = "D";
				    break;
				case 10: // clear
				    this.ClearPage();
				    SendMe.append( "R" );
				    break;
                                case 6: // copy
				    findMe = this.findObject( e.x, e.y );
				    if( findMe != null )
				    {
					firstX = e.x;
					firstY = e.y;
				    	SendMe.append( "P" );
				    	SendMe.append( e.x );
				    	SendMe.append( ',' );
				    	SendMe.append( e.y );
				    	SendMe.append( ',' );
					moveMe = findMe.Assign( getColor());
				    	backupMode = "D";
                                        items.addElement(moveMe);
					skip = 0;
                                        stat = true;
				    }
                                    break;

// ********************* Dharma's addition  ********************************
                                case 5: // contLine
					firstClick++;	
					if (tk.contVar == 1)
					{
                                        	contline ct = new contline( e.x, e.y, e.x, e.y, getColor() ); 
						Cont_line_send = new StringBuffer();
						Cont_line_send.append( "W" );
						Cont_line_send.append( card.returnpg() );
						Cont_line_send.append( ":" );
				   		Cont_line_send.append( "DQ" );
					    	items.addElement(ct);
						backupPoints.removeAllElements();	
						tk.contVar = 0;
						Permit_cont_line = true;
						}
				
						temp = (obj) items.elementAt(items.size() - 1);	
						Permit_cont_line = true;
						if ( (e.x == prevX) && (e.y == prevY) )
						{
							tk.contVar = 1;
							Permit_cont_line = false;
							Cont_line_send.append( GetColor( temp.getColor() ) );
							Cont_line_send.insert(5,temp.pts.size());
				   			Cont_line_send.insert(6, ',' );
							clientDef.zCommDispatch( "_PM_", Cont_line_send.length(),
	Cont_line_send.toString() );
							break;
						}
						else
						{
 
						    	temp.storePoint(e.x,e.y);    
				   			Cont_line_send.append( e.x );
				   			Cont_line_send.append( ',' );
				   			Cont_line_send.append( e.y );
				   			Cont_line_send.append( ',' );
							Point backPoint = new Point(0,0);
							backPoint.x = e.x;
							backPoint.y = e.y;
							backupPoints.addElement(backPoint);
						    	prevX = e.x; prevY=e.y;

						}
						backupMode = "D";
						break;

// **********************************************************************

// ********************************* Dharma's **************************


					case 8: // undo

						this.Undo();
				    		SendMe.append( "U" );
						
				
			/*			obj cc = null;	
						int yy=items.size()-1, index,i;	

						
						if (backupMode.equals("D"))
						{
								
							cc = ( obj ) items.elementAt( yy );
							cc.erase( g, this );
							items.removeElement( cc );
						}
						else if (backupMode.equals("C"))
						     {
							if (backupObj.type.equals("Contline"))
							{
								backupObj.pts.removeAllElements();
								for (i=0;i < backupPoints.size(); i++)
								{
									backupObj.storePoint(backupPoints.elementAt(i));
								}
								Point tp_pt = new Point(0,0);
								tp_pt = (Point) backupPoints.elementAt(backupPoints.size()-1);
								backupObj.setX2(tp_pt.x);
								backupObj.setY2(tp_pt.y);
								
							}
							else
							{
									
								backupObj.setX1(backupX1);
								backupObj.setY1(backupY1);
								backupObj.setX2(backupX2);
								backupObj.setY2(backupY2);
							}
							backupObj.draw(g);
							items.addElement(backupObj);
						     }
						     else if (backupMode.equals("M"))
						     	  {

								cc = ( obj ) items.elementAt( findIndex1 );
								cc.erase( g, this );
								if (cc.type.equals("Contline"))
								{
									Point temp_pt = new Point(0,0);

									cc.pts.removeAllElements();

									for (i=0;i < backupPoints.size(); i++)
									{
										temp_pt = (Point) backupPoints.elementAt(i);
										cc.storePoint(temp_pt.x,temp_pt.y);
										cc.setX2(temp_pt.x);
										cc.setY2(temp_pt.y);
									}
								}
								else
								{
									cc.setX1(backupX1);
									cc.setY1(backupY1);
									cc.setX2(backupX2);
									cc.setY2(backupY2);
								}
								cc.draw(g);

							   } */
							backupMode = "disabled";
									
									
							
				break;

// ************************************* D *****************************8

  				default:
	System.out.println( "Please click an item from the Tool Kit!!!\n" );
				    break;
				}
			     break;
					
			case Event.MOUSE_DRAG:
			/*
			 * Listen carefully, since you can drag the 
			 * mouse across the white board without being 
			 * in the process of drawing a shape, we need 
			 * to make sure that there are items in our 
			 * Vector prior to continuing, otherwise we 
			 * would try to draw on items in a vector 
			 * that don't exist...
			 */
			if( itemSize < 0 )
			{
			    return( true );
			}

			if( tk.getMode() == 7 )
			{
			    return( true );
			}

			if( tk.getMode() == 8 )
			{
			    return( true );
			}

			if( ( tk.getMode() == 0 ) && ( moveMe == null ) )
			{
			    return( true );
			}

                        if( (tk.getMode() != 0))
			{
			    temp.erase( g, this ); // erase previous item
			}

			switch( tk.getMode() )
			{
			    case 0: // move
				moveMe.erase( g, this );
				moveMe.borderErase(g, this);
// ***************************** Dharma's *************************************


				if (moveMe.type.equals("Contline"))
				{
					moveMe.rePosition(firstX, firstY, e.x, e.y);
					last_pt = (Point) moveMe.pts.elementAt((moveMe.pts.size()-1));
					moveMe.setX2(last_pt.x);
					moveMe.setY2(last_pt.y);
				}
				else
				{

// ************************************** D *******************************
				if( e.x < firstX )
				{
                                    moveMe.setX1( moveMe.getX1() - 
					( firstX - e.x ) );
                                    moveMe.setX2( moveMe.getX2() - 
					( firstX - e.x ) );
				}

				if( e.x > firstX )
				{
                                    moveMe.setX1( moveMe.getX1() + 
					( e.x - firstX ) );
                                    moveMe.setX2( moveMe.getX2() + 
					( e.x - firstX ) );
				}

				if( e.y < firstY )
				{
                                    moveMe.setY1( moveMe.getY1() - 
					( firstY - e.y ) );
                                    moveMe.setY2( moveMe.getY2() - 
					( firstY - e.y ) );
				}

				if( e.y > firstY )
				{
                                    moveMe.setY1( moveMe.getY1() + 
					( e.y - firstY ) );
                                    moveMe.setY2( moveMe.getY2() + 
					( e.y - firstY ) );
				}
				}

				moveMe.draw( g );
				moveMe.hilightObject( g );
                                firstX=e.x;
                                firstY=e.y;

				break;

                            case 6:
				if (moveMe != null)
				{
				    Point lt_pt = new Point(0,0);

                                    if (stat == false)
				    {
                                        moveMe.erase(g,this);
                                    }
                                    moveMe.erase(g,this);
				    if (moveMe.type.equals("Contline"))
				    {
						moveMe.rePosition(firstX, firstY, e.x, e.y);
						lt_pt = (Point) moveMe.pts.elementAt((moveMe.pts.size()-1));
						moveMe.setX2(lt_pt.x);
						moveMe.setY2(lt_pt.y);
				    }
				   else
				   {
			    		if( e.x < firstX )
				    	{
                                        	moveMe.setX1(moveMe.getX1() -
					     	(firstX - e.x));
                                        	moveMe.setX2( moveMe.getX2() - 
					     	(firstX - e.x));
				    	}

				    	if( e.x > firstX )
				    	{
                                        	moveMe.setX1( moveMe.getX1() + 
					     	(e.x - firstX));
                                        	moveMe.setX2( moveMe.getX2() + 
					     	(e.x - firstX));
				    	}

				    	if( e.y < firstY )
				    	{
                                        	moveMe.setY1( moveMe.getY1() - 
					    	(firstY - e.y));
                                        	moveMe.setY2( moveMe.getY2() - 
					    	(firstY - e.y));
				    	}

				    	if( e.y > firstY )
				    	{
                                        	moveMe.setY1( moveMe.getY1() + 
					     	(e.y - firstY));
                                        	moveMe.setY2( moveMe.getY2() + 
					     	(e.y - firstY));
				    	}
				}

				    moveMe.draw( g );
                                    firstX=e.x;
                                    firstY=e.y;
                                    stat = false;
				}
				break;
                                                
			    default:
				temp.setX2( e.x );
				temp.setY2( e.y );
				break;
			}

                        if( (tk.getMode() != 0) && (tk.getMode() != 6) )
			{
			    temp.draw( g ); 	// draw
			}
			break;
		    case Event.MOUSE_UP:
			moveMe = null;

			switch( tk.getMode() )
			{
			    case 4:
			    case 1:
			    case 2:
			    case 0:
			    case 6:
				SendMe.append( e.x );
				SendMe.append( ',' );
				SendMe.append( e.y );
				SendMe.append( ',' );
				SendMe.append( GetColor( temp.getColor() ) );
				break;

// ************** Graham Mehl made changes below this line ****************** 
			    case 9:
				SendMe.append( e.x );
				SendMe.append( ',' );
				SendMe.append( e.y );
				SendMe.append( ',' );
				SendMe.append( GetColor( temp.getColor() ) );
// ************** Graham Mehl made changes above this line ****************** 
				break;
			    case 3:
				SendMe.append( temp.getX2() );
				SendMe.append( ',' );
				SendMe.append( temp.getY2() );
				SendMe.append( ',' );
				SendMe.append( GetColor( temp.getColor() ) );
				break;
			}

			if (tk.getMode() !=5)
			clientDef.zCommDispatch( "_PM_", SendMe.length(), 
				SendMe.toString() );

			    /*
			     * Make sure all current object are on the
			     * current whiteboard
			     */
			     repaint();


			break;
		}

		/*
		 * free graphics context
		 */
		g.dispose();

		/*
		 * we return true so that event does not cascade
		 * up the class hierarchy
		 */
		return( true );
	}
}


Villanova Univ. Seal Top of Paper | Previous Page | Next Page | Bottom of Paper

Written By Graham L. Mehl
Last Modified on April 23, 1996
© Villanova University
</