# HG changeset patch # User alexp # Date 1257536020 -10800 # Node ID 9b3f8c82d5c002e51b6af64199e527914a70bd50 # Parent ff9daeaa1e21490eb886f4b142f37baf153614e6# Parent 4c3444f1b9d8f836999f7f8d74172e7155c4f8be Merge diff -r 4c3444f1b9d8 -r 9b3f8c82d5c0 jdk/src/share/classes/javax/swing/plaf/LayerUI.java --- a/jdk/src/share/classes/javax/swing/plaf/LayerUI.java Fri Nov 06 12:44:41 2009 +0300 +++ b/jdk/src/share/classes/javax/swing/plaf/LayerUI.java Fri Nov 06 22:33:40 2009 +0300 @@ -71,33 +71,410 @@ * Subclasses should override this method and use * the specified {@code Graphics} object to * render the content of the component. + *

+ * If {@code g} is not an instance of {@code Graphics2D}, + * this method is no-op. * * @param g the {@code Graphics} context in which to paint; * @param c the component being painted; - * it can be safely cast to the {@code JLayer} + * it can be safely cast to {@code JLayer} + * + * @see #configureGraphics(Graphics2D, JLayer) + * @see #paintLayer(Graphics2D, JLayer) */ - @Override public void paint(Graphics g, JComponent c) { - c.paint(g); + if (g instanceof Graphics2D) { + Graphics2D g2 = (Graphics2D) g.create(); + JLayer l = (JLayer) c; + configureGraphics(g2, l); + paintLayer(g2, l); + g2.dispose(); + } + } + + /** + * This method is called by the {@link #paint} method prior to + * {@link #paintLayer} to configure the {@code Graphics2D} object. + * The default implementation is empty. + * + * @param g2 the {@code Graphics2D} object to configure + * @param l the {@code JLayer} being painted + * + * @see #paintLayer(Graphics2D, JLayer) + */ + protected void configureGraphics(Graphics2D g2, JLayer l) { + } + + /** + * Called by the {@link #paint} method, + * subclasses should override this method + * to perform any custom painting operations. + *

+ * The default implementation paints the passed {@code JLayer} as is. + * + * @param g2 the {@code Graphics2D} context in which to paint + * @param l the {@code JLayer} being painted + * + * @see #configureGraphics(Graphics2D, JLayer) + */ + protected void paintLayer(Graphics2D g2, JLayer l) { + l.paint(g2); } /** * Dispatches {@code AWTEvent}s for {@code JLayer} - * and all it subcomponents to this {@code LayerUI} instance. - *

