/** * */ 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.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.emf.eef.runtime.EEFRuntimePlugin; import org.eclipse.emf.eef.runtime.ui.utils.EditingUtils; import org.eclipse.emf.eef.runtime.ui.widgets.settings.EEFEditorSettings; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Control; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.widgets.FormToolkit; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> * */ public class SingleCompositionEditor extends Viewer { private FormToolkit toolkit; private Composite container; private Object input; private ILabelProvider labelProvider; private Text inputDisplay; private AdapterFactory adapterFactory; private List<SingleCompositionListener> listeners; private Button edit; private Button clear; /** * @param parent parent {@link Composite} of this viewer. * @param styles Styles to apply to this viewer. */ public SingleCompositionEditor(Composite parent, int styles) { buildEditor(parent); } /** * @param toolkit {@link FormToolkit} to use to build this editor. * @param parent parent {@link Composite} of this viewer. * @param styles Styles to apply to this viewer. */ public SingleCompositionEditor(FormToolkit toolkit, Composite parent, int styles) { this.toolkit = toolkit; buildEditor(parent); } private void buildEditor(Composite parent) { if (toolkit != null) { container = toolkit.createComposite(parent); } else { container = new Composite(parent, SWT.NONE); } container.setLayout(new GridLayout(3, false)); GridData comboData = new GridData(GridData.FILL_HORIZONTAL); comboData.horizontalSpan = 3; if (toolkit != null) { inputDisplay = toolkit.createText(container, ""); } else { inputDisplay = new Text(container, SWT.BORDER); } inputDisplay.setEditable(false); inputDisplay.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); if (toolkit != null) { edit = toolkit.createButton(container, "...", SWT.PUSH); } else { edit = new Button(container, SWT.PUSH); edit.setText("..."); } EditingUtils.setEEFtype(edit, "eef::SingleCompositionEditor::editbutton"); edit.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ public void widgetSelected(SelectionEvent e) { for (SingleCompositionListener listener : listeners) { listener.edit(); } } }); if (toolkit != null) { clear = toolkit.createButton(container, "", SWT.PUSH); } else { clear = new Button(container, SWT.PUSH); } clear.setImage(EEFRuntimePlugin.getImage(EEFRuntimePlugin.ICONS_16x16 + "Delete_16x16.gif")); EditingUtils.setEEFtype(clear, "eef::SingleCompositionEditor::clearbutton"); clear.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ public void widgetSelected(SelectionEvent e) { for (SingleCompositionListener listener : listeners) { listener.clear(); } } }); listeners = new ArrayList<SingleCompositionListener>(); } /** * Defines the layout data of this viewer. * @param data Layout data. */ public void setLayoutData(Object data) { container.setLayoutData(data); } /** * @param adapterFactory the {@link AdapterFactory} to use. */ public void setAdapterFactory(AdapterFactory adapterFactory) { this.adapterFactory = adapterFactory; } /** * Defines the {@link LabelProvider} to use in this viewer. * @param labelProvider the {@link LabelProvider} to use. */ public void setLabelProvider(ILabelProvider labelProvider) { this.labelProvider = labelProvider; } /** * {@inheritDoc} * @see org.eclipse.jface.viewers.Viewer#getControl() */ public Control getControl() { return container; } /** * {@inheritDoc} * @see org.eclipse.jface.viewers.Viewer#getInput() */ public Object getInput() { return input; } /** * {@inheritDoc} * @see org.eclipse.jface.viewers.Viewer#refresh() */ public void refresh() { Object value; if (input instanceof EEFEditorSettings) { value = ((EEFEditorSettings) input).getValue(); } else { value = input; } inputDisplay.setText(getLabelProvider().getText(value)); } /** * {@inheritDoc} * @see org.eclipse.jface.viewers.Viewer#setInput(java.lang.Object) */ public void setInput(Object input) { this.input = input; refresh(); } /** * Adds a {@link SingleCompositionListener} to the list. * @param listener the listener to add. */ public void addEditorListener(SingleCompositionListener listener) { listeners.add(listener); } /** * Removes a {@link SingleCompositionListener} to the list. * @param listener the listener to remove. */ public void removeEditorListener(SingleCompositionListener listener) { listeners.remove(listener); } /** * {@inheritDoc} * @see org.eclipse.jface.viewers.Viewer#getSelection() */ public ISelection getSelection() { return null; } /** * {@inheritDoc} * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean) */ public void setSelection(ISelection selection, boolean reveal) { } private ILabelProvider getLabelProvider() { if (labelProvider != null) { return labelProvider; } else if (adapterFactory != null) { labelProvider = new AdapterFactoryLabelProvider(adapterFactory); return labelProvider; } return null; } /** * * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> * */ public interface SingleCompositionListener { /** * The edit button has been selected. */ void edit(); /** * The clear button has been selected. */ void clear(); } /** * Sets the given ID to the EObjectFlatComboViewer * * @param id * the id of the widget */ public void setID(Object id) { EditingUtils.setID(inputDisplay, id); EditingUtils.setID(edit, id); EditingUtils.setID(clear, id); } /** * @return the ID of the EObjectFlatComboViewer */ public Object getID() { return EditingUtils.getID(inputDisplay); } /** * Sets the viewer readonly * * @param enabled * sets the viewer read only or not. */ public void setEnabled(boolean enabled) { edit.setEnabled(enabled); inputDisplay.setEnabled(enabled); clear.setEnabled(enabled); } /** * @return if the table is enabled */ public boolean isEnabled() { return inputDisplay.isEnabled(); } /** * Sets the tooltip text on the viewer * * @param tooltip * the tooltip text */ public void setToolTipText(String tooltip) { edit.setToolTipText(tooltip); clear.setToolTipText(tooltip); inputDisplay.setToolTipText(tooltip); } }