Skip to content

Package: ControlRootEClassControlChangeableSWTRenderer$1

ControlRootEClassControlChangeableSWTRenderer$1

nameinstructionbranchcomplexitylinemethod
widgetSelected(SelectionEvent)
M: 15 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
{...}
M: 12 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-2016 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: ******************************************************************************/
14: package org.eclipse.emf.ecp.view.internal.editor.controls;
15:
16: import java.util.LinkedHashSet;
17: import java.util.Map;
18: import java.util.Set;
19:
20: import javax.inject.Inject;
21:
22: import org.eclipse.core.runtime.IStatus;
23: import org.eclipse.core.runtime.Status;
24: import org.eclipse.emf.common.notify.AdapterFactory;
25: import org.eclipse.emf.common.util.EList;
26: import org.eclipse.emf.common.util.URI;
27: import org.eclipse.emf.ecore.EClass;
28: import org.eclipse.emf.ecore.EClassifier;
29: import org.eclipse.emf.ecore.EObject;
30: import org.eclipse.emf.ecore.EPackage;
31: import org.eclipse.emf.ecore.EPackage.Descriptor;
32: import org.eclipse.emf.ecore.EPackage.Registry;
33: import org.eclipse.emf.ecore.resource.Resource;
34: import org.eclipse.emf.ecore.resource.ResourceSet;
35: import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
36: import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
37: import org.eclipse.emf.ecp.ide.view.internal.service.IDEViewModelRegistryImpl;
38: import org.eclipse.emf.ecp.ide.view.service.IDEViewModelRegistry;
39: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
40: import org.eclipse.emf.ecp.view.spi.model.VControl;
41: import org.eclipse.emf.ecp.view.spi.model.VView;
42: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
43: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
44: import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
45: import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
46: import org.eclipse.emfforms.spi.common.report.ReportService;
47: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
48: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
49: import org.eclipse.jface.layout.GridLayoutFactory;
50: import org.eclipse.jface.viewers.ITreeContentProvider;
51: import org.eclipse.jface.viewers.Viewer;
52: import org.eclipse.jface.viewers.ViewerComparator;
53: import org.eclipse.jface.window.Window;
54: import org.eclipse.swt.SWT;
55: import org.eclipse.swt.events.SelectionAdapter;
56: import org.eclipse.swt.events.SelectionEvent;
57: import org.eclipse.swt.widgets.Button;
58: import org.eclipse.swt.widgets.Composite;
59: import org.eclipse.swt.widgets.Control;
60: import org.eclipse.swt.widgets.Shell;
61: import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
62: import org.eclipse.ui.dialogs.ISelectionStatusValidator;
63: import org.osgi.framework.ServiceReference;
64:
65: /**
66: * @author Eugen Neufeld
67: *
68: */
69: public class ControlRootEClassControlChangeableSWTRenderer extends ControlRootEClassControl2SWTRenderer {
70:
71:         /**
72:          * @author jonas
73:          *
74:          */
75:         private final class EClassContentProvider implements ITreeContentProvider {
76:                 @Override
77:                 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
78:                         // TODO Auto-generated method stub
79:
80:                 }
81:
82:                 @Override
83:                 public void dispose() {
84:                         // TODO Auto-generated method stub
85:
86:                 }
87:
88:                 @Override
89:                 public boolean hasChildren(Object element) {
90:                         if (EPackage.class.isInstance(element)) {
91:                                 return true;
92:                         }
93:                         if (Descriptor.class.isInstance(element)) {
94:                                 final Descriptor descriptor = (Descriptor) element;
95:                                 descriptor.getEPackage();
96:                                 return true;
97:                         }
98:                         return false;
99:                 }
100:
101:                 @Override
102:                 public Object getParent(Object element) {
103:                         if (EClass.class.isInstance(element)) {
104:                                 return ((EClass) element).eContainer();
105:                         }
106:                         return null;
107:                 }
108:
109:                 @Override
110:                 public Object[] getElements(Object inputElement) {
111:                         return getChildren(inputElement);
112:                 }
113:
114:                 @Override
115:                 public Object[] getChildren(Object parentElement) {
116:                         if (EPackage.class.isInstance(parentElement)) {
117:                                 final EPackage ePackage = (EPackage) parentElement;
118:                                 final Set<EClass> result = new LinkedHashSet<EClass>();
119:                                 for (final EClassifier classifier : ePackage.getEClassifiers()) {
120:                                         if (EClass.class.isInstance(classifier)) {
121:                                                 result.add((EClass) classifier);
122:                                         }
123:                                 }
124:                                 return result.toArray();
125:                         }
126:                         if (Descriptor.class.isInstance(parentElement)) {
127:                                 return getChildren(((Descriptor) parentElement).getEPackage());
128:                         }
129:                         if (Registry.class.isInstance(parentElement)) {
130:                                 return ((Registry) parentElement).values().toArray();
131:                         }
132:                         return null;
133:                 }
134:         }
135:
136:         /**
137:          * Default constructor.
138:          *
139:          * @param vElement the view model element to be rendered
140:          * @param viewContext the view context
141:          * @param reportService The {@link ReportService}
142:          * @param emfFormsDatabinding The {@link EMFFormsDatabinding}
143:          * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider}
144:          * @param vtViewTemplateProvider The {@link VTViewTemplateProvider}
145:          */
146:         @Inject
147:         public ControlRootEClassControlChangeableSWTRenderer(VControl vElement, ViewModelContext viewContext,
148:                 ReportService reportService, EMFFormsDatabinding emfFormsDatabinding,
149:                 EMFFormsLabelProvider emfFormsLabelProvider, VTViewTemplateProvider vtViewTemplateProvider) {
150:                 super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider);
151:         }
152:
153:         /**
154:          * {@inheritDoc}
155:          *
156:          * @see org.eclipse.emf.ecp.view.internal.editor.controls.ControlRootEClassControl2SWTRenderer#createSWTControl(org.eclipse.swt.widgets.Composite)
157:          */
158:         @Override
159:         protected Control createSWTControl(final Composite parent2) {
160:                 final Composite composite = (Composite) super.createSWTControl(parent2);
161:
162:                 GridLayoutFactory.fillDefaults().numColumns(2).spacing(0, 0).equalWidth(false).applyTo(composite);
163:
164:                 final Button selectClass = new Button(composite, SWT.PUSH);
165:                 selectClass.setText("Link Root EClass"); //$NON-NLS-1$
166:                 selectClass.setToolTipText("Link Root EClass"); //$NON-NLS-1$
167:                 selectClass.addSelectionListener(new SelectionAdapter() {
168:
169:                         /**
170:                          * {@inheritDoc}
171:                          *
172:                          * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
173:                          */
174:                         @Override
175:                         public void widgetSelected(SelectionEvent e) {
176:                                 super.widgetSelected(e);
177:                                 selectAndSetEClass(parent2.getShell());
178:                                 composite.layout(true, true);
179:                         }
180:
181:                 });
182:
183:                 return composite;
184:         }
185:
186:         private void selectAndSetEClass(Shell shell) {
187:                 final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(new AdapterFactory[] {
188:                         new ReflectiveItemProviderAdapterFactory(),
189:                         new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) });
190:                 final AdapterFactoryLabelProvider labelProvider = new AdapterFactoryLabelProvider(
191:                         adapterFactory);
192:                 final ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(shell, labelProvider,
193:                         getContentProvider());
194:                 dialog.setAllowMultiple(false);
195:                 dialog.setValidator(new ISelectionStatusValidator() {
196:
197:                         @Override
198:                         public IStatus validate(Object[] selection) {
199:                                 if (selection.length != 0 && EClass.class.isInstance(selection[0])) {
200:
201:                                         return Status.OK_STATUS;
202:                                 }
203:                                 return new Status(IStatus.ERROR, org.eclipse.emf.ecp.view.internal.editor.controls.Activator.PLUGIN_ID,
204:                                         "This is not an EClass."); //$NON-NLS-1$
205:                         }
206:                 });
207:                 dialog.setInput(getInput());
208:                 dialog.setMessage("Select an EClass."); //$NON-NLS-1$
209:                 dialog.setTitle("Select an EClass."); //$NON-NLS-1$
210:                 dialog.setComparator(new ViewerComparator());
211:                 final int result = dialog.open();
212:                 if (Window.OK == result) {
213:                         final Object selection = dialog.getFirstResult();
214:                         if (EClass.class.isInstance(selection)) {
215:                                 final EClass selectedFeature = (EClass) selection;
216:                                 final VView view = (VView) getViewModelContext().getDomainModel();
217:
218:                                 if (view.getRootEClass() != null) {
219:                                         getViewModelRegistry().unregister(
220:                                                 view.getRootEClass().eResource().getURI().toString(), view);
221:                                 }
222:
223:                                 view.setRootEClass(selectedFeature);
224:                                 getViewModelRegistry().register(view.getRootEClass().eResource().getURI().toString(), view);
225:
226:                                 final ResourceSet rs = selectedFeature.eResource().getResourceSet();
227:                                 // we have a ResourceSet if the eclass was loaded from a workspace model
228:                                 loadWorkspaceEcore(view, rs);
229:                         }
230:                 }
231:                 labelProvider.dispose();
232:         }
233:
234:         private void loadWorkspaceEcore(final VView view, final ResourceSet rs) {
235:                 if (rs == null) {
236:                         return;
237:                 }
238:                 URI uri = null;
239:                 for (final Resource r : rs.getResources()) {
240:                         if (r.getURI().isPlatform()) {
241:                                 uri = r.getURI();
242:                         }
243:                 }
244:
245:                 final ResourceSet resourceSet = new ResourceSetImpl();
246:                 final Map<String, Object> map = resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap();
247:                 map.put("*", new XMIResourceFactoryImpl()); //$NON-NLS-1$
248:                 final Resource ecore = resourceSet.getResource(uri, true);
249:
250:                 if (ecore == null) {
251:                         return;
252:                 }
253:                 // put the file in the registry
254:                 final EList<EObject> contents = ecore.getContents();
255:                 if (contents.size() != 1) {
256:                         return;
257:                 }
258:
259:                 final EObject object = contents.get(0);
260:                 if (!(object instanceof EPackage)) {
261:                         return;
262:                 }
263:
264:                 // Update the VView-EClass mapping
265:                 final IDEViewModelRegistryImpl registry = (IDEViewModelRegistryImpl) getViewModelRegistry();
266:                 if (registry == null) {
267:                         return;
268:                 }
269:
270:                 final String uriString = ecore.getURI().toPlatformString(true);
271:                 if (!view.getEcorePaths().contains(uriString)) {
272:                         view.getEcorePaths().add(uriString);
273:                 }
274:
275:         }
276:
277:         private IDEViewModelRegistry getViewModelRegistry() {
278:                 final ServiceReference<IDEViewModelRegistry> serviceReference = Activator.getDefault().getBundle()
279:                         .getBundleContext().getServiceReference(IDEViewModelRegistry.class);
280:                 if (serviceReference == null) {
281:                         return null;
282:                 }
283:                 return Activator.getDefault().getBundle().getBundleContext().getService(serviceReference);
284:         }
285:
286:         private ITreeContentProvider getContentProvider() {
287:                 return new EClassContentProvider();
288:         }
289:
290:         /**
291:          * @return an instance of the {@link org.eclipse.emf.ecore.EPackage.Registry}
292:          */
293:         private Object getInput() {
294:                 return Registry.INSTANCE;
295:         }
296:
297: }