/* *****************************************************************************
* JFire - it's hot - Free ERP System - http://jfire.org *
* Copyright (C) 2004-2005 NightLabs - http://NightLabs.org *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2.1 of the License, or (at your option) any later version. *
* *
* This library 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 *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin St, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
* Or get it online : *
* http://www.gnu.org/copyleft/lesser.html *
* *
* *
******************************************************************************/
package org.nightlabs.jfire.reporting.ui.config;
import javax.jdo.JDOHelper;
import org.apache.log4j.Logger;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.base.ui.table.CheckboxCellEditorHelper;
import org.nightlabs.base.ui.table.TableLabelProvider;
import org.nightlabs.jfire.base.ui.jdo.tree.ActiveJDOObjectTreeComposite;
import org.nightlabs.jfire.base.ui.jdo.tree.ActiveJDOObjectTreeController;
import org.nightlabs.jfire.base.ui.jdo.tree.JDOObjectTreeContentProvider;
import org.nightlabs.jfire.base.ui.jdo.tree.JDOTreeNodesChangedEvent;
import org.nightlabs.jfire.base.ui.jdo.tree.JDOTreeNodesChangedEventHandler;
import org.nightlabs.jfire.reporting.config.ReportLayoutAvailEntry;
import org.nightlabs.jfire.reporting.config.ReportLayoutConfigModule;
import org.nightlabs.jfire.reporting.layout.ReportCategory;
import org.nightlabs.jfire.reporting.layout.ReportLayout;
import org.nightlabs.jfire.reporting.layout.ReportRegistryItem;
import org.nightlabs.jfire.reporting.layout.id.ReportRegistryItemID;
import org.nightlabs.jfire.reporting.ui.ReportingPlugin;
import org.nightlabs.jfire.reporting.ui.layout.ActiveReportRegistryItemTreeController;
import org.nightlabs.jfire.reporting.ui.layout.ReportRegistryItemNode;
import org.nightlabs.jfire.reporting.ui.layout.ReportRegistryItemTree;
import org.nightlabs.jfire.reporting.ui.resource.Messages;
import org.nightlabs.util.NLLocale;
/**
* ReportRegistryItem-Tree used for the {@link ReportLayoutConfigPreferencePage}. It has 'available'
* and 'default' cell-editors that modify the values in an {@link ReportLayoutConfigModule}.
*
* @author Alexander Bieber <alex[AT]nightlabs[DOT]de>
*
*/
public class ReportLayoutTree
extends ActiveJDOObjectTreeComposite<ReportRegistryItemID, ReportRegistryItem, ReportRegistryItemNode>
implements ICellModifier
{
/**
* LOG4J logger used by this class
*/
private static final Logger logger = Logger.getLogger(ReportLayoutTree.class);
private static class LabelProvider extends TableLabelProvider {
private ICellModifier cellModifier;
public LabelProvider(ICellModifier cellModifier) {
super();
this.cellModifier = cellModifier;
}
@Override
public Image getColumnImage(Object element, int columnIndex)
{
if (element instanceof ReportRegistryItemNode) {
ReportRegistryItemNode node = (ReportRegistryItemNode)element;
if (columnIndex != 0) {
if (node.getJdoObject() instanceof ReportLayout) {
if (columnIndex == 1)
return CheckboxCellEditorHelper.getCellEditorImage(cellModifier, element, PROPERTY_AVAILABLE);
else
return CheckboxCellEditorHelper.getCellEditorImage(cellModifier, element, PROPERTY_DEFAULT);
}
else
return null;
}
ReportRegistryItem item = node.getJdoObject();
if (item.getClass().equals(ReportCategory.class)) {
if (((ReportCategory)node.getJdoObject()).isInternal())
return SharedImages.getSharedImage(ReportingPlugin.getDefault(), ReportRegistryItemTree.class, "category-internal"); //$NON-NLS-1$
else
return SharedImages.getSharedImage(ReportingPlugin.getDefault(), ReportRegistryItemTree.class, "category-normal"); //$NON-NLS-1$
}
else if (item.getClass().equals(ReportLayout.class))
return SharedImages.getSharedImage(ReportingPlugin.getDefault(), ReportRegistryItemTree.class, "layout"); //$NON-NLS-1$
}
return super.getColumnImage(element, columnIndex);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
*/
public String getColumnText(Object element, int columnIndex)
{
if (element instanceof ReportRegistryItemNode) {
ReportRegistryItem item = ((ReportRegistryItemNode)element).getJdoObject();
switch(columnIndex) {
case 0: return item.getName().getText(NLLocale.getDefault().getLanguage());
case 1:
case 2:
return ""; //$NON-NLS-1$
}
}
return ""; //$NON-NLS-1$
}
}
private ReportLayoutConfigPreferencePage preferencePage;
public ReportLayoutTree(Composite parent, ReportLayoutConfigPreferencePage preferencePage) {
super(parent, DEFAULT_STYLE_SINGLE | SWT.FULL_SELECTION, true, true, true);
this.preferencePage = preferencePage;
}
public ReportLayoutTree(Composite parent, ReportLayoutConfigPreferencePage preferencePage, int treeStyle) {
super(parent, treeStyle, true, true, true);
this.preferencePage = preferencePage;
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.tree.AbstractTreeComposite#setTreeProvider(org.eclipse.jface.viewers.TreeViewer)
*/
@Override
public void setTreeProvider(TreeViewer treeViewer) {
treeViewer.setContentProvider(new JDOObjectTreeContentProvider<ReportRegistryItemID, ReportRegistryItem, ReportRegistryItemNode>() {
@Override
public boolean hasJDOObjectChildren(ReportRegistryItem jdoObject) {
return jdoObject instanceof ReportCategory;
}
});
treeViewer.setLabelProvider(new LabelProvider(this));
treeViewer.setCellModifier(this);
treeViewer.setColumnProperties(
new String[] {
null,
PROPERTY_AVAILABLE,
PROPERTY_DEFAULT
}
);
treeViewer.setCellEditors(
new CellEditor[] {
null,
new CheckboxCellEditor(treeViewer.getTree()),
new CheckboxCellEditor(treeViewer.getTree())
}
);
}
private static final String PROPERTY_AVAILABLE = "available"; //$NON-NLS-1$
private static final String PROPERTY_DEFAULT = "default"; //$NON-NLS-1$
private ActiveReportRegistryItemTreeController itemTreeController = new ActiveReportRegistryItemTreeController(null) {
@Override
protected void onJDOObjectsChanged(JDOTreeNodesChangedEvent<ReportRegistryItemID, ReportRegistryItemNode> changedEvent) {
JDOTreeNodesChangedEventHandler.handle(getTreeViewer(), changedEvent);
}
};
/* (non-Javadoc)
* @see org.nightlabs.base.ui.tree.AbstractTreeComposite#createTreeColumns(org.eclipse.swt.widgets.Tree)
*/
@Override
public void createTreeColumns(Tree tree) {
TreeColumn column = new TreeColumn(getTree(), SWT.LEFT);
column.setText(Messages.getString("org.nightlabs.jfire.reporting.ui.config.ReportLayoutTree.reportLayoutOrCategoryColumn.text")); //$NON-NLS-1$
column.setResizable(true);
// TODO: Set better width
column.setWidth(310);
TreeColumn availCol = new TreeColumn(getTree(), SWT.CENTER);
availCol.setText(Messages.getString("org.nightlabs.jfire.reporting.ui.config.ReportLayoutTree.availColumn.text")); //$NON-NLS-1$
availCol.setResizable(true);
// TODO: Set better width
availCol.setWidth(35);
TreeColumn defaultCol = new TreeColumn(getTree(), SWT.CENTER);
defaultCol.setText(Messages.getString("org.nightlabs.jfire.reporting.ui.config.ReportLayoutTree.defaultColumn.text")); //$NON-NLS-1$
defaultCol.setResizable(true);
// TODO: Set better width
defaultCol.setWidth(35);
}
private ReportRegistryItem getReportRegistryItem(Object element) {
return ((ReportRegistryItemNode)element).getJdoObject();
}
public boolean canModify(Object element, String property) {
logger.debug("getValue() called with "+property+" = "+element); //$NON-NLS-1$ //$NON-NLS-2$
ReportRegistryItem item = getReportRegistryItem(element);
if (item instanceof ReportLayout)
return true;
return false;
}
public Object getValue(Object element, String property) {
logger.debug("getValue() called with "+property+" = "+element); //$NON-NLS-1$ //$NON-NLS-2$
ReportRegistryItem item = getReportRegistryItem(element);
if (item == null || configModule == null)
return new Boolean(false);
ReportLayoutAvailEntry entry = configModule.getAvailEntry(item.getReportRegistryItemType());
if (entry == null)
return new Boolean(false);
if (PROPERTY_AVAILABLE.equals(property))
return new Boolean(entry.getAvailableReportLayoutKeys().contains(JDOHelper.getObjectId(item).toString()));
if (PROPERTY_DEFAULT.equals(property)) {
return new Boolean(
(entry.getDefaultReportLayoutKey() == null) ?
false:
entry.getDefaultReportLayoutKey().equals(JDOHelper.getObjectId(item).toString())
);
}
return new Boolean(false);
}
public void modify(Object element, String property, Object value) {
logger.debug("modify() called with "+property+" = "+value); //$NON-NLS-1$ //$NON-NLS-2$
ReportRegistryItem item = getReportRegistryItem(((TreeItem)element).getData());
if (item == null || configModule == null)
return;
ReportLayoutAvailEntry entry = configModule.getAvailEntry(item.getReportRegistryItemType());
if (PROPERTY_AVAILABLE.equals(property)) {
boolean isAvail = ((Boolean)value).booleanValue();
if (isAvail)
entry.getAvailableReportLayoutKeys().add(JDOHelper.getObjectId(item).toString());
else
entry.getAvailableReportLayoutKeys().remove(JDOHelper.getObjectId(item).toString());
}
else if (PROPERTY_DEFAULT.equals(property)) {
boolean isDefault = ((Boolean)value).booleanValue();
if (isDefault)
entry.setDefaultReportLayoutKey(JDOHelper.getObjectId(item).toString());
else
entry.setDefaultReportLayoutKey(null);
}
getTreeViewer().refresh(((TreeItem)element).getData(), true);
if (preferencePage != null)
preferencePage.setChanged(true);
}
private ReportLayoutConfigModule configModule;
public void setConfigModule(ReportLayoutConfigModule configModule) {
this.configModule = configModule;
boolean doExpand = getTreeViewer().getInput() == null;
Object[] expandedElements = getTreeViewer().getExpandedElements();
getTreeViewer().setInput(itemTreeController);
getTreeViewer().addTreeListener(new ITreeViewerListener() {
public void treeCollapsed(TreeExpansionEvent event) {
}
public void treeExpanded(TreeExpansionEvent event) {
event.getElement();
}
});
if (doExpand)
getTreeViewer().expandToLevel(3);
else
getTreeViewer().setExpandedElements(expandedElements);
}
@Override
protected ActiveJDOObjectTreeController<ReportRegistryItemID, ReportRegistryItem, ReportRegistryItemNode> getJDOObjectTreeController() {
return itemTreeController;
}
}