summaryrefslogtreecommitdiff
path: root/src/main/java/com/c2kernel/gui/tree
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/c2kernel/gui/tree')
-rw-r--r--src/main/java/com/c2kernel/gui/tree/Node.java13
-rw-r--r--src/main/java/com/c2kernel/gui/tree/NodeCollection.java120
-rw-r--r--src/main/java/com/c2kernel/gui/tree/NodeItem.java83
-rw-r--r--src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java71
4 files changed, 264 insertions, 23 deletions
diff --git a/src/main/java/com/c2kernel/gui/tree/Node.java b/src/main/java/com/c2kernel/gui/tree/Node.java
index 6142851..501c256 100644
--- a/src/main/java/com/c2kernel/gui/tree/Node.java
+++ b/src/main/java/com/c2kernel/gui/tree/Node.java
@@ -29,6 +29,7 @@ public abstract class Node implements Runnable {
protected int sysKey; // target item
// attributes
protected String type = "";
+ protected String toolTip = null;
protected Icon icon;
protected boolean isExpandable = false;
protected HashMap<Path, Node> childNodes = new HashMap<Path, Node>();
@@ -229,4 +230,14 @@ public abstract class Node implements Runnable {
popup.add(menuItem);
return popup;
}
-}
+
+ public String getToolTip() {
+ if (toolTip != null && toolTip.length()>0)
+ return toolTip;
+ else
+ return type;
+ }
+
+ public void setToolTip(String tip) {
+ this.toolTip = tip;
+ }}
diff --git a/src/main/java/com/c2kernel/gui/tree/NodeCollection.java b/src/main/java/com/c2kernel/gui/tree/NodeCollection.java
index 631ed8b..47afc5f 100644
--- a/src/main/java/com/c2kernel/gui/tree/NodeCollection.java
+++ b/src/main/java/com/c2kernel/gui/tree/NodeCollection.java
@@ -4,19 +4,27 @@ import java.util.ArrayList;
import javax.swing.tree.DefaultMutableTreeNode;
+import com.c2kernel.collection.Collection;
import com.c2kernel.collection.CollectionMember;
-import com.c2kernel.collection.Parent2ChildCollection;
+import com.c2kernel.collection.Dependency;
import com.c2kernel.common.ObjectNotFoundException;
+import com.c2kernel.entity.proxy.EntityProxyObserver;
import com.c2kernel.entity.proxy.ItemProxy;
+import com.c2kernel.entity.proxy.MemberSubscription;
import com.c2kernel.gui.EntityTabManager;
+import com.c2kernel.gui.MainFrame;
import com.c2kernel.lookup.EntityPath;
import com.c2kernel.lookup.InvalidEntityPathException;
+import com.c2kernel.lookup.Path;
+import com.c2kernel.persistency.ClusterStorage;
+import com.c2kernel.utils.CastorHashMap;
+import com.c2kernel.utils.KeyValuePair;
import com.c2kernel.utils.Logger;
-public class NodeCollection extends Node {
+public class NodeCollection extends Node implements EntityProxyObserver<Collection<? extends CollectionMember>> {
ItemProxy parent;
- Parent2ChildCollection<CollectionMember> thisCollection;
+ Collection<? extends CollectionMember> thisCollection;
String path;
public NodeCollection(ItemProxy parent, String name, EntityTabManager desktop) {
@@ -27,42 +35,116 @@ public class NodeCollection extends Node {
createTreeNode();
this.makeExpandable();
}
+
+ public NodeCollection(ItemProxy parent, Collection<? extends CollectionMember> coll, EntityTabManager desktop) {
+ this.desktop = desktop;
+ this.parent = parent;
+ this.name = coll.getName();
+ this.path = parent.getSystemKey()+"/Collection/"+name;
+ createTreeNode();
+ this.makeExpandable();
+ add(coll);
+ }
@Override
public void loadChildren() {
Logger.msg(8, "NodeCollection::loadChildren()");
try {
- thisCollection = (Parent2ChildCollection<CollectionMember>)parent.getObject("Collection/"+name);
+ if (thisCollection == null) {
+ Collection<? extends CollectionMember> initColl = (Collection<? extends CollectionMember>)parent.getObject(ClusterStorage.COLLECTION+"/"+name);
+ add(initColl);
+ }
+ parent.subscribe(new MemberSubscription<Collection<? extends CollectionMember>>(this, ClusterStorage.COLLECTION, false));
} catch (ObjectNotFoundException ex) {
end(false);
return;
}
-
- this.type = thisCollection.getClass().getName();
- int lastDot = this.type.lastIndexOf('.');
- if (lastDot > -1) this.type = this.type.substring(lastDot+1);
- ArrayList<CollectionMember> collectionMembers = thisCollection.getMembers().list;
- for (int i=0; i<collectionMembers.size(); i++)
- {
- CollectionMember aMember = collectionMembers.get(i);
- if (aMember!=null)
+ }
+
+ @Override
+ public void add(Collection<? extends CollectionMember> contents) {
+ if (!contents.getName().equals(name)) return;
+ this.type = contents.getClass().getSimpleName();
+ ArrayList<? extends CollectionMember> newMembers = contents.getMembers().list;
+ ArrayList<? extends CollectionMember> oldMembers;
+ if (thisCollection == null)
+ oldMembers = new ArrayList<CollectionMember>();
+ else
+ oldMembers = thisCollection.getMembers().list;
+
+ ArrayList<Path> currentPaths = new ArrayList<Path>();
+ // add any missing paths
+ for (CollectionMember newMember : newMembers) {
+ if (!oldMembers.contains(newMember) && newMember.getEntityKey()>-1)
try
{
- EntityPath entityPath = new EntityPath(aMember.getEntityKey());
- add(new NodeItem(entityPath, desktop));
+ EntityPath entityPath = new EntityPath(newMember.getEntityKey());
+ currentPaths.add(entityPath);
+ NodeItem newMemberNode = new NodeItem(entityPath, desktop);
+ newMemberNode.setCollection(contents, newMember.getID(), parent);
+ newMemberNode.setToolTip(getPropertyToolTip(newMember.getProperties()));
+ add(newMemberNode);
}
catch (InvalidEntityPathException ex)
{
- Logger.error("InvalidEntityPathException::NodeCollection::loadChildren() " + ex.toString());
+ Logger.error("NodeCollection::loadChildren() " + ex.toString());
}
}
-
- end(false);
-
+ // remove those no longer present
+ for (Path childPath : childNodes.keySet()) {
+ if (!currentPaths.contains(childPath)) {
+ remove(childPath);
+ }
+
+ }
+
+ thisCollection = contents;
+ if (isDependency())
+ setToolTip(getPropertyToolTip(((Dependency)contents).getProperties()));
+ end(false);
+ }
+
+ public boolean addMember(int syskey) {
+ if (!isDependency()) return false;
+ String[] params = { thisCollection.getName(), String.valueOf(syskey) };
+ try {
+ MainFrame.userAgent.execute(parent, "AddMemberToCollection", params);
+ return true;
+ } catch (Exception e1) {
+ MainFrame.exceptionDialog(e1);
+ return false;
+ }
+ }
+
+ public static String getPropertyToolTip(CastorHashMap props) {
+ if (props.size() == 0) return null;
+ StringBuffer verStr = new StringBuffer("<html>");
+ for (KeyValuePair prop : props.getKeyValuePairs()) {
+ verStr.append("<b>").append(prop.getKey()).append(":</b> ").append(prop.getValue()).append("<br/>");
+ }
+ return verStr.append("</html>").toString();
}
@Override
public DefaultMutableTreeNode getTreeNode() {
return treeNode;
}
+
+
+
+ @Override
+ public void remove(String id) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void control(String control, String msg) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean isDependency() {
+ return thisCollection instanceof Dependency;
+ }
}
diff --git a/src/main/java/com/c2kernel/gui/tree/NodeItem.java b/src/main/java/com/c2kernel/gui/tree/NodeItem.java
index 5d1f618..18d35be 100644
--- a/src/main/java/com/c2kernel/gui/tree/NodeItem.java
+++ b/src/main/java/com/c2kernel/gui/tree/NodeItem.java
@@ -1,13 +1,20 @@
package com.c2kernel.gui.tree;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
+import com.c2kernel.collection.Aggregation;
+import com.c2kernel.collection.Collection;
+import com.c2kernel.collection.CollectionMember;
import com.c2kernel.entity.agent.Job;
import com.c2kernel.entity.proxy.ItemProxy;
import com.c2kernel.gui.EntityDetails;
@@ -22,16 +29,41 @@ import com.c2kernel.utils.Logger;
* @author $Author: abranson $
* @version $Version$
*/
-public class NodeItem extends NodeEntity {
+public class NodeItem extends NodeEntity implements Transferable {
+ public Collection<? extends CollectionMember> getParentCollection() {
+ return parentCollection;
+ }
+
+ public Integer getSlotNo() {
+ return slotNo;
+ }
+
+ Collection<? extends CollectionMember> parentCollection;
+ Integer slotNo = null;
+ static DataFlavor dataFlavor = new DataFlavor(NodeItem.class, "NodeItem");
+ ItemProxy parentItem;
+ static DataFlavor[] supportedFlavours = new DataFlavor[] {
+ dataFlavor,
+ new DataFlavor(Path.class, "Path"),
+ DataFlavor.getTextPlainUnicodeFlavor() };
+
+
public NodeItem(Path path, EntityTabManager desktop) {
super(path, desktop);
- try {
+ try {
makeExpandable();
} catch (Exception e) {
Logger.error(e);
}
+
}
+
+ public void setCollection(Collection<? extends CollectionMember> parentCollection, Integer slotNo, ItemProxy parentItem) {
+ this.parentCollection = parentCollection;
+ this.slotNo = slotNo;
+ this.parentItem = parentItem;
+ }
@Override
public void loadChildren() {
@@ -52,6 +84,25 @@ public class NodeItem extends NodeEntity {
public JPopupMenu getPopupMenu() {
JPopupMenu popup = super.getPopupMenu();
popup.addSeparator();
+ if (parentCollection != null && MainFrame.isAdmin) {
+ JMenuItem collMenuItem = new JMenuItem("Remove from collection");
+ //collMenuItem.setActionCommand("removeColl");
+ collMenuItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ String[] params = { parentCollection.getName(), String.valueOf(slotNo) };
+ String predefStepName = parentCollection instanceof Aggregation?"ClearSlot":"RemoveSlotFromCollection";
+ try {
+ MainFrame.userAgent.execute(parentItem, predefStepName, params);
+ } catch (Exception e1) {
+ MainFrame.exceptionDialog(e1);
+ }
+
+ }
+ });
+ popup.add(collMenuItem);
+ popup.addSeparator();
+ }
try {
ArrayList<Job> jobList = ((ItemProxy)myEntity).getJobList(MainFrame.userAgent);
ArrayList<String> already = new ArrayList<String>();
@@ -92,7 +143,7 @@ public class NodeItem extends NodeEntity {
thisDetail.runCommand("Execution", stepName);
}
- @Override
+ @Override
public ArrayList<String> getTabs() {
ArrayList<String> requiredTabs = super.getTabs();
@@ -109,4 +160,30 @@ public class NodeItem extends NodeEntity {
return requiredTabs;
}
+
+ @Override
+ public DataFlavor[] getTransferDataFlavors() {
+ return supportedFlavours;
+ }
+
+ @Override
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ for (DataFlavor flavour : supportedFlavours) {
+ if (flavour.equals(flavor))
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public Object getTransferData(DataFlavor flavor)
+ throws UnsupportedFlavorException, IOException {
+ if (flavor.equals(supportedFlavours[0]))
+ return this;
+ if (flavor.equals(supportedFlavours[1]))
+ return binding;
+ if (flavor.equals(supportedFlavours[2]))
+ return name;
+ throw new UnsupportedFlavorException(flavor);
+ }
}
diff --git a/src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java b/src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java
new file mode 100644
index 0000000..b9103af
--- /dev/null
+++ b/src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java
@@ -0,0 +1,71 @@
+package com.c2kernel.gui.tree;
+
+import java.awt.datatransfer.Transferable;
+
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.TransferHandler;
+
+import com.c2kernel.gui.ImageLoader;
+import com.c2kernel.gui.MainFrame;
+import com.c2kernel.gui.TreeBrowser;
+import com.c2kernel.utils.Logger;
+
+public class NodeTransferHandler extends TransferHandler {
+
+ TreeBrowser tree;
+
+ public NodeTransferHandler(TreeBrowser treeBrowser) {
+ tree = treeBrowser;
+ }
+
+ public int getSourceActions(JComponent c) {
+ return COPY_OR_MOVE;
+ }
+
+ public Transferable createTransferable(JComponent c) {
+ Node selNode = tree.getSelectedNode();
+ if (selNode instanceof Transferable)
+ return (Transferable)selNode;
+ else
+ return null;
+ }
+
+ @Override
+ public boolean importData(TransferSupport support) {
+ if (!canImport(support)) {
+ return false;
+ }
+ Node dropNode = tree.getNodeAt(support.getDropLocation().getDropPoint());
+ if (dropNode instanceof NodeCollection) {
+ NodeCollection collNode = (NodeCollection)dropNode;
+ NodeItem source;
+ try {
+ source = (NodeItem)support.getTransferable().getTransferData(NodeItem.dataFlavor);
+ return collNode.addMember(source.getSysKey());
+ } catch (Exception e) {
+ Logger.error(e);
+ return false;
+ }
+ }
+ return super.importData(support);
+ }
+
+ @Override
+ public boolean canImport(TransferSupport support) {
+ boolean isNode = support.isDataFlavorSupported(NodeItem.dataFlavor);
+ if (!isNode) return false;
+ Node dropNode = tree.getNodeAt(support.getDropLocation().getDropPoint());
+ if (MainFrame.isAdmin && dropNode instanceof NodeCollection && ((NodeCollection)dropNode).isDependency())
+ return true;
+ return false;
+
+ }
+
+ @Override
+ public Icon getVisualRepresentation(Transferable t) {
+ if (t instanceof NodeItem)
+ return (((NodeItem)t).getIcon());
+ return ImageLoader.nullImg;
+ }
+}