diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java')
-rw-r--r-- | jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java new file mode 100644 index 0000000000..e150c6766b --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/EmbeddedAttributeOverridesComposite.java @@ -0,0 +1,337 @@ +/******************************************************************************* + * 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 java.util.List; +import org.eclipse.emf.common.command.CommandStack; +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.notify.impl.AdapterImpl; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.ListViewer; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jpt.core.internal.mappings.IAttributeOverride; +import org.eclipse.jpt.core.internal.mappings.IEmbedded; +import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage; +import org.eclipse.jpt.ui.internal.IJpaHelpContextIds; +import org.eclipse.jpt.ui.internal.details.BaseJpaComposite; +import org.eclipse.jpt.ui.internal.mappings.JpaUiMappingsMessages; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Group; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; + +public class EmbeddedAttributeOverridesComposite extends BaseJpaComposite +{ + private ListViewer listViewer; + + private IEmbedded embedded; + private Adapter embeddedListener; + + private IAttributeOverride attributeOverride; + private Adapter attributeOverrideListener; + + protected ColumnComposite columnComposite; + + private Button overrideDefaultButton; + + public EmbeddedAttributeOverridesComposite(Composite parent, CommandStack commandStack, TabbedPropertySheetWidgetFactory widgetFactory) { + super(parent, SWT.NULL, commandStack, widgetFactory); + this.embeddedListener = buildEmbeddedListener(); + this.attributeOverrideListener = buildAttributeOverrideListener(); + } + + private Adapter buildEmbeddedListener() { + return new AdapterImpl() { + public void notifyChanged(Notification notification) { + embeddedChanged(notification); + } + }; + } + + private Adapter buildAttributeOverrideListener() { + return new AdapterImpl() { + public void notifyChanged(Notification notification) { + attributeOverrideChanged(notification); + } + }; + } + + + @Override + protected void initializeLayout(Composite composite) { + GridLayout layout = new GridLayout(2, false); + layout.marginWidth = 0; + composite.setLayout(layout); + + Group attributeOverridesGroup = getWidgetFactory().createGroup( + composite, JpaUiMappingsMessages.AttributeOverridesComposite_attributeOverrides); + attributeOverridesGroup.setLayout(new GridLayout(2, true)); + GridData gridData = new GridData(); + gridData.horizontalAlignment = SWT.FILL; + gridData.verticalAlignment = SWT.FILL; + gridData.grabExcessHorizontalSpace = true; + gridData.grabExcessVerticalSpace= true; + attributeOverridesGroup.setLayoutData(gridData); + + this.listViewer = buildAttributeOverridesListViewer(attributeOverridesGroup); + gridData = new GridData(); + gridData.verticalSpan = 2; + gridData.horizontalAlignment = SWT.FILL; + gridData.verticalAlignment = SWT.FILL; + gridData.grabExcessHorizontalSpace = true; + gridData.grabExcessVerticalSpace= true; + this.listViewer.getList().setLayoutData(gridData); + PlatformUI.getWorkbench().getHelpSystem().setHelp(this.listViewer.getList(), IJpaHelpContextIds.MAPPING_EMBEDDED_ATTRIBUTE_OVERRIDES); + + this.overrideDefaultButton = getWidgetFactory().createButton(attributeOverridesGroup, "Override Default", SWT.CHECK); + this.overrideDefaultButton.addSelectionListener(buildOverrideDefaultSelectionListener()); + gridData = new GridData(); + gridData.verticalAlignment = SWT.BEGINNING; + gridData.grabExcessHorizontalSpace = true; + gridData.horizontalAlignment = SWT.FILL; + this.overrideDefaultButton.setLayoutData(gridData); + + + this.columnComposite = new ColumnComposite(attributeOverridesGroup, commandStack, getWidgetFactory()); + gridData = new GridData(); + gridData.verticalAlignment = SWT.BEGINNING; + gridData.grabExcessHorizontalSpace = true; + gridData.horizontalAlignment = SWT.FILL; + this.columnComposite.getControl().setLayoutData(gridData); + + } + + private SelectionListener buildOverrideDefaultSelectionListener() { + return new SelectionListener(){ + + public void widgetSelected(SelectionEvent e) { + overrideDefaultButtonSelected(e); + } + + public void widgetDefaultSelected(SelectionEvent e) { + overrideDefaultButtonSelected(e); + } + }; + } + + private void overrideDefaultButtonSelected(SelectionEvent e) { + boolean selection = this.overrideDefaultButton.getSelection(); + if (selection) { + int index = this.embedded.getSpecifiedAttributeOverrides().size(); + IAttributeOverride attributeOverride = this.embedded.createAttributeOverride(index); + this.embedded.getSpecifiedAttributeOverrides().add(attributeOverride); + attributeOverride.setName(this.attributeOverride.getName()); + attributeOverride.getColumn().setSpecifiedName(this.attributeOverride.getColumn().getName()); + } + else { + this.embedded.getSpecifiedAttributeOverrides().remove(this.attributeOverride); + } + } + + + private ListViewer buildAttributeOverridesListViewer(Composite parent) { + ListViewer listViewer = new ListViewer(parent, SWT.SINGLE | SWT.BORDER); + listViewer.setLabelProvider(buildAttributeOverridesLabelProvider()); + listViewer.setContentProvider(buildAttributeOverridesContentProvider()); + + listViewer.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + attributeOverridesListSelectionChanged(event); + } + }); + + return listViewer; + } + + protected void attributeOverridesListSelectionChanged(SelectionChangedEvent event) { + if (((StructuredSelection) event.getSelection()).isEmpty()) { + this.columnComposite.populate(null); + this.columnComposite.enableWidgets(false); + this.overrideDefaultButton.setSelection(false); + this.overrideDefaultButton.setEnabled(false); + } + else { + this.attributeOverride = getSelectedAttributeOverride(); + boolean specifiedOverride = this.embedded.getSpecifiedAttributeOverrides().contains(this.attributeOverride); + this.overrideDefaultButton.setSelection(specifiedOverride); + this.columnComposite.populate(this.attributeOverride.getColumn()); + this.columnComposite.enableWidgets(specifiedOverride); + this.overrideDefaultButton.setEnabled(true); + } + } + + private ILabelProvider buildAttributeOverridesLabelProvider() { + return new LabelProvider() { + public String getText(Object element) { + //TODO also display column name somehow + return ((IAttributeOverride) element).getName(); + } + }; + } + + + private IContentProvider buildAttributeOverridesContentProvider() { + return new IStructuredContentProvider() { + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + public void dispose() { + } + + public Object[] getElements(Object inputElement) { + return ((IEmbedded) inputElement).getAttributeOverrides().toArray(); + } + }; + } + + private IAttributeOverride getSelectedAttributeOverride() { + return (IAttributeOverride) ((StructuredSelection) this.listViewer.getSelection()).getFirstElement(); + } + + + public void doPopulate(EObject obj) { + this.embedded = (IEmbedded) obj; + if (this.embedded == null) { + this.attributeOverride = null; + this.columnComposite.populate(null); + return; + } + + if (this.listViewer.getInput() != this.embedded) { + this.listViewer.setInput(this.embedded); + } + if (!this.embedded.getAttributeOverrides().isEmpty()) { + if (this.listViewer.getSelection().isEmpty()) { + IAttributeOverride attributeOverride = this.embedded.getAttributeOverrides().get(0); + this.listViewer.setSelection(new StructuredSelection(attributeOverride)); + } + else { + this.columnComposite.enableWidgets(true); + this.columnComposite.populate(((IAttributeOverride)((StructuredSelection) this.listViewer.getSelection()).getFirstElement()).getColumn()); + } + } + else { + this.columnComposite.populate(null); + this.columnComposite.enableWidgets(false); + } + } + + @Override + protected void doPopulate() { + this.columnComposite.doPopulate(); + } + + @Override + protected void engageListeners() { + if (this.embedded != null) { + this.embedded.eAdapters().add(this.embeddedListener); + for (IAttributeOverride attributeOverride : this.embedded.getAttributeOverrides()) { + attributeOverride.eAdapters().add(this.attributeOverrideListener); + } + } + } + + @Override + protected void disengageListeners() { + if (this.embedded != null) { + this.embedded.eAdapters().remove(this.embeddedListener); + for (IAttributeOverride attributeOverride : this.embedded.getAttributeOverrides()) { + attributeOverride.eAdapters().remove(this.attributeOverrideListener); + } + } + } + + + protected void embeddedChanged(Notification notification) { + switch (notification.getFeatureID(IEmbedded.class)) { + case JpaCoreMappingsPackage.IEMBEDDED__SPECIFIED_ATTRIBUTE_OVERRIDES : + case JpaCoreMappingsPackage.IEMBEDDED__DEFAULT_ATTRIBUTE_OVERRIDES : + Display.getDefault().asyncExec(new Runnable() { + public void run() { + if (listViewer.getList().isDisposed()) { + return; + } + listViewer.refresh(); + columnComposite.enableWidgets(!listViewer.getSelection().isEmpty()); + if (listViewer.getSelection().isEmpty()) { + columnComposite.populate(null); + } + } + }); + if (notification.getEventType() == Notification.ADD) { + ((IAttributeOverride) notification.getNewValue()).eAdapters().add(this.attributeOverrideListener); + final Object newValue = notification.getNewValue(); + Display.getDefault().asyncExec(new Runnable() { + public void run() { + if (listViewer.getList().isDisposed()) { + return; + } + listViewer.setSelection(new StructuredSelection(newValue)); + } + }); + } + else if (notification.getEventType() == Notification.ADD_MANY) { + List addedList = (List) notification.getNewValue(); + for (Iterator<IAttributeOverride> i = addedList.iterator(); i.hasNext(); ) { + IAttributeOverride override = i.next(); + override.eAdapters().add(this.attributeOverrideListener); + } + } + else if (notification.getEventType() == Notification.REMOVE) { + ((IAttributeOverride) notification.getOldValue()).eAdapters().remove(this.attributeOverrideListener); + } + else if (notification.getEventType() == Notification.REMOVE_MANY) { + List removedList = (List) notification.getOldValue(); + for (Iterator<IAttributeOverride> i = removedList.iterator(); i.hasNext(); ) { + IAttributeOverride override = i.next(); + override.eAdapters().remove(this.attributeOverrideListener); + } + } + break; + default : + break; + } + } + + protected void attributeOverrideChanged(Notification notification) { + switch (notification.getFeatureID(IAttributeOverride.class)) { + case JpaCoreMappingsPackage.IATTRIBUTE_OVERRIDE__NAME : + final IAttributeOverride attributeOverride = (IAttributeOverride) notification.getNotifier(); + Display.getDefault().asyncExec(new Runnable() { + public void run() { + listViewer.refresh(attributeOverride); + } + }); + break; + default : + break; + } + } + + public void dispose() { + this.columnComposite.dispose(); + super.dispose(); + } +} |