From de3790a269bcab383314a8f92b71f07e2ef2b8ba Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Wed, 3 Oct 2018 10:18:55 +0200
Subject: [PATCH] OO-3620: accept at the top or at the bottom of a target
 element

The drag and drop make a difference if the element is droppped at the
top of an element or at the bottom and behave like the UI of dragula
---
 .../olat/modules/ceditor/PageEditorProvider.java |  2 +-
 .../ceditor/ui/HTMLRawEditorController.java      | 10 +++++-----
 .../modules/ceditor/ui/PageEditorController.java | 15 +++++++++------
 .../ceditor/ui/component/PageEditorModel.java    | 12 ++++++++++--
 .../ceditor/ui/event/DropFragmentEvent.java      | 12 ++++++++++++
 .../modules/ceditor/ui/model/EditorFragment.java |  5 ++++-
 .../org/olat/modules/forms/model/xml/Form.java   | 12 ++++++++----
 .../forms/ui/EvaluationFormEditorController.java |  6 +++---
 .../olat/modules/portfolio/PortfolioService.java |  2 +-
 .../olat/modules/portfolio/manager/PageDAO.java  | 16 ++++++++++++----
 .../portfolio/manager/PortfolioServiceImpl.java  |  4 ++--
 .../modules/portfolio/ui/PageRunController.java  |  6 +++---
 12 files changed, 70 insertions(+), 32 deletions(-)

diff --git a/src/main/java/org/olat/modules/ceditor/PageEditorProvider.java b/src/main/java/org/olat/modules/ceditor/PageEditorProvider.java
index 36b551ef0c2..01bdaab6199 100644
--- a/src/main/java/org/olat/modules/ceditor/PageEditorProvider.java
+++ b/src/main/java/org/olat/modules/ceditor/PageEditorProvider.java
@@ -46,6 +46,6 @@ public interface PageEditorProvider extends PageProvider {
 	 * @param element
 	 * @param sibling The reference object
 	 */
-	public void movePageElement(PageElement element, PageElement sibling);
+	public void movePageElement(PageElement elementToMove, PageElement sibling, boolean after);
 	
 }
diff --git a/src/main/java/org/olat/modules/ceditor/ui/HTMLRawEditorController.java b/src/main/java/org/olat/modules/ceditor/ui/HTMLRawEditorController.java
index 4535ac775ca..ffd80280069 100644
--- a/src/main/java/org/olat/modules/ceditor/ui/HTMLRawEditorController.java
+++ b/src/main/java/org/olat/modules/ceditor/ui/HTMLRawEditorController.java
@@ -117,7 +117,7 @@ public class HTMLRawEditorController extends FormBasicController implements Page
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		String cmpId = "html-" + CodeHelper.getRAMUniqueID() + "h";
-		String content = htmlPart.getContent();
+		String content = contentOrExample(htmlPart.getContent());
 		
 		if(minimalEditor) {
 			htmlItem = uifactory.addRichTextElementForParagraphEditor(cmpId, null, content, 8, 80, formLayout, getWindowControl());
@@ -128,8 +128,8 @@ public class HTMLRawEditorController extends FormBasicController implements Page
 		htmlItem.getEditorConfiguration().setSendOnBlur(true);
 		htmlItem.getEditorConfiguration().disableImageAndMovie();
 		htmlItem.getEditorConfiguration().setAutoResizeEnabled(true, -1, 40, 0);
-		
-		String formattedContent = Formatter.formatLatexFormulas(contentOrExample(content));
+
+		String formattedContent = Formatter.formatLatexFormulas(content);
 		staticItem = uifactory.addStaticTextElement(cmpId + "_static", formattedContent, formLayout);
 		
 		((FormLayoutContainer)formLayout).contextPut("htmlCmpId", cmpId);
@@ -160,7 +160,7 @@ public class HTMLRawEditorController extends FormBasicController implements Page
 			String content = htmlItem.getValue();
 			htmlPart.setContent(content);
 			htmlPart = store.savePageElement(htmlPart);
-			String formattedContent = Formatter.formatLatexFormulas(contentOrExample(content));
+			String formattedContent = Formatter.formatLatexFormulas(content);
 			staticItem.setValue(formattedContent);
 			fireEvent(ureq, new ChangePartEvent(htmlPart));
 		}
