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