blob: a13430aceef8e27304a81721b8557b65f7636c63 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2013 Oracle. All rights reserved.
* This program and the accompanying materials are 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.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.jpa.eclipselink.ui.internal.details;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
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.Pane;
import org.eclipse.jpt.common.utility.internal.model.value.CollectionPropertyValueModelAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.CompositeListValueModel;
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.internal.transformer.AbstractTransformer;
import org.eclipse.jpt.common.utility.iterable.ListIterable;
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.core.JpaModel;
import org.eclipse.jpt.jpa.core.context.NamedColumn;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkSpecifiedTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.ui.details.JptJpaEclipseLinkUiDetailsMessages;
import org.eclipse.jpt.jpa.eclipselink.ui.internal.EclipseLinkHelpContextIds;
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;
public class EclipseLinkTenantDiscriminatorColumnsComposite<T extends JpaModel>
extends Pane<T>
{
/**
* The editor used to perform the common behaviors defined in the list pane.
*/
TenantDiscriminatorColumnsEditor<T> tenantDiscriminatorColumnsEditor;
private Pane<EclipseLinkTenantDiscriminatorColumn2_3> tenantDiscriminatorColumnPane;
private ModifiableCollectionValueModel<EclipseLinkTenantDiscriminatorColumn2_3> selectedTenantDiscriminatorColumnsModel;
private PropertyValueModel<EclipseLinkTenantDiscriminatorColumn2_3> selectedTenantDiscriminatorColumnModel;
public EclipseLinkTenantDiscriminatorColumnsComposite(
Pane<?> parent,
PropertyValueModel<? extends T> subjectModel,
PropertyValueModel<Boolean> enabledModel,
Composite parentComposite,
TenantDiscriminatorColumnsEditor<T> tenantDiscriminatorColumnsEditor) {
super(parent, subjectModel, enabledModel, parentComposite);
this.tenantDiscriminatorColumnsEditor = tenantDiscriminatorColumnsEditor;
initializeLayout2();
}
@Override
protected void initialize() {
super.initialize();
this.selectedTenantDiscriminatorColumnsModel = this.buildSelectedTenantDiscriminatorColumnsModel();
this.selectedTenantDiscriminatorColumnModel = this.buildSelectedTenantDiscriminatorColumnModel(this.selectedTenantDiscriminatorColumnsModel);
}
private ModifiableCollectionValueModel<EclipseLinkTenantDiscriminatorColumn2_3> buildSelectedTenantDiscriminatorColumnsModel() {
return new SimpleCollectionValueModel<EclipseLinkTenantDiscriminatorColumn2_3>();
}
private PropertyValueModel<EclipseLinkTenantDiscriminatorColumn2_3> buildSelectedTenantDiscriminatorColumnModel(CollectionValueModel<EclipseLinkTenantDiscriminatorColumn2_3> selectedTenantDiscriminatorColumnsModel) {
return new CollectionPropertyValueModelAdapter<EclipseLinkTenantDiscriminatorColumn2_3, EclipseLinkTenantDiscriminatorColumn2_3>(selectedTenantDiscriminatorColumnsModel) {
@Override
protected EclipseLinkTenantDiscriminatorColumn2_3 buildValue() {
if (this.collectionModel.size() == 1) {
return this.collectionModel.iterator().next();
}
return null;
}
};
}
@Override
protected void initializeLayout(Composite container) {
//see intiailizeLayout2()
}
@Override
public Composite getControl() {
return (Composite) super.getControl();
}
private void initializeLayout2() {
new AddRemoveListPane<T, EclipseLinkTenantDiscriminatorColumn2_3>(
this,
getControl(),
buildTenantDiscriminatorColumnsAdapter(),
buildTenantDiscriminatorColumnsListModel(),
this.selectedTenantDiscriminatorColumnsModel,
buildTenantDiscriminatorColumnsListLabelProvider(),
EclipseLinkHelpContextIds.MULTITENANCY_TENANT_DISCRIMINATOR_COLUMNS
);
// Property pane
PageBook pageBook = new PageBook(getControl(), SWT.NULL);
pageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
installPaneSwitcher(pageBook);
}
protected Pane<EclipseLinkTenantDiscriminatorColumn2_3> getTenantDiscriminatorColumnComposite(PageBook pageBook) {
if (this.tenantDiscriminatorColumnPane == null) {
this.tenantDiscriminatorColumnPane = this.buildTenantDiscriminatorColumnComposite(pageBook);
}
return this.tenantDiscriminatorColumnPane;
}
protected Pane<EclipseLinkTenantDiscriminatorColumn2_3> buildTenantDiscriminatorColumnComposite(PageBook pageBook) {
return new EclipseLinkTenantDiscriminatorColumnComposite(
this,
this.selectedTenantDiscriminatorColumnModel,
pageBook
);
}
private void installPaneSwitcher(PageBook pageBook) {
SWTBindingTools.bind(this.selectedTenantDiscriminatorColumnModel, buildPaneTransformer(pageBook), pageBook);
}
private Transformer<EclipseLinkTenantDiscriminatorColumn2_3, Control> buildPaneTransformer(PageBook pageBook) {
return new PaneTransformer(pageBook);
}
protected class PaneTransformer
extends AbstractTransformer<EclipseLinkTenantDiscriminatorColumn2_3, Control>
{
private final PageBook pageBook;
protected PaneTransformer(PageBook pageBook) {
this.pageBook = pageBook;
}
@Override
public Control transform_(EclipseLinkTenantDiscriminatorColumn2_3 column) {
return getTenantDiscriminatorColumnComposite(this.pageBook).getControl();
}
}
String buildTenantDiscriminatorColumnLabel(EclipseLinkTenantDiscriminatorColumn2_3 tenantDiscriminatorColumn) {
if (tenantDiscriminatorColumn.isVirtual() || tenantDiscriminatorColumn.getSpecifiedName() == null) {
return NLS.bind(
JptJpaEclipseLinkUiDetailsMessages.TENANT_DISCRIMINATOR_COLUMN_COMPOSITE_DEFAULT_TENANT_DISCRIMINATOR_COLUMN_NAME_LABEL,
tenantDiscriminatorColumn.getName()
);
}
return tenantDiscriminatorColumn.getName();
}
private Adapter<EclipseLinkTenantDiscriminatorColumn2_3> buildTenantDiscriminatorColumnsAdapter() {
return new AbstractAdapter<EclipseLinkTenantDiscriminatorColumn2_3>() {
public EclipseLinkTenantDiscriminatorColumn2_3 addNewItem() {
return EclipseLinkTenantDiscriminatorColumnsComposite.this.tenantDiscriminatorColumnsEditor.addTenantDiscriminatorColumn(getSubject());
}
@Override
public boolean hasOptionalButton() {
return false;
}
@Override
public PropertyValueModel<Boolean> buildRemoveButtonEnabledModel(CollectionValueModel<EclipseLinkTenantDiscriminatorColumn2_3> selectedItemsModel) {
return buildSingleSelectedItemEnabledModel(selectedItemsModel);
}
public void removeSelectedItems(CollectionValueModel<EclipseLinkTenantDiscriminatorColumn2_3> selectedItemsModel) {
EclipseLinkSpecifiedTenantDiscriminatorColumn2_3 column = (EclipseLinkSpecifiedTenantDiscriminatorColumn2_3) selectedItemsModel.iterator().next();
EclipseLinkTenantDiscriminatorColumnsComposite.this.tenantDiscriminatorColumnsEditor.removeTenantDiscriminatorColumn(getSubject(), column);
}
};
}
private ListValueModel<EclipseLinkTenantDiscriminatorColumn2_3> buildTenantDiscriminatorColumnsListModel() {
return new ItemPropertyListValueModelAdapter<EclipseLinkTenantDiscriminatorColumn2_3>(buildTenantDiscriminatorColumnsListHolder(),
NamedColumn.SPECIFIED_NAME_PROPERTY,
NamedColumn.DEFAULT_NAME_PROPERTY);
}
private ListValueModel<EclipseLinkTenantDiscriminatorColumn2_3> buildTenantDiscriminatorColumnsListHolder() {
List<ListValueModel<EclipseLinkTenantDiscriminatorColumn2_3>> list = new ArrayList<ListValueModel<EclipseLinkTenantDiscriminatorColumn2_3>>();
list.add(buildDefaultTenantDiscriminatorColumnListHolder());
list.add(buildSpecifiedTenantDiscriminatorColumnsListHolder());
return CompositeListValueModel.forModels(list);
}
private ListValueModel<EclipseLinkTenantDiscriminatorColumn2_3> buildSpecifiedTenantDiscriminatorColumnsListHolder() {
return new ListAspectAdapter<T, EclipseLinkTenantDiscriminatorColumn2_3>(getSubjectHolder(), this.tenantDiscriminatorColumnsEditor.getSpecifiedTenantDiscriminatorsListPropertyName()) {
@Override
protected ListIterable<EclipseLinkTenantDiscriminatorColumn2_3> getListIterable() {
return EclipseLinkTenantDiscriminatorColumnsComposite.this.tenantDiscriminatorColumnsEditor.getSpecifiedTenantDiscriminatorColumns(this.subject);
}
@Override
protected int size_() {
return EclipseLinkTenantDiscriminatorColumnsComposite.this.tenantDiscriminatorColumnsEditor.getSpecifiedTenantDiscriminatorColumnsSize(this.subject);
}
};
}
private ListValueModel<EclipseLinkTenantDiscriminatorColumn2_3> buildDefaultTenantDiscriminatorColumnListHolder() {
return new ListAspectAdapter<T, EclipseLinkTenantDiscriminatorColumn2_3>(getSubjectHolder(), this.tenantDiscriminatorColumnsEditor.getDefaultTenantDiscriminatorsListPropertyName()) {
@Override
protected ListIterable<EclipseLinkTenantDiscriminatorColumn2_3> getListIterable() {
return EclipseLinkTenantDiscriminatorColumnsComposite.this.tenantDiscriminatorColumnsEditor.getDefaultTenantDiscriminatorColumns(this.subject);
}
@Override
protected int size_() {
return EclipseLinkTenantDiscriminatorColumnsComposite.this.tenantDiscriminatorColumnsEditor.getDefaultTenantDiscriminatorColumnsSize(this.subject);
}
};
}
private ILabelProvider buildTenantDiscriminatorColumnsListLabelProvider() {
return new LabelProvider() {
@Override
public String getText(Object element) {
return buildTenantDiscriminatorColumnLabel((EclipseLinkTenantDiscriminatorColumn2_3) element);
}
};
}
/**
* The editor is used to complete the behavior of this pane.
*/
public static interface TenantDiscriminatorColumnsEditor<T> {
/**
* Add a tenant discriminator column to the given subject
*/
EclipseLinkTenantDiscriminatorColumn2_3 addTenantDiscriminatorColumn(T subject);
/**
* Return whether the subject has specified tenant discriminator columns
*/
boolean hasSpecifiedTenantDiscriminatorColumns(T subject);
/**
* Return the specified tenant discriminator from the given subject
*/
ListIterable<EclipseLinkTenantDiscriminatorColumn2_3> getSpecifiedTenantDiscriminatorColumns(T subject);
/**
* Return the number of specified join columns on the given subject
*/
int getSpecifiedTenantDiscriminatorColumnsSize(T subject);
/**
* Return the default tenant discriminator columns from the given subject or null.
*/
ListIterable<EclipseLinkTenantDiscriminatorColumn2_3> getDefaultTenantDiscriminatorColumns(T subject);
/**
* Return the number of default tenant discriminator on the given subject
*/
int getDefaultTenantDiscriminatorColumnsSize(T subject);
/**
* Return the property name of the specified tenant discriminator columns list
*/
String getSpecifiedTenantDiscriminatorsListPropertyName();
/**
* Return the property name of the default tenant discriminator columns list
*/
String getDefaultTenantDiscriminatorsListPropertyName();
/**
* Remove the tenant discriminator column from the subject
*/
void removeTenantDiscriminatorColumn(T subject, EclipseLinkTenantDiscriminatorColumn2_3 column);
}
}