|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package com.sun.java.swing.plaf.gtk; |
|
|
|
import java.awt.*; |
|
import java.awt.image.*; |
|
import java.util.HashMap; |
|
import javax.swing.*; |
|
import javax.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.PositionType; |
|
import com.sun.java.swing.plaf.gtk.GTKConstants.ShadowType; |
|
import com.sun.java.swing.plaf.gtk.GTKConstants.TextDirection; |
|
|
|
import sun.awt.image.SunWritableRaster; |
|
import sun.swing.ImageCache; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
class GTKEngine { |
|
|
|
final static GTKEngine INSTANCE = new GTKEngine(); |
|
|
|
|
|
private static final int CACHE_SIZE = 50; |
|
|
|
|
|
static enum WidgetType { |
|
BUTTON, CHECK_BOX, CHECK_BOX_MENU_ITEM, COLOR_CHOOSER, |
|
COMBO_BOX, COMBO_BOX_ARROW_BUTTON, COMBO_BOX_TEXT_FIELD, |
|
DESKTOP_ICON, DESKTOP_PANE, EDITOR_PANE, FORMATTED_TEXT_FIELD, |
|
HANDLE_BOX, HPROGRESS_BAR, |
|
HSCROLL_BAR, HSCROLL_BAR_BUTTON_LEFT, HSCROLL_BAR_BUTTON_RIGHT, |
|
HSCROLL_BAR_TRACK, HSCROLL_BAR_THUMB, |
|
HSEPARATOR, HSLIDER, HSLIDER_TRACK, HSLIDER_THUMB, HSPLIT_PANE_DIVIDER, |
|
INTERNAL_FRAME, INTERNAL_FRAME_TITLE_PANE, IMAGE, LABEL, LIST, MENU, |
|
MENU_BAR, MENU_ITEM, MENU_ITEM_ACCELERATOR, OPTION_PANE, PANEL, |
|
PASSWORD_FIELD, POPUP_MENU, POPUP_MENU_SEPARATOR, |
|
RADIO_BUTTON, RADIO_BUTTON_MENU_ITEM, ROOT_PANE, SCROLL_PANE, |
|
SPINNER, SPINNER_ARROW_BUTTON, SPINNER_TEXT_FIELD, |
|
SPLIT_PANE, TABBED_PANE, TABBED_PANE_TAB_AREA, TABBED_PANE_CONTENT, |
|
TABBED_PANE_TAB, TABLE, TABLE_HEADER, TEXT_AREA, TEXT_FIELD, TEXT_PANE, |
|
TITLED_BORDER, |
|
TOGGLE_BUTTON, TOOL_BAR, TOOL_BAR_DRAG_WINDOW, TOOL_BAR_SEPARATOR, |
|
TOOL_TIP, TREE, TREE_CELL, VIEWPORT, VPROGRESS_BAR, |
|
VSCROLL_BAR, VSCROLL_BAR_BUTTON_UP, VSCROLL_BAR_BUTTON_DOWN, |
|
VSCROLL_BAR_TRACK, VSCROLL_BAR_THUMB, |
|
VSEPARATOR, VSLIDER, VSLIDER_TRACK, VSLIDER_THUMB, |
|
VSPLIT_PANE_DIVIDER |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
static enum Settings { |
|
GTK_FONT_NAME, |
|
GTK_ICON_SIZES, |
|
GTK_CURSOR_BLINK, |
|
GTK_CURSOR_BLINK_TIME |
|
} |
|
|
|
|
|
|
|
*/ |
|
static class CustomRegion extends Region { |
|
|
|
|
|
|
|
*/ |
|
static Region TITLED_BORDER = new CustomRegion("TitledBorder"); |
|
|
|
private CustomRegion(String name) { |
|
super(name, null, false); |
|
} |
|
} |
|
|
|
|
|
private static HashMap<Region, Object> regionToWidgetTypeMap; |
|
private ImageCache cache = new ImageCache(CACHE_SIZE); |
|
private int x0, y0, w0, h0; |
|
private Graphics graphics; |
|
private Object[] cacheArgs; |
|
|
|
private native void native_paint_arrow( |
|
int widgetType, int state, int shadowType, String detail, |
|
int x, int y, int width, int height, int arrowType); |
|
private native void native_paint_box( |
|
int widgetType, int state, int shadowType, String detail, |
|
int x, int y, int width, int height, int synthState, int dir); |
|
private native void native_paint_box_gap( |
|
int widgetType, int state, int shadowType, String detail, |
|
int x, int y, int width, int height, |
|
int gapSide, int gapX, int gapWidth); |
|
private native void native_paint_check( |
|
int widgetType, int synthState, String detail, |
|
int x, int y, int width, int height); |
|
private native void native_paint_expander( |
|
int widgetType, int state, String detail, |
|
int x, int y, int width, int height, int expanderStyle); |
|
private native void native_paint_extension( |
|
int widgetType, int state, int shadowType, String detail, |
|
int x, int y, int width, int height, int placement); |
|
private native void native_paint_flat_box( |
|
int widgetType, int state, int shadowType, String detail, |
|
int x, int y, int width, int height, boolean hasFocus); |
|
private native void native_paint_focus( |
|
int widgetType, int state, String detail, |
|
int x, int y, int width, int height); |
|
private native void native_paint_handle( |
|
int widgetType, int state, int shadowType, String detail, |
|
int x, int y, int width, int height, int orientation); |
|
private native void native_paint_hline( |
|
int widgetType, int state, String detail, |
|
int x, int y, int width, int height); |
|
private native void native_paint_option( |
|
int widgetType, int synthState, String detail, |
|
int x, int y, int width, int height); |
|
private native void native_paint_shadow( |
|
int widgetType, int state, int shadowType, String detail, |
|
int x, int y, int width, int height, int synthState, int dir); |
|
private native void native_paint_slider( |
|
int widgetType, int state, int shadowType, String detail, int x, |
|
int y, int width, int height, int orientation, boolean hasFocus); |
|
private native void native_paint_vline( |
|
int widgetType, int state, String detail, |
|
int x, int y, int width, int height); |
|
private native void native_paint_background( |
|
int widgetType, int state, int x, int y, int width, int height); |
|
private native Object native_get_gtk_setting(int property); |
|
private native void nativeSetRangeValue(int widgetType, double value, |
|
double min, double max, |
|
double visible); |
|
|
|
private native void nativeStartPainting(int w, int h); |
|
private native int nativeFinishPainting(int[] buffer, int width, int height); |
|
private native void native_switch_theme(); |
|
|
|
static { |
|
// Make sure the awt toolkit is loaded so we have access to native |
|
|
|
Toolkit.getDefaultToolkit(); |
|
|
|
|
|
regionToWidgetTypeMap = new HashMap<Region, Object>(50); |
|
regionToWidgetTypeMap.put(Region.ARROW_BUTTON, new WidgetType[] { |
|
WidgetType.SPINNER_ARROW_BUTTON, |
|
WidgetType.COMBO_BOX_ARROW_BUTTON, |
|
WidgetType.HSCROLL_BAR_BUTTON_LEFT, |
|
WidgetType.HSCROLL_BAR_BUTTON_RIGHT, |
|
WidgetType.VSCROLL_BAR_BUTTON_UP, |
|
WidgetType.VSCROLL_BAR_BUTTON_DOWN}); |
|
regionToWidgetTypeMap.put(Region.BUTTON, WidgetType.BUTTON); |
|
regionToWidgetTypeMap.put(Region.CHECK_BOX, WidgetType.CHECK_BOX); |
|
regionToWidgetTypeMap.put(Region.CHECK_BOX_MENU_ITEM, |
|
WidgetType.CHECK_BOX_MENU_ITEM); |
|
regionToWidgetTypeMap.put(Region.COLOR_CHOOSER, WidgetType.COLOR_CHOOSER); |
|
regionToWidgetTypeMap.put(Region.FILE_CHOOSER, WidgetType.OPTION_PANE); |
|
regionToWidgetTypeMap.put(Region.COMBO_BOX, WidgetType.COMBO_BOX); |
|
regionToWidgetTypeMap.put(Region.DESKTOP_ICON, WidgetType.DESKTOP_ICON); |
|
regionToWidgetTypeMap.put(Region.DESKTOP_PANE, WidgetType.DESKTOP_PANE); |
|
regionToWidgetTypeMap.put(Region.EDITOR_PANE, WidgetType.EDITOR_PANE); |
|
regionToWidgetTypeMap.put(Region.FORMATTED_TEXT_FIELD, new WidgetType[] { |
|
WidgetType.FORMATTED_TEXT_FIELD, WidgetType.SPINNER_TEXT_FIELD}); |
|
regionToWidgetTypeMap.put(GTKRegion.HANDLE_BOX, WidgetType.HANDLE_BOX); |
|
regionToWidgetTypeMap.put(Region.INTERNAL_FRAME, |
|
WidgetType.INTERNAL_FRAME); |
|
regionToWidgetTypeMap.put(Region.INTERNAL_FRAME_TITLE_PANE, |
|
WidgetType.INTERNAL_FRAME_TITLE_PANE); |
|
regionToWidgetTypeMap.put(Region.LABEL, new WidgetType[] { |
|
WidgetType.LABEL, WidgetType.COMBO_BOX_TEXT_FIELD}); |
|
regionToWidgetTypeMap.put(Region.LIST, WidgetType.LIST); |
|
regionToWidgetTypeMap.put(Region.MENU, WidgetType.MENU); |
|
regionToWidgetTypeMap.put(Region.MENU_BAR, WidgetType.MENU_BAR); |
|
regionToWidgetTypeMap.put(Region.MENU_ITEM, WidgetType.MENU_ITEM); |
|
regionToWidgetTypeMap.put(Region.MENU_ITEM_ACCELERATOR, |
|
WidgetType.MENU_ITEM_ACCELERATOR); |
|
regionToWidgetTypeMap.put(Region.OPTION_PANE, WidgetType.OPTION_PANE); |
|
regionToWidgetTypeMap.put(Region.PANEL, WidgetType.PANEL); |
|
regionToWidgetTypeMap.put(Region.PASSWORD_FIELD, |
|
WidgetType.PASSWORD_FIELD); |
|
regionToWidgetTypeMap.put(Region.POPUP_MENU, WidgetType.POPUP_MENU); |
|
regionToWidgetTypeMap.put(Region.POPUP_MENU_SEPARATOR, |
|
WidgetType.POPUP_MENU_SEPARATOR); |
|
regionToWidgetTypeMap.put(Region.PROGRESS_BAR, new WidgetType[] { |
|
WidgetType.HPROGRESS_BAR, WidgetType.VPROGRESS_BAR}); |
|
regionToWidgetTypeMap.put(Region.RADIO_BUTTON, WidgetType.RADIO_BUTTON); |
|
regionToWidgetTypeMap.put(Region.RADIO_BUTTON_MENU_ITEM, |
|
WidgetType.RADIO_BUTTON_MENU_ITEM); |
|
regionToWidgetTypeMap.put(Region.ROOT_PANE, WidgetType.ROOT_PANE); |
|
regionToWidgetTypeMap.put(Region.SCROLL_BAR, new WidgetType[] { |
|
WidgetType.HSCROLL_BAR, WidgetType.VSCROLL_BAR}); |
|
regionToWidgetTypeMap.put(Region.SCROLL_BAR_THUMB, new WidgetType[] { |
|
WidgetType.HSCROLL_BAR_THUMB, WidgetType.VSCROLL_BAR_THUMB}); |
|
regionToWidgetTypeMap.put(Region.SCROLL_BAR_TRACK, new WidgetType[] { |
|
WidgetType.HSCROLL_BAR_TRACK, WidgetType.VSCROLL_BAR_TRACK}); |
|
regionToWidgetTypeMap.put(Region.SCROLL_PANE, WidgetType.SCROLL_PANE); |
|
regionToWidgetTypeMap.put(Region.SEPARATOR, new WidgetType[] { |
|
WidgetType.HSEPARATOR, WidgetType.VSEPARATOR}); |
|
regionToWidgetTypeMap.put(Region.SLIDER, new WidgetType[] { |
|
WidgetType.HSLIDER, WidgetType.VSLIDER}); |
|
regionToWidgetTypeMap.put(Region.SLIDER_THUMB, new WidgetType[] { |
|
WidgetType.HSLIDER_THUMB, WidgetType.VSLIDER_THUMB}); |
|
regionToWidgetTypeMap.put(Region.SLIDER_TRACK, new WidgetType[] { |
|
WidgetType.HSLIDER_TRACK, WidgetType.VSLIDER_TRACK}); |
|
regionToWidgetTypeMap.put(Region.SPINNER, WidgetType.SPINNER); |
|
regionToWidgetTypeMap.put(Region.SPLIT_PANE, WidgetType.SPLIT_PANE); |
|
regionToWidgetTypeMap.put(Region.SPLIT_PANE_DIVIDER, new WidgetType[] { |
|
WidgetType.HSPLIT_PANE_DIVIDER, WidgetType.VSPLIT_PANE_DIVIDER}); |
|
regionToWidgetTypeMap.put(Region.TABBED_PANE, WidgetType.TABBED_PANE); |
|
regionToWidgetTypeMap.put(Region.TABBED_PANE_CONTENT, |
|
WidgetType.TABBED_PANE_CONTENT); |
|
regionToWidgetTypeMap.put(Region.TABBED_PANE_TAB, |
|
WidgetType.TABBED_PANE_TAB); |
|
regionToWidgetTypeMap.put(Region.TABBED_PANE_TAB_AREA, |
|
WidgetType.TABBED_PANE_TAB_AREA); |
|
regionToWidgetTypeMap.put(Region.TABLE, WidgetType.TABLE); |
|
regionToWidgetTypeMap.put(Region.TABLE_HEADER, WidgetType.TABLE_HEADER); |
|
regionToWidgetTypeMap.put(Region.TEXT_AREA, WidgetType.TEXT_AREA); |
|
regionToWidgetTypeMap.put(Region.TEXT_FIELD, new WidgetType[] { |
|
WidgetType.TEXT_FIELD, WidgetType.COMBO_BOX_TEXT_FIELD}); |
|
regionToWidgetTypeMap.put(Region.TEXT_PANE, WidgetType.TEXT_PANE); |
|
regionToWidgetTypeMap.put(CustomRegion.TITLED_BORDER, WidgetType.TITLED_BORDER); |
|
regionToWidgetTypeMap.put(Region.TOGGLE_BUTTON, WidgetType.TOGGLE_BUTTON); |
|
regionToWidgetTypeMap.put(Region.TOOL_BAR, WidgetType.TOOL_BAR); |
|
regionToWidgetTypeMap.put(Region.TOOL_BAR_CONTENT, WidgetType.TOOL_BAR); |
|
regionToWidgetTypeMap.put(Region.TOOL_BAR_DRAG_WINDOW, |
|
WidgetType.TOOL_BAR_DRAG_WINDOW); |
|
regionToWidgetTypeMap.put(Region.TOOL_BAR_SEPARATOR, |
|
WidgetType.TOOL_BAR_SEPARATOR); |
|
regionToWidgetTypeMap.put(Region.TOOL_TIP, WidgetType.TOOL_TIP); |
|
regionToWidgetTypeMap.put(Region.TREE, WidgetType.TREE); |
|
regionToWidgetTypeMap.put(Region.TREE_CELL, WidgetType.TREE_CELL); |
|
regionToWidgetTypeMap.put(Region.VIEWPORT, WidgetType.VIEWPORT); |
|
} |
|
|
|
|
|
static WidgetType getWidgetType(JComponent c, Region id) { |
|
Object value = regionToWidgetTypeMap.get(id); |
|
|
|
if (value instanceof WidgetType) { |
|
return (WidgetType)value; |
|
} |
|
|
|
WidgetType[] widgets = (WidgetType[])value; |
|
if (c == null ) { |
|
return widgets[0]; |
|
} |
|
|
|
if (c instanceof JScrollBar) { |
|
return (((JScrollBar)c).getOrientation() == JScrollBar.HORIZONTAL) ? |
|
widgets[0] : widgets[1]; |
|
} else if (c instanceof JSeparator) { |
|
JSeparator separator = (JSeparator)c; |
|
|
|
|
|
|
|
*/ |
|
if (separator.getParent() instanceof JPopupMenu) { |
|
return WidgetType.POPUP_MENU_SEPARATOR; |
|
} else if (separator.getParent() instanceof JToolBar) { |
|
return WidgetType.TOOL_BAR_SEPARATOR; |
|
} |
|
|
|
return (separator.getOrientation() == JSeparator.HORIZONTAL) ? |
|
widgets[0] : widgets[1]; |
|
} else if (c instanceof JSlider) { |
|
return (((JSlider)c).getOrientation() == JSlider.HORIZONTAL) ? |
|
widgets[0] : widgets[1]; |
|
} else if (c instanceof JProgressBar) { |
|
return (((JProgressBar)c).getOrientation() == JProgressBar.HORIZONTAL) ? |
|
widgets[0] : widgets[1]; |
|
} else if (c instanceof JSplitPane) { |
|
return (((JSplitPane)c).getOrientation() == JSplitPane.HORIZONTAL_SPLIT) ? |
|
widgets[1] : widgets[0]; |
|
} else if (id == Region.LABEL) { |
|
|
|
|
|
|
|
|
|
*/ |
|
if (c instanceof ListCellRenderer) { |
|
return widgets[1]; |
|
} else { |
|
return widgets[0]; |
|
} |
|
} else if (id == Region.TEXT_FIELD) { |
|
String name = c.getName(); |
|
if (name != null && name.startsWith("ComboBox")) { |
|
return widgets[1]; |
|
} else { |
|
return widgets[0]; |
|
} |
|
} else if (id == Region.FORMATTED_TEXT_FIELD) { |
|
String name = c.getName(); |
|
if (name != null && name.startsWith("Spinner")) { |
|
return widgets[1]; |
|
} else { |
|
return widgets[0]; |
|
} |
|
} else if (id == Region.ARROW_BUTTON) { |
|
if (c.getParent() instanceof JScrollBar) { |
|
Integer prop = (Integer) |
|
c.getClientProperty("__arrow_direction__"); |
|
int dir = (prop != null) ? |
|
prop.intValue() : SwingConstants.WEST; |
|
switch (dir) { |
|
case SwingConstants.WEST: |
|
return WidgetType.HSCROLL_BAR_BUTTON_LEFT; |
|
case SwingConstants.EAST: |
|
return WidgetType.HSCROLL_BAR_BUTTON_RIGHT; |
|
case SwingConstants.NORTH: |
|
return WidgetType.VSCROLL_BAR_BUTTON_UP; |
|
case SwingConstants.SOUTH: |
|
return WidgetType.VSCROLL_BAR_BUTTON_DOWN; |
|
default: |
|
return null; |
|
} |
|
} else if (c.getParent() instanceof JComboBox) { |
|
return WidgetType.COMBO_BOX_ARROW_BUTTON; |
|
} else { |
|
return WidgetType.SPINNER_ARROW_BUTTON; |
|
} |
|
} |
|
|
|
return null; |
|
} |
|
|
|
private static int getTextDirection(SynthContext context) { |
|
TextDirection dir = TextDirection.NONE; |
|
JComponent comp = context.getComponent(); |
|
if (comp != null) { |
|
ComponentOrientation co = comp.getComponentOrientation(); |
|
if (co != null) { |
|
dir = co.isLeftToRight() ? |
|
TextDirection.LTR : TextDirection.RTL; |
|
} |
|
} |
|
return dir.ordinal(); |
|
} |
|
|
|
public void paintArrow(Graphics g, SynthContext context, |
|
Region id, int state, ShadowType shadowType, ArrowType direction, |
|
String detail, int x, int y, int w, int h) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_arrow(widget, state, shadowType.ordinal(), |
|
detail, x - x0, y - y0, w, h, direction.ordinal()); |
|
} |
|
|
|
public void paintBox(Graphics g, SynthContext context, |
|
Region id, int state, ShadowType shadowType, |
|
String detail, int x, int y, int w, int h) { |
|
|
|
int gtkState = |
|
GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int synthState = context.getComponentState(); |
|
int dir = getTextDirection(context); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_box(widget, gtkState, shadowType.ordinal(), |
|
detail, x - x0, y - y0, w, h, synthState, dir); |
|
} |
|
|
|
public void paintBoxGap(Graphics g, SynthContext context, |
|
Region id, int state, ShadowType shadowType, |
|
String detail, int x, int y, int w, int h, |
|
PositionType boxGapType, int tabBegin, int size) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_box_gap(widget, state, shadowType.ordinal(), detail, |
|
x - x0, y - y0, w, h, boxGapType.ordinal(), tabBegin, size); |
|
} |
|
|
|
public void paintCheck(Graphics g, SynthContext context, |
|
Region id, String detail, int x, int y, int w, int h) { |
|
|
|
int synthState = context.getComponentState(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_check(widget, synthState, detail, x - x0, y - y0, w, h); |
|
} |
|
|
|
public void paintExpander(Graphics g, SynthContext context, |
|
Region id, int state, ExpanderStyle expanderStyle, String detail, |
|
int x, int y, int w, int h) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_expander(widget, state, detail, x - x0, y - y0, w, h, |
|
expanderStyle.ordinal()); |
|
} |
|
|
|
public void paintExtension(Graphics g, SynthContext context, |
|
Region id, int state, ShadowType shadowType, String detail, |
|
int x, int y, int w, int h, PositionType placement, int tabIndex) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_extension(widget, state, shadowType.ordinal(), detail, |
|
x - x0, y - y0, w, h, placement.ordinal()); |
|
} |
|
|
|
public void paintFlatBox(Graphics g, SynthContext context, |
|
Region id, int state, ShadowType shadowType, String detail, |
|
int x, int y, int w, int h, ColorType colorType) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_flat_box(widget, state, shadowType.ordinal(), detail, |
|
x - x0, y - y0, w, h, |
|
context.getComponent().hasFocus()); |
|
} |
|
|
|
public void paintFocus(Graphics g, SynthContext context, |
|
Region id, int state, String detail, int x, int y, int w, int h) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_focus(widget, state, detail, x - x0, y - y0, w, h); |
|
} |
|
|
|
public void paintHandle(Graphics g, SynthContext context, |
|
Region id, int state, ShadowType shadowType, String detail, |
|
int x, int y, int w, int h, Orientation orientation) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_handle(widget, state, shadowType.ordinal(), detail, |
|
x - x0, y - y0, w, h, orientation.ordinal()); |
|
} |
|
|
|
public void paintHline(Graphics g, SynthContext context, |
|
Region id, int state, String detail, int x, int y, int w, int h) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_hline(widget, state, detail, x - x0, y - y0, w, h); |
|
} |
|
|
|
public void paintOption(Graphics g, SynthContext context, |
|
Region id, String detail, int x, int y, int w, int h) { |
|
|
|
int synthState = context.getComponentState(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_option(widget, synthState, detail, x - x0, y - y0, w, h); |
|
} |
|
|
|
public void paintShadow(Graphics g, SynthContext context, |
|
Region id, int state, ShadowType shadowType, String detail, |
|
int x, int y, int w, int h) { |
|
|
|
int gtkState = |
|
GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int synthState = context.getComponentState(); |
|
Container parent = context.getComponent().getParent(); |
|
if(GTKLookAndFeel.is3()) { |
|
if (parent != null && parent.getParent() instanceof JComboBox) { |
|
if (parent.getParent().hasFocus()) { |
|
synthState |= SynthConstants.FOCUSED; |
|
} |
|
} |
|
} |
|
int dir = getTextDirection(context); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_shadow(widget, gtkState, shadowType.ordinal(), detail, |
|
x - x0, y - y0, w, h, synthState, dir); |
|
} |
|
|
|
public void paintSlider(Graphics g, SynthContext context, |
|
Region id, int state, ShadowType shadowType, String detail, int x, |
|
int y, int w, int h, Orientation orientation, boolean hasFocus) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_slider(widget, state, shadowType.ordinal(), detail, |
|
x - x0, y - y0, w, h, orientation.ordinal(), hasFocus); |
|
} |
|
|
|
public void paintVline(Graphics g, SynthContext context, |
|
Region id, int state, String detail, int x, int y, int w, int h) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_vline(widget, state, detail, x - x0, y - y0, w, h); |
|
} |
|
|
|
public void paintBackground(Graphics g, SynthContext context, |
|
Region id, int state, Color color, int x, int y, int w, int h) { |
|
|
|
state = GTKLookAndFeel.synthStateToGTKStateType(state).ordinal(); |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
native_paint_background(widget, state, x - x0, y - y0, w, h); |
|
} |
|
|
|
private final static ColorModel[] COLOR_MODELS = { |
|
|
|
new DirectColorModel(24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000), |
|
|
|
new DirectColorModel(25, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x01000000), |
|
|
|
ColorModel.getRGBdefault(), |
|
}; |
|
|
|
private final static int[][] BAND_OFFSETS = { |
|
{ 0x00ff0000, 0x0000ff00, 0x000000ff }, |
|
{ 0x00ff0000, 0x0000ff00, 0x000000ff, 0x01000000 }, |
|
{ 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 } |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public boolean paintCachedImage(Graphics g, |
|
int x, int y, int w, int h, Object... args) { |
|
if (w <= 0 || h <= 0) { |
|
return true; |
|
} |
|
|
|
|
|
Image img = cache.getImage(getClass(), null, w, h, args); |
|
if (img != null) { |
|
g.drawImage(img, x, y, null); |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public void startPainting(Graphics g, |
|
int x, int y, int w, int h, Object... args) { |
|
nativeStartPainting(w, h); |
|
x0 = x; |
|
y0 = y; |
|
w0 = w; |
|
h0 = h; |
|
graphics = g; |
|
cacheArgs = args; |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
public BufferedImage finishPainting() { |
|
return finishPainting(true); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public BufferedImage finishPainting(boolean useCache) { |
|
DataBufferInt dataBuffer = new DataBufferInt(w0 * h0); |
|
// Note that stealData() requires a markDirty() afterwards |
|
|
|
int transparency = |
|
nativeFinishPainting(SunWritableRaster.stealData(dataBuffer, 0), |
|
w0, h0); |
|
SunWritableRaster.markDirty(dataBuffer); |
|
|
|
int[] bands = BAND_OFFSETS[transparency - 1]; |
|
WritableRaster raster = Raster.createPackedRaster( |
|
dataBuffer, w0, h0, w0, bands, null); |
|
|
|
ColorModel cm = COLOR_MODELS[transparency - 1]; |
|
BufferedImage img = new BufferedImage(cm, raster, false, null); |
|
if (useCache) { |
|
cache.setImage(getClass(), null, w0, h0, cacheArgs, img); |
|
} |
|
graphics.drawImage(img, x0, y0, null); |
|
return img; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public void themeChanged() { |
|
synchronized(sun.awt.UNIXToolkit.GTK_LOCK) { |
|
native_switch_theme(); |
|
} |
|
cache.flush(); |
|
} |
|
|
|
|
|
public Object getSetting(Settings property) { |
|
synchronized(sun.awt.UNIXToolkit.GTK_LOCK) { |
|
return native_get_gtk_setting(property.ordinal()); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
void setRangeValue(SynthContext context, Region id, |
|
double value, double min, double max, double visible) { |
|
int widget = getWidgetType(context.getComponent(), id).ordinal(); |
|
nativeSetRangeValue(widget, value, min, max, visible); |
|
} |
|
} |