From 8b003f5338671d5bfd07383e26e61a336555db86 Mon Sep 17 00:00:00 2001
From: Raphael Girardot <raphael.girardot@synchrotron-soleil.fr>
Date: Tue, 8 Oct 2013 14:55:13 +0000
Subject: [PATCH] beta version of DockingInfoNode

---
 dockinginfonode/pom.xml                       |  79 ++++++
 .../infonode/InfoNodeDockingManager.java      | 174 ++++++++++++
 .../soleil/docking/infonode/InfoNodeView.java | 266 ++++++++++++++++++
 3 files changed, 519 insertions(+)
 create mode 100644 dockinginfonode/pom.xml
 create mode 100644 dockinginfonode/src/main/java/fr/soleil/docking/infonode/InfoNodeDockingManager.java
 create mode 100644 dockinginfonode/src/main/java/fr/soleil/docking/infonode/InfoNodeView.java

diff --git a/dockinginfonode/pom.xml b/dockinginfonode/pom.xml
new file mode 100644
index 0000000..81755c5
--- /dev/null
+++ b/dockinginfonode/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <artifactId>super-pom-java</artifactId>
+    <groupId>fr.soleil</groupId>
+    <version>RELEASE</version>
+  </parent>
+
+  <groupId>fr.soleil.lib</groupId>
+  <artifactId>DockingInfoNode</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+
+  <name>Docking InfoNode</name>
+  <description>InfoNode implementation of DockingCore</description>
+
+  <developers>
+    <developer>
+      <id>girardot</id>
+      <name>Raphaël GIRARDOT</name>
+      <email>raphael.girardot@synchrotron-soleil.fr</email>
+      <organization>SOLEIL</organization>
+      <organizationUrl>http://www.synchrotron-soleil.fr</organizationUrl>
+      <roles>
+        <role>Manager</role>
+      </roles>
+      <timezone>1</timezone>
+    </developer>
+    <developer>
+      <id>viguier</id>
+      <name>Grégory VIGUIER</name>
+      <email>gregory.viguier@synchrotron-soleil.fr</email>
+      <organization>SOLEIL</organization>
+      <organizationUrl>http://www.synchrotron-soleil.fr</organizationUrl>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+      <timezone>1</timezone>
+    </developer>
+  </developers>
+
+  <scm>
+    <connection>scm:svn:https://svn.code.sf.net/p/comete/code/trunk/DockingInfoNode</connection>
+    <developerConnection>scm:svn:https://svn.code.sf.net/p/comete/code/trunk/DockingInfoNode</developerConnection>
+    <url>https://svn.code.sf.net/p/comete/code/trunk/DockingInfoNode</url>
+  </scm>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <configuration>
+          <encoding>UTF-8</encoding>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <encoding>UTF-8</encoding>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>fr.soleil.lib</groupId>
+      <artifactId>DockingCore</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>net.infonode</groupId>
+      <artifactId>idw-gpl</artifactId>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/dockinginfonode/src/main/java/fr/soleil/docking/infonode/InfoNodeDockingManager.java b/dockinginfonode/src/main/java/fr/soleil/docking/infonode/InfoNodeDockingManager.java
new file mode 100644
index 0000000..f554a82
--- /dev/null
+++ b/dockinginfonode/src/main/java/fr/soleil/docking/infonode/InfoNodeDockingManager.java
@@ -0,0 +1,174 @@
+package fr.soleil.docking.infonode;
+
+import java.beans.PropertyChangeEvent;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+
+import net.infonode.docking.RootWindow;
+import net.infonode.docking.View;
+import net.infonode.docking.ViewSerializer;
+import net.infonode.docking.properties.DockingWindowProperties;
+import net.infonode.docking.util.DockingUtil;
+import net.infonode.util.Direction;
+import fr.soleil.docking.ADockingManager;
+import fr.soleil.docking.exception.DockingException;
+import fr.soleil.docking.perspective.IPerspective;
+import fr.soleil.docking.perspective.IPerspectiveFactory;
+import fr.soleil.docking.view.IView;
+import fr.soleil.docking.view.IViewFactory;
+
+/**
+ * A class that prepares docking. Obtain your RootWindow from this class.
+ * 
+ * @author HARDION
+ * @author GIRARDOT
+ */
+public class InfoNodeDockingManager extends ADockingManager {
+
+    protected RootWindow rootWindow;
+
+    public InfoNodeDockingManager(IViewFactory viewFactory, IPerspectiveFactory perspectiveFactory) {
+        super(viewFactory, perspectiveFactory);
+    }
+
+    @Override
+    public JComponent getDockingArea() {
+        if (rootWindow == null) {
+            rootWindow = (RootWindow) createNewDockingArea();
+        }
+        return rootWindow;
+    }
+
+    @Override
+    public JComponent createNewDockingArea() {
+        RootWindow result = new RootWindow(new MyViewSerializer(viewFactory));
+        for (IView view : viewFactory.getViews()) {
+            DockingUtil.addWindow((View) view, rootWindow);
+        }
+        result.getWindowBar(Direction.DOWN).setEnabled(true);
+        result.getRootWindowProperties().getDockingWindowProperties().setUndockEnabled(false);
+        return result;
+    }
+
+    @Override
+    public void loadPerspective(IPerspective perspective) throws DockingException {
+        DockingException dockingException = null;
+        if (perspective.getByteArray().length > 0) {
+            ObjectInputStream ois = null;
+            ByteArrayInputStream bais = null;
+            try {
+                bais = new ByteArrayInputStream(perspective.getByteArray());
+                ois = new ObjectInputStream(bais);
+                rootWindow.read(ois);
+            } catch (Exception e) {
+                dockingException = new DockingException("Perspective.load() :" + " Unexpected Error", e);
+            } finally {
+                try {
+                    if (ois != null) {
+                        ois.close();
+                    }
+                    // Actually there is no effect to close bais ...
+                } catch (IOException e) {
+                    if (dockingException == null) {
+                        dockingException = new DockingException("I/O Exception", e);
+                    } else {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        if (dockingException != null) {
+            throw dockingException;
+        }
+    }
+
+    @Override
+    protected void savePerspective(IPerspective perspective) {
+        ByteArrayOutputStream baos = null;
+        ObjectOutputStream ous = null;
+        baos = new ByteArrayOutputStream();
+        try {
+            ous = new ObjectOutputStream(baos);
+            rootWindow.write(ous, false);
+        } catch (IOException e) {
+            e.printStackTrace();
+            JOptionPane.showMessageDialog(rootWindow, "Perspective.save() :" + " Unexpected Error (see traces)",
+                    "INFONODE Docking - Error", JOptionPane.ERROR_MESSAGE);
+        } finally {
+            try {
+                ous.close();
+                // Actually there is no effect to close baos ...
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        perspective.setByteArray(baos.toByteArray());
+    }
+
+    @Override
+    protected void updateViews(PropertyChangeEvent evt) {
+        if (evt.getSource() == this.viewFactory) {
+            View newView = (View) evt.getNewValue();
+            View oldView = (View) evt.getOldValue();
+            if (newView == null) { // removed
+                oldView.close();
+            } else {
+                DockingUtil.addWindow(newView, rootWindow);
+            }
+        }
+    }
+
+    @Override
+    public void setEnabledDocking(boolean enabledDocking) {
+        RootWindow rootWindow = (RootWindow) getDockingArea();
+        rootWindow.getRootWindowProperties().getDockingWindowProperties().setCloseEnabled(enabledDocking);
+        rootWindow.getRootWindowProperties().getDockingWindowProperties().setDragEnabled(enabledDocking);
+        rootWindow.getRootWindowProperties().getDockingWindowProperties().setMaximizeEnabled(enabledDocking);
+        rootWindow.getRootWindowProperties().getDockingWindowProperties().setMinimizeEnabled(enabledDocking);
+    }
+
+    @Override
+    public boolean isEnabledDocking() {
+        DockingWindowProperties dwp = this.rootWindow.getRootWindowProperties().getDockingWindowProperties();
+
+        return dwp.getCloseEnabled() && dwp.getDragEnabled() && dwp.getMaximizeEnabled() && dwp.getMinimizeEnabled();
+    }
+
+    // ///////////// //
+    // Inner classes //
+    // ///////////// //
+
+    protected class MyViewSerializer implements ViewSerializer {
+
+        private final IViewFactory viewFactory;
+
+        /**
+         * Utility constructor that creates a map with a number of views. A view gets it's index in
+         * the array as id.
+         * 
+         * @param views the views to add to the map
+         */
+        public MyViewSerializer(IViewFactory viewFactory) {
+            this.viewFactory = viewFactory;
+        }
+
+        @Override
+        public View readView(ObjectInputStream in) throws IOException {
+            Object id = viewFactory.readViewId(in);
+            return (View) viewFactory.getView(id);
+        }
+
+        @Override
+        public void writeView(View view, ObjectOutputStream out) throws IOException {
+            viewFactory.writeViewId(((IView) view).getId(), out);
+        }
+
+    }
+
+}
diff --git a/dockinginfonode/src/main/java/fr/soleil/docking/infonode/InfoNodeView.java b/dockinginfonode/src/main/java/fr/soleil/docking/infonode/InfoNodeView.java
new file mode 100644
index 0000000..736560f
--- /dev/null
+++ b/dockinginfonode/src/main/java/fr/soleil/docking/infonode/InfoNodeView.java
@@ -0,0 +1,266 @@
+package fr.soleil.docking.infonode;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import net.infonode.docking.DockingWindow;
+import net.infonode.docking.DockingWindowListener;
+import net.infonode.docking.OperationAbortedException;
+import net.infonode.docking.View;
+import fr.soleil.docking.view.IView;
+import fr.soleil.docking.view.IViewListener;
+
+/**
+ * A dynamically created view containing an id.
+ * 
+ * @author Hardion
+ * @author GIRARDOT
+ */
+public class InfoNodeView extends View implements IView {
+
+    private static final long serialVersionUID = -8766019787338480450L;
+
+    protected Object id;
+
+    /**
+     * Constructor.
+     * 
+     * @param title the view title
+     * @param icon the view icon
+     * @param component the view component
+     * @param id the view id
+     */
+    public InfoNodeView(String title, Icon icon, Component component, Object id) {
+        super(title, icon, component);
+        this.id = id;
+    }
+
+    @Override
+    public Object getId() {
+        return id;
+    }
+
+    @Override
+    public boolean isVisible() {
+        boolean visible;
+        if (super.isShowing()) {
+            visible = true;
+        } else if (super.getWindowParent() != null && super.getWindowParent().isRestorable()) {
+            visible = true;
+        } else {
+            visible = false;
+        }
+        return visible;
+    }
+
+    @Override
+    public void setVisible(boolean visible) {
+        if (visible) {
+            super.restore();
+        } else {
+            super.close();
+        }
+        super.setVisible(visible);
+        super.setEnabled(visible);
+    }
+
+    @Override
+    protected void update() {
+        super.update();
+        super.setVisible(true);
+        super.setEnabled(true);
+
+    }
+
+    @Override
+    public Color getViewBackground() {
+        return getBackground();
+    }
+
+    @Override
+    public void setViewBackground(Color bg) {
+        setComponentsBackground(getCustomTabComponents(), bg);
+        setComponentsBackground(getCustomTitleBarComponents(), bg);
+        setBackground(this, bg);
+    }
+
+    @Override
+    public Color getViewForeground() {
+        return getForeground();
+    }
+
+    @Override
+    public void setViewForeground(Color fg) {
+        setComponentsForeground(getCustomTabComponents(), fg);
+        setComponentsForeground(getCustomTitleBarComponents(), fg);
+        setForeground(this, fg);
+    }
+
+    /**
+     * Sets the background {@link Color} of a {@link DockingWindow}
+     * 
+     * @param win The {@link DockingWindow}
+     * @param bg The background {@link Color} to set
+     */
+    protected void setBackground(DockingWindow win, Color bg) {
+        win.setBackground(bg);
+        win.setBorder(null);
+        win.getWindowProperties().getTabProperties().getTitledTabProperties().getNormalProperties()
+                .getComponentProperties().setBackgroundColor(bg);
+        win.getWindowProperties().getTabProperties().getTitledTabProperties().getHighlightedProperties()
+                .getComponentProperties().setBackgroundColor(bg);
+    }
+
+    /**
+     * Sets the foreground {@link Color} of a {@link DockingWindow}
+     * 
+     * @param win The {@link DockingWindow}
+     * @param fg The foreground {@link Color} to set
+     */
+    protected void setForeground(DockingWindow win, Color fg) {
+        win.setForeground(fg);
+        win.getWindowProperties().getTabProperties().getTitledTabProperties().getNormalProperties()
+                .getComponentProperties().setForegroundColor(fg);
+        win.getWindowProperties().getTabProperties().getTitledTabProperties().getHighlightedProperties()
+                .getComponentProperties().setForegroundColor(fg);
+    }
+
+    /**
+     * Sets the background of all {@link Component}s in a given {@link List}
+     * 
+     * @param components The {@link List}
+     * @param bg The background to set
+     */
+    protected void setComponentsBackground(List<?> components, Color bg) {
+        if (components != null) {
+            for (Object comp : components) {
+                if (comp instanceof Component) {
+                    ((Component) comp).setBackground(bg);
+                }
+            }
+        }
+    }
+
+    /**
+     * Sets the foreground of all {@link Component}s in a given {@link List}
+     * 
+     * @param components The {@link List}
+     * @param bg The foreground to set
+     */
+    protected void setComponentsForeground(List<?> components, Color bg) {
+        if (components != null) {
+            for (Object comp : components) {
+                if (comp instanceof Component) {
+                    ((Component) comp).setForeground(bg);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void setClosable(boolean closable) {
+        if (getWindowProperties() != null) {
+            getWindowProperties().getTabProperties().getNormalButtonProperties().getCloseButtonProperties()
+                    .setVisible(closable);
+            getWindowProperties().getTabProperties().getHighlightedButtonProperties().getCloseButtonProperties()
+                    .setVisible(closable);
+            getWindowProperties().setCloseEnabled(closable);
+        }
+    }
+
+    @Override
+    public void addViewListener(final IViewListener listener) {
+        addListener(new DockingWindowListener() {
+
+            @Override
+            public void windowUndocking(DockingWindow window) throws OperationAbortedException {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowUndocked(DockingWindow window) {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowShown(DockingWindow window) {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowRestoring(DockingWindow window) throws OperationAbortedException {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowRestored(DockingWindow window) {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowRemoved(DockingWindow removedFromWindow, DockingWindow removedWindow) {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowMinimizing(DockingWindow window) throws OperationAbortedException {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowMinimized(DockingWindow window) {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowMaximizing(DockingWindow window) throws OperationAbortedException {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowMaximized(DockingWindow window) {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowHidden(DockingWindow window) {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowDocking(DockingWindow window) throws OperationAbortedException {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowDocked(DockingWindow window) {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowClosing(DockingWindow window) throws OperationAbortedException {
+                // Not used yet.
+            }
+
+            @Override
+            public void windowClosed(DockingWindow window) {
+                listener.viewClosed();
+            }
+
+            @Override
+            public void windowAdded(DockingWindow addedToWindow, DockingWindow addedWindow) {
+                // Not used yet.
+            }
+
+            @Override
+            public void viewFocusChanged(View previouslyFocusedView, View focusedView) {
+                // Not used yet.
+            }
+        });
+
+    }
+
+}
-- 
GitLab