You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
470 lines
12 KiB
470 lines
12 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2002-
|
|
// Authors:
|
|
// * Andrew Hinton <ug60axh@cs.bham.ac.uk> (University of Birmingham)
|
|
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford, formerly University of Birmingham)
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// This file is part of PRISM.
|
|
//
|
|
// PRISM 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 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// PRISM 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 PRISM; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
//==============================================================================
|
|
|
|
package userinterface;
|
|
import parser.*;
|
|
import parser.ast.*;
|
|
import prism.*;
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
import javax.swing.border.*;
|
|
import javax.swing.table.*;
|
|
import java.util.*;
|
|
/**
|
|
*
|
|
* @author ug60axh
|
|
*/
|
|
public class GUIConstantsPicker extends javax.swing.JDialog
|
|
{
|
|
public static final int NO_VALUES = 0;
|
|
public static final int VALUES_DONE = 1;
|
|
public static final int CANCELLED = 2;
|
|
|
|
private boolean cancelled = true;
|
|
|
|
private JTable propTable;
|
|
private DefineConstantTable propTableModel;
|
|
private JTable modelTable;
|
|
private DefineConstantTable modelTableModel;
|
|
|
|
private boolean areModel, areProp;
|
|
|
|
private Action okAction;
|
|
private Action cancelAction;
|
|
|
|
private javax.swing.JButton okayButton;
|
|
|
|
private UndefinedConstants undef;
|
|
|
|
private GUIPrism gui;
|
|
|
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
javax.swing.JPanel topPanel;
|
|
// End of variables declaration//GEN-END:variables
|
|
|
|
/** Creates new form GUIConstantsPicker */
|
|
public GUIConstantsPicker(GUIPrism parent, UndefinedConstants undef, boolean areModel, boolean areProp, Values modelDefaults, Values propDefaults)
|
|
{
|
|
super(parent, "Define Constants", true);
|
|
this.areModel = areModel;
|
|
this.areProp = areProp;
|
|
this.undef = undef;
|
|
this.gui = parent;
|
|
|
|
//setup tables
|
|
propTableModel = new DefineConstantTable();
|
|
modelTableModel = new DefineConstantTable();
|
|
propTable = new JTable();
|
|
modelTable = new JTable();
|
|
propTable.setModel(propTableModel);
|
|
modelTable.setModel(modelTableModel);
|
|
propTable.setSelectionMode(DefaultListSelectionModel.SINGLE_INTERVAL_SELECTION);
|
|
modelTable.setSelectionMode(DefaultListSelectionModel.SINGLE_INTERVAL_SELECTION);
|
|
propTable.setCellSelectionEnabled(true);
|
|
modelTable.setCellSelectionEnabled(true);
|
|
propTable.setRowHeight(getFontMetrics(propTable.getFont()).getHeight() + 4);
|
|
modelTable.setRowHeight(getFontMetrics(modelTable.getFont()).getHeight() + 4);
|
|
|
|
//initialise
|
|
initComponents();
|
|
this.getRootPane().setDefaultButton(okayButton);
|
|
initTables(areModel, areProp);
|
|
initValues(undef, modelDefaults, propDefaults);
|
|
|
|
setResizable(false);
|
|
|
|
pack();
|
|
setLocationRelativeTo(getParent()); // centre
|
|
}
|
|
|
|
/** 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.
|
|
*/
|
|
private void initComponents()//GEN-BEGIN:initComponents
|
|
{
|
|
javax.swing.JButton cancelButton;
|
|
java.awt.GridBagConstraints gridBagConstraints;
|
|
javax.swing.JLabel jLabel1;
|
|
javax.swing.JPanel jPanel1;
|
|
javax.swing.JPanel jPanel2;
|
|
javax.swing.JPanel jPanel3;
|
|
javax.swing.JPanel jPanel4;
|
|
javax.swing.JPanel jPanel5;
|
|
javax.swing.JPanel jPanel6;
|
|
|
|
|
|
jPanel1 = new javax.swing.JPanel();
|
|
jPanel2 = new javax.swing.JPanel();
|
|
jPanel3 = new javax.swing.JPanel();
|
|
jPanel4 = new javax.swing.JPanel();
|
|
jPanel5 = new javax.swing.JPanel();
|
|
jLabel1 = new javax.swing.JLabel();
|
|
topPanel = new javax.swing.JPanel();
|
|
jPanel6 = new javax.swing.JPanel();
|
|
okayButton = new javax.swing.JButton();
|
|
cancelButton = new javax.swing.JButton();
|
|
|
|
addWindowListener(new java.awt.event.WindowAdapter()
|
|
{
|
|
public void windowClosing(java.awt.event.WindowEvent evt)
|
|
{
|
|
closeDialog(evt);
|
|
}
|
|
});
|
|
|
|
jPanel1.setLayout(new java.awt.GridBagLayout());
|
|
|
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
gridBagConstraints.gridx = 0;
|
|
gridBagConstraints.gridy = 0;
|
|
jPanel1.add(jPanel2, gridBagConstraints);
|
|
|
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
gridBagConstraints.gridx = 2;
|
|
gridBagConstraints.gridy = 0;
|
|
jPanel1.add(jPanel3, gridBagConstraints);
|
|
|
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
gridBagConstraints.gridx = 0;
|
|
gridBagConstraints.gridy = 2;
|
|
jPanel1.add(jPanel4, gridBagConstraints);
|
|
|
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
gridBagConstraints.gridx = 0;
|
|
gridBagConstraints.gridy = 4;
|
|
jPanel1.add(jPanel5, gridBagConstraints);
|
|
|
|
jLabel1.setText("Please define the following constants:");
|
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
gridBagConstraints.gridx = 1;
|
|
gridBagConstraints.gridy = 1;
|
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
|
|
jPanel1.add(jLabel1, gridBagConstraints);
|
|
|
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
gridBagConstraints.gridx = 1;
|
|
gridBagConstraints.gridy = 3;
|
|
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
|
|
jPanel1.add(topPanel, gridBagConstraints);
|
|
|
|
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
|
|
|
|
jPanel6.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));
|
|
|
|
okayButton.setText("Okay");
|
|
okayButton.addActionListener(new java.awt.event.ActionListener()
|
|
{
|
|
public void actionPerformed(java.awt.event.ActionEvent evt)
|
|
{
|
|
okayButtonActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
jPanel6.add(okayButton);
|
|
|
|
cancelButton.setText("Cancel");
|
|
cancelButton.addActionListener(new java.awt.event.ActionListener()
|
|
{
|
|
public void actionPerformed(java.awt.event.ActionEvent evt)
|
|
{
|
|
cancelButtonActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
jPanel6.add(cancelButton);
|
|
|
|
getContentPane().add(jPanel6, java.awt.BorderLayout.SOUTH);
|
|
|
|
pack();
|
|
}//GEN-END:initComponents
|
|
|
|
private void initTables(boolean areModel, boolean areProp)
|
|
{
|
|
if(areModel && areProp)
|
|
{
|
|
topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
|
|
JPanel topTopPanel = new JPanel();
|
|
topTopPanel.setBorder(new TitledBorder("Model Constants"));
|
|
topTopPanel.setLayout(new BorderLayout());
|
|
JScrollPane sp = new JScrollPane();
|
|
|
|
sp.setViewportView(modelTable);
|
|
topTopPanel.add(sp);
|
|
JPanel bottomTopPanel = new JPanel();
|
|
bottomTopPanel.setBorder(new TitledBorder("Property Constants"));
|
|
bottomTopPanel.setLayout(new BorderLayout());
|
|
JScrollPane sp2 = new JScrollPane();
|
|
|
|
sp2.setViewportView(propTable);
|
|
bottomTopPanel.add(sp2);
|
|
topPanel.add(topTopPanel);
|
|
topPanel.add(bottomTopPanel);
|
|
}
|
|
else if(areModel)
|
|
{
|
|
topPanel.setBorder(new TitledBorder("Model Constants"));
|
|
topPanel.setLayout(new BorderLayout());
|
|
JScrollPane sp = new JScrollPane();
|
|
sp.setViewportView(modelTable);
|
|
topPanel.add(sp);
|
|
}
|
|
else if(areProp)
|
|
{
|
|
topPanel.setBorder(new TitledBorder("Property Constants"));
|
|
topPanel.setLayout(new BorderLayout());
|
|
JScrollPane sp = new JScrollPane();
|
|
sp.setViewportView(propTable);
|
|
topPanel.add(sp);
|
|
}
|
|
|
|
topPanel.setPreferredSize(new Dimension(500,200));
|
|
}
|
|
|
|
private void initValues(UndefinedConstants undef, Values modelDef, Values propDef)
|
|
{
|
|
for(int i = 0; i < undef.getMFNumUndefined(); i++)
|
|
{
|
|
Constant c = new Constant(undef.getMFUndefinedName(i), undef.getMFUndefinedType(i), "");
|
|
if(modelDef != null)
|
|
{
|
|
try
|
|
{
|
|
Object o = modelDef.getValueOf(c.name);
|
|
c.value = o;
|
|
}
|
|
catch(Exception e)
|
|
{}
|
|
}
|
|
modelTableModel.addConstant(c);
|
|
}
|
|
for(int i = 0; i < undef.getPFNumUndefined(); i++)
|
|
{
|
|
Constant c = new Constant(undef.getPFUndefinedName(i), undef.getPFUndefinedType(i), "");
|
|
if(propDef != null)
|
|
{
|
|
try
|
|
{
|
|
Object o = propDef.getValueOf(c.name);
|
|
c.value = o;
|
|
}
|
|
catch(Exception e)
|
|
{}
|
|
}
|
|
propTableModel.addConstant(c);
|
|
}
|
|
}
|
|
|
|
/** Call this static method to construct a new GUIConstantsPicker to define
|
|
* undef. If you don't want any default values, then pass in null for
|
|
* modelDefaults and propDefaults
|
|
*/
|
|
public static int defineConstantsWithDialog(GUIPrism parent, UndefinedConstants undef, Values modelDefaults, Values propDefaults)
|
|
{
|
|
boolean areModel = undef.getMFNumUndefined() > 0;
|
|
boolean areProp = undef.getPFNumUndefined() > 0;
|
|
if(areModel || areProp)
|
|
{
|
|
return new GUIConstantsPicker(parent, undef, areModel, areProp, modelDefaults, propDefaults).defineValues();
|
|
}
|
|
else return NO_VALUES;
|
|
}
|
|
|
|
public int defineValues()
|
|
{
|
|
show();
|
|
if(cancelled) return CANCELLED;
|
|
else return VALUES_DONE;
|
|
}
|
|
|
|
private void okayButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_okayButtonActionPerformed
|
|
{//GEN-HEADEREND:event_okayButtonActionPerformed
|
|
int i, n;
|
|
Constant c;
|
|
|
|
if(areProp && propTable.getCellEditor() != null)propTable.getCellEditor().stopCellEditing();
|
|
if(areModel && modelTable.getCellEditor() != null)modelTable.getCellEditor().stopCellEditing();
|
|
try
|
|
{
|
|
//undef.defineUsingConstSwitch(getConstSwitch());
|
|
|
|
// passing info to UndefinedConstants object
|
|
n = modelTableModel.getNumConstants();
|
|
for (i = 0; i < n; i++)
|
|
{
|
|
c = modelTableModel.getConstant(i);
|
|
undef.defineConstant(c.name, ""+c.value);
|
|
}
|
|
n = propTableModel.getNumConstants();
|
|
for (i = 0; i < n; i++)
|
|
{
|
|
c = propTableModel.getConstant(i);
|
|
undef.defineConstant(c.name, ""+c.value);
|
|
}
|
|
undef.checkAllDefined();
|
|
undef.initialiseIterators();
|
|
|
|
cancelled = false;
|
|
dispose();
|
|
}
|
|
catch(PrismException e)
|
|
{
|
|
gui.errorDialog(e.getMessage());
|
|
}
|
|
}//GEN-LAST:event_okayButtonActionPerformed
|
|
|
|
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cancelButtonActionPerformed
|
|
{//GEN-HEADEREND:event_cancelButtonActionPerformed
|
|
dispose();
|
|
}//GEN-LAST:event_cancelButtonActionPerformed
|
|
|
|
/** Closes the dialog */
|
|
private void closeDialog(java.awt.event.WindowEvent evt)//GEN-FIRST:event_closeDialog
|
|
{
|
|
setVisible(false);
|
|
dispose();
|
|
}//GEN-LAST:event_closeDialog
|
|
|
|
class DefineConstantTable extends AbstractTableModel
|
|
{
|
|
ArrayList constants;
|
|
|
|
public DefineConstantTable()
|
|
{
|
|
constants = new ArrayList();
|
|
}
|
|
|
|
public void addConstant(Constant c)
|
|
{
|
|
constants.add(c);
|
|
fireTableRowsInserted(constants.size()-1, constants.size()-1);
|
|
}
|
|
|
|
public int getNumConstants()
|
|
{
|
|
return constants.size();
|
|
}
|
|
|
|
public Constant getConstant(int i)
|
|
{
|
|
return (Constant)constants.get(i);
|
|
}
|
|
|
|
public int getColumnCount()
|
|
{
|
|
return 3;
|
|
}
|
|
|
|
public int getRowCount()
|
|
{
|
|
return constants.size();
|
|
}
|
|
|
|
public Object getValueAt(int rowIndex, int columnIndex)
|
|
{
|
|
|
|
Constant c = (Constant)constants.get(rowIndex);
|
|
switch(columnIndex)
|
|
{
|
|
case 0: return c.name;
|
|
case 1:
|
|
{
|
|
switch(c.type)
|
|
{
|
|
case Expression.INT: return "int";
|
|
case Expression.DOUBLE: return "double";
|
|
case Expression.BOOLEAN: return "boolean";
|
|
default: return "";
|
|
}
|
|
}
|
|
case 2: return c.value.toString();
|
|
default: return "";
|
|
}
|
|
}
|
|
|
|
public String getColumnName(int columnIndex)
|
|
{
|
|
switch(columnIndex)
|
|
{
|
|
case 0: return "Name";
|
|
case 1: return "Type";
|
|
case 2: return "Value";
|
|
default: return "";
|
|
}
|
|
}
|
|
|
|
public boolean isCellEditable(int rowIndex, int columnIndex)
|
|
{
|
|
if(columnIndex == 2) return true;
|
|
else return false;
|
|
}
|
|
|
|
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
|
|
{
|
|
if(columnIndex == 2)
|
|
{
|
|
Constant c = (Constant)constants.get(rowIndex);
|
|
String s = (String)aValue;
|
|
c.value = s;
|
|
fireTableCellUpdated(rowIndex, columnIndex);
|
|
}
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
String str = "";
|
|
for(int i = 0 ; i < constants.size(); i++)
|
|
{
|
|
Constant c = (Constant)constants.get(i);
|
|
str+=c.toString();
|
|
if(i!= constants.size()-1) str+=",";
|
|
}
|
|
return str;
|
|
}
|
|
|
|
}
|
|
|
|
class Constant
|
|
{
|
|
String name;
|
|
int type;
|
|
Object value;
|
|
|
|
public Constant(String name, int type, Object value)
|
|
{
|
|
this.name = name;
|
|
this.type = type;
|
|
this.value = value;
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
return name+"="+value.toString();
|
|
}
|
|
}
|
|
}
|