
     public class BehaviorCallback extends Behavior implements ActiveInterface
     {
        /**
         * Initializes this behavior
         */

         public void initialize()
         {
            WakeupCriterion[]   mouseEvents = new WakeupCriterion[5];
            mouseEvents[0] = new WakeupOnAWTEvent(MouseEvent.MOUSE_DRAGGED);
            mouseEvents[1] = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED);
            mouseEvents[2] = new WakeupOnElapsedFrames(0) ;
            mouseEvents[3] = new WakeupOnAWTEvent(MouseEvent.MOUSE_RELEASED);
            mouseEvents[4] = new WakeupOnAWTEvent(MouseEvent.MOUSE_CLICKED);
            mMouseCriterion = new WakeupOr(mouseEvents);
            wakeupOn (mMouseCriterion);
            setSchedulingBounds(new BoundingSphere(new Point3d(),
                                             Double.MAX_VALUE)) ;
         }

        /**
         * Implementation for handling mouse events. This is not called anywhere
         * but is invoked for current mouse event.
         *
         * @param inCriteria Criteria for this mouse event.
         */

         public void processStimulus (Enumeration inCriteria)
         {
                   System.out.println("Inside processStimulus") ;
             if(!mActiveFlag)
             {
               wakeupOn (mMouseCriterion);
               return;
             }

             WakeupCriterion wakeup;
             AWTEvent[] event;
             int id;
             int dx, dy;

             while (inCriteria.hasMoreElements())
             {
                wakeup = (WakeupCriterion) inCriteria.nextElement();
                if (wakeup instanceof WakeupOnAWTEvent)
                {
                   event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
                   for (int i=0; i<event.length; i++)
                   {
                       MouseEvent mevent = (MouseEvent) event[i];
                       if (!mevent.isMetaDown() && !mevent.isAltDown())
                       {
                           id = event[i].getID();
                           switch (id)
                           {
                              case MouseEvent.MOUSE_PRESSED:
                              case MouseEvent.MOUSE_CLICKED:

                                 if(mRenderType ==
                                         GraphConstants.RUBBER_DRAW_POLYGON)
                                 {
                                    setPrevMouse(mevent.getX(),mevent.getY()) ;
                                 }

                                 mMousePressFlag = true ;

                                 // Add an event when mouse is pressed.
                                 mInputQueue.add(mevent);
                                 System.out.println("Inside mouse pressed/clicked") ;
                                 startImmediateMode();

                                 if((mRenderType ==
                                    GraphConstants.RUBBER_DRAW_RECTANGLE) ||
                                    (mRenderType ==
                                    GraphConstants.RUBBER_DRAW_LINE))
                                 {
                                    setBase(mevent.getX(), mevent.getY()) ;
                                 }

                              break ;

                              case MouseEvent.MOUSE_DRAGGED:
                                 if(mMousePressFlag)
                                 {
                                    mInputQueue.add(mevent);
                                 System.out.println("Inside mouse dragged") ;
                                    double[] currentVal =
                                       convert2DPointTo3D(mevent.getX(),
                                       mevent.getY()) ;
                                    double[] baseCoord =
                                       convert2DPointTo3D(mBaseX, mBaseY) ;

                                    if((mRenderType ==
                                       GraphConstants.RUBBER_DRAW_RECTANGLE) ||
                                       (mRenderType ==
                                       GraphConstants.RUBBER_DRAW_LINE))
                                    {
                                       drawRect(baseCoord[0], baseCoord[1],
                                                currentVal[0], currentVal[1]) ;
                                    }
                                 }
                                 break;
                              case MouseEvent.MOUSE_RELEASED:

                                    mStopRenderFlag = true ;

                                    if((mRenderType ==
                                       GraphConstants.RUBBER_DRAW_RECTANGLE) ||
                                       (mRenderType ==
                                       GraphConstants.RUBBER_DRAW_LINE))
                                    {
                                       render(mevent.getX(), mevent.getY()) ;
                                       clearRender();
                                       finishImmediateMode();
                                    }

                                    if(mMousePressFlag)
                                    {
                                       mInputQueue.add(mevent);
                                 System.out.println("Inside mouse released") ;
                                    }

                                 break;
                           }
                       }
                   }
                }
             }
             wakeupOn (mMouseCriterion);
         }
         private WakeupOr mMouseCriterion;

         public boolean isActive()
         {
            return mActiveFlag ;
         }

         public void setActive(boolean  inActiveFlag)
         {
            mActiveFlag = inActiveFlag ;
         }

         private boolean  mActiveFlag = false ;
     }

