/*******************************************************************************
* Copyright (c) 2011 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.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.jpt.common.ui.internal.swt.bindings.SWTBindingTools;
import org.eclipse.jpt.common.ui.internal.widgets.AddRemoveListPane;
import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.AbstractAdapter;
import org.eclipse.jpt.common.ui.internal.widgets.AddRemovePane.Adapter;
import org.eclipse.jpt.common.ui.internal.widgets.NewNameDialog;
import org.eclipse.jpt.common.ui.internal.widgets.NewNameDialogBuilder;
import org.eclipse.jpt.common.ui.internal.widgets.Pane;
import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;
import org.eclipse.jpt.common.utility.internal.model.value.CollectionPropertyValueModelAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.SimpleCollectionValueModel;
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.PropertyValueModel;
import org.eclipse.jpt.common.utility.transformer.Transformer;
import org.eclipse.jpt.jpa.ui.internal.details.GeneratorComposite.GeneratorBuilder;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.part.PageBook;
import org.jboss.tools.hibernate.jpt.core.internal.context.GenericGenerator;
import org.jboss.tools.hibernate.jpt.core.internal.context.HibernateGeneratorContainer;
import org.jboss.tools.hibernate.jpt.core.internal.context.HibernatePersistenceUnit;
import org.jboss.tools.hibernate.jpt.core.internal.context.java.HibernateGenericGeneratorContainer;
import org.jboss.tools.hibernate.jpt.core.internal.context.java.JavaDbGenericGenerator;
/**
* @author Dmitry Geraskov
*
*/
public class GenericGeneratorsComposite extends Pane<HibernateGenericGeneratorContainer> {
private AddRemoveListPane<HibernateGenericGeneratorContainer, JavaDbGenericGenerator> listPane;
Pane<?> genericGeneratorPane;
// private SimpleCollectionValueModel<GenericDbGenerator> generatorHolder;
private NewNameDialogBuilder dialogBuilder = null;
private ModifiableCollectionValueModel<JavaDbGenericGenerator> selectedGeneratorsModel;
private PropertyValueModel<JavaDbGenericGenerator> selectedGeneratorModel;
public GenericGeneratorsComposite(
Pane<?> parentPane,
PropertyValueModel<? extends HibernateGenericGeneratorContainer> subjectHolder,
Composite parent) {
// public GenericGeneratorsComposite(
// Pane<? extends Model> parentPane,
// PropertyValueModel<? extends HibernateGenericGeneratorContainer> subjectHolder,
// PropertyValueModel<Boolean> enabledModel,
// Composite parent) {
super((Pane<? extends HibernateGenericGeneratorContainer>) parentPane, parent);
dialogBuilder = new NewNameDialogBuilder(getShell());
dialogBuilder.setDialogTitle(HibernateUIMappingMessages.GenericGeneratorsComposite_dialogTitle);
dialogBuilder.setDescriptionTitle(HibernateUIMappingMessages.GenericGeneratorsComposite_DescriptionTitle);
dialogBuilder.setDescription(HibernateUIMappingMessages.GenericGeneratorsComposite_Description);
dialogBuilder.setLabelText(HibernateUIMappingMessages.GenericGeneratorsComposite_Name);
}
JavaDbGenericGenerator addGenericDbGenerator() {
return addGenericGeneratorFromDialog(buildAddGenericGeneratorDialog());
}
protected HibernatePersistenceUnit getPersistenceUnit(){
return (HibernatePersistenceUnit)this.getSubject().getPersistenceUnit();
}
protected NewNameDialog buildAddGenericGeneratorDialog() {
dialogBuilder.setExistingNames(getPersistenceUnit().getUniqueGeneratorNames().iterator());
return dialogBuilder.buildDialog();
}
protected JavaDbGenericGenerator addGenericGeneratorFromDialog(NewNameDialog dialog) {
if (dialog.open() != Window.OK) {
return null;
}
JavaDbGenericGenerator generator = this.getSubject().addGenericGenerator();
generator.setName(dialog.getName());
// this.getGenericGeneratorHolder().setValue(generator);//so that it gets selected in the List for the user to edit
return generator;
}
private ListValueModel<GenericGenerator> buildDisplayableGenericGeneratorsListHolder() {
return new ItemPropertyListValueModelAdapter<GenericGenerator>(
buildGenericGeneratorsListHolder(),
GenericGenerator.NAME_PROPERTY
);
}
private AddRemoveListPane<HibernateGenericGeneratorContainer, JavaDbGenericGenerator> addListPane(Composite container) {
return new AddRemoveListPane<HibernateGenericGeneratorContainer, JavaDbGenericGenerator>(
this,
container,
buildGenericGeneratorsAdapter(),
buildDisplayableGenericGeneratorsListHolder(),
this.selectedGeneratorsModel,
buildGenericGeneratorsListLabelProvider());
// return new AddRemoveListPane<HibernateGeneratorContainer, GenericGenerator>(
// this,
// container,
// buildGenericGeneratorsAdapter(),
// buildDisplayableGenericGeneratorsListHolder(),
// this.getGenericGeneratorHolder(),
// buildGenericGeneratorsListLabelProvider(),
// (String)null
// );
}
private ListValueModel<GenericGenerator> buildGenericGeneratorsListHolder() {
return new ListAspectAdapter<HibernateGeneratorContainer, GenericGenerator>(
getSubjectHolder(),
HibernateGeneratorContainer.GENERIC_GENERATORS_LIST)
{
@Override
protected ListIterator<GenericGenerator> listIterator_() {
return (ListIterator<GenericGenerator>) this.subject.getGenericGenerators().iterator();
}
@Override
protected int size_() {
return this.subject.getGenericGeneratorsSize();
}
};
}
private Transformer<GenericGenerator, Control> buildPaneTransformer() {
return new Transformer<GenericGenerator, Control>() {
public Control transform(GenericGenerator generator) {
if (generator == null) {
return null;
}
return GenericGeneratorsComposite.this.genericGeneratorPane.getControl();
}
};
}
private Adapter<JavaDbGenericGenerator> buildGenericGeneratorsAdapter() {
return new AbstractAdapter<JavaDbGenericGenerator>() {
public JavaDbGenericGenerator addNewItem() {
return addGenericDbGenerator();
}
public void removeSelectedItems(
CollectionValueModel<JavaDbGenericGenerator> selectedItemsModel) {
Iterator<JavaDbGenericGenerator> iterator = selectedItemsModel.iterator();
while (iterator.hasNext()) {
getSubject().removeGenericGenerator(iterator.next());
}
}
};
}
private ILabelProvider buildGenericGeneratorsListLabelProvider() {
return new LabelProvider() {
@Override
public String getText(Object element) {
GenericGenerator generator = (GenericGenerator) element;
String name = generator.getName();
if (name == null) {
int index = IterableTools.indexOf(getSubject().getGenericGenerators(), generator);
name = NLS.bind(HibernateUIMappingMessages.GenericGeneratorsComposite_displayString, Integer.valueOf(index));
}
return name;
}
};
}
// private SimpleCollectionValueModel<GenericDbGenerator> buildGenericGeneratorHolder() {
// return new SimpleCollectionValueModel<GenericDbGenerator>();
// }
/* @Override
public void enableWidgets(boolean enabled) {
super.enableWidgets(enabled);
this.listPane.enableWidgets(enabled);
}
*/
@Override
protected void initialize() {
super.initialize();
// this.generatorHolder = buildGenericGeneratorHolder();
this.selectedGeneratorsModel = this.buildSelectedGeneratorsModel();
this.selectedGeneratorModel = this.buildSelectedGeneratorModel(this.selectedGeneratorsModel);
}
private ModifiableCollectionValueModel<JavaDbGenericGenerator> buildSelectedGeneratorsModel() {
return new SimpleCollectionValueModel<JavaDbGenericGenerator>();
}
private PropertyValueModel<JavaDbGenericGenerator> buildSelectedGeneratorModel(CollectionValueModel<JavaDbGenericGenerator> selectedGeneratorsModel) {
return new CollectionPropertyValueModelAdapter<JavaDbGenericGenerator, JavaDbGenericGenerator>(selectedGeneratorsModel) {
@Override
protected JavaDbGenericGenerator buildValue() {
if (this.collectionModel.size() == 1) {
return this.collectionModel.iterator().next();
}
return null;
}
};
}
@Override
protected void initializeLayout(Composite container) {
// List pane
this.listPane = this.addListPane(container);
// Property pane
PageBook pageBook = new PageBook(container, SWT.NULL);
pageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Named GenericGenerator property pane
this.genericGeneratorPane = this.buildGenericGeneratorComposite(pageBook);
installPaneSwitcher(pageBook);
}
protected Pane<? extends JavaDbGenericGenerator> buildGenericGeneratorComposite(PageBook pageBook) {
return new GenericGeneratorComposite(
this,
(PropertyValueModel<JavaDbGenericGenerator>) this.selectedGeneratorModel,
pageBook,
buildGenericGeneratorBuilder()
);
}
protected GeneratorBuilder<JavaDbGenericGenerator> buildGenericGeneratorBuilder() {
return new GeneratorBuilder<JavaDbGenericGenerator>() {
public JavaDbGenericGenerator addGenerator() {
HibernateGenericGeneratorContainer container = (HibernateGenericGeneratorContainer)getSubject();
JavaDbGenericGenerator generator = container.addGenericGenerator(container.getGenericGeneratorsSize());
// generatorHolder.setValue(generator);
return generator;
}
};
}
private void installPaneSwitcher(PageBook pageBook) {
SWTBindingTools.bind(this.getGenericGeneratorHolder(), this.buildPaneTransformer(), pageBook);
}
protected PropertyValueModel<JavaDbGenericGenerator> getGenericGeneratorHolder() {
return this.selectedGeneratorModel;
}
}