Mercurial > dive4elements > river
view flys-client/src/main/java/de/intevation/flys/client/client/ui/MainMenu.java @ 4215:c179cd02177d
Logout the current user
Add code to the logout button to remove the current user from the session and to
redirect the browser window to the login page.
Part of flys/issue916 (Logout: "Abmelden" Knopf mit Funktion belegen)
author | Björn Ricks <bjoern.ricks@intevation.de> |
---|---|
date | Tue, 23 Oct 2012 09:59:16 +0200 |
parents | 725470fc57d2 |
children | a04862abce42 |
line wrap: on
line source
package de.intevation.flys.client.client.ui; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.util.BooleanCallback; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Button; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.layout.HLayout; import de.intevation.flys.client.client.FLYS; import de.intevation.flys.client.client.FLYSConstants; import de.intevation.flys.client.client.services.UserService; import de.intevation.flys.client.client.services.UserServiceAsync; import de.intevation.flys.client.shared.model.User; /** * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> */ public class MainMenu extends HLayout { /** The interface that provides i18n messages. */ private final FLYSConstants messages = GWT.create(FLYSConstants.class); /** An instance to FLYS.*/ protected FLYS flys; /** The user that is currently logged in. */ protected User currentUser; /** The label that displays the current logged in user. */ protected Label userText; /** The button to log the current user out.*/ protected Button logout; /** The button to add new projects.*/ protected Button newProject; /** The button to open the project list.*/ protected Button projectList; /** The button to switch between the english and german version.*/ protected Button language; /** The button to open an info panel.*/ protected Button info; protected UserServiceAsync userService = GWT.create(UserService.class); /** * The default constructor for creating a new MainMenu. */ public MainMenu(FLYS flys) { this.flys = flys; String guest = messages.user() + " " + messages.guest(); userText = new Label(guest); newProject = new Button(messages.new_project()); projectList = new Button(messages.manage_projects()); logout = new Button(messages.logout()); language = new Button(messages.switch_language()); info = new Button(messages.info()); newProject.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { GWT.log("Clicked 'New Project' button."); createNewProject(); } }); projectList.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { GWT.log("Clicked 'Open ProjectList' button."); ProjectList list = getFlys().getProjectList(); if (list.isVisible()) list.hide(); else list.show(); } }); logout.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { GWT.log("Clicked 'logout' button."); userService.logoutCurrentUser(new AsyncCallback<Void>() { public void onFailure(Throwable caught) { } public void onSuccess(Void result) { Window.Location.replace("/login.jsp"); } }); } }); language.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { LocaleInfo info = LocaleInfo.getCurrentLocale(); final String currentLocale = info.getLocaleName(); final String newLocale = currentLocale.equals("de") ? "en" : "de"; SC.confirm(messages.warning(), messages.warning_language(), new BooleanCallback() { @Override public void execute(Boolean value) { if (value) { switchLanguage(currentLocale, newLocale); } } }); } }); info.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { GWT.log("Clicked 'info' button."); GWT.log("IMPLEMENT the 'open info panel' function."); } }); init(); } /** * This method is called by the constructor after creating the necessary * components. It initializes layout specific stuff like width, height, * colors and so on and appends the components. */ protected void init() { setStyleName("bgBlueDark"); setHeight("25px"); setLayoutMargin(5); newProject.setStyleName("fontLightSmall"); projectList.setStyleName("fontLightSmall"); userText.setStyleName("fontLightSmall"); newProject.setStyleName("fontLightSmall"); logout.setStyleName("fontLightSmall"); language.setStyleName("fontLightSmall"); info.setStyleName("fontLightSmall"); projectList.setWidth("140px"); HLayout leftPanel = new HLayout(); leftPanel.setWidth("80%"); leftPanel.setMembersMargin(5); leftPanel.addMember(newProject); leftPanel.addMember(projectList); userText.setAlign(Alignment.RIGHT); userText.setWidth(200); logout.setWidth(70); info.setWidth(40); language.setWidth(70); HLayout rightPanel = new HLayout(); rightPanel.setAlign(Alignment.RIGHT); rightPanel.setMembersMargin(3); rightPanel.setLayoutRightMargin(5); rightPanel.addMember(userText); rightPanel.addMember(logout); rightPanel.addMember(language); rightPanel.addMember(info); addMember(leftPanel); addMember(rightPanel); } /** * Returns the FLYS instance stored in this class. * * @return the flys instance. */ protected FLYS getFlys() { return flys; } /** * Set the current {@link User} and call {@link updateCurrentUser()} * afterwards. * * @param user the new user. */ public void setCurrentUser(User currentUser) { this.currentUser = currentUser; updateCurrentUser(); } /** * Update the text field that shows the current user. If no user is * currently logged in, the text will display {@link FLYSConstants.guest()}. */ public void updateCurrentUser() { String name = currentUser != null ? currentUser.getName() : messages.guest(); GWT.log("Update the current user: " + name); String username = messages.user() + " " + name; userText.setContents(username); } /** * Create a new project by calling FLYS.newProject(). */ protected void createNewProject() { flys.newProject(); } /** * This method triggers the language switch between the <i>currentLocale</i> * and the <i>newLocale</i>. The switch is done by replacing a "locale=" * parameter in the url of the application. We could use the GWT UrlBuilder * class to create a new URL, but - in my eyes - this class is a bit * inconsistens in its implementation. * * @param currentLocale The current locale string (e.g. "en"). * @param newLocale The new locale string (e.g. "de"). */ protected void switchLanguage(String currentLocale, String newLocale) { String newLocation = Window.Location.getHref(); if (newLocation.endsWith("/")) { newLocation = newLocation.substring(0, newLocation.length()-1); } String replace = null; String replaceWith = null; if (newLocation.indexOf("&locale=") >= 0) { replace = currentLocale.equals("de") ? "&locale=de" : "&locale=en"; replaceWith = "&locale=" + newLocale; } else if (newLocation.indexOf("?locale=") >= 0) { replace = currentLocale.equals("de") ? "?locale=de" : "?locale=en"; replaceWith = "?locale=" + newLocale; } else { newLocation += newLocation.indexOf("?") >= 0 ? "&locale=" + newLocale : "?locale=" + newLocale; } if (replace != null && replaceWith != null) { newLocation = newLocation.replace(replace, replaceWith); } Window.open(newLocation, "_self", ""); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :