/* PropertySheetModel.java created 2007-09-11
*
*/
package org.signalml.app.model.components;
import static org.signalml.app.util.i18n.SvarogI18n._;
import java.awt.Component;
import java.beans.IntrospectionException;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.List;
import javax.swing.JTree;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.tree.TreePath;
import org.apache.log4j.Logger;
import org.signalml.app.view.workspace.ViewerTabbedPane;
import org.signalml.plugin.export.view.ViewerTreePane;
import org.signalml.util.FormatUtils;
import org.springframework.context.MessageSourceResolvable;
/** PropertySheetModel
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class PropertySheetModel extends AbstractTableModel implements TreeSelectionListener, ChangeListener {
private static final long serialVersionUID = 1L;
protected static final Logger logger = Logger.getLogger(PropertySheetModel.class);
private PropertyProvider subject;
private LabelledPropertyDescriptor[] descriptors;
private String[] labels;
private PropertyEditor[] editors;
private DecimalFormat numberFormat;
private TreePath treePath = null;
@Override
public String getColumnName(int col) {
switch (col) {
case 0 :
return _("Property name");
case 1 :
return _("Value");
default:
return "???";
}
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
if (subject == null) {
return 0;
}
return descriptors.length;
}
@Override
public Object getValueAt(int row, int col) {
switch (col) {
case 0 :
if (labels[row] == null) {
labels[row] = descriptors[row].getDefaultMessage();
}
return labels[row];
case 1 :
Object value;
try {
value = descriptors[row].getReadMethod().invoke(subject);
} catch (IllegalArgumentException ex) {
logger.error("Failed to invoke getter", ex);
return "???";
} catch (IllegalAccessException ex) {
logger.error("Failed to invoke getter", ex);
return "???";
} catch (InvocationTargetException ex) {
logger.error("Getter threw exception", ex.getCause());
return "???";
}
if (value == null) {
return "-";
}
if (editors[row] == null) {
editors[row] = descriptors[row].createPropertyEditor(subject);
}
if (editors[row] == null) {
if (value instanceof String) {
return value;
}
if (value instanceof Number) {
if (numberFormat == null) {
return value.toString();
} else {
return numberFormat.format(value);
}
}
if (value instanceof Boolean) {
if (((Boolean) value).booleanValue()) {
return _("Yes");
} else {
return _("No");
}
}
if (value instanceof Date) {
return FormatUtils.formatTime((Date) value);
}
if (value instanceof File) {
return ((File) value).getAbsolutePath();
}
if (value instanceof MessageSourceResolvable) {
return ((MessageSourceResolvable) value).getDefaultMessage();
}
editors[row] = PropertyEditorManager.findEditor(descriptors[row].getPropertyType());
if (editors[row] == null) {
editors[row] = new ToStringPropertyEditor(subject);
}
}
if (editors[row] instanceof TreePathAwarePropertyEditor) {
((TreePathAwarePropertyEditor) editors[row]).setTreePath(treePath);
}
editors[row].setValue(value);
String text = editors[row].getAsText();
return (text != null ? text : "???");
default:
return "???";
}
}
public PropertyProvider getSubject() {
return subject;
}
public void setSubject(PropertyProvider subject) {
if (this.subject != subject) {
this.subject = subject;
if (subject != null) {
List<LabelledPropertyDescriptor> list = null;
try {
list = subject.getPropertyList();
} catch (IntrospectionException ex) {
logger.error("Failed to get properties", ex);
setSubject(null);
return;
}
descriptors = new LabelledPropertyDescriptor[list.size()];
list.toArray(descriptors);
labels = new String[descriptors.length];
editors = new PropertyEditor[descriptors.length];
} else {
subject = null;
descriptors = new LabelledPropertyDescriptor[0];
labels = new String[0];
editors = new PropertyEditor[0];
}
fireTableDataChanged();
}
}
public void setTreePath(TreePath path) {
this.treePath = path;
if (path != null) {
Object component = path.getLastPathComponent();
if (component instanceof PropertyProvider) {
setSubject((PropertyProvider) component);
return;
}
}
setSubject(null);
}
public DecimalFormat getNumberFormat() {
return numberFormat;
}
public void setNumberFormat(DecimalFormat numberFormat) {
if (this.numberFormat != numberFormat) {
this.numberFormat = numberFormat;
fireTableDataChanged();
}
}
@Override
public void valueChanged(TreeSelectionEvent e) {
setTreePath(e.getNewLeadSelectionPath());
}
@Override
public void stateChanged(ChangeEvent e) {
Object source = e.getSource();
if (source instanceof ViewerTabbedPane) {
ViewerTabbedPane viewerTabbedPane = (ViewerTabbedPane) source;
Component selection = viewerTabbedPane.getSelectedComponent();
if (selection instanceof ViewerTreePane) {
ViewerTreePane viewerTreePane = (ViewerTreePane) selection;
JTree tree = viewerTreePane.getTree();
setTreePath(tree.getSelectionPath());
}
}
}
}