package com.c2kernel.graph.view; 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 java.util.Observable; import java.util.Observer; 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 javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import com.c2kernel.graph.event.EntireModelChangedEvent; import com.c2kernel.graph.event.SelectionChangedEvent; import com.c2kernel.graph.model.DirectedEdge; import com.c2kernel.graph.model.GraphModelManager; import com.c2kernel.graph.model.GraphableEdge; import com.c2kernel.graph.model.GraphableVertex; import com.c2kernel.graph.model.Vertex; import com.c2kernel.gui.tabs.EntityTabPane; import com.c2kernel.utils.Language; import com.c2kernel.utils.Logger; /************************************************************************** * * $Revision: 1.4 $ * $Date: 2005/09/09 12:19:28 $ * * Copyright (C) 2003 CERN - European Organization for Nuclear Research * All rights reserved. **************************************************************************/ public class VertexPropertyPanel extends JPanel implements Observer, TableModelListener, ActionListener { private final PropertyTableModel mPropertyModel; private final PropertyTable mPropertyTable; private GraphModelManager mGraphModelManager; private boolean isEditable = false; GridBagLayout gridbag = new GridBagLayout(); protected JLabel selObjName; protected JLabel selObjClass; JButton addPropButton; JButton delPropButton; Box newPropBox; private JTextField newPropName; private JComboBox newPropType; String[] typeOptions = { "String", "Boolean", "Integer", "Float" }; String[] typeInitVal = { "", "false", "0", "0.0"}; SelectedVertexPanel mSelPanel; public VertexPropertyPanel() { super(); setLayout(gridbag); mPropertyModel = new PropertyTableModel(); mPropertyModel.addTableModelListener(this); mPropertyTable = new PropertyTable(mPropertyModel); } /** * */ @Override public void update(Observable o, Object arg) { Vertex[] selectedVertices = null; DirectedEdge selectedEdge = null; // If the selection has changed if (arg instanceof SelectionChangedEvent) { SelectionChangedEvent event = (SelectionChangedEvent) arg; selectedVertices = event.mSelection.mVertices; if (selectedVertices != null) { if (selectedVertices.length == 1) { setVertex(selectedVertices[0]); return; } } selectedEdge = event.mSelection.mEdge; if (selectedEdge != null) { setEdge(selectedEdge); return; } } if (arg instanceof SelectionChangedEvent || arg instanceof EntireModelChangedEvent){ clear(); } } @Override public void tableChanged(TableModelEvent e) { if (mGraphModelManager!=null) mGraphModelManager.forceNotify(); } public void setVertex(Vertex vert) { if (vert.getName().equals("domain")) selObjName.setText("Domain Workflow"); else selObjName.setText(vert.getName()); String className = vert.getClass().getName(); selObjClass.setText(className.substring(className.lastIndexOf('.')+1)); if (mSelPanel != null) mSelPanel.select(vert); if (vert instanceof GraphableVertex) { mPropertyModel.setMap(((GraphableVertex)vert).getProperties()); addPropButton.setEnabled(isEditable); delPropButton.setEnabled(isEditable); } } public void setEdge(DirectedEdge edge) { selObjName.setText(edge.getName()); String className = edge.getClass().getName(); selObjClass.setText(className.substring(className.lastIndexOf('.')+1)); if (edge instanceof GraphableEdge) { mPropertyModel.setMap(((GraphableEdge)edge).getProperties()); addPropButton.setEnabled(isEditable); delPropButton.setEnabled(isEditable); } if (mSelPanel != null) mSelPanel.clear(); } public void clear() { selObjName.setText(""); selObjClass.setText("Nothing Selected"); mPropertyModel.setMap(new HashMap()); if (mSelPanel != null) mSelPanel.clear(); 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); } public void setGraphModelManager(GraphModelManager manager) { mGraphModelManager = manager; manager.addObserver(this); } public void createLayout(SelectedVertexPanel selPanel) { 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; selObjName = new JLabel(); selObjName.setFont(EntityTabPane.titleFont); gridbag.setConstraints(selObjName, c); add(selObjName); c.gridy++; selObjClass = new JLabel(); gridbag.setConstraints(selObjClass, c); add(selObjClass); 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); if (selPanel != null) { c.gridy++; mSelPanel = selPanel; gridbag.setConstraints(mSelPanel, c); add(mSelPanel); } } @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) { Logger.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)); } } }