You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
352 lines
11 KiB
352 lines
11 KiB
/*
|
|
* Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved.
|
|
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
package com.sun.java.swing.plaf.gtk;
|
|
|
|
import java.util.*;
|
|
import javax.swing.plaf.synth.*;
|
|
import java.awt.*;
|
|
import java.awt.image.BufferedImage;
|
|
import java.lang.reflect.*;
|
|
import javax.swing.*;
|
|
import javax.swing.plaf.*;
|
|
import sun.swing.plaf.synth.*;
|
|
import com.sun.java.swing.plaf.gtk.GTKConstants.ArrowType;
|
|
import com.sun.java.swing.plaf.gtk.GTKConstants.ExpanderStyle;
|
|
import com.sun.java.swing.plaf.gtk.GTKConstants.Orientation;
|
|
import com.sun.java.swing.plaf.gtk.GTKConstants.ShadowType;
|
|
|
|
/**
|
|
*/
|
|
class GTKIconFactory {
|
|
static final int CHECK_ICON_EXTRA_INSET = 1;
|
|
static final int DEFAULT_ICON_SPACING = 2;
|
|
static final int DEFAULT_ICON_SIZE = 13;
|
|
static final int DEFAULT_TOGGLE_MENU_ITEM_SIZE = 12; // For pre-gtk2.4
|
|
|
|
private static final String RADIO_BUTTON_ICON = "paintRadioButtonIcon";
|
|
private static final String CHECK_BOX_ICON = "paintCheckBoxIcon";
|
|
private static final String MENU_ARROW_ICON = "paintMenuArrowIcon";
|
|
private static final String CHECK_BOX_MENU_ITEM_CHECK_ICON =
|
|
"paintCheckBoxMenuItemCheckIcon";
|
|
private static final String RADIO_BUTTON_MENU_ITEM_CHECK_ICON =
|
|
"paintRadioButtonMenuItemCheckIcon";
|
|
private static final String TREE_EXPANDED_ICON = "paintTreeExpandedIcon";
|
|
private static final String TREE_COLLAPSED_ICON = "paintTreeCollapsedIcon";
|
|
private static final String ASCENDING_SORT_ICON = "paintAscendingSortIcon";
|
|
private static final String DESCENDING_SORT_ICON = "paintDescendingSortIcon";
|
|
private static final String TOOL_BAR_HANDLE_ICON = "paintToolBarHandleIcon";
|
|
|
|
private static Map<String, DelegatingIcon> iconsPool =
|
|
Collections.synchronizedMap(new HashMap<String, DelegatingIcon>());
|
|
|
|
private static DelegatingIcon getIcon(String methodName) {
|
|
DelegatingIcon result = iconsPool.get(methodName);
|
|
if (result == null) {
|
|
if (methodName == TREE_COLLAPSED_ICON ||
|
|
methodName == TREE_EXPANDED_ICON)
|
|
{
|
|
result = new SynthExpanderIcon(methodName);
|
|
|
|
} else if (methodName == TOOL_BAR_HANDLE_ICON) {
|
|
result = new ToolBarHandleIcon();
|
|
|
|
} else if (methodName == MENU_ARROW_ICON) {
|
|
result = new MenuArrowIcon();
|
|
|
|
} else {
|
|
result = new DelegatingIcon(methodName);
|
|
}
|
|
iconsPool.put(methodName, result);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Sort arrow
|
|
//
|
|
public static Icon getAscendingSortIcon() {
|
|
return getIcon(ASCENDING_SORT_ICON);
|
|
}
|
|
|
|
public static Icon getDescendingSortIcon() {
|
|
return getIcon(DESCENDING_SORT_ICON);
|
|
}
|
|
|
|
//
|
|
// Tree methods
|
|
//
|
|
public static SynthIcon getTreeExpandedIcon() {
|
|
return getIcon(TREE_EXPANDED_ICON);
|
|
}
|
|
|
|
public static SynthIcon getTreeCollapsedIcon() {
|
|
return getIcon(TREE_COLLAPSED_ICON);
|
|
}
|
|
|
|
//
|
|
// Radio button
|
|
//
|
|
public static SynthIcon getRadioButtonIcon() {
|
|
return getIcon(RADIO_BUTTON_ICON);
|
|
}
|
|
|
|
//
|
|
// CheckBox
|
|
//
|
|
public static SynthIcon getCheckBoxIcon() {
|
|
return getIcon(CHECK_BOX_ICON);
|
|
}
|
|
|
|
//
|
|
// Menus
|
|
//
|
|
public static SynthIcon getMenuArrowIcon() {
|
|
return getIcon(MENU_ARROW_ICON);
|
|
}
|
|
|
|
public static SynthIcon getCheckBoxMenuItemCheckIcon() {
|
|
return getIcon(CHECK_BOX_MENU_ITEM_CHECK_ICON);
|
|
}
|
|
|
|
public static SynthIcon getRadioButtonMenuItemCheckIcon() {
|
|
return getIcon(RADIO_BUTTON_MENU_ITEM_CHECK_ICON);
|
|
}
|
|
|
|
//
|
|
// ToolBar Handle
|
|
//
|
|
public static SynthIcon getToolBarHandleIcon() {
|
|
return getIcon(TOOL_BAR_HANDLE_ICON);
|
|
}
|
|
|
|
static void resetIcons() {
|
|
synchronized (iconsPool) {
|
|
for (DelegatingIcon di: iconsPool.values()) {
|
|
di.resetIconDimensions();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static class DelegatingIcon extends SynthIcon implements
|
|
UIResource {
|
|
private static final Class[] PARAM_TYPES = new Class[] {
|
|
SynthContext.class, Graphics.class, int.class,
|
|
int.class, int.class, int.class, int.class
|
|
};
|
|
|
|
private Object method;
|
|
int iconDimension = -1;
|
|
|
|
DelegatingIcon(String methodName ){
|
|
this.method = methodName;
|
|
}
|
|
|
|
public void paintIcon(SynthContext context, Graphics g,
|
|
int x, int y, int w, int h) {
|
|
if (context != null) {
|
|
GTKPainter.INSTANCE.paintIcon(context, g,
|
|
getMethod(), x, y, w, h);
|
|
}
|
|
}
|
|
|
|
public int getIconWidth(SynthContext context) {
|
|
return getIconDimension(context);
|
|
}
|
|
|
|
public int getIconHeight(SynthContext context) {
|
|
return getIconDimension(context);
|
|
}
|
|
|
|
void resetIconDimensions() {
|
|
iconDimension = -1;
|
|
}
|
|
|
|
protected Method getMethod() {
|
|
if (method instanceof String) {
|
|
method = resolveMethod((String)method);
|
|
}
|
|
return (Method)method;
|
|
}
|
|
|
|
protected Class[] getMethodParamTypes() {
|
|
return PARAM_TYPES;
|
|
}
|
|
|
|
private Method resolveMethod(String name) {
|
|
try {
|
|
return GTKPainter.class.getMethod(name, getMethodParamTypes());
|
|
} catch (NoSuchMethodException e) {
|
|
assert false;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
int getIconDimension(SynthContext context) {
|
|
if (iconDimension >= 0) {
|
|
return iconDimension;
|
|
}
|
|
|
|
if (context == null) {
|
|
return DEFAULT_ICON_SIZE;
|
|
}
|
|
|
|
Region region = context.getRegion();
|
|
GTKStyle style = (GTKStyle) context.getStyle();
|
|
iconDimension = style.getClassSpecificIntValue(context,
|
|
"indicator-size",
|
|
(region == Region.CHECK_BOX_MENU_ITEM ||
|
|
region == Region.RADIO_BUTTON_MENU_ITEM) ?
|
|
DEFAULT_TOGGLE_MENU_ITEM_SIZE : DEFAULT_ICON_SIZE);
|
|
|
|
if (region == Region.CHECK_BOX || region == Region.RADIO_BUTTON) {
|
|
iconDimension += 2 * style.getClassSpecificIntValue(context,
|
|
"indicator-spacing", DEFAULT_ICON_SPACING);
|
|
} else if (region == Region.CHECK_BOX_MENU_ITEM ||
|
|
region == Region.RADIO_BUTTON_MENU_ITEM) {
|
|
iconDimension += 2 * CHECK_ICON_EXTRA_INSET;
|
|
}
|
|
return iconDimension;
|
|
}
|
|
}
|
|
|
|
private static class SynthExpanderIcon extends DelegatingIcon {
|
|
SynthExpanderIcon(String method) {
|
|
super(method);
|
|
}
|
|
|
|
public void paintIcon(SynthContext context, Graphics g, int x, int y,
|
|
int w, int h) {
|
|
if (context != null) {
|
|
super.paintIcon(context, g, x, y, w, h);
|
|
updateSizeIfNecessary(context);
|
|
}
|
|
}
|
|
|
|
int getIconDimension(SynthContext context) {
|
|
updateSizeIfNecessary(context);
|
|
return (iconDimension == -1) ? DEFAULT_ICON_SIZE :
|
|
iconDimension;
|
|
}
|
|
|
|
private void updateSizeIfNecessary(SynthContext context) {
|
|
if (iconDimension == -1 && context != null) {
|
|
iconDimension = context.getStyle().getInt(context,
|
|
"Tree.expanderSize", 10);
|
|
}
|
|
}
|
|
}
|
|
|
|
// GTK has a separate widget for the handle box, to mirror this
|
|
// we create a unique icon per ToolBar and lookup the style for the
|
|
// HandleBox.
|
|
private static class ToolBarHandleIcon extends DelegatingIcon {
|
|
private static final Class[] PARAM_TYPES = new Class[] {
|
|
SynthContext.class, Graphics.class, int.class,
|
|
int.class, int.class, int.class, int.class, Orientation.class,
|
|
};
|
|
|
|
private SynthStyle style;
|
|
|
|
public ToolBarHandleIcon() {
|
|
super(TOOL_BAR_HANDLE_ICON);
|
|
}
|
|
|
|
protected Class[] getMethodParamTypes() {
|
|
return PARAM_TYPES;
|
|
}
|
|
|
|
public void paintIcon(SynthContext context, Graphics g, int x, int y,
|
|
int w, int h) {
|
|
if (context != null) {
|
|
JToolBar toolbar = (JToolBar)context.getComponent();
|
|
Orientation orientation =
|
|
(toolbar.getOrientation() == JToolBar.HORIZONTAL ?
|
|
Orientation.HORIZONTAL : Orientation.VERTICAL);
|
|
|
|
if (style == null) {
|
|
style = SynthLookAndFeel.getStyleFactory().getStyle(
|
|
context.getComponent(), GTKRegion.HANDLE_BOX);
|
|
}
|
|
context = new SynthContext(toolbar, GTKRegion.HANDLE_BOX,
|
|
style, SynthConstants.ENABLED);
|
|
|
|
GTKPainter.INSTANCE.paintIcon(context, g,
|
|
getMethod(), x, y, w, h, orientation);
|
|
}
|
|
}
|
|
|
|
public int getIconWidth(SynthContext context) {
|
|
if (context == null) {
|
|
return 10;
|
|
}
|
|
if (((JToolBar)context.getComponent()).getOrientation() ==
|
|
JToolBar.HORIZONTAL) {
|
|
return 10;
|
|
} else {
|
|
return context.getComponent().getWidth();
|
|
}
|
|
}
|
|
|
|
public int getIconHeight(SynthContext context) {
|
|
if (context == null) {
|
|
return 10;
|
|
}
|
|
if (((JToolBar)context.getComponent()).getOrientation() ==
|
|
JToolBar.HORIZONTAL) {
|
|
return context.getComponent().getHeight();
|
|
} else {
|
|
return 10;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static class MenuArrowIcon extends DelegatingIcon {
|
|
private static final Class[] PARAM_TYPES = new Class[] {
|
|
SynthContext.class, Graphics.class, int.class,
|
|
int.class, int.class, int.class, int.class, ArrowType.class,
|
|
};
|
|
|
|
public MenuArrowIcon() {
|
|
super(MENU_ARROW_ICON);
|
|
}
|
|
|
|
protected Class[] getMethodParamTypes() {
|
|
return PARAM_TYPES;
|
|
}
|
|
|
|
public void paintIcon(SynthContext context, Graphics g, int x, int y,
|
|
int w, int h) {
|
|
if (context != null) {
|
|
ArrowType arrowDir = ArrowType.RIGHT;
|
|
if (!context.getComponent().getComponentOrientation().isLeftToRight()) {
|
|
arrowDir = ArrowType.LEFT;
|
|
}
|
|
GTKPainter.INSTANCE.paintIcon(context, g,
|
|
getMethod(), x, y, w, h, arrowDir);
|
|
}
|
|
}
|
|
}
|
|
}
|