Skip to content

Package: SelectEClassWizardPage$CustomTreeContentProvider

SelectEClassWizardPage$CustomTreeContentProvider

nameinstructionbranchcomplexitylinemethod
SelectEClassWizardPage.CustomTreeContentProvider(SelectEClassWizardPage, AdapterFactory)
M: 0 C: 14
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
dispose()
M: 0 C: 1
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getChildren(Object)
M: 31 C: 48
61%
M: 3 C: 7
70%
M: 2 C: 4
67%
M: 7 C: 9
56%
M: 0 C: 1
100%
getElements(Object)
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getParent(Object)
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%
hasChildren(Object)
M: 2 C: 6
75%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 1 C: 2
67%
M: 0 C: 1
100%
inputChanged(Viewer, Object, Object)
M: 0 C: 1
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%

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: * Alexandra Buzila - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emf.ecp.view.internal.editor.handler;
15:
16: import java.util.ArrayList;
17: import java.util.Collections;
18: import java.util.Iterator;
19: import java.util.LinkedHashSet;
20: import java.util.List;
21: import java.util.Set;
22:
23: import org.eclipse.core.resources.IFile;
24: import org.eclipse.emf.common.notify.AdapterFactory;
25: import org.eclipse.emf.common.util.URI;
26: import org.eclipse.emf.ecore.EClass;
27: import org.eclipse.emf.ecore.EObject;
28: import org.eclipse.emf.ecore.EPackage;
29: import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
30: import org.eclipse.emf.ecp.view.model.common.edit.provider.CustomReflectiveItemProviderAdapterFactory;
31: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
32: import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
33: import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
34: import org.eclipse.emfforms.spi.localization.LocalizationServiceHelper;
35: import org.eclipse.jface.layout.GridDataFactory;
36: import org.eclipse.jface.viewers.IStructuredSelection;
37: import org.eclipse.jface.viewers.ITreeContentProvider;
38: import org.eclipse.jface.viewers.TreeViewer;
39: import org.eclipse.jface.viewers.Viewer;
40: import org.eclipse.jface.wizard.WizardPage;
41: import org.eclipse.swt.SWT;
42: import org.eclipse.swt.layout.GridLayout;
43: import org.eclipse.swt.widgets.Composite;
44: import org.eclipse.swt.widgets.Label;
45:
46: /**
47: * Wizard page allowing the selection of an {@link EClass} from a given container.
48: *
49: */
50: public class SelectEClassWizardPage extends WizardPage {
51:         private Composite container;
52:         private EPackage selectedEPackage;
53:         private List<EClass> selectedEClasses;
54:         private TreeViewer treeViewer;
55:
56:         /** Creates a new EClass selection wizard page. */
57:         public SelectEClassWizardPage() {
58:                 super(
59:                         LocalizationServiceHelper.getString(SelectEClassWizardPage.class, "_UI_SelectEClassWizardPage_page_name")); //$NON-NLS-1$
60:                 setTitle(
61:                         LocalizationServiceHelper.getString(SelectEClassWizardPage.class, "_UI_SelectEClassWizardPage_page_title")); //$NON-NLS-1$
62:                 setDescription(LocalizationServiceHelper.getString(SelectEClassWizardPage.class,
63:                         "_UI_SelectEClassWizardPage_page_description")); //$NON-NLS-1$
64:         }
65:
66:         @Override
67:         public void createControl(Composite parent) {
68:                 container = new Composite(parent, SWT.NONE);
69:                 final GridLayout layout = new GridLayout();
70:                 layout.verticalSpacing = 10;
71:                 layout.horizontalSpacing = 5;
72:                 container.setLayout(layout);
73:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(container);
74:                 layout.numColumns = 1;
75:
76:                 final Label label1 = new Label(container, SWT.NONE);
77:                 label1.setText("Select an EClass:"); //$NON-NLS-1$
78:
79:                 final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(new AdapterFactory[] {
80:                         new CustomReflectiveItemProviderAdapterFactory(),
81:                         new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) });
82:                 final AdapterFactoryLabelProvider labelProvider = new AdapterFactoryLabelProvider(adapterFactory);
83:
84:                 selectedEClasses = new ArrayList<EClass>();
85:
86:                 final int selectionMode = isMultiSelect() ? SWT.MULTI : SWT.SINGLE;
87:                 treeViewer = new TreeViewer(container, selectionMode | SWT.H_SCROLL | SWT.V_SCROLL);
88:                 treeViewer.setContentProvider(getContentProvider(adapterFactory));
89:                 treeViewer.setLabelProvider(labelProvider);
90:                 treeViewer.setInput(selectedEPackage);
91:                 treeViewer.addSelectionChangedListener(event -> {
92:                         selectedEClasses = new ArrayList<EClass>();
93:                         if (event.getSelection() instanceof IStructuredSelection) {
94:                                 final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
95:                                 for (final Iterator<?> iterator = selection.iterator(); iterator.hasNext();) {
96:                                         final Object selectedItem = iterator.next();
97:                                         if (EClass.class.isInstance(selectedItem)) {
98:                                                 selectedEClasses.add((EClass) selectedItem);
99:                                                 setPageComplete(getErrorMessage() == null);
100:                                         }
101:                                 }
102:                         }
103:                         if (selectedEClasses.isEmpty()) {
104:                                 setPageComplete(false);
105:                         }
106:                 });
107:                 treeViewer.expandToLevel(2);
108:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).hint(SWT.DEFAULT, 200)
109:                         .applyTo(treeViewer.getControl());
110:                 container.layout(true);
111:                 container.pack();
112:
113:                 setControl(container);
114:
115:                 setPageComplete(false);
116:         }
117:
118:         /**
119:          * Returns whether multiple EClasses can be selected in the tree.
120:          *
121:          * @return <code>true</code> if multi selection is allowed, <code>false</code> otherwise
122:          */
123:         protected boolean isMultiSelect() {
124:                 return true;
125:         }
126:
127:         @Override
128:         public void setVisible(boolean visible) {
129:                 super.setVisible(visible);
130:                 if (treeViewer != null && selectedEPackage != null) {
131:                         treeViewer.setInput(selectedEPackage);
132:                         treeViewer.expandToLevel(2);
133:                 }
134:         }
135:
136:         private ITreeContentProvider getContentProvider(final AdapterFactory adapterFactory) {
137:                 return new CustomTreeContentProvider(adapterFactory);
138:         }
139:
140:         /**
141:          * Returns the {@link EPackage} container providing the EClasses displayed in the wizard page.
142:          *
143:          * @return the EPackage
144:          */
145:         public EPackage getSelectedEPackage() {
146:                 return selectedEPackage;
147:         }
148:
149:         /**
150:          * Sets the EPackage container from which the EClasses will be selected in the wizard page.
151:          *
152:          * @param selectedEPackage the ePackage to set
153:          */
154:         public void setSelectedEPackage(EPackage selectedEPackage) {
155:                 this.selectedEPackage = selectedEPackage;
156:                 if (treeViewer != null) {
157:                         treeViewer.setInput(selectedEPackage);
158:                 }
159:                 if (selectedEPackage == null || selectedEPackage.getNsURI() == null || selectedEPackage.getNsURI().isEmpty()) {
160:                         setErrorMessage(LocalizationServiceHelper.getString(SelectEClassWizardPage.class,
161:                                 "_UI_SelectEClassWizardPage_invalid_package_URI")); //$NON-NLS-1$
162:                 } else {
163:                         setErrorMessage(null);
164:                 }
165:         }
166:
167:         /**
168:          * Sets the EClasses selected by this wizard page.
169:          *
170:          * @param selectedEClasses the selectedEClasses to set
171:          */
172:         public void setSelectedEClasses(List<EClass> selectedEClasses) {
173:                 this.selectedEClasses = selectedEClasses;
174:         }
175:
176:         /**
177:          * Returns the EClasses selected by the user in the wizard page.
178:          *
179:          * @return the selected EClasses as a list
180:          */
181:         public List<EClass> getSelectedEClasses() {
182:                 return selectedEClasses;
183:         }
184:
185:         @Override
186:         public boolean isPageComplete() {
187:                 return selectedEClasses != null && !selectedEClasses.isEmpty();
188:         }
189:
190:         /** Custom {@link ITreeContentProvider} for the {@link SelectEClassWizardPage}. */
191:         private class CustomTreeContentProvider implements ITreeContentProvider {
192:
193:                 private final ResourceSetImpl resourceSet = new ResourceSetImpl();
194:                 private final AdapterFactory adapterFactory;
195:
196:                 CustomTreeContentProvider(AdapterFactory adapterFactory) {
197:                         this.adapterFactory = adapterFactory;
198:                 }
199:
200:                 @Override
201:                 public boolean hasChildren(Object element) {
202:•                        if (EPackage.class.isInstance(element)) {
203:                                 return true;
204:                         }
205:                         return false;
206:                 }
207:
208:                 @Override
209:                 public Object getParent(Object element) {
210:                         return null;
211:                 }
212:
213:                 @Override
214:                 public Object[] getElements(Object inputElement) {
215:                         return getChildren(inputElement);
216:                 }
217:
218:                 @Override
219:                 public Object[] getChildren(Object parentElement) {
220:•                        if (EPackage.class.isInstance(parentElement)) {
221:                                 final Set<Object> children = new LinkedHashSet<Object>();
222:                                 children.addAll(EPackage.class.cast(parentElement).getESubpackages());
223:•                                for (final EObject obj : EPackage.class.cast(parentElement).getEClassifiers()) {
224:•                                        if (EClass.class.isInstance(obj)) {
225:                                                 children.add(obj);
226:                                         }
227:                                 }
228:                                 return children.toArray();
229:                         }
230:•                        if (IFile.class.isInstance(parentElement)) {
231:                                 final String path = ((IFile) parentElement).getFullPath().toString();
232:                                 final URI uri = URI.createPlatformResourceURI(path, true);
233:                                 parentElement = resourceSet.getResource(uri, true);
234:
235:                                 final ITreeItemContentProvider treeItemContentProvider = (ITreeItemContentProvider) adapterFactory
236:                                         .adapt(parentElement, ITreeItemContentProvider.class);
237:•                                return (treeItemContentProvider != null ? treeItemContentProvider.getChildren(parentElement)
238:                                         : Collections.EMPTY_LIST).toArray();
239:                         }
240:                         return null;
241:                 }
242:
243:                 @Override
244:                 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
245:                         // do nothing
246:                 }
247:
248:                 @Override
249:                 public void dispose() {
250:                         // do nothing
251:                 }
252:         }
253: }