gtklookandfeel.java
来自「JAVA 所有包」· Java 代码 · 共 1,369 行 · 第 1/5 页
JAVA
1,369 行
/* * @(#)GTKLookAndFeel.java 1.106 06/11/30 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.java.swing.plaf.gtk;import sun.swing.SwingUtilities2;import java.lang.ref.*;import javax.swing.plaf.synth.*;import java.awt.*;import java.awt.event.*;import java.beans.*;import java.io.File;import java.security.AccessController;import java.security.PrivilegedAction;import java.util.HashMap;import java.util.Locale;import javax.swing.*;import javax.swing.LayoutStyle.ComponentPlacement;import javax.swing.colorchooser.*;import javax.swing.plaf.*;import javax.swing.text.DefaultEditorKit;import java.io.IOException;import com.sun.java.swing.plaf.gtk.GTKConstants.PositionType;import com.sun.java.swing.plaf.gtk.GTKConstants.StateType;import sun.awt.SunToolkit;import sun.security.action.GetPropertyAction;import sun.swing.DefaultLayoutStyle;/** * @version 1.106, 11/30/06 * @author Scott Violet */public class GTKLookAndFeel extends SynthLookAndFeel { private static final boolean IS_22; /** * Whether or not text is drawn antialiased. This keys off the * desktop property 'gnome.Xft/Antialias' and 'gnome.Xft/RGBA' * We should assume ON - or some variation of ON as no GTK desktop * ships with it OFF. */ static Object aaTextInfo; /** * Solaris, or Linux with Sun JDS in a CJK Locale. * Used to determine if Sun's high quality CJK fonts are present. */ private static boolean isSunCJK; /* * Used to override if system (desktop) text anti-aliasing settings should * be used. The reasons for this are are is that currently its "off" * for CJK locales which is not likely to be a good universal answer, and * also its off for remote display. So this provides an unsupported * way to explicitly request that it be "on". */ private static boolean gtkAAFontSettingsCond; /** * Font to use in places where there is no widget. */ private Font fallbackFont; /** * If true, GTKLookAndFeel is inside the <code>initialize</code> * method. */ private boolean inInitialize; /** * StyleFactory needs to be created only the first time. */ private GTKStyleFactory styleFactory; /** * Cached theme name. Used by GTKGraphicsUtils */ private static String gtkThemeName = "Default"; static { // Backup for specifying the version, this isn't currently documented. // If you pass in anything but 2.2 you got the 2.0 colors/look. String version = (String)java.security.AccessController.doPrivileged( new GetPropertyAction("swing.gtk.version")); if (version != null) { IS_22 = version.equals("2.2"); } else { IS_22 = true; } String language = Locale.getDefault().getLanguage(); boolean cjkLocale = (Locale.CHINESE.getLanguage().equals(language) || Locale.JAPANESE.getLanguage().equals(language) || Locale.KOREAN.getLanguage().equals(language)); if (cjkLocale) { boolean isSunDesktop = false; String osName = System.getProperty("os.name"); if (osName != null) { if (osName.equals("SunOS")) { isSunDesktop = true; } else if (osName.equals("Linux")) { Boolean val = (Boolean)java.security.AccessController.doPrivileged( new java.security.PrivilegedAction() { public Object run() { File f = new File("/etc/sun-release"); return Boolean.valueOf(f.exists()); } }); isSunDesktop = val.booleanValue(); } } if (isSunDesktop) { isSunCJK = true; } } } /** * Returns true if running on system containing at least 2.2. */ static boolean is2_2() { // NOTE: We're currently hard coding to use 2.2. // If we want to support both GTK 2.0 and 2.2, we'll // need to get the major/minor/micro version from the .so. // Refer to bug 4912613 for details. return IS_22; } /** * Maps a swing constant to a GTK constant. */ static PositionType SwingOrientationConstantToGTK(int side) { switch (side) { case SwingConstants.LEFT: return PositionType.LEFT; case SwingConstants.RIGHT: return PositionType.RIGHT; case SwingConstants.TOP: return PositionType.TOP; case SwingConstants.BOTTOM: return PositionType.BOTTOM; } assert false : "Unknown orientation: " + side; return PositionType.TOP; } /** * Maps from Synth state to native GTK state using typesafe enumeration * StateType. This is only used by the GTKNativeEngine. */ static StateType synthStateToGTKStateType(int state) { StateType result; switch (state) { case SynthConstants.PRESSED: result = StateType.ACTIVE; break; case SynthConstants.MOUSE_OVER: result = StateType.PRELIGHT; break; case SynthConstants.SELECTED: result = StateType.SELECTED; break; case SynthConstants.DISABLED: result = StateType.INSENSITIVE; break; case SynthConstants.ENABLED: default: result = StateType.NORMAL; break; } return result; } /** * Maps from a Synth state to the corresponding GTK state. * The GTK states are named differently than Synth's states, the * following gives the mapping: * <table><tr><td>Synth<td>GTK * <tr><td>SynthConstants.PRESSED<td>ACTIVE * <tr><td>SynthConstants.SELECTED<td>SELECTED * <tr><td>SynthConstants.MOUSE_OVER<td>PRELIGHT * <tr><td>SynthConstants.DISABLED<td>INSENSITIVE * <tr><td>SynthConstants.ENABLED<td>NORMAL * </table> * Additionally some widgets are special cased. */ static int synthStateToGTKState(Region region, int state) { if ((state & SynthConstants.PRESSED) != 0) { if (region == Region.RADIO_BUTTON || region == Region.CHECK_BOX || region == Region.MENU || region == Region.MENU_ITEM || region == Region.RADIO_BUTTON_MENU_ITEM || region == Region.CHECK_BOX_MENU_ITEM || region == Region.SPLIT_PANE) { state = SynthConstants.MOUSE_OVER; } else { state = SynthConstants.PRESSED; } } else if (region == Region.TABBED_PANE_TAB) { if ((state & SynthConstants.DISABLED) != 0) { state = SynthConstants.DISABLED; } else if ((state & SynthConstants.SELECTED) != 0) { state = SynthConstants.ENABLED; } else { state = SynthConstants.PRESSED; } } else if ((state & SynthConstants.SELECTED) != 0) { if (region == Region.MENU) { state = SynthConstants.MOUSE_OVER; } else if (region == Region.RADIO_BUTTON || region == Region.TOGGLE_BUTTON || region == Region.RADIO_BUTTON_MENU_ITEM || region == Region.CHECK_BOX_MENU_ITEM || region == Region.CHECK_BOX || region == Region.BUTTON) { if ((state & SynthConstants.DISABLED) != 0) { state = SynthConstants.DISABLED; } // If the button is SELECTED and is PRELIGHT we need to // make the state MOUSE_OVER otherwise we don't paint the // PRELIGHT. else if ((state & SynthConstants.MOUSE_OVER) != 0) { state = SynthConstants.MOUSE_OVER; } else { state = SynthConstants.PRESSED; } } else { state = SynthConstants.SELECTED; } } else if ((state & SynthConstants.MOUSE_OVER) != 0) { state = SynthConstants.MOUSE_OVER; } else if ((state & SynthConstants.DISABLED) != 0) { state = SynthConstants.DISABLED; } else { if (region == Region.SLIDER_TRACK) { state = SynthConstants.PRESSED; } else { state = SynthConstants.ENABLED; } } return state; } static boolean isText(Region region) { // These Regions treat FOREGROUND as TEXT. return (region == Region.TEXT_FIELD || region == Region.FORMATTED_TEXT_FIELD || region == Region.LIST || region == Region.PASSWORD_FIELD || region == Region.SPINNER || region == Region.TABLE || region == Region.TEXT_AREA || region == Region.TEXT_FIELD || region == Region.TEXT_PANE || region == Region.TREE); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?