/******************************************************************************* * Copyright (c) 2008, 2011 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.eef.runtime.ui.widgets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; 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.referencestable.ReferencesTableSettings; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; 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.Text; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> */ public class FlatReferencesTable extends Composite implements ISelectionProvider, IPropertiesFilteredWidget { /** * The text displaying the current values of the feature */ private Text selection; /** * Button to edit the feature */ protected Button editer; /** * The static filters */ protected List<ViewerFilter> filters; /** * The filters that can be enabled/disabled */ protected List<ViewerFilter> brFilters; /** * The widget listener */ private List<ISelectionChangedListener> listeners; /** * The labelProvider to use */ protected ILabelProvider delegatedLabelProvider; /** * Label provider able to display lists */ protected ILabelProvider listLabelProvider; /** * The mode of the button */ private ButtonsModeEnum button_mode = ButtonsModeEnum.BROWSE; /** * The edited element */ protected EObject editedElement; /** * The edited feature */ protected EStructuralFeature feature; /** * The input for the choice of values */ protected Object input; protected EList<?> result; private EReference containingFeature; /** * Default constructor * * @param parent * the parent widget */ public FlatReferencesTable(Composite parent) { super(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; this.setLayout(layout); selection = new Text(this, SWT.BORDER); GridData selectionData = new GridData(GridData.FILL_HORIZONTAL); // selectionData.widthHint = 400; selection.setLayoutData(selectionData); selection.setEditable(false); EditingUtils.setEEFtype(selection, "eef::FlatReferencesTable::field"); editer = new Button(this, SWT.PUSH); editer.setText(EEFRuntimeUIMessages.EObjectFlatComboViewer_add_button); filters = new ArrayList<ViewerFilter>(); brFilters = new ArrayList<ViewerFilter>(); listeners = new ArrayList<ISelectionChangedListener>(); editer.addSelectionListener(getSelectionAdapter()); EditingUtils.setEEFtype(editer, "eef::FlatReferencesTable::browsebutton"); } protected SelectionAdapter getSelectionAdapter() { return new SelectionAdapter() { /* * (non-Javadoc) * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse * .swt.events.SelectionEvent) */ public void widgetSelected(SelectionEvent e) { switch (button_mode) { case BROWSE: if (input instanceof ReferencesTableSettings) { List currentValues = Arrays.asList(((ReferencesTableSettings)input).getValue()); Object choiceOfValues2 = ((ReferencesTableSettings)input).choiceOfValues(null); List cloneOfValues = new ArrayList(); if (choiceOfValues2 instanceof List) { cloneOfValues.addAll((List)choiceOfValues2); } else { cloneOfValues.add(choiceOfValues2); } EEFFeatureEditorDialog dialog = new EEFFeatureEditorDialog( getParent().getShell(), EEFRuntimeUIMessages.FlatReferencesTable_featureEditor_title, delegatedLabelProvider, currentValues, cloneOfValues, false, true, filters, brFilters); int open = dialog.open(); if (open == Dialog.OK) { selectionChanged(new StructuredSelection(dialog.getResult())); refresh(); } } break; default: break; } } }; } /**************************************************************************************************************************************** * Widget configuration ****************************************************************************************************************************************/ /** * Defines the labelProvider of the widget * * @param provider * the labelProvider to use */ public void setLabelProvider(ILabelProvider provider) { this.delegatedLabelProvider = provider; if (listLabelProvider == null) { listLabelProvider = new ILabelProvider() { public void addListener(ILabelProviderListener listener) { delegatedLabelProvider.addListener(listener); } public void dispose() { delegatedLabelProvider.dispose(); } public Image getImage(Object element) { return delegatedLabelProvider.getImage(element); } public String getText(Object element) { if (element instanceof List) { StringBuilder result = new StringBuilder(""); //$NON-NLS-1$ final List collec = (List)element; if (collec.size() > 0) { result.append(delegatedLabelProvider.getText(collec.get(0))); if (collec.size() > 1) { for (int i = 1; i < collec.size(); i++) { result.append(", "); //$NON-NLS-1$ result.append(delegatedLabelProvider.getText(collec.get(i))); } } } return result.toString(); } return delegatedLabelProvider.getText(element); } public boolean isLabelProperty(Object element, String property) { return delegatedLabelProvider.isLabelProperty(element, property); } public void removeListener(ILabelProviderListener listener) { delegatedLabelProvider.removeListener(listener); } }; } } /** * Defines the mode of the button * * @param button_mode * the mode to set */ public void setButtonMode(ButtonsModeEnum button_mode) { this.button_mode = button_mode; } /** * @return the input */ public Object getInput() { return input; } /** * Defines the input for the choice of values * * @param input * the input */ public void setInput(Object input) { if (this.input != input) { this.input = input; } refresh(); } /** * Sets the given ID to the EMFComboViewer * * @param id * the ID to give */ public void setID(Object id) { EditingUtils.setID(selection, id); EditingUtils.setID(editer, id); } /** * @return the ID of the EObjectFlatComboViewer */ public Object getID() { return EditingUtils.getID(selection); } /**************************************************************************************************************************************** * Selection management ****************************************************************************************************************************************/ /* * (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener * (org.eclipse.jface.viewers. ISelectionChangedListener) */ public void addSelectionChangedListener(ISelectionChangedListener listener) { listeners.add(listener); } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener * (org.eclipse.jface.viewers .ISelectionChangedListener) */ public void removeSelectionChangedListener(ISelectionChangedListener listener) { listeners.remove(listener); } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() */ public ISelection getSelection() { throw new UnsupportedOperationException(EEFRuntimeUIMessages.FlatReferencesTable_nothing_to_do); } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse .jface.viewers.ISelection) */ public void setSelection(ISelection pSelection) { throw new UnsupportedOperationException(EEFRuntimeUIMessages.FlatReferencesTable_nothing_to_do); } public void refresh() { if (input instanceof ReferencesTableSettings) { List<Object> values = Arrays.asList(((ReferencesTableSettings)input).getValue()); if (listLabelProvider != null) { selection.setText(listLabelProvider.getText(values)); } else { StringBuilder result = new StringBuilder(""); //$NON-NLS-1$ if (values.size() > 0) { result.append(values.get(0).toString()); if (values.size() > 1) { for (int i = 1; i < values.size(); i++) { result.append(", "); //$NON-NLS-1$ result.append(values.get(i).toString()); } } } selection.setText(result.toString()); } } else selection.setText(""); //$NON-NLS-1$ } /** * The selection has changed * * @param selection * the new selection */ protected void selectionChanged(ISelection selection) { if (listeners != null && !listeners.isEmpty()) { for (ISelectionChangedListener nextListener : listeners) { nextListener.selectionChanged(new SelectionChangedEvent(this, selection)); } } } /**************************************************************************************************************************************** * Filter management ****************************************************************************************************************************************/ /* * (non-Javadoc) * @see org.eclipse.emf.eef.runtime.ui.widgets.IPropertiesFilteredWidget#addFilter * (org.eclipse.jface.viewers .ViewerFilter) */ public void addFilter(ViewerFilter filter) { filters.add(filter); } /* * (non-Javadoc) * @see org.eclipse.emf.eef.runtime.ui.widgets.IPropertiesFilteredWidget#removeFilter * (org.eclipse.jface.viewers .ViewerFilter) */ public void removeFilter(ViewerFilter filter) { filters.remove(filter); } /* * (non-Javadoc) * @see org.eclipse.emf.eef.runtime.ui.widgets.IPropertiesFilteredWidget# * addBusinessRuleFilter(org.eclipse. jface.viewers.ViewerFilter) */ public void addBusinessRuleFilter(ViewerFilter filter) { brFilters.add(filter); } /* * (non-Javadoc) * @see org.eclipse.emf.eef.runtime.ui.widgets.IPropertiesFilteredWidget# * removeBusinessRuleFilter(org.eclipse .jface.viewers.ViewerFilter) */ public void removeBusinessRuleFilter(ViewerFilter filter) { brFilters.remove(filter); } /** * Clear the list of static filters */ public void resetFilters() { filters.clear(); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); editer.setEnabled(enabled); } }