Skip to content

Package: TableColumnsDMRTableControl

TableColumnsDMRTableControl

nameinstructionbranchcomplexitylinemethod
TableColumnsDMRTableControl(VControl, ViewModelContext, ReportService, EMFFormsDatabinding, EMFFormsLabelProvider, VTViewTemplateProvider)
M: 0 C: 14
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
addDragAndDropSupport(TableViewer, EditingDomain)
M: 0 C: 29
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
createControl(Composite)
M: 16 C: 365
96%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 3 C: 62
95%
M: 0 C: 1
100%
dispose()
M: 0 C: 19
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
getGridDescription(SWTGridDescription)
M: 0 C: 29
100%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 0 C: 5
100%
M: 0 C: 1
100%
getUnsetText()
M: 2 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
postInit()
M: 0 C: 32
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
reveal(Object)
M: 14 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
rootDomainModelChanged()
M: 23 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 6 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2019 EclipseSource Muenchen GmbH and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Eugen - initial API and implementation
13: * Johannes Faltermeier - sorting + drag&drop
14: * Christian W. Damus - bug 548592
15: *
16: ******************************************************************************/
17: package org.eclipse.emf.ecp.view.internal.editor.controls;
18:
19: import java.text.MessageFormat;
20: import java.util.ArrayList;
21: import java.util.Collection;
22: import java.util.Collections;
23: import java.util.Comparator;
24: import java.util.HashSet;
25: import java.util.List;
26:
27: import javax.inject.Inject;
28:
29: import org.eclipse.core.databinding.observable.IObserving;
30: import org.eclipse.core.databinding.observable.Observables;
31: import org.eclipse.core.databinding.observable.list.IObservableList;
32: import org.eclipse.core.databinding.observable.value.IObservableValue;
33: import org.eclipse.core.databinding.property.value.IValueProperty;
34: import org.eclipse.emf.common.notify.AdapterFactory;
35: import org.eclipse.emf.common.notify.Notification;
36: import org.eclipse.emf.common.notify.impl.AdapterImpl;
37: import org.eclipse.emf.databinding.EMFDataBindingContext;
38: import org.eclipse.emf.ecore.EClass;
39: import org.eclipse.emf.ecore.EObject;
40: import org.eclipse.emf.ecore.EPackage;
41: import org.eclipse.emf.ecore.EReference;
42: import org.eclipse.emf.ecore.EStructuralFeature;
43: import org.eclipse.emf.ecp.common.spi.EMFUtils;
44: import org.eclipse.emf.ecp.spi.common.ui.CompositeFactory;
45: import org.eclipse.emf.ecp.spi.common.ui.composites.SelectionComposite;
46: import org.eclipse.emf.ecp.view.internal.editor.handler.CreateDomainModelReferenceWizard;
47: import org.eclipse.emf.ecp.view.model.common.edit.provider.CustomReflectiveItemProviderAdapterFactory;
48: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
49: import org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTRenderer;
50: import org.eclipse.emf.ecp.view.spi.model.VControl;
51: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
52: import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
53: import org.eclipse.emf.ecp.view.spi.swt.reporting.RenderingFailedReport;
54: import org.eclipse.emf.ecp.view.spi.table.model.VTableColumnConfiguration;
55: import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
56: import org.eclipse.emf.ecp.view.spi.table.model.VTableDomainModelReference;
57: import org.eclipse.emf.ecp.view.spi.table.model.VTablePackage;
58: import org.eclipse.emf.ecp.view.spi.table.model.VWidthConfiguration;
59: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
60: import org.eclipse.emf.edit.command.DeleteCommand;
61: import org.eclipse.emf.edit.command.SetCommand;
62: import org.eclipse.emf.edit.domain.EditingDomain;
63: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
64: import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
65: import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
66: import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
67: import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
68: import org.eclipse.emfforms.spi.common.report.AbstractReport;
69: import org.eclipse.emfforms.spi.common.report.ReportService;
70: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
71: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedReport;
72: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
73: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
74: import org.eclipse.emfforms.spi.core.services.label.NoLabelFoundException;
75: import org.eclipse.emfforms.spi.localization.LocalizationServiceHelper;
76: import org.eclipse.emfforms.spi.swt.core.layout.GridDescriptionFactory;
77: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
78: import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
79: import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
80: import org.eclipse.jface.layout.GridDataFactory;
81: import org.eclipse.jface.layout.GridLayoutFactory;
82: import org.eclipse.jface.layout.TableColumnLayout;
83: import org.eclipse.jface.viewers.ColumnWeightData;
84: import org.eclipse.jface.viewers.IStructuredSelection;
85: import org.eclipse.jface.viewers.StructuredSelection;
86: import org.eclipse.jface.viewers.TableViewer;
87: import org.eclipse.jface.viewers.TableViewerColumn;
88: import org.eclipse.jface.viewers.TreeViewer;
89: import org.eclipse.jface.wizard.WizardDialog;
90: import org.eclipse.swt.SWT;
91: import org.eclipse.swt.dnd.DND;
92: import org.eclipse.swt.dnd.Transfer;
93: import org.eclipse.swt.events.SelectionAdapter;
94: import org.eclipse.swt.events.SelectionEvent;
95: import org.eclipse.swt.widgets.Button;
96: import org.eclipse.swt.widgets.Composite;
97: import org.eclipse.swt.widgets.Control;
98: import org.eclipse.swt.widgets.Display;
99: import org.eclipse.swt.widgets.Label;
100: import org.eclipse.swt.widgets.TableColumn;
101:
102: /**
103: * @author Eugen
104: *
105: */
106: public class TableColumnsDMRTableControl extends SimpleControlSWTRenderer {
107:
108:         private final EMFDataBindingContext viewModelDBC;
109:
110:         /**
111:          * Default constructor.
112:          *
113:          * @param vElement the view model element to be rendered
114:          * @param viewContext the view context
115:          * @param reportService The {@link ReportService}
116:          * @param emfFormsDatabinding The {@link EMFFormsDatabinding}
117:          * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider}
118:          * @param vtViewTemplateProvider The {@link VTViewTemplateProvider}
119:          */
120:         @Inject
121:         public TableColumnsDMRTableControl(VControl vElement, ViewModelContext viewContext, ReportService reportService,
122:                 EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider,
123:                 VTViewTemplateProvider vtViewTemplateProvider) {
124:                 super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider);
125:                 viewModelDBC = new EMFDataBindingContext();
126:         }
127:
128:         private ComposedAdapterFactory composedAdapterFactory;
129:         private AdapterFactoryLabelProvider labelProvider;
130:         private AdapterImpl adapter;
131:         private VTableControl tableControl;
132:         private EStructuralFeature structuralFeature;
133:         private EObject eObject;
134:         private TableViewer viewer;
135:         private SWTGridDescription rendererGridDescription;
136:
137:         /**
138:          * {@inheritDoc}
139:          *
140:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTRenderer#createControl(org.eclipse.swt.widgets.Composite)
141:          */
142:         // BEGIN COMPLEX CODE
143:         @Override
144:         protected Control createControl(final Composite parent) throws DatabindingFailedException {
145:
146:                 tableControl = (VTableControl) getViewModelContext().getDomainModel();
147:
148:                 final IObservableValue observableValue = getEMFFormsDatabinding()
149:                         .getObservableValue(getVElement().getDomainModelReference(), getViewModelContext().getDomainModel());
150:                 structuralFeature = (EStructuralFeature) observableValue.getValueType();
151:                 eObject = (EObject) ((IObserving) observableValue).getObserved();
152:                 observableValue.dispose();
153:
154:                 final Composite composite = new Composite(parent, SWT.NONE);
155:                 composite.setBackgroundMode(SWT.INHERIT_FORCE);
156:                 GridLayoutFactory.fillDefaults().numColumns(1).applyTo(composite);
157:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(composite);
158:                 final Composite titleComposite = new Composite(composite, SWT.NONE);
159:                 titleComposite.setBackgroundMode(SWT.INHERIT_FORCE);
160:                 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).applyTo(titleComposite);
161:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).grab(true, false).applyTo(titleComposite);
162:
163:                 final Label filler = new Label(titleComposite, SWT.NONE);
164:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(filler);
165:
166:                 final Composite buttonComposite = new Composite(titleComposite, SWT.NONE);
167:                 buttonComposite.setBackgroundMode(SWT.INHERIT_FORCE);
168:                 GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(true).applyTo(buttonComposite);
169:                 GridDataFactory.fillDefaults().align(SWT.END, SWT.BEGINNING).grab(false, false).applyTo(buttonComposite);
170:
171:                 final Button buttonSort = new Button(buttonComposite, SWT.PUSH);
172:                 buttonSort.setText("Sort"); //$NON-NLS-1$
173:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(false, false).applyTo(buttonSort);
174:
175:                 final Button buttonAdd = new Button(buttonComposite, SWT.PUSH);
176:                 buttonAdd.setText("Add"); //$NON-NLS-1$
177:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(false, false).applyTo(buttonAdd);
178:
179:                 final Button buttonRemove = new Button(buttonComposite, SWT.PUSH);
180:                 buttonRemove.setText("Remove"); //$NON-NLS-1$
181:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(false, false).applyTo(buttonRemove);
182:
183:                 final Composite tableComposite = new Composite(composite, SWT.NONE);
184:                 tableComposite.setBackgroundMode(SWT.INHERIT_FORCE);
185:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).hint(1, 100)
186:                         .applyTo(tableComposite);
187:                 final TableColumnLayout layout = new TableColumnLayout();
188:                 tableComposite.setLayout(layout);
189:
190:                 viewer = new TableViewer(tableComposite);
191:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(viewer.getControl());
192:
193:                 viewer.getTable().setHeaderVisible(true);
194:                 viewer.getTable().setLinesVisible(true);
195:                 final TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
196:                 final TableColumn tableColumn = column.getColumn();
197:                 final EMFFormsLabelProvider emfFormsLabelProvider = getEMFFormsLabelProvider();// TODO
198:                 try {
199:                         final IObservableValue labelText = emfFormsLabelProvider.getDisplayName(
200:                                 getVElement().getDomainModelReference(), getViewModelContext().getDomainModel());
201:                         final IObservableValue tooltip = emfFormsLabelProvider.getDescription(
202:                                 getVElement().getDomainModelReference(), getViewModelContext().getDomainModel());
203:                         viewModelDBC.bindValue(WidgetProperties.text().observe(tableColumn), labelText);
204:                         viewModelDBC.bindValue(WidgetProperties.tooltipText().observe(tableColumn), tooltip);
205:                 } catch (final NoLabelFoundException e) {
206:                         // FIXME Expectations?
207:                         getReportService().report(new RenderingFailedReport(e));
208:                         tableColumn.setText(e.getMessage());
209:                         tableColumn.setToolTipText(e.toString());
210:                 }
211:
212:                 layout.setColumnData(column.getColumn(), new ColumnWeightData(1, true));
213:
214:                 viewer.setLabelProvider(labelProvider);
215:                 viewer.setContentProvider(new ObservableListContentProvider());
216:                 addDragAndDropSupport(viewer, getEditingDomain(eObject));
217:
218:                 final IObservableList list = getEMFFormsDatabinding()
219:                         .getObservableList(getVElement().getDomainModelReference(), getViewModelContext().getDomainModel());
220:                 viewer.setInput(list);
221:
222:                 adapter = new TableControlAdapter(parent, viewer);
223:                 tableControl.eAdapters().add(adapter);
224:
225:                 buttonSort.addSelectionListener(new SortSelectionAdapter());
226:
227:                 buttonAdd.addSelectionListener(new AddSelectionAdapter(tableComposite, viewer));
228:
229:                 buttonRemove.addSelectionListener(new RemoveSelectionAdapter(viewer));
230:
231:                 return composite;
232:         }
233:         // END COMPLEX CODE
234:
235:         /**
236:          * @param viewer
237:          * @param editingDomain
238:          */
239:         private void addDragAndDropSupport(TableViewer viewer, EditingDomain editingDomain) {
240:                 final int dndOperations = DND.DROP_MOVE;
241:                 final Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };
242:                 viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
243:                 final EditingDomainViewerDropAdapter editingDomainViewerDropAdapter = new EditingDomainViewerDropAdapter(
244:                         editingDomain, viewer);
245:                 viewer.addDropSupport(dndOperations, transfers, editingDomainViewerDropAdapter);
246:         }
247:
248:         /**
249:          * {@inheritDoc}
250:          *
251:          * @see org.eclipse.emf.ecp.view.spi.core.swt.AbstractControlSWTRenderer#postInit()
252:          */
253:         @Override
254:         protected void postInit() {
255:                 super.postInit();
256:                 composedAdapterFactory = new ComposedAdapterFactory(new AdapterFactory[] {
257:                         new CustomReflectiveItemProviderAdapterFactory(),
258:                         new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) });
259:                 labelProvider = new TableColumnsLabelProvider(composedAdapterFactory);
260:         }
261:
262:         /**
263:          * {@inheritDoc}
264:          *
265:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTRenderer#dispose()
266:          */
267:         @Override
268:         protected void dispose() {
269:                 labelProvider.dispose();
270:                 composedAdapterFactory.dispose();
271:                 tableControl.eAdapters().remove(adapter);
272:                 viewModelDBC.dispose();
273:                 super.dispose();
274:         }
275:
276:         /**
277:          * {@inheritDoc}
278:          *
279:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTRenderer#getUnsetText()
280:          */
281:         @Override
282:         protected String getUnsetText() {
283:                 return "No columns set"; //$NON-NLS-1$
284:         }
285:
286:         /**
287:          * {@inheritDoc}
288:          *
289:          * @see org.eclipse.emf.ecp.view.spi.core.swt.AbstractControlSWTRenderer#rootDomainModelChanged()
290:          */
291:         @Override
292:         protected void rootDomainModelChanged() throws DatabindingFailedException {
293:                 final IObservableList oldList = (IObservableList) viewer.getInput();
294:                 oldList.dispose();
295:
296:                 final IObservableList list = getEMFFormsDatabinding().getObservableList(getVElement().getDomainModelReference(),
297:                         getViewModelContext().getDomainModel());
298:                 // addRelayoutListenerIfNeeded(list, composite);
299:                 viewer.setInput(list);
300:         }
301:
302:         /**
303:          * Select and reveal an {@code object} in my table.
304:          *
305:          * @param object an object to reveal
306:          *
307:          * @since 1.22
308:          */
309:         void reveal(Object object) {
310:                 checkRenderer();
311:
312:•                if (viewer != null) {
313:                         viewer.setSelection(new StructuredSelection(object), true);
314:                 }
315:         }
316:
317:         /**
318:          * Adapter set on the {@link VTableControl}.
319:          *
320:          */
321:         private final class TableControlAdapter extends AdapterImpl {
322:                 private final Composite parent;
323:                 private final TableViewer viewer;
324:
325:                 /**
326:                  * @param parent
327:                  * @param viewer
328:                  */
329:                 private TableControlAdapter(Composite parent, TableViewer viewer) {
330:                         this.parent = parent;
331:                         this.viewer = viewer;
332:                 }
333:
334:                 /**
335:                  * {@inheritDoc}
336:                  *
337:                  * @see org.eclipse.emf.ecore.util.EContentAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
338:                  */
339:                 @Override
340:                 public void notifyChanged(Notification notification) {
341:                         super.notifyChanged(notification);
342:                         if (notification.getFeature() == VTablePackage.eINSTANCE
343:                                 .getTableDomainModelReference_ColumnDomainModelReferences()) {
344:                                 viewer.refresh();
345:                                 parent.layout();
346:                         }
347:                         if (VTableDomainModelReference.class.isInstance(notification.getNotifier())) {
348:                                 updateEObjectAndStructuralFeature();
349:                                 viewer.refresh();
350:                                 parent.layout();
351:                         }
352:
353:                         if (VTableControl.class.isInstance(notification.getNotifier())
354:                                 && (VTableDomainModelReference.class.isInstance(notification.getNewValue())
355:                                         || VTableDomainModelReference.class
356:                                                 .isInstance(notification.getOldValue()))) {
357:                                 updateEObjectAndStructuralFeature();
358:                                 viewer.refresh();
359:                                 parent.layout();
360:                         }
361:                 }
362:
363:                 private void updateEObjectAndStructuralFeature() {
364:                         IObservableValue observableValue;
365:                         IObservableList list;
366:                         try {
367:                                 observableValue = getEMFFormsDatabinding()
368:                                         .getObservableValue(getVElement().getDomainModelReference(),
369:                                                 getViewModelContext().getDomainModel());
370:                                 list = getEMFFormsDatabinding()
371:                                         .getObservableList(getVElement().getDomainModelReference(), getViewModelContext().getDomainModel());
372:                         } catch (final DatabindingFailedException ex) {
373:                                 getReportService().report(new DatabindingFailedReport(ex));
374:                                 viewer.setInput(Observables.emptyObservableList());
375:                                 return;
376:                         }
377:                         structuralFeature = (EStructuralFeature) observableValue.getValueType();
378:                         eObject = (EObject) ((IObserving) observableValue).getObserved();
379:                         observableValue.dispose();
380:                         viewer.setInput(list);
381:                 }
382:         }
383:
384:         /**
385:          * Reacts on remove button clicks.
386:          *
387:          */
388:         private final class RemoveSelectionAdapter extends SelectionAdapter {
389:                 private final TableViewer viewer;
390:
391:                 /**
392:                  * @param viewer
393:                  */
394:                 private RemoveSelectionAdapter(TableViewer viewer) {
395:                         this.viewer = viewer;
396:                 }
397:
398:                 /**
399:                  * {@inheritDoc}
400:                  *
401:                  * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
402:                  */
403:                 @Override
404:                 public void widgetSelected(SelectionEvent e) {
405:                         super.widgetSelected(e);
406:                         final IStructuredSelection selection = IStructuredSelection.class.cast(viewer.getSelection());
407:
408:                         /* use a delete command as we are the container and thus may leave a dangling hrefs */
409:                         final EditingDomain editingDomain = getEditingDomain(eObject);
410:                         editingDomain.getCommandStack().execute(DeleteCommand.create(editingDomain, selection.toList()));
411:                 }
412:         }
413:
414:         /**
415:          * Reacts on add button clicks.
416:          *
417:          */
418:         private final class AddSelectionAdapter extends SelectionAdapter {
419:                 private final Composite tableComposite;
420:                 private final TableViewer viewer;
421:
422:                 /**
423:                  * @param tableComposite
424:                  * @param viewer
425:                  */
426:                 private AddSelectionAdapter(Composite tableComposite, TableViewer viewer) {
427:                         this.tableComposite = tableComposite;
428:                         this.viewer = viewer;
429:                 }
430:
431:                 /**
432:                  * {@inheritDoc}
433:                  *
434:                  * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
435:                  */
436:                 @Override
437:                 public void widgetSelected(SelectionEvent e) {
438:                         super.widgetSelected(e);
439:                         final VTableDomainModelReference tableDomainModelReference = VTableDomainModelReference.class
440:                                 .cast(eObject);
441:                         if (tableDomainModelReference == null) {
442:                                 getReportService()
443:                                         .report(new AbstractReport("Cannot add column. Table DMR is null.")); //$NON-NLS-1$
444:                                 return;
445:                         }
446:
447:                         IValueProperty valueProperty;
448:                         try {
449:                                 valueProperty = getEMFFormsDatabinding()
450:                                         .getValueProperty(
451:                                                 tableDomainModelReference.getDomainModelReference() == null ? tableDomainModelReference
452:                                                         : tableDomainModelReference.getDomainModelReference(),
453:                                                 getViewModelContext().getDomainModel());
454:                         } catch (final DatabindingFailedException ex) {
455:                                 getReportService().report(new DatabindingFailedReport(ex));
456:                                 return;
457:                         }
458:                         final EClass eclass = EReference.class.cast(valueProperty.getValueType()).getEReferenceType();
459:
460:                         final Collection<EClass> classes = EMFUtils.getSubClasses(VViewPackage.eINSTANCE
461:                                 .getDomainModelReference());
462:                         // Don't allow to create a plain DMR legacy mode
463:                         classes.remove(VViewPackage.Literals.DOMAIN_MODEL_REFERENCE);
464:
465:                         final CreateDomainModelReferenceWizard wizard = new CreateDomainModelReferenceWizard(
466:                                 eObject, structuralFeature, getEditingDomain(eObject), eclass, "New Reference Element", //$NON-NLS-1$
467:                                 LocalizationServiceHelper.getString(TableColumnsDMRTableControl.class,
468:                                         "NewModelElementWizard_WizardTitle_AddModelElement"), //$NON-NLS-1$
469:                                 LocalizationServiceHelper.getString(TableColumnsDMRTableControl.class,
470:                                         "NewModelElementWizard_PageTitle_AddModelElement"), //$NON-NLS-1$
471:                                 LocalizationServiceHelper.getString(TableColumnsDMRTableControl.class,
472:                                         "NewModelElementWizard_PageDescription_AddModelElement"), //$NON-NLS-1$
473:                                 (VDomainModelReference) IStructuredSelection.class.cast(viewer.getSelection()).getFirstElement());
474:
475:                         final SelectionComposite<TreeViewer> helper = CompositeFactory.getSelectModelClassComposite(
476:                                 new HashSet<EPackage>(),
477:                                 new HashSet<EPackage>(), classes);
478:                         wizard.setCompositeProvider(helper);
479:
480:                         final WizardDialog wd = new WizardDialog(Display.getDefault().getActiveShell(), wizard);
481:                         wd.open();
482:                         tableComposite.layout();
483:                 }
484:         }
485:
486:         /**
487:          * Reacts on sort button clicks.
488:          *
489:          * @author jfaltermeier
490:          *
491:          */
492:         private final class SortSelectionAdapter extends SelectionAdapter {
493:                 private boolean down;
494:
495:                 /**
496:                  * {@inheritDoc}
497:                  *
498:                  * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
499:                  */
500:                 @Override
501:                 public void widgetSelected(SelectionEvent e) {
502:                         super.widgetSelected(e);
503:                         down = !down;
504:                         // EMF API
505:                         @SuppressWarnings("unchecked")
506:                         final List<VDomainModelReference> list = new ArrayList<VDomainModelReference>(
507:                                 (List<VDomainModelReference>) eObject.eGet(structuralFeature, true));
508:                         Collections.sort(list, new Comparator<VDomainModelReference>() {
509:                                 @Override
510:                                 public int compare(VDomainModelReference o1, VDomainModelReference o2) {
511:                                         final String label1 = labelProvider.getText(o1);
512:                                         final String label2 = labelProvider.getText(o2);
513:                                         int result = label1.compareTo(label2);
514:                                         if (!down) {
515:                                                 result *= -1;
516:                                         }
517:                                         return result;
518:                                 }
519:                         });
520:                         final EditingDomain editingDomain = getEditingDomain(eObject);
521:                         editingDomain.getCommandStack().execute(
522:                                 SetCommand.create(editingDomain, eObject, structuralFeature, list));
523:                 }
524:         }
525:
526:         @Override
527:         public SWTGridDescription getGridDescription(SWTGridDescription gridDescription) {
528:•                if (rendererGridDescription == null) {
529:                         rendererGridDescription = GridDescriptionFactory.INSTANCE.createSimpleGrid(1, 3, this);
530:                         rendererGridDescription.getGrid().get(0).setHorizontalGrab(false);
531:                         rendererGridDescription.getGrid().get(1).setHorizontalGrab(false);
532:                 }
533:                 return rendererGridDescription;
534:         }
535:
536:         /**
537:          * The label provider.
538:          *
539:          * @author Johannes Faltermeier
540:          *
541:          */
542:         private final class TableColumnsLabelProvider extends AdapterFactoryLabelProvider {
543:
544:                 private TableColumnsLabelProvider(AdapterFactory adapterFactory) {
545:                         super(adapterFactory);
546:                 }
547:
548:                 @Override
549:                 public String getColumnText(Object object, int columnIndex) {
550:                         final String text = super.getColumnText(object, columnIndex);
551:                         if (columnIndex == 0 && VDomainModelReference.class.isInstance(object)) {
552:                                 for (final VTableColumnConfiguration configuration : tableControl.getColumnConfigurations()) {
553:                                         if (!VWidthConfiguration.class.isInstance(configuration)) {
554:                                                 continue;
555:                                         }
556:                                         final VWidthConfiguration widthConfiguration = VWidthConfiguration.class.cast(configuration);
557:                                         if (widthConfiguration.getColumnDomainReference() != object) {
558:                                                 continue;
559:                                         }
560:                                         return MessageFormat.format(
561:                                                 "{0} [minWidth={1}, weight={2}]", //$NON-NLS-1$
562:                                                 text,
563:                                                 widthConfiguration.getMinWidth(),
564:                                                 widthConfiguration.getWeight());
565:                                 }
566:                         }
567:                         return text;
568:                 }
569:         }
570:
571: }