/**
* Warlock, the open-source cross-platform game client
*
* Copyright 2008, Warlock LLC, and individual contributors as indicated
* by the @authors tag.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package cc.warlock.rcp.stormfront.ui.prefs;
import java.io.IOException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import cc.warlock.core.stormfront.network.SGEConnection;
import cc.warlock.core.stormfront.network.SGEConnectionListener;
import cc.warlock.rcp.stormfront.ui.util.LoginUtil;
import cc.warlock.rcp.ui.TextField;
public class AccountEditDialog extends Dialog {
protected static int TEST_ACCOUNT = 3;
protected String username, password;
protected TextField usernameField;
protected TextField passwordField;
protected Label statusLabel;
public AccountEditDialog (Shell parentShell)
{
super(parentShell);
}
public AccountEditDialog (Shell parentShell, String username, String password)
{
this(parentShell);
this.username = username;
this.password = password;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
if (username == null)
newShell.setText("Add a new account");
else
newShell.setText("Update an existing account");
}
@Override
protected Control createDialogArea(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(new GridLayout(2, false));
main.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Label banner = new Label(main, SWT.NONE);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.horizontalSpan = 2;
banner.setLayoutData(data);
if (username == null) {
banner.setText("Add a new account");
} else {
banner.setText("Update an existing account");
}
banner.setFont(JFaceResources.getHeaderFont());
new Label(main, SWT.NONE).setText("Username:");
usernameField = new TextField(main, SWT.BORDER);
usernameField.getTextControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
ModifyListener listener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (getButton(OK) != null)
{
getButton(OK).setEnabled(false);
statusLabel.setText("");
}
}
};
usernameField.getTextControl().addModifyListener(listener);
if (username != null)
usernameField.getTextControl().setText(username);
new Label(main, SWT.NONE).setText("Password:");
passwordField = new TextField(main, SWT.BORDER);
passwordField.getTextControl().setEchoChar('*');
passwordField.getTextControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
passwordField.getTextControl().addModifyListener(listener);
if (password != null)
passwordField.getTextControl().setText(password);
statusLabel = new Label(main, SWT.NONE);
data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.horizontalSpan = 2;
statusLabel.setLayoutData(data);
// statusLabel.setFont(JFaceResources.getBannerFont());
return main;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, TEST_ACCOUNT, "Test Account", true);
createButton(parent, OK, "OK", false);
createButton(parent, CANCEL, "Cancel", false);
if (username == null)
getButton(OK).setEnabled(false);
}
protected static class AccountVerifier extends SGEConnectionListener
{
protected String username, password;
protected boolean verified, verifying;
protected int errorCode;
public AccountVerifier (String username, String password)
{
this.username = username;
this.password = password;
verified = false;
verifying = true;
SGEConnection connection = new SGEConnection();
connection.setRetrieveGameInfo(false);
connection.addSGEConnectionListener(this);
connection.connect();
}
@Override
public void loginReady(SGEConnection connection) {
connection.login(username, password);
}
@Override
public void sgeError(SGEConnection connection, int errorCode) {
this.errorCode = errorCode;
verified = false;
verifying = false;
try {
connection.disconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void loginFinished(SGEConnection connection) {
verified = true;
verifying = false;
try {
connection.disconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public boolean verify ()
{
while (verifying)
{
try {
Thread.sleep((long) 300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return verified;
}
public int getErrorCode() {
return errorCode;
}
}
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == TEST_ACCOUNT)
{
AccountVerifier verifier = new AccountVerifier(usernameField.getText(), passwordField.getText());
boolean verified = verifier.verify();
if (!verified) {
statusLabel.setBackground(JFaceColors.getErrorBackground(getShell().getDisplay()));
statusLabel.setForeground(JFaceColors.getErrorText(getShell().getDisplay()));
String loginError = LoginUtil.getAuthenticationError(verifier.getErrorCode());
statusLabel.setText(loginError);
getButton(OK).setEnabled(false);
}
else {
statusLabel.setBackground(getShell().getBackground());
statusLabel.setForeground(new Color(getShell().getDisplay(), 0, 128, 0));
statusLabel.setText("Succesfully logged in to the server");
getButton(OK).setEnabled(true);
}
}
else
{
super.buttonPressed(buttonId);
}
}
public String getUsername ()
{
return usernameField.getText();
}
public String getPassword ()
{
return passwordField.getText();
}
}