|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package com.sun.java.swing.plaf.motif; |
|
|
|
import java.awt.*; |
|
import java.awt.event.*; |
|
import javax.swing.*; |
|
import javax.swing.event.*; |
|
import javax.swing.plaf.*; |
|
import javax.swing.plaf.basic.BasicTabbedPaneUI; |
|
import java.io.Serializable; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class MotifTabbedPaneUI extends BasicTabbedPaneUI |
|
{ |
|
|
|
// Instance variables initialized at installation |
|
|
|
protected Color unselectedTabBackground; |
|
protected Color unselectedTabForeground; |
|
protected Color unselectedTabShadow; |
|
protected Color unselectedTabHighlight; |
|
|
|
|
|
// UI creation |
|
|
|
public static ComponentUI createUI(JComponent tabbedPane) { |
|
return new MotifTabbedPaneUI(); |
|
} |
|
|
|
|
|
// UI Installation/De-installation |
|
|
|
|
|
protected void installDefaults() { |
|
super.installDefaults(); |
|
|
|
unselectedTabBackground = UIManager.getColor("TabbedPane.unselectedTabBackground"); |
|
unselectedTabForeground = UIManager.getColor("TabbedPane.unselectedTabForeground"); |
|
unselectedTabShadow = UIManager.getColor("TabbedPane.unselectedTabShadow"); |
|
unselectedTabHighlight = UIManager.getColor("TabbedPane.unselectedTabHighlight"); |
|
} |
|
|
|
protected void uninstallDefaults() { |
|
super.uninstallDefaults(); |
|
|
|
unselectedTabBackground = null; |
|
unselectedTabForeground = null; |
|
unselectedTabShadow = null; |
|
unselectedTabHighlight = null; |
|
} |
|
|
|
// UI Rendering |
|
|
|
protected void paintContentBorderTopEdge(Graphics g, int tabPlacement, |
|
int selectedIndex, |
|
int x, int y, int w, int h) { |
|
Rectangle selRect = selectedIndex < 0? null : |
|
getTabBounds(selectedIndex, calcRect); |
|
g.setColor(lightHighlight); |
|
|
|
// Draw unbroken line if tabs are not on TOP, OR |
|
// selected tab is not visible (SCROLL_TAB_LAYOUT) |
|
|
|
if (tabPlacement != TOP || selectedIndex < 0 || |
|
(selRect.x < x || selRect.x > x + w)) { |
|
g.drawLine(x, y, x+w-2, y); |
|
} else { |
|
|
|
g.drawLine(x, y, selRect.x - 1, y); |
|
if (selRect.x + selRect.width < x + w - 2) { |
|
g.drawLine(selRect.x + selRect.width, y, |
|
x+w-2, y); |
|
} |
|
} |
|
} |
|
|
|
protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement, |
|
int selectedIndex, |
|
int x, int y, int w, int h) { |
|
Rectangle selRect = selectedIndex < 0? null : |
|
getTabBounds(selectedIndex, calcRect); |
|
g.setColor(shadow); |
|
|
|
// Draw unbroken line if tabs are not on BOTTOM, OR |
|
// selected tab is not visible (SCROLL_TAB_LAYOUT) |
|
|
|
if (tabPlacement != BOTTOM || selectedIndex < 0 || |
|
(selRect.x < x || selRect.x > x + w)) { |
|
g.drawLine(x+1, y+h-1, x+w-1, y+h-1); |
|
} else { |
|
|
|
g.drawLine(x+1, y+h-1, selRect.x - 1, y+h-1); |
|
if (selRect.x + selRect.width < x + w - 2) { |
|
g.drawLine(selRect.x + selRect.width, y+h-1, x+w-2, y+h-1); |
|
} |
|
} |
|
} |
|
|
|
protected void paintContentBorderRightEdge(Graphics g, int tabPlacement, |
|
int selectedIndex, |
|
int x, int y, int w, int h) { |
|
Rectangle selRect = selectedIndex < 0? null : |
|
getTabBounds(selectedIndex, calcRect); |
|
g.setColor(shadow); |
|
// Draw unbroken line if tabs are not on RIGHT, OR |
|
// selected tab is not visible (SCROLL_TAB_LAYOUT) |
|
|
|
if (tabPlacement != RIGHT || selectedIndex < 0 || |
|
(selRect.y < y || selRect.y > y + h)) { |
|
g.drawLine(x+w-1, y+1, x+w-1, y+h-1); |
|
} else { |
|
|
|
g.drawLine(x+w-1, y+1, x+w-1, selRect.y - 1); |
|
if (selRect.y + selRect.height < y + h - 2 ) { |
|
g.drawLine(x+w-1, selRect.y + selRect.height, |
|
x+w-1, y+h-2); |
|
} |
|
} |
|
} |
|
|
|
protected void paintTabBackground(Graphics g, |
|
int tabPlacement, int tabIndex, |
|
int x, int y, int w, int h, |
|
boolean isSelected ) { |
|
g.setColor(isSelected? tabPane.getBackgroundAt(tabIndex) : unselectedTabBackground); |
|
switch(tabPlacement) { |
|
case LEFT: |
|
g.fillRect(x+1, y+1, w-1, h-2); |
|
break; |
|
case RIGHT: |
|
g.fillRect(x, y+1, w-1, h-2); |
|
break; |
|
case BOTTOM: |
|
g.fillRect(x+1, y, w-2, h-3); |
|
g.drawLine(x+2, y+h-3, x+w-3, y+h-3); |
|
g.drawLine(x+3, y+h-2, x+w-4, y+h-2); |
|
break; |
|
case TOP: |
|
default: |
|
g.fillRect(x+1, y+3, w-2, h-3); |
|
g.drawLine(x+2, y+2, x+w-3, y+2); |
|
g.drawLine(x+3, y+1, x+w-4, y+1); |
|
} |
|
|
|
} |
|
|
|
protected void paintTabBorder(Graphics g, |
|
int tabPlacement, int tabIndex, |
|
int x, int y, int w, int h, |
|
boolean isSelected) { |
|
g.setColor(isSelected? lightHighlight : unselectedTabHighlight); |
|
|
|
switch(tabPlacement) { |
|
case LEFT: |
|
g.drawLine(x, y+2, x, y+h-3); |
|
g.drawLine(x+1, y+1, x+1, y+2); |
|
g.drawLine(x+2, y, x+2, y+1); |
|
g.drawLine(x+3, y, x+w-1, y); |
|
g.setColor(isSelected? shadow : unselectedTabShadow); |
|
g.drawLine(x+1, y+h-3, x+1, y+h-2); |
|
g.drawLine(x+2, y+h-2, x+2, y+h-1); |
|
g.drawLine(x+3, y+h-1, x+w-1, y+h-1); |
|
break; |
|
case RIGHT: |
|
g.drawLine(x, y, x+w-3, y); |
|
g.setColor(isSelected? shadow : unselectedTabShadow); |
|
g.drawLine(x+w-3, y, x+w-3, y+1); |
|
g.drawLine(x+w-2, y+1, x+w-2, y+2); |
|
g.drawLine(x+w-1, y+2, x+w-1, y+h-3); |
|
g.drawLine(x+w-2, y+h-3, x+w-2, y+h-2); |
|
g.drawLine(x+w-3, y+h-2, x+w-3, y+h-1); |
|
g.drawLine(x, y+h-1, x+w-3, y+h-1); |
|
break; |
|
case BOTTOM: |
|
g.drawLine(x, y, x, y+h-3); |
|
g.drawLine(x+1, y+h-3, x+1, y+h-2); |
|
g.drawLine(x+2, y+h-2, x+2, y+h-1); |
|
g.setColor(isSelected? shadow : unselectedTabShadow); |
|
g.drawLine(x+3, y+h-1, x+w-4, y+h-1); |
|
g.drawLine(x+w-3, y+h-2, x+w-3, y+h-1); |
|
g.drawLine(x+w-2, y+h-3, x+w-2, y+h-2); |
|
g.drawLine(x+w-1, y, x+w-1, y+h-3); |
|
break; |
|
case TOP: |
|
default: |
|
g.drawLine(x, y+2, x, y+h-1); |
|
g.drawLine(x+1, y+1, x+1, y+2); |
|
g.drawLine(x+2, y, x+2, y+1); |
|
g.drawLine(x+3, y, x+w-4, y); |
|
g.setColor(isSelected? shadow : unselectedTabShadow); |
|
g.drawLine(x+w-3, y, x+w-3, y+1); |
|
g.drawLine(x+w-2, y+1, x+w-2, y+2); |
|
g.drawLine(x+w-1, y+2, x+w-1, y+h-1); |
|
} |
|
|
|
} |
|
|
|
protected void paintFocusIndicator(Graphics g, int tabPlacement, |
|
Rectangle[] rects, int tabIndex, |
|
Rectangle iconRect, Rectangle textRect, |
|
boolean isSelected) { |
|
Rectangle tabRect = rects[tabIndex]; |
|
if (tabPane.hasFocus() && isSelected) { |
|
int x, y, w, h; |
|
g.setColor(focus); |
|
switch(tabPlacement) { |
|
case LEFT: |
|
x = tabRect.x + 3; |
|
y = tabRect.y + 3; |
|
w = tabRect.width - 6; |
|
h = tabRect.height - 7; |
|
break; |
|
case RIGHT: |
|
x = tabRect.x + 2; |
|
y = tabRect.y + 3; |
|
w = tabRect.width - 6; |
|
h = tabRect.height - 7; |
|
break; |
|
case BOTTOM: |
|
x = tabRect.x + 3; |
|
y = tabRect.y + 2; |
|
w = tabRect.width - 7; |
|
h = tabRect.height - 6; |
|
break; |
|
case TOP: |
|
default: |
|
x = tabRect.x + 3; |
|
y = tabRect.y + 3; |
|
w = tabRect.width - 7; |
|
h = tabRect.height - 6; |
|
} |
|
g.drawRect(x, y, w, h); |
|
} |
|
} |
|
|
|
protected int getTabRunIndent(int tabPlacement, int run) { |
|
return run*3; |
|
} |
|
|
|
protected int getTabRunOverlay(int tabPlacement) { |
|
tabRunOverlay = (tabPlacement == LEFT || tabPlacement == RIGHT)? |
|
(int)Math.round((float)maxTabWidth * .10) : |
|
(int)Math.round((float)maxTabHeight * .22); |
|
|
|
// Ensure that runover lay is not more than insets |
|
|
|
switch(tabPlacement) { |
|
case LEFT: |
|
if( tabRunOverlay > tabInsets.right - 2 ) |
|
tabRunOverlay = tabInsets.right - 2 ; |
|
break; |
|
case RIGHT: |
|
if( tabRunOverlay > tabInsets.left - 2 ) |
|
tabRunOverlay = tabInsets.left - 2 ; |
|
break; |
|
case TOP: |
|
if( tabRunOverlay > tabInsets.bottom - 2 ) |
|
tabRunOverlay = tabInsets.bottom - 2 ; |
|
break; |
|
case BOTTOM: |
|
if( tabRunOverlay > tabInsets.top - 2 ) |
|
tabRunOverlay = tabInsets.top - 2 ; |
|
break; |
|
|
|
} |
|
|
|
return tabRunOverlay; |
|
} |
|
|
|
} |