package com.rapidftr.screens;
import net.rim.device.api.system.Characters;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.PasswordEditField;
import net.rim.device.api.ui.component.SeparatorField;
import net.rim.device.api.ui.component.TextField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import com.rapidftr.controllers.LoginController;
import com.rapidftr.controls.Button;
import com.rapidftr.screens.internal.CustomScreen;
import com.rapidftr.services.ScreenCallBack;
import com.rapidftr.utilities.HttpSettings;
public class LoginScreen extends CustomScreen implements ScreenCallBack {
private static final int MAX_SIZE = 200;
private final PasswordEditField passwordField = new PasswordEditField(
"Password:", "", MAX_SIZE, USE_ALL_WIDTH);
private final BasicEditField usernameField = basicField("Username:");
private final BasicEditField urlField = basicField("Url:");
private final HttpSettings httpSettings;
private Manager progressMsgFieldmanager;
private LabelField progressMsg;
private Button loginButton;
private Manager buttonManager;
private Button cancelButton;
public LoginScreen(HttpSettings httpSettings) {
super();
this.httpSettings = httpSettings;
layoutScreen();
usernameField.setFocus();
}
private void layoutScreen() {
usernameField.setPadding(PADDING);
add(usernameField);
passwordField.setPadding(PADDING);
add(passwordField);
add(new SeparatorField());
addButtons();
createProgressMsg();
}
private void createProgressMsg() {
progressMsg = new LabelField();
progressMsgFieldmanager = new HorizontalFieldManager(FIELD_HCENTER);
progressMsgFieldmanager.setPadding(PADDING);
progressMsg.setPadding(PADDING);
progressMsgFieldmanager.add(progressMsg);
add(progressMsgFieldmanager);
}
private BasicEditField basicField(String field) {
return new BasicEditField(field, "", MAX_SIZE, USE_ALL_WIDTH
| TextField.NO_NEWLINE);
}
private void addField(BasicEditField field, String defaultValue) {
if (field.getManager() != null) {
return;
}
field.setPadding(PADDING);
field.setText(defaultValue);
insert(field, getFieldCount() - 2);
}
private void addButtons() {
loginButton = new Button("Login");
loginButton.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
onLoginButtonClicked();
}
});
cancelButton = new Button("Cancel");
cancelButton.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
onCancelButtonClicked();
}
});
buttonManager = new HorizontalFieldManager(FIELD_HCENTER);
buttonManager.setPadding(PADDING);
add(buttonManager);
}
protected void makeMenu(Menu menu, int instance) {
menu.add(new MenuItem("Change Url", 1, 1) {
public void run() {
addField(urlField, httpSettings.getHost());
}
});
super.makeMenu(menu, instance);
}
public boolean isDirty() {
return false;
}
private void clearProgressMessage() {
progressMsg.setText("");
}
private void onLoginButtonClicked() {
httpSettings.setHost(urlField.getText());
usernameField.setFocus();
getController().login(usernameField.getText(),
passwordField.getText());
showCancelButton();
}
private LoginController getController() {
return ((LoginController) controller);
}
private void onCancelButtonClicked() {
showLoginButton();
}
private void showCancelButton() {
buttonManager.deleteAll();
buttonManager.add(cancelButton);
}
public void setUp() {
showLoginButton();
clearProgressMessage();
}
private void showLoginButton() {
buttonManager.deleteAll();
buttonManager.add(loginButton);
}
public void onAuthenticationFailure() {
onProcessFail("Authentication Failure ");
}
public void onConnectionProblem() {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
setProgressMessage("Connection Problem ");
showLoginButton();
}
});
}
public void updateProgress(int progress) {
}
public void onProcessSuccess() {
resetCredentials(true);
getController().synchronizeForms();
}
public void onProcessFail(final String message) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
if (!(message == null || "".equals(message.trim())))
setProgressMessage(message);
showLoginButton();
resetCredentials(false);
passwordField.setFocus();
}
});
}
public void setProgressMessage(String message) {
progressMsg.setText(message);
}
public boolean keyDown(int keycode, int time) {
if (keycode == Characters.ESCAPE) {
controller.homeScreen();
}
return super.keyDown(keycode, time);
}
public boolean keyChar(char code, int time, int arg2) {
if (code == Characters.ESCAPE) {
controller.homeScreen();
return true;
} else {
return super.keyChar(code, time, arg2);
}
}
public void resetCredentials(boolean resetUser) {
if(resetUser)
usernameField.setText("");
passwordField.setText("");
}
}