blob: c578a556d0c18de0877b26bc4428776687a26579 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* 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:
* Thales Corporate Services S.A.S - initial API and implementation
*
* </copyright>
*/
package org.eclipse.egf.pattern.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.egf.model.pattern.MethodCall;
import org.eclipse.egf.model.pattern.Pattern;
import org.eclipse.egf.model.pattern.PatternInjectedCall;
import org.eclipse.egf.model.pattern.PatternMethod;
import org.eclipse.egf.pattern.extension.PatternFactory;
import org.eclipse.egf.pattern.ui.editors.adapter.LiveValidationContentAdapter;
import org.eclipse.egf.pattern.ui.editors.adapter.RefresherAdapter;
import org.eclipse.egf.pattern.ui.editors.models.QueryContent;
import org.eclipse.egf.pattern.ui.editors.validation.EMFvalidator;
import org.eclipse.egf.pattern.ui.editors.validation.ValidationConstants;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.forms.IMessageManager;
/**
* @author XiaoRu Chen - Soyatec
*
*/
public class PatternUIHelper {
/**
* Get the pattern's parent methods.
*/
public static List<String> getPatternParentMethodsNameList(Pattern pattern) {
Set<String> parentMethods = new HashSet<String>();
while (pattern != null) {
for (PatternMethod patternMethod : pattern.getMethods()) {
String name = patternMethod.getName();
if (PatternFactory.isSpecialMethod(name))
continue;
parentMethods.add(name);
}
pattern = pattern.getSuperPattern();
}
List<String> result = new ArrayList<String>(parentMethods);
Collections.sort(result);
return result;
}
/**
* Get the pattern's parent methods with out header/init/footer methods.
*/
public static List<PatternMethod> getAllUseablePatternMethods(Pattern pattern) {
List<PatternMethod> parentMethods = new ArrayList<PatternMethod>();
Set<String> names = new HashSet<String>();
if (pattern != null) {
for (PatternMethod patternMethod : pattern.getAllMethods()) {
String name = patternMethod.getName();
if (PatternFactory.isSpecialMethod(name))
continue;
if (!names.contains(name)) {
parentMethods.add(patternMethod);
names.add(name);
}
}
}
return parentMethods;
}
/**
* Get the pattern's parents methods name list with out header/init/footer
* methods.
*/
public static List<String> getUseablePatternMethodsNameList(Pattern pattern) {
final List<String> result = getPatternParentMethodsNameList(pattern);
if (pattern != null) {
for (PatternMethod patternMethod : pattern.getMethods()) {
result.remove(patternMethod.getName());
}
}
return result;
}
/**
* Add the refresher adapter for object.
*/
public static void addAdapter(Object object, AdapterImpl refresher) {
if (object instanceof EObject) {
EList<Adapter> eAdapters = ((EObject) object).eAdapters();
addIntoAdapters(eAdapters, refresher);
addChildAdapter(object, refresher);
}
}
/**
* Remove the refresher adapter for object.
*/
public static void removeAdapter(Object object, AdapterImpl refresher) {
if (object instanceof EObject) {
EList<Adapter> eAdapters = ((EObject) object).eAdapters();
removeFromeAdapters(eAdapters, refresher);
removeChildAdapter(object, refresher);
}
}
/**
* Add adapter for the MethodCall's called or PatternInjectedCall's context.
*/
public static void addChildAdapter(Object object, AdapterImpl refresher) {
if (object instanceof MethodCall) {
if (((MethodCall) object).getCalled() != null) {
EList<Adapter> eAdapters = ((MethodCall) object).getCalled().eAdapters();
addIntoAdapters(eAdapters, refresher);
}
} else if (object instanceof PatternInjectedCall) {
if (((PatternInjectedCall) object).getContext() != null) {
EList<Adapter> eAdapters = ((PatternInjectedCall) object).getContext().eAdapters();
addIntoAdapters(eAdapters, refresher);
}
}
}
/**
* Remove the MethodCall's called or PatternInjectedCall's context adapters.
*/
public static void removeChildAdapter(Object object, AdapterImpl refresher) {
if (object instanceof MethodCall) {
if (((MethodCall) object).getCalled() != null) {
EList<Adapter> eAdapters = ((MethodCall) object).getCalled().eAdapters();
removeFromeAdapters(eAdapters, refresher);
}
} else if (object instanceof PatternInjectedCall) {
if (((PatternInjectedCall) object).getContext() != null) {
EList<Adapter> eAdapters = ((PatternInjectedCall) object).getContext().eAdapters();
removeFromeAdapters(eAdapters, refresher);
}
}
}
/**
* Add the refresher into the eAdapters.
*/
public static void addIntoAdapters(EList<Adapter> eAdapters, AdapterImpl refresher) {
if (!eAdapters.contains(refresher)) {
eAdapters.add(refresher);
}
}
/**
* Remove the refresher into the eAdapters.
*/
public static void removeFromeAdapters(EList<Adapter> eAdapters, AdapterImpl refresher) {
if (eAdapters.contains(refresher)) {
eAdapters.remove(refresher);
}
}
/**
* Add adapter for pattern.
*/
public static void addAdapterForPattern(Pattern pattern, AdapterImpl liveValidationContentAdapter) {
if (pattern != null) {
EList<Adapter> eAdapters = pattern.eAdapters();
addIntoAdapters(eAdapters, liveValidationContentAdapter);
}
}
/**
* Remove adapter for pattern.
*/
public static void removeAdapterForPattern(Pattern pattern, AdapterImpl adapter) {
if (pattern != null) {
EList<Adapter> eAdapters = pattern.eAdapters();
removeFromeAdapters(eAdapters, adapter);
}
}
/**
* Create validation for object.
*/
public static void validationContent(IMessageManager mmng, EObject object, final String key, Control control) {
if (control != null && !control.isDisposed()) {
IStatus status = EMFvalidator.batchValidate(object, key);
setErrorMessage(status, mmng, key, control);
}
}
/**
* Set decoration for contorl.
*
* @param control
* @param key
* @param mmng
*/
public static void setErrorMessage(IStatus status, IMessageManager mmng, String key, Control control) {
if (!status.isOK()) {
if (status.isMultiStatus()) {
status = status.getChildren()[0];
}
if ((status.getCode() == 1 && ValidationConstants.CONSTRAINTS_PATTERN_NAME_NOT_EMPTY_ID.equals(key)) || (status.getCode() == 2 && ValidationConstants.CONSTRAINTS_PATTERN_PARAMETER_NOT_EMPTY_NAME_ID.equals(key))
|| (status.getCode() == 3 && ValidationConstants.CONSTRAINTS_PATTERN_VARIABLE_NAME_NOT_EMPTY_ID.equals(key)))
mmng.addMessage(key, status.getMessage(), null, IMessageProvider.ERROR, control);
} else {
mmng.removeMessage(key, control);
}
}
/**
* Return whether the method can be rename.
*/
public static boolean isRenameDisable(PatternMethod element) {
return PatternFactory.isSpecialMethod(element.getName());
}
/**
* If the validation adapter is not exist,add a new one.
*/
public static LiveValidationContentAdapter addValidationAdapter(IMessageManager mmng, Pattern pattern, String key, Control control) {
LiveValidationContentAdapter liveValidationContentAdapter = new LiveValidationContentAdapter(control, mmng, key, pattern);
PatternUIHelper.addAdapterForPattern(pattern, liveValidationContentAdapter);
validationContent(mmng, pattern, key, control);
return liveValidationContentAdapter;
}
/**
* Add a refresh adapter for the new item.
*/
public static void addAdapterForNewItem(TableViewer tableViewer, Object newItem) {
final AdapterImpl refresher = new RefresherAdapter(tableViewer);
addAdapter(newItem, refresher);
}
public static void addEMFValidationAfterRemove(IMessageManager mmng, Pattern pattern, String key, Control control, LiveValidationContentAdapter liveValidationContentAdapter) {
liveValidationContentAdapter = new LiveValidationContentAdapter(control, mmng, key, pattern);
PatternUIHelper.addAdapterForPattern(pattern, liveValidationContentAdapter);
}
/**
* Check the queryContents whether has duplicate keys.
*/
public static boolean hasDuplicateKey(List<QueryContent> queryContents) {
if (queryContents != null) {
for (int i = 0; i < queryContents.size(); i++) {
String key = queryContents.get(i).getKey();
for (int j = i + 1; j < queryContents.size(); j++) {
String currentKey = queryContents.get(j).getKey();
if (currentKey.equals(key)) {
return true;
}
}
}
}
return false;
}
}