blob: 26fe3742deb4e521bfad658617f6b02e419cc30b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 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.IContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
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.jface.viewers.Viewer;
import org.eclipse.jpt.ui.internal.details.BaseJpaController;
import org.eclipse.jpt.ui.internal.widgets.CComboViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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 StringWithDefaultChooser extends BaseJpaController
{
private StringHolder stringHolder;
private Adapter stringHolderListener;
private CComboViewer comboViewer;
private static final String DEFAULT = "default";
public StringWithDefaultChooser(Composite parent, CommandStack theCommandStack, TabbedPropertySheetWidgetFactory widgetFactory) {
super(parent, theCommandStack, widgetFactory);
buildStringHolderListener();
}
private void buildStringHolderListener() {
this.stringHolderListener = new AdapterImpl() {
public void notifyChanged(Notification notification) {
stringHolderChanged(notification);
}
};
}
@Override
protected void buildWidget(Composite parent) {
CCombo combo = getWidgetFactory().createCCombo(parent, SWT.FLAT);
this.comboViewer = new CComboViewer(combo);
this.comboViewer.setContentProvider(buildContentProvider());
this.comboViewer.setLabelProvider(buildLabelProvider());
this.comboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
StringWithDefaultChooser.this.selectionChanged(event.getSelection());
}
});
combo.addModifyListener(
new ModifyListener() {
public void modifyText(ModifyEvent e) {
comboModified(e);
}
});
}
private IContentProvider buildContentProvider() {
return new IStructuredContentProvider(){
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object inputElement) {
return new String[] {DEFAULT};
}
};
}
private IBaseLabelProvider buildLabelProvider() {
return new LabelProvider() {
@Override
public String getText(Object element) {
if (element == DEFAULT && stringHolder.wrappedObject() != null) {
return stringHolder.defaultItem();
}
return super.getText(element);
}
};
}
void selectionChanged(ISelection sel) {
if (isPopulating()) {
return;
}
if (sel instanceof IStructuredSelection) {
String selection = (String) ((IStructuredSelection) sel).getFirstElement();
if (this.comboViewer.getCombo().getSelectionIndex() == 0) {
selection = null;
}
if (this.stringHolder.getString() == null) {
if (selection != null) {
this.stringHolder.setString(selection);
}
}
else if (!this.stringHolder.getString().equals(selection)) {
this.stringHolder.setString(selection);
}
}
}
private void comboModified(ModifyEvent e) {
if (isPopulating()) {
return;
}
CCombo combo = (CCombo) e.getSource();
combo.getSelectionIndex();
String text = combo.getText();
if (text != null && combo.getItemCount() > 0 && text.equals(combo.getItem(0))) {
text = null;
}
if (this.stringHolder.getString() != text) {
this.stringHolder.setString(text);
}
}
private void stringHolderChanged(Notification notification) {
if (notification.getFeatureID(this.stringHolder.featureClass()) ==
this.stringHolder.featureId()) {
Display.getDefault().asyncExec(
new Runnable() {
public void run() {
if (getCombo().isDisposed()) {
return;
}
populate();
}
});
}
else if (this.stringHolder.supportsDefault()) {
if (notification.getFeatureID(this.stringHolder.featureClass()) ==
this.stringHolder.defaultFeatureId()) {
Display.getDefault().asyncExec(
new Runnable() {
public void run() {
if (getCombo().isDisposed()) {
return;
}
populate();
}
});
}
}
}
@Override
protected void engageListeners() {
if (this.stringHolder != null && this.stringHolder.wrappedObject() != null) {
this.stringHolder.wrappedObject().eAdapters().add(this.stringHolderListener);
}
}
@Override
protected void disengageListeners() {
if (this.stringHolder != null && this.stringHolder.wrappedObject() != null) {
this.stringHolder.wrappedObject().eAdapters().remove(this.stringHolderListener);
}
}
@Override
public void doPopulate(EObject obj) {
this.stringHolder = (StringHolder) obj;
this.comboViewer.setInput(this.stringHolder);
populateCombo();
}
@Override
protected void doPopulate() {
populateCombo();
}
private void populateCombo() {
if (this.stringHolder.wrappedObject() == null) {
this.comboViewer.setSelection(StructuredSelection.EMPTY);
return;
}
this.comboViewer.update(this.comboViewer.getElementAt(0), null);
String string = this.stringHolder.getString();
if (string == null) {
if (((StructuredSelection) this.comboViewer.getSelection()).getFirstElement() == DEFAULT) {
this.comboViewer.refresh();
}
else {
this.comboViewer.setSelection(new StructuredSelection(DEFAULT));
}
}
else {
if (!this.comboViewer.getCombo().getText().equals(string)) {
this.comboViewer.getCombo().setText(string);
}
}
}
public CCombo getCombo() {
return this.comboViewer.getCombo();
}
@Override
public Control getControl() {
return getCombo();
}
/**
* An interface to wrap an object that supports a string with a default setting
* An object of this type must be passed in to populate(EObject)
*/
public static interface StringHolder extends EObject {
/**
* Return the string setting from the wrapped object
* @return
*/
String getString();
/**
* Set the string setting on the wrapped object
* @param string
*/
void setString(String string);
/**
* Return the Class of the wrapped object
* @return
*/
Class featureClass();
/**
* Return the feature id of string setting on the wrapped object
* @return
*/
int featureId();
boolean supportsDefault();
int defaultFeatureId();
/**
* The wrapped EObject that the enum setting is stored on
* @return
*/
EObject wrappedObject();
String defaultItem();
}
}