From d6fc19c6800827e1ce6321a5bc96ff438af325b2 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Fri, 8 Feb 2019 10:20:56 +0100
Subject: [PATCH] OO-3858: Up/Down as buttons

---
 .../core/gui/components/updown/UpDown.java    | 27 ++++++++++++++++---
 .../gui/components/updown/UpDownFactory.java  |  5 ++--
 .../gui/components/updown/UpDownRenderer.java | 27 +++++++++++++++++++
 .../demo/guidemo/GuiDemoLinksController.java  | 10 ++++---
 .../ui/MultipleChoiceEditorController.java    |  6 +++--
 .../ui/SingleChoiceEditorController.java      |  5 +++-
 6 files changed, 68 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/olat/core/gui/components/updown/UpDown.java b/src/main/java/org/olat/core/gui/components/updown/UpDown.java
index ae1f4f8aa82..507904b72a0 100644
--- a/src/main/java/org/olat/core/gui/components/updown/UpDown.java
+++ b/src/main/java/org/olat/core/gui/components/updown/UpDown.java
@@ -43,30 +43,47 @@ public class UpDown extends AbstractComponent implements ComponentCollection, Co
 	
 	private static final ComponentRenderer RENDERER = new UpDownRenderer();
 	
+	public enum Layout { LINK_HORIZONTAL, BUTTON_HORIZONTAL };
+	
 	private final Link up;
 	private final Link down;
 
 	private final long idPrefix;
 	private final String downName;
 	private final String upName;
+	private final Layout layout;
 	private boolean topmost = false;
 	private boolean loweremost = false;
 	private Object userObject;
 
