?? skinrootpaneui.java
字號:
/*
* Adapted from MetalRootPaneUI comments below were copied from that class
*/
package com.l2fprod.gui.plaf.skin;
import com.l2fprod.util.AccessUtils;
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JMenu;
import javax.swing.JRootPane;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.MouseInputListener;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicRootPaneUI;
/**
*
* Provides the metal look and feel implementation of <code>RootPaneUI</code>.
* <p>
* <code>MetalRootPaneUI</code> provides support for the <code>windowDecorationStyle</code>
* property of <code>JRootPane</code>.<code>MetalRootPaneUI</code> does
* this by way of installing a custom <code>LayoutManager</code>, a private
* <code>Component</code> to render the appropriate widgets, and a private
* <code>Border</code>. The <code>LayoutManager</code> is always
* installed, regardless of the value of the <code>windowDecorationStyle</code>
* property, but the <code>Border</code> and <code>Component</code> are
* only installed/added if the <code>windowDecorationStyle</code> is other
* than <code>JRootPane.NONE</code>.
* <p>
* <strong>Warning:</strong> Serialized objects of this class will not be
* compatible with future Swing releases. The current serialization support is
* appropriate for short term storage or RMI between applications running the
* same version of Swing. As of 1.4, support for long term storage of all
* JavaBeans <sup><font size="-2">TM</font></sup> has been added to the
* <code>java.beans</code> package. Please see {@link java.beans.XMLEncoder}.
*
* @version 1.16 02/04/02
* @author Terry Kellerman
* @since 1.4
*/
public final class SkinRootPaneUI extends BasicRootPaneUI {
// TO MAKE THE CODE COMPILE WITH JDK < 1.4
public final static int Frame_MAXIMIZED_BOTH =
AccessUtils.getIntValue(JFrame.class, "MAXIMIZED_BOTH");
public final static int JRootPane_NONE =
AccessUtils.getIntValue(JRootPane.class, "NONE");
public static int getExtendedState(Frame p_Frame) {
return AccessUtils.getAsInt(p_Frame, "getExtendedState");
}
public static void setExtendedState(Frame p_Frame, int p_Value) {
AccessUtils.setAsInt(p_Frame, "setExtendedState", p_Value);
}
public static int getWindowDecorationStyle(JRootPane p_Pane) {
return AccessUtils.getAsInt(p_Pane, "getWindowDecorationStyle");
}
private Skin skin = SkinLookAndFeel.getSkin();
private Window.FrameWindow title = null;
/**
* The amount of space (in pixels) that the cursor is changed on.
*/
private static final int CORNER_DRAG_WIDTH = 16;
/**
* Region from edges that dragging is active from.
*/
private static final int BORDER_DRAG_THICKNESS = 5;
/**
* Window the <code>JRootPane</code> is in.
*/
private java.awt.Window window;
/**
* <code>JComponent</code> providing window decorations. This will be null
* if not providing window decorations.
*/
private SkinTitlePane titlePane;
/**
* <code>MouseInputListener</code> that is added to the parent <code>Window</code>
* the <code>JRootPane</code> is contained in.
*/
private MouseInputListener mouseInputListener;
/**
* The <code>LayoutManager</code> that is set on the <code>JRootPane</code>.
*/
private LayoutManager layoutManager;
/**
* <code>LayoutManager</code> of the <code>JRootPane</code> before we
* replaced it.
*/
private LayoutManager savedOldLayout;
/**
* <code>JRootPane</code> providing the look and feel for.
*/
private JRootPane root;
/**
* <code>Cursor</code> used to track the cursor set by the user. This is
* initially <code>Cursor.DEFAULT_CURSOR</code>.
*/
private Cursor lastCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
/**
* Creates a UI for a <code>JRootPane</code>.
*
* @param c the JRootPane the RootPaneUI will be created for
* @return the RootPaneUI implementation for the passed in JRootPane
*/
public static ComponentUI createUI(JComponent c) {
return new SkinRootPaneUI();
}
private static java.awt.Window translateSource(MouseEvent ev) {
Object source = ev.getSource();
java.awt.Window w;
if (source.getClass() == SkinTitlePane.class) {
SkinTitlePane titleSource = (SkinTitlePane)source;
Window.FrameWindow win = (Window.FrameWindow)titleSource.getWindow();
w = win.getMainFrame();
} else
w = (java.awt.Window)ev.getSource();
return w;
}
/**
* Invokes supers implementation of <code>installUI</code> to install the
* necessary state onto the passed in <code>JRootPane</code> to render the
* metal look and feel implementation of <code>RootPaneUI</code>. If the
* <code>windowDecorationStyle</code> property of the <code>JRootPane</code>
* is other than <code>JRootPane.NONE</code>, this will add a custom
* <code>Component</code> to render the widgets to <code>JRootPane</code>,
* as well as installing a custom <code>Border</code> and <code>LayoutManager</code>
* on the <code>JRootPane</code>.
*
* @param c the JRootPane to install state onto
*/
public void installUI(JComponent c) {
super.installUI(c);
root = (JRootPane)c;
int style = getWindowDecorationStyle(root);
if (style != JRootPane_NONE) {
installClientDecorations(root);
}
//skin.getFrame().installSkin(c);
}
/**
* Invokes supers implementation to uninstall any of its state. This will
* also reset the <code>LayoutManager</code> of the <code>JRootPane</code>.
* If a <code>Component</code> has been added to the <code>JRootPane</code>
* to render the window decoration style, this method will remove it.
* Similarly, this will revert the Border and LayoutManager of the <code>JRootPane</code>
* to what it was before <code>installUI</code> was invoked.
*
* @param c the JRootPane to uninstall state from
*/
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
uninstallClientDecorations(root);
layoutManager = null;
mouseInputListener = null;
root = null;
}
/**
* Installs the appropriate <code>Border</code> onto the <code>JRootPane</code>.
*/
void installBorder(JRootPane root) {
int style = getWindowDecorationStyle(root);
if (style == JRootPane_NONE) {
LookAndFeel.uninstallBorder(root);
} else {
//LookAndFeel.installBorder(root, borderKeys[style]);
skin.getFrame().installSkin(root);
}
}
/**
* Removes any border that may have been installed.
*/
private void uninstallBorder(JRootPane root) {
LookAndFeel.uninstallBorder(root);
}
/**
* Installs the necessary Listeners on the parent <code>Window</code>, if
* there is one.
* <p>
* This takes the parent so that cleanup can be done from <code>removeNotify</code>,
* at which point the parent hasn't been reset yet.
*
* @param parent The parent of the JRootPane
*/
private void installWindowListeners(JRootPane root, Component parent) {
if (parent instanceof java.awt.Window) {
window = (java.awt.Window)parent;
} else {
window = SwingUtilities.getWindowAncestor(parent);
}
if (window != null) {
if (mouseInputListener == null) {
mouseInputListener = createWindowMouseInputListener(root);
}
window.addMouseListener(mouseInputListener);
window.addMouseMotionListener(mouseInputListener);
}
}
/**
* Uninstalls the necessary Listeners on the <code>Window</code> the
* Listeners were last installed on.
*/
private void uninstallWindowListeners(JRootPane root) {
if (window != null) {
window.removeMouseListener(mouseInputListener);
window.removeMouseMotionListener(mouseInputListener);
}
}
/**
* Installs the appropriate LayoutManager on the <code>JRootPane</code> to
* render the window decorations.
*/
private void installLayout(JRootPane root) {
if (layoutManager == null) {
layoutManager = createLayoutManager();
}
savedOldLayout = root.getLayout();
root.setLayout(layoutManager);
}
/**
* Uninstalls the previously installed <code>LayoutManager</code>.
*/
private void uninstallLayout(JRootPane root) {
if (savedOldLayout != null) {
root.setLayout(savedOldLayout);
savedOldLayout = null;
}
}
/**
* Installs the necessary state onto the JRootPane to render client
* decorations. This is ONLY invoked if the <code>JRootPane</code> has a
* decoration style other than <code>JRootPane.NONE</code>.
*/
private void installClientDecorations(JRootPane root) {
installBorder(root);
JComponent titlePane = createTitlePane(root);
setTitlePane(root, titlePane);
installWindowListeners(root, root.getParent());
installLayout(root);
adjustIconAndBackground();
if (window != null) {
root.revalidate();
root.repaint();
}
}
/**
* @param window
*/
private void adjustIconAndBackground() {
if (window != null) {
title.setFrame(window);
// the titlePane may not have been updated yet as it was created with a
// empty FrameWindow so update its actions.
titlePane.enableActions();
// callback to notify the titlePane the FrameWindow was set
titlePane.windowSet();
String[] colors = skin.getColors();
boolean cont = true;
for (int i = 0; i < colors.length && cont; i++) {
String string = colors[i];
if (string.equalsIgnoreCase("desktop")) {
cont = false;
try {
Color background = new ColorUIResource(Color.decode(colors[i + 1]));
window.setBackground(background);
} catch (NumberFormatException e) {
}
}
}
java.awt.Window target = title.getMainFrame();
if (target instanceof JFrame) {
JFrame current = (JFrame)target;
Icon provided = titlePane.getWindow().getFrameIcon();
Icon general = UIManager.getIcon("InternalFrame.icon");
Icon toWork = provided;
if (provided == null)
toWork = general;
if (toWork != null) {
BufferedImage theIcon =
new BufferedImage(
toWork.getIconWidth(),
toWork.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics graph = theIcon.getGraphics();
toWork.paintIcon(null, graph, 0, 0);
current.setIconImage(theIcon);
}
}
}
}
private void resetIconAndBackground() {
if (window != null) {
window.setBackground(null);
title.setFrame(null);
}
}
/**
* Uninstalls any state that <code>installClientDecorations</code> has
* installed.
* <p>
* NOTE: This may be called if you haven't installed client decorations yet
* (ie before <code>installClientDecorations</code> has been invoked).
*/
private void uninstallClientDecorations(JRootPane root) {
uninstallBorder(root);
uninstallWindowListeners(root);
setTitlePane(root, null);
uninstallLayout(root);
resetIconAndBackground();
// We have to revalidate/repaint root if the style is JRootPane.NONE
// only. When we needs to call revalidate/repaint with other styles
// the installClientDecorations is always called after this method
// imediatly and it will cause the revalidate/repaint at the proper
// time.
int style = getWindowDecorationStyle(root);
if (style == JRootPane_NONE) {
root.repaint();
root.revalidate();
}
// Reset the cursor, as we may have changed it to a resize cursor
if (window != null) {
window.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
window = null;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -