Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: dd020633f84709ac6e5345e4d6ee59113d9ca45e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/*****************************************************************************
 * Copyright (c) 2008 CEA LIST.
 *
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *  Remi Schnekenburger (CEA LIST) Remi.Schnekenburger@cea.fr - Initial API and implementation
 *
 *****************************************************************************/

package org.eclipse.papyrus.extensionpoints.editors.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.papyrus.extensionpoints.editors.Activator;
import org.eclipse.papyrus.extensionpoints.editors.configuration.DefaultDirectEditorConfiguration;
import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorConfiguration;
import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorConstraint;
import org.eclipse.papyrus.extensionpoints.editors.definition.DirectEditorExtensionPoint;
import org.eclipse.papyrus.extensionpoints.editors.definition.IDirectEditorExtensionPoint;

public class DirectEditorsUtil {

	/** The Constant UNKNOWN_PRIORITY. */
	private static final int UNKNOWN_PRIORITY = 100;

	/**
	 * Finds a editor for specific language and object to edit type
	 *
	 * @param language
	 *            the language to edit
	 * @param objectToEdit
	 *            the type of object to edit
	 * @return the extension point proxy that manages this kind of editor
	 *
	 * @deprecated Use {@link #findEditorConfiguration(String language, EObject eObjectToEdit)} instead
	 */
	@Deprecated
	public static IDirectEditorConfiguration findEditorConfiguration(String language, String objectToEdit) {
		IDirectEditorExtensionPoint[] extensionPoints = DirectEditorExtensionPoint.getDirectEditorConfigurations();
		for (IDirectEditorExtensionPoint directEditorExtensionPoint : extensionPoints) {
			final String lang = directEditorExtensionPoint.getLanguage();
			final String oToEdit = directEditorExtensionPoint.getObjectToEdit();
			if (lang.equals(language) && oToEdit.equals(objectToEdit)) {
				// extension point found!
				return directEditorExtensionPoint.getDirectEditorConfiguration();
			}
		}
		return new DefaultDirectEditorConfiguration();
	}

	/**
	 * Finds a editor for specific language and object to edit type
	 *
	 * @param language
	 *            the language to edit
	 * @param semanticObjectToEdit
	 *            the semantic object to edit
	 * @param selectedElement
	 *            The real selected element (e.g. widget, edit part, ...)
	 * @return the extension point proxy that manages this kind of editor
	 */
	public static IDirectEditorConfiguration findEditorConfiguration(String language, Object semanticObjectToEdit, Object selectedElement) {
		IDirectEditorExtensionPoint[] extensionPoints = DirectEditorExtensionPoint.getDirectEditorConfigurations();
		IDirectEditorConfiguration editorConfiguration = new DefaultDirectEditorConfiguration();
		int configurationPriority = UNKNOWN_PRIORITY;
		for (IDirectEditorExtensionPoint directEditorExtensionPoint : extensionPoints) {
			final String lang = directEditorExtensionPoint.getLanguage();
			final Class<? extends EObject> classToEdit = directEditorExtensionPoint.getObjectClassToEdit();
			if (lang.equals(language) && classToEdit.isInstance(semanticObjectToEdit)) {
				IDirectEditorConstraint constraint = directEditorExtensionPoint.getAdditionalConstraint();
				if ((constraint == null || constraint.appliesTo(selectedElement)) && directEditorExtensionPoint.getPriority() < configurationPriority) {
					// extension point found!
					editorConfiguration = directEditorExtensionPoint.getDirectEditorConfiguration();
					configurationPriority = directEditorExtensionPoint.getPriority();
				}
			}
		}
		return editorConfiguration;
	}

	/**
	 * finds if an editor for specific language and object is available to edit type
	 *
	 * @param language
	 *            the language to edit
	 * @param objectToEdit
	 *            the object to edit
	 * @return <code>true</code> if an editor exists
	 *
	 * @deprecated Use {@link #hasSpecificEditorConfiguration(String language, EObject eObjectToEdit)} instead
	 */
	@Deprecated
	public static boolean hasSpecificEditorConfiguration(String language, String objectToEdit) {
		IDirectEditorExtensionPoint[] extensionPoints = DirectEditorExtensionPoint.getDirectEditorConfigurations();
		for (IDirectEditorExtensionPoint directEditorExtensionPoint : extensionPoints) {
			final String lang = directEditorExtensionPoint.getLanguage();
			final String oToEdit = directEditorExtensionPoint.getObjectToEdit();
			if (lang.equals(language) && oToEdit.equals(objectToEdit)) {
				// extension point found!
				return true;
			}
		}
		return false;
	}

