219 lines
4.6 KiB
Java
Executable File
219 lines
4.6 KiB
Java
Executable File
/*
|
|
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
|
|
*
|
|
* This program 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.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*/
|
|
|
|
package com.fr3ts0n.pvs.gui;
|
|
|
|
import com.fr3ts0n.pvs.IndexedProcessVar;
|
|
import com.fr3ts0n.pvs.ProcessVar;
|
|
import com.fr3ts0n.pvs.PvChangeEvent;
|
|
import com.fr3ts0n.pvs.PvChangeListener;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import javax.swing.table.AbstractTableModel;
|
|
|
|
/**
|
|
* Data Model to represent a ProcessVar within a Table object
|
|
*
|
|
* @author erwin
|
|
*/
|
|
public class PvTableModel extends AbstractTableModel
|
|
implements PvChangeListener
|
|
{
|
|
|
|
/**
|
|
*
|
|
*/
|
|
private static final long serialVersionUID = -6777148395276846388L;
|
|
protected ProcessVar pv;
|
|
protected IndexedProcessVar currRow;
|
|
protected Object[] keys;
|
|
private String[] colHeaders = {};
|
|
|
|
/** Creates a new instance of PvTableModel */
|
|
public PvTableModel()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Creates a new instance of PvTableModel
|
|
*
|
|
* @param pVar the process variable to represent
|
|
*/
|
|
public PvTableModel(ProcessVar pVar)
|
|
{
|
|
setProcessVar(pVar);
|
|
}
|
|
|
|
/**
|
|
* update th list of key items for correct location of coordinates
|
|
*
|
|
* @param pv Process variable
|
|
*/
|
|
private void updateKeys(ProcessVar pv)
|
|
{
|
|
keys = pv.keySet().toArray();
|
|
Arrays.sort(keys);
|
|
}
|
|
|
|
/**
|
|
* set the process variable to be represented
|
|
*
|
|
* @param pVar the process variable to represent
|
|
*/
|
|
public synchronized void setProcessVar(ProcessVar pVar)
|
|
{
|
|
// set the pv
|
|
pv = pVar;
|
|
updateKeys(pVar);
|
|
if (keys.length > 0)
|
|
{
|
|
currRow = (IndexedProcessVar) pv.get(keys[0]);
|
|
colHeaders = currRow.getFields();
|
|
fireTableStructureChanged();
|
|
}
|
|
pv.addPvChangeListener(this, PvChangeEvent.PV_ALLEVENTS);
|
|
}
|
|
|
|
/**
|
|
* get number of table rows
|
|
*
|
|
* @return number of rows to show
|
|
*/
|
|
public int getRowCount()
|
|
{
|
|
return (keys != null ? keys.length : 0);
|
|
}
|
|
|
|
/**
|
|
* return number of columns
|
|
*
|
|
* @return number of columns
|
|
*/
|
|
public int getColumnCount()
|
|
{
|
|
return (colHeaders.length);
|
|
}
|
|
|
|
/**
|
|
* get process var for row
|
|
* @param rowIndex row index
|
|
* @return process var
|
|
*/
|
|
public IndexedProcessVar getElementAt(int rowIndex)
|
|
{
|
|
if (rowIndex < getRowCount())
|
|
currRow = (IndexedProcessVar) pv.get(keys[rowIndex]);
|
|
|
|
return currRow;
|
|
}
|
|
/**
|
|
* get the value for table location (x,y)
|
|
*
|
|
* @param rowIndex row number
|
|
* @param columnIndex column number
|
|
* @return value for table location
|
|
*/
|
|
public Object getValueAt(int rowIndex, int columnIndex)
|
|
{
|
|
Object result = null;
|
|
// if the pv is set ...
|
|
if (pv != null)
|
|
{
|
|
// get the column value
|
|
if((currRow = getElementAt(rowIndex)) != null)
|
|
{
|
|
result = currRow.get(columnIndex);
|
|
}
|
|
}
|
|
return (result);
|
|
}
|
|
|
|
/**
|
|
* handle a process variable change
|
|
*
|
|
* @param event the change event to be handled
|
|
*/
|
|
public synchronized void pvChanged(PvChangeEvent event)
|
|
{
|
|
Object key;
|
|
int rowId;
|
|
try
|
|
{
|
|
if(event.isChildEvent())
|
|
{
|
|
key = String.valueOf(event.getValue());
|
|
}
|
|
else
|
|
{
|
|
key = event.getKey();
|
|
}
|
|
rowId = key != null ? Arrays.binarySearch(keys, key) : 0;
|
|
|
|
switch (event.getType())
|
|
{
|
|
case PvChangeEvent.PV_CONFIRMED:
|
|
case PvChangeEvent.PV_MODIFIED:
|
|
case PvChangeEvent.PV_MANUAL_MOD:
|
|
fireTableRowsUpdated(rowId, rowId);
|
|
break;
|
|
|
|
case PvChangeEvent.PV_ADDED:
|
|
if (pv.size() == 1)
|
|
{
|
|
setProcessVar(pv);
|
|
} else
|
|
{
|
|
updateKeys(pv);
|
|
fireTableRowsInserted(rowId, rowId);
|
|
}
|
|
break;
|
|
|
|
case PvChangeEvent.PV_DELETED:
|
|
updateKeys(pv);
|
|
fireTableRowsDeleted(rowId, rowId);
|
|
break;
|
|
|
|
case PvChangeEvent.PV_CLEARED:
|
|
if (keys.length > 0)
|
|
{
|
|
updateKeys(pv);
|
|
}
|
|
// w/o data there are NO columns available -> structure change
|
|
fireTableStructureChanged();
|
|
break;
|
|
}
|
|
}
|
|
catch(Exception ex)
|
|
{
|
|
ex.printStackTrace();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* return column name of PID field
|
|
*
|
|
* @param column specified column number to get name for ...
|
|
*/
|
|
@Override
|
|
public String getColumnName(int column)
|
|
{
|
|
return (colHeaders[column]);
|
|
}
|
|
}
|