blob: bdc6fb415602dfdf1e61966239a5c04562f3b0ef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 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.orm;
import org.eclipse.jpt.common.ui.internal.widgets.Pane;
import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;
import org.eclipse.jpt.common.utility.internal.iterables.SuperListIterableWrapper;
import org.eclipse.jpt.common.utility.internal.model.value.CachingTransformationPropertyValueModel;
import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.ListPropertyValueModelAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.ReadOnlyWritablePropertyValueModelWrapper;
import org.eclipse.jpt.common.utility.internal.model.value.ValueListAdapter;
import org.eclipse.jpt.common.utility.model.event.StateChangeEvent;
import org.eclipse.jpt.common.utility.model.listener.StateChangeListener;
import org.eclipse.jpt.common.utility.model.value.ListValueModel;
import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel;
import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
import org.eclipse.jpt.jpa.eclipselink.core.context.ReadOnlyTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.core.context.TenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkEntityMappings;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.ui.internal.details.EclipseLinkUiDetailsMessages;
import org.eclipse.jpt.jpa.eclipselink.ui.internal.details.TenantDiscriminatorColumnsComposite;
import org.eclipse.jpt.jpa.eclipselink.ui.internal.details.TenantDiscriminatorColumnsComposite.TenantDiscriminatorColumnsEditor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
public class EclipseLinkEntityMappingsTenantDiscriminatorColumnsComposite extends Pane<EntityMappings> {
private TenantDiscriminatorColumnsComposite<EntityMappings> tenantDiscriminatorColumnsComposite;
public EclipseLinkEntityMappingsTenantDiscriminatorColumnsComposite(Pane<? extends EntityMappings> parentPane,
Composite parent) {
super(parentPane, parent);
}
@Override
protected void initializeLayout(Composite container) {
container = this.addCollapsibleSection(
container,
EclipseLinkUiDetailsMessages.EclipseLinkTypeMappingComposite_multitenancy
);
// Tenant discriminator columns group pane
Group tenantDiscriminatorColumnGroupPane = addTitledGroup(
container,
EclipseLinkUiDetailsMessages.TenantDiscriminatorColumns_groupLabel
);
// Override Default Tenant Discriminator Columns check box
addCheckBox(
addSubPane(tenantDiscriminatorColumnGroupPane, 8),
EclipseLinkUiDetailsMessages.EclipseLinkMultitenancy_overrideDefaultTenantDiscriminatorColumns,
buildOverrideDefaultTenantDiscriminatorColumnHolder(),
null
);
this.tenantDiscriminatorColumnsComposite = this.buildTenantDiscriminatorColumnsComposite(tenantDiscriminatorColumnGroupPane);
this.tenantDiscriminatorColumnsComposite.installListPaneEnabler(new TenantDiscriminatorColumnPaneEnablerHolder());
}
protected TenantDiscriminatorColumnsComposite<EntityMappings> buildTenantDiscriminatorColumnsComposite(Composite container) {
return new TenantDiscriminatorColumnsComposite<EntityMappings>(
getSubjectHolder(),
container,
getWidgetFactory(),
buildTenantDiscriminatorColumnsEditor());
}
protected TenantDiscriminatorColumnsEditor<EntityMappings> buildTenantDiscriminatorColumnsEditor() {
return new TenantDiscriminatorColumnsProvider();
}
class TenantDiscriminatorColumnsProvider implements TenantDiscriminatorColumnsEditor<EntityMappings> {
public void addTenantDiscriminatorColumn(EntityMappings subject) {
OrmTenantDiscriminatorColumn2_3 column = ((EclipseLinkEntityMappings) subject).addSpecifiedTenantDiscriminatorColumn();
column.setSpecifiedName(ReadOnlyTenantDiscriminatorColumn2_3.DEFAULT_NAME);
}
public ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getDefaultTenantDiscriminatorColumns(EntityMappings subject) {
return new SuperListIterableWrapper<ReadOnlyTenantDiscriminatorColumn2_3>(((EclipseLinkEntityMappings) subject).getDefaultTenantDiscriminatorColumns());
}
public int getDefaultTenantDiscriminatorColumnsSize(EntityMappings subject) {
return ((EclipseLinkEntityMappings) subject).getDefaultTenantDiscriminatorColumnsSize();
}
public String getDefaultTenantDiscriminatorsListPropertyName() {
return EclipseLinkEntityMappings.DEFAULT_TENANT_DISCRIMINATOR_COLUMNS_LIST;
}
public ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getSpecifiedTenantDiscriminatorColumns(EntityMappings subject) {
return new SuperListIterableWrapper<ReadOnlyTenantDiscriminatorColumn2_3>(((EclipseLinkEntityMappings) subject).getSpecifiedTenantDiscriminatorColumns());
}
public int getSpecifiedTenantDiscriminatorColumnsSize(EntityMappings subject) {
return ((EclipseLinkEntityMappings) subject).getSpecifiedTenantDiscriminatorColumnsSize();
}
public String getSpecifiedTenantDiscriminatorsListPropertyName() {
return EclipseLinkEntityMappings.SPECIFIED_TENANT_DISCRIMINATOR_COLUMNS_LIST;
}
public boolean hasSpecifiedTenantDiscriminatorColumns(EntityMappings subject) {
return ((EclipseLinkEntityMappings) subject).hasSpecifiedTenantDiscriminatorColumns();
}
public void removeTenantDiscriminatorColumns(EntityMappings subject, int[] selectedIndices) {
for (int index = selectedIndices.length; index-- > 0; ) {
((EclipseLinkEntityMappings) subject).removeSpecifiedTenantDiscriminatorColumn(selectedIndices[index]);
}
}
}
void setSelectedTenantDiscriminatorColumn(ReadOnlyTenantDiscriminatorColumn2_3 tenantDiscriminatorColumn) {
this.tenantDiscriminatorColumnsComposite.setSelectedTenantDiscriminatorColumn(tenantDiscriminatorColumn);
}
private WritablePropertyValueModel<Boolean> buildOverrideDefaultTenantDiscriminatorColumnHolder() {
return new OverrideDefaultTenantDiscriminatorColumnHolder();
}
ListValueModel<ReadOnlyTenantDiscriminatorColumn2_3> buildSpecifiedTenantDiscriminatorColumnsListHolder() {
return new ListAspectAdapter<EntityMappings, ReadOnlyTenantDiscriminatorColumn2_3>(
getSubjectHolder(), EclipseLinkEntityMappings.SPECIFIED_TENANT_DISCRIMINATOR_COLUMNS_LIST) {
@Override
protected ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getListIterable() {
return new SuperListIterableWrapper<ReadOnlyTenantDiscriminatorColumn2_3>(((EclipseLinkEntityMappings) this.subject).getSpecifiedTenantDiscriminatorColumns());
}
@Override
protected int size_() {
return ((EclipseLinkEntityMappings) this.subject).getSpecifiedTenantDiscriminatorColumnsSize();
}
};
}
private class OverrideDefaultTenantDiscriminatorColumnHolder
extends ListPropertyValueModelAdapter<Boolean>
implements WritablePropertyValueModel<Boolean>
{
public OverrideDefaultTenantDiscriminatorColumnHolder() {
super(buildSpecifiedTenantDiscriminatorColumnsListHolder());
}
@Override
protected Boolean buildValue() {
return Boolean.valueOf(this.listHolder.size() > 0);
}
public void setValue(Boolean value) {
updateTenantDiscriminatorColumns(value.booleanValue());
}
private void updateTenantDiscriminatorColumns(boolean selected) {
if (isPopulating()) {
return;
}
setPopulating(true);
try {
EclipseLinkEntityMappings subject = (EclipseLinkEntityMappings) getSubject();
if (selected) {
TenantDiscriminatorColumn2_3 newTenantDiscriminatorColumn = subject.addSpecifiedTenantDiscriminatorColumn();
newTenantDiscriminatorColumn.setSpecifiedName(ReadOnlyTenantDiscriminatorColumn2_3.DEFAULT_NAME);
}
// Remove all the specified tenant discriminator columns
else {
for (int index = subject.getSpecifiedTenantDiscriminatorColumnsSize(); --index >= 0; ) {
subject.removeSpecifiedTenantDiscriminatorColumn(index);
}
}
}
finally {
setPopulating(false);
}
}
}
private class TenantDiscriminatorColumnPaneEnablerHolder
extends CachingTransformationPropertyValueModel<EntityMappings, Boolean>
{
private StateChangeListener stateChangeListener;
public TenantDiscriminatorColumnPaneEnablerHolder() {
super(
new ValueListAdapter<EntityMappings>(
new ReadOnlyWritablePropertyValueModelWrapper<EntityMappings>(getSubjectHolder()),
EclipseLinkEntityMappings.SPECIFIED_TENANT_DISCRIMINATOR_COLUMNS_LIST));
this.stateChangeListener = buildStateChangeListener();
}
private StateChangeListener buildStateChangeListener() {
return new StateChangeListener() {
public void stateChanged(StateChangeEvent event) {
valueStateChanged();
}
};
}
void valueStateChanged() {
Object oldValue = this.cachedValue;
Object newValue = transformNew(this.valueHolder.getValue());
firePropertyChanged(VALUE, oldValue, newValue);
}
@Override
protected Boolean transform(EntityMappings value) {
if (value == null) {
return Boolean.FALSE;
}
return super.transform(value);
}
@Override
protected Boolean transform_(EntityMappings value) {
return Boolean.valueOf(((EclipseLinkEntityMappings) value).getSpecifiedTenantDiscriminatorColumnsSize() > 0);
}
@Override
protected void engageModel() {
super.engageModel();
this.valueHolder.addStateChangeListener(this.stateChangeListener);
}
@Override
protected void disengageModel() {
this.valueHolder.removeStateChangeListener(this.stateChangeListener);
super.disengageModel();
}
}
}