public void processMouseDragged(int x, int y)
    {
        // WE MAY HAVE TO USE VALUES IN POSE SPACE
        Rectangle2D.Double poseArea = zoomableCanvasState.getPoseArea();
        int incX = x - lastMouseDraggedX;
        int incY = y - lastMouseDraggedY;
        lastMouseDraggedX = x;
        lastMouseDraggedY = y;

        // IF WE ARE IN SHAPE_DRAG_MODE, THEN WHEREVER
        // THE MOUSE GOES IN THE POSE AREA THE SHAPE
        // MUST FOLLOW. NOTE THAT ONCE THE MOUSE
        // LEAVES THE POSE AREA WE NEED TO SWITCH
        // TO SHAPE_SELECTED_MODE
        if (state == PoseurState.DRAG_SHAPE_STATE)
        {
            // MAKE SURE WE'RE NOT WAY OFF THE POSE AREA
            if (poseArea.contains(x, y))
            {
                // DRAG THE SHAPE
                float zoomLevel = zoomableCanvasState.getZoomLevel();
                incX /= zoomLevel;
                incY /= zoomLevel;
                Rectangle2D.Double truePoseArea = trueCanvasState.getPoseArea();
                selectedShape.moveShape(incX, incY, truePoseArea);
                repaintCanvases();
            }
            // WE WENT WAY OFF THE EDGE, LET'S STOP DRAGGING
            else
            {
                setState(PoseurState.SHAPE_SELECTED_STATE);
            }
        }
        // THIS IS AFTER WE'VE STARTED RENDERING A SHAPE
        // AND ARE DRAGGING THE MOUSE TO COMPLETE IT
        else if (state == PoseurState.COMPLETE_SHAPE_STATE)
        {
            // WE HAVE TO USE POSE SPACE COORDINATES
            float zoomLevel = zoomableCanvasState.getZoomLevel();
            int poseSpaceX = (int)((x - poseArea.getX()) / zoomLevel);
            int poseSpaceY = (int)((y - poseArea.getY()) / zoomLevel);
            
            // IF WE'RE NOT IN THE POSE AREA, WE'RE NOT MAKING A SHAPE
            if (    (poseSpaceX < 0) ||
                    (poseSpaceY < 0) ||
                    (poseSpaceX >= poseArea.getWidth()) ||
                    (poseSpaceY >= poseArea.getHeight()))
            {
                // IF WE GO OUTSIDE THE POSE AREA START OVER
                setState(PoseurState.CREATE_SHAPE_STATE);
                shapeInProgress = null;
                return;
            }

            // IF WE GET HERE THE SHAPE IS BEING DRAWN
            shapeInProgress.updateShapeInProgress(poseSpaceX, poseSpaceY);
                
            // REPAINT OF COURSE
            repaintCanvases();           
        } 
    }