/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.inspector.widget.propertylist;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.EventListenerList;
import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import org.openflexo.inspector.AbstractController;
import org.openflexo.inspector.InspectableObject;
import org.openflexo.inspector.model.PropertyListColumn;
import org.openflexo.inspector.model.PropertyListModel;
/**
* Please comment this class
*
* @author sguerin
*
*/
public class PropertyListTableModel extends DefaultTableModel {
private static final Logger logger = Logger.getLogger(PropertyListTableModel.class.getPackage().getName());
private List _values;
private Vector _columns;
// private JPanel controlPanel;
private PropertyListWidgetFooter _footer;
private PropertyListModel _propertyListModel;
private PropertyListWidget _widget;
/**
* Stores controls: key is the JButton and value the PropertyListActionListener
*/
// private Hashtable<JButton,PropertyListActionListener> _controls;
public PropertyListTableModel(PropertyListModel propertyListModel, PropertyListWidget widget, AbstractController controller) {
super();
_propertyListModel = propertyListModel;
_widget = widget;
_values = null;
_columns = new Vector();
for (Enumeration en = propertyListModel.getColumns().elements(); en.hasMoreElements();) {
PropertyListColumn plColumn = (PropertyListColumn) en.nextElement();
addToColumns(plColumn.getTableColumn(controller));
}
_footer = new PropertyListWidgetFooter(propertyListModel, this, widget);
/*
controlPanel = null;
_controls = new Hashtable<JButton, PropertyListActionListener>();
for (Enumeration en = propertyListModel.getActions().elements(); en.hasMoreElements();) {
PropertyListAction plAction = (PropertyListAction) en.nextElement();
addToActions(plAction);
}*/
}
public List getValues() {
return _values;
}
private static final Vector EMPTY_VECTOR = new Vector();
public void setValues(List values) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("setValues() with " + values);
}
List newValues = values;
if (values == null) {
newValues = EMPTY_VECTOR;
}
List oldValues = _values;
_values = newValues;
fireModelObjectHasChanged(oldValues, newValues);
fireTableDataChanged();
}
/**
* Notifies all listeners that represented model has changed
*
* @see TableModelEvent
* @see EventListenerList
* @see javax.swing.JTable#tableChanged(TableModelEvent)
*/
public void fireModelObjectHasChanged(List oldValues, List newValues) {
fireTableChanged(new ModelObjectHasChanged(this, oldValues, newValues));
}
public class ModelObjectHasChanged extends TableModelEvent {
private List _oldValues;
private List _newValues;
public ModelObjectHasChanged(TableModel source, List oldValues, List newValues) {
super(source);
_oldValues = oldValues;
_newValues = newValues;
}
public List getNewValues() {
return _newValues;
}
public List getOldValues() {
return _oldValues;
}
}
@Override
public int getRowCount() {
if (getValues() != null) {
return getValues().size();
}
return 0;
}
public InspectableObject elementAt(int row) {
if (getValues() != null && row >= 0 && row < getValues().size()) {
Object returned = getValues().get(row);
if (returned instanceof InspectableObject) {
// logger.info("element at "+row+" is "+returned);
return (InspectableObject) returned;
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Found a non-inspectable object in a inspectable property-list");
}
}
}
return null;
}
public int indexOf(InspectableObject object) {
for (int i = 0; i < getRowCount(); i++) {
InspectableObject obj = elementAt(i);
if (obj == object) {
return i;
}
}
return -1;
}
public void addToColumns(AbstractColumn aColumn) {
_columns.add(aColumn);
aColumn.setModel(this);
}
public void removeFromColumns(AbstractColumn aColumn) {
_columns.remove(aColumn);
aColumn.setModel(null);
}
public AbstractColumn columnAt(int index) {
AbstractColumn returned = (AbstractColumn) _columns.elementAt(index);
return returned;
}
@Override
public int getColumnCount() {
return _columns.size();
}
@Override
public String getColumnName(int col) {
AbstractColumn column = columnAt(col);
if (column != null) {
return column.getLocalizedTitle();
}
return "???";
}
public int getDefaultColumnSize(int col) {
AbstractColumn column = columnAt(col);
if (column != null) {
return column.getDefaultWidth();
}
return 75;
}
public boolean getColumnResizable(int col) {
AbstractColumn column = columnAt(col);
if (column != null) {
return column.getResizable();
}
return true;
}
@Override
public Class getColumnClass(int col) {
AbstractColumn column = columnAt(col);
if (column != null) {
return column.getValueClass();
}
return null;
}
@Override
public boolean isCellEditable(int row, int col) {
AbstractColumn column = columnAt(col);
if (column != null) {
InspectableObject object = elementAt(row);
return column.isCellEditableFor(object);
}
return false;
}
@Override
public Object getValueAt(int row, int col) {
AbstractColumn column = columnAt(col);
if (column != null) {
InspectableObject object = elementAt(row);
return column.getValueFor(object);
}
return null;
}
@Override
public void setValueAt(Object value, int row, int col) {
AbstractColumn column = columnAt(col);
if (column != null && column instanceof EditableColumn) {
InspectableObject object = elementAt(row);
((EditableColumn) column).setValueFor(object, value);
fireCellUpdated(object, row, col);
}
}
public void fireCellUpdated(InspectableObject editedObject, int row, int column) {
// fireTableChanged(new TableModelEvent(this, row, row, column));
int newRow = indexOf(editedObject);
if (logger.isLoggable(Level.FINE)) {
logger.fine("editedObject=" + editedObject);
logger.fine("row was " + row);
logger.fine("new row is " + newRow);
}
if (row != newRow) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("row changed !");
}
fireTableChanged(new RowMoveForObjectEvent(this, editedObject, newRow, column));
}
}
public class RowMoveForObjectEvent extends TableModelEvent {
private InspectableObject _editedObject;
private int _newRow;
private int _column;
public RowMoveForObjectEvent(TableModel source, InspectableObject editedObject, int newRow, int column) {
super(source);
_editedObject = editedObject;
_column = column;
_newRow = newRow;
}
public InspectableObject getEditedObject() {
return _editedObject;
}
@Override
public int getColumn() {
return _column;
}
public int getNewRow() {
return _newRow;
}
}
/* protected class PropertyListCellRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component returned = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
AbstractColumn col = get
if (returned instanceof JComponent)
((JComponent)returned).setToolTipText(getLocalizedTooltip(getModel().elementAt(row)));
return returned;
}
}
*/
/* protected void addToActions(PropertyListAction plAction)
{
PropertyListActionListener plActionListener = new PropertyListActionListener(plAction, this);
JButton newButton = new JButton();
newButton.setText(FlexoLocalization.localizedForKey(plAction.name, newButton));
if (plAction.help!=null)
newButton.setToolTipText(FlexoLocalization.localizedForKey(plAction.help, newButton));
newButton.addActionListener(plActionListener);
getControlPanel().add(newButton);
_controls.put(newButton, plActionListener);
updateControls(null);
}
public Enumeration<PropertyListActionListener> getActionListeners() {
return _controls.elements();
}*/
protected PropertyListWidgetFooter getFooter() {
return _footer;
/* if (controlPanel == null) {
controlPanel = new JPanel() {
@Override
public void remove(int index)
{
super.remove(index);
}
};
controlPanel.setLayout(new FlowLayout());
controlPanel.setOpaque(false);
}
return controlPanel;*/
}
private InspectableObject _selectedObject;
private Vector<InspectableObject> selectedObjects;
protected InspectableObject getSelectedObject() {
return _selectedObject;
}
protected void setSelectedObject(InspectableObject selectedObject) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("setSelectedObject with " + selectedObject);
}
_selectedObject = selectedObject;
_footer.handleSelectionChanged();
/*for (Enumeration en = _controls.elements(); en.hasMoreElements();) {
PropertyListActionListener actionListener = (PropertyListActionListener) en.nextElement();
actionListener.setSelectedObject(selectedObject);
}
updateControls(selectedObject);*/
}
protected Vector<InspectableObject> getSelectedObjects() {
return selectedObjects;
}
protected void setSelectedObjects(Vector<InspectableObject> selectedObject) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("setSelectedObjects with " + selectedObject);
}
this.selectedObjects = selectedObject;
_footer.handleSelectionChanged();
/*for (Enumeration en = _controls.elements(); en.hasMoreElements();) {
PropertyListActionListener actionListener = (PropertyListActionListener) en.nextElement();
actionListener.setSelectedObjects(selectedObjects);
}*/
}
protected void setSelectedIndex(int selectedIndex) {
InspectableObject selectedObject = elementAt(selectedIndex);
setSelectedObject(selectedObject);
}
protected void setModel(InspectableObject model) {
_footer.setModel(model);
/* for (Enumeration en = _controls.elements(); en.hasMoreElements();) {
PropertyListActionListener actionListener = (PropertyListActionListener) en.nextElement();
actionListener.setModel(model);
}
updateControls(null);*/
}
public PropertyListColumn getPropertyListColumnWithTitle(String title) {
return _propertyListModel.getPropertyListColumnWithTitle(title);
}
@Override
public void fireTableRowsUpdated(int firstRow, int lastRow) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("fireTableRowsUpdated firstRow=" + firstRow + " lastRow=" + lastRow);
}
if (firstRow > -1 && lastRow > -1) {
super.fireTableRowsUpdated(firstRow, lastRow);
}
}
protected PropertyListWidget getPropertyListWidget() {
return _widget;
}
}