|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
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; |
|
|
|
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(); |
|
if (GTKLookAndFeel.is3() && region == Region.MENU) { |
|
Object value = style.getClassSpecificValue("arrow-scaling"); |
|
if (value instanceof Number) { |
|
iconDimension = (int)(((Number) value).floatValue() * |
|
(style.getFont(context).getSize2D() + |
|
2 * style.getClassSpecificIntValue(context, |
|
"indicator-spacing", DEFAULT_ICON_SPACING))); |
|
if (iconDimension > 0) { |
|
return iconDimension; |
|
} |
|
} |
|
} |
|
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 |
|
|
|
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); |
|
} |
|
} |
|
} |
|
} |