From a38c49ac64ce293ce551de1ebc96ae9732e4aa54 Mon Sep 17 00:00:00 2001 From: Raphael Girardot <raphael.girardot@synchrotron-soleil.fr> Date: Mon, 2 Nov 2015 15:51:20 +0000 Subject: [PATCH] - better listeners management. Big change --> version set to 1.1.0-SNAPSHOT - added the possibility to change IView's icon and title (JAVAAPI-262) --- dockingcore/pom.xml | 2 +- .../fr/soleil/docking/event/DockingEvent.java | 53 ++++++++++++++ .../docking/listener/IViewListener.java | 22 ++++++ .../listener/ViewListenerDelegate.java | 69 +++++++++++++++++++ .../java/fr/soleil/docking/view/IView.java | 23 +++++++ .../fr/soleil/docking/view/IViewListener.java | 18 ----- 6 files changed, 168 insertions(+), 19 deletions(-) create mode 100644 dockingcore/src/main/java/fr/soleil/docking/event/DockingEvent.java create mode 100644 dockingcore/src/main/java/fr/soleil/docking/listener/IViewListener.java create mode 100644 dockingcore/src/main/java/fr/soleil/docking/listener/ViewListenerDelegate.java delete mode 100644 dockingcore/src/main/java/fr/soleil/docking/view/IViewListener.java diff --git a/dockingcore/pom.xml b/dockingcore/pom.xml index a585086..51c0374 100644 --- a/dockingcore/pom.xml +++ b/dockingcore/pom.xml @@ -9,7 +9,7 @@ </parent> <groupId>fr.soleil.lib</groupId> <artifactId>DockingCore</artifactId> - <version>1.0.6-SNAPSHOT</version> + <version>1.1.0-SNAPSHOT</version> <name>Docking Core</name> <description>A project that defines some common abstractions in docking</description> <developers> diff --git a/dockingcore/src/main/java/fr/soleil/docking/event/DockingEvent.java b/dockingcore/src/main/java/fr/soleil/docking/event/DockingEvent.java new file mode 100644 index 0000000..9c4b0ea --- /dev/null +++ b/dockingcore/src/main/java/fr/soleil/docking/event/DockingEvent.java @@ -0,0 +1,53 @@ +package fr.soleil.docking.event; + +import java.util.EventObject; + +import fr.soleil.docking.view.IView; + +/** + * An {@link EventObject} that describes the changes in an {@link IView} + * + * @author GIRARDOT + */ +public class DockingEvent extends EventObject { + + private static final long serialVersionUID = -9107231208702875097L; + + /** + * An <code>int</code> used to notify that the associated view was closed + */ + public static final int VIEW_CLOSED = 0; + /** + * An <code>int</code> used to notify that the associated view gained the focus + */ + public static final int FOCUS_GAINED = 1; + /** + * An <code>int</code> used to notify that the associated view lost the focus + */ + public static final int FOCUS_LOST = 2; + + protected final int reason; + + public DockingEvent(IView source, int reason) { + super(source); + this.reason = reason; + } + + @Override + public IView getSource() { + return (IView) super.getSource(); + } + + /** + * Returns the reason of the changes + * + * @return An <code>int</code> + * @see #VIEW_CLOSED + * @see #FOCUS_GAINED + * @see #FOCUS_LOST + */ + public int getReason() { + return reason; + } + +} diff --git a/dockingcore/src/main/java/fr/soleil/docking/listener/IViewListener.java b/dockingcore/src/main/java/fr/soleil/docking/listener/IViewListener.java new file mode 100644 index 0000000..9025df1 --- /dev/null +++ b/dockingcore/src/main/java/fr/soleil/docking/listener/IViewListener.java @@ -0,0 +1,22 @@ +package fr.soleil.docking.listener; + +import java.util.EventListener; + +import fr.soleil.docking.event.DockingEvent; +import fr.soleil.docking.view.IView; + +/** + * An {@link EventListener} that listens to the changes in an {@link IView} + * + * @author GIRARDOT + */ +public interface IViewListener extends EventListener { + + /** + * Notifies this {@link IViewListener} for some changes in an {@link IView} + * + * @param event The {@link DockingEvent} that describes the concerned {@link IView} and changes + */ + public void dockingChanged(DockingEvent event); + +} diff --git a/dockingcore/src/main/java/fr/soleil/docking/listener/ViewListenerDelegate.java b/dockingcore/src/main/java/fr/soleil/docking/listener/ViewListenerDelegate.java new file mode 100644 index 0000000..cd48878 --- /dev/null +++ b/dockingcore/src/main/java/fr/soleil/docking/listener/ViewListenerDelegate.java @@ -0,0 +1,69 @@ +package fr.soleil.docking.listener; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.WeakHashMap; + +import fr.soleil.docking.event.DockingEvent; + +/** + * A class delegated to {@link IViewListener}s management + * + * @author GIRARDOT + */ +public class ViewListenerDelegate { + + protected final Collection<IViewListener> listeners; + + public ViewListenerDelegate() { + listeners = Collections.newSetFromMap(new WeakHashMap<IViewListener, Boolean>()); + } + + /** + * Warns all {@link IViewListener}s for some changes + * + * @param event The {@link DockingEvent} that describes the changes + */ + public void warnListeners(DockingEvent event) { + List<IViewListener> copy; + synchronized (listeners) { + copy = new ArrayList<IViewListener>(listeners.size()); + copy.addAll(listeners); + } + for (IViewListener listener : copy) { + if (listener != null) { + listener.dockingChanged(event); + } + } + copy.clear(); + } + + /** + * Adds a new {@link IViewListener} + * + * @param listener the {@link IViewListener} to add + */ + public void addViewListener(final IViewListener listener) { + if (listener != null) { + synchronized (listeners) { + listeners.add(listener); + } + } + } + + /** + * Removes an {@link IViewListener} + * + * @param listener The {@link IViewListener} to remove + */ + public void removeViewListener(IViewListener listener) { + if (listener != null) { + synchronized (listeners) { + listeners.remove(listener); + } + } + } + +} diff --git a/dockingcore/src/main/java/fr/soleil/docking/view/IView.java b/dockingcore/src/main/java/fr/soleil/docking/view/IView.java index 96d04aa..a8eb564 100644 --- a/dockingcore/src/main/java/fr/soleil/docking/view/IView.java +++ b/dockingcore/src/main/java/fr/soleil/docking/view/IView.java @@ -12,6 +12,8 @@ import java.awt.Component; import javax.swing.Icon; +import fr.soleil.docking.listener.IViewListener; + /** * A dynamically created view containing an id. * @@ -57,11 +59,25 @@ public interface IView { */ public String getTitle(); + /** + * Sets this {@link IView}'s title + * + * @param title The title to set + */ + public void setTitle(String title); + /** * @return the icon */ public Icon getIcon(); + /** + * Sets this {@link IView}'s icon + * + * @param icon The icon to set + */ + public void setIcon(Icon icon); + /** * @return the component */ @@ -109,4 +125,11 @@ public interface IView { */ public void addViewListener(IViewListener listener); + /** + * Removes an {@link IViewListener} from the view.. + * + * @param listener The {@link IViewListener} to remove. + */ + public void removeViewListener(IViewListener listener); + } diff --git a/dockingcore/src/main/java/fr/soleil/docking/view/IViewListener.java b/dockingcore/src/main/java/fr/soleil/docking/view/IViewListener.java deleted file mode 100644 index 7aba97d..0000000 --- a/dockingcore/src/main/java/fr/soleil/docking/view/IViewListener.java +++ /dev/null @@ -1,18 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008-2014 Synchrotron SOLEIL - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser Public License v2.1 - * which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html - ******************************************************************************/ -package fr.soleil.docking.view; - -public interface IViewListener { - - public void viewClosed(); - - public void focusGained(); - - public void focusLost(); - -} -- GitLab