package net.sourceforge.squirrel_sql.client.gui.builders.dndtabbedpane; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; public class DndTabUtils { public static final Color TARGET_LINE_COLOR = new Color(0, 100, 255); public static final int RWH = 20; public static final int BUTTON_SIZE = 30; //xxx magic number of scroll button size public static final int LINEWIDTH = 3; static int getTargetTabIndex(Point glassPt, GhostGlassPane glassPane, JTabbedPane tabbedPane) { if(0 == tabbedPane.getTabCount()) { return 0; } Point tabPt = SwingUtilities.convertPoint(glassPane, glassPt, tabbedPane); boolean isTB = tabbedPane.getTabPlacement() == JTabbedPane.TOP || tabbedPane.getTabPlacement() == JTabbedPane.BOTTOM; for (int i = 0; i < tabbedPane.getTabCount(); i++) { Rectangle r = tabbedPane.getBoundsAt(i); if (isTB) r.setRect(r.x - r.width / 2, r.y, r.width, r.height); else r.setRect(r.x, r.y - r.height / 2, r.width, r.height); if (r.contains(tabPt)) return i; } Rectangle r = tabbedPane.getBoundsAt(tabbedPane.getTabCount() - 1); if (isTB) r.setRect(r.x + r.width / 2, r.y, r.width, r.height); else r.setRect(r.x, r.y + r.height / 2, r.width, r.height); return r.contains(tabPt) ? tabbedPane.getTabCount() : -1; } static Rectangle getTabAreaBounds(JTabbedPane tabbedPane) { Rectangle tabbedRect = tabbedPane.getBounds(); //pointed out by daryl. NullPointerException: i.e. addTab("Tab",null) //Rectangle compRect = getSelectedComponent().getBounds(); Component comp = tabbedPane.getSelectedComponent(); int idx = 0; while (comp == null && idx < tabbedPane.getTabCount()) { comp = tabbedPane.getComponentAt(idx++); } Rectangle compRect = (comp == null) ? new Rectangle() : comp.getBounds(); int tabPlacement = tabbedPane.getTabPlacement(); if (tabPlacement == SwingConstants.TOP) { tabbedRect.height = tabbedRect.height - compRect.height; } else if (tabPlacement == SwingConstants.BOTTOM) { tabbedRect.y = tabbedRect.y + compRect.y + compRect.height; tabbedRect.height = tabbedRect.height - compRect.height; } else if (tabPlacement == SwingConstants.LEFT) { tabbedRect.width = tabbedRect.width - compRect.width; } else if (tabPlacement == SwingConstants.RIGHT) { tabbedRect.x = tabbedRect.x + compRect.x + compRect.width; tabbedRect.width = tabbedRect.width - compRect.width; } tabbedRect.grow(2, 2); return tabbedRect; } static void initGlassPaneLocal(Point tabPt, DnDTabbedPaneData dnDTabbedPaneData, GhostGlassPane localGlassPane) { initGlassPane(tabPt, dnDTabbedPaneData, dnDTabbedPaneData, localGlassPane); } static void initGlassPane(Point tabPt, DnDTabbedPaneData localDnDTabbedPaneData, DnDTabbedPaneData outerDnDTabbedPaneData, GhostGlassPane localGlassPane) { localDnDTabbedPaneData.getTabbedPane().getRootPane().setGlassPane(localGlassPane); if (localDnDTabbedPaneData.isHasGhost()) { Rectangle rect = outerDnDTabbedPaneData.getTabbedPane().getBoundsAt(outerDnDTabbedPaneData.getDragTabIndex()); BufferedImage image = new BufferedImage(outerDnDTabbedPaneData.getTabbedPane().getWidth(), outerDnDTabbedPaneData.getTabbedPane().getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics g = image.getGraphics(); outerDnDTabbedPaneData.getTabbedPane().paint(g); rect.x = rect.x < 0 ? 0 : rect.x; rect.y = rect.y < 0 ? 0 : rect.y; // When scrollable tabbed panes are used tabs might be displayed in part. rect.width = Math.min(rect.width, outerDnDTabbedPaneData.getTabbedPane().getWidth() - rect.x); image = image.getSubimage(rect.x, rect.y, rect.width, rect.height); localGlassPane.setImage(image); } Point glassPt = SwingUtilities.convertPoint(localDnDTabbedPaneData.getTabbedPane(), tabPt, localGlassPane); localGlassPane.setPoint(glassPt); localGlassPane.setVisible(true); } static void hideGlassPane(GhostGlassPane glassPane, DnDTabbedPaneData dnDTabbedPaneData) { glassPane.setVisible(false); if (dnDTabbedPaneData.isHasGhost()) { glassPane.setImage(null); } } }