public void flipHandleIfNeeded(boolean flipX, boolean flipY) {
    PBoundsLocator l = (PBoundsLocator) getLocator();

    if (flipX || flipY) {
      switch (l.getSide()) {
        case SwingConstants.NORTH:
          {
            if (flipY) {
              l.setSide(SwingConstants.SOUTH);
            }
            break;
          }

        case SwingConstants.SOUTH:
          {
            if (flipY) {
              l.setSide(SwingConstants.NORTH);
            }
            break;
          }

        case SwingConstants.EAST:
          {
            if (flipX) {
              l.setSide(SwingConstants.WEST);
            }
            break;
          }

        case SwingConstants.WEST:
          {
            if (flipX) {
              l.setSide(SwingConstants.EAST);
            }
            break;
          }

        case SwingConstants.NORTH_WEST:
          {
            if (flipX && flipY) {
              l.setSide(SwingConstants.SOUTH_EAST);
            } else if (flipX) {
              l.setSide(SwingConstants.NORTH_EAST);
            } else if (flipY) {
              l.setSide(SwingConstants.SOUTH_WEST);
            }

            break;
          }

        case SwingConstants.SOUTH_WEST:
          {
            if (flipX && flipY) {
              l.setSide(SwingConstants.NORTH_EAST);
            } else if (flipX) {
              l.setSide(SwingConstants.SOUTH_EAST);
            } else if (flipY) {
              l.setSide(SwingConstants.NORTH_WEST);
            }
            break;
          }

        case SwingConstants.NORTH_EAST:
          {
            if (flipX && flipY) {
              l.setSide(SwingConstants.SOUTH_WEST);
            } else if (flipX) {
              l.setSide(SwingConstants.NORTH_WEST);
            } else if (flipY) {
              l.setSide(SwingConstants.SOUTH_EAST);
            }
            break;
          }

        case SwingConstants.SOUTH_EAST:
          {
            if (flipX && flipY) {
              l.setSide(SwingConstants.NORTH_WEST);
            } else if (flipX) {
              l.setSide(SwingConstants.SOUTH_WEST);
            } else if (flipY) {
              l.setSide(SwingConstants.NORTH_EAST);
            }
            break;
          }
      }
    }

    // reset locator to update layout
    setLocator(l);
  }