/*******************************************************************************
* Copyright (c) 2008, 2011 CEA LIST and others.
* 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:
* Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
* Obeo - Some improvements
*******************************************************************************/
package org.eclipse.emf.eef.runtime.ui.widgets;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.eef.runtime.EEFRuntimePlugin;
import org.eclipse.emf.eef.runtime.ui.utils.EEFRuntimeUIMessages;
import org.eclipse.emf.eef.runtime.ui.utils.EditingUtils;
import org.eclipse.emf.eef.runtime.ui.widgets.settings.EEFEditorSettings;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* This is an Abstract class use to display a label with the referenced named
* Element For example type of a property
*
* @author Patrick Tessier
* @author <a href="mailto:jerome.benois@obeo.fr">Jerome Benois</a>
* @author <a href="mailto:stephane.bouchet@obeo.fr">Stephane Bouchet</a>
*/
public abstract class AbstractAdvancedEObjectFlatComboViewer implements
IPropertiesFilteredWidget {
/** Image for the remove button */
protected final org.eclipse.swt.graphics.Image deleteImage = EEFRuntimePlugin
.getImage(EEFRuntimePlugin.ICONS_16x16 + "Delete_16x16.gif"); //$NON-NLS-1$
/** Image for the add button */
protected final org.eclipse.swt.graphics.Image addImage = EEFRuntimePlugin
.getImage(EEFRuntimePlugin.ICONS_16x16 + "Add_16x16.gif"); //$NON-NLS-1$
protected static final String UNDEFINED_VALUE = "<UNDEFINED>"; //$NON-NLS-1$
/**
* the dialog title
*/
private String dialogTitle = ""; //$NON-NLS-1$
/** The parent Composite */
protected Composite parent;
protected EObject selection;
protected Object input;
protected Button browseButton;
protected EObjectFlatComboViewerListener callback;
/**
* The main composite
*/
protected Composite composite;
/**
* The adapter factory.
*/
protected AdapterFactory adapterFactory;
protected AdapterFactoryLabelProvider labelProvider;
protected List<ViewerFilter> filters;
protected List<ViewerFilter> brFilters;
protected FormToolkit widgetFactory;
protected ButtonsModeEnum button_mode = ButtonsModeEnum.BROWSE;
private Resource mainResource;
private Button removeButton;
protected Text field;
/**
* the constructor of this display
*
* @param labeltoDisplay
* use to display the name is the label
* @param filter
* use to look for the good element
*/
public AbstractAdvancedEObjectFlatComboViewer(String dialogTitle, Object input,
ViewerFilter filter, AdapterFactory adapterFactory,
EObjectFlatComboViewerListener callback) {
this.dialogTitle = dialogTitle;
this.input = input;
this.callback = callback;
this.labelProvider = new AdapterFactoryLabelProvider(adapterFactory);
this.filters = new ArrayList<ViewerFilter>();
if (filter != null) {
this.filters.add(filter);
}
this.brFilters = new ArrayList<ViewerFilter>();
this.adapterFactory = adapterFactory;
}
public void createControls(Composite parent, FormToolkit widgetFactory) {
this.widgetFactory = widgetFactory;
createControls(parent);
}
public void createControls(Composite parent) {
this.composite = createComposite(parent);
this.parent = parent;
if (parent instanceof ExpandableComposite) {
((ExpandableComposite) parent).setClient(composite);
}
FormLayout layout = new FormLayout();
layout.marginWidth = 1;// 7;
layout.marginHeight = 1;// 4;
layout.spacing = 7;
// layout.marginTop = 7;
composite.setLayout(layout);
// browse and remove Buttons
createButtons(composite);
// display and value labels
createLabels(composite);
}
private void createButtons(Composite parent) {
removeButton = createButton(parent, "", SWT.PUSH);
removeButton.setImage(deleteImage);
FormData data = new FormData();
data.right = new FormAttachment(100, -5);
data.top = new FormAttachment(0, -2);
removeButton.setLayoutData(data);
removeButton
.setToolTipText(EEFRuntimeUIMessages.AdvancedEObjectFlatComboViewer_remove_tooltip);
EditingUtils.setEEFtype(removeButton, "eef::AdvancedEObjectFlatComboViewer::removebutton");
this.browseButton = createButton(parent, "", SWT.PUSH); //$NON-NLS-1$
browseButton.setImage(addImage);
data = new FormData();
data.right = new FormAttachment(removeButton, 2);
data.top = new FormAttachment(0, -2);
browseButton.setLayoutData(data);
browseButton.setToolTipText(EEFRuntimeUIMessages.AdvancedEObjectFlatComboViewer_set_tooltip);
EditingUtils.setEEFtype(browseButton, "eef::AdvancedEObjectFlatComboViewer::browsebutton");
// listeners setting
removeButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
// reset value
handleSelection(null);
}
});
browseButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
browseButtonPressed();
}
});
}
public void setInput(Object input) {
this.input = input;
}
/**
* Sets the given ID to the EObjectFlatComboViewer
*
* @param id
* the id of the widget
*/
public void setID(Object id) {
EditingUtils.setID(field, id);
EditingUtils.setID(removeButton, id);
EditingUtils.setID(browseButton, id);
}
/**
* @return the ID of the EObjectFlatComboViewer
*/
public Object getID() {
return EditingUtils.getID(field);
}
protected abstract void createLabels(Composite parent);
private Composite createComposite(Composite parent) {
Composite composite;
if (widgetFactory == null) {
composite = new Composite(parent, SWT.NONE);
} else {
composite = widgetFactory.createComposite(parent);
}
return composite;
}
protected Button createButton(Composite parent, String text, int style) {
Button button;
if (widgetFactory == null) {
button = new Button(parent, style);
button.setText(text);
} else {
button = widgetFactory.createButton(parent, text, style);
}
return button;
}
public abstract void setSelection(ISelection selection);
public abstract void setSelection(EObject selection);
public EObject getSelection() {
return selection;
}
/**
* Behavior executed when browse button is pressed.
*/
protected void browseButtonPressed() {
switch (button_mode) {
case BROWSE:
TabElementTreeSelectionDialog dialog = new TabElementTreeSelectionDialog(
input, filters, brFilters, dialogTitle, adapterFactory,
getMainResource()) {
@Override
public void process(IStructuredSelection selection) {
if (selection != null && !selection.isEmpty()) {
handleSelection((EObject) selection.getFirstElement());
}
}
};
// Select the actual element in dialog
if (selection != null) {
dialog.setSelection(new StructuredSelection(selection));
}
dialog.open();
break;
case CREATE:
handleCreate();
break;
default:
break;
}
}
public void handleSelection(EObject selectedElement) {
setSelection(selectedElement);
callback.handleSet(selectedElement);
}
public void handleCreate() {
setSelection(callback.handleCreate());
}
public void handleEdit(EObject element) {
callback.handleEdit(element);
// refresh the text;
setSelection(element);
}
public interface EObjectFlatComboViewerListener {
public void handleSet(EObject element);
public void navigateTo(EObject element);
public EObject handleCreate();
public void handleEdit(EObject element);
}
/**
* @param layoutData
* the layoutData to set
*/
public void setLayoutData(Object layoutData) {
composite.setLayoutData(layoutData);
}
public void addFilter(ViewerFilter filter) {
filters.add(filter);
}
public void addBusinessRuleFilter(ViewerFilter filter) {
brFilters.add(filter);
}
public void removeBusinessRuleFilter(ViewerFilter filter) {
brFilters.remove(filter);
}
public void removeFilter(ViewerFilter filter) {
filters.remove(filter);
}
public void setButtonMode(ButtonsModeEnum button_mode) {
this.button_mode = button_mode;
}
/**
* Returns the main resource.
*
* @return the main resource.
*/
public Resource getMainResource() {
if (this.mainResource == null && this.input instanceof EEFEditorSettings) {
Resource mainResourceFromSettings = null;
// Gets the mainResource from the settings.
EEFEditorSettings settings = (EEFEditorSettings) this.input;
if (settings.getSource() != null) {
// The default mainResource is the resource of the edited
// object.
mainResourceFromSettings = settings.getSource().eResource();
if (settings.getValue() instanceof EObject && ((EObject) settings.getValue()).eResource() != null) {
// The mainResource is the resource of the value.
mainResourceFromSettings = ((EObject) settings.getValue()).eResource();
}
}
if (mainResourceFromSettings != null) {
return mainResourceFromSettings;
}
}
//
// Client has specified a main resource. Let's use it !
return this.mainResource;
}
public void setMainResource(Resource mainResource) {
this.mainResource = mainResource;
}
/**
* Sets the viewer readonly
*
* @param enabled
* sets the viewer read only or not.
*/
public void setEnabled(boolean enabled) {
browseButton.setEnabled(enabled);
removeButton.setEnabled(enabled);
}
/**
* @return if the table is enabled
*/
public boolean isEnabled() {
return true;
}
/**
* Sets the tooltip text on the viewer
*
* @param tooltip
* the tooltip text
*/
public void setToolTipText(String tooltip) {
browseButton.setToolTipText(tooltip);
}
}