public void mouseUp(MouseEvent e, int x, int y) {
    // ask the associated board figure to perform its associated action based
    // upon the coordinates of mouse down and mouse up (move or click)
    if ( clickedFigure != null ) {
      boolean valid = clickedFigure.performAction(fStartX, fStartY, 
                                                  fLastX, fLastY);
      // if the figure's associate domain model tell the move is invalid
      // then move it back to its starting position.
      if ( ! valid && clickedFigure.isMobile() ) {
        // move it back
        int dx = fStartX - x;
        int dy = fStartY - y;
        if (draggedFigure != null ) { draggedFigure.moveBy(dx, dy); }
      }
    }
    // unlock the drawing's concurrency lock
    if (draggedFigure != null) {
      editor.drawing().unlock();
    }
    clickedFigure = null;
    draggedFigure = null;
  }