From e4ccc012a781d794c06b8d3fd27e0a1f532b3fe7 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Fri, 3 Aug 2012 14:03:59 +0200 Subject: Menu item on collection members in the tree to remove them. Drag items onto dependencies to add them. Dependency view Logging cleanup Fixes #42 --- src/main/java/com/c2kernel/gui/tree/Node.java | 13 ++- .../java/com/c2kernel/gui/tree/NodeCollection.java | 120 +++++++++++++++++---- src/main/java/com/c2kernel/gui/tree/NodeItem.java | 83 +++++++++++++- .../com/c2kernel/gui/tree/NodeTransferHandler.java | 71 ++++++++++++ 4 files changed, 264 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java (limited to 'src/main/java/com/c2kernel/gui/tree') 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 childNodes = new HashMap(); @@ -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> { ItemProxy parent; - Parent2ChildCollection thisCollection; + Collection 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 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)parent.getObject("Collection/"+name); + if (thisCollection == null) { + Collection initColl = (Collection)parent.getObject(ClusterStorage.COLLECTION+"/"+name); + add(initColl); + } + parent.subscribe(new MemberSubscription>(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 collectionMembers = thisCollection.getMembers().list; - for (int i=0; i contents) { + if (!contents.getName().equals(name)) return; + this.type = contents.getClass().getSimpleName(); + ArrayList newMembers = contents.getMembers().list; + ArrayList oldMembers; + if (thisCollection == null) + oldMembers = new ArrayList(); + else + oldMembers = thisCollection.getMembers().list; + + ArrayList currentPaths = new ArrayList(); + // 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(""); + for (KeyValuePair prop : props.getKeyValuePairs()) { + verStr.append("").append(prop.getKey()).append(": ").append(prop.getValue()).append("
"); + } + return verStr.append("").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 getParentCollection() { + return parentCollection; + } + + public Integer getSlotNo() { + return slotNo; + } + + Collection 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 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 jobList = ((ItemProxy)myEntity).getJobList(MainFrame.userAgent); ArrayList already = new ArrayList(); @@ -92,7 +143,7 @@ public class NodeItem extends NodeEntity { thisDetail.runCommand("Execution", stepName); } - @Override + @Override public ArrayList getTabs() { ArrayList 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; + } +} -- cgit v1.2.3