summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2012-08-03 14:03:59 +0200
committerAndrew Branson <andrew.branson@cern.ch>2012-08-03 14:03:59 +0200
commite4ccc012a781d794c06b8d3fd27e0a1f532b3fe7 (patch)
tree7f96e165b1583b75c39221ee59d15e2d3f160650
parent8c272e0261686302e86849ad86ae8fa393d9e95e (diff)
Menu item on collection members in the tree to remove them.
Drag items onto dependencies to add them. Dependency view Logging cleanup Fixes #42
-rw-r--r--src/main/java/com/c2kernel/gui/TreeBrowser.java54
-rw-r--r--src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java4
-rw-r--r--src/main/java/com/c2kernel/gui/tabs/CollectionPane.java3
-rw-r--r--src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java2
-rw-r--r--src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java185
-rw-r--r--src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java48
-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
10 files changed, 533 insertions, 50 deletions
diff --git a/src/main/java/com/c2kernel/gui/TreeBrowser.java b/src/main/java/com/c2kernel/gui/TreeBrowser.java
index bcafe00..5a5d3ff 100644
--- a/src/main/java/com/c2kernel/gui/TreeBrowser.java
+++ b/src/main/java/com/c2kernel/gui/TreeBrowser.java
@@ -2,9 +2,11 @@ package com.c2kernel.gui;
import java.awt.Component;
import java.awt.Dimension;
+import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import javax.swing.DropMode;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
@@ -21,6 +23,7 @@ import javax.swing.tree.TreeSelectionModel;
import com.c2kernel.gui.tree.Node;
import com.c2kernel.gui.tree.NodeEntity;
+import com.c2kernel.gui.tree.NodeTransferHandler;
import com.c2kernel.lookup.DomainPath;
import com.c2kernel.utils.Logger;
@@ -74,6 +77,9 @@ public class TreeBrowser extends JPanel implements DomainKeyConsumer
ToolTipManager.sharedInstance().registerComponent(tree);
tree.setCellRenderer(new ItemRenderer());
tree.addMouseListener(new TreeMouseListener());
+ tree.setDragEnabled(true);
+ tree.setDropMode(DropMode.ON);
+ tree.setTransferHandler(new NodeTransferHandler(this));
JScrollPane myScrollPane = new JScrollPane(tree);
this.add(myScrollPane);
DefaultMutableTreeNode loadNode = (DefaultMutableTreeNode)userRoot.getTreeNode().getFirstChild();
@@ -84,7 +90,6 @@ public class TreeBrowser extends JPanel implements DomainKeyConsumer
@Override
public void push(DomainPath target) {
- Logger.debug("Opening tree node "+target);
String[] components = target.getPath();
Node currentNode = userRoot;
Object[] treePath = new Object[components.length+1];
@@ -122,13 +127,40 @@ public class TreeBrowser extends JPanel implements DomainKeyConsumer
}
}
- @Override
+ public JTree getTree() {
+ return tree;
+ }
+
+ @Override
public void push(String name) {
// only interested in real paths
JOptionPane.showMessageDialog(null, "'"+name+"' was not found.",
"No results", JOptionPane.INFORMATION_MESSAGE);
}
+
+ public Node getSelectedNode() {
+ Object selObj = tree.getLastSelectedPathComponent();
+ if (selObj != null)
+ try {
+ DefaultMutableTreeNode nodeClicked = (DefaultMutableTreeNode)selObj;
+ Object userObject = nodeClicked.getUserObject();
+ if (userObject instanceof Node) return (Node)userObject;
+ } catch (Exception ex) { } // Not a node that was clicked on
+ return null;
+ }
+
+ public Node getNodeAt(Point p) {
+ TreePath selPath = tree.getPathForLocation(p.x, p.y);
+ if (selPath != null)
+ try {
+ DefaultMutableTreeNode nodeClicked = (DefaultMutableTreeNode)selPath.getLastPathComponent();
+ Object userObject = nodeClicked.getUserObject();
+ if (userObject instanceof Node) return (Node)userObject;
+ }
+ catch (Exception ex) { } // Not a node that was clicked on
+ return null;
+ }
private static void dumpPath(TreePath selPath, int logLevel) {
if (selPath == null) { Logger.msg(logLevel, "TreeBrowser.dumpPath() - selPath null"); return; }
@@ -148,7 +180,7 @@ public class TreeBrowser extends JPanel implements DomainKeyConsumer
if (thisLeaf instanceof Node) {
Node thisNode = (Node)thisLeaf;
if (thisNode.getIcon() !=null) setIcon(thisNode.getIcon());
- setToolTipText(thisNode.getType());
+ setToolTipText(thisNode.getToolTip());
}
else if (thisLeaf instanceof DynamicTreeBuilder) {
DynamicTreeBuilder thisLoader = (DynamicTreeBuilder)thisLeaf;
@@ -167,7 +199,7 @@ public class TreeBrowser extends JPanel implements DomainKeyConsumer
if (e.isPopupTrigger())
showPopup(e);
else {
- Object source = getNodeAt(e);
+ Object source = getNodeAt(e.getPoint());
if (source == null) return;
if (e.getClickCount() == 2) {
if (source instanceof NodeEntity) {
@@ -190,24 +222,12 @@ public class TreeBrowser extends JPanel implements DomainKeyConsumer
}
}
private void showPopup(MouseEvent e) {
- Object source = getNodeAt(e);
+ Object source = getNodeAt(e.getPoint());
if (source == null) return;
if (source instanceof Node) {
Node thisNode = (Node)source;
thisNode.getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
}
}
- private Object getNodeAt(MouseEvent e) {
- Object source = null;
- TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
- if (selPath != null)
- try {
- DefaultMutableTreeNode nodeClicked = (DefaultMutableTreeNode)selPath.getLastPathComponent();
- source = nodeClicked.getUserObject(); // fetch its nodeItem
- }
- catch (Exception ex) { } // Not a node that was clicked on
-
- return source;
- }
}
}
diff --git a/src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java b/src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java
index ce408e8..a339f8d 100644
--- a/src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java
+++ b/src/main/java/com/c2kernel/gui/graph/view/PropertyTableModel.java
@@ -23,8 +23,8 @@ import com.c2kernel.utils.Language;
public class PropertyTableModel extends AbstractTableModel {
private final String[] mColumnNames = { Language.translate("Name"), Language.translate("Value") };
- HashMap<String, Object> sourceMap = new HashMap<String, Object>();
- ArrayList<String> sortedNameList = new ArrayList<String>();
+ public HashMap<String, Object> sourceMap = new HashMap<String, Object>();
+ public ArrayList<String> sortedNameList = new ArrayList<String>();
boolean isEditable = false;
public PropertyTableModel() {
diff --git a/src/main/java/com/c2kernel/gui/tabs/CollectionPane.java b/src/main/java/com/c2kernel/gui/tabs/CollectionPane.java
index 4d9092e..52af795 100644
--- a/src/main/java/com/c2kernel/gui/tabs/CollectionPane.java
+++ b/src/main/java/com/c2kernel/gui/tabs/CollectionPane.java
@@ -39,11 +39,13 @@ public class CollectionPane extends EntityTabPane implements EntityProxyObserver
if (thisCollView == null){
if (contents instanceof Aggregation) {
AggregationView thisAggView = new AggregationView();
+ thisAggView.setItem((ItemProxy)sourceEntity.getEntity());
thisAggView.setCollection((Aggregation)contents);
thisCollView = thisAggView;
}
else if (contents instanceof Dependency) {
DependencyView thisDepView = new DependencyView();
+ thisDepView.setItem((ItemProxy)sourceEntity.getEntity());
thisDepView.setCollection((Dependency)contents);
thisCollView = thisDepView;
}
@@ -52,7 +54,6 @@ public class CollectionPane extends EntityTabPane implements EntityProxyObserver
return;
}
Logger.msg(3, "Adding new "+thisCollView.getClass().getName());
- thisCollView.setItem((ItemProxy)sourceEntity.getEntity());
collTabs.add(contents.getName(), thisCollView);
}
}
diff --git a/src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java b/src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java
index a5df52c..9d9a395 100644
--- a/src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java
+++ b/src/main/java/com/c2kernel/gui/tabs/ExecutionPane.java
@@ -97,7 +97,7 @@ public class ExecutionPane extends EntityTabPane implements EntityProxyObserver<
}
}
} catch (Exception e) {
- Logger.debug("Error fetching joblist");
+ Logger.error("Error fetching joblist");
Logger.error(e);
}
diff --git a/src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java b/src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java
new file mode 100644
index 0000000..ea649f9
--- /dev/null
+++ b/src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java
@@ -0,0 +1,185 @@
+package com.c2kernel.gui.tabs.collection;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+
+import com.c2kernel.collection.CollectionMember;
+import com.c2kernel.common.ObjectNotFoundException;
+import com.c2kernel.gui.MainFrame;
+import com.c2kernel.gui.graph.view.PropertyTable;
+import com.c2kernel.gui.graph.view.PropertyTableModel;
+import com.c2kernel.gui.graph.view.SelectedVertexPanel;
+import com.c2kernel.gui.tabs.EntityTabPane;
+import com.c2kernel.lookup.EntityPath;
+import com.c2kernel.lookup.InvalidEntityPathException;
+import com.c2kernel.process.Gateway;
+import com.c2kernel.utils.Language;
+
+public class CollectionMemberPropertyPanel extends JPanel implements ActionListener {
+
+ private final PropertyTableModel mPropertyModel;
+ private final PropertyTable mPropertyTable;
+ private boolean isEditable = false;
+ CollectionMember selectedCollMem;
+ GridBagLayout gridbag = new GridBagLayout();
+ protected JLabel selObjSlot;
+ protected JLabel selObjMember;
+ JButton addPropButton;
+ JButton delPropButton;
+ Box newPropBox;
+ private JTextField newPropName;
+ private JComboBox newPropType;
+ String[] typeOptions = { "String", "Boolean", "Integer", "Float" };
+ String[] typeInitVal = { "", "false", "0", "0.0"};
+
+ public CollectionMemberPropertyPanel() {
+ super();
+ setLayout(gridbag);
+ mPropertyModel = new PropertyTableModel();
+ mPropertyTable = new PropertyTable(mPropertyModel);
+ createLayout();
+ }
+
+ public void setMember(CollectionMember cm) {
+ selectedCollMem = cm;
+ String newMemberName;
+ try {
+ EntityPath path = new EntityPath(cm.getEntityKey());
+ newMemberName = Gateway.getProxyManager().getProxy(path).getProperty("Name");
+ } catch (ObjectNotFoundException e) {
+ newMemberName = "Item or Item name property not found";
+ } catch (InvalidEntityPathException e) {
+ newMemberName = "No member";
+ }
+
+ selObjSlot.setText(newMemberName);
+ selObjMember.setText("Slot "+cm.getID());
+ mPropertyModel.setMap(cm.getProperties());
+ addPropButton.setEnabled(isEditable);
+ delPropButton.setEnabled(isEditable);
+ }
+
+ public void createLayout()
+ {
+ GridBagConstraints c = new GridBagConstraints();
+ c.gridx = 0;
+ c.gridy = 0;
+ c.weightx = 1;
+ c.weighty = 0;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.ipadx = 5;
+ c.ipady = 5;
+
+ selObjSlot = new JLabel();
+ selObjSlot.setFont(EntityTabPane.titleFont);
+ gridbag.setConstraints(selObjSlot, c);
+ add(selObjSlot);
+
+ c.gridy++;
+ selObjMember = new JLabel();
+ gridbag.setConstraints(selObjMember, c);
+ add(selObjMember);
+
+ c.gridy++;
+ JLabel title = new JLabel("Properties");
+ title.setFont(EntityTabPane.titleFont);
+ gridbag.setConstraints(title, c);
+ add(title);
+
+ c.gridy++;
+ c.fill = GridBagConstraints.BOTH;
+ c.weighty = 2;
+ JScrollPane scroll = new JScrollPane(mPropertyTable);
+ gridbag.setConstraints(scroll, c);
+ add(scroll);
+
+ newPropBox = Box.createHorizontalBox();
+ newPropBox.add(new JLabel(Language.translate("New :")));
+ newPropBox.add(Box.createHorizontalGlue());
+ newPropName = new JTextField(15);
+ newPropBox.add(newPropName);
+ newPropType = new JComboBox(typeOptions);
+ newPropBox.add(newPropType);
+ newPropBox.add(Box.createHorizontalStrut(1));
+ addPropButton = new JButton("Add");
+ addPropButton.setMargin(new Insets(0, 0, 0, 0));
+ delPropButton = new JButton("Del");
+ delPropButton.setMargin(new Insets(0, 0, 0, 0));
+ addPropButton.addActionListener(this);
+ delPropButton.addActionListener(this);
+ newPropBox.add(addPropButton);
+ newPropBox.add(delPropButton);
+
+ c.gridy++;
+ c.weighty=0;
+ c.fill= GridBagConstraints.HORIZONTAL;
+ gridbag.setConstraints(newPropBox, c);
+ add(newPropBox);
+ }
+
+ public void clear() {
+ selObjSlot.setText("");
+ selObjMember.setText("Nothing Selected");
+ mPropertyModel.setMap(new HashMap<String, Object>());
+ addPropButton.setEnabled(false);
+ delPropButton.setEnabled(false);
+ }
+
+ /**
+ * @param isEditable The isEditable to set.
+ */
+ public void setEditable(boolean editable) {
+ mPropertyModel.setEditable(editable);
+ isEditable = editable;
+ newPropBox.setVisible(editable);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (e.getSource() == addPropButton) {
+ if (newPropName.getText().length() < 1) {
+ JOptionPane.showMessageDialog(this, "Enter a name for the new property", "Cannot add property", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ if (mPropertyModel.sourceMap.containsKey(newPropName.getText())) {
+ JOptionPane.showMessageDialog(this, "Property '"+newPropName.getText()+"' already exists.", "Cannot add property", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ if (mPropertyTable.getCellEditor() != null)
+ mPropertyTable.getCellEditor().stopCellEditing();
+
+ try {
+ Class<?> newPropClass = Class.forName("java.lang."+typeOptions[newPropType.getSelectedIndex()]);
+ Class<?>[] params = {String.class};
+ Constructor<?> init = newPropClass.getConstructor(params);
+ Object[] initParams = { typeInitVal[newPropType.getSelectedIndex()] };
+ mPropertyModel.addProperty(newPropName.getText(), init.newInstance(initParams));
+ } catch (Exception ex) {
+ MainFrame.exceptionDialog(ex);
+ }
+ }
+ else if (e.getSource() == delPropButton) {
+ int selrow = mPropertyTable.getSelectedRow();
+ if (selrow == -1) {
+ JOptionPane.showMessageDialog(this, "Select a property to remove", "Cannot delete property", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ mPropertyModel.delProperty(mPropertyModel.sortedNameList.get(selrow));
+ }
+ }
+
+}
diff --git a/src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java b/src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java
index e068bdc..cd46a3d 100644
--- a/src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java
+++ b/src/main/java/com/c2kernel/gui/tabs/collection/DependencyView.java
@@ -1,22 +1,32 @@
package com.c2kernel.gui.tabs.collection;
import java.awt.GridLayout;
-import javax.swing.JLabel;
+import javax.swing.JSplitPane;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.DefaultMutableTreeNode;
import com.c2kernel.collection.Collection;
import com.c2kernel.collection.DependencyMember;
+import com.c2kernel.common.ObjectNotFoundException;
+import com.c2kernel.gui.TreeBrowser;
+import com.c2kernel.gui.tree.Node;
+import com.c2kernel.gui.tree.NodeCollection;
+import com.c2kernel.gui.tree.NodeItem;
/**
* @version $Revision: 1.2 $ $Date: 2005/06/02 12:17:22 $
* @author $Author: abranson $
*/
public class DependencyView extends CollectionView<DependencyMember>
{
- // Objects to view/modify the properties of the selected activity
-
+ TreeBrowser tree;
+ CollectionMemberPropertyPanel propPanel;
+ JSplitPane split;
+
public DependencyView()
{
super();
- setLayout(new GridLayout(1,1));
+ setLayout(new GridLayout(1, 1));
createLayout();
}
@@ -24,11 +34,37 @@ public class DependencyView extends CollectionView<DependencyMember>
public void setCollection(Collection<DependencyMember> contents)
{
thisColl = contents;
+ NodeCollection collNode = new NodeCollection(item, thisColl.getName(), null);
+ tree = new TreeBrowser(null, collNode);
+ tree.getTree().addTreeSelectionListener(new TreeSelectionListener() {
+ public void valueChanged(TreeSelectionEvent e) {
+ if (e.getPath() == null) {
+ propPanel.clear();
+ }
+ else {
+ Node selectedNode = (Node)((DefaultMutableTreeNode)e.getPath().getLastPathComponent()).getUserObject();
+ if (selectedNode instanceof NodeItem) {
+ NodeItem thisItem = (NodeItem)selectedNode;
+ if (thisItem.getParentCollection() != null) {
+ try {
+ propPanel.setMember(thisItem.getParentCollection().getMember(thisItem.getSlotNo()));
+ return;
+ } catch (ObjectNotFoundException e1) { }
+ }
+ propPanel.clear();
+ }
+ }
+ }
+ });
+ split.setLeftComponent(tree);
}
public void createLayout()
{
- // TODO: design a nice dependency view, with property viewing and modification
- add(new JLabel("Dependency view not yet implemented. Please browse the tree instead."));
+ propPanel = new CollectionMemberPropertyPanel();
+ split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
+ split.setRightComponent(propPanel);
+ add(split);
+
}
}
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;
+ }
+}