private void estimateContentTabAreaBorderColor(
      PanePainter pane, int index, final Direction direction) {
    Dimension preSize = pane.getSize();

    reset(pane);

    pane.addTab(EMPTY_STRING, SizeIcon.EMPTY, getComponent());

    pane.setSelectedIndex(-1);

    Dimension paneSize = pane.getMinimumSize();

    if (direction.isHorizontal()) pane.setSize(paneSize.width, paneSize.height * 2);
    else pane.setSize(paneSize.width * 2, paneSize.height);

    pane.doValidation();

    Rectangle tabBounds = pane.getBoundsAt(0);

    BufferedImage img =
        new BufferedImage(pane.getWidth(), pane.getHeight(), BufferedImage.TYPE_INT_ARGB);

    int x = 0;
    int y = 0;

    if (direction == Direction.UP) {
      x = tabBounds.x + (tabBounds.width / 2);
      y = pane.getHeight() - contentInsets[index].top - contentInsets[index].bottom - 1;
    } else if (direction == Direction.DOWN) {
      x = tabBounds.x + (tabBounds.width / 2);
      y = contentInsets[index].top + contentInsets[index].bottom;
    } else if (direction == Direction.LEFT) {
      x = pane.getWidth() - contentInsets[index].left - contentInsets[index].right - 1;
      y = tabBounds.y + (tabBounds.height / 2);
    } else {
      x += contentInsets[index].left + contentInsets[index].right;
      y = tabBounds.y + (tabBounds.height / 2);
    }

    final int px = x;
    final int py = y;

    RGBImageFilter colorFilter =
        new RGBImageFilter() {
          @Override
          public int filterRGB(int x, int y, int rgb) {
            if (px == x && py == y) {
              int r = (rgb >> 16) & 0xff;
              int g = (rgb >> 8) & 0xff;
              int b = (rgb) & 0xff;
              int a = (rgb >> 24) & 0xff;
              contentTabAreaBorderColors[getDirectionIndex(direction.getOpposite())] =
                  new Color(r, g, b, a);
            }

            return rgb;
          }
        };

    FilteredImageSource source = new FilteredImageSource(img.getSource(), colorFilter);
    pane.paint(img.getGraphics());

    BufferedImage img2 =
        new BufferedImage(pane.getWidth(), pane.getHeight(), BufferedImage.TYPE_INT_ARGB);
    img2.getGraphics().drawImage(Toolkit.getDefaultToolkit().createImage(source), 0, 0, null);

    pane.setSize(preSize);

    pane.doValidation();
  }
  private void calculateAreaInsets(PanePainter pane, int index, Direction direction) {

    // Area insets
    pane.setSelectedIndex(0);
    Rectangle selectedBounds = pane.getBoundsAt(0);
    pane.setSelectedIndex(DEFAULT_SELECTED_INDEX);

    Rectangle normalBounds = pane.getBoundsAt(0);
    int left = 0;
    int top = 0;
    int bottom = 0;
    int right = 0;

    if (direction == Direction.UP) {
      left = Math.min(selectedBounds.x, normalBounds.x);
      top = Math.min(selectedBounds.y, normalBounds.y);
      bottom = 0;
    } else if (direction == Direction.DOWN) {
      left = Math.min(selectedBounds.x, normalBounds.x);
      top = 0;
      bottom =
          pane.getHeight()
              - Math.max(
                  selectedBounds.y + selectedBounds.height, normalBounds.y + normalBounds.height);
    } else if (direction == Direction.LEFT) {
      top = Math.min(selectedBounds.y, normalBounds.y);
      left = Math.min(selectedBounds.x, normalBounds.x);
      right = 0;
    } else {
      top = Math.min(selectedBounds.y, normalBounds.y);
      left = 0;
      right =
          pane.getWidth()
              - Math.max(
                  selectedBounds.x + selectedBounds.width, normalBounds.x + normalBounds.width);
    }

    Dimension sizeTemp = pane.getSize();

    reset(pane);

    for (int i = 0; i < 4; i++) pane.addTab(EMPTY_STRING, SizeIcon.EMPTY, getComponent());

    pane.setSelectedIndex(-1);

    pane.setSize(pane.getMinimumSize());
    pane.doValidation();

    if (!direction.isHorizontal()) {
      int width = pane.getWidth() - 1;

      boolean found = false;

      while (!found) {
        width++;
        pane.setSize(width, pane.getHeight());

        pane.doValidation();
        found = pane.getBoundsAt(0).y == pane.getBoundsAt(3).y;
      }

      Rectangle endBounds = pane.getBoundsAt(3);
      right = pane.getWidth() - endBounds.x - endBounds.width - spacings[index];
    } else {
      int height = pane.getHeight() - 1;

      boolean found = false;

      while (!found) {
        height++;
        pane.setSize(pane.getWidth(), height);

        pane.doValidation();
        found = pane.getBoundsAt(0).x == pane.getBoundsAt(3).x;
      }

      Rectangle endBounds = pane.getBoundsAt(3);
      bottom = pane.getHeight() - endBounds.y - endBounds.height - spacings[index];
    }

    areaInsets[index] = new Insets(top, left, bottom, right);

    pane.setSize(sizeTemp);

    pane.doValidation();
  }