@@ -173,7 +173,7 @@ public class HTMLRawEditorController extends FormBasicController implements Page
 		htmlPart.setContent(content);
 		htmlPart = store.savePageElement(htmlPart);
 
-		String formattedContent = Formatter.formatLatexFormulas(contentOrExample(content));
+		String formattedContent = Formatter.formatLatexFormulas(content);
 		staticItem.setValue(formattedContent);
 		fireEvent(ureq, new ChangePartEvent(htmlPart));
 	}
diff --git a/src/main/java/org/olat/modules/ceditor/ui/PageEditorController.java b/src/main/java/org/olat/modules/ceditor/ui/PageEditorController.java
index 93fff601255..9b27fbf7014 100644
--- a/src/main/java/org/olat/modules/ceditor/ui/PageEditorController.java
+++ b/src/main/java/org/olat/modules/ceditor/ui/PageEditorController.java
@@ -359,7 +359,7 @@ public class PageEditorController extends BasicController {
 	
 					PageElement pageElement = provider.appendPageElementAt(element, index);
 					newFragment = createFragment(ureq, pageElement);
-					editorModel.add(index, newFragment);
+					editorModel.add(index, newFragment, false);
 				}
 			}
 		}
@@ -414,7 +414,7 @@ public class PageEditorController extends BasicController {
 			if(index >= 0) {
 				provider.moveUpPageElement(fragment.getPageElement());
 				editorModel.remove(fragment);
-				editorModel.add(index, fragment);
+				editorModel.add(index, fragment, false);
 			}
 		}
 		
@@ -435,8 +435,7 @@ public class PageEditorController extends BasicController {
 			if(index < editorModel.size()) {
 				provider.moveDownPageElement(fragment.getPageElement());
 				editorModel.remove(fragment);
-				editorModel.add(index, fragment);
-				
+				editorModel.add(index, fragment, false);
 			}
 		}
 		
@@ -524,15 +523,19 @@ public class PageEditorController extends BasicController {
 			
 			int index = editorModel.size();
 			PageElement nextElement = null;
+			boolean after = false;
 			if(sibling != null && editorModel.contains(sibling)) {
+				// dropped at the top of the target element
 				index = editorModel.indexOf(sibling);
 				nextElement = sibling.getPageElement();
 			} else if(target != null && editorModel.contains(target)) {
+				// target: dropped at the bottom of the target element
 				index = editorModel.indexOf(target);
 				nextElement = target.getPageElement();
+				after = true;
 			}
-			editorModel.add(index, fragment);
-			provider.movePageElement(fragment.getPageElement(), nextElement);
+			editorModel.add(index, fragment, after);
+			provider.movePageElement(fragment.getPageElement(), nextElement, after);
 			fragment.setEditMode(false);
 		}
 	}
diff --git a/src/main/java/org/olat/modules/ceditor/ui/component/PageEditorModel.java b/src/main/java/org/olat/modules/ceditor/ui/component/PageEditorModel.java
index 1de3030f7a2..536a8e169ae 100644
--- a/src/main/java/org/olat/modules/ceditor/ui/component/PageEditorModel.java
+++ b/src/main/java/org/olat/modules/ceditor/ui/component/PageEditorModel.java
@@ -57,8 +57,16 @@ public class PageEditorModel {
 		return fragments.size();
 	}
 	
