/*******************************************************************************
* Copyright (c) 2009-2010 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.hibernate.jpt.ui.internal.mapping.details;
import java.util.Iterator;
import java.util.ListIterator;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jpt.common.ui.internal.swt.ColumnAdapter;
import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveTablePane;
import org.eclipse.jpt.common.ui.internal.widgets.Pane;
import org.eclipse.jpt.common.utility.internal.iterator.EmptyListIterator;
import org.eclipse.jpt.common.utility.internal.model.value.CollectionPropertyValueModelAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.SimpleCollectionValueModel;
import org.eclipse.jpt.common.utility.internal.model.value.TransformationPropertyValueModel;
import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;
import org.eclipse.jpt.common.utility.model.value.ListValueModel;
import org.eclipse.jpt.common.utility.model.value.ModifiableCollectionValueModel;
import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel;
import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.jboss.tools.hibernate.jpt.core.internal.context.Parameter;
import org.jboss.tools.hibernate.jpt.core.internal.context.ParametrizedElement;
import org.jboss.tools.hibernate.jpt.ui.internal.utils.PaneVisibilityEnabler;
/**
* @author Dmitry Geraskov
*
*/
public class ParametersComposite extends Pane<ParametrizedElement> {
private ModifiableCollectionValueModel<Parameter> selectedParametersModel;
private PropertyValueModel<Parameter> selectedParameterModel;
/**
* Creates a new <code>ParametersComposite</code>.
*
* @param parentPane The parent pane of this one
* @param parent The parent container
*/
public ParametersComposite(Pane<?> parentPane,
Composite container, PropertyValueModel<? extends ParametrizedElement> generatorHolder) {
super(parentPane, generatorHolder, container);
}
private PropertyValueModel<Boolean> buildPaneEnableHolder() {
return new TransformationPropertyValueModel<ParametrizedElement, Boolean>(getSubjectHolder()) {
@Override
protected Boolean transform(ParametrizedElement element) {
return (element != null);
}
};
}
private Adapter<Parameter> buildParameterAdapter() {
return new AddRemoveTablePane.AbstractAdapter<Parameter>() {
// @Override
// public void addNewItem(ObjectListSelectionModel listSelectionModel) {
// Parameter parameter = getSubject().addParameter(getSubject().getParametersSize());
// ParametersComposite.this.parameterHolder.setValue(parameter);
// }
//
// @Override
// public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) {
// for (Object item : listSelectionModel.selectedValues()) {
// getSubject().removeParameter((Parameter) item);
// }
// }
@Override
public Parameter addNewItem() {
Parameter parameter = getSubject().addParameter(getSubject().getParametersSize());
// ParametersComposite.this.parameterHolder.setValue(parameter);
return parameter;
}
@Override
public void removeSelectedItems(
CollectionValueModel<Parameter> selectedItemsModel) {
Iterator<Parameter> iterator = selectedItemsModel.iterator();
while (iterator.hasNext()) {
Parameter parameter = iterator.next();
getSubject().removeParameter(parameter);
}
}
};
}
private ModifiableCollectionValueModel<Parameter> buildSelectedParametersModel() {
return new SimpleCollectionValueModel<Parameter>();
};
private ITableLabelProvider buildParameterLabelProvider() {
return new TableLabelProvider();
}
private ListValueModel<Parameter> buildParameterListHolder() {
return new ListAspectAdapter<ParametrizedElement, Parameter>(
getSubjectHolder(),
ParametrizedElement.PARAMETERS_LIST) {
@Override
protected ListIterator<Parameter> listIterator_() {
if (this.subject == null ){
return EmptyListIterator.instance();
} else {
return this.subject.getParameters().iterator();
}
}
@Override
protected int size_() {
return this.subject == null ? 0 : this.subject.getParametersSize();
}
};
}
@Override
protected void initialize() {
super.initialize();
this.selectedParametersModel = buildSelectedParametersModel();
this.selectedParameterModel = buildSelectedParameterModel(selectedParametersModel);
}
private PropertyValueModel<Parameter> buildSelectedParameterModel(CollectionValueModel<Parameter> selectedParametersModel) {
return new CollectionPropertyValueModelAdapter<Parameter, Parameter>(selectedParametersModel) {
@Override
protected Parameter buildValue() {
if (this.collectionModel.size() == 1) {
return this.collectionModel.iterator().next();
}
return null;
}
};
}
protected PropertyValueModel<Parameter> getSelectedParameterModel() {
return this.selectedParameterModel;
}
@Override
protected void initializeLayout(Composite container) {
TablePane tablePane = new TablePane(container);
installPaneEnabler(tablePane);
}
private PaneVisibilityEnabler installPaneEnabler(TablePane tablePane) {
return new PaneVisibilityEnabler(buildPaneEnableHolder(), tablePane);
}
private static class ParameterColumnAdapter implements ColumnAdapter<Parameter> {
static final int COLUMN_COUNT = 2;
static final int NAME_COLUMN_INDEX = 0;
static final int VALUE_COLUMN_INDEX = 1;
private ModifiablePropertyValueModel<String> buildNameHolder(Parameter subject) {
return new PropertyAspectAdapter<Parameter, String>(Parameter.NAME_PROPERTY, subject) {
@Override
protected String buildValue_() {
return this.subject.getName();
}
@Override
protected void setValue_(String value) {
this.subject.setName(value);
}
};
}
private ModifiablePropertyValueModel<?> buildValueHolder(Parameter subject) {
return new PropertyAspectAdapter<Parameter, String>(Parameter.VALUE_PROPERTY, subject) {
@Override
protected String buildValue_() {
return this.subject.getValue();
}
@Override
protected void setValue_(String value) {
this.subject.setValue(value);
}
};
}
@Override
public ModifiablePropertyValueModel<?>[] cellModels(Parameter subject) {
ModifiablePropertyValueModel<?>[] models = new ModifiablePropertyValueModel<?>[COLUMN_COUNT];
models[NAME_COLUMN_INDEX] = buildNameHolder(subject);
models[VALUE_COLUMN_INDEX] = buildValueHolder(subject);
return models;
}
@Override
public int columnCount() {
return COLUMN_COUNT;
}
@Override
public String columnName(int columnIndex) {
switch (columnIndex) {
case ParameterColumnAdapter.NAME_COLUMN_INDEX: {
return HibernateUIMappingMessages.ParametersComposite_nameColumn;
}
case ParameterColumnAdapter.VALUE_COLUMN_INDEX: {
return HibernateUIMappingMessages.ParametersComposite_valueColumn;
}
default: {
return null;
}
}
}
}
private class TableLabelProvider extends LabelProvider
implements ITableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
Parameter parameter = (Parameter) element;
String value = ""; //$NON-NLS-1$
switch (columnIndex) {
case ParameterColumnAdapter.NAME_COLUMN_INDEX: {
value = parameter.getName();
break;
}
case ParameterColumnAdapter.VALUE_COLUMN_INDEX: {
value = parameter.getValue();
break;
}
}
if (value == null) {
value = ""; //$NON-NLS-1$
}
return value;
}
}
private class TablePane extends AddRemoveTablePane<ParametrizedElement, Parameter> {
private TablePane(Composite parent) {
super(ParametersComposite.this,
parent,
buildParameterAdapter(),
buildParameterListHolder(),
ParametersComposite.this.selectedParametersModel,
buildParameterLabelProvider());
}
private CellEditor[] buildCellEditors(Table table) {
return new CellEditor[] {
new TextCellEditor(table),
new TextCellEditor(table)
};
}
private ICellModifier buildCellModifier() {
return new ICellModifier() {
@Override
public boolean canModify(Object element, String property) {
return true;
}
@Override
public Object getValue(Object element, String property) {
Parameter parameter = (Parameter) element;
String value = ""; //$NON-NLS-1$
if (property == Parameter.NAME_PROPERTY) {
value = parameter.getName();
}
else if (property == Parameter.VALUE_PROPERTY) {
value = parameter.getValue();
}
if (value == null) {
value = ""; //$NON-NLS-1$
}
return value;
}
@Override
public void modify(Object element, String property, Object value) {
Parameter parameter;
if (element instanceof TableItem) {
TableItem tableItem = (TableItem) element;
parameter = (Parameter) tableItem.getData();
}
else {
parameter = (Parameter) element;
}
if (property == Parameter.NAME_PROPERTY) {
parameter.setName(value.toString());
}
else if (property == Parameter.VALUE_PROPERTY) {
parameter.setValue(value.toString());
}
}
};
}
@Override
protected ColumnAdapter<Parameter> buildColumnAdapter() {
return new ParameterColumnAdapter();
}
private String[] buildColumnProperties() {
return new String[] {
Parameter.NAME_PROPERTY,
Parameter.VALUE_PROPERTY
};
}
@Override
protected void initializeMainComposite(Composite container,
Adapter<Parameter> adapter,
ListValueModel<?> listHolder,
ModifiableCollectionValueModel<Parameter> selectedItemHolder,
IBaseLabelProvider labelProvider,
String helpId) {
super.initializeMainComposite(
container,
adapter,
listHolder,
selectedItemHolder,
labelProvider,
helpId
);
Table table = getMainControl();
TableViewer tableViewer = new TableViewer(table);
tableViewer.setCellEditors(buildCellEditors(table));
tableViewer.setCellModifier(buildCellModifier());
tableViewer.setColumnProperties(buildColumnProperties());
}
}
}