From 75f48004a46787b388741a10815efcd541d314ac Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 6 Jun 2014 09:19:39 +0200
Subject: [PATCH] OO-1068: +reactivate language selection

---
 .../fullWebApp/BaseFullWebappController.java  | 22 ++++++++++---
 .../org/olat/core/gui/components/Window.java  | 33 +++++++++++--------
 .../core/gui/control/ChiefController.java     |  2 ++
 .../gui/control/DefaultChiefController.java   |  5 +++
 .../login/DMZContentControllerCreator.java    |  8 +++--
 5 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
index e586886b2f6..aeba7f78647 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
+++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
@@ -121,6 +121,7 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 	private Controller jsLoggerC;
 	private List<String> bodyCssClasses = new ArrayList<>(3);
 
+	private Boolean reload;
 	private final ScreenMode screenMode = new ScreenMode();
 	private WindowBackOffice wbo;
 	
@@ -783,6 +784,16 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 		
 		addCustomThemeJS();
 	}
+	
+	@Override
+	public boolean wishReload(boolean erase) {
+		boolean screen = getScreenMode().wishScreenModeSwitch(erase);
+		boolean r = (reload == null ? false : reload.booleanValue());
+		if(erase && reload != null) {
+			reload = null;
+		}
+		return r || screen;
+	}
 
 	@Override
 	public ScreenMode getScreenMode() {
@@ -1107,11 +1118,14 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 			}
 		} else if(event instanceof LanguageChangedEvent){
 			LanguageChangedEvent lce = (LanguageChangedEvent)event;
+			UserRequest ureq = lce.getCurrentUreq();
 			getTranslator().setLocale(lce.getNewLocale());
-			initialize(lce.getCurrentUreq());
-			//TODO
-			//initialPanel.popContent();
-			//initialPanel.pushContent(mainVc);
+			initialize(ureq);
+			WindowManager winman = Windows.getWindows(ureq).getWindowManager();
+			initializeBase(ureq, winman, initialPanel);
+			initialPanel.setContent(mainVc);
+			
+			reload = Boolean.TRUE;
 		} else if (event instanceof ChiefControllerMessageEvent) {
 			// msg can be set to show only on one node or on all nodes
 			String msg = GlobalStickyMessage.getGlobalStickyMessage();//either null, or the global message or the per-node-message
diff --git a/src/main/java/org/olat/core/gui/components/Window.java b/src/main/java/org/olat/core/gui/components/Window.java
index 29208c11092..3d01d6c8cb4 100644
--- a/src/main/java/org/olat/core/gui/components/Window.java
+++ b/src/main/java/org/olat/core/gui/components/Window.java
@@ -39,6 +39,7 @@ import org.json.JSONException;
 import org.json.JSONObject;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DBFactory;
+import org.olat.core.dispatcher.DispatcherModule;
 import org.olat.core.dispatcher.mapper.MapperService;
 import org.olat.core.gui.GUIInterna;
 import org.olat.core.gui.GlobalSettings;
@@ -335,12 +336,12 @@ public class Window extends AbstractComponent {
 						// 2.) collect dirty components (top-down, return from sub-path when first dirty node met)
 						// 3.) return to sender...
 						boolean didDispatch = false;
-						boolean switchScreenMode = false;
+						boolean forceReload = false;
 						if (validForDispatching) {
 							DispatchResult dispatchResult = doDispatchToComponent(ureq, null);  // FIXME:fj:c enable time stats for ajax-mode
 							didDispatch = dispatchResult.isDispatch();
 							incTimestamp = dispatchResult.isIncTimestamp();
-							switchScreenMode = dispatchResult.isSwitchScreenMode();
+							forceReload = dispatchResult.isForceReload();
 							if (isDebugLog) {
 								long durationAfterDoDispatchToComponent = System.currentTimeMillis() - debug_start;
 								log.debug("Perf-Test: Window durationAfterDoDispatchToComponent=" + durationAfterDoDispatchToComponent);
@@ -350,7 +351,7 @@ public class Window extends AbstractComponent {
 						MediaResource mmr = null;
 						//REVIEW:PB: this will be the code allowing back forward navigation
 						//-----> if (didDispatch || inlineAfterBackForward) {
-						if (switchScreenMode) {
+						if (forceReload) {
 							//force RELOAD with a redirect to itself
 							String reRenderUri = buildURIFor(this, timestampID, null);
 							Command rmrcom = CommandFactory.createParentRedirectTo(reRenderUri);
@@ -614,9 +615,11 @@ public class Window extends AbstractComponent {
 				debugMsg.append("sync_bdisp:").append(syncIntroDiff).append(LOG_SEPARATOR);
 			}
 			
+			boolean forceReload = false;
 			if (dispatch) {
 				DispatchResult dispatchResult = doDispatchToComponent(ureq, debugMsg);
 				boolean didDispatch = dispatchResult.isDispatch();
+				forceReload = dispatchResult.isForceReload();
 				incTimestamp = dispatchResult.isIncTimestamp();
 				if (isDebugLog) {
 					long dstop = System.currentTimeMillis();
@@ -670,8 +673,13 @@ public class Window extends AbstractComponent {
 					return;
 				}
 			}
-
-			if (inline) {
+			
+			if(forceReload) {
+				//force RELOAD with a redirect to itself (http redirect because we are in non-Ajax mode)
+				String reRenderUri = buildURIFor(this, timestampID, null);
+				String url = reRenderUri;
+				DispatcherModule.redirectTo(response, url);
+			} else if (inline) {
 					// do inline rendering.
 					
 					ComponentCollection top = getContentPane();
@@ -1189,9 +1197,8 @@ public class Window extends AbstractComponent {
 		}
 		
 		ChiefController chief = Windows.getWindows(ureq).getChiefController();
-		boolean switchScreenMode = chief == null ?
-				false : chief.getScreenMode().wishScreenModeSwitch(true);
-		return new DispatchResult(toDispatch, incTimestamp, switchScreenMode);
+		boolean reload = chief == null ? false : chief.wishReload(true);
+		return new DispatchResult(toDispatch, incTimestamp, reload);
 	}
 	
 	private void appendDispatchDebugInfos(Component target, StringBuilder debugMsg) {
@@ -1319,20 +1326,20 @@ public class Window extends AbstractComponent {
 class DispatchResult {
 	private final boolean dispatch;
 	private final boolean incTimestamp;
-	private final boolean switchScreenMode;
+	private final boolean forceReload;
 	
-	public DispatchResult(boolean dispatch, boolean incTimestamp, boolean switchScreenMode) {
+	public DispatchResult(boolean dispatch, boolean incTimestamp, boolean forceReload) {
 		this.dispatch = dispatch;
 		this.incTimestamp = incTimestamp;
-		this.switchScreenMode = switchScreenMode;
+		this.forceReload = forceReload;
 	}
 
 	public boolean isDispatch() {
 		return dispatch;
 	}
 
-	public boolean isSwitchScreenMode() {
-		return switchScreenMode;
+	public boolean isForceReload() {
+		return forceReload;
 	}
 
 	public boolean isIncTimestamp() {
diff --git a/src/main/java/org/olat/core/gui/control/ChiefController.java b/src/main/java/org/olat/core/gui/control/ChiefController.java
index 93793d2f077..78276274458 100644
--- a/src/main/java/org/olat/core/gui/control/ChiefController.java
+++ b/src/main/java/org/olat/core/gui/control/ChiefController.java
@@ -45,6 +45,8 @@ public interface ChiefController extends Controller {
 	
 	public ScreenMode getScreenMode();
 	
+	public boolean wishReload(boolean erase);
+	
 	/**
 	 * Set a class to the &lt;body&gt;
 	 * @param cssClass
diff --git a/src/main/java/org/olat/core/gui/control/DefaultChiefController.java b/src/main/java/org/olat/core/gui/control/DefaultChiefController.java
index 89c4522f49f..d00a61080c1 100644
--- a/src/main/java/org/olat/core/gui/control/DefaultChiefController.java
+++ b/src/main/java/org/olat/core/gui/control/DefaultChiefController.java
@@ -63,6 +63,11 @@ public abstract class DefaultChiefController extends DefaultController implement
 		this.window = window;
 	}
 
+	@Override
+	public boolean wishReload(boolean erase) {
+		return false;
+	}
+
 	@Override
 	public ScreenMode getScreenMode() {
 		return screenMode;
diff --git a/src/main/java/org/olat/login/DMZContentControllerCreator.java b/src/main/java/org/olat/login/DMZContentControllerCreator.java
index 4287962e9d6..425c26ad28e 100644
--- a/src/main/java/org/olat/login/DMZContentControllerCreator.java
+++ b/src/main/java/org/olat/login/DMZContentControllerCreator.java
@@ -26,6 +26,8 @@ package org.olat.login;
 
 import org.olat.core.commons.fullWebApp.BaseFullWebappController;
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.Windows;
+import org.olat.core.gui.control.ChiefController;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.creator.AutoCreator;
@@ -42,11 +44,13 @@ import org.olat.core.gui.control.creator.ControllerCreator;
 public class DMZContentControllerCreator implements ControllerCreator {
 
 	@Override
-	public Controller createController(UserRequest lureq, WindowControl lwControl) {
+	public Controller createController(UserRequest ureq, WindowControl lwControl) {
 		DmzBFWCParts dmzSitesAndNav = new DmzBFWCParts();
 		AutoCreator contentControllerCreator = new AutoCreator();
 		contentControllerCreator.setClassName(LoginAuthprovidersController.class.getName());
 		dmzSitesAndNav.setContentControllerCreator(contentControllerCreator);
-		return new BaseFullWebappController(lureq, dmzSitesAndNav);
+		ChiefController cc = new BaseFullWebappController(ureq, dmzSitesAndNav);
+		Windows.getWindows(ureq.getUserSession()).setChiefController(cc);
+		return cc;
 	}
 }
\ No newline at end of file
-- 
GitLab