Bug 527611 - [9] DnD of an entry on to its parent root node in Java
Build Path dialog should not be allowed

Change-Id: I79aad34fe27d141a6cfb24ff4f720ed6715333a6
Signed-off-by: Vikas Chandra <Vikas.Chandra@in.ibm.com>
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/LibrariesWorkbookPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/LibrariesWorkbookPage.java
index ad51778..ca61d4c 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/LibrariesWorkbookPage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/LibrariesWorkbookPage.java
@@ -116,6 +116,7 @@
 
 	private boolean dragDropEnabled;
 	private Object draggedItemsLibrary;
+	private boolean fromModularLibrary;
 	
 	public LibrariesWorkbookPage(CheckedListDialogField<CPListElement> classPathList, IWorkbenchPreferenceContainer pageContainer) {
 		fClassPathList= classPathList;
@@ -240,6 +241,16 @@
 						}
 						if (element instanceof CPListElement) {
 							CPListElement cpe= (CPListElement) element;
+							List<CPListElement> elements= fLibrariesList.getElements();
+							for (Object cpListElement : elements) {
+								if (cpListElement instanceof RootCPListElement) {
+									RootCPListElement root= (RootCPListElement) cpListElement;
+									if (root.getChildren().contains(cpe)) {
+										fromModularLibrary= root.isModulePathRootNode();
+										break;
+									}
+								}
+							}
 							if (cpe.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
 								IPath path= cpe.getPath();
 								if (path != null) {
@@ -318,7 +329,10 @@
 
 			@Override
 			public boolean validateDrop(Object target, int operation, TransferData transferType) {
-				return (target instanceof RootCPListElement);
+				if (!(target instanceof RootCPListElement))
+					return false;
+				RootCPListElement root= (RootCPListElement) target;
+				return fromModularLibrary ? root.isClassPathRootNode() : root.isModulePathRootNode();
 			}
 
 		});
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ProjectsWorkbookPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ProjectsWorkbookPage.java
index f70f17d..b504a8f 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ProjectsWorkbookPage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/buildpaths/ProjectsWorkbookPage.java
@@ -78,6 +78,7 @@
 	
 	private boolean dragDropEnabled;
 	private Object draggedItemsProject;
+	private boolean fromModularProject;
 
 	public ProjectsWorkbookPage(ListDialogField<CPListElement> classPathList, IWorkbenchPreferenceContainer pageContainer) {
 		fClassPathList= classPathList;
@@ -196,6 +197,19 @@
 							event.doit= false;
 							break;
 						}
+						if (element instanceof CPListElement) {
+							CPListElement cpe= (CPListElement) element;
+							List<CPListElement> elements= fProjectsList.getElements();
+							for (Object cpListElement : elements) {
+								if (cpListElement instanceof RootCPListElement) {
+									RootCPListElement root= (RootCPListElement) cpListElement;
+									if (root.getChildren().contains(cpe)) {
+										fromModularProject= root.isModulePathRootNode();
+										break;
+									}
+								}
+							}
+						}
 					}
 				}
 			}
@@ -245,7 +259,10 @@
 
 			@Override
 			public boolean validateDrop(Object target, int operation, TransferData transferType) {
-				return (target instanceof RootCPListElement);
+				if (!(target instanceof RootCPListElement))
+					return false;
+				RootCPListElement root= (RootCPListElement) target;
+				return fromModularProject ? root.isClassPathRootNode() : root.isModulePathRootNode();
 			}
 		});