/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: Attributes.java * * Copyright (c) 2003 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.tool.user.dialogs; import com.sun.electric.Main; import com.sun.electric.database.change.DatabaseChangeEvent; import com.sun.electric.database.change.DatabaseChangeListener; import com.sun.electric.database.hierarchy.Cell; import com.sun.electric.database.hierarchy.Export; import com.sun.electric.database.hierarchy.Cell.CellGroup; import com.sun.electric.database.text.TextUtils; import com.sun.electric.database.topology.ArcInst; import com.sun.electric.database.topology.NodeInst; import com.sun.electric.database.topology.PortInst; import com.sun.electric.database.variable.ElectricObject; import com.sun.electric.database.variable.TextDescriptor; import com.sun.electric.database.variable.VarContext; import com.sun.electric.database.variable.Variable; import com.sun.electric.tool.Job; import com.sun.electric.tool.JobException; import com.sun.electric.tool.user.CircuitChangeJobs; import com.sun.electric.tool.user.Highlight; import com.sun.electric.tool.user.HighlightListener; import com.sun.electric.tool.user.Highlighter; import com.sun.electric.tool.user.User; import com.sun.electric.tool.user.UserInterfaceMain; import com.sun.electric.tool.user.ui.EditWindow; import com.sun.electric.tool.user.ui.WindowFrame; import java.awt.Component; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JRadioButton; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; /** * Class to handle the "Attributes" dialog. */ public class Attributes extends EModelessDialog implements HighlightListener, DatabaseChangeListener { private static final long serialVersionUID = 1L; private static Attributes theDialog = null; private DefaultListModel listModel; private JList list; private ElectricObject selectedObject; private Cell selectedCell; private NodeInst selectedNode; private ArcInst selectedArc; private Export selectedExport; private PortInst selectedPort; private Variable.Key selectedVarKey; private JRadioButton currentButton; private String initialName; private String initialValue; private boolean showParamsOnly = !Job.getDebug(); private TextAttributesPanel attrPanel; private TextInfoPanel textPanel; private VariableCellRenderer cellRenderer; private boolean loading = false; /** * Method to show the Attributes dialog. */ public static void showDialog() { if (theDialog == null) { JFrame jf = null; jf = (JFrame) Main.getCurrentJFrame(); theDialog = new Attributes(jf); } theDialog.loadAttributesInfo(false); if (!theDialog.isVisible()) { theDialog.pack(); theDialog.ensureProperSize(); theDialog.setVisible(true); } theDialog.toFront(); } /** * Reloads the dialog when Highlights change */ public void highlightChanged(Highlighter which) { if (!isVisible()) return; loadAttributesInfo(false); } /** * Called when by a Highlighter when it loses focus. The argument * is the Highlighter that has gained focus (may be null). * @param highlighterGainedFocus the highlighter for the current window (may be null). */ public void highlighterLostFocus(Highlighter highlighterGainedFocus) { if (!isVisible()) return; loadAttributesInfo(false); } /** * Reload if the database has changed in a way we care about * @param e database change event */ public void databaseChanged(DatabaseChangeEvent e) { if (!isVisible()) return; // update dialog if (e.objectChanged(selectedObject)) { loadAttributesInfo(true); } } /** * Creates new form Attributes. */ private Attributes(Frame parent) { super(parent, false); initComponents(); if (showParamsOnly) { getContentPane().remove(debugSelect); mainLabel.setText("Parameters:"); setTitle("Edit Parameters"); pack(); } else { mainLabel.setText("Parameters and Variables (Debug Mode):"); setTitle("Edit Parameters and Variables"); } UserInterfaceMain.addDatabaseChangeListener(this); Highlighter.addHighlightListener(this); // make the list listModel = new DefaultListModel(); list = new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); cellRenderer = new VariableCellRenderer(); list.setCellRenderer(cellRenderer); listPane.setViewportView(list); list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { listClick(); } }); // have the radio buttons at the top reevaluate currentCell.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { objectSelectorActionPerformed(evt); } }); currentNode.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { objectSelectorActionPerformed(evt); } }); currentArc.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { objectSelectorActionPerformed(evt); } }); currentExport.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { objectSelectorActionPerformed(evt); } }); currentPort.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { objectSelectorActionPerformed(evt); } }); currentPort.setEnabled(false); java.awt.GridBagConstraints gridBagConstraints; attrPanel = new TextAttributesPanel(true); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; getContentPane().add(attrPanel, gridBagConstraints); textPanel = new TextInfoPanel(true, showParamsOnly); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; getContentPane().add(textPanel, gridBagConstraints); pack(); loadAttributesInfo(false); name.getDocument().addDocumentListener(new TextInfoDocumentListener(this)); value.getDocument().addDocumentListener(new TextInfoDocumentListener(this)); finishInitialization(); } protected void escapePressed() { done(null); } /** * Class to handle special changes to changes to a Attributes edit fields. */ private static class TextInfoDocumentListener implements DocumentListener { Attributes dialog; TextInfoDocumentListener(Attributes dialog) { this.dialog = dialog; } public void changedUpdate(DocumentEvent e) { dialog.fieldChanged(); } public void insertUpdate(DocumentEvent e) { dialog.fieldChanged(); } public void removeUpdate(DocumentEvent e) { dialog.fieldChanged(); } } private void fieldChanged() { if (loading) return; Variable var = getSelectedVariable(); if (var == null) return; // see if value changed String varValue = value.getText().trim(); if (!varValue.equals(initialValue)) { // generate Job to update value new ChangeAttribute(var.getKey(), selectedObject, getVariableObject(varValue)); initialValue = varValue; } } /** * Method called when the user clicks on one of the top radio buttons. * Changes the object being examined for attributes. */ private void objectSelectorActionPerformed(ActionEvent evt) { currentButton = (JRadioButton)evt.getSource(); if (currentButton == currentCell) selectedObject = selectedCell; else if (currentButton == currentNode) selectedObject = selectedNode; else if (currentButton == currentArc) selectedObject = selectedArc; else if (currentButton == currentExport) selectedObject = selectedExport; else if (currentButton == currentPort) selectedObject = selectedPort; updateList(); checkName(); } /** * Method called when the user clicks in the list of attribute names. */ private void listClick() { showSelectedAttribute(null); } /** * Method to reload the entire dialog from the current highlighting. */ private void loadAttributesInfo(boolean keepObj) { loading = true; if (!keepObj) { // determine what attributes can be set selectedObject = null; selectedCell = null; selectedNode = null; selectedArc = null; selectedExport = null; selectedPort = null; selectedVarKey = null; currentButton = currentCell; // update current window EditWindow curWnd = EditWindow.getCurrent(); selectedCell = WindowFrame.needCurCell(); selectedObject = selectedCell; if (curWnd == null) selectedCell = null; if (selectedCell != null) { if (showParamsOnly) { if (!selectedCell.isIcon() && !selectedCell.isSchematic()) { selectedCell = null; } else { mainLabel.setText("Parameters on " + selectedCell.getName() + ":"); } } else if (curWnd.getHighlighter().getNumHighlights() == 1) { Highlight high = curWnd.getHighlighter().getHighlights().iterator().next(); ElectricObject eobj = high.getElectricObject(); if (high.isHighlightEOBJ()) { if (eobj instanceof ArcInst) { selectedArc = (ArcInst)eobj; selectedObject = selectedArc; currentButton = currentArc; } else if (eobj instanceof NodeInst) { selectedNode = (NodeInst)eobj; selectedObject = selectedNode; currentButton = currentNode; } else if (eobj instanceof PortInst) { PortInst pi = (PortInst)eobj; selectedNode = pi.getNodeInst(); selectedObject = selectedNode; currentButton = currentNode; selectedPort = pi; } } else if (high.isHighlightText()) { selectedVarKey = high.getVarKey(); if (selectedVarKey != null) { if (eobj instanceof NodeInst) { selectedNode = (NodeInst)eobj; selectedObject = selectedNode; currentButton = currentNode; } else if (eobj instanceof ArcInst) { selectedArc = (ArcInst)eobj; selectedObject = selectedArc; currentButton = currentArc; } else if (eobj instanceof PortInst) { selectedPort = (PortInst)eobj; selectedObject = selectedPort; currentButton = currentPort; selectedNode = selectedPort.getNodeInst(); } else if (eobj instanceof Export) { selectedExport = (Export)eobj; selectedObject = selectedExport; currentButton = currentExport; } } else if (high.getVarKey() == NodeInst.NODE_NAME || high.getVarKey() == NodeInst.NODE_PROTO) { // node name selectedNode = (NodeInst)eobj; selectedObject = selectedNode; currentButton = currentNode; } else if (high.getVarKey() == ArcInst.ARC_NAME) { // arc name selectedArc = (ArcInst)eobj; selectedObject = selectedArc; currentButton = currentArc; } else if (high.getVarKey() == Export.EXPORT_NAME) { selectedExport = (Export)eobj; selectedObject = selectedExport; currentButton = currentExport; } } } } } // show initial values in the dialog if (selectedCell == null) { // nothing can be done: dim the entire dialog currentCell.setEnabled(false); cellName.setText("NO CURRENT CELL"); currentNode.setEnabled(false); currentArc.setEnabled(false); currentExport.setEnabled(false); currentPort.setEnabled(false); list.clearSelection(); listModel.clear(); name.setText(""); name.setEditable(false); value.setText(""); value.setEditable(false); evaluation.setText(""); deleteButton.setEnabled(false); newButton.setEnabled(false); renameButton.setEnabled(false); textPanel.setTextDescriptor(null, null); attrPanel.setVariable(null, null); loading = false; return; } // enable the dialog currentCell.setEnabled(true); currentNode.setEnabled(selectedNode != null); currentArc.setEnabled(selectedArc != null); currentExport.setEnabled(selectedExport != null); currentPort.setEnabled(selectedPort != null); currentButton.setSelected(true); cellName.setText(selectedCell.describe(false)); name.setEditable(true); value.setEditable(true); // show all attributes on the selected object updateList(); if (selectedVarKey != null) showSelectedAttribute(selectedVarKey); else checkName(); loading = false; } private void checkName() { // if name does not equal name of selected var, disable update button String varName = name.getText().trim(); // can't create new variable of empty, no vars can be empty text if (varName.equals("")) { newButton.setEnabled(false); deleteButton.setEnabled(false); renameButton.setEnabled(false); textPanel.setTextDescriptor(null, null); attrPanel.setVariable(null, null); return; } if (showParamsOnly) varName = "ATTR_" + varName; // try to find variable Variable.Key varKey = Variable.newKey(varName); if (selectedObject.getParameterOrVariable(varKey) != null) { // make sure var is selected if (varKey != null) list.setSelectedValue(varKey, true); } else { // no such var, remove selection and enable new buttons newButton.setEnabled(true); renameButton.setEnabled(false); deleteButton.setEnabled(false); list.clearSelection(); textPanel.setTextDescriptor(varKey, selectedObject); attrPanel.setVariable(varKey, selectedObject); } } /** * Updates List of attributes on selected object */ private void updateList() { list.clearSelection(); listModel.clear(); // show the parameters Set<Variable.Key> seen = new HashSet<Variable.Key>(); Iterator<Variable> it = null; if (selectedObject instanceof Cell) { Cell cell = (Cell)selectedObject; it = cell.getParameters(); } if (selectedObject instanceof NodeInst) { NodeInst ni = (NodeInst)selectedObject; it = ni.getParameters(); } if (it != null) { List<Variable.Key> params = new ArrayList<Variable.Key>(); for( ; it.hasNext(); ) { Variable var = it.next(); params.add(var.getKey()); } if (params.size() > 0) { if (!showParamsOnly) listModel.addElement("------------ PARAMETERS ------------"); for(Variable.Key key : params) { listModel.addElement(key); seen.add(key); } } } // show variables if requested if (!showParamsOnly) { List<Variable.Key> variables = new ArrayList<Variable.Key>(); for(Iterator<Variable> vIt = selectedObject.getVariables(); vIt.hasNext(); ) { Variable var = vIt.next(); if (seen.contains(var.getKey())) continue; variables.add(var.getKey()); } if (variables.size() > 0) { listModel.addElement("------------ VARIABLES ------------"); for(Variable.Key key : variables) listModel.addElement(key); } } } /** * Method to return the Variable that is selected in the dialog. * @return the Variable that is selected. Returns null if none are. */ Variable getSelectedVariable() { int i = list.getSelectedIndex(); if (i < 0) return null; Object selectedObj = list.getSelectedValue(); if (selectedObj instanceof Variable.Key) { Variable.Key key = (Variable.Key)selectedObj; return selectedObject.getParameterOrVariable(key); } return null; } /** * Method to convert a string to a proper Object for storage in a Variable. * Currently knows only Integer, Double, and String. * @param text the text describing the Variable's value. * @return an Object that contains the value. */ private Object getVariableObject(String text) { if (TextUtils.isANumber(text)) { int i = TextUtils.atoi(text); double d = TextUtils.atof(text); if (i == d) return new Integer(i); return new Double(d); } return text; } /** * Method to display the aspects of the currently selected Variable in the dialog. * @param selectThisKey if non-null, select this variable first, and then update dialog. */ void showSelectedAttribute(Variable.Key selectThisKey) { if (selectThisKey != null) list.setSelectedValue(selectThisKey, true); Variable var = getSelectedVariable(); if (var == null) { renameButton.setEnabled(false); deleteButton.setEnabled(false); return; } selectedVarKey = var.getKey(); // set the Name field boolean oldLoading = loading; loading = true; initialName = getVariableText(var.getKey()); String pt = initialName; name.setText(pt); // get initial the Value field initialValue = var.getPureValue(-1); // set the Value field String oldValue = value.getText(); if (!oldValue.equals(initialValue)) value.setText(initialValue); if (var.getObject() instanceof Object []) { value.setEditable(false); } else { value.setEditable(true); } loading = oldLoading; // set the evaluation field if (var.isCode()) { Object eval = VarContext.globalContext.evalVar(var); if (eval == null) evaluation.setText(""); else evaluation.setText(eval.toString()); } else { evaluation.setText(""); } // set the text info panel if (var.isDisplay()) textPanel.setTextDescriptor(var.getKey(), selectedObject); else textPanel.setTextDescriptor(null, null); attrPanel.setVariable(var.getKey(), selectedObject); // enable buttons newButton.setEnabled(false); renameButton.setEnabled(true); deleteButton.setEnabled(true); } /** * Class to delete an attribute in a new thread. */ private static class DeleteAttribute extends Job { private static final long serialVersionUID = 1L; private Variable var; private ElectricObject owner; private DeleteAttribute(Variable var, ElectricObject owner) { super("Delete Attribute", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER); this.var = var; this.owner = owner; startJob(); } public boolean doIt() throws JobException { if (var == null) return false; Variable.Key varKey = var.getKey(); if (owner.isParam(varKey)) { if (owner instanceof Cell) ((Cell)owner).getCellGroup().delParam((Variable.AttrKey)varKey); else if (owner instanceof NodeInst) ((NodeInst)owner).delParameter(varKey); } else { owner.delVar(varKey); } return true; } } private static class CreateAttribute extends Job { private static final long serialVersionUID = 1L; private ElectricObject owner; private Variable newVar; private boolean addToInstances; private transient Attributes dialog; private CreateAttribute(String newName, Object newValue, ElectricObject owner, Attributes dialog, boolean addToInstances, TextDescriptor useThis) { super("Create Attribute", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER); this.owner = owner; this.dialog = dialog; this.addToInstances = addToInstances; // determine textdescriptor for the variable TextDescriptor td = useThis; if (useThis == null) { if (owner instanceof Cell) { td = TextDescriptor.getCellTextDescriptor().withParam(true).withInherit(true); } else if (owner instanceof NodeInst) { td = TextDescriptor.getNodeTextDescriptor(); } else if (owner instanceof ArcInst) { td = TextDescriptor.getArcTextDescriptor(); } else if (owner instanceof Export) { td = TextDescriptor.getExportTextDescriptor(); } else if (owner instanceof PortInst) { td = TextDescriptor.getPortInstTextDescriptor(); } else return; // add in specified factors td = dialog.attrPanel.withPanelValues(td); td = dialog.textPanel.withPanelValues(td); if (owner instanceof Cell) { // find nonconflicting location of this cell attribute Point2D offset = ((Cell)owner).newVarOffset(); td = td.withOff(offset.getX(), offset.getY()); } } newValue = dialog.attrPanel.withPanelCode(newValue); newVar = Variable.newInstance(Variable.newKey(newName), newValue, td); startJob(); } public boolean doIt() throws JobException { // check if var of this name already exists on object if (owner.getParameterOrVariable(newVar.getKey()) != null) throw new JobException("Can't create new attribute "+newVar+", already exists"); if (owner instanceof Cell && newVar.getTextDescriptor().isParam()) { // create the parameter CellGroup group = ((Cell)owner).getCellGroup(); group.addParam(newVar); owner.setTextDescriptor(newVar.getKey(), newVar.getTextDescriptor()); if (addToInstances) { for (Iterator<Cell> it = group.getCells(); it.hasNext(); ) { Cell cell = it.next(); if (!cell.isIcon()) continue; for(Iterator<NodeInst> nIt = cell.getInstancesOf(); nIt.hasNext(); ) { NodeInst ni = nIt.next(); CircuitChangeJobs.inheritCellParameter(newVar, ni); } } } } else if (owner instanceof NodeInst && ((NodeInst)owner).isParam(newVar.getKey())) { ((NodeInst)owner).addParameter(newVar.withParam(true)); } else { // create the attribute owner.addVar(newVar); } return true; } public void terminateOK() { dialog.updateList(); dialog.showSelectedAttribute(newVar.getKey()); } } private static class RenameAttribute extends Job { private static final long serialVersionUID = 1L; private String varName; private String newVarName; private ElectricObject owner; protected RenameAttribute(String varName, String newVarName, ElectricObject owner) { super("Rename Attribute", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER); this.varName = varName; this.newVarName = newVarName; this.owner = owner; startJob(); } public boolean doIt() throws JobException { Variable.Key varKey = Variable.newKey(varName); if (owner.isParam(varKey)) { if (owner instanceof Cell) { Variable.AttrKey newParamKey = (Variable.AttrKey)Variable.newKey(newVarName); ((Cell)owner).getCellGroup().renameParam((Variable.AttrKey)varKey, newParamKey); } else if (owner instanceof NodeInst) { System.out.println("Can't rename parameter on instance. Rename it on icon cell."); } } else { Variable var = owner.renameVar(varName, newVarName); if (var == null) { System.out.println("Rename of variable failed"); return false; } } return true; } } /** * Class to create or modify an attribute in a new thread. */ private static class ChangeAttribute extends Job { private static final long serialVersionUID = 1L; private Variable.Key varKey; private ElectricObject owner; private Object newValue; protected ChangeAttribute(Variable.Key varKey, ElectricObject owner, Object newValue) { super("Change Attribute", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER); this.varKey = varKey; this.owner = owner; this.newValue = newValue; startJob(); } public boolean doIt() throws JobException { // get Variable by name Variable var = owner.getParameterOrVariable(varKey); if (var == null) throw new JobException("Could not update Attribute " + varKey + ": it does not exist"); // change the Value field if a new Variable is being created or if the value changed newValue = Variable.withCode(newValue, var.getCode()); if (owner instanceof Cell && owner.isParam(varKey)) { ((Cell)owner).getCellGroup().updateParam((Variable.AttrKey)varKey, newValue); } else { var = owner.updateVar(varKey, newValue); if (var == null) throw new JobException("Error updating Attribute " + varKey); } return true; } } /** * Used to display Variables in the JList */ private class VariableCellRenderer extends JLabel implements ListCellRenderer { private static final long serialVersionUID = 1L; private VariableCellRenderer() { } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (value instanceof Variable.Key) { setText(getVariableText((Variable.Key)value)); } else if (value instanceof Variable) { setText(getVariableText(((Variable)value).getKey())); } else { setText(value.toString()); } if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } setEnabled(list.isEnabled()); setFont(list.getFont()); setOpaque(true); return this; } } private String getVariableText(Variable.Key varKey) { String varName = varKey.getName(); // two modes: show attributes only, and show everything if (showParamsOnly) { if (varName.startsWith("ATTR_")) return varName.substring(5); } // else this is not an attribute // see if any cell, node, or arc variables are available to the user String betterName = Variable.betterVariableName(varName); if (betterName != null) return betterName; return varName; } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; which = new javax.swing.ButtonGroup(); jSeparator1 = new javax.swing.JSeparator(); debugSelect = new javax.swing.JPanel(); currentCell = new javax.swing.JRadioButton(); cellName = new javax.swing.JLabel(); jLabel1 = new javax.swing.JLabel(); currentNode = new javax.swing.JRadioButton(); currentArc = new javax.swing.JRadioButton(); currentPort = new javax.swing.JRadioButton(); currentExport = new javax.swing.JRadioButton(); body = new javax.swing.JPanel(); mainLabel = new javax.swing.JLabel(); listPane = new javax.swing.JScrollPane(); jLabel2 = new javax.swing.JLabel(); name = new javax.swing.JTextField(); jLabel11 = new javax.swing.JLabel(); value = new javax.swing.JTextField(); evaluation = new javax.swing.JLabel(); evalLabel = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); newButton = new javax.swing.JButton(); deleteButton = new javax.swing.JButton(); renameButton = new javax.swing.JButton(); done = new javax.swing.JButton(); applyToInstances = new javax.swing.JCheckBox(); copyButton = new javax.swing.JButton(); editValue = new javax.swing.JButton(); getContentPane().setLayout(new java.awt.GridBagLayout()); setTitle("Edit Attributes"); setName(""); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; getContentPane().add(jSeparator1, gridBagConstraints); debugSelect.setLayout(new java.awt.GridBagLayout()); which.add(currentCell); currentCell.setText("On Current Cell:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; debugSelect.add(currentCell, gridBagConstraints); cellName.setText("clock{sch}"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; debugSelect.add(cellName, gridBagConstraints); jLabel1.setText("or Highlighted Object:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; debugSelect.add(jLabel1, gridBagConstraints); which.add(currentNode); currentNode.setText(" Node"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; debugSelect.add(currentNode, gridBagConstraints); which.add(currentArc); currentArc.setText(" Arc"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; debugSelect.add(currentArc, gridBagConstraints); which.add(currentPort); currentPort.setText("Port on Node"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 1; debugSelect.add(currentPort, gridBagConstraints); which.add(currentExport); currentExport.setText(" Export"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; debugSelect.add(currentExport, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 5; gridBagConstraints.gridheight = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(debugSelect, gridBagConstraints); body.setLayout(new java.awt.GridBagLayout()); mainLabel.setText("Parameters:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 3; gridBagConstraints.insets = new java.awt.Insets(4, 4, 0, 4); body.add(mainLabel, gridBagConstraints); listPane.setMinimumSize(new java.awt.Dimension(400, 100)); listPane.setPreferredSize(new java.awt.Dimension(400, 100)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.5; gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 4); body.add(listPane, gridBagConstraints); jLabel2.setText("Name:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); body.add(jLabel2, gridBagConstraints); name.setText(" "); name.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { nameKeyReleased(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); body.add(name, gridBagConstraints); jLabel11.setText("Value:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); body.add(jLabel11, gridBagConstraints); value.setText(" "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.2; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); body.add(value, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; body.add(evaluation, gridBagConstraints); evalLabel.setText("Evaluation:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); body.add(evalLabel, gridBagConstraints); jPanel1.setLayout(new java.awt.GridBagLayout()); newButton.setText("Create New"); newButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 2, 4); jPanel1.add(newButton, gridBagConstraints); deleteButton.setText("Delete"); deleteButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deleteButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 2, 4); jPanel1.add(deleteButton, gridBagConstraints); renameButton.setText("Rename..."); renameButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { renameButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 2, 4); jPanel1.add(renameButton, gridBagConstraints); done.setText("Done"); done.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { done(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; gridBagConstraints.insets = new java.awt.Insets(2, 4, 4, 4); jPanel1.add(done, gridBagConstraints); applyToInstances.setText("Show new parameter on instances"); applyToInstances.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); applyToInstances.setMargin(new java.awt.Insets(0, 0, 0, 0)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 3; gridBagConstraints.insets = new java.awt.Insets(2, 4, 4, 4); jPanel1.add(applyToInstances, gridBagConstraints); copyButton.setText("Copy From Cell..."); copyButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { copyButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 2, 4); jPanel1.add(copyButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; body.add(jPanel1, gridBagConstraints); editValue.setText("Edit..."); editValue.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editValueActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 4; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); body.add(editValue, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; getContentPane().add(body, gridBagConstraints); pack(); }// </editor-fold>//GEN-END:initComponents private void copyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyButtonActionPerformed CellBrowser dialog = new CellBrowser(Main.getCurrentJFrame(), true, CellBrowser.DoAction.selectCellToCopy); dialog.setVisible(true); Cell cell = dialog.getSelectedCell(); if (cell == null) return; for(Iterator<Variable> it = cell.getParameters(); it.hasNext(); ) { Variable var = it.next(); new CreateAttribute(var.getKey().getName(), var.getObject(), selectedObject, this, applyToInstances.isSelected(), var.getTextDescriptor()); } }//GEN-LAST:event_copyButtonActionPerformed private void editValueActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_editValueActionPerformed {//GEN-HEADEREND:event_editValueActionPerformed String editedValue = JOptionPane.showInputDialog("New Value:", value.getText()); if (editedValue == null) return; value.setText(editedValue); }//GEN-LAST:event_editValueActionPerformed private void renameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_renameButtonActionPerformed String newName = (String)JOptionPane.showInputDialog(this, "New name for " + name.getText(), "Rename Attribute", JOptionPane.QUESTION_MESSAGE, null, null, name.getText()); if (newName == null) return; newName = newName.trim(); if (newName.equals("")) { JOptionPane.showMessageDialog(this, "Attribute name must not be empty", "Invalid Input", JOptionPane.ERROR_MESSAGE); return; } // if same name, ignore if (newName.equals(name.getText())) return; if (showParamsOnly) newName = "ATTR_" + newName; // check if variable name already exists Variable var = selectedObject.getParameterOrVariable(Variable.newKey(newName)); if (var != null) { JOptionPane.showMessageDialog(this, "Attribute of that name already exists", "No Action Taken", JOptionPane.ERROR_MESSAGE); return; } Variable selVar = getSelectedVariable(); if (selVar != null) new RenameAttribute(selVar.getKey().getName(), newName, selectedObject); if (showParamsOnly) newName = newName.substring(5); // set current name to renamed name initialName = newName; name.setText(newName); }//GEN-LAST:event_renameButtonActionPerformed private void nameKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_nameKeyReleased checkName(); }//GEN-LAST:event_nameKeyReleased private void done(java.awt.event.ActionEvent evt)//GEN-FIRST:event_done {//GEN-HEADEREND:event_done closeDialog(null); }//GEN-LAST:event_done private void newButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newButtonActionPerformed // check variable name String varName = name.getText().trim(); if (varName.trim().length() == 0) { JOptionPane.showMessageDialog(null, "Attribute name must not be empty", "Invalid Input", JOptionPane.WARNING_MESSAGE); return; } if (showParamsOnly) varName = "ATTR_" + varName; // check if var of this name already exists on object if (selectedObject.getParameterOrVariable(Variable.newKey(varName)) != null) { JOptionPane.showMessageDialog(null, "Can't create new attribute "+varName+", already exists", "Invalid Action", JOptionPane.WARNING_MESSAGE); return; } // get value String val = value.getText().trim(); // Spawn a Job to create the Variable new CreateAttribute(varName, getVariableObject(val), selectedObject, this, applyToInstances.isSelected(), null); initialName = varName; initialValue = val; }//GEN-LAST:event_newButtonActionPerformed private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_deleteButtonActionPerformed {//GEN-HEADEREND:event_deleteButtonActionPerformed // delete the attribute Variable var = getSelectedVariable(); if (var != null) new DeleteAttribute(var, selectedObject); }//GEN-LAST:event_deleteButtonActionPerformed /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt)//GEN-FIRST:event_closeDialog { setVisible(false); }//GEN-LAST:event_closeDialog // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox applyToInstances; private javax.swing.JPanel body; private javax.swing.JLabel cellName; private javax.swing.JButton copyButton; private javax.swing.JRadioButton currentArc; private javax.swing.JRadioButton currentCell; private javax.swing.JRadioButton currentExport; private javax.swing.JRadioButton currentNode; private javax.swing.JRadioButton currentPort; private javax.swing.JPanel debugSelect; private javax.swing.JButton deleteButton; private javax.swing.JButton done; private javax.swing.JButton editValue; private javax.swing.JLabel evalLabel; private javax.swing.JLabel evaluation; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel2; private javax.swing.JPanel jPanel1; private javax.swing.JSeparator jSeparator1; private javax.swing.JScrollPane listPane; private javax.swing.JLabel mainLabel; private javax.swing.JTextField name; private javax.swing.JButton newButton; private javax.swing.JButton renameButton; private javax.swing.JTextField value; private javax.swing.ButtonGroup which; // End of variables declaration//GEN-END:variables }