- * To enable the {@code AWTEvent} of the particular type, - * you call {@link javax.swing.JLayer#setLayerEventMask} + * and all its subcomponents to this {@code LayerUI} instance. + *

+ * To enable the {@code AWTEvent}s of a particular type, + * you call {@link JLayer#setLayerEventMask} * in {@link #installUI(javax.swing.JComponent)} * and set the layer event mask to {@code 0} - * in {@link #uninstallUI(javax.swing.JComponent)} after that + * in {@link #uninstallUI(javax.swing.JComponent)} after that. + * By default this method calls the appropriate + * {@code process<event type>Event} + * method for the given class of event. * * @param e the event to be dispatched * @param l the layer this LayerUI is set to * * @see JLayer#setLayerEventMask(long) - * @see javax.swing.JLayer#getLayerEventMask() + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + * @see #processComponentEvent + * @see #processFocusEvent + * @see #processKeyEvent + * @see #processMouseEvent + * @see #processMouseMotionEvent + * @see #processInputMethodEvent + * @see #processHierarchyEvent + * @see #processMouseWheelEvent */ public void eventDispatched(AWTEvent e, JLayer l){ + if (e instanceof FocusEvent) { + processFocusEvent((FocusEvent)e, l); + + } else if (e instanceof MouseEvent) { + switch(e.getID()) { + case MouseEvent.MOUSE_PRESSED: + case MouseEvent.MOUSE_RELEASED: + case MouseEvent.MOUSE_CLICKED: + case MouseEvent.MOUSE_ENTERED: + case MouseEvent.MOUSE_EXITED: + processMouseEvent((MouseEvent)e, l); + break; + case MouseEvent.MOUSE_MOVED: + case MouseEvent.MOUSE_DRAGGED: + processMouseMotionEvent((MouseEvent)e, l); + break; + case MouseEvent.MOUSE_WHEEL: + processMouseWheelEvent((MouseWheelEvent)e, l); + break; + } + } else if (e instanceof KeyEvent) { + processKeyEvent((KeyEvent)e, l); + } else if (e instanceof ComponentEvent) { + processComponentEvent((ComponentEvent)e, l); + } else if (e instanceof InputMethodEvent) { + processInputMethodEvent((InputMethodEvent)e, l); + } else if (e instanceof HierarchyEvent) { + switch (e.getID()) { + case HierarchyEvent.HIERARCHY_CHANGED: + processHierarchyEvent((HierarchyEvent)e, l); + break; + case HierarchyEvent.ANCESTOR_MOVED: + case HierarchyEvent.ANCESTOR_RESIZED: + processHierarchyBoundsEvent((HierarchyEvent)e, l); + break; + } + } + } + + /** + * Processes component events occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless component events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Component events are enabled in the overridden {@link #installUI} method + * and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.COMPONENT_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code ComponentEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processComponentEvent(ComponentEvent e, JLayer l) { + } + + /** + * Processes focus events occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless focus events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Focus events are enabled in the overridden {@link #installUI} method + * and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.FOCUS_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code FocusEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processFocusEvent(FocusEvent e, JLayer l) { + } + + /** + * Processes key events occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless key events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Key events are enabled in the overridden {@link #installUI} method + * and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.KEY_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code KeyEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processKeyEvent(KeyEvent e, JLayer l) { + } + + /** + * Processes mouse events occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless mouse events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Mouse events are enabled in the overridden {@link #installUI} method + * and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code MouseEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processMouseEvent(MouseEvent e, JLayer l) { + } + + /** + * Processes mouse motion event occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless mouse motion events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Mouse motion events are enabled in the overridden {@link #installUI} method + * and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.MOUSE_MOTION_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code MouseEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processMouseMotionEvent(MouseEvent e, JLayer l) { + } + + /** + * Processes mouse wheel event occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless mouse wheel events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Mouse wheel events are enabled in the overridden {@link #installUI} method + * and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.MOUSE_WHEEL_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code MouseEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processMouseWheelEvent(MouseWheelEvent e, JLayer l) { + } + + /** + * Processes input event occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless input events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Input events are enabled in the overridden {@link #installUI} method + * and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.INPUT_METHOD_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code InputMethodEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processInputMethodEvent(InputMethodEvent e, JLayer l) { + } + + /** + * Processes hierarchy event occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless hierarchy events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Hierarchy events are enabled in the overridden {@link #installUI} method + * and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.HIERARCHY_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code HierarchyEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processHierarchyEvent(HierarchyEvent e, JLayer l) { + } + + /** + * Processes hierarchy bounds event occurring on the {@link JLayer} + * or any of its subcomponents. + *

+ * This method is not called unless hierarchy bounds events are + * enabled for the {@code JLayer} objects, this {@code LayerUI} is set to. + * Hierarchy bounds events are enabled in the overridden {@link #installUI} + * method and should be disabled in the {@link #uninstallUI} method after that. + *

+     * public void installUI(JComponent c) {
+     *    super.installUI(c);
+     *    JLayer l = (JLayer) c;
+     *    l.setLayerEventMask(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
+     * }
+     *
+     * public void unistallUI(JComponent c) {
+     *     super.uninstallUI(c);
+     *     JLayer l = (JLayer) c;
+     *     l.setLayerEventMask(0);
+     * }
+     * 
+ * + * @param e the {@code HierarchyEvent} to be processed + * @param l the layer this {@code LayerUI} instance is set to + * + * @see JLayer#setLayerEventMask(long) + * @see #installUI(javax.swing.JComponent) + * @see #uninstallUI(javax.swing.JComponent) + */ + protected void processHierarchyBoundsEvent(HierarchyEvent e, JLayer l) { } /** @@ -251,13 +628,28 @@ } /** + * Repaints all {@code JLayer} instances this {@code LayerUI} is set to. + * Call this method when the state of this {@code LayerUI} is changed + * and the visual appearance of its {@code JLayer} objects needs to be updated. + * + * @see Component#repaint() + */ + protected void repaintLayer() { + firePropertyChange("dirty", null, null); + } + + /** * Notifies the {@code LayerUI} when any of its property are changed - * and enables updating every {@code JLayer} this {@code LayerUI} instance is set to. + * and enables updating every {@code JLayer} + * this {@code LayerUI} instance is set to. * * @param evt the PropertyChangeEvent generated by this {@code LayerUI} * @param l the {@code JLayer} this LayerUI is set to */ public void applyPropertyChange(PropertyChangeEvent evt, JLayer l) { + if ("dirty".equals(evt.getPropertyName())) { + l.repaint(); + } } /**