Browse Source

Make sure propertyChangeListener is called when dirty is set to true

pull/276/head
weisj 3 years ago
parent
commit
865e8e9a68
No known key found for this signature in database
GPG Key ID: 31124CB75461DA2A
  1. 183
      core/src/main/java/org/pbjar/jxlayer/plaf/ext/AbstractLayerUI.java

183
core/src/main/java/org/pbjar/jxlayer/plaf/ext/AbstractLayerUI.java

@ -1,32 +1,24 @@
/*
* Copyright (c) 2006-2009, Alexander Potochkin
* All rights reserved.
* Copyright (c) 2006-2009, Alexander Potochkin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of the JXLayer project nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* * Redistributions of source code must retain the above copyright notice, this list of conditions
* and the following disclaimer. * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. * Neither the name of the JXLayer project nor the names
* of its contributors may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.pbjar.jxlayer.plaf.ext;
@ -38,71 +30,68 @@ import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.geom.AffineTransform;
import java.beans.PropertyChangeListener;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.beans.PropertyChangeEvent;
/**
* The {@code AbstractLayerUI} provided default implementation for most
* of the abstract methods in the {@link LayerUI} class.
* It takes care of the management of {@code LayerItemListener}s and
* defines the hook method to configure the {@code Graphics2D} instance
* specified in the {@link #paint(Graphics,JComponent)} method.
* It also provides convenient methods named
* The {@code AbstractLayerUI} provided default implementation for most of the abstract methods in
* the {@link LayerUI} class. It takes care of the management of {@code LayerItemListener}s and
* defines the hook method to configure the {@code Graphics2D} instance specified in the
* {@link #paint(Graphics,JComponent)} method. It also provides convenient methods named
* {@code process<eventType>Event} to process the given class of event.
* <p/>
* If state of the {@code AbstractLayerUI} is changed, call {@link #setDirty(boolean)}
* with {@code true} as the parameter, it will repaint all {@code JLayer}s
* connected with this {@code AbstractLayerUI}
* If state of the {@code AbstractLayerUI} is changed, call {@link #setDirty(boolean)} with
* {@code true} as the parameter, it will repaint all {@code JLayer}s connected with this
* {@code AbstractLayerUI}
*
* @see JLayer#setUI(LayerUI)
*/
public abstract class AbstractLayerUI<V extends JComponent>
extends LayerUI<V> {
extends LayerUI<V> {
private static final Map<RenderingHints.Key, Object> emptyRenderingHintMap =
Collections.unmodifiableMap(new HashMap<>(0));
Collections.unmodifiableMap(new HashMap<>(0));
private boolean dirty;
private LayoutManager layoutManager;
private JComponent installedComponent;
private final PropertyChangeListener dirtyListener = e -> {
if (installedComponent != null && (!"dirty".equals(e.getPropertyName())
|| e.getNewValue() == Boolean.TRUE)) {
installedComponent.repaint();
}
};
public void installUI(JComponent c) {
public void installUI(final JComponent c) {
super.installUI(c);
installedComponent = c;
addPropertyChangeListener(dirtyListener);
((JLayer<?>) c).setLayerEventMask(getLayerEventMask());
}
public void uninstallUI(JComponent c) {
public void uninstallUI(final JComponent c) {
super.uninstallUI(c);
((JLayer<?>) c).setLayerEventMask(0);
removePropertyChangeListener(dirtyListener);
installedComponent = null;
}
/**
* {@inheritDoc}
*/
public void handlePropertyChangeEvent(PropertyChangeEvent evt, JLayer<? extends V> l) {
if (!"dirty".equals(evt.getPropertyName())
|| evt.getNewValue() == Boolean.TRUE) {
l.repaint();
}
}
/**
* Returns the "dirty bit".
* If {@code true}, then the {@code AbstractLayerUI} is considered dirty
* Returns the "dirty bit". If {@code true}, then the {@code AbstractLayerUI} is considered dirty
* and in need of being repainted.
*
* @return {@code true} if the {@code AbstractLayerUI} state has changed
* and the {@link JLayer}s it is set to need to be repainted.
* @return {@code true} if the {@code AbstractLayerUI} state has changed and the {@link JLayer}s it
* is set to need to be repainted.
*/
protected boolean isDirty() {
return dirty;
}
/**
* Sets the "dirty bit".
* If {@code isDirty} is {@code true}, then the {@code AbstractLayerUI}
* is considered dirty and it triggers the repainting
* of the {@link JLayer}s this {@code AbstractLayerUI} it is set to.
* Sets the "dirty bit". If {@code isDirty} is {@code true}, then the {@code AbstractLayerUI} is
* considered dirty and it triggers the repainting of the {@link JLayer}s this
* {@code AbstractLayerUI} it is set to.
*
* @param isDirty whether this {@code AbstractLayerUI} is dirty or not.
*/
@ -115,13 +104,12 @@ public abstract class AbstractLayerUI<V extends JComponent>
/**
* {@inheritDoc}
* <p/>
* <b>Note:</b> It is rarely necessary to override this method, for
* custom painting override {@link #paintLayer(Graphics2D,JLayer)} instead
* <b>Note:</b> It is rarely necessary to override this method, for custom painting override
* {@link #paintLayer(Graphics2D,JLayer)} instead
* <p/>
* This method configures the passed {@code Graphics} with help of the
* {@link #configureGraphics(Graphics2D,JLayer)} method,
* then calls {@code paintLayer(Graphics2D,JLayer)}
* and resets the "dirty bit" at the end.
* {@link #configureGraphics(Graphics2D,JLayer)} method, then calls
* {@code paintLayer(Graphics2D,JLayer)} and resets the "dirty bit" at the end.
*
* @see #configureGraphics(Graphics2D,JLayer)
* @see #paintLayer(Graphics2D,JLayer)
@ -140,8 +128,7 @@ public abstract class AbstractLayerUI<V extends JComponent>
}
/**
* Subclasses should implement this method
* and perform custom painting operations here.
* Subclasses should implement this method and perform custom painting operations here.
* <p/>
* The default implementation paints the passed {@code JLayer} as is.
*
@ -153,11 +140,9 @@ public abstract class AbstractLayerUI<V extends JComponent>
}
/**
* This method is called by the {@link #paint} method prior to
* any drawing operations to configure the {@code Graphics2D} object.
* The default implementation sets the {@link Composite}, the clip,
* {@link AffineTransform} and rendering hints
* obtained from the corresponding hook methods.
* This method is called by the {@link #paint} method prior to any drawing operations to configure
* the {@code Graphics2D} object. The default implementation sets the {@link Composite}, the clip,
* {@link AffineTransform} and rendering hints obtained from the corresponding hook methods.
*
* @param g2 the {@code Graphics2D} object to configure
* @param l the {@code JLayer} being painted
@ -192,8 +177,8 @@ public abstract class AbstractLayerUI<V extends JComponent>
}
/**
* Returns the {@link Composite} to be used during painting of this {@code JLayer},
* the default implementation returns {@code null}.
* Returns the {@link Composite} to be used during painting of this {@code JLayer}, the default
* implementation returns {@code null}.
*
* @param l the {@code JLayer} being painted
*
@ -204,8 +189,8 @@ public abstract class AbstractLayerUI<V extends JComponent>
}
/**
* Returns the {@link AffineTransform} to be used during painting of this {@code JLayer},
* the default implementation returns {@code null}.
* Returns the {@link AffineTransform} to be used during painting of this {@code JLayer}, the
* default implementation returns {@code null}.
*
* @param l the {@code JLayer} being painted
*
@ -216,8 +201,8 @@ public abstract class AbstractLayerUI<V extends JComponent>
}
/**
* Returns the {@link Shape} to be used as the clip during painting of this {@code JLayer},
* the default implementation returns {@code null}.
* Returns the {@link Shape} to be used as the clip during painting of this {@code JLayer}, the
* default implementation returns {@code null}.
*
* @param l the {@code JLayer} being painted
*
@ -228,8 +213,8 @@ public abstract class AbstractLayerUI<V extends JComponent>
}
/**
* Returns the map of rendering hints to be used during painting of this {@code JLayer},
* the default implementation returns the empty unmodifiable map.
* Returns the map of rendering hints to be used during painting of this {@code JLayer}, the default
* implementation returns the empty unmodifiable map.
*
* @param l the {@code JLayer} being painted
*
@ -278,24 +263,22 @@ public abstract class AbstractLayerUI<V extends JComponent>
}
/**
* By default only mouse, mouse motion, mouse wheel, keyboard and focus events are supported,
* if you need to catch any other type of events,
* override this method to return the different mask
* By default only mouse, mouse motion, mouse wheel, keyboard and focus events are supported, if you
* need to catch any other type of events, override this method to return the different mask
*
* @see JLayer#setLayerEventMask(long)
*/
public long getLayerEventMask() {
return AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK
| AWTEvent.MOUSE_WHEEL_EVENT_MASK
| AWTEvent.KEY_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK;
| AWTEvent.MOUSE_WHEEL_EVENT_MASK
| AWTEvent.KEY_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK;
}
/**
* {@inheritDoc}
* <p/>
* This method calls the appropriate
* {@code process<eventType>Event}
* method for the given class of event.
* This method calls the appropriate {@code process<eventType>Event} method for the given class of
* event.
*/
@Override
public void eventDispatched(AWTEvent e, JLayer<? extends V> l) {
@ -324,52 +307,42 @@ public abstract class AbstractLayerUI<V extends JComponent>
}
/**
* Processes {@code FocusEvent} occurring on the {@link JLayer}
* or any of its subcomponents.
* Processes {@code FocusEvent} occurring on the {@link JLayer} or any of its subcomponents.
*
* @param e the {@code FocusEvent} to be processed
* @param l the layer this LayerUI is set to
*/
protected void processFocusEvent(FocusEvent e, JLayer<? extends V> l) {
}
protected void processFocusEvent(FocusEvent e, JLayer<? extends V> l) {}
/**
* Processes {@code MouseEvent} occurring on the {@link JLayer}
* or any of its subcomponents.
* Processes {@code MouseEvent} occurring on the {@link JLayer} or any of its subcomponents.
*
* @param e the {@code MouseEvent} to be processed
* @param l the layer this LayerUI is set to
*/
protected void processMouseEvent(MouseEvent e, JLayer<? extends V> l) {
}
protected void processMouseEvent(MouseEvent e, JLayer<? extends V> l) {}
/**
* Processes mouse motion events occurring on the {@link JLayer}
* or any of its subcomponents.
* Processes mouse motion events occurring on the {@link JLayer} or any of its subcomponents.
*
* @param e the {@code MouseEvent} to be processed
* @param l the layer this LayerUI is set to
*/
protected void processMouseMotionEvent(MouseEvent e, JLayer<? extends V> l) {
}
protected void processMouseMotionEvent(MouseEvent e, JLayer<? extends V> l) {}
/**
* Processes {@code MouseWheelEvent} occurring on the {@link JLayer}
* or any of its subcomponents.
* Processes {@code MouseWheelEvent} occurring on the {@link JLayer} or any of its subcomponents.
*
* @param e the {@code MouseWheelEvent} to be processed
* @param l the layer this LayerUI is set to
*/
protected void processMouseWheelEvent(MouseWheelEvent e, JLayer<? extends V> l) {
}
protected void processMouseWheelEvent(MouseWheelEvent e, JLayer<? extends V> l) {}
/**
* Processes {@code KeyEvent} occurring on the {@link JLayer}
* or any of its subcomponents.
* Processes {@code KeyEvent} occurring on the {@link JLayer} or any of its subcomponents.
*
* @param e the {@code KeyEvent} to be processed
* @param l the layer this LayerUI is set to
*/
protected void processKeyEvent(KeyEvent e, JLayer<? extends V> l) {
}
protected void processKeyEvent(KeyEvent e, JLayer<? extends V> l) {}
}

Loading…
Cancel
Save