Skip to content

Package: LinkControl$2

LinkControl$2

nameinstructionbranchcomplexitylinemethod
convert(Object)
M: 18 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
{...}
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2015 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 Neufeld - initial API and implementation
13: * Philip Langer - bug fix 460968
14: *
15: *******************************************************************************/
16: package org.eclipse.emf.ecp.edit.internal.swt.reference;
17:
18: import org.eclipse.core.databinding.Binding;
19: import org.eclipse.core.databinding.UpdateValueStrategy;
20: import org.eclipse.core.databinding.observable.value.IObservableValue;
21: import org.eclipse.emf.common.notify.AdapterFactory;
22: import org.eclipse.emf.common.notify.Notification;
23: import org.eclipse.emf.ecore.EObject;
24: import org.eclipse.emf.ecore.EStructuralFeature.Setting;
25: import org.eclipse.emf.ecp.edit.internal.swt.SWTImageHelper;
26: import org.eclipse.emf.ecp.edit.internal.swt.controls.SingleControl;
27: import org.eclipse.emf.ecp.edit.spi.ReferenceService;
28: import org.eclipse.emf.ecp.edit.spi.swt.reference.AddReferenceAction;
29: import org.eclipse.emf.ecp.edit.spi.swt.reference.DeleteReferenceAction;
30: import org.eclipse.emf.ecp.edit.spi.swt.reference.NewReferenceAction;
31: import org.eclipse.emf.ecp.edit.spi.util.ECPModelElementChangeListener;
32: import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
33: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
34: import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
35: import org.eclipse.emfforms.spi.common.report.ReportService;
36: import org.eclipse.emfforms.spi.core.services.editsupport.EMFFormsEditSupport;
37: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
38: import org.eclipse.emfforms.spi.localization.LocalizationServiceHelper;
39: import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
40: import org.eclipse.jface.layout.GridDataFactory;
41: import org.eclipse.jface.layout.GridLayoutFactory;
42: import org.eclipse.swt.SWT;
43: import org.eclipse.swt.custom.StackLayout;
44: import org.eclipse.swt.events.SelectionAdapter;
45: import org.eclipse.swt.events.SelectionEvent;
46: import org.eclipse.swt.graphics.Color;
47: import org.eclipse.swt.widgets.Button;
48: import org.eclipse.swt.widgets.Composite;
49: import org.eclipse.swt.widgets.Control;
50: import org.eclipse.swt.widgets.Display;
51: import org.eclipse.swt.widgets.Label;
52: import org.eclipse.swt.widgets.Link;
53:
54: /**
55: * This class defines a Control which is used for displaying {@link org.eclipse.emf.ecore.EStructuralFeature
56: * EStructuralFeature}s which have a reference.
57: *
58: * @deprecated Use LinkControlSWTRenderer instead
59: * @author Eugen Neufeld
60: *
61: */
62: @Deprecated
63: public class LinkControl extends SingleControl {
64:
65:         private Composite linkComposite;
66:
67:         private Link hyperlink;
68:
69:         private Label imageHyperlink;
70:
71:         /**
72:          * The {@link ComposedAdapterFactory} used by the control.
73:          */
74:         private ComposedAdapterFactory composedAdapterFactory;
75:
76:         private ECPModelElementChangeListener modelElementChangeListener;
77:
78:         private Label unsetLabel;
79:
80:         private StackLayout stackLayout;
81:
82:         private Composite mainComposite;
83:
84:         private Button[] buttons;
85:         /**
86:          * The {@link AdapterFactoryItemDelegator} used by this control.
87:          */
88:         private AdapterFactoryItemDelegator adapterFactoryItemDelegator;
89:
90:         @Override
91:         protected void fillControlComposite(Composite composite) {
92:                 int numColumns = 1 + getNumButtons();
93:                 if (isEmbedded()) {
94:                         numColumns = 1;
95:                 }
96:                 if (!isEmbedded() && getFirstStructuralFeature().isUnsettable()) {
97:                         numColumns++;
98:                 }
99:                 final Composite parent = new Composite(composite, SWT.NONE);
100:                 parent.setBackground(composite.getBackground());
101:                 GridLayoutFactory.fillDefaults().numColumns(numColumns).spacing(0, 0).equalWidth(false).applyTo(parent);
102:                 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.BEGINNING).applyTo(parent);
103:                 mainComposite = new Composite(parent, SWT.NONE);
104:                 mainComposite.setBackground(parent.getBackground());
105:                 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.CENTER).applyTo(mainComposite);
106:
107:                 stackLayout = new StackLayout();
108:                 mainComposite.setLayout(stackLayout);
109:
110:                 unsetLabel = new Label(mainComposite, SWT.NONE);
111:                 unsetLabel.setText(LocalizationServiceHelper.getString(getClass(), ReferenceMessageKeys.LinkControl_NotSet));
112:                 unsetLabel.setBackground(mainComposite.getBackground());
113:                 unsetLabel.setForeground(getSystemColor(SWT.COLOR_DARK_GRAY));
114:                 unsetLabel.setAlignment(SWT.CENTER);
115:
116:                 linkComposite = new Composite(mainComposite, SWT.NONE);
117:                 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).applyTo(linkComposite);
118:                 linkComposite.setBackground(mainComposite.getBackground());
119:
120:                 createHyperlink();
121:                 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.CENTER).applyTo(linkComposite);
122:                 if (getFirstSetting().isSet()) {
123:                         stackLayout.topControl = linkComposite;
124:                 } else {
125:                         stackLayout.topControl = unsetLabel;
126:                 }
127:                 if (!isEmbedded()) {
128:                         buttons = createButtons(parent);
129:                 }
130:         }
131:
132:         /**
133:          *
134:          * @return number of buttons added by the link control.
135:          */
136:         protected int getNumButtons() {
137:                 return 3;
138:         }
139:
140:         /**
141:          * Creates the buttons to delete a reference, add one to an existing and add a new element to be referenced.
142:          *
143:          * @param composite the {@link Composite} to place the buttons on
144:          * @return An array of buttons
145:          */
146:         protected Button[] createButtons(Composite composite) {
147:                 final Button[] buttons = new Button[3];
148:                 final Setting setting = getFirstSetting();
149:                 buttons[0] = createButtonForAction(new DeleteReferenceAction(getEditingDomain(getFirstSetting()), setting,
150:                         getService(ReferenceService.class)), composite);
151:                 buttons[1] = createButtonForAction(new AddReferenceAction(getEditingDomain(getFirstSetting()), setting,
152:                         getItemPropertyDescriptor(setting), getService(ReferenceService.class)), composite);
153:                 buttons[2] = createButtonForAction(new NewReferenceAction(getEditingDomain(getFirstSetting()), setting,
154:                         getViewModelContext().getService(EMFFormsEditSupport.class),
155:                         getViewModelContext().getService(EMFFormsLabelProvider.class),
156:                         getService(ReferenceService.class), getViewModelContext().getService(ReportService.class),
157:                         getDomainModelReference(),
158:                         getViewModelContext().getDomainModel()), composite);
159:                 return buttons;
160:         }
161:
162:         private void createHyperlink() {
163:                 setComposedAdapterFactory(new ComposedAdapterFactory(new AdapterFactory[] {
164:                         new ReflectiveItemProviderAdapterFactory(),
165:                         new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) }));
166:                 setAdapterFactoryItemDelegator(new AdapterFactoryItemDelegator(getComposedAdapterFactory()));
167:                 // adapterFactoryLabelProvider = new AdapterFactoryLabelProvider(composedAdapterFactory);
168:                 // shortLabelProvider = new ShortLabelProvider(composedAdapterFactory);
169:
170:                 imageHyperlink = new Label(linkComposite, SWT.NONE);
171:                 imageHyperlink.setBackground(linkComposite.getBackground());
172:
173:                 hyperlink = new Link(linkComposite, SWT.NONE);
174:                 hyperlink.setData(CUSTOM_VARIANT, "org_eclipse_emf_ecp_control_reference"); //$NON-NLS-1$
175:                 hyperlink.setBackground(linkComposite.getBackground());
176:                 hyperlink.addSelectionListener(new SelectionAdapter() {
177:
178:                         @Override
179:                         public void widgetDefaultSelected(SelectionEvent e) {
180:                                 super.widgetDefaultSelected(e);
181:                                 widgetSelected(e);
182:                         }
183:
184:                         @Override
185:                         public void widgetSelected(SelectionEvent e) {
186:                                 super.widgetSelected(e);
187:                                 linkClicked((EObject) getModelValue().getValue());
188:                         }
189:
190:                 });
191:                 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.BEGINNING).applyTo(hyperlink);
192:
193:         }
194:
195:         /**
196:          * This code is called whenever the link of the link widget is clicked. You can overwrite this to change the
197:          * behavior.
198:          *
199:          * @param value the EObject that is linked
200:          */
201:         protected void linkClicked(EObject value) {
202:                 getService(ReferenceService.class).openInNewContext(value);
203:         }
204:
205:         /**
206:          * {@inheritDoc}
207:          */
208:         @Override
209:         public void setEditable(boolean isEditable) {
210:                 if (!isEmbedded()) {
211:                         for (final Button button : buttons) {
212:                                 button.setVisible(isEditable);
213:                         }
214:                 }
215:                 mainComposite.getParent().layout();
216:         }
217:
218:         @Override
219:         public Binding bindValue() {
220:
221:                 final IObservableValue value = WidgetProperties.text().observe(hyperlink);
222:                 getDataBindingContext().bindValue(value, getModelValue(), createValueExtractingUpdateStrategy(),
223:                         new UpdateValueStrategy() {
224:                                 @Override
225:                                 public Object convert(Object value) {
226:                                         updateChangeListener((EObject) value);
227:                                         return "<a>" + getLinkText(value) + "</a>"; //$NON-NLS-1$ //$NON-NLS-2$
228:                                 }
229:                         });
230:
231:                 final IObservableValue tooltipValue = WidgetProperties.tooltipText().observe(hyperlink);
232:                 getDataBindingContext().bindValue(tooltipValue, getModelValue(),
233:                         createValueExtractingUpdateStrategy(),
234:                         new UpdateValueStrategy() {
235:                                 @Override
236:                                 public Object convert(Object value) {
237:                                         return getLinkText(value);
238:                                 }
239:                         });
240:
241:                 final IObservableValue imageValue = WidgetProperties.image().observe(imageHyperlink);
242:                 getDataBindingContext().bindValue(imageValue, getModelValue(),
243:                         new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER),
244:                         new UpdateValueStrategy() {
245:                                 @Override
246:                                 public Object convert(Object value) {
247:                                         return getImage(value);
248:                                 }
249:                         });
250:
251:                 final IObservableValue deleteButtonEnablement = WidgetProperties.enabled().observe(getDeleteButton());
252:                 getDataBindingContext().bindValue(deleteButtonEnablement, getModelValue(),
253:                         createValueExtractingUpdateStrategy(),
254:                         new UpdateValueStrategy() {
255:                                 @Override
256:                                 public Object convert(Object value) {
257:                                         return value != null;
258:                                 }
259:                         });
260:
261:                 return null;
262:         }
263:
264:         private UpdateValueStrategy createValueExtractingUpdateStrategy() {
265:                 return new UpdateValueStrategy() {
266:                         @Override
267:                         public Object convert(Object value) {
268:                                 return getModelValue().getValue();
269:                         }
270:                 };
271:         }
272:
273:         /**
274:          * Returns the image to be used for the given linked {@code value}.
275:          *
276:          * @param value the value
277:          * @return The image.
278:          */
279:         protected Object getImage(Object value) {
280:                 final Object image = getAdapterFactoryItemDelegator().getImage(value);
281:                 return SWTImageHelper.getImage(image);
282:         }
283:
284:         /**
285:          * Returns the link text to be used for the given linked {@code value}.
286:          *
287:          * @param value the value
288:          * @return The link text.
289:          */
290:         protected Object getLinkText(Object value) {
291:                 final String linkName = getAdapterFactoryItemDelegator().getText(value);
292:                 return linkName == null ? "" : linkName; //$NON-NLS-1$
293:         }
294:
295:         /**
296:          * Returns the delete button of this control.
297:          *
298:          * @return The delete button of this control.
299:          */
300:         protected Button getDeleteButton() {
301:                 return buttons[0];
302:         }
303:
304:         /**
305:          * {@inheritDoc}
306:          *
307:          * @see org.eclipse.emf.ecp.edit.internal.swt.controls.SingleControl#updateValidationColor(org.eclipse.swt.graphics.Color)
308:          */
309:         @Override
310:         protected void updateValidationColor(Color color) {
311:                 if (hyperlink != null) {
312:                         hyperlink.setBackground(color);
313:                 }
314:         }
315:
316:         private void updateChangeListener(final EObject value) {
317:                 if (modelElementChangeListener != null) {
318:                         if (modelElementChangeListener.getTarget().equals(value)) {
319:                                 return;
320:                         }
321:                         modelElementChangeListener.remove();
322:                         modelElementChangeListener = null;
323:                 }
324:                 if (value == null) {
325:                         if (stackLayout.topControl != unsetLabel) {
326:                                 stackLayout.topControl = unsetLabel;
327:                                 mainComposite.layout();
328:                         }
329:
330:                 } else {
331:                         if (stackLayout.topControl != linkComposite) {
332:                                 stackLayout.topControl = linkComposite;
333:                                 mainComposite.layout();
334:                         }
335:
336:                         modelElementChangeListener = new ECPModelElementChangeListener(value) {
337:
338:                                 @Override
339:                                 public void onChange(Notification notification) {
340:                                         Display.getDefault().syncExec(new Runnable() {
341:
342:                                                 @Override
343:                                                 public void run() {
344:                                                         getDataBindingContext().updateTargets();
345:                                                         linkComposite.layout();
346:
347:                                                 }
348:
349:                                         });
350:
351:                                 }
352:                         };
353:
354:                 }
355:
356:         }
357:
358:         @Override
359:         public void dispose() {
360:                 // adapterFactoryItemDelegator.dispose();
361:                 getComposedAdapterFactory().dispose();
362:                 // shortLabelProvider.dispose();
363:                 if (modelElementChangeListener != null) {
364:                         modelElementChangeListener.remove();
365:                 }
366:                 hyperlink.dispose();
367:                 super.dispose();
368:         }
369:
370:         /*
371:          * (non-Javadoc)
372:          * @see org.eclipse.emf.ecp.edit.internal.swt.controls.SingleControl#getUnsetLabelText()
373:          */
374:         @Override
375:         protected String getUnsetLabelText() {
376:                 return LocalizationServiceHelper
377:                         .getString(getClass(), ReferenceMessageKeys.LinkControl_NoLinkSetClickToSetLink);
378:         }
379:
380:         /*
381:          * (non-Javadoc)
382:          * @see org.eclipse.emf.ecp.edit.internal.swt.controls.SingleControl#getUnsetButtonTooltip()
383:          */
384:         @Override
385:         protected String getUnsetButtonTooltip() {
386:                 return LocalizationServiceHelper.getString(getClass(), ReferenceMessageKeys.LinkControl_UnsetLink);
387:         }
388:
389:         /*
390:          * (non-Javadoc)
391:          * @see org.eclipse.emf.ecp.edit.internal.swt.util.SWTControl#getControlForTooltip()
392:          */
393:         @Override
394:         protected Control[] getControlsForTooltip() {
395:                 // return new Control[] { hyperlink, imageHyperlink };
396:                 return new Control[0];
397:         }
398:
399:         /**
400:          * @return the adapterFactoryItemDelegator
401:          */
402:         public AdapterFactoryItemDelegator getAdapterFactoryItemDelegator() {
403:                 return adapterFactoryItemDelegator;
404:         }
405:
406:         /**
407:          * @param adapterFactoryItemDelegator the adapterFactoryItemDelegator to set
408:          */
409:         public void setAdapterFactoryItemDelegator(AdapterFactoryItemDelegator adapterFactoryItemDelegator) {
410:                 this.adapterFactoryItemDelegator = adapterFactoryItemDelegator;
411:         }
412:
413:         /**
414:          * @return the composedAdapterFactory
415:          */
416:         public ComposedAdapterFactory getComposedAdapterFactory() {
417:                 return composedAdapterFactory;
418:         }
419:
420:         /**
421:          * @param composedAdapterFactory the composedAdapterFactory to set
422:          */
423:         public void setComposedAdapterFactory(ComposedAdapterFactory composedAdapterFactory) {
424:                 this.composedAdapterFactory = composedAdapterFactory;
425:         }
426: }