	/**
	 * finds if an editor for specific language and object is available to edit type
	 *
	 * @param language
	 *            the language to edit
	 * @param semanticObjectToEdit
	 *            the semantic object to edit
	 * @param selectedElement
	 *            The real selected element (e.g. widget, edit part, ...)
	 * @return <code>true</code> if an editor exists
	 */
	public static boolean hasSpecificEditorConfiguration(String language, Object semanticObjectToEdit, Object selectedElement) {
		IDirectEditorExtensionPoint[] extensionPoints = DirectEditorExtensionPoint.getDirectEditorConfigurations();
		for (IDirectEditorExtensionPoint directEditorExtensionPoint : extensionPoints) {
			final String lang = directEditorExtensionPoint.getLanguage();
			final Class<? extends EObject> classToEdit = directEditorExtensionPoint.getObjectClassToEdit();
			if (lang.equals(language) && classToEdit.isInstance(semanticObjectToEdit)) {
				IDirectEditorConstraint constraint = directEditorExtensionPoint.getAdditionalConstraint();
				if (constraint == null || constraint.appliesTo(selectedElement)) {
					// extension point found!
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * finds if an editor for specific object is available to edit type
	 *
	 * @param language
	 *            the language to edit
	 * @param objectToEdit
	 *            the type of object to edit
	 * @return <code>true</code> if an editor exists
	 *
	 * @deprecated Use {@link #hasSpecificEditorConfiguration(EObject)} instead
	 */
	@Deprecated
	public static boolean hasSpecificEditorConfiguration(String objectToEdit) {
		IDirectEditorExtensionPoint[] extensionPoints = DirectEditorExtensionPoint.getDirectEditorConfigurations();
		for (IDirectEditorExtensionPoint directEditorExtensionPoint : extensionPoints) {
			final String oToEdit = directEditorExtensionPoint.getObjectToEdit();
			if (oToEdit.equals(objectToEdit)) {
				// extension point found!
				return true;
			}
		}
		return false;
	}

	/**
	 * finds if an editor for specific object is available to edit type
	 *
	 * @param language
	 *            the language to edit
	 * @param semanticObjectToEdit
	 *            the semantic object to edit
	 * @param selectedElement
	 *            The real selected element (e.g. widget, edit part, ...)
	 * @return <code>true</code> if an editor exists
	 */
	public static boolean hasSpecificEditorConfiguration(Object semanticObjectToEdit, Object selectedElement) {
		IDirectEditorExtensionPoint[] extensionPoints = DirectEditorExtensionPoint.getDirectEditorConfigurations();
		for (IDirectEditorExtensionPoint directEditorExtensionPoint : extensionPoints) {
			final Class<? extends EObject> classToEdit = directEditorExtensionPoint.getObjectClassToEdit();
			if (classToEdit.isInstance(semanticObjectToEdit)) {
				IDirectEditorConstraint constraint = directEditorExtensionPoint.getAdditionalConstraint();
				if (constraint == null || constraint.appliesTo(selectedElement)) {
					// extension point found!
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * Retrieves the preferred editor configuration for the specified type
	 *
	 * @param class_
	 *            the type of element to edit
	 * @return the preferred editor configuration for the specified type or <code>null</code>
	 */
	public static IDirectEditorExtensionPoint getDefautDirectEditorConfiguration(Object semanticObjectToEdit, Object selectedObject) {
		// retrieves preference for this element
		String language = Activator.getDefault().getPreferenceStore().getString(IDirectEditorsIds.EDITOR_FOR_ELEMENT + semanticObjectToEdit.getClass().asSubclass(EObject.class));
		if (language == null || IDirectEditorsIds.SIMPLE_DIRECT_EDITOR.equals(language)) {
			return null;
		}
		IDirectEditorExtensionPoint currentConfiguration = null;
		int currentPriority = UNKNOWN_PRIORITY;
		Collection<IDirectEditorExtensionPoint> configs = getDirectEditorConfigurations(semanticObjectToEdit, selectedObject);

		for (IDirectEditorExtensionPoint extensionPoint : configs) {
			if (language.equals(extensionPoint.getLanguage()) && extensionPoint.getPriority() < currentPriority) {
				currentConfiguration = extensionPoint;
				currentPriority = extensionPoint.getPriority();
			}
		}

		return currentConfiguration;
	}

	/**
	 * Returns the set of transformations registered in the platform for the specified kind of
	 * element
	 *
	 * @param the
	 *            type of element to be edited
	 * @return the set of transformations registered in the platform for the specified kind of
	 *         element
	 */
	public static Collection<IDirectEditorExtensionPoint> getDirectEditorConfigurations(Object semanticObjectToEdit, Object selectedObject) {
		// list of configuration to be returned. They correspond to
		// configuration to edit the
		// specified type
		final List<IDirectEditorExtensionPoint> elementConfigurations = new ArrayList<IDirectEditorExtensionPoint>();

		// check each configuration in the platform and select corresponding
		// ones.
		for (IDirectEditorExtensionPoint configuration : DirectEditorExtensionPoint.getDirectEditorConfigurations()) {
			// both class are compatibles ?
			if (configuration.getObjectClassToEdit() != null) {
				if (configuration.getObjectClassToEdit().isInstance(semanticObjectToEdit)) {
					IDirectEditorConstraint constraint = configuration.getAdditionalConstraint();
					if (constraint == null || constraint.appliesTo(selectedObject))
						elementConfigurations.add(configuration);
				}
			}
		}
		return elementConfigurations;
	}

}

Back to the top