package de.urszeidler.shr5.ecp.editor.widgets; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.property.list.IListProperty; import org.eclipse.emf.databinding.EMFProperties; import org.eclipse.emf.databinding.edit.EMFEditProperties; 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.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; import org.eclipse.jface.databinding.viewers.IViewerObservableList; import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider; import org.eclipse.jface.databinding.viewers.ViewersObservables; import org.eclipse.jface.layout.TreeColumnLayout; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.wb.rcp.databinding.EMFBeansListObservableFactory; import org.eclipse.wb.rcp.databinding.EMFTreeObservableLabelProvider; import de.urszeidler.eclipse.shr5.Shr5Package; import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil; import de.urszeidler.eclipse.shr5.util.ShadowrunTools; import de.urszeidler.emf.commons.ui.util.EmfFormBuilder.ReferenceManager; import de.urszeidler.emf.commons.ui.util.FormbuilderEntry; public class SimpleTreeTableWidget extends Composite { private FormToolkit toolkit;// = new FormToolkit(Display.getCurrent()); private EObject object; private EStructuralFeature feature; private EditingDomain editingDomain; private ISelectionChangedListener selectionChangeListener; private IDoubleClickListener dblListener; private IObservableList objectList; private IViewerObservableList selectionObserver; /** * Create the composite. * * @param parent * @param style */ public SimpleTreeTableWidget(Composite parent, int style) { super(parent, style); toolkit = new FormToolkit(Display.getCurrent()); addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { toolkit.dispose(); } }); createWidgets(); } public SimpleTreeTableWidget(Composite parent, String titel, int style, EObject object, EReference modifizierbarMods, FormToolkit toolkit, ReferenceManager mananger, EditingDomain editingDomain, IDoubleClickListener dblListner) { super(parent, style); this.toolkit = toolkit; this.object = object; this.feature = modifizierbarMods; this.editingDomain = editingDomain; this.dblListener = dblListner; createWidgets(); } public SimpleTreeTableWidget(Composite parent, String titel, int style, EObject object, EReference modifizierbarMods, FormToolkit toolkit, ReferenceManager mananger, EditingDomain editingDomain, ISelectionChangedListener selectionChangeListener, IDoubleClickListener dblListner) { super(parent, style); this.toolkit = toolkit; this.object = object; this.feature = modifizierbarMods; this.editingDomain = editingDomain; this.selectionChangeListener = selectionChangeListener; this.dblListener = dblListner; createWidgets(); } private void createWidgets() { toolkit.adapt(this); toolkit.paintBordersFor(this); setLayout(new FillLayout(SWT.HORIZONTAL)); Composite composite = new Composite(this, SWT.NONE); toolkit.adapt(composite); toolkit.paintBordersFor(composite); composite.setLayout(new TreeColumnLayout()); final TreeViewer treeViewer = new TreeViewer(composite, SWT.BORDER | SWT.MULTI); if (selectionChangeListener != null) treeViewer.addSelectionChangedListener(selectionChangeListener); if (dblListener != null) treeViewer.addDoubleClickListener(dblListener); Tree tree = treeViewer.getTree(); tree.setLinesVisible(true); toolkit.paintBordersFor(tree); tree.setToolTipText(toTooltipName()); EMFBeansListObservableFactory treeObservableFactory = new EMFBeansListObservableFactory(object.getClass(), feature); ObservableListTreeContentProvider treeContentProvider = new ObservableListTreeContentProvider(treeObservableFactory, null); EStructuralFeature nameFeature = null; EStructuralFeature imageFeature = null; EClassifier eType = feature.getEType(); if (eType instanceof EClass) { EClass ec = (EClass)eType; if (ec.getEAllSuperTypes().contains(Shr5Package.Literals.BESCHREIBBAR)) { nameFeature = Shr5Package.Literals.BESCHREIBBAR__NAME; imageFeature = Shr5Package.Literals.BESCHREIBBAR__IMAGE; } else if (ec.equals(Shr5Package.Literals.ATTRIBUT_MODIFIKATOR_WERT)) { nameFeature = Shr5Package.Literals.ATTRIBUT_MODIFIKATOR_WERT__WERT; } } treeViewer.setLabelProvider(new EMFTreeObservableLabelProvider(treeContentProvider.getKnownElements(), nameFeature, imageFeature) { @Override public String getText(Object element) { return AdapterFactoryUtil.getInstance().getLabelProvider().getText(element); } @Override public Image getImage(Object element) { return AdapterFactoryUtil.getInstance().getLabelProvider().getImage(element); } }); treeViewer.setContentProvider(treeContentProvider); selectionObserver = ViewersObservables.observeMultiSelection(treeViewer); IListProperty property = null; if (editingDomain != null) property = EMFEditProperties.list(editingDomain, feature); else property = EMFProperties.list(feature); objectList = property.observe(object); treeViewer.setInput(objectList); final FormbuilderEntry e1 = new FormbuilderEntry(null, feature, null, null); e1.setObservable(objectList); e1.setUiObservable(selectionObserver); } /** * Removes the selected elements. */ public void removeSelectedElement() { ISelection selection = selectionObserver.getViewer().getSelection(); if (selection instanceof StructuredSelection) { StructuredSelection ss = (StructuredSelection)selection; for (Object object : ShadowrunTools.toIterable(ss.iterator())) { objectList.remove(object); } } } /** * Get the tooltip. * * @param e * @param object * @return */ private String toTooltipName() { IItemPropertyDescriptor propertyDescriptor = AdapterFactoryUtil.getInstance().getItemDelegator().getPropertyDescriptor(object, feature); if (propertyDescriptor == null) return AdapterFactoryUtil.getInstance().getItemDelegator().getText(feature); String displayName = propertyDescriptor.getDescription(feature); return displayName; } }