/**
*
*/
package org.nightlabs.jfire.scripting.ui;
import java.util.Collection;
import java.util.EnumSet;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.nightlabs.base.ui.layout.WeightedTableLayout;
import org.nightlabs.base.ui.table.AbstractTableComposite;
import org.nightlabs.base.ui.table.TableLabelProvider;
import org.nightlabs.jfire.scripting.IScriptParameter;
import org.nightlabs.jfire.scripting.ScriptParameter;
import org.nightlabs.jfire.scripting.ScriptParameterSet;
import org.nightlabs.jfire.scripting.ui.resource.Messages;
import org.nightlabs.util.CollectionUtil;
/**
* A table displaying ScriptParameters.
*
* @author Alexander Bieber <alex[AT]nightlabs[ÐOT]de>
* @author Vince<mato_cpe@hotmail.com>
*
*/
public class ScriptParameterTable
extends AbstractTableComposite<ScriptParameter>
{
private static class LabelProvider extends TableLabelProvider {
public String getColumnText(Object element, int columnIndex) {
if (element instanceof ScriptParameter) {
ScriptParameter parameter = (ScriptParameter)element;
switch (columnIndex) {
case 0: return parameter.getScriptParameterID();
case 1: return parameter.getScriptParameterClassName();
}
}
return "";
}
@Override
public String getText(Object element) {
return getColumnText(element,0);
}
}
private EnumSet<ScriptParameterTableOption> scriptParameterTableOptions;
private static EnumSet<ScriptParameterTableOption> createScriptParameterTableOptions(ScriptParameterTableOption ... options)
{
if (options == null || options.length == 0)
return EnumSet.noneOf(ScriptParameterTableOption.class);
return EnumSet.of(options[0], options);
}
public ScriptParameterTable(Composite parent, int style, ScriptParameterTableOption ... options) {
super(parent, style, false);
this.scriptParameterTableOptions = createScriptParameterTableOptions(options);
initTable();
}
protected ScriptParameterTable(Composite parent, int style, boolean initTable, ScriptParameterTableOption ... options) {
super(parent, style, false);
this.scriptParameterTableOptions = createScriptParameterTableOptions(options);
if (initTable)
initTable();
}
protected ScriptParameterTable(Composite parent, int style, boolean initTable, int viewerStyle, ScriptParameterTableOption ... options)
{
super(parent, style, false, viewerStyle);
this.scriptParameterTableOptions = createScriptParameterTableOptions(options);
if (initTable)
initTable();
}
public static final String KEY_COLUMN_ID = "param_id";
public static final String VALUE_COLUMN_ID = "param_name";
/* (non-Javadoc)
* @see org.nightlabs.base.ui.table.AbstractTableComposite#createTableColumns(org.eclipse.jface.viewers.TableViewer, org.eclipse.swt.widgets.Table)
*/
@Override
protected void createTableColumns(final TableViewer tableViewer, Table table) {
final TableColumn paramIDColumn = new TableColumn(table, SWT.LEFT);
paramIDColumn.setText(Messages.getString("org.nightlabs.jfire.scripting.ui.ScriptParameterTable.columnParameterID.name")); //$NON-NLS-1$
final TableColumn paramNameColumn = new TableColumn(table, SWT.LEFT);
paramNameColumn.setText(Messages.getString("org.nightlabs.jfire.scripting.ui.ScriptParameterTable.columnParameterType.name")); //$NON-NLS-1$
table.setLayout(new WeightedTableLayout(new int[]{1,1}));
tableViewer.setColumnProperties(new String[] {KEY_COLUMN_ID, VALUE_COLUMN_ID});
if (scriptParameterTableOptions.contains(ScriptParameterTableOption.editable)) {
tableViewer.setCellEditors(new CellEditor[] {new TextCellEditor(table), new TextCellEditor(table)});
tableViewer.setCellModifier(new ScriptParameterCellModifier());
}
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.table.AbstractTableComposite#setTableProvider(org.eclipse.jface.viewers.TableViewer)
*/
@Override
protected void setTableProvider(TableViewer tableViewer) {
tableViewer.setContentProvider(new ScriptParamentTableContentProvider());
tableViewer.setLabelProvider(new LabelProvider());
}
/**
* Sets the input to the parameters of the given ScriptParameterSet.
*
* @param scriptParameterSet
*/
@Override
public void setInput(Object input) {
if (!(input instanceof ScriptParameterSet))
throw new IllegalArgumentException("input must be an instance of ScriptParameterSet, but is: " + input); //$NON-NLS-1$
setScriptParameterSet((ScriptParameterSet)input);
}
private ScriptParameterSet scriptParameterSet;
public void setScriptParameterSet(ScriptParameterSet scriptParameterSet)
{
this.scriptParameterSet = scriptParameterSet;
super.setInput(scriptParameterSet);
}
private class ScriptParameterCellModifier implements ICellModifier {
@Override
public boolean canModify(Object element, String property) {
if(property.equals(VALUE_COLUMN_ID)){
return true;
}
return false;
}
@Override
public Object getValue(Object element, String property) {
if(property.equals(VALUE_COLUMN_ID)){
return ((ScriptParameter)element).getScriptParameterClassName();
}
return null;
}
@Override
public void modify(Object item, String property, Object value) {
TableItem tableItem = (TableItem)item;
ScriptParameter scriptParameter = (ScriptParameter)tableItem.getData();
if (property.equals(VALUE_COLUMN_ID)){
scriptParameter.setScriptParameterClassName((String)value);
}
getTableViewer().update(scriptParameter, new String[] { property });
fireModification();
}
}
protected class ScriptParamentTableContentProvider implements IStructuredContentProvider {
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof ScriptParameterSet) {
ScriptParameterSet scriptParameterSet = (ScriptParameterSet) inputElement;
Collection<IScriptParameter> parameters = scriptParameterSet.getSortedParameters();
return CollectionUtil.collection2TypedArray(parameters, IScriptParameter.class, false);
}
return null;
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
}
}
private ListenerList modificationListeners = new ListenerList();
public void addModificationListener(ModificationListener listener) {
modificationListeners.add(listener);
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.language.II18nTextEditor#removeModificationFinishedListener(org.nightlabs.base.ui.language.ModificationFinishedListener)
*/
public void removeModificationListener(ModificationListener listener) {
modificationListeners.remove(listener);
}
private void fireModification()
{
ModifyListenerEvent event = new ModifyListenerEvent(this);
for( int i=0; i< modificationListeners.size(); i++){
ModificationListener modifylistener = (ModificationListener)modificationListeners.getListeners()[i];
modifylistener.ModifyTextListener(event);
}
}
}