-	public UpDown(String name) {
+	public UpDown(String name, Layout layout) {
 		super(name);
+		this.layout = layout;
 		setDomReplacementWrapperRequired(false);
 		idPrefix = CodeHelper.getRAMUniqueID();
 		
 		upName = idPrefix + "_up";
-		this.up = LinkFactory.createCustomLink(upName, "up", "", Link.LINK | Link.NONTRANSLATED, null, this);
+		this.up = createLink(layout, upName);
 		up.setDomReplacementWrapperRequired(false);
 		up.setIconLeftCSS("o_icon o_icon-lg o_icon_move_up");
+		up.setCustomDisplayText("");
 		
 		downName = idPrefix + "_down";
-		this.down = LinkFactory.createCustomLink(downName, "down", "", Link.LINK | Link.NONTRANSLATED, null, this);
+		this.down = createLink(layout, downName);;
 		down.setDomReplacementWrapperRequired(false);
 		down.setIconLeftCSS("o_icon o_icon-lg o_icon_move_down");
+		down.setCustomDisplayText("");
+	}
+
+	private Link createLink(Layout layout, String name) {
+		switch (layout) {
+		case LINK_HORIZONTAL:
+			return LinkFactory.createCustomLink(name, "up", "", Link.LINK | Link.NONTRANSLATED, null, this);
+		case BUTTON_HORIZONTAL:
+			return LinkFactory.createButton(name, null, this);
+		default:
+			return LinkFactory.createCustomLink(name, "up", "", Link.LINK | Link.NONTRANSLATED, null, this);
+		}
 	}
 
 	Link getUp() {
@@ -77,6 +94,10 @@ public class UpDown extends AbstractComponent implements ComponentCollection, Co
 		return down;
 	}
 	
+	Layout getLayout() {
+		return layout;
+	}
+
 	public void setTopmost(boolean topmost) {
 		this.topmost = topmost;
 	}
diff --git a/src/main/java/org/olat/core/gui/components/updown/UpDownFactory.java b/src/main/java/org/olat/core/gui/components/updown/UpDownFactory.java
index ffc8d7d5f69..cf133edf86b 100644
--- a/src/main/java/org/olat/core/gui/components/updown/UpDownFactory.java
+++ b/src/main/java/org/olat/core/gui/components/updown/UpDownFactory.java
@@ -20,6 +20,7 @@
 package org.olat.core.gui.components.updown;
 
 import org.olat.core.gui.components.ComponentEventListener;
+import org.olat.core.gui.components.updown.UpDown.Layout;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 
 /**
@@ -30,8 +31,8 @@ import org.olat.core.gui.components.velocity.VelocityContainer;
  */
 public class UpDownFactory {
 	
-	public static UpDown createUpDown(String name, VelocityContainer vc, ComponentEventListener listener) {
-		UpDown upDown = new UpDown(name);
+	public static UpDown createUpDown(String name, Layout layout, VelocityContainer vc, ComponentEventListener listener) {
+		UpDown upDown = new UpDown(name, layout);
 		if (listener != null) {
 			upDown.addListener(listener);
 		}
diff --git a/src/main/java/org/olat/core/gui/components/updown/UpDownRenderer.java b/src/main/java/org/olat/core/gui/components/updown/UpDownRenderer.java
index b59b095b666..eb2c5b73552 100644
--- a/src/main/java/org/olat/core/gui/components/updown/UpDownRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/updown/UpDownRenderer.java
@@ -42,6 +42,19 @@ public class UpDownRenderer extends DefaultComponentRenderer {
 		
 		UpDown upDown = (UpDown) source;
 		
+		switch (upDown.getLayout()) {
+		case LINK_HORIZONTAL:
+			renderLinkHorizontal(renderer, sb, args, upDown);
+			break;
+		case BUTTON_HORIZONTAL:
+			renderButtonHorizontal(renderer, sb, args, upDown);
+			break;
+		default:
+			break;
+		}
+	}
+
+	private void renderLinkHorizontal(Renderer renderer, StringOutput sb, String[] args, UpDown upDown) {
 		sb.append("<span class='o_updown'>");
 		sb.append("<span class='o_hidden'>", upDown.isTopmost());
 		renderer.render(upDown.getUp(), sb, args);
@@ -53,4 +66,18 @@ public class UpDownRenderer extends DefaultComponentRenderer {
 		sb.append("</span>");
 	}
 
+	private void renderButtonHorizontal(Renderer renderer, StringOutput sb, String[] args, UpDown upDown) {
+		sb.append("<div class='btn-group o_updown'>");
+		if (upDown.isTopmost()) {
+			upDown.getUp().setEnabled(false);
+		}
+		renderer.render(upDown.getUp(), sb, args);
+		
+		if (upDown.isLowermost()) {
+			upDown.getDown().setEnabled(false);
+		}
+		renderer.render(upDown.getDown(), sb, args);
+		sb.append("</div>");
+	}
+
 }
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoLinksController.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoLinksController.java
index 87c58ec8765..de9041506ee 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoLinksController.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoLinksController.java
@@ -41,6 +41,7 @@ import org.olat.core.gui.components.panel.Panel;
 import org.olat.core.gui.components.text.TextComponent;
 import org.olat.core.gui.components.text.TextFactory;
 import org.olat.core.gui.components.updown.UpDown;
+import org.olat.core.gui.components.updown.UpDown.Layout;
 import org.olat.core.gui.components.updown.UpDownEvent;
 import org.olat.core.gui.components.updown.UpDownEvent.Direction;
 import org.olat.core.gui.components.updown.UpDownFactory;
@@ -125,16 +126,17 @@ public class GuiDemoLinksController extends BasicController {
 		linkTooltip.setTooltip("link.tooltip.text");
 		
 		upDowns = new ArrayList<>();
-		UpDown upDownA = UpDownFactory.createUpDown("updown-a", mainVC, this);
+		Layout layout = Layout.LINK_HORIZONTAL;
+		UpDown upDownA = UpDownFactory.createUpDown("updown-a", layout, mainVC, this);
 		upDownA.setUserObject("A");
 		upDowns.add(new UpDownWrapper("A", upDownA));
-		UpDown upDownB = UpDownFactory.createUpDown("updown-b", mainVC, this);
+		UpDown upDownB = UpDownFactory.createUpDown("updown-b", layout, mainVC, this);
 		upDownA.setUserObject("B");
 		upDowns.add(new UpDownWrapper("B", upDownB));
-		UpDown upDownC = UpDownFactory.createUpDown("updown-c", mainVC, this);
+		UpDown upDownC = UpDownFactory.createUpDown("updown-c", layout, mainVC, this);
 		upDownA.setUserObject("C");
 		upDowns.add(new UpDownWrapper("C", upDownC));
-		UpDown upDownD = UpDownFactory.createUpDown("updown-d", mainVC, this);
+		UpDown upDownD = UpDownFactory.createUpDown("updown-d",layout,  mainVC, this);
 		upDownA.setUserObject("D");
 		upDowns.add(new UpDownWrapper("D", upDownD));
 		doDisableUpDowns();
diff --git a/src/main/java/org/olat/modules/forms/ui/MultipleChoiceEditorController.java b/src/main/java/org/olat/modules/forms/ui/MultipleChoiceEditorController.java
index da412414daa..2456e82cf9f 100644
--- a/src/main/java/org/olat/modules/forms/ui/MultipleChoiceEditorController.java
+++ b/src/main/java/org/olat/modules/forms/ui/MultipleChoiceEditorController.java
@@ -19,6 +19,8 @@
  */
 package org.olat.modules.forms.ui;
 
+import static org.olat.core.gui.components.updown.UpDown.Layout.LINK_HORIZONTAL;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
@@ -142,8 +144,8 @@ public class MultipleChoiceEditorController extends FormBasicController implemen
 			Choice choice = choices.get(i);
 
 			// move
-			UpDown upDown = UpDownFactory.createUpDown("ud_" + CodeHelper.getRAMUniqueID(), flc.getFormItemComponent(),
-					this);
+			UpDown upDown = UpDownFactory.createUpDown("ud_" + CodeHelper.getRAMUniqueID(), LINK_HORIZONTAL,
+					flc.getFormItemComponent(), this);
 			upDown.setUserObject(choice);
 			if (i == 0) {
 				upDown.setTopmost(true);
diff --git a/src/main/java/org/olat/modules/forms/ui/SingleChoiceEditorController.java b/src/main/java/org/olat/modules/forms/ui/SingleChoiceEditorController.java
index 91019a76a02..564254b66ad 100644
--- a/src/main/java/org/olat/modules/forms/ui/SingleChoiceEditorController.java
+++ b/src/main/java/org/olat/modules/forms/ui/SingleChoiceEditorController.java
@@ -19,6 +19,8 @@
  */
 package org.olat.modules.forms.ui;
 
+import static org.olat.core.gui.components.updown.UpDown.Layout.LINK_HORIZONTAL;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -143,7 +145,8 @@ public class SingleChoiceEditorController extends FormBasicController implements
 			Choice choice = choices.get(i);
 			
 			// move
-			UpDown upDown = UpDownFactory.createUpDown("ud_" + CodeHelper.getRAMUniqueID(), flc.getFormItemComponent(), this);
+			UpDown upDown = UpDownFactory.createUpDown("ud_" + CodeHelper.getRAMUniqueID(), LINK_HORIZONTAL,
+					flc.getFormItemComponent(), this);
 			upDown.setUserObject(choice);
 			if (i == 0) {
 				upDown.setTopmost(true);
-- 
GitLab