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(); }