/*
* (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.components.tabularbrowser;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.openflexo.components.browser.BrowserConfiguration;
import org.openflexo.components.browser.BrowserElement;
import org.openflexo.components.browser.ConfigurableProjectBrowser;
import org.openflexo.components.tabular.model.AbstractColumn;
import org.openflexo.components.tabular.model.EditableColumn;
import org.openflexo.foundation.DataFlexoObserver;
import org.openflexo.foundation.DataModification;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.FlexoObservable;
/**
*
* A TabularBrowserModel defines a model that will be used to build a JTable or TabularBrowserView.
*
* @author sguerin
*/
public class TabularBrowserModel extends ConfigurableProjectBrowser implements TreeTableModel, DataFlexoObserver {
private static final Logger logger = Logger.getLogger(TabularBrowserModel.class.getPackage().getName());
private List<AbstractColumn<?, ?>> _columns;
private int _rowHeight = -1;
public TabularBrowserModel(BrowserConfiguration configuration, String browsableColumnName, int browsableColumnWidth) {
this(configuration, true, browsableColumnName, browsableColumnWidth);
}
public TabularBrowserModel(BrowserConfiguration configuration, boolean initNow, String browsableColumnName, int browsableColumnWidth) {
super(configuration, null, initNow);
_columns = new ArrayList<AbstractColumn<?, ?>>();
addToColumns(_browsableColumn = new TreeColumn(browsableColumnName, browsableColumnWidth));
}
private TreeColumn _browsableColumn;
protected TreeColumn getBrowsableColumn() {
return _browsableColumn;
}
protected class TreeColumn extends AbstractColumn<FlexoModelObject, TreeTableModel> implements
EditableColumn<FlexoModelObject, TreeTableModel> {
public TreeColumn(String title, int defaultWidth) {
this(title, defaultWidth, true);
}
public TreeColumn(String title, int defaultWidth, boolean isResizable) {
this(title, defaultWidth, isResizable, true);
}
public TreeColumn(String title, int defaultWidth, boolean isResizable, boolean displayTitle) {
super(title, defaultWidth, isResizable, displayTitle);
}
@Override
public Class<TreeTableModel> getValueClass() {
return TreeTableModel.class;
}
@Override
public TreeTableModel getValueFor(FlexoModelObject object) {
return TabularBrowserModel.this;
}
@Override
public void setValueFor(FlexoModelObject object, TreeTableModel value) {
// We dont care !
}
@Override
public boolean isCellEditableFor(FlexoModelObject object) {
return true;
}
@Override
public String toString() {
return "TreeColumn " + "@" + Integer.toHexString(hashCode());
}
}
@Override
public Object getRoot() {
return getRootElement();
}
@Override
public int getRowHeight() {
return _rowHeight;
}
@Override
public void setRowHeight(int aRowHeight) {
_rowHeight = aRowHeight;
}
public void addToColumns(AbstractColumn<?, ?> aColumn) {
_columns.add(aColumn);
}
public void insertColumnAtIndex(AbstractColumn<?, ?> aColumn, int index) {
_columns.add(index, aColumn);
}
public void removeFromColumns(AbstractColumn<?, ?> aColumn) {
_columns.remove(aColumn);
}
public AbstractColumn<?, ?> columnAt(int index) {
return _columns.get(index);
}
public int getTotalPreferredWidth() {
int returned = 0;
for (int i = 0; i < getColumnCount(); i++) {
returned += getDefaultColumnSize(i);
}
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 Object getValueAt(Object el, int col) {
if (el instanceof BrowserElement) {
BrowserElement element = (BrowserElement) el;
AbstractColumn column = columnAt(col);
return column.getValueFor(element.getObject());
}
logger.warning("TabularBrowserModel shound contain only BrowserElement instances " + el);
return null;
}
@Override
public Object getChild(Object parent, int index) {
if (parent instanceof BrowserElement) {
BrowserElement element = (BrowserElement) parent;
return element.getChildAt(index);
}
logger.warning("TabularBrowserModel shound contain only BrowserElement instances " + parent);
return null;
}
@Override
public int getChildCount(Object parent) {
if (parent instanceof BrowserElement) {
BrowserElement element = (BrowserElement) parent;
return element.getChildCount();
}
logger.warning("TabularBrowserModel shound contain only BrowserElement instances " + parent);
return 0;
}
@Override
public Class<?> getColumnClass(int col) {
return columnAt(col).getValueClass();
}
@Override
public boolean isCellEditable(Object element, int col) {
if (element instanceof BrowserElement) {
AbstractColumn column = columnAt(col);
return column.isCellEditableFor(((BrowserElement) element).getObject());
}
return false;
}
@Override
public void setValueAt(Object aValue, Object el, int col) {
if (el instanceof BrowserElement) {
BrowserElement element = (BrowserElement) el;
AbstractColumn column = columnAt(col);
if (column.isCellEditableFor(element.getObject()) && column instanceof EditableColumn) {
((EditableColumn) column).setValueFor(element.getObject(), aValue);
return;
}
}
logger.warning("TabularBrowserModel shound contain only BrowserElement instances " + el);
}
@Override
public void update(FlexoObservable observable, DataModification dataModification) {
// TODO Auto-generated method stub
}
@Override
public void update() {
logger.info("Update called");
super.update();
}
}