/******************************************************************************* * Copyright (c) 2006-2013 The RCP Company 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: * The RCP Company - initial API and implementation *******************************************************************************/ package com.rcpcompany.uibindings.internal; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.core.databinding.observable.Observables; import org.eclipse.core.databinding.observable.Realm; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.IValueChangeListener; import org.eclipse.core.databinding.observable.value.ValueChangeEvent; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.runtime.Assert; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.EMap; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.util.EObjectWithInverseEList; import org.eclipse.emf.ecore.util.EcoreEMap; import org.eclipse.emf.ecore.util.InternalEList; import org.eclipse.jface.resource.JFaceColors; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.LabelProviderChangedEvent; import org.eclipse.jface.viewers.OwnerDrawLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import com.rcpcompany.uibindings.BindingState; import com.rcpcompany.uibindings.Constants; import com.rcpcompany.uibindings.IBinding; import com.rcpcompany.uibindings.IBindingDataType; import com.rcpcompany.uibindings.ICellEditorFactory; import com.rcpcompany.uibindings.ICellEditorFactoryContext; import com.rcpcompany.uibindings.IColumnAdapter; import com.rcpcompany.uibindings.IColumnBinding; import com.rcpcompany.uibindings.IColumnBindingCellInformation; import com.rcpcompany.uibindings.IConstantTreeItem; import com.rcpcompany.uibindings.IManager; import com.rcpcompany.uibindings.ISourceProviderStateContext; import com.rcpcompany.uibindings.IUIAttribute; import com.rcpcompany.uibindings.IUIBindingsFactory; import com.rcpcompany.uibindings.IUIBindingsPackage; import com.rcpcompany.uibindings.IValueBinding; import com.rcpcompany.uibindings.IValueBindingCell; import com.rcpcompany.uibindings.IViewerBinding; import com.rcpcompany.uibindings.SpecialBinding; import com.rcpcompany.uibindings.UIBindingsEMFObservables; import com.rcpcompany.uibindings.UIBindingsUtils; import com.rcpcompany.uibindings.UIBindingsUtils.IClassIdentiferMapper; import com.rcpcompany.uibindings.internal.cellEditors.SimpleCellEditorFactory; import com.rcpcompany.uibindings.internal.observables.ListIndexObservableValue; import com.rcpcompany.uibindings.observables.MapperObservableValue; import com.rcpcompany.uibindings.uiAttributes.UIAttributePainter; import com.rcpcompany.uibindings.uiAttributes.VirtualUIAttribute; import com.rcpcompany.uibindings.utils.IColumnChooser; import com.rcpcompany.utils.basic.ui.TSSWTUtils; import com.rcpcompany.utils.logging.LogUtils; /** * <!-- begin-user-doc --> An implementation of the model object '<em><b>Column Binding</b></em>'. * <!-- end-user-doc --> * <p> * The following features are implemented: * <ul> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getViewerBinding <em>Viewer * Binding</em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getViewerColumn <em>Viewer Column * </em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getColumnAdapter <em>Column * Adapter</em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getBaseColumn <em>Base Column * </em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getSubColumns <em>Sub Columns * </em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getCells <em>Cells</em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getSpecialBindingType <em>Special * Binding Type</em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getFactory <em>Factory</em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getCursor <em>Cursor</em>}</li> * <li>{@link com.rcpcompany.uibindings.internal.ColumnBindingImpl#getColumnVisibility <em>Column * Visibility</em>}</li> * </ul> * </p> * * @generated */ public class ColumnBindingImpl extends BindingImpl implements IColumnBinding { @Override public String getDisplayText(Object element) { final IColumnBindingCellInformation ci = getCellInformation(element); return ci.getDisplayText(); } /** * Returns the viewer used for this column. * * @return the viewer */ public ColumnViewer getViewer() { return getViewerBinding().getViewer(); // TODO SWTB } /** * The label provider for the column. */ private GeneralLabelProvider myLabelProvider; @Override public IColumnBinding model(EStructuralFeature feature) { assertTrue(feature != null, "No feature?"); //$NON-NLS-1$ return model(UIBindingsEMFObservables.valueFactory(Realm.getDefault(), getEditingDomain(), feature), feature); } @Override public IColumnBinding model(IColumnBinding baseCol, EStructuralFeature feature) { assertTrue(baseCol != null, "No base column?"); //$NON-NLS-1$ assertTrue(baseCol.getViewerBinding() == getViewerBinding(), "Not same viewer"); //$NON-NLS-1$ setBaseColumn(baseCol); return model(feature); } @Override public IColumnBinding model(SpecialBinding specialValue) { assertTrue(specialValue != null, "No value?"); //$NON-NLS-1$ setSpecialBindingType(specialValue); switch (specialValue) { case ROW_ELEMENT: final IObservableFactory rowElementFactory = new IObservableFactory() { @Override public IObservable createObservable(Object target) { return Observables.constantObservableValue(target, EcorePackage.Literals.EOBJECT); } }; return model(rowElementFactory, EcorePackage.Literals.EOBJECT).dynamic(); case ROW_NO: final IObservableFactory rowNoFactory = new IObservableFactory() { @Override public IObservable createObservable(Object target) { return new ListIndexObservableValue(getViewerBinding().getList(), target, 1); } }; return model(rowNoFactory, EcorePackage.Literals.EINT).label(Messages.ColumnBindingImpl_RowNo_ColumnHeader) .readonly().arg(IColumnChooser.ARG_CHOOSABLE, false); case TREE_ITEM: final IObservableFactory treeItemFactory = new IObservableFactory() { private final IObservableValue dummyOV = WritableValue.withValueType(EcorePackage.Literals.EOBJECT); private final IUIAttribute dummyAttribute = new VirtualUIAttribute(String.class); /* * This binding is finished before first use by the context... */ private final IValueBinding dummyBinding = getContext().addBinding().ui(dummyAttribute).model(dummyOV) .dynamic().arg("dummyBinding", true); private final IObservableValue myOV = Observables.constantObservableValue("...", EcorePackage.Literals.ESTRING); @Override public IObservable createObservable(Object target) { if (!(target instanceof EObject)) return null; Assert.isTrue(dummyBinding.getState() == BindingState.OK || dummyBinding.getState() == BindingState.PHASE2); final EObject eobj = (EObject) target; final EClass ec = eobj.eClass(); /* * Reset... */ dummyBinding.getExtraArgumentProviders().clear(); dummyBinding.clearCachedArguments(); /* * This is not pretty - or efficient! * * The problem: to know the value of the argument ARG_FEATURE_NAME, we need a * binding with a observable value with the correct value - but in the * observable factory we don't yet have the correct value... * * The solution - for now: to have an extra dynamic binding which gets the * correct value and is then asked for the argument :-/ */ dummyOV.setValue(eobj); /* * Special case: for ConstantTreeItem, we use the description as an extra * argument provider */ if (eobj instanceof IConstantTreeItem) { dummyBinding.getExtraArgumentProviders().add(((IConstantTreeItem) eobj).getDescriptor()); } IClassIdentiferMapper mapper = null; if (mapper == null) { /* * Check for a mapper... */ mapper = UIBindingsUtils.createClassIdentiferMapper(dummyBinding, ec); } if (mapper instanceof UIBindingsUtils.DefaultMapper) { // LogUtils.debug(ColumnBindingImpl.this, "Default mapper for '" + target + // "'"); } /* * Remove the reference from the dummy to the object again. This will clean up a * lot of internal structures, and also make debugging a lot easier!!! */ dummyOV.setValue(null); dummyBinding.getExtraArgumentProviders().clear(); dummyBinding.clearCachedArguments(); final IObservableValue ov = Observables.constantObservableValue(eobj, ec); return new MapperObservableValue(ov, getContext().getEditingDomain(), mapper); } }; return model(treeItemFactory, EcorePackage.Literals.EJAVA_OBJECT) .label(Messages.ColumnBindingImpl_TreeItem_ColumnHeader).dynamic() .arg(IColumnChooser.ARG_CHOOSABLE, false); default: assertTrue(false, "Special value " + specialValue + " not supported for this type of binding"); //$NON-NLS-1$ //$NON-NLS-2$ } return this; } /** * Initializes the factory and dataType fields. * * @param factory the factory to use * @param dataType the data type to use. * @return <code>this</code> */ private IColumnBinding model(IObservableFactory factory, IBindingDataType dataType) { assertTrue(factory != null, "No factory?"); //$NON-NLS-1$ assertTrue(dataType != null, "No data type?"); //$NON-NLS-1$ this.factory = factory; setStaticDataType(dataType); return this; } @Override public IColumnBinding model(IObservableFactory factory, EClassifier type) { assertTrue(factory != null, "No factory?"); //$NON-NLS-1$ assertTrue(type != null, "No type?"); //$NON-NLS-1$ return model(factory, IBindingDataType.Factory.create(null, type)); } @Override public IColumnBinding model(IObservableFactory factory, EStructuralFeature feature) { assertTrue(factory != null, "No factory?"); //$NON-NLS-1$ assertTrue(feature != null, "No type?"); //$NON-NLS-1$ return model(factory, IBindingDataType.Factory.create(factory, feature)); } @Override public IColumnBinding model(IColumnBinding baseColumn, IObservableFactory factory, EStructuralFeature feature) { assertTrue(baseColumn != null, "No base column?"); //$NON-NLS-1$ assertTrue(baseColumn.getViewerBinding() == getViewerBinding(), "Not same viewer"); //$NON-NLS-1$ setBaseColumn(baseColumn); return model(factory, feature); } @Override public IColumnBinding arg(String name, Object value) { assertTrue(name != null, "name must be non-null"); //$NON-NLS-1$ getArguments().put(name.intern(), value); return this; } @Override public IColumnBinding args(Map<String, Object> arguments) { setArguments(arguments); return this; } @Override public IColumnBinding type(String type) { return arg(Constants.ARG_TYPE, type); } @Override public IColumnBinding readonly() { return arg(Constants.ARG_READONLY, true); } @Override public IColumnBinding id(String id) { setId(id); return this; } @Override public IColumnBinding dynamic() { return arg(Constants.ARG_DYNAMIC, true); } @Override public IColumnBinding label(String label) { return arg(Constants.ARG_LABEL, label); } @Override public IColumnBinding validValues(IObservableList list) { return arg(Constants.ARG_VALID_VALUES, list); } @Override public IColumnBinding validValues(EObject obj, EReference reference) { return validValues(UIBindingsEMFObservables.observeList(getEditingDomain(), obj, reference)); } @Override public IColumnBinding addColumn(ViewerColumn column, EStructuralFeature feature) { return getViewerBinding().addColumn().column(column).model(this, feature); } @Override public IColumnBinding addColumn(TableColumn column, EStructuralFeature feature) { return getViewerBinding().addColumn().column(column).model(this, feature); } @Override public IColumnBinding addColumn(TreeColumn column, EStructuralFeature feature) { return getViewerBinding().addColumn().column(column).model(this, feature); } @Override public IColumnBinding column(ViewerColumn column) { assertTrue(column != null, "No column?"); //$NON-NLS-1$ assertTrue(column.getViewer() == getViewer(), "column does not belong to this viewer"); //$NON-NLS-1$ setViewerColumn(column); if (column instanceof TableViewerColumn) { setColumnAdapter(new TableColumnAdapter(((TableViewerColumn) column).getColumn())); } else if (column instanceof TreeViewerColumn) { setColumnAdapter(new TreeColumnAdapter(((TreeViewerColumn) column).getColumn())); } else { assertTrue(false, "Viewer Column type not supported"); //$NON-NLS-1$ } return this; } @Override public IColumnBinding column(TableColumn column) { assertTrue(column != null, "No column?"); //$NON-NLS-1$ final ColumnViewer viewer = getViewer(); assertTrue(viewer instanceof TableViewer, "A TableColumn can only be added to a TableViewer"); //$NON-NLS-1$ return column(new TableViewerColumn((TableViewer) viewer, column)); } @Override public IColumnBinding column(TreeColumn column) { assertTrue(column != null, "No column?"); //$NON-NLS-1$ final ColumnViewer viewer = getViewer(); assertTrue(viewer instanceof TreeViewer, "A TreeColumn can only be added to a TreeViewer"); //$NON-NLS-1$ return column(new TreeViewerColumn((TreeViewer) viewer, column)); } @Override public Class<?> getUIType() { return String.class; } /** * This will finish the binding and make it effective. * <p> * The idea is to use a proper UI binding to do the conversion of values exactly as for * {@link Text} widgets. * <p> * This entails the following steps: * <ul> * <li>Setting the column header if not already set</li> * <li>finding the {@link #getModelType() model value type}</li> * <li>creating a new {@link IUIAttribute} for this binding</li> * <li>setting up a binding between the two</li> * <li>setting up a column map to track changes in the column and report these via the label * provider * </ul> */ @Override public void finish1() { final ViewerColumn c = getViewerColumn(); assertTrue(c != null, "No column set"); //$NON-NLS-1$ assertTrue(getStaticDataType() != null, "No column data type set"); //$NON-NLS-1$ /* * Check that the feature can be used with the source */ // Object type = source.getValueType(); // EClass sourceEClass = null; // if (type instanceof EClass) { // sourceEClass = (EClass) type; // } else if (type instanceof EReference) { // sourceEClass = ((EReference) type).getEReferenceType(); // } else { // LogUtils.debug(this, "EClass of source unknown"); // } // TODO:XXX possibly add an extended IOF interface, that lets the provider // specify a base EC as well. // if (sourceEClass != null && myFactory == null) { // Assert.isTrue(getFeature().getEContainingClass().isSuperTypeOf(sourceEClass), "Feature " // + getFeature().getEContainingClass().getName() + "." + getFeature().getName() + // " is not of type " // + sourceEClass.getName()); // } if (getColumnAdapter() != null) { final Widget widget = getColumnAdapter().getWidget(); registerWidget(widget); /* * The name of the column, if not already set. */ String name = getColumnAdapter().getText(); if (name == null || name.length() == 0) { name = getLabel(); getColumnAdapter().setText(name); } // TODO bind help ID String value; // value = getArgument(IBinding.ARG_HELP_ID, String.class, null); // if (value != null) PlatformUI.getWorkbench().getHelpSystem().setHelp(control, value); // bind tool tip value = getArgument(Constants.ARG_TOOL_TIP_TEXT, String.class, null); if (value != null) { getColumnAdapter().setToolTipText(value); } final Integer align = getArgument(Constants.ARG_ALIGNMENT, Integer.class, null); if (align == null) { arg(Constants.ARG_ALIGNMENT, getColumnAdapter().getAlignment()); } getColumnAdapter().setAlignment(SWT.CENTER); } } @Override public void finish2() { super.finish2(); myLabelProvider = new GeneralLabelProvider(); getViewerColumn().setLabelProvider(myLabelProvider); myEditingSupport = new MyEditingSupport(); getViewerColumn().setEditingSupport(myEditingSupport); } @Override public void dispose() { if (isDisposed()) return; setState(BindingState.DISPOSE_PENDING); disposeServices(); /* * Dispose any columns first that depends on this column... */ while (getSubColumns().size() > 0) { getSubColumns().get(0).dispose(); } final Collection<IColumnBindingCellInformation> ciValues = getCells().values(); final IColumnBindingCellInformation[] ciArray = ciValues.toArray(new IColumnBindingCellInformation[ciValues .size()]); for (final IColumnBindingCellInformation ci : ciArray) { ci.dispose(); } if (getColumnAdapter() != null) { final Widget widget = getColumnAdapter().getWidget(); unregisterWidget(widget); } setBaseColumn(null); if (myLabelProvider != null) { myLabelProvider.dispose(); myLabelProvider = null; } // EditingSupport need not be disposed. super.dispose(); } /** * Taken directly from * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.snippets/Eclipse * %20JFace%20Snippets * /org/eclipse/jface/snippets/viewers/Snippet041TableViewerAlternatingColors.java?view=markup */ protected static class OptimizedIndexSearcher { private int lastIndex = 0; public boolean isEven(TableItem item) { final TableItem[] items = item.getParent().getItems(); // 1. Search the next ten items for (int i = lastIndex; i < items.length && lastIndex + 10 > i; i++) { if (items[i] == item) { lastIndex = i; return lastIndex % 2 == 0; } } // 2. Search the previous ten items for (int i = lastIndex; i < items.length && lastIndex - 10 > i; i--) { if (items[i] == item) { lastIndex = i; return lastIndex % 2 == 0; } } // 3. Start from the beginning for (int i = 0; i < items.length; i++) { if (items[i] == item) { lastIndex = i; return lastIndex % 2 == 0; } } return false; } } /** * Utility object used to find index number */ protected final OptimizedIndexSearcher myIndexSearcher = new OptimizedIndexSearcher(); /** * The {@link ColumnLabelProvider column label provider} used for this column. * <p> * Uses the map to provide {@link LabelProviderChangedEvent label provider changed events}. */ private class GeneralLabelProvider extends OwnerDrawLabelProvider { private GeneralLabelProvider() { setOwnerDrawEnabled(getViewer(), getViewerColumn(), true); } @Override public String getToolTipText(Object element) { final IColumnBindingCellInformation ci = getCellInformation(element); return ci.getToolTipText(); } @Override public void update(final ViewerCell cell) { /* * Redraw the cell... */ super.update(cell); final Object element = cell.getElement(); final IColumnBindingCellInformation ci = getCellInformation(element); if (ci == null) return; final IValueBinding labelBinding = ci.getLabelBinding(); assertTrue(!labelBinding.isDisposed(), "binding disposed"); if (Activator.getDefault().TRACE_EVENTS_LABELPROVIDERS) { LogUtils.debug(labelBinding, labelBinding + " update: " //$NON-NLS-1$ + labelBinding.getUIAttribute().getCurrentValue().getValue()); } // TODO possible move this to an extender if (labelBinding.eIsSet(IUIBindingsPackage.Literals.BINDING__ERROR_CONDITIONS)) { final List<String> errorConditions = labelBinding.getErrorConditions(); if (errorConditions.size() > 0) { final StringBuilder sb = new StringBuilder(200); for (final String e : errorConditions) { sb.append(e).append('\n'); } cell.setForeground(JFaceColors.getErrorText(Display.getCurrent())); cell.setBackground(JFaceColors.getErrorBackground(Display.getCurrent())); cell.setText(sb.toString()); return; } } /* * Map all changes to the label attribute to the cell. */ final IUIAttribute labelAttribute = ci.getLabelUIAttribute(); final String tt = labelAttribute.getTooltip(); if (tt != null) { ci.setToolTipText(tt); } final UIAttributePainter painter = ci.getLabelPainter(); if (labelBinding.getModelType() == Boolean.class || labelBinding.getModelType() == Boolean.TYPE) { painter.setCheckbox((Boolean) labelBinding.getModelObservableValue().getValue()); painter.setHorizontalAlignment(SWT.CENTER); } else { painter.setCheckbox(null); final Integer align = labelBinding.getArgument(Constants.ARG_ALIGNMENT, Integer.class, null); if (align != null) { painter.setHorizontalAlignment(align); } } setCursor(labelAttribute.getCursor()); // For testing cell.setText((String) labelAttribute.getCurrentValue().getValue()); // Removed as Windows behaves strangely! // cell.setImage(ci.getLabelUIAttribute().getImage()); } /** * Sets up the painter. * * @param ci the cell * @param event the event that resulted in the painting */ private void setupPainter(final IColumnBindingCellInformation ci, Event event) { final UIAttributePainter painter = ci.getLabelPainter(); if (painter == null) return; /* * Figure out whether the cell has focus */ // TODO SVTB final ViewerCell focusCell = getViewerBinding().getViewer().getColumnViewerEditor().getFocusCell(); final boolean hasFocus = focusCell != null && focusCell.getItem() == event.item && focusCell.getColumnIndex() == event.index; painter.setFocus(hasFocus); // myPainter.setSelected((event.detail & SWT.SELECTED) != 0); // myPainter.setFocus((event.detail & SWT.FOCUSED) != 0); } /** * Handle the erase event. The default implementation does nothing to ensure keep native * selection highlighting working. * * @param event the erase event * @param element the model object * @see SWT#EraseItem */ @Override protected void erase(Event event, Object element) { // info has been set by 'update': announce that we paint ourselves event.detail &= ~SWT.FOREGROUND; // We handle selected state event.detail &= ~SWT.SELECTED; } @Override protected void measure(Event event, Object element) { final IColumnBindingCellInformation ci = getCellInformation(element); if (ci == null) return; setupPainter(ci, event); final UIAttributePainter painter = ci.getLabelPainter(); if (painter != null) { event.width = painter.getTextWidthDelta(event.gc); if (event.height < UIAttributePainter.getMinHeight()) { event.height = UIAttributePainter.getMinHeight(); } } } @Override protected void paint(Event event, Object element) { final IColumnBindingCellInformation ci = getCellInformation(element); if (ci == null) return; final IValueBinding labelBinding = ci.getLabelBinding(); if (Activator.getDefault().TRACE_EVENTS_LABELPROVIDERS) { LogUtils.debug(labelBinding, labelBinding + " paint: " + ci.getDisplayText()); //$NON-NLS-1$ } if (Activator.getDefault().TRACE_EVENTS_LABELPROVIDERS && Activator.getDefault().TRACE_EVENTS_SWT) { LogUtils.debug(labelBinding, TSSWTUtils.toString(event)); } if (labelBinding.eIsSet(IUIBindingsPackage.Literals.BINDING__ERROR_CONDITIONS)) return; setupPainter(ci, event); final UIAttributePainter painter = ci.getLabelPainter(); painter.setDefaultBackground(null); if (event.item instanceof TableItem && IManager.Factory.getManager().isAlternateRowColors()) { final TableItem item = (TableItem) event.item; final boolean even = myIndexSearcher.isEven(item); if (even) { painter.setDefaultBackground(JFaceResources.getColorRegistry().get( Constants.COLOR_DEFINITIONS_EVEN_ROW_BACKGROUND)); } else { painter.setDefaultBackground(getViewer().getControl().getDisplay().getSystemColor(SWT.COLOR_WHITE)); } } /* * Find the bounds of the item - depends on Table or Tree */ final Rectangle cellBounds; if (event.item instanceof TableItem) { cellBounds = ((TableItem) event.item).getBounds(event.index); } else if (event.item instanceof TreeItem) { cellBounds = ((TreeItem) event.item).getBounds(event.index); } else { LogUtils.error(this, "Cannot compute cell bounds. Cell ignored."); return; } /* * Note that outer bounds are inside the inner bounds! */ final Rectangle innerCellBounds = new Rectangle(cellBounds.x, cellBounds.y + UIBindingsUtils.calculateYAdjustment(getViewer().getControl()), cellBounds.width, cellBounds.height); final Rectangle outerCellBounds = new Rectangle(cellBounds.x + 7, cellBounds.y, cellBounds.width - 2 * 7, cellBounds.height); /* * Update any image decorations of the label... */ labelBinding.getUIAttribute().updateImageDecorations(getViewerBinding().getControl(), innerCellBounds, outerCellBounds); painter.paint(event.gc, cellBounds); } public void fireLabelChanged(Object[] elements) { final LabelProviderChangedEvent event = new LabelProviderChangedEvent(this, elements); super.fireLabelProviderChanged(event); } } /** * Editing Support for the column. */ public class MyEditingSupport extends EditingSupport { /** * Constructs and returns a new support object for this column. */ public MyEditingSupport() { super(ColumnBindingImpl.this.getViewer()); } @Override protected boolean canEdit(Object element) { final ViewerCell focusCell = getViewer().getColumnViewerEditor().getFocusCell(); if (focusCell == null) return false; if (focusCell.getElement() != focusCell.getViewerRow().getElement()) { LogUtils.debug(ColumnBindingImpl.this, "\ncell.element=" + focusCell.getElement() + "\nitem.data=" //$NON-NLS-1$ //$NON-NLS-2$ + focusCell.getViewerRow().getElement()); } final boolean changeable = getCellInformation(element).isChangeable(); if (Activator.getDefault().TRACE_LIFECYCLE_COLUMN_EDITORS) { LogUtils.debug(ColumnBindingImpl.this, "element=" + element + "\nchangeable: " + changeable); //$NON-NLS-1$ //$NON-NLS-2$ } return changeable; } @Override protected void initializeCellEditorValue(CellEditor cellEditor, ViewerCell cell) { } @Override protected void saveCellEditorValue(CellEditor cellEditor, ViewerCell cell) { } @Override protected CellEditor getCellEditor(Object element) { final ViewerCell focusCell = getViewer().getColumnViewerEditor().getFocusCell(); if (focusCell == null) return null; if (focusCell.getElement() != focusCell.getViewerRow().getElement()) { LogUtils.debug(ColumnBindingImpl.this, "\ncell.element=" + focusCell.getElement() + "\nitem.data=" //$NON-NLS-1$ //$NON-NLS-2$ + focusCell.getViewerRow().getElement()); } if (Activator.getDefault().TRACE_LIFECYCLE_COLUMN_EDITORS) { LogUtils.debug(ColumnBindingImpl.this, "element=" + element); //$NON-NLS-1$ } final IColumnBindingCellInformation ci = getCellInformation(element); /* * Find the cell editor to use form the binding. Defaults to a text widget */ final ICellEditorFactory factory = ci.getLabelBinding().getArgument( Constants.ARG_PREFERRED_CELL_EDITOR_FACTORY, ICellEditorFactory.class, SimpleCellEditorFactory.Factory.getFactory()); /* * Context used for the editor creation. */ final ICellEditorFactoryContext context = new ICellEditorFactoryContext() { @Override public IValueBindingCell getCell() { return ci; } @Override public Composite getParent() { /* * We know the control of the viewer is either a Table or a Tree - in both cases * a Composite */ return (Composite) getViewer().getControl(); } }; try { return factory.create(context); } catch (final Exception ex) { LogUtils.error(this, ex); } return null; } @Override protected Object getValue(Object element) { // Never used - uses data binding instead return null; } @Override protected void setValue(Object element, Object value) { // Never used - uses data binding instead } } @Override public IObservableValue getValue(Object element) { final IColumnBindingCellInformation ci = getCellInformation(element); return ci.getObjectValue(); } @Override public IBinding getParentBinding() { return getViewerBinding(); } /** * The cell information objects for this column. */ public MyEditingSupport myEditingSupport = null; @Override public IColumnBindingCellInformation getCellInformation(Object element, boolean create) { if (isDisposed()) return null; /* * NOTE to self: * * If the element is an IConstantTreeItem, we cannot use the target of this, as there can * easily be multiple of IConstantTreeItem that use the same target, but have different * descriptions... */ IColumnBindingCellInformation ci = getCells().get(element); if (ci == null && create) { ci = IUIBindingsFactory.eINSTANCE.createColumnBindingCellInformation(this, element); } return ci; } @Override public IColumnBindingCellInformation getCellInformation(Object element) { return getCellInformation(element, true); } private static class TableColumnAdapter extends ColumnAdapterImpl { private final TableColumn myColumn; private TableColumnAdapter(TableColumn column) { myColumn = column; } @Override public Widget getWidget() { return myColumn; } @Override public int getAlignment() { return myColumn.getAlignment(); } @Override public void setAlignment(int alignment) { myColumn.setAlignment(alignment); } @Override public void setImage(Image image) { myColumn.setImage(image); } @Override public void setMoveable(boolean moveable) { myColumn.setMoveable(moveable); } @Override public void setResizable(boolean resizable) { myColumn.setResizable(resizable); } @Override public void setText(String text) { myColumn.setText(text); } @Override public void setToolTipText(String text) { myColumn.setToolTipText(text); } @Override public void setWidth(int width) { myColumn.setWidth(width); } @Override public String getText() { return myColumn.getText(); } @Override public void addSelectionListener(SelectionListener listener) { myColumn.addSelectionListener(listener); } @Override public void removeSelectionListener(SelectionListener listener) { myColumn.removeSelectionListener(listener); } @Override public Image getImage() { return myColumn.getImage(); } @Override public String getToolTipText() { return myColumn.getToolTipText(); } @Override public int getWidth() { return myColumn.getWidth(); } @Override public boolean isMoveable() { return myColumn.getMoveable(); } @Override public boolean isResizable() { return myColumn.getResizable(); } } private static class TreeColumnAdapter extends ColumnAdapterImpl { private final TreeColumn myColumn; @Override public Widget getWidget() { return myColumn; } private TreeColumnAdapter(TreeColumn column) { myColumn = column; } @Override public int getAlignment() { return myColumn.getAlignment(); } @Override public void setAlignment(int alignment) { myColumn.setAlignment(alignment); } @Override public void setImage(Image image) { myColumn.setImage(image); } @Override public void setMoveable(boolean moveable) { myColumn.setMoveable(moveable); } @Override public void setResizable(boolean resizable) { myColumn.setResizable(resizable); } @Override public void setText(String text) { myColumn.setText(text); } @Override public void setToolTipText(String text) { myColumn.setToolTipText(text); } @Override public void setWidth(int width) { myColumn.setWidth(width); } @Override public String getText() { return myColumn.getText(); } @Override public void addSelectionListener(SelectionListener listener) { myColumn.addSelectionListener(listener); } @Override public void removeSelectionListener(SelectionListener listener) { myColumn.removeSelectionListener(listener); } @Override public Image getImage() { return myColumn.getImage(); } @Override public String getToolTipText() { return myColumn.getToolTipText(); } @Override public int getWidth() { return myColumn.getWidth(); } @Override public boolean isMoveable() { return myColumn.getMoveable(); } @Override public boolean isResizable() { return myColumn.getResizable(); } } /** * The cached value of the '{@link #getViewerBinding() <em>Viewer Binding</em>}' reference. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getViewerBinding() * @generated * @ordered */ protected IViewerBinding viewerBinding; /** * The default value of the '{@link #getViewerColumn() <em>Viewer Column</em>}' attribute. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getViewerColumn() * @generated * @ordered */ protected static final ViewerColumn VIEWER_COLUMN_EDEFAULT = null; /** * The cached value of the '{@link #getViewerColumn() <em>Viewer Column</em>}' attribute. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getViewerColumn() * @generated * @ordered */ protected ViewerColumn viewerColumn = VIEWER_COLUMN_EDEFAULT; /** * The cached value of the '{@link #getColumnAdapter() <em>Column Adapter</em>}' reference. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getColumnAdapter() * @generated * @ordered */ protected IColumnAdapter columnAdapter; /** * The cached value of the '{@link #getBaseColumn() <em>Base Column</em>}' reference. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getBaseColumn() * @generated * @ordered */ protected IColumnBinding baseColumn; /** * The cached value of the '{@link #getSubColumns() <em>Sub Columns</em>}' reference list. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getSubColumns() * @generated * @ordered */ protected EList<IColumnBinding> subColumns; /** * The cached value of the '{@link #getCells() <em>Cells</em>}' map. <!-- begin-user-doc --> * <!-- end-user-doc --> * * @see #getCells() * @generated * @ordered */ protected EMap<EObject, IColumnBindingCellInformation> cells; /** * The default value of the '{@link #getSpecialBindingType() <em>Special Binding Type</em>}' * attribute. <!-- begin-user-doc --> <!-- end-user-doc --> * * @see #getSpecialBindingType() * @generated * @ordered */ protected static final SpecialBinding SPECIAL_BINDING_TYPE_EDEFAULT = SpecialBinding.ROW_NO; /** * The cached value of the '{@link #getSpecialBindingType() <em>Special Binding Type</em>}' * attribute. <!-- begin-user-doc --> <!-- end-user-doc --> * * @see #getSpecialBindingType() * @generated * @ordered */ protected SpecialBinding specialBindingType = SPECIAL_BINDING_TYPE_EDEFAULT; /** * The default value of the '{@link #getFactory() <em>Factory</em>}' attribute. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getFactory() * @generated * @ordered */ protected static final IObservableFactory FACTORY_EDEFAULT = null; /** * The cached value of the '{@link #getFactory() <em>Factory</em>}' attribute. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getFactory() * @generated * @ordered */ protected IObservableFactory factory = FACTORY_EDEFAULT; /** * The default value of the '{@link #getCursor() <em>Cursor</em>}' attribute. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getCursor() * @generated * @ordered */ protected static final Cursor CURSOR_EDEFAULT = null; /** * The cached value of the '{@link #getCursor() <em>Cursor</em>}' attribute. <!-- begin-user-doc * --> <!-- end-user-doc --> * * @see #getCursor() * @generated * @ordered */ protected Cursor cursor = CURSOR_EDEFAULT; /** * The default value of the '{@link #getColumnVisibility() <em>Column Visibility</em>}' * attribute. <!-- begin-user-doc --> <!-- end-user-doc --> * * @see #getColumnVisibility() * @generated * @ordered */ protected static final IObservableValue COLUMN_VISIBILITY_EDEFAULT = null; /** * The cached value of the '{@link #getColumnVisibility() <em>Column Visibility</em>}' * attribute. <!-- begin-user-doc --> <!-- end-user-doc --> * * @see #getColumnVisibility() * @generated * @ordered */ protected IObservableValue columnVisibility = COLUMN_VISIBILITY_EDEFAULT; /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ public ColumnBindingImpl() { super(); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override protected EClass eStaticClass() { return IUIBindingsPackage.Literals.COLUMN_BINDING; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public IViewerBinding getViewerBinding() { return viewerBinding; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ public NotificationChain basicSetViewerBinding(IViewerBinding newViewerBinding, NotificationChain msgs) { final IViewerBinding oldViewerBinding = viewerBinding; viewerBinding = newViewerBinding; if (eNotificationRequired()) { final ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.COLUMN_BINDING__VIEWER_BINDING, oldViewerBinding, newViewerBinding); if (msgs == null) { msgs = notification; } else { msgs.add(notification); } } return msgs; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public void setViewerBinding(IViewerBinding newViewerBinding) { if (newViewerBinding != viewerBinding) { NotificationChain msgs = null; if (viewerBinding != null) { msgs = ((InternalEObject) viewerBinding).eInverseRemove(this, IUIBindingsPackage.VIEWER_BINDING__COLUMNS, IViewerBinding.class, msgs); } if (newViewerBinding != null) { msgs = ((InternalEObject) newViewerBinding).eInverseAdd(this, IUIBindingsPackage.VIEWER_BINDING__COLUMNS, IViewerBinding.class, msgs); } msgs = basicSetViewerBinding(newViewerBinding, msgs); if (msgs != null) { msgs.dispatch(); } } else if (eNotificationRequired()) { eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.COLUMN_BINDING__VIEWER_BINDING, newViewerBinding, newViewerBinding)); } } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated NOT */ @Override public ViewerColumn getViewerColumn() { assertTrue(viewerColumn != null, "Column has not been set"); //$NON-NLS-1$ return viewerColumn; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ public void setViewerColumn(ViewerColumn newViewerColumn) { final ViewerColumn oldViewerColumn = viewerColumn; viewerColumn = newViewerColumn; if (eNotificationRequired()) { eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.COLUMN_BINDING__VIEWER_COLUMN, oldViewerColumn, viewerColumn)); } } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public IColumnAdapter getColumnAdapter() { return columnAdapter; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ public void setColumnAdapter(IColumnAdapter newColumnAdapter) { final IColumnAdapter oldColumnAdapter = columnAdapter; columnAdapter = newColumnAdapter; if (eNotificationRequired()) { eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.COLUMN_BINDING__COLUMN_ADAPTER, oldColumnAdapter, columnAdapter)); } } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public IColumnBinding getBaseColumn() { return baseColumn; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ public NotificationChain basicSetBaseColumn(IColumnBinding newBaseColumn, NotificationChain msgs) { final IColumnBinding oldBaseColumn = baseColumn; baseColumn = newBaseColumn; if (eNotificationRequired()) { final ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN, oldBaseColumn, newBaseColumn); if (msgs == null) { msgs = notification; } else { msgs.add(notification); } } return msgs; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public void setBaseColumn(IColumnBinding newBaseColumn) { if (newBaseColumn != baseColumn) { NotificationChain msgs = null; if (baseColumn != null) { msgs = ((InternalEObject) baseColumn).eInverseRemove(this, IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS, IColumnBinding.class, msgs); } if (newBaseColumn != null) { msgs = ((InternalEObject) newBaseColumn).eInverseAdd(this, IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS, IColumnBinding.class, msgs); } msgs = basicSetBaseColumn(newBaseColumn, msgs); if (msgs != null) { msgs.dispatch(); } } else if (eNotificationRequired()) { eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN, newBaseColumn, newBaseColumn)); } } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public EList<IColumnBinding> getSubColumns() { if (subColumns == null) { subColumns = new EObjectWithInverseEList<IColumnBinding>(IColumnBinding.class, this, IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS, IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN); } return subColumns; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public EMap<EObject, IColumnBindingCellInformation> getCells() { if (cells == null) { cells = new EcoreEMap<EObject, IColumnBindingCellInformation>( IUIBindingsPackage.Literals.OBJECT_TO_CI_MAP_ENTRY, ObjectToCIMapEntryImpl.class, this, IUIBindingsPackage.COLUMN_BINDING__CELLS); } return cells; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public SpecialBinding getSpecialBindingType() { return specialBindingType; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public void setSpecialBindingType(SpecialBinding newSpecialBindingType) { final SpecialBinding oldSpecialBindingType = specialBindingType; specialBindingType = newSpecialBindingType == null ? SPECIAL_BINDING_TYPE_EDEFAULT : newSpecialBindingType; if (eNotificationRequired()) { eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.COLUMN_BINDING__SPECIAL_BINDING_TYPE, oldSpecialBindingType, specialBindingType)); } } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public IObservableFactory getFactory() { return factory; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public Cursor getCursor() { return cursor; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public void setCursor(Cursor newCursor) { final Cursor oldCursor = cursor; cursor = newCursor; if (eNotificationRequired()) { eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.COLUMN_BINDING__CURSOR, oldCursor, cursor)); } } protected int myOldWidth = 0; /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated NOT */ @Override public IObservableValue getColumnVisibility() { if (columnVisibility == null) { columnVisibility = new WritableValue(true, Boolean.class); columnVisibility.addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { if (getState() != BindingState.OK) return; final boolean o = event.diff.getOldValue() == Boolean.TRUE; final boolean n = event.diff.getNewValue() == Boolean.TRUE; if (o == n) return; final IColumnAdapter adapter = getColumnAdapter(); if (n) { adapter.setWidth(myOldWidth > 0 ? myOldWidth : 10); adapter.setMoveable(true); adapter.setResizable(true); } else { myOldWidth = adapter.getWidth(); adapter.setWidth(0); adapter.setMoveable(false); adapter.setResizable(false); } /* * The layout might have changed, so reflow the context. */ getContext().reflow(); } }); } return columnVisibility; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @SuppressWarnings("unchecked") @Override public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) { switch (featureID) { case IUIBindingsPackage.COLUMN_BINDING__VIEWER_BINDING: if (viewerBinding != null) { msgs = ((InternalEObject) viewerBinding).eInverseRemove(this, IUIBindingsPackage.VIEWER_BINDING__COLUMNS, IViewerBinding.class, msgs); } return basicSetViewerBinding((IViewerBinding) otherEnd, msgs); case IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN: if (baseColumn != null) { msgs = ((InternalEObject) baseColumn).eInverseRemove(this, IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS, IColumnBinding.class, msgs); } return basicSetBaseColumn((IColumnBinding) otherEnd, msgs); case IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS: return ((InternalEList<InternalEObject>) (InternalEList<?>) getSubColumns()).basicAdd(otherEnd, msgs); } return super.eInverseAdd(otherEnd, featureID, msgs); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) { switch (featureID) { case IUIBindingsPackage.COLUMN_BINDING__VIEWER_BINDING: return basicSetViewerBinding(null, msgs); case IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN: return basicSetBaseColumn(null, msgs); case IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS: return ((InternalEList<?>) getSubColumns()).basicRemove(otherEnd, msgs); case IUIBindingsPackage.COLUMN_BINDING__CELLS: return ((InternalEList<?>) getCells()).basicRemove(otherEnd, msgs); } return super.eInverseRemove(otherEnd, featureID, msgs); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case IUIBindingsPackage.COLUMN_BINDING__VIEWER_BINDING: return getViewerBinding(); case IUIBindingsPackage.COLUMN_BINDING__VIEWER_COLUMN: return getViewerColumn(); case IUIBindingsPackage.COLUMN_BINDING__COLUMN_ADAPTER: return getColumnAdapter(); case IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN: return getBaseColumn(); case IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS: return getSubColumns(); case IUIBindingsPackage.COLUMN_BINDING__CELLS: if (coreType) return getCells(); else return getCells().map(); case IUIBindingsPackage.COLUMN_BINDING__SPECIAL_BINDING_TYPE: return getSpecialBindingType(); case IUIBindingsPackage.COLUMN_BINDING__FACTORY: return getFactory(); case IUIBindingsPackage.COLUMN_BINDING__CURSOR: return getCursor(); case IUIBindingsPackage.COLUMN_BINDING__COLUMN_VISIBILITY: return getColumnVisibility(); } return super.eGet(featureID, resolve, coreType); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @SuppressWarnings("unchecked") @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case IUIBindingsPackage.COLUMN_BINDING__VIEWER_BINDING: setViewerBinding((IViewerBinding) newValue); return; case IUIBindingsPackage.COLUMN_BINDING__VIEWER_COLUMN: setViewerColumn((ViewerColumn) newValue); return; case IUIBindingsPackage.COLUMN_BINDING__COLUMN_ADAPTER: setColumnAdapter((IColumnAdapter) newValue); return; case IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN: setBaseColumn((IColumnBinding) newValue); return; case IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS: getSubColumns().clear(); getSubColumns().addAll((Collection<? extends IColumnBinding>) newValue); return; case IUIBindingsPackage.COLUMN_BINDING__CELLS: ((EStructuralFeature.Setting) getCells()).set(newValue); return; case IUIBindingsPackage.COLUMN_BINDING__SPECIAL_BINDING_TYPE: setSpecialBindingType((SpecialBinding) newValue); return; case IUIBindingsPackage.COLUMN_BINDING__CURSOR: setCursor((Cursor) newValue); return; } super.eSet(featureID, newValue); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public void eUnset(int featureID) { switch (featureID) { case IUIBindingsPackage.COLUMN_BINDING__VIEWER_BINDING: setViewerBinding((IViewerBinding) null); return; case IUIBindingsPackage.COLUMN_BINDING__VIEWER_COLUMN: setViewerColumn(VIEWER_COLUMN_EDEFAULT); return; case IUIBindingsPackage.COLUMN_BINDING__COLUMN_ADAPTER: setColumnAdapter((IColumnAdapter) null); return; case IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN: setBaseColumn((IColumnBinding) null); return; case IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS: getSubColumns().clear(); return; case IUIBindingsPackage.COLUMN_BINDING__CELLS: getCells().clear(); return; case IUIBindingsPackage.COLUMN_BINDING__SPECIAL_BINDING_TYPE: setSpecialBindingType(SPECIAL_BINDING_TYPE_EDEFAULT); return; case IUIBindingsPackage.COLUMN_BINDING__CURSOR: setCursor(CURSOR_EDEFAULT); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public boolean eIsSet(int featureID) { switch (featureID) { case IUIBindingsPackage.COLUMN_BINDING__VIEWER_BINDING: return viewerBinding != null; case IUIBindingsPackage.COLUMN_BINDING__VIEWER_COLUMN: return VIEWER_COLUMN_EDEFAULT == null ? viewerColumn != null : !VIEWER_COLUMN_EDEFAULT.equals(viewerColumn); case IUIBindingsPackage.COLUMN_BINDING__COLUMN_ADAPTER: return columnAdapter != null; case IUIBindingsPackage.COLUMN_BINDING__BASE_COLUMN: return baseColumn != null; case IUIBindingsPackage.COLUMN_BINDING__SUB_COLUMNS: return subColumns != null && !subColumns.isEmpty(); case IUIBindingsPackage.COLUMN_BINDING__CELLS: return cells != null && !cells.isEmpty(); case IUIBindingsPackage.COLUMN_BINDING__SPECIAL_BINDING_TYPE: return specialBindingType != SPECIAL_BINDING_TYPE_EDEFAULT; case IUIBindingsPackage.COLUMN_BINDING__FACTORY: return FACTORY_EDEFAULT == null ? factory != null : !FACTORY_EDEFAULT.equals(factory); case IUIBindingsPackage.COLUMN_BINDING__CURSOR: return CURSOR_EDEFAULT == null ? cursor != null : !CURSOR_EDEFAULT.equals(cursor); case IUIBindingsPackage.COLUMN_BINDING__COLUMN_VISIBILITY: return COLUMN_VISIBILITY_EDEFAULT == null ? columnVisibility != null : !COLUMN_VISIBILITY_EDEFAULT .equals(columnVisibility); } return super.eIsSet(featureID); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated NOT */ @Override public String toString() { return super.toString(); } @Override protected String getBaseType() { String bt = super.getBaseType(); if (getStaticDataType() != null) { bt += " " + getStaticDataType().getBaseType(); } return bt; } @Override public void fireLabelChanged(Object[] elements) { myLabelProvider.fireLabelChanged(elements); } @Override public Control getControl() { return null; } @Override public Widget getWidget() { return null; } @Override public void updateSourceProviderState(ISourceProviderStateContext context) { LogUtils.error(this, "Called?"); // For now this is empty' // Should probably contain some of the stuff from ViewerBindingImpl } @Override public Collection<EObject> getSelection() { return Collections.emptyList(); } @Override public int getIndex(boolean visualModel) { final Widget columnItem = getColumnAdapter().getWidget(); final IViewerBinding viewer = getViewerBinding(); final Control c = viewer.getControl(); /* * Find the columns and the column order */ Widget[] columns = null; int[] columnOrder = null; if (c instanceof Table) { final Table t = (Table) c; columns = t.getColumns(); if (visualModel) { columnOrder = t.getColumnOrder(); } } else if (c instanceof Tree) { final Tree t = (Tree) c; columns = t.getColumns(); if (visualModel) { columnOrder = t.getColumnOrder(); } } else return -1; /* * Search for the column */ int columnNo = 0; for (columnNo = 0; columnNo < columns.length; columnNo++) { if (columns[columnNo] == columnItem) { break; } } if (columnNo == columns.length) return -1; if (visualModel) { columnNo = columnOrder[columnNo]; } return columnNo - viewer.getFirstTableColumnOffset(); } } // ColumnBindingImpl