blob: 197bf3fb041bdd8f462dd09eec8f6d4bec60080f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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.ui.internal.mappings.details;
import java.util.Iterator;
import org.eclipse.jpt.core.internal.context.base.IAttributeOverride;
import org.eclipse.jpt.core.internal.context.base.IColumn;
import org.eclipse.jpt.core.internal.context.base.IEmbeddedMapping;
import org.eclipse.jpt.ui.internal.IJpaHelpContextIds;
import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
import org.eclipse.jpt.ui.internal.swt.ListBoxModelAdapter;
import org.eclipse.jpt.ui.internal.util.ControlEnabler;
import org.eclipse.jpt.ui.internal.util.PaneEnabler;
import org.eclipse.jpt.ui.internal.widgets.AbstractFormPane;
import org.eclipse.jpt.utility.internal.model.value.CollectionAspectAdapter;
import org.eclipse.jpt.utility.internal.model.value.CollectionValueModel;
import org.eclipse.jpt.utility.internal.model.value.ListValueModel;
import org.eclipse.jpt.utility.internal.model.value.PropertyValueModel;
import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel;
import org.eclipse.jpt.utility.internal.model.value.SortedListValueModelAdapter;
import org.eclipse.jpt.utility.internal.model.value.TransformationListValueModelAdapter;
import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel;
import org.eclipse.jpt.utility.internal.model.value.TransformationWritablePropertyValueModel;
import org.eclipse.jpt.utility.internal.model.value.WritablePropertyValueModel;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
/**
* Here the layout of this pane:
* <pre>
* -----------------------------------------------------------------------------
* | ------------------------------------------------------------------------- |
* | | | |
* | | AddRemoveListPane | |
* | | | |
* | ------------------------------------------------------------------------- |
* | |
* | x Override Default |
* | |
* | ------------------------------------------------------------------------- |
* | | | |
* | | ColumnComposite | |
* | | | |
* | ------------------------------------------------------------------------- |
* -----------------------------------------------------------------------------</pre>
*
* @see IEmbeddedMapping
* @see EmbeddedMappingComposite - The parent container
* @see ColumnComposite
*
* @version 2.0
* @since 1.0
*/
public class EmbeddedAttributeOverridesComposite extends AbstractFormPane<IEmbeddedMapping>
{
private WritablePropertyValueModel<IAttributeOverride> attributeOverrideHolder;
private List list;
/**
* Creates a new <code>EmbeddedAttributeOverridesComposite</code>.
*
* @param parentPane The parent container of this one
* @param parent The parent container
*/
public EmbeddedAttributeOverridesComposite(AbstractFormPane<? extends IEmbeddedMapping> parentPane,
Composite parent) {
super(parentPane, parent);
}
/**
* Creates a new <code>EmbeddedAttributeOverridesComposite</code>.
*
* @param subjectHolder The holder of the subject <code>IEmbeddedMapping</code>
* @param parent The parent container
* @param widgetFactory The factory used to create various common widgets
*/
public EmbeddedAttributeOverridesComposite(PropertyValueModel<? extends IEmbeddedMapping> subjectHolder,
Composite parent,
TabbedPropertySheetWidgetFactory widgetFactory) {
super(subjectHolder, parent, widgetFactory);
}
private WritablePropertyValueModel<IAttributeOverride> buildAttributeOverrideHolder() {
return new SimplePropertyValueModel<IAttributeOverride>();
}
private CollectionValueModel<IAttributeOverride> buildAttributeOverridesCollectionHolder() {
return new CollectionAspectAdapter<IEmbeddedMapping, IAttributeOverride>(
this.getSubjectHolder(),
IEmbeddedMapping.DEFAULT_ATTRIBUTE_OVERRIDES_LIST,
IEmbeddedMapping.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST)
{
@Override
protected Iterator<IAttributeOverride> iterator_() {
return subject.attributeOverrides();
}
};
}
private List buildAttributeOverridesList(Composite parent,
WritablePropertyValueModel<IAttributeOverride> attributeOverrideHolder) {
WritablePropertyValueModel<String> selectedItemHolder =
buildSelectedAttributeOverrideHolder(attributeOverrideHolder);
List list = buildList(
parent,
selectedItemHolder,
IJpaHelpContextIds.MAPPING_EMBEDDED_ATTRIBUTE_OVERRIDES
);
ListBoxModelAdapter.adapt(
buildAttributeOverridesStringListHolder(),
selectedItemHolder,
list
);
return list;
}
private ListValueModel<IAttributeOverride> buildAttributeOverridesListHolder() {
return new SortedListValueModelAdapter<IAttributeOverride>(
buildAttributeOverridesCollectionHolder()
);
}
private ListValueModel<String> buildAttributeOverridesStringListHolder() {
return new TransformationListValueModelAdapter<IAttributeOverride, String>(buildAttributeOverridesListHolder()) {
@Override
protected String transformItem(IAttributeOverride item) {
return item.getName();
}
};
}
private PropertyValueModel<Boolean> buildColumnEnablementHolder(PropertyValueModel<IColumn> columnHolder) {
return new TransformationPropertyValueModel<IColumn, Boolean>(columnHolder) {
@Override
protected Boolean transform(IColumn value) {
return (value != null);
}
};
}
private PropertyValueModel<IColumn> buildColumnHolder(WritablePropertyValueModel<IAttributeOverride> attributeOverrideHolder) {
return new TransformationPropertyValueModel<IAttributeOverride, IColumn>(attributeOverrideHolder) {
@Override
protected IColumn transform_(IAttributeOverride value) {
return value.getColumn();
}
};
}
private PropertyValueModel<Boolean> buildOverrideDefaultButtonBooleanHolder(PropertyValueModel<IAttributeOverride> attributeOverrideHolder) {
return new TransformationPropertyValueModel<IAttributeOverride, Boolean>(attributeOverrideHolder) {
@Override
protected Boolean transform(IAttributeOverride value) {
return (value != null);
}
};
}
private WritablePropertyValueModel<Boolean> buildOverrideDefaultHolder(WritablePropertyValueModel<IAttributeOverride> attributeOverrideHolder) {
return new TransformationWritablePropertyValueModel<IAttributeOverride, Boolean>(attributeOverrideHolder) {
@Override
public void setValue(Boolean value) {
// Not done here
}
@Override
protected Boolean transform_(IAttributeOverride value) {
return !value.isVirtual();
}
};
}
private SelectionListener buildOverrideDefaultSelectionListener() {
return new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
Button button = (Button) e.widget;
overrideDefaultButtonSelected(button.getSelection());
}
};
}
private void buildPropertiesPane(Composite container,
WritablePropertyValueModel<IAttributeOverride> attributeOverrideHolder) {
// Override Default check box
Button overrideDefaultButton = buildCheckBox(
container,
JptUiMappingsMessages.AttributeOverridesComposite_overrideDefault,
buildOverrideDefaultHolder(attributeOverrideHolder)
);
GridData data = new GridData();
data.horizontalIndent = groupBoxMargin();
data.verticalIndent = 0;
overrideDefaultButton.setLayoutData(data);
overrideDefaultButton.addSelectionListener(
buildOverrideDefaultSelectionListener()
);
installOverrideDefaultButtonEnabler(
attributeOverrideHolder,
overrideDefaultButton
);
// Column widgets
PropertyValueModel<IColumn> columnHolder = buildColumnHolder(attributeOverrideHolder);
ColumnComposite columnComposite = new ColumnComposite(
this,
columnHolder,
container
);
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
columnComposite.getControl().setLayoutData(data);
installColumnCompositeEnabler(columnHolder, columnComposite);
}
private WritablePropertyValueModel<String> buildSelectedAttributeOverrideHolder(WritablePropertyValueModel<IAttributeOverride> attributeOverrideHolder) {
return new TransformationWritablePropertyValueModel<IAttributeOverride, String>(attributeOverrideHolder) {
@Override
protected IAttributeOverride reverseTransform_(String value) {
for (Iterator<IAttributeOverride> iter = subject().attributeOverrides(); iter.hasNext(); ) {
IAttributeOverride attributeOverride = iter.next();
if (attributeOverride.getName().equals(value)) {
return attributeOverride;
}
}
return null;
}
@Override
protected String transform_(IAttributeOverride value) {
return value.getName();
}
};
}
/*
* (non-Javadoc)
*/
@Override
protected void initialize() {
super.initialize();
this.attributeOverrideHolder = buildAttributeOverrideHolder();
}
/*
* (non-Javadoc)
*/
@Override
protected void initializeLayout(Composite container) {
WritablePropertyValueModel<IAttributeOverride> attributeOverrideHolder =
buildAttributeOverrideHolder();
// Attribute Overrides group box
Composite groupBox = buildTitledPane(
container,
JptUiMappingsMessages.AttributeOverridesComposite_attributeOverrides
);
// Sub-pane to align the check box and ColumnComposite
// to the right of the list
container = buildSubPane(groupBox, 1, 5, 0, 0, 0);
// Attribute Overrides list
list = buildAttributeOverridesList(
container,
attributeOverrideHolder
);
GridData data = new GridData();
data.verticalSpan = 2;
data.grabExcessVerticalSpace = true;
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
list.setLayoutData(data);
// Properties for the selected attribute overrides
buildPropertiesPane(
buildSubPane(container, 5, 0),
attributeOverrideHolder
);
}
private void installColumnCompositeEnabler(PropertyValueModel<IColumn> columnHolder,
ColumnComposite columnComposite) {
new PaneEnabler(
buildColumnEnablementHolder(columnHolder),
columnComposite
);
}
private void installOverrideDefaultButtonEnabler(PropertyValueModel<IAttributeOverride> attributeOverrideHolder,
Button overrideDefaultButton) {
new ControlEnabler(
this.buildOverrideDefaultButtonBooleanHolder(attributeOverrideHolder),
overrideDefaultButton
);
}
private void overrideDefaultButtonSelected(boolean overrideDefault) {
if (overrideDefault) {
int index = this.subject().specifiedAttributeOverridesSize();
IAttributeOverride defaultAttributeOverride = this.attributeOverrideHolder.value();
IAttributeOverride attributeOverride = this.subject().addSpecifiedAttributeOverride(index);
attributeOverride.setName(defaultAttributeOverride.getName());
attributeOverride.getColumn().setSpecifiedName(defaultAttributeOverride.getColumn().getName());
}
else {
this.subject().removeSpecifiedAttributeOverride(this.list.getSelectionIndex());
}
}
}