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 + -
显示快捷键?