/*
*
* @file LoginDialog.java
*
* Copyright (C) 2006-2009 Tensegrity Software GmbH
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License (Version 2) as published
* by the Free Software Foundation at http://www.gnu.org/copyleft/gpl.html.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*
* If you are developing and distributing open source applications under the
* GPL License, then you are free to use JPalo Modules under the GPL License. For OEMs,
* ISVs, and VARs who distribute JPalo Modules with their products, and do not license
* and distribute their source code under the GPL, Tensegrity provides a flexible
* OEM Commercial License.
*
* @author Philipp Bouillon <Philipp.Bouillon@tensegrity-software.com>
*
* @version $Id: LoginDialog.java,v 1.31 2010/04/12 11:13:36 PhilippBouillon Exp $
*
*/
/*
* (c) Tensegrity Software 2008
* All rights reserved
*/
package com.tensegrity.wpalo.client.ui.dialog;
import java.util.Date;
import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.XDOM;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.util.Point;
import com.extjs.gxt.ui.client.widget.Html;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.button.StatusButtonBar;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.tensegrity.palo.gwt.core.client.models.admin.XUser;
import com.tensegrity.wpalo.client.async.Callback;
import com.tensegrity.wpalo.client.i18n.ILocalConstants;
import com.tensegrity.wpalo.client.i18n.Resources;
import com.tensegrity.wpalo.client.services.wpalo.WPaloControllerServiceProvider;
/**
* <code>LoginDialog</code> TODO DOCUMENT ME
*
* @version $Id: LoginDialog.java,v 1.31 2010/04/12 11:13:36 PhilippBouillon Exp $
*/
//TODO get it to work as a dialog!!
//somehow it doesn't looks good in gwt host mode. maybe its an ie6 thing...
public class LoginDialog extends FormPanel { // extends Dialog {
protected transient final ILocalConstants constants = Resources.getInstance().getConstants();
private StatusButtonBar buttonBar;
private TextField<String> login;
private TextField<String> password;
private LanguageBox languageList;
private ThemeBox themeList;
private Button doReset;
private Button doLogin;
private XUser usr;
private SimpleComboValue <LanguageData> currentLanguage;
private SimpleComboValue <ThemeData> currentTheme;
// private static LoginDialog instance = new LoginDialog();
// public static LoginDialog getInstance() {
// return instance;
// }
public LoginDialog(String userName) {
FormLayout layout = new FormLayout();
layout.setLabelWidth(115);
layout.setDefaultWidth(170);
setLayout(layout);
setHeaderVisible(false);
setStyleAttribute("padding", "20");
setStyleAttribute("margin", "10");
setBorders(true);
addHeaderLogo();
addInputFields();
addButtons();
if (userName != null) {
login.setValue(userName);
password.focus();
}
}
public final void show() {
super.show();
if (GXT.isIE) {
setSize(370, 270);
} else {
setSize(370, 290);
}
Point p = el().getAlignToXY(XDOM.getBody(), "c-c", null);
setPagePosition(p.x, p.y);
login.focus();
}
/**
* Returns the logged in user if authentication was successful or
* <code>null</code> otherwise.
* @return the logged in user or <code>null</code>
*/
public final XUser getUser() {
return usr;
}
private final void addHeaderLogo() {
Html header = new Html();
header.setStyleName("icon-login");
header.setStyleAttribute("padding", "20");
setTopComponent(header);
}
private final void addInputFields() {
KeyListener keyListener = new KeyListener() {
public void componentKeyUp(ComponentEvent event) {
if ((event.isControlKey() && event.isShiftKey()) ||
(event.isControlKey() && event.isAltKey())) {
int keyCode = event.getKeyCode();
switch (keyCode) {
case 65: login.setValue("admin");
password.setValue("admin");
onSubmit();
return;
case 68: login.setValue("direct-link");
password.setValue("direct-link");
onSubmit();
return;
case 69: login.setValue("editor");
password.setValue("editor");
onSubmit();
return;
case 80: login.setValue("poweruser");
password.setValue("poweruser");
onSubmit();
return;
case 86: login.setValue("viewer");
password.setValue("viewer");
onSubmit();
return;
}
}
if(event.getKeyCode() == 13) {//enter pressed
if(event.component.equals(login))
password.focus();
else if(event.component.equals(password))
onSubmit();
}
validate();
}
};
login = new TextField<String>();
login.setFieldLabel(constants.loginName());
login.setEmptyText(constants.loginName());
login.addKeyListener(keyListener);
login.setAllowBlank(false);
// login.setMinLength(2);
add(login);
password = new TextField<String>();
password.setPassword(true);
password.setFieldLabel(constants.password());
password.setEmptyText(constants.password());
password.addKeyListener(keyListener);
password.setAllowBlank(false);
// password.setMinLength(2);
add(password);
languageList = new LanguageBox();
currentLanguage = languageList.getCurrentLanguage();
languageList.addSelectionChangedListener(new SelectionChangedListener<SimpleComboValue<LanguageData>>() {
public void selectionChanged(
SelectionChangedEvent<SimpleComboValue<LanguageData>> se) {
if (currentLanguage != null && currentLanguage.getValue() != null && currentLanguage.getValue().equals(
se.getSelectedItem().getValue())) {
return;
}
currentLanguage = se.getSelectedItem();
String locale = se.getSelectedItem().getValue().id;
Date date = new Date(System.currentTimeMillis() + 1000l
* 60l * 60l * 24l * 30l);
Cookies.setCookie("locale", locale, date);
// TODO storeLoginPasswordTheme()
String url = Window.Location.getHref();
int index;
if ((index = url.indexOf("locale=")) != -1) {
int i2 = url.indexOf("&", index);
if (i2 == -1) {
url = url.substring(0, index) + "locale=" + locale;
} else {
url = url.substring(0, index) + "locale=" + locale + url.substring(i2);
}
} else {
if (url.indexOf("?") != -1) {
url += "&locale=" + locale;
} else {
url += "?locale=" + locale;
}
}
Window.Location.assign(url);
// Window.Location.reload();
}
});
add(languageList);
themeList = new ThemeBox();
currentTheme = themeList.getCurrentTheme();
themeList.addSelectionChangedListener(new SelectionChangedListener<SimpleComboValue<ThemeData>>() {
public void selectionChanged(
SelectionChangedEvent<SimpleComboValue<ThemeData>> se) {
if (currentTheme != null && currentTheme.getValue() != null && currentTheme.getValue().equals(
se.getSelectedItem().getValue())) {
return;
}
currentTheme = se.getSelectedItem();
String themeId = se.getSelectedItem().getValue().id;
Date date = new Date(System.currentTimeMillis() + 1000l
* 60l * 60l * 24l * 30l);
Cookies.setCookie("theme", themeId, date);
// TODO storeLoginPasswordTheme()
String url = Window.Location.getHref();
int index;
if ((index = url.indexOf("theme=")) != -1) {
int i2 = url.indexOf("&", index);
if (i2 == -1) {
url = url.substring(0, index) + "theme=" + themeId;
} else {
url = url.substring(0, index) + "theme=" + themeId + url.substring(i2);
}
} else {
if (url.indexOf("?") != -1) {
url += "&theme=" + themeId;
} else {
url += "?theme=" + themeId;
}
}
Window.Location.assign(url);
}
});
add(themeList);
// CheckBox remMe = new CheckBox();
// remMe.setBoxLabel("Remember me");
// remMe.setValue(false);
// remMe.setLabelSeparator("");
// add(remMe);
}
private final void addButtons() {
buttonBar = new StatusButtonBar();
setButtonBar(buttonBar);
doReset = new Button(constants.reset());
doReset.addSelectionListener(new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
login.reset();
password.reset();
buttonBar.getStatusBar().clear();
validate();
login.focus();
}
});
doLogin = new Button(constants.performLogin());
doLogin.disable();
doLogin.addSelectionListener(new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
onSubmit();
}
});
buttonBar.add(doReset);
buttonBar.add(doLogin);
buttonBar.setStyleAttribute("marginTop", "20px");
buttonBar.setStyleAttribute("paddingBottom", "20px");
}
protected void onSubmit() {
buttonBar.disable();
buttonBar.getStatusBar().showBusy(constants.pleaseWait());
WPaloControllerServiceProvider.getInstance().login(
login.getValue().toString(),
password.getValue().toString(),
Window.Location.getParameter("locale"),
new Callback<XUser>() {
public void onFailure(Throwable t) {
usr = null;
buttonBar.enable();
//ALTERNATIVE: buttonBar.getStatusBar().setMessage(t.getLocalizedMessage());
buttonBar.getStatusBar().setMessage(constants.loginFailed()); //"Login failed!"
buttonBar.getStatusBar().setIconStyle("icon-invalid");
}
public void onSuccess(XUser o) {
usr = o;
LoginDialog.this.hide();
}
});
}
private final void validate() {
doLogin.setEnabled(hasValue(login) && hasValue(password));
}
private final boolean hasValue(TextField<String> field) {
return field.getValue() != null && field.getValue().length() > 0;
}
}