< prev index next >
src/java.desktop/share/classes/javax/swing/plaf/metal/MetalRootPaneUI.java
Print this page
*** 32,61 ****
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import java.awt.*;
/**
! * 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™
! * has been added to the <code>java.beans</code> package.
* Please see {@link java.beans.XMLEncoder}.
*
* @author Terry Kellerman
* @since 1.4
*/
--- 32,61 ----
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import java.awt.*;
/**
! * Provides the metal look and feel implementation of {@code RootPaneUI}.
* <p>
! * {@code MetalRootPaneUI} provides support for the
! * {@code windowDecorationStyle} property of {@code JRootPane}.
! * {@code MetalRootPaneUI} does this by way of installing a custom
! * {@code LayoutManager}, a private {@code Component} to render
! * the appropriate widgets, and a private {@code Border}. The
! * {@code LayoutManager} is always installed, regardless of the value of
! * the {@code windowDecorationStyle} property, but the
! * {@code Border} and {@code Component} are only installed/added if
! * the {@code windowDecorationStyle} is other than
! * {@code JRootPane.NONE}.
* <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™
! * has been added to the {@code java.beans} package.
* Please see {@link java.beans.XMLEncoder}.
*
* @author Terry Kellerman
* @since 1.4
*/
*** 81,151 ****
* Region from edges that dragging is active from.
*/
private static final int BORDER_DRAG_THICKNESS = 5;
/**
! * Window the <code>JRootPane</code> is in.
*/
private Window window;
/**
! * <code>JComponent</code> providing window decorations. This will be
* null if not providing window decorations.
*/
private JComponent 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 MetalRootPaneUI();
}
/**
! * 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);
--- 81,151 ----
* Region from edges that dragging is active from.
*/
private static final int BORDER_DRAG_THICKNESS = 5;
/**
! * Window the {@code JRootPane} is in.
*/
private Window window;
/**
! * {@code JComponent} providing window decorations. This will be
* null if not providing window decorations.
*/
private JComponent titlePane;
/**
! * {@code MouseInputListener} that is added to the parent
! * {@code Window} the {@code JRootPane} is contained in.
*/
private MouseInputListener mouseInputListener;
/**
! * The {@code LayoutManager} that is set on the
! * {@code JRootPane}.
*/
private LayoutManager layoutManager;
/**
! * {@code LayoutManager} of the {@code JRootPane} before we
* replaced it.
*/
private LayoutManager savedOldLayout;
/**
! * {@code JRootPane} providing the look and feel for.
*/
private JRootPane root;
/**
! * {@code Cursor} used to track the cursor set by the user.
! * This is initially {@code Cursor.DEFAULT_CURSOR}.
*/
private Cursor lastCursor =
Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
/**
! * Creates a UI for a {@code JRootPane}.
*
* @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 MetalRootPaneUI();
}
/**
! * Invokes supers implementation of {@code installUI} to install
! * the necessary state onto the passed in {@code JRootPane}
* to render the metal look and feel implementation of
! * {@code RootPaneUI}. If
! * the {@code windowDecorationStyle} property of the
! * {@code JRootPane} is other than {@code JRootPane.NONE},
! * this will add a custom {@code Component} to render the widgets to
! * {@code JRootPane}, as well as installing a custom
! * {@code Border} and {@code LayoutManager} on the
! * {@code JRootPane}.
*
* @param c the JRootPane to install state onto
*/
public void installUI(JComponent c) {
super.installUI(c);
*** 157,171 ****
}
/**
* 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) {
--- 157,171 ----
}
/**
* Invokes supers implementation to uninstall any of its state. This will
! * also reset the {@code LayoutManager} of the {@code JRootPane}.
! * If a {@code Component} has been added to the {@code JRootPane}
* to render the window decoration style, this method will remove it.
* Similarly, this will revert the Border and LayoutManager of the
! * {@code JRootPane} to what it was before {@code installUI}
* was invoked.
*
* @param c the JRootPane to uninstall state from
*/
public void uninstallUI(JComponent c) {
*** 176,187 ****
mouseInputListener = null;
root = null;
}
/**
! * Installs the appropriate <code>Border</code> onto the
! * <code>JRootPane</code>.
*/
void installBorder(JRootPane root) {
int style = root.getWindowDecorationStyle();
if (style == JRootPane.NONE) {
--- 176,187 ----
mouseInputListener = null;
root = null;
}
/**
! * Installs the appropriate {@code Border} onto the
! * {@code JRootPane}.
*/
void installBorder(JRootPane root) {
int style = root.getWindowDecorationStyle();
if (style == JRootPane.NONE) {
*** 198,212 ****
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) {
--- 198,212 ----
private void uninstallBorder(JRootPane root) {
LookAndFeel.uninstallBorder(root);
}
/**
! * Installs the necessary Listeners on the parent {@code Window},
* if there is one.
* <p>
* This takes the parent so that cleanup can be done from
! * {@code removeNotify}, at which point the parent hasn't been
* reset yet.
*
* @param parent The parent of the JRootPane
*/
private void installWindowListeners(JRootPane root, Component parent) {
*** 224,245 ****
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();
--- 224,245 ----
window.addMouseMotionListener(mouseInputListener);
}
}
/**
! * Uninstalls the necessary Listeners on the {@code Window} 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}
* to render the window decorations.
*/
private void installLayout(JRootPane root) {
if (layoutManager == null) {
layoutManager = createLayoutManager();
*** 247,269 ****
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);
--- 247,269 ----
savedOldLayout = root.getLayout();
root.setLayout(layoutManager);
}
/**
! * Uninstalls the previously installed {@code LayoutManager}.
*/
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}
! * has a decoration style other than {@code JRootPane.NONE}.
*/
private void installClientDecorations(JRootPane root) {
installBorder(root);
JComponent titlePane = createTitlePane(root);
*** 276,290 ****
root.repaint();
}
}
/**
! * 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);
--- 276,290 ----
root.repaint();
}
}
/**
! * Uninstalls any state that {@code installClientDecorations} has
* installed.
* <p>
* NOTE: This may be called if you haven't installed client decorations
! * yet (ie before {@code installClientDecorations} has been invoked).
*/
private void uninstallClientDecorations(JRootPane root) {
uninstallBorder(root);
uninstallWindowListeners(root);
setTitlePane(root, null);
*** 306,333 ****
}
window = null;
}
/**
! * Returns the <code>JComponent</code> to render the window decoration
* style.
*/
private JComponent createTitlePane(JRootPane root) {
return new MetalTitlePane(root, this);
}
/**
! * Returns a <code>MouseListener</code> that will be added to the
! * <code>Window</code> containing the <code>JRootPane</code>.
*/
private MouseInputListener createWindowMouseInputListener(JRootPane root) {
return new MouseInputHandler();
}
/**
! * Returns a <code>LayoutManager</code> that will be set on the
! * <code>JRootPane</code>.
*/
private LayoutManager createLayoutManager() {
return new MetalRootLayout();
}
--- 306,333 ----
}
window = null;
}
/**
! * Returns the {@code JComponent} to render the window decoration
* style.
*/
private JComponent createTitlePane(JRootPane root) {
return new MetalTitlePane(root, this);
}
/**
! * Returns a {@code MouseListener} that will be added to the
! * {@code Window} containing the {@code JRootPane}.
*/
private MouseInputListener createWindowMouseInputListener(JRootPane root) {
return new MouseInputHandler();
}
/**
! * Returns a {@code LayoutManager} that will be set on the
! * {@code JRootPane}.
*/
private LayoutManager createLayoutManager() {
return new MetalRootLayout();
}
*** 336,346 ****
* way to override the native operating system's window title pane with
* one whose look and feel are controlled by the plaf. The plaf creates
* and sets this value; the default is null, implying a native operating
* system window title pane.
*
! * @param content the <code>JComponent</code> to use for the window title pane.
*/
private void setTitlePane(JRootPane root, JComponent titlePane) {
JLayeredPane layeredPane = root.getLayeredPane();
JComponent oldTitlePane = getTitlePane();
--- 336,346 ----
* way to override the native operating system's window title pane with
* one whose look and feel are controlled by the plaf. The plaf creates
* and sets this value; the default is null, implying a native operating
* system window title pane.
*
! * @param content the {@code JComponent} to use for the window title pane.
*/
private void setTitlePane(JRootPane root, JComponent titlePane) {
JLayeredPane layeredPane = root.getLayeredPane();
JComponent oldTitlePane = getTitlePane();
*** 354,395 ****
}
this.titlePane = titlePane;
}
/**
! * Returns the <code>JComponent</code> rendering the title pane. If this
* returns null, it implies there is no need to render window decorations.
*
* @return the current window title pane, or null
* @see #setTitlePane
*/
private JComponent getTitlePane() {
return titlePane;
}
/**
! * Returns the <code>JRootPane</code> we're providing the look and
* feel for.
*/
private JRootPane getRootPane() {
return root;
}
/**
! * Invoked when a property changes. <code>MetalRootPaneUI</code> is
* primarily interested in events originating from the
! * <code>JRootPane</code> it has been installed on identifying the
! * property <code>windowDecorationStyle</code>. If the
! * <code>windowDecorationStyle</code> has changed to a value other
! * than <code>JRootPane.NONE</code>, this will add a <code>Component</code>
! * to the <code>JRootPane</code> to render the window decorations, as well
! * as installing a <code>Border</code> on the <code>JRootPane</code>.
! * On the other hand, if the <code>windowDecorationStyle</code> has
! * changed to <code>JRootPane.NONE</code>, this will remove the
! * <code>Component</code> that has been added to the <code>JRootPane</code>
* as well resetting the Border to what it was before
! * <code>installUI</code> was invoked.
*
* @param e A PropertyChangeEvent object describing the event source
* and the property that has changed.
*/
public void propertyChange(PropertyChangeEvent e) {
--- 354,395 ----
}
this.titlePane = titlePane;
}
/**
! * Returns the {@code JComponent} rendering the title pane. If this
* returns null, it implies there is no need to render window decorations.
*
* @return the current window title pane, or null
* @see #setTitlePane
*/
private JComponent getTitlePane() {
return titlePane;
}
/**
! * Returns the {@code JRootPane} we're providing the look and
* feel for.
*/
private JRootPane getRootPane() {
return root;
}
/**
! * Invoked when a property changes. {@code MetalRootPaneUI} is
* primarily interested in events originating from the
! * {@code JRootPane} it has been installed on identifying the
! * property {@code windowDecorationStyle}. If the
! * {@code windowDecorationStyle} has changed to a value other
! * than {@code JRootPane.NONE}, this will add a {@code Component}
! * to the {@code JRootPane} to render the window decorations, as well
! * as installing a {@code Border} on the {@code JRootPane}.
! * On the other hand, if the {@code windowDecorationStyle} has
! * changed to {@code JRootPane.NONE}, this will remove the
! * {@code Component} that has been added to the {@code JRootPane}
* as well resetting the Border to what it was before
! * {@code installUI} was invoked.
*
* @param e A PropertyChangeEvent object describing the event source
* and the property that has changed.
*/
public void propertyChange(PropertyChangeEvent e) {
*** 928,939 ****
}
}
}
/**
! * Returns the corner that contains the point <code>x</code>,
! * <code>y</code>, or -1 if the position doesn't match a corner.
*/
private int calculateCorner(Window w, int x, int y) {
Insets insets = w.getInsets();
int xPosition = calculatePosition(x - insets.left,
w.getWidth() - insets.left - insets.right);
--- 928,939 ----
}
}
}
/**
! * Returns the corner that contains the point {@code x},
! * {@code y}, or -1 if the position doesn't match a corner.
*/
private int calculateCorner(Window w, int x, int y) {
Insets insets = w.getInsets();
int xPosition = calculatePosition(x - insets.left,
w.getWidth() - insets.left - insets.right);
*** 956,967 ****
}
return cursorMapping[corner];
}
/**
! * Returns an integer indicating the position of <code>spot</code>
! * in <code>width</code>. The return value will be:
* 0 if < BORDER_DRAG_THICKNESS
* 1 if < CORNER_DRAG_WIDTH
* 2 if >= CORNER_DRAG_WIDTH && < width - BORDER_DRAG_THICKNESS
* 3 if >= width - CORNER_DRAG_WIDTH
* 4 if >= width - BORDER_DRAG_THICKNESS
--- 956,967 ----
}
return cursorMapping[corner];
}
/**
! * Returns an integer indicating the position of {@code spot}
! * in {@code width}. The return value will be:
* 0 if < BORDER_DRAG_THICKNESS
* 1 if < CORNER_DRAG_WIDTH
* 2 if >= CORNER_DRAG_WIDTH && < width - BORDER_DRAG_THICKNESS
* 3 if >= width - CORNER_DRAG_WIDTH
* 4 if >= width - BORDER_DRAG_THICKNESS
< prev index next >