package org.cristalise.gui.graph.view; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import javax.swing.JOptionPane; import javax.swing.event.TableModelEvent; import javax.swing.table.AbstractTableModel; import org.cristalise.kernel.utils.CastorHashMap; import org.cristalise.kernel.utils.Language; /************************************************************************** * * $Revision: 1.4 $ * $Date: 2005/08/02 07:50:10 $ * * Copyright (C) 2003 CERN - European Organization for Nuclear Research * All rights reserved. **************************************************************************/ public class PropertyTableModel extends AbstractTableModel { private final String[] mColumnNames = { Language.translate("Name"), Language.translate("Value"), Language.translate("Abstract") }; public CastorHashMap sourceMap = new CastorHashMap(); public ArrayList sortedNameList = new ArrayList(); boolean isEditable = false; public PropertyTableModel() { super(); } @Override public int getColumnCount() { return mColumnNames.length; } @Override public String getColumnName(int col) { return mColumnNames[col]; } @Override public int getRowCount() { synchronized (sourceMap) { return sourceMap.size(); } } @Override public Object getValueAt(int rowIndex, int colIndex) { synchronized (sourceMap) { String rowName = sortedNameList.get(rowIndex); switch (colIndex) { case 0: return rowName; case 1: return sourceMap.get(rowName); case 2: return sourceMap.getAbstract().contains(rowName); default: return ""; } } } @Override public void setValueAt(Object value, int rowIndex, int colIndex) { synchronized (sourceMap) { if (colIndex == 0) return; String rowName = sortedNameList.get(rowIndex); if (colIndex == 1) { Class oldElement = sourceMap.get(rowName).getClass(); if (oldElement == Double.class && value.getClass() == String.class) try { value = Double.valueOf((String)value); } catch (Exception ex) { } if (value.getClass() != oldElement) JOptionPane.showMessageDialog(null, "This property should contain a "+oldElement.getName()+" not a "+value.getClass().getName(), "Incorrect datatype", JOptionPane.ERROR_MESSAGE); else sourceMap.put(rowName, value); } else if (colIndex == 2) { Boolean boolVal = (Boolean)value; if (boolVal) sourceMap.getAbstract().add(rowName); else sourceMap.getAbstract().remove(rowName); } } fireTableCellUpdated(rowIndex, colIndex); } @Override public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 2: return Boolean.class; default: return String.class; } } public void setMap(CastorHashMap props) { synchronized (sourceMap) { sourceMap = props; sortedNameList = new ArrayList(props.size()); for (String string : props.keySet()) sortedNameList.add(string); Collections.sort(sortedNameList, new Comparator() { @Override public int compare(String o1, String o2) { return (o1.compareToIgnoreCase(o2)); } }); } fireTableChanged(new TableModelEvent(this)); } @Override public boolean isCellEditable(int row, int col) { return col>0 && isEditable; } /** * @return Returns the isEditable. */ public boolean isEditable() { return isEditable; } /** * @param isEditable The isEditable to set. */ public void setEditable(boolean isEditable) { this.isEditable = isEditable; } /** * @param text * @param object */ public void addProperty(String text, Object object, boolean isAbstract) { sourceMap.put(text, object, isAbstract); setMap(sourceMap); } /** * @param object */ public void delProperty(Object propName) { sourceMap.remove(propName); setMap(sourceMap); } }