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/TreeBrowser.java | 54 ++++-- .../gui/graph/view/PropertyTableModel.java | 4 +- .../java/com/c2kernel/gui/tabs/CollectionPane.java | 3 +- .../java/com/c2kernel/gui/tabs/ExecutionPane.java | 2 +- .../collection/CollectionMemberPropertyPanel.java | 185 +++++++++++++++++++++ .../gui/tabs/collection/DependencyView.java | 48 +++++- 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 ++++++++ 10 files changed, 533 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java create mode 100644 src/main/java/com/c2kernel/gui/tree/NodeTransferHandler.java (limited to 'src') 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 sourceMap = new HashMap(); - ArrayList sortedNameList = new ArrayList(); + public HashMap sourceMap = new HashMap(); + public ArrayList sortedNameList = new ArrayList(); 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()); + 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 { - // 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 public void setCollection(Collection 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 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