/******************************************************************************* * 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.Arrays; 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.Adapter; 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.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.HibernatePersistenceUnit; import org.jboss.tools.hibernate.jpt.core.internal.context.java.HibernateJavaTypeDefContainer; import org.jboss.tools.hibernate.jpt.core.internal.context.java.JavaTypeDef; import org.jboss.tools.hibernate.jpt.ui.internal.widgets.EnterNameDialog; /** * @author Dmitry Geraskov * */ public class TypeDefsComposite extends Pane<HibernateJavaTypeDefContainer> { // private AddRemoveListPane<HibernateJavaTypeDefContainer, JavaTypeDef> listPane; Pane<? extends JavaTypeDef> typeDefPane; // private ModifiablePropertyValueModel<JavaTypeDef> typeDefHolder; private NewNameDialogBuilder dialogBuilder = null; private ModifiableCollectionValueModel<JavaTypeDef> selectedTypeDefsModel; private PropertyValueModel<JavaTypeDef> selectedTypeDefModel; public TypeDefsComposite( Pane<?> parentPane, PropertyValueModel<? extends HibernateJavaTypeDefContainer> subjectHolder, Composite parent) { super(parentPane, subjectHolder, parent); } // void addTypeDef() { // addTypeDefFromDialog(buildAddTypeDefDialog()); // } JavaTypeDef addTypeDef() { return addTypeDefFromDialog(buildAddTypeDefDialog()); } protected HibernatePersistenceUnit getPersistenceUnit(){ return (HibernatePersistenceUnit)this.getSubject().getPersistenceUnit(); } protected EnterNameDialog buildAddTypeDefDialog() { return new EnterNameDialog( this.getShell(), getResourceManager(), HibernateUIMappingMessages.TypeDefsComposite_DescriptionTitle, HibernateUIMappingMessages.TypeDefsComposite_dialogTitle, null, HibernateUIMappingMessages.TypeDefsComposite_Description, HibernateUIMappingMessages.TypeDefsComposite_Name, HibernateUIMappingMessages.TypeDefsComposite_Name, Arrays.asList(getPersistenceUnit().uniqueTypeDefNames()) ); } // protected void addTypeDefFromDialog(NewNameDialog dialog) { // if (dialog.open() != Window.OK) { // return; // } // JavaTypeDef typeDef = this.getSubject().addTypeDef(); // typeDef.setName(dialog.getName()); // this.getTypeDefHolder().setValue(typeDef);//so that it gets selected in the List for the user to edit // } protected JavaTypeDef addTypeDefFromDialog(EnterNameDialog dialog) { if (dialog.open() != Window.OK) { return null; } JavaTypeDef typeDef = this.getSubject().addTypeDef(); typeDef.setName(dialog.getName()); // this.getTypeDefHolder().setValue(typeDef);//so that it gets selected in the List for the user to edit return typeDef; } private ListValueModel<JavaTypeDef> buildDisplayableTypeDefsListHolder() { return new ItemPropertyListValueModelAdapter<JavaTypeDef>( buildTypeDefsListHolder(), JavaTypeDef.NAME_PROPERTY ); } private AddRemoveListPane<HibernateJavaTypeDefContainer, JavaTypeDef> addListPane(Composite container) { return new AddRemoveListPane<HibernateJavaTypeDefContainer, JavaTypeDef>( this, container, buildTypeDefsAdapter(), buildDisplayableTypeDefsListHolder(), this.selectedTypeDefsModel, buildTypeDefsListLabelProvider() ); } private ListValueModel<JavaTypeDef> buildTypeDefsListHolder() { return new ListAspectAdapter<HibernateJavaTypeDefContainer, JavaTypeDef>( getSubjectHolder(), HibernateJavaTypeDefContainer.TYPE_DEFS_LIST) { @Override protected ListIterator<JavaTypeDef> listIterator_() { return this.subject.getTypeDefs().iterator(); } @Override protected int size_() { return this.subject.getTypeDefsSize(); } }; } private Transformer<JavaTypeDef, Control> buildPaneTransformer() { return new Transformer<JavaTypeDef, Control>() { public Control transform(JavaTypeDef typeDef) { if (typeDef == null) { return null; } return TypeDefsComposite.this.typeDefPane.getControl(); } }; } private Adapter<JavaTypeDef> buildTypeDefsAdapter() { return new AddRemoveListPane.AbstractAdapter<JavaTypeDef>() { // public void addNewItem(ObjectListSelectionModel listSelectionModel) { // addTypeDef(); // } // public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) { // for (Object item : listSelectionModel.selectedValues()) { // if (item instanceof JavaTypeDef) { // getSubject().removeTypeDef((JavaTypeDef) item); // } // } // } @Override public JavaTypeDef addNewItem() { return addTypeDef(); } @Override public void removeSelectedItems( CollectionValueModel<JavaTypeDef> selectedItemsModel) { Iterator<JavaTypeDef> iterator = selectedItemsModel.iterator(); while (iterator.hasNext()) { getSubject().removeTypeDef(iterator.next()); } } }; } private ILabelProvider buildTypeDefsListLabelProvider() { return new LabelProvider() { @Override public String getText(Object element) { JavaTypeDef typeDef = (JavaTypeDef) element; String name = typeDef.getName(); if (name == null) { int index = IterableTools.indexOf(getSubject().getTypeDefs(), typeDef); name = NLS.bind(HibernateUIMappingMessages.TypeDefsComposite_displayString, Integer.valueOf(index)); } return name; } }; } // private ModifiablePropertyValueModel<JavaTypeDef> buildTypeDefHolder() { // return new SimplePropertyValueModel<JavaTypeDef>(); // } // @Override // public void enableWidgets(boolean enabled) { // super.enableWidgets(enabled); // this.listPane.enableWidgets(enabled); // } @Override protected void initialize() { super.initialize(); this.selectedTypeDefsModel = this.buildSelectedTypeDefsModel(); this.selectedTypeDefModel = this.buildSelectedTypeDefModel(this.selectedTypeDefsModel); // this.typeDefHolder = buildTypeDefHolder(); } private ModifiableCollectionValueModel<JavaTypeDef> buildSelectedTypeDefsModel() { return new SimpleCollectionValueModel<JavaTypeDef>(); } private PropertyValueModel<JavaTypeDef> buildSelectedTypeDefModel(CollectionValueModel<JavaTypeDef> selectedTypeDefsModel) { return new CollectionPropertyValueModelAdapter<JavaTypeDef, JavaTypeDef>(selectedTypeDefsModel) { @Override protected JavaTypeDef 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); addListPane(container); // Property pane PageBook pageBook = new PageBook(container, SWT.NULL); pageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Named JavaTypeDef property pane this.typeDefPane = this.buildTypeDefPropertyComposite(pageBook); installPaneSwitcher(pageBook); } protected Pane<? extends JavaTypeDef> buildTypeDefPropertyComposite(PageBook pageBook) { return new TypeDefPropertyComposite<JavaTypeDef>( this, this.getTypeDefHolder(), pageBook ); } private void installPaneSwitcher(PageBook pageBook) { SWTBindingTools.bind(this.getTypeDefHolder(), this.buildPaneTransformer(), pageBook); } protected PropertyValueModel<JavaTypeDef> getTypeDefHolder() { return this.selectedTypeDefModel; } }