Browse Source

Input validator for renaming an element to avoid renaming into already existing name.

tomqc86@googlemail.com 12 years ago
parent
commit
c6bcc512f7

+ 26 - 1
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/handlers/impl/RenameElementHandler.java

@@ -10,12 +10,15 @@
  */
 package org.yakindu.sct.refactoring.handlers.impl;
 
+import java.util.List;
+
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.dialogs.IInputValidator;
 import org.eclipse.jface.dialogs.InputDialog;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -23,6 +26,7 @@ import org.eclipse.jface.window.Window;
 import org.eclipse.ui.IWorkbenchPartSite;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.EcoreUtil2;
 import org.eclipse.xtext.linking.lazy.LazyLinkingResource;
 import org.yakindu.base.base.NamedElement;
 import org.yakindu.sct.model.sgraph.Declaration;
@@ -50,7 +54,7 @@ public class RenameElementHandler extends AbstractRefactoringHandler<NamedElemen
 		NamedElement element = refactoring.getContextObject();
 		if (element != null) {
 			IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-			InputDialog dialog = new InputDialog(window.getShell(), "Rename..", "Please enter new name:", element.getName(), null);
+			InputDialog dialog = new InputDialog(window.getShell(), "Rename..", "Please enter new name:", element.getName(), new NameUniquenessValidator(element));
 			if (dialog.open() == Window.OK) {
 				String newName = dialog.getValue();
 				if (newName != null) {					
@@ -150,5 +154,26 @@ public class RenameElementHandler extends AbstractRefactoringHandler<NamedElemen
 		NamedElement element = unwrap(selection);
 		refactoring.setContextObjects(Lists.newArrayList(element));
 	}
+	
+	private class NameUniquenessValidator implements IInputValidator {
+
+		protected List<String> existingNames;
+		
+		public NameUniquenessValidator(NamedElement element) {
+			existingNames = Lists.newArrayList();
+			Scope scope = EcoreUtil2.getContainerOfType(element, Scope.class);
+			List<? extends NamedElement> allOfSameType = EcoreUtil2.getAllContentsOfType(scope, NamedElement.class);
+			allOfSameType.remove(element);
+			for (NamedElement namedElement : allOfSameType) {
+				existingNames.add(namedElement.getName());
+			}
+		}
+
+		@Override
+		public String isValid(String newText) {
+			return existingNames.contains(newText)? "Name already exists!": null;
+		}
+		
+	}
 
 }