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 --- .../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 +++++- 4 files changed, 230 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/c2kernel/gui/tabs/collection/CollectionMemberPropertyPanel.java (limited to 'src/main/java/com/c2kernel/gui/tabs') 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); + } } -- cgit v1.2.3