| /******************************************************************************* |
| * Copyright (c) 2006, 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 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.IBaseLabelProvider; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jpt.core.internal.mappings.InheritanceType; |
| import org.eclipse.jpt.ui.internal.details.BaseJpaController; |
| import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages; |
| import org.eclipse.jpt.ui.internal.widgets.CComboViewer; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.custom.CCombo; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; |
| |
| public class EnumComboViewer extends BaseJpaController |
| { |
| private EnumHolder enumHolder; |
| private Adapter enumListener; |
| |
| private CComboViewer comboViewer; |
| |
| |
| public EnumComboViewer(Composite parent, CommandStack theCommandStack, TabbedPropertySheetWidgetFactory widgetFactory) { |
| super(parent, theCommandStack, widgetFactory); |
| buildListener(); |
| } |
| |
| |
| private void buildListener() { |
| this.enumListener = new AdapterImpl() { |
| public void notifyChanged(Notification notification) { |
| modelChanged(notification); |
| } |
| }; |
| } |
| |
| @Override |
| protected void buildWidget(Composite parent) { |
| CCombo combo = getWidgetFactory().createCCombo(parent); |
| this.comboViewer = new CComboViewer(combo); |
| this.comboViewer.setLabelProvider(buildLabelProvider()); |
| this.comboViewer.addSelectionChangedListener(new ISelectionChangedListener() { |
| public void selectionChanged(SelectionChangedEvent event) { |
| EnumComboViewer.this.selectionChanged(event.getSelection()); |
| } |
| }); |
| } |
| protected IBaseLabelProvider buildLabelProvider() { |
| return new LabelProvider() { |
| @Override |
| public String getText(Object element) { |
| if (element == enumHolder.defaultValue()) { |
| return NLS.bind(JptUiMappingsMessages.EnumComboViewer_default, enumHolder.defaultString()); |
| } |
| return super.getText(element); |
| } |
| }; |
| } |
| |
| void selectionChanged(ISelection sel) { |
| if (sel instanceof IStructuredSelection) { |
| Object selection = ((IStructuredSelection) sel).getFirstElement(); |
| if ( ! this.enumHolder.get().equals(selection)) { |
| this.enumHolder.set(selection); |
| // this.editingDomain.getCommandStack().execute( |
| // SetCommand.create( |
| // this.editingDomain, |
| // this.basicMapping, |
| // OrmPackage.eINSTANCE.getBasicMapping_Optional(), |
| // optional |
| // ) |
| // ); |
| } |
| } |
| } |
| |
| private void modelChanged(Notification notification) { |
| if (notification.getFeatureID(this.enumHolder.featureClass()) == |
| this.enumHolder.featureId()) { |
| Display.getDefault().asyncExec( |
| new Runnable() { |
| public void run() { |
| populate(); |
| } |
| }); |
| } |
| } |
| |
| @Override |
| protected void engageListeners() { |
| if (this.enumHolder != null && this.enumHolder.wrappedObject() != null) { |
| this.enumHolder.wrappedObject().eAdapters().add(this.enumListener); |
| } |
| } |
| |
| @Override |
| protected void disengageListeners() { |
| if (this.enumHolder != null && this.enumHolder.wrappedObject() != null) { |
| this.enumHolder.wrappedObject().eAdapters().remove(this.enumListener); |
| } |
| } |
| |
| public final void populate(EnumHolder enumHolder) { |
| super.populate(enumHolder); |
| } |
| |
| @Override |
| public void doPopulate(EObject obj) { |
| this.enumHolder = (EnumHolder) obj; |
| populateCombo(); |
| } |
| |
| @Override |
| protected void doPopulate() { |
| populateCombo(); |
| } |
| |
| private void populateCombo() { |
| this.comboViewer.getCombo().removeAll(); |
| if (this.enumHolder.wrappedObject() == null) { |
| return; |
| } |
| |
| this.comboViewer.add(this.enumHolder.enumValues()); |
| |
| Object modelSetting = this.enumHolder.get(); |
| |
| if (((IStructuredSelection) this.comboViewer.getSelection()).getFirstElement() != modelSetting) { |
| this.comboViewer.setSelection(new StructuredSelection(modelSetting)); |
| } |
| } |
| |
| |
| @Override |
| public Control getControl() { |
| return this.comboViewer.getCombo(); |
| } |
| |
| |
| /** |
| * An interface to wrap an object that supports accessType |
| * An object of this type must be passed in to populate(EObject) |
| */ |
| public static interface EnumHolder extends EObject { |
| /** |
| * Return the num setting from the wrapped object |
| * @return |
| */ |
| Object get(); |
| |
| /** |
| * Set the enum setting on the wrapped object |
| * @param fetch |
| */ |
| void set(Object enumSetting); |
| |
| /** |
| * Return the Class of the wrapped object |
| * @return |
| */ |
| Class featureClass(); |
| |
| /** |
| * Return the feature id of enum setting on the wrapped object |
| * @return |
| */ |
| int featureId(); |
| |
| /** |
| * The wrapped EObject that the enum setting is stored on |
| * @return |
| */ |
| EObject wrappedObject(); |
| |
| Object[] enumValues(); |
| |
| /** |
| * Return the Default Enumerator object |
| */ |
| Object defaultValue(); |
| |
| /** |
| * Return the String to be displayed to the user |
| * Deafult ([defaultString()]) |
| */ |
| String defaultString(); |
| } |
| } |