
jive3.MultipleTestDeviceDlg Maven / Gradle / Ivy
The newest version!
package jive3;
import fr.esrf.Tango.*;
import fr.esrf.TangoApi.*;
import fr.esrf.tangoatk.widget.util.ATKConstant;
import jive.ArgParser;
import jive.JiveUtils;
import jive.MultiLineCellEditor;
import jive.MultiLineCellRenderer;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Vector;
import static fr.esrf.TangoDs.TangoConst.*;
public class MultipleTestDeviceDlg extends JFrame implements ActionListener {
class DItem {
String devName;
String className;
String value;
long time;
};
class AItem {
String name;
int type;
AttrDataFormat format;
String[] enum_labels;
boolean writeable;
int count;
public String toString() {
return name + " ("+ format.toString() + " " + Tango_CmdArgTypeName[type] + " " + (writeable?"RW":"RO") + ")";
}
};
class CItem {
String name;
int in_type;
int out_type;
int count;
public String toString() {
return name + " (" + Tango_CmdArgTypeName[in_type] +"," + Tango_CmdArgTypeName[out_type] + ")";
}
};
Database db;
String colName[] = {"Name", "Class", "Value", "Time (ms)"};
private MultiLineCellEditor editor;
JTextField selectionText;
JLabel selectionLabel;
JButton searchButton;
JButton dismissButton;
JLabel infoLabel;
DefaultTableModel dm;
JTable theTable;
JCheckBox showValue;
JCheckBox ignoreUnexported;
JButton removeButton;
JList attList;
JTextField attValueText;
JButton writeAttBtn;
JButton readAttBtn;
JButton saveAttListBtn;
JList cmdList;
JTextField cmdValueText;
JButton execCmdBtn;
ArrayList items;
ArrayList attItems;
ArrayList cmdItems;
public MultipleTestDeviceDlg() {
this.db = null;
initComponents();
}
void initComponents() {
getContentPane().setLayout(new BorderLayout());
// Search line
JPanel innerPanel = new JPanel();
innerPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0;
gbc.fill = GridBagConstraints.VERTICAL;
JLabel selectionLabel = new JLabel(" Selection ");
selectionLabel.setFont(ATKConstant.labelFont);
innerPanel.add(selectionLabel, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.BOTH;
selectionText = new JTextField();
selectionText.addActionListener(this);
selectionText.setFont(ATKConstant.labelFont);
innerPanel.add(selectionText, gbc);
gbc.gridx = 2;
gbc.gridy = 0;
gbc.weightx = 0;
gbc.fill = GridBagConstraints.VERTICAL;
searchButton = new JButton("Search");
searchButton.addActionListener(this);
innerPanel.add(searchButton, gbc);
// Bottom panel
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BorderLayout());
JTabbedPane tabPane = new JTabbedPane();
// Attribute Panel
JPanel attributePanel = new JPanel();
attributePanel.setLayout(new BorderLayout());
attributePanel.setBorder(BorderFactory.createEtchedBorder());
JPanel valuePanel = new JPanel();
valuePanel.setLayout(new GridBagLayout());
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 0;
JLabel arginLabel = new JLabel("Argin ");
valuePanel.add(arginLabel,gbc);
gbc.weightx = 1.0;
attValueText = new JTextField();
attValueText.setEditable(true);
valuePanel.add(attValueText,gbc);
gbc.weightx = 0.0;
readAttBtn = new JButton("Read");
readAttBtn.addActionListener(this);
valuePanel.add(readAttBtn,gbc);
writeAttBtn = new JButton("Write");
writeAttBtn.addActionListener(this);
valuePanel.add(writeAttBtn,gbc);
saveAttListBtn = new JButton("Save list");
saveAttListBtn.addActionListener(this);
valuePanel.add(saveAttListBtn,gbc);
attributePanel.add(valuePanel,BorderLayout.NORTH);
attList = new JList();
JScrollPane attListScrool = new JScrollPane(attList);
attributePanel.add(attListScrool,BorderLayout.CENTER);
tabPane.add(attributePanel,"Attribute");
// Command Panel
JPanel commandPanel = new JPanel();
commandPanel.setLayout(new BorderLayout());
commandPanel.setBorder(BorderFactory.createEtchedBorder());
JPanel cmdValuePanel = new JPanel();
cmdValuePanel.setLayout(new GridBagLayout());
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 0;
JLabel cmdArginLabel = new JLabel("Argin ");
cmdValuePanel.add(cmdArginLabel,gbc);
gbc.weightx = 1.0;
cmdValueText = new JTextField();
cmdValueText.setEditable(true);
cmdValuePanel.add(cmdValueText,gbc);
gbc.weightx = 0.0;
execCmdBtn = new JButton("Execute");
execCmdBtn.addActionListener(this);
cmdValuePanel.add(execCmdBtn,gbc);
commandPanel.add(cmdValuePanel,BorderLayout.NORTH);
cmdList = new JList();
JScrollPane cmdListScrool = new JScrollPane(cmdList);
commandPanel.add(cmdListScrool,BorderLayout.CENTER);
tabPane.add(commandPanel,"Command");
// Bottom Panel
JPanel bottomBtnPanel = new JPanel();
bottomBtnPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
infoLabel = new JLabel("0 item(s)");
infoLabel.setFont(ATKConstant.labelFont);
bottomBtnPanel.add(infoLabel);
dismissButton = new JButton("Dismiss");
dismissButton.addActionListener(this);
bottomBtnPanel.add(dismissButton);
bottomPanel.add(tabPane,BorderLayout.CENTER);
bottomPanel.add(bottomBtnPanel,BorderLayout.SOUTH);
getContentPane().add(innerPanel, BorderLayout.NORTH);
getContentPane().add(bottomPanel, BorderLayout.SOUTH);
// Table model
dm = new DefaultTableModel() {
public Class getColumnClass(int columnIndex) {
return String.class;
}
public boolean isCellEditable(int row, int column) {
return false;
}
public void setValueAt(Object aValue, int row, int column) {
}
};
JPanel tablePanel = new JPanel();
tablePanel.setLayout(new BorderLayout());
theTable = new JTable(dm);
editor = new MultiLineCellEditor(theTable);
theTable.setDefaultEditor(String.class, editor);
MultiLineCellRenderer renderer = new MultiLineCellRenderer(false, true, false);
theTable.setDefaultRenderer(String.class, renderer);
theTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
JScrollPane textView = new JScrollPane(theTable);
tablePanel.add(textView,BorderLayout.CENTER);
JPanel tableButtonPanel = new JPanel();
tableButtonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
ignoreUnexported = new JCheckBox("Ignore unexported");
ignoreUnexported.setSelected(false);
ignoreUnexported.addActionListener(this);
showValue = new JCheckBox("Show value");
showValue.setSelected(true);
showValue.addActionListener(this);
tableButtonPanel.add(ignoreUnexported);
tableButtonPanel.add(showValue);
removeButton = new JButton("Remove items");
removeButton.addActionListener(this);
tableButtonPanel.add(removeButton);
tablePanel.add(tableButtonPanel, BorderLayout.SOUTH);
getContentPane().add(tablePanel, BorderLayout.CENTER);
setTitle("Multiple device selection");
setPreferredSize(new Dimension(800, 600));
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
exitDlg();
super.windowClosing(e);
}
});
items = new ArrayList();
attItems = new ArrayList();
cmdItems = new ArrayList();
clear();
}
private void exitDlg() {
}
public void clear() {
items.clear();
infoLabel.setText(items.size() + " item(s)");
String[][] prop = new String[0][2];
dm.setDataVector(prop, colName);
editor.updateRows();
theTable.getColumnModel().getColumn(1).setPreferredWidth(250);
theTable.validate();
((JPanel) getContentPane()).revalidate();
}
public void setDatabase(Database db) {
this.db = db;
}
private void selectDevice() {
refresh();
}
private void refresh() {
String selectText = selectionText.getText().trim();
String[] fields = selectText.split("/");
if (fields.length != 3 && fields.length != 4) {
JiveUtils.showJiveError("Invalid selection pattern, 3 or 4 slash separated fields expected");
return;
}
try {
items.clear();
String request;
// Select devices
String exportedClause = ignoreUnexported.isSelected()?" and exported=1":"";
if (fields.length == 3) {
fields[0] = fields[0].replace('*', '%');
fields[1] = fields[1].replace('*', '%');
fields[2] = fields[2].replace('*', '%');
request = "select name,class from device where domain like '" + fields[0] + "' and family like '" +
fields[1] + "' and member like '" + fields[2] + "'" + exportedClause;
} else {
fields[0] = fields[0].replace('*', '%');
fields[1] = fields[1].replace('*', '%');
fields[2] = fields[2].replace('*', '%');
fields[3] = fields[3].replace('*', '%');
request = "select name,class from device where domain like '" + fields[0] + "' and family like '" +
fields[1] + "' and member like '" + fields[2] + "' and class like '" + fields[3] + "'" + exportedClause;
}
DeviceData argin = new DeviceData();
argin.insert(request);
DeviceData argout = db.command_inout("DbMySqlSelect", argin);
DevVarLongStringArray arg = argout.extractLongStringArray();
items.clear();
for (int i = 0; i < arg.svalue.length; i += 2) {
DItem pi = new DItem();
pi.devName = arg.svalue[i];
pi.className = arg.svalue[i + 1];
pi.value = "";
items.add(pi);
}
if (items.size() == 0)
JOptionPane.showMessageDialog(this, "No device found");
infoLabel.setText(items.size() + " item(s)");
refreshCommandAndAttribute();
refreshTable();
} catch (DevFailed e) {
JiveUtils.showTangoError(e);
}
}
private void refreshCommandAndAttribute() {
Vector errStr = new Vector();
attItems.clear();
cmdItems.clear();
for(int i=0;i0) {
JiveUtils.showJiveErrors(errStr);
}
// Remove non common item
for (int i = 0; i < attItems.size(); ) {
if (attItems.get(i).count != items.size())
attItems.remove(i);
else
i++;
}
for (int i = 0; i < cmdItems.size(); ) {
if (cmdItems.get(i).count != items.size())
cmdItems.remove(i);
else
i++;
}
// Populate list
DefaultListModel ml = new DefaultListModel();
for (int i = 0; i < attItems.size(); i++)
ml.add(i, attItems.get(i));
attList.setModel(ml);
ml = new DefaultListModel();
for (int i = 0; i < cmdItems.size(); i++)
ml.add(i, cmdItems.get(i));
cmdList.setModel(ml);
}
private void addAttribute(AttributeInfoEx e) {
boolean found = false;
int i = 0;
while( !found && i=0) {
AItem ai = attItems.get(attId);
for(int i=0;i=0) {
AItem ai = attItems.get(attId);
try {
writeAtts(ai);
} catch (NumberFormatException e) {
JiveUtils.showJiveError(e.getMessage());
}
}
} else if(src==saveAttListBtn) {
int attId = attList.getSelectedIndex();
if(attId>=0) {
AItem ai = attItems.get(attId);
try {
saveAttList(ai);
} catch (NumberFormatException e) {
JiveUtils.showJiveError(e.getMessage());
}
}
} else if(src==execCmdBtn) {
int cmdId = cmdList.getSelectedIndex();
if(cmdId>=0) {
CItem ci = cmdItems.get(cmdId);
try {
execCommand(ci);
} catch (NumberFormatException e) {
JiveUtils.showJiveError(e.getMessage());
}
}
} else if(src==removeButton) {
int[] sel = theTable.getSelectedRows();
for(int i=sel.length-1;i>=0;i--) {
items.remove(sel[i]);
}
refreshCommandAndAttribute();
refreshTable();
} else if(src==showValue) {
refreshTable();
}
}
private void saveAttList(AItem att) throws NumberFormatException {
File file = TreePanel.getSaveFile(null);
if (file != null) {
try {
FileWriter attFile = new FileWriter(file.getAbsolutePath());
for (DItem item : items) {
String attName = item.devName + "/" + att.name;
attFile.write(attName + "\n");
}
attFile.close();
} catch (IOException e) {
JiveUtils.showJiveError(e.getMessage());
}
}
}
private void writeAtts(AItem att) throws NumberFormatException {
DeviceAttribute send = new DeviceAttribute(att.name);
ArgParser arg = new ArgParser(attValueText.getText());
if (items.size() > 1) {
Vector propChange = new Vector();
propChange.add(att.name);
propChange.add(attValueText.getText());
if (!MultiChangeConfirmDlg.confirmChange(propChange, items.size(),"", "Attribute")) {
return;
}
}
switch (att.type) {
case Tango_DEV_STATE:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert(arg.parse_state());
break;
case AttrDataFormat._SPECTRUM:
send.insert(arg.parse_state_array());
break;
case AttrDataFormat._IMAGE:
send.insert(arg.parse_state_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_UCHAR:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert_uc(arg.parse_uchar());
break;
case AttrDataFormat._SPECTRUM:
send.insert_uc(arg.parse_uchar_array());
break;
case AttrDataFormat._IMAGE:
send.insert_uc(arg.parse_uchar_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_BOOLEAN:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert(arg.parse_boolean());
break;
case AttrDataFormat._SPECTRUM:
send.insert(arg.parse_boolean_array());
break;
case AttrDataFormat._IMAGE:
send.insert(arg.parse_boolean_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_SHORT:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert(arg.parse_short());
break;
case AttrDataFormat._SPECTRUM:
send.insert(arg.parse_short_array());
break;
case AttrDataFormat._IMAGE:
send.insert(arg.parse_short_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_USHORT:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert_us(arg.parse_ushort());
break;
case AttrDataFormat._SPECTRUM:
send.insert_us(arg.parse_ushort_array());
break;
case AttrDataFormat._IMAGE:
send.insert_us(arg.parse_ushort_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_LONG:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert(arg.parse_long());
break;
case AttrDataFormat._SPECTRUM:
send.insert(arg.parse_long_array());
break;
case AttrDataFormat._IMAGE:
send.insert(arg.parse_long_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_ULONG:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert_ul(arg.parse_ulong());
break;
case AttrDataFormat._SPECTRUM:
send.insert_ul(arg.parse_ulong_array());
break;
case AttrDataFormat._IMAGE:
send.insert_ul(arg.parse_ulong_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_LONG64:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert(arg.parse_long64());
break;
case AttrDataFormat._SPECTRUM:
send.insert(arg.parse_long64_array());
break;
case AttrDataFormat._IMAGE:
send.insert(arg.parse_long64_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_ULONG64:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert_u64(arg.parse_long64());
break;
case AttrDataFormat._SPECTRUM:
send.insert_u64(arg.parse_long64_array());
break;
case AttrDataFormat._IMAGE:
send.insert_u64(arg.parse_long64_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_FLOAT:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert(arg.parse_float());
break;
case AttrDataFormat._SPECTRUM:
send.insert(arg.parse_float_array());
break;
case AttrDataFormat._IMAGE:
send.insert(arg.parse_float_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_DOUBLE:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert(arg.parse_double());
break;
case AttrDataFormat._SPECTRUM:
send.insert(arg.parse_double_array());
break;
case AttrDataFormat._IMAGE:
send.insert(arg.parse_double_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_STRING:
switch (att.format.value()) {
case AttrDataFormat._SCALAR:
send.insert(arg.parse_string());
break;
case AttrDataFormat._SPECTRUM:
send.insert(arg.parse_string_array());
break;
case AttrDataFormat._IMAGE:
send.insert(arg.parse_string_image(),arg.get_image_width(),arg.get_image_height());
break;
}
break;
case Tango_DEV_ENUM:
// Convert string to short array
switch (att.format.value())
{
case AttrDataFormat._SCALAR: {
String in = arg.parse_string();
short idx = (short) JiveUtils.isInsideArray(in, att.enum_labels);
if (idx < 0)
throw new NumberFormatException("\"" + in + "\" not known in enum\nPossible values are:\n"+
JiveUtils.stringArrayToString(att.enum_labels));
send.insert(idx);
}
break;
case AttrDataFormat._SPECTRUM:
{
String[] in = arg.parse_string_array();
short[] idx = new short[in.length];
for (int i = 0; i < in.length; i++) {
idx[i] = (short) JiveUtils.isInsideArray(in[i], att.enum_labels);
if (idx[i] < 0)
throw new NumberFormatException("\"" + in[i] + "\" not known in enum\nPossible values are:\n"+
JiveUtils.stringArrayToString(att.enum_labels));
}
send.insert(idx);
}
break;
case AttrDataFormat._IMAGE:
{
String[] in = arg.parse_string_image();
int width = arg.get_image_width();
int height = arg.get_image_height();
short[] idx = new short[in.length];
for (int i = 0; i < in.length; i++) {
idx[i] = (short) JiveUtils.isInsideArray(in[i], att.enum_labels);
if (idx[i] < 0)
throw new NumberFormatException("\"" + in[i] + "\" not known in enum\nPossible values are:\n"+
JiveUtils.stringArrayToString(att.enum_labels));
}
send.insert(idx, width, height);
}
break;
}
break;
default:
throw new NumberFormatException("Attribute type not supported code=" + att.type);
}
Vector errList = new Vector();
for(int i=0;i0) {
JiveUtils.showJiveErrors(errList);
}
}
private void readAtt(DItem di, AItem att) {
StringBuffer ret_string = new StringBuffer();
long t0 = System.currentTimeMillis();
try {
DeviceProxy ds = new DeviceProxy(di.devName);
t0 = System.currentTimeMillis();
DeviceAttribute data = ds.read_attribute(att.name);
long t1 = System.currentTimeMillis();
// Add the quality information
if( data.getQuality().value() == AttrQuality._ATTR_INVALID ) {
di.value = "INVALID";
di.time = (t1-t0);
return;
}
int nbRead = data.getNbRead();
switch (att.type) {
case Tango_DEV_STATE:
{
DevState[] dummy = data.extractDevStateArray();
for (int i = 0; i < nbRead; i++) {
ret_string.append(Tango_DevStateName[dummy[i].value()]);
if(i 1) {
Vector propChange = new Vector();
propChange.add(ci.name);
if(arg==null) {
propChange.add("None");
} else {
propChange.add(cmdValueText.getText());
}
if (!MultiChangeConfirmDlg.confirmChange(propChange, items.size(),"", "Command")) {
return;
}
}
if(send!=null) {
switch (ci.in_type) {
case Tango_DEV_BOOLEAN:
send.insert(arg.parse_boolean());
break;
case Tango_DEV_USHORT:
send.insert_us(arg.parse_ushort());
break;
case Tango_DEV_SHORT:
send.insert(arg.parse_short());
break;
case Tango_DEV_ULONG:
send.insert_ul(arg.parse_ulong());
break;
case Tango_DEV_LONG:
send.insert(arg.parse_long());
break;
case Tango_DEV_LONG64:
send.insert(arg.parse_long64());
break;
case Tango_DEV_ULONG64:
send.insert_u64(arg.parse_long64());
break;
case Tango_DEV_FLOAT:
send.insert(arg.parse_float());
break;
case Tango_DEV_DOUBLE:
send.insert(arg.parse_double());
break;
case Tango_DEV_STRING:
send.insert(arg.parse_string());
break;
case Tango_DEVVAR_CHARARRAY:
send.insert(arg.parse_char_array());
break;
case Tango_DEVVAR_USHORTARRAY:
send.insert_us(arg.parse_ushort_array());
break;
case Tango_DEVVAR_SHORTARRAY:
send.insert(arg.parse_short_array());
break;
case Tango_DEVVAR_ULONGARRAY:
send.insert_ul(arg.parse_ulong_array());
break;
case Tango_DEVVAR_LONGARRAY:
send.insert(arg.parse_long_array());
break;
case Tango_DEVVAR_LONG64ARRAY:
send.insert(arg.parse_long64_array());
break;
case Tango_DEVVAR_ULONG64ARRAY:
send.insert_u64(arg.parse_long64_array());
break;
case Tango_DEVVAR_FLOATARRAY:
send.insert(arg.parse_float_array());
break;
case Tango_DEVVAR_DOUBLEARRAY:
send.insert(arg.parse_double_array());
break;
case Tango_DEVVAR_STRINGARRAY:
send.insert(arg.parse_string_array());
break;
case Tango_DEVVAR_LONGSTRINGARRAY:
send.insert(new DevVarLongStringArray(arg.parse_long_array(), arg.parse_string_array()));
break;
case Tango_DEVVAR_DOUBLESTRINGARRAY:
send.insert(new DevVarDoubleStringArray(arg.parse_double_array(), arg.parse_string_array()));
break;
case Tango_DEV_STATE:
send.insert(DevState.from_int(arg.parse_ushort()));
break;
default:
throw new NumberFormatException("Command type not supported code=" + ci.in_type);
}
}
Vector errList = new Vector();
for(int i=0;i0) {
JiveUtils.showJiveErrors(errList);
}
if(ci.out_type!=Tango_DEV_VOID)
refreshTable();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy