package com.sun.java.swing.plaf.motif;
import sun.swing.SwingUtilities2;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.*;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
public class MotifBorders {
@SuppressWarnings("serial")
public static class BevelBorder extends AbstractBorder implements UIResource {
private Color darkShadow = UIManager.getColor("controlShadow");
private Color lightShadow = UIManager.getColor("controlLtHighlight");
private boolean isRaised;
public BevelBorder(boolean isRaised, Color darkShadow, Color lightShadow) {
this.isRaised = isRaised;
this.darkShadow = darkShadow;
this.lightShadow = lightShadow;
}
public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
g.setColor((isRaised) ? lightShadow : darkShadow);
g.drawLine(x, y, x+w-1, y);
g.drawLine(x, y+h-1, x, y+1);
g.setColor((isRaised) ? darkShadow : lightShadow);
g.drawLine(x+1, y+h-1, x+w-1, y+h-1);
g.drawLine(x+w-1, y+h-1, x+w-1, y+1);
}
public Insets getBorderInsets(Component c, Insets insets) {
insets.set(1, 1, 1, 1);
return insets;
}
public boolean isOpaque(Component c) {
return true;
}
}
@SuppressWarnings("serial")
public static class FocusBorder extends AbstractBorder implements UIResource {
private Color focus;
private Color control;
public FocusBorder(Color control, Color focus) {
this.control = control;
this.focus = focus;
}
public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
if (c.hasFocus()) {
g.setColor(focus);
g.drawRect(x, y, w-1, h-1);
} else {
g.setColor(control);
g.drawRect(x, y, w-1, h-1);
}
}
public Insets getBorderInsets(Component c, Insets insets) {
insets.set(1, 1, 1, 1);
return insets;
}
}
@SuppressWarnings("serial")
public static class ButtonBorder extends AbstractBorder implements UIResource {
protected Color focus = UIManager.getColor("activeCaptionBorder");
protected Color shadow = UIManager.getColor("Button.shadow");
protected Color highlight = UIManager.getColor("Button.light");
protected Color darkShadow;
public ButtonBorder(Color shadow, Color highlight, Color darkShadow, Color focus) {
this.shadow = shadow;
this.highlight = highlight;
this.darkShadow = darkShadow;
this.focus = focus;
}
public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
boolean isPressed = false;
boolean hasFocus = false;
boolean canBeDefault = false;
boolean isDefault = false;
if (c instanceof AbstractButton) {
AbstractButton b = (AbstractButton)c;
ButtonModel model = b.getModel();
isPressed = (model.isArmed() && model.isPressed());
hasFocus = (model.isArmed() && isPressed) ||
(b.isFocusPainted() && b.hasFocus());
if (b instanceof JButton) {
canBeDefault = ((JButton)b).isDefaultCapable();
isDefault = ((JButton)b).isDefaultButton();
}
}
int bx1 = x+1;
int by1 = y+1;
int bx2 = x+w-2;
int by2 = y+h-2;
if (canBeDefault) {
if (isDefault) {
g.setColor(shadow);
g.drawLine(x+3, y+3, x+3, y+h-4);
g.drawLine(x+3, y+3, x+w-4, y+3);
g.setColor(highlight);
g.drawLine(x+4, y+h-4, x+w-4, y+h-4);
g.drawLine(x+w-4, y+3, x+w-4, y+h-4);
}
bx1 +=6;
by1 += 6;
bx2 -= 6;
by2 -= 6;
}
if (hasFocus) {
g.setColor(focus);
if (isDefault) {
g.drawRect(x, y, w-1, h-1);
} else {
g.drawRect(bx1-1, by1-1, bx2-bx1+2, by2-by1+2);
}
}
g.setColor(isPressed? shadow : highlight);
g.drawLine(bx1, by1, bx2, by1);
g.drawLine(bx1, by1, bx1, by2);
g.setColor(isPressed? highlight : shadow);
g.drawLine(bx2, by1+1, bx2, by2);
g.drawLine(bx1+1, by2, bx2, by2);
}
public Insets getBorderInsets(Component c, Insets insets) {
int thickness = (c instanceof JButton && ((JButton)c).isDefaultCapable())? 8 : 2;
insets.set(thickness, thickness, thickness, thickness);
return insets;
}
}
@SuppressWarnings("serial")
public static class ToggleButtonBorder extends ButtonBorder {
public ToggleButtonBorder(Color shadow, Color highlight, Color darkShadow, Color focus) {
super(shadow, highlight, darkShadow, focus);
}
public void paintBorder(Component c, Graphics g, int x, int y,
int width, int height) {
if (c instanceof AbstractButton) {
AbstractButton b = (AbstractButton)c;
ButtonModel model = b.getModel();
if (model.isArmed() && model.isPressed() || model.isSelected()) {
drawBezel(g, x, y, width, height,
(model.isPressed() || model.isSelected()),
b.isFocusPainted() && b.hasFocus(), shadow, highlight, darkShadow, focus);
} else {
drawBezel(g, x, y, width, height,
false, b.isFocusPainted() && b.hasFocus(),
shadow, highlight, darkShadow, focus);
}
} else {
drawBezel(g, x, y, width, height, false, false,
shadow, highlight, darkShadow, focus);
}
}
public Insets getBorderInsets(Component c, Insets insets) {
insets.set(2, 2, 3, 3);
return insets;
}
}
@SuppressWarnings("serial")
public static class extends ButtonBorder {
public (Color shadow, Color highlight, Color darkShadow, Color focus) {
super(shadow, highlight, darkShadow, focus);
}
public void (Component c, Graphics g, int x, int y, int width, int height) {
if (!(c instanceof JMenuBar)) {
return;
}
JMenuBar menuBar = (JMenuBar)c;
if (menuBar.isBorderPainted() == true) {
Dimension size = menuBar.getSize();
drawBezel(g,x,y,size.width,size.height,false,false,
shadow, highlight, darkShadow, focus);
}
}
public Insets (Component c, Insets insets) {
insets.set(6, 6, 6, 6);
return insets;
}
}
@SuppressWarnings("serial")
public static class FrameBorder extends AbstractBorder implements UIResource {
JComponent jcomp;
Color frameHighlight;
Color frameColor;
Color frameShadow;
public static final int BORDER_SIZE = 5;
public FrameBorder(JComponent comp) {
jcomp = comp;
}
public void setComponent(JComponent comp) {
jcomp = comp;
}
public JComponent component() {
return jcomp;
}
protected Color getFrameHighlight() {
return frameHighlight;
}
protected Color getFrameColor() {
return frameColor;
}
protected Color getFrameShadow() {
return frameShadow;
}
public Insets getBorderInsets(Component c, Insets newInsets) {
newInsets.set(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE);
return newInsets;
}
protected boolean drawTopBorder(Component c, Graphics g,
int x, int y, int width, int height) {
Rectangle titleBarRect = new Rectangle(x, y, width, BORDER_SIZE);
if (!g.getClipBounds().intersects(titleBarRect)) {
return false;
}
int maxX = width - 1;
int maxY = BORDER_SIZE - 1;
g.setColor(frameColor);
g.drawLine(x, y + 2, maxX - 2, y + 2);
g.drawLine(x, y + 3, maxX - 2, y + 3);
g.drawLine(x, y + 4, maxX - 2, y + 4);
g.setColor(frameHighlight);
g.drawLine(x, y, maxX, y);
g.drawLine(x, y + 1, maxX, y + 1);
g.drawLine(x, y + 2, x, y + 4);
g.drawLine(x + 1, y + 2, x + 1, y + 4);
g.setColor(frameShadow);
g.drawLine(x + 4, y + 4, maxX - 4, y + 4);
g.drawLine(maxX, y + 1, maxX, maxY);
g.drawLine(maxX - 1, y + 2, maxX - 1, maxY);
return true;
}
protected boolean drawLeftBorder(Component c, Graphics g, int x, int y,
int width, int height) {
Rectangle borderRect =
new Rectangle(0, 0, getBorderInsets(c).left, height);
if (!g.getClipBounds().intersects(borderRect)) {
return false;
}
int startY = BORDER_SIZE;
g.setColor(frameHighlight);
g.drawLine(x, startY, x, height - 1);
g.drawLine(x + 1, startY, x + 1, height - 2);
g.setColor(frameColor);
g.fillRect(x + 2, startY, x + 2, height - 3);
g.setColor(frameShadow);
g.drawLine(x + 4, startY, x + 4, height - 5);
return true;
}
protected boolean drawRightBorder(Component c, Graphics g, int x, int y,
int width, int height) {
Rectangle borderRect = new Rectangle(
width - getBorderInsets(c).right, 0,
getBorderInsets(c).right, height);
if (!g.getClipBounds().intersects(borderRect)) {
return false;
}
int startX = width - getBorderInsets(c).right;
int startY = BORDER_SIZE;
g.setColor(frameColor);
g.fillRect(startX + 1, startY, 2, height - 1);
g.setColor(frameShadow);
g.fillRect(startX + 3, startY, 2, height - 1);
g.setColor(frameHighlight);
g.drawLine(startX, startY, startX, height - 1);
return true;
}
protected boolean drawBottomBorder(Component c, Graphics g, int x, int y,
int width, int height) {
Rectangle borderRect;
int marginHeight, startY;
borderRect = new Rectangle(0, height - getBorderInsets(c).bottom,
width, getBorderInsets(c).bottom);
if (!g.getClipBounds().intersects(borderRect)) {
return false;
}
startY = height - getBorderInsets(c).bottom;
g.setColor(frameShadow);
g.drawLine(x + 1, height - 1, width - 1, height - 1);
g.drawLine(x + 2, height - 2, width - 2, height - 2);
g.setColor(frameColor);
g.fillRect(x + 2, startY + 1, width - 4, 2);
g.setColor(frameHighlight);
g.drawLine(x + 5, startY, width - 5, startY);
return true;
}
protected boolean isActiveFrame() {
return jcomp.hasFocus();
}
public void paintBorder(Component c, Graphics g,
int x, int y, int width, int height) {
if (isActiveFrame()) {
frameColor = UIManager.getColor("activeCaptionBorder");
} else {
frameColor = UIManager.getColor("inactiveCaptionBorder");
}
frameHighlight = frameColor.brighter();
frameShadow = frameColor.darker().darker();
drawTopBorder(c, g, x, y, width, height);
drawLeftBorder(c, g, x, y, width, height);
drawRightBorder(c, g, x, y, width, height);
drawBottomBorder(c, g, x, y, width, height);
}
}
@SuppressWarnings("serial")
public static class InternalFrameBorder extends FrameBorder {
JInternalFrame frame;
public static final int CORNER_SIZE = 24;
public InternalFrameBorder(JInternalFrame aFrame) {
super(aFrame);
frame = aFrame;
}
public void setFrame(JInternalFrame aFrame) {
frame = aFrame;
}
public JInternalFrame frame() {
return frame;
}
public int resizePartWidth() {
if (!frame.isResizable()) {
return 0;
}
return FrameBorder.BORDER_SIZE;
}
protected boolean drawTopBorder(Component c, Graphics g,
int x, int y, int width, int height) {
if (super.drawTopBorder(c, g, x, y, width, height) &&
frame.isResizable()) {
g.setColor(getFrameShadow());
g.drawLine(CORNER_SIZE - 1, y + 1, CORNER_SIZE - 1, y + 4);
g.drawLine(width - CORNER_SIZE - 1, y + 1,
width - CORNER_SIZE - 1, y + 4);
g.setColor(getFrameHighlight());
g.drawLine(CORNER_SIZE, y, CORNER_SIZE, y + 4);
g.drawLine(width - CORNER_SIZE, y, width - CORNER_SIZE, y + 4);
return true;
}
return false;
}
protected boolean drawLeftBorder(Component c, Graphics g, int x, int y,
int width, int height) {
if (super.drawLeftBorder(c, g, x, y, width, height) &&
frame.isResizable()) {
g.setColor(getFrameHighlight());
int topY = y + CORNER_SIZE;
g.drawLine(x, topY, x + 4, topY);
int bottomY = height - CORNER_SIZE;
g.drawLine(x + 1, bottomY, x + 5, bottomY);
g.setColor(getFrameShadow());
g.drawLine(x + 1, topY - 1, x + 5, topY - 1);
g.drawLine(x + 1, bottomY - 1, x + 5, bottomY - 1);
return true;
}
return false;
}
protected boolean drawRightBorder(Component c, Graphics g, int x, int y,
int width, int height) {
if (super.drawRightBorder(c, g, x, y, width, height) &&
frame.isResizable()) {
int startX = width - getBorderInsets(c).right;
g.setColor(getFrameHighlight());
int topY = y + CORNER_SIZE;
g.drawLine(startX, topY, width - 2, topY);
int bottomY = height - CORNER_SIZE;
g.drawLine(startX + 1, bottomY, startX + 3, bottomY);
g.setColor(getFrameShadow());
g.drawLine(startX + 1, topY - 1, width - 2, topY - 1);
g.drawLine(startX + 1, bottomY - 1, startX + 3, bottomY - 1);
return true;
}
return false;
}
protected boolean drawBottomBorder(Component c, Graphics g, int x, int y,
int width, int height) {
if (super.drawBottomBorder(c, g, x, y, width, height) &&
frame.isResizable()) {
int startY = height - getBorderInsets(c).bottom;
g.setColor(getFrameShadow());
g.drawLine(CORNER_SIZE - 1, startY + 1,
CORNER_SIZE - 1, height - 1);
g.drawLine(width - CORNER_SIZE, startY + 1,
width - CORNER_SIZE, height - 1);
g.setColor(getFrameHighlight());
g.drawLine(CORNER_SIZE, startY, CORNER_SIZE, height - 2);
g.drawLine(width - CORNER_SIZE + 1, startY,
width - CORNER_SIZE + 1, height - 2);
return true;
}
return false;
}
protected boolean isActiveFrame() {
return frame.isSelected();
}
}
public static void drawBezel(Graphics g, int x, int y, int w, int h,
boolean isPressed, boolean hasFocus,
Color shadow, Color highlight,
Color darkShadow, Color focus) {
Color oldColor = g.getColor();
g.translate(x, y);
if (isPressed) {
if (hasFocus){
g.setColor(focus);
g.drawRect(0, 0, w-1, h-1);
}
g.setColor(shadow);
g.drawRect(1, 1, w-3, h-3);
g.setColor(highlight);
g.drawLine(2, h-3, w-3, h-3);
g.drawLine(w-3, 2, w-3, h-4);
} else {
if (hasFocus) {
g.setColor(focus);
g.drawRect(0, 0, w-1, h-1);
g.setColor(highlight);
g.drawLine(1, 1, 1, h-3);
g.drawLine(2, 1, w-4, 1);
g.setColor(shadow);
g.drawLine(2, h-3, w-3, h-3);
g.drawLine(w-3, 1, w-3, h-4);
g.setColor(darkShadow);
g.drawLine(1, h-2, w-2, h-2);
g.drawLine(w-2, h-2, w-2, 1);
} else {
g.setColor(highlight);
g.drawLine(1,1,1,h-3);
g.drawLine(2,1,w-4,1);
g.setColor(shadow);
g.drawLine(2,h-3,w-3,h-3);
g.drawLine(w-3,1,w-3,h-4);
g.setColor(darkShadow);
g.drawLine(1,h-2,w-2,h-2);
g.drawLine(w-2,h-2,w-2,0);
}
g.translate(-x, -y);
}
g.setColor(oldColor);
}
@SuppressWarnings("serial")
public static class extends AbstractBorder implements UIResource {
protected Font ;
protected Color ;
protected Color ;
protected Color shadowColor;
protected Color ;
protected static final int = 2;
protected static final int = 2;
public (
Font titleFont,
Color bgColor,
Color fgColor,
Color shadow,
Color highlight) {
this.font = titleFont;
this.background = bgColor;
this.foreground = fgColor;
this.shadowColor = shadow;
this.highlightColor = highlight;
}
public void (Component c, Graphics g, int x, int y, int width, int height) {
if (!(c instanceof JPopupMenu)) {
return;
}
Font origFont = g.getFont();
Color origColor = g.getColor();
JPopupMenu popup = (JPopupMenu)c;
String title = popup.getLabel();
if (title == null) {
return;
}
g.setFont(font);
FontMetrics fm = SwingUtilities2.getFontMetrics(popup, g, font);
int fontHeight = fm.getHeight();
int descent = fm.getDescent();
int ascent = fm.getAscent();
Point textLoc = new Point();
int stringWidth = SwingUtilities2.stringWidth(popup, fm,
title);
textLoc.y = y + ascent + TEXT_SPACING;
textLoc.x = x + ((width - stringWidth) / 2);
g.setColor(background);
g.fillRect(textLoc.x - TEXT_SPACING, textLoc.y - (fontHeight-descent),
stringWidth + (2 * TEXT_SPACING), fontHeight - descent);
g.setColor(foreground);
SwingUtilities2.drawString(popup, g, title, textLoc.x, textLoc.y);
MotifGraphicsUtils.drawGroove(g, x, textLoc.y + TEXT_SPACING,
width, GROOVE_HEIGHT,
shadowColor, highlightColor);
g.setFont(origFont);
g.setColor(origColor);
}
public Insets (Component c, Insets insets) {
if (!(c instanceof JPopupMenu)) {
return insets;
}
FontMetrics fm;
int descent = 0;
int ascent = 16;
String title = ((JPopupMenu)c).getLabel();
if (title == null) {
insets.left = insets.top = insets.right = insets.bottom = 0;
return insets;
}
fm = c.getFontMetrics(font);
if(fm != null) {
descent = fm.getDescent();
ascent = fm.getAscent();
}
insets.top += ascent + descent + TEXT_SPACING + GROOVE_HEIGHT;
return insets;
}
}
}