Mega Code Archive
Single Row Tabbed Pane Example 2
// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicArrowButton;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import javax.swing.plaf.metal.MetalTabbedPaneUI;
public class SingleRowTabbedPaneExample2 extends JPanel {
public SingleRowTabbedPaneExample2() {
setLayout(new BorderLayout());
SingleRowTabbedPane tabbedPane = new SingleRowTabbedPane(
SingleRowTabbedPane.TWO_BUTTONS, SwingConstants.RIGHT);
String tabs[] = {"One", "Two", "Three", "Four", "Five",
"Six", "Seven","Eight","Nine", "Ten" };
for (int i=0;i h)
|| !((SingleRowTabbedPane) tabPane).isVisibleTab(selectedIndex)) {
g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);
} else {
Rectangle selRect = rects[selectedIndex];
g.drawLine(x, y + h - 1, selRect.x, y + h - 1);
if (selRect.x + selRect.width < x + w - 2) {
g.drawLine(selRect.x + selRect.width, y + h - 1, x + w - 1, y
+ h - 1);
}
}
}
protected Insets getTabAreaInsets(int tabPlacement) {
SingleRowTabbedPane stabPane = (SingleRowTabbedPane) tabPane;
Dimension d = stabPane.getButtonPreferredSize();
int n = stabPane.getButtonCount();
int buttonPlacement = stabPane.getButtonPlacement();
Insets currentInsets = new Insets(0, 0, 0, 0);
if (tabPlacement == TOP) {
currentInsets.top = tabAreaInsets.top;
currentInsets.bottom = tabAreaInsets.bottom;
} else {
currentInsets.top = tabAreaInsets.bottom;
currentInsets.bottom = tabAreaInsets.top;
}
if (buttonPlacement == RIGHT) {
currentInsets.left = tabAreaInsets.left;
currentInsets.right = tabAreaInsets.right + n * d.width;
} else {
currentInsets.left = tabAreaInsets.left + n * d.width;
currentInsets.right = tabAreaInsets.right;
}
return currentInsets;
}
protected int lastTabInRun(int tabCount, int run) {
SingleRowTabbedPane stabPane = (SingleRowTabbedPane) tabPane;
return stabPane.getVisibleStartIndex() + stabPane.getVisibleCount() - 1;
}
protected void ensureCurrentLayout() {
SingleRowTabbedLayout layout = (SingleRowTabbedLayout) tabPane
.getLayout();
layout.calculateLayoutInfo();
setButtonsEnabled();
}
protected void setButtonsEnabled() {
SingleRowTabbedPane stabPane = (SingleRowTabbedPane) tabPane;
int visibleCount = stabPane.getVisibleCount();
int visibleStartIndex = stabPane.getVisibleStartIndex();
JButton[] buttons = stabPane.getButtons();
boolean lEnable = 0 < visibleStartIndex;
boolean rEnable = visibleStartIndex + visibleCount < tabPane
.getTabCount();
for (int i = 0; i < buttons.length; i++) {
boolean enable = false;
String str = buttons[i].getActionCommand();
if (str.equals(SingleRowTabbedPane.ROTATE)) {
enable = lEnable || rEnable;
} else if (str.equals(SingleRowTabbedPane.PREVIOUS)) {
enable = lEnable;
} else if (str.equals(SingleRowTabbedPane.NEXT)) {
enable = rEnable;
} else if (str.equals(SingleRowTabbedPane.FIRST)) {
enable = lEnable;
} else if (str.equals(SingleRowTabbedPane.LEFT_SHIFT)) {
enable = lEnable;
} else if (str.equals(SingleRowTabbedPane.RIGHT_SHIFT)) {
enable = rEnable;
} else if (str.equals(SingleRowTabbedPane.LAST)) {
enable = rEnable;
}
buttons[i].setEnabled(enable);
}
}
//
// Tab Navigation by Key
// (Not yet done)
//
protected void ensureVisibleTabAt(int index) {
SingleRowTabbedPane stabPane = (SingleRowTabbedPane) tabPane;
int visibleCount = stabPane.getVisibleCount();
int visibleStartIndex = stabPane.getVisibleStartIndex();
int visibleEndIndex = visibleStartIndex + visibleCount - 1;
if (visibleStartIndex < index && index < visibleEndIndex) {
return;
}
int selectedIndex = tabPane.getSelectedIndex();
boolean directionIsRight = (0 < index - selectedIndex) ? true : false;
//if (directionIsRight) {
if (index <= visibleStartIndex) {
//System.out.println("dec");
if (visibleStartIndex == 0)
return;
stabPane.setVisibleStartIndex(--visibleStartIndex);
((SingleRowTabbedLayout) tabPane.getLayout()).calculateLayoutInfo();
int count = stabPane.getVisibleCount();
int startIndex = stabPane.getVisibleStartIndex();
if (startIndex <= index && index <= startIndex + count - 1) {
} else {
stabPane.setVisibleStartIndex(++visibleStartIndex);
}
}
//} else {
if (visibleEndIndex <= index) {
//System.out.println("inc");
if (visibleStartIndex == visibleCount + 1)
return;
stabPane.setVisibleStartIndex(++visibleStartIndex);
((SingleRowTabbedLayout) tabPane.getLayout()).calculateLayoutInfo();
int count = stabPane.getVisibleCount();
int startIndex = stabPane.getVisibleStartIndex();
if (startIndex <= index && index <= startIndex + count - 1) {
} else {
stabPane.setVisibleStartIndex(--visibleStartIndex);
}
}
//}
int c = stabPane.getVisibleCount();
int s = stabPane.getVisibleStartIndex();
}
protected void selectNextTab(int current) {
for (int i = current + 1; i < tabPane.getTabCount(); i++) {
if (tabPane.isEnabledAt(i)) {
ensureVisibleTabAt(i);
tabPane.setSelectedIndex(i);
break;
}
}
}
protected void selectPreviousTab(int current) {
for (int i = current - 1; 0 <= i; i--) {
if (tabPane.isEnabledAt(i)) {
ensureVisibleTabAt(i);
tabPane.setSelectedIndex(i);
break;
}
}
}
/*
* not used protected int getPreviousTabIndex(int base) { int tabIndex =
* base - 1; return (tabIndex < 0? 0: tabIndex); }
*
* protected int getNextTabIndex(int base) { int tabIndex = base + 1; return
* (tabPane.getTabCount() <= tabIndex? tabIndex-1: tabIndex); }
*/
//
// these methods exist for innerclass
//
void setMaxTabHeight(int maxTabHeight) {
this.maxTabHeight = maxTabHeight;
}
int getMaxTabHeight() {
return maxTabHeight;
}
Rectangle[] getRects() {
return rects;
}
SingleRowTabbedPane getTabbedPane() {
return (SingleRowTabbedPane) tabPane;
}
protected FontMetrics getFontMetrics() {
Font font = tabPane.getFont();
return Toolkit.getDefaultToolkit().getFontMetrics(font);
}
protected int calculateMaxTabHeight(int tabPlacement) {
return super.calculateMaxTabHeight(tabPlacement);
}
protected int calculateTabWidth(int tabPlacement, int tabIndex,
FontMetrics metrics) {
return super.calculateTabWidth(tabPlacement, tabIndex, metrics);
}
protected void assureRectsCreated(int tabCount) {
super.assureRectsCreated(tabCount);
}
//
// Layout
//
class SingleRowTabbedLayout extends BasicTabbedPaneUI.TabbedPaneLayout {
JTabbedPane tabPane;
SingleRowTabbedLayout(JTabbedPane tabPane) {
this.tabPane = tabPane;
}
public void layoutContainer(Container parent) {
super.layoutContainer(parent);
if (tabPane.getComponentCount() < 1) {
return;
}
int tabPlacement = tabPane.getTabPlacement();
int maxTabHeight = calculateMaxTabHeight(tabPlacement);
Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
Insets insets = tabPane.getInsets();
Rectangle bounds = tabPane.getBounds();
SingleRowTabbedPane stabPane = (SingleRowTabbedPane) tabPane;
Dimension d = stabPane.getButtonPreferredSize();
JButton[] buttons = stabPane.getButtons();
int buttonPlacement = stabPane.getButtonPlacement();
int x =0, y=0;
if (tabPlacement == TOP) { // TOP
y = bounds.y + insets.top + tabAreaInsets.top;
} else { // BOTTOM
y = bounds.y + bounds.height - insets.bottom
- tabAreaInsets.bottom - maxTabHeight;
}
if (buttonPlacement == RIGHT) { // RIGHT
x = bounds.x + bounds.width - insets.right;
for (int i = buttons.length - 1; 0 <= i; i--) {
x -= d.width;
buttons[i].setBounds(x, y, d.width, d.height);
}
} else { // LEFT
x = bounds.x + insets.left;
for (int i = 0; i < buttons.length; i++) {
buttons[i].setBounds(x, y, d.width, d.height);
x += d.width;
}
}
}
public void calculateLayoutInfo() {
int tabCount = tabPane.getTabCount();
assureRectsCreated(tabCount);
calculateTabWidths(tabPane.getTabPlacement(), tabCount);
calculateTabRects(tabPane.getTabPlacement(), tabCount);
}
protected void calculateTabWidths(int tabPlacement, int tabCount) {
if (tabCount == 0) {
return;
}
FontMetrics metrics = getFontMetrics();
int fontHeight = metrics.getHeight();
int maxTabHeight = calculateMaxTabHeight(tabPlacement);
setMaxTabHeight(maxTabHeight);
Rectangle[] rects = getRects();
for (int i = 0; i < tabCount; i++) {
rects[i].width = calculateTabWidth(tabPlacement, i, metrics);
rects[i].height = maxTabHeight;
}
}
protected void calculateTabRects(int tabPlacement, int tabCount) {
if (tabCount == 0) {
return;
}
SingleRowTabbedPane stabPane = (SingleRowTabbedPane) tabPane;
Dimension size = tabPane.getSize();
Insets insets = tabPane.getInsets();
Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
int selectedIndex = tabPane.getSelectedIndex();
int maxTabHeight = getMaxTabHeight();
int x = insets.left + tabAreaInsets.left;
int y;
if (tabPlacement == TOP) {
y = insets.top + tabAreaInsets.top;
} else { // BOTTOM
y = size.height - insets.bottom - tabAreaInsets.bottom
- maxTabHeight;
}
int returnAt = size.width - (insets.right + tabAreaInsets.right);
Rectangle[] rects = getRects();
int visibleStartIndex = stabPane.getVisibleStartIndex();
int visibleCount = 0;
for (int i = visibleStartIndex; i < tabCount; i++) {
Rectangle rect = rects[i];
if (visibleStartIndex < i) {
rect.x = rects[i - 1].x + rects[i - 1].width;
} else {
rect.x = x;
}
if (rect.x + rect.width > returnAt) {
break;
} else {
visibleCount++;
rect.y = y;
}
}
stabPane.setVisibleCount(visibleCount);
stabPane.setVisibleStartIndex(visibleStartIndex);
}
}
//
// Listener
//
protected class ShiftTabs implements ActionListener {
SingleRowTabbedPane sPane;
public void actionPerformed(ActionEvent e) {
sPane = getTabbedPane();
int index = getStartIndex();
sPane.setVisibleStartIndex(index);
sPane.repaint();
}
//public abstract int getStartIndex();
protected int getStartIndex() {
return 0; // first tab
}
protected int getStartIndex(int lastIndex) {
Insets insets = sPane.getInsets();
Insets tabAreaInsets = getTabAreaInsets(sPane.getTabPlacement());
int width = sPane.getSize().width - (insets.left + insets.right)
- (tabAreaInsets.left + tabAreaInsets.right);
int index;
Rectangle[] rects = getRects();
for (index = lastIndex; 0 <= index; index--) {
width -= rects[index].width;
if (width < 0) {
break;
}
}
return ++index;
}
}
}
class StopArrowButton extends BasicArrowButton {
public StopArrowButton(int direction) {
super(direction);
}
public void paintTriangle(Graphics g, int x, int y, int size,
int direction, boolean isEnabled) {
super.paintTriangle(g, x, y, size, direction, isEnabled);
Color c = g.getColor();
if (isEnabled) {
g.setColor(UIManager.getColor("controlDkShadow"));
} else {
g.setColor(UIManager.getColor("controlShadow"));
}
g.translate(x, y);
size = Math.max(size, 2);
int mid = size / 2;
int h = size - 1;
if (direction == WEST) {
g.drawLine(-1, mid - h, -1, mid + h);
if (!isEnabled) {
g.setColor(UIManager.getColor("controlLtHighlight"));
g.drawLine(0, mid - h + 1, 0, mid - 1);
g.drawLine(0, mid + 2, 0, mid + h + 1);
}
} else { // EAST
g.drawLine(size, mid - h, size, mid + h);
if (!isEnabled) {
g.setColor(UIManager.getColor("controlLtHighlight"));
g.drawLine(size + 1, mid - h + 1, size + 1, mid + h + 1);
}
}
g.setColor(c);
}
}
interface TabbedPaneButton {
}