-	public void add(int index, EditorFragment fragment) {
-		fragments.add(index, fragment);
+	public void add(int index, EditorFragment fragment, boolean after) {
+		if(after) {
+			index++;
+		}
+		
+		if(index >= 0 && index < fragments.size()) {
+			fragments.add(index, fragment);
+		} else {
+			fragments.add(fragment);
+		}
 	}
 	
 	public boolean add(EditorFragment fragment) {
diff --git a/src/main/java/org/olat/modules/ceditor/ui/event/DropFragmentEvent.java b/src/main/java/org/olat/modules/ceditor/ui/event/DropFragmentEvent.java
index 4015e20cd1d..0f672286ac4 100644
--- a/src/main/java/org/olat/modules/ceditor/ui/event/DropFragmentEvent.java
+++ b/src/main/java/org/olat/modules/ceditor/ui/event/DropFragmentEvent.java
@@ -72,4 +72,16 @@ public class DropFragmentEvent extends Event {
 	public String getSlotId() {
 		return slotId;
 	}
+	
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder(256);
+		sb.append("dropFragment[dragged=").append(dragged == null ? "" : dragged).append(";")
+		  .append("source=").append(source == null ? "" : source).append(";")
+		  .append("target=").append(targetCmpId == null ? "" : targetCmpId).append(";")
+		  .append("sibling=").append(siblingCmpId == null ? "" : siblingCmpId).append(";")
+		  .append("container=").append(containerCmpId == null ? "" : containerCmpId).append(";")
+		  .append("slot=").append(slotId == null ? "" : slotId).append("]");
+		return sb.toString();
+	}
 }
diff --git a/src/main/java/org/olat/modules/ceditor/ui/model/EditorFragment.java b/src/main/java/org/olat/modules/ceditor/ui/model/EditorFragment.java
index e791f2487b4..0209fbb217b 100644
--- a/src/main/java/org/olat/modules/ceditor/ui/model/EditorFragment.java
+++ b/src/main/java/org/olat/modules/ceditor/ui/model/EditorFragment.java
@@ -60,7 +60,10 @@ public class EditorFragment {
 	public void setEditMode(boolean editMode) {
 		this.editMode = editMode;
 		if(editorPart instanceof PageElementEditorController) {
-			((PageElementEditorController)editorPart).setEditMode(editMode);
+			PageElementEditorController editorCtrl = (PageElementEditorController)editorPart;
+			if(editorCtrl.isEditMode() != editMode) {
+				((PageElementEditorController)editorPart).setEditMode(editMode);
+			}
 		}
 	}
 	
diff --git a/src/main/java/org/olat/modules/forms/model/xml/Form.java b/src/main/java/org/olat/modules/forms/model/xml/Form.java
index 689b0430f3f..040c05ffb4a 100644
--- a/src/main/java/org/olat/modules/forms/model/xml/Form.java
+++ b/src/main/java/org/olat/modules/forms/model/xml/Form.java
@@ -84,8 +84,8 @@ public class Form {
 		}
 	}
 	
-	public void moveElement(AbstractElement element, AbstractElement sibling) {
-		if(elements.remove(element)) {
+	public void moveElement(AbstractElement elementToMove, AbstractElement sibling, boolean after) {
+		if(elements.remove(elementToMove)) {
 			int index;
 			if(sibling == null) {
 				index = elements.size();
@@ -93,10 +93,14 @@ public class Form {
 				index = elements.indexOf(sibling);
 			}
 			
+			if(after) {
+				index++;
+			}
+			
 			if(index >= 0 && index <= elements.size()) {
-				elements.add(index, element);
+				elements.add(index, elementToMove);
 			} else {
-				elements.add(element);
+				elements.add(elementToMove);
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/modules/forms/ui/EvaluationFormEditorController.java b/src/main/java/org/olat/modules/forms/ui/EvaluationFormEditorController.java
index 7725d16c473..c55176da361 100644
--- a/src/main/java/org/olat/modules/forms/ui/EvaluationFormEditorController.java
+++ b/src/main/java/org/olat/modules/forms/ui/EvaluationFormEditorController.java
@@ -231,9 +231,9 @@ public class EvaluationFormEditorController extends BasicController {
 		}
 
 		@Override
-		public void movePageElement(PageElement element, PageElement sibling) {
-			if(element instanceof AbstractElement && (sibling == null || sibling instanceof AbstractElement)) {
-				form.moveElement((AbstractElement)element, (AbstractElement)sibling);
+		public void movePageElement(PageElement elementToMove, PageElement sibling, boolean after) {
+			if(elementToMove instanceof AbstractElement && (sibling == null || sibling instanceof AbstractElement)) {
+				form.moveElement((AbstractElement)elementToMove, (AbstractElement)sibling, after);
 				persistForm();
 			}
 		}
diff --git a/src/main/java/org/olat/modules/portfolio/PortfolioService.java b/src/main/java/org/olat/modules/portfolio/PortfolioService.java
index ce445e198e3..688cb90d724 100644
--- a/src/main/java/org/olat/modules/portfolio/PortfolioService.java
+++ b/src/main/java/org/olat/modules/portfolio/PortfolioService.java
@@ -560,7 +560,7 @@ public interface PortfolioService {
 	
 	public void moveDownPagePart(Page page, PagePart part);
 	
-	public void movePagePart(Page page, PagePart part, PagePart sibling);
+	public void movePagePart(Page page, PagePart partToMove, PagePart sibling, boolean after);
 	
 	/**
 	 * Remove the page from the section, remove relations to the
diff --git a/src/main/java/org/olat/modules/portfolio/manager/PageDAO.java b/src/main/java/org/olat/modules/portfolio/manager/PageDAO.java
index 2f6a4ab9c4b..2093818d9ec 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/PageDAO.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/PageDAO.java
@@ -521,7 +521,7 @@ public class PageDAO {
 		}
 	}
 	
-	public void movePart(PageBody body, PagePart part, PagePart sibling) {
+	public void movePart(PageBody body, PagePart part, PagePart sibling, boolean after) {
 		body.getParts().size();
 		body.getParts().remove(part);
 		
@@ -530,9 +530,17 @@ public class PageDAO {
 			index = body.getParts().size();
 		} else {
 			index = body.getParts().indexOf(sibling);
-		}	
-			
-		body.getParts().add(index, part);
+		}
+		if(after) {
+			index++;
+		}
+		
+		List<PagePart> parts = body.getParts();
+		if(index >= 0 && index < parts.size()) {
+			parts.add(index, part);
+		} else {
+			parts.add(part);
+		}
 		((PageBodyImpl)body).setLastModified(new Date());
 		dbInstance.getCurrentEntityManager().merge(body);
 	}
diff --git a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
index 8d3b063a585..4dbe1b32e01 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
@@ -995,9 +995,9 @@ public class PortfolioServiceImpl implements PortfolioService {
 	}
 
 	@Override
-	public void movePagePart(Page page, PagePart part, PagePart sibling) {
+	public void movePagePart(Page page, PagePart partToMove, PagePart sibling, boolean after) {
 		PageBody body = pageDao.loadPageBodyByKey(page.getBody().getKey());
-		pageDao.movePart(body, part, sibling);
+		pageDao.movePart(body, partToMove, sibling, after);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
index 60d6a7408dd..e061bcd213c 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
@@ -836,9 +836,9 @@ public class PageRunController extends BasicController implements TooledControll
 		}
 
 		@Override
-		public void movePageElement(PageElement element, PageElement sibling) {
-			if(element instanceof PagePart && (sibling == null || sibling instanceof PagePart)) {
-				portfolioService.movePagePart(page, (PagePart)element, (PagePart)sibling);
+		public void movePageElement(PageElement elementToMove, PageElement sibling, boolean after) {
+			if(elementToMove instanceof PagePart && (sibling == null || sibling instanceof PagePart)) {
+				portfolioService.movePagePart(page, (PagePart)elementToMove, (PagePart)sibling, after);
 			}
 		}
 	}
-- 
GitLab