77adfc15ec
on multiple ports, falling back from one to the next as appropriate. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4158 542714f4-19e9-0310-aa3c-eee0fc999fb1
235 lines
7.5 KiB
Java
235 lines
7.5 KiB
Java
//
|
|
// $Id$
|
|
//
|
|
// Narya library - tools for developing networked games
|
|
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
|
|
// http://www.threerings.net/code/narya/
|
|
//
|
|
// This library 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 library 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 library; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
package com.threerings.micasa.client;
|
|
|
|
import java.awt.Dimension;
|
|
import java.awt.Font;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
|
|
import javax.swing.JButton;
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JPasswordField;
|
|
import javax.swing.JScrollPane;
|
|
import javax.swing.JTextArea;
|
|
import javax.swing.JTextField;
|
|
|
|
import com.samskivert.swing.GroupLayout;
|
|
import com.samskivert.swing.HGroupLayout;
|
|
import com.samskivert.swing.VGroupLayout;
|
|
|
|
import com.threerings.util.MessageBundle;
|
|
import com.threerings.util.Name;
|
|
|
|
import com.threerings.presents.client.Client;
|
|
import com.threerings.presents.client.ClientObserver;
|
|
import com.threerings.presents.client.LogonException;
|
|
import com.threerings.presents.net.Credentials;
|
|
import com.threerings.presents.net.UsernamePasswordCreds;
|
|
|
|
import com.threerings.micasa.util.MiCasaContext;
|
|
|
|
public class LogonPanel extends JPanel
|
|
implements ActionListener, ClientObserver
|
|
{
|
|
public LogonPanel (MiCasaContext ctx)
|
|
{
|
|
// keep these around for later
|
|
_ctx = ctx;
|
|
_msgs = _ctx.getMessageManager().getBundle("micasa");
|
|
|
|
setLayout(new VGroupLayout());
|
|
|
|
// stick the logon components into a panel that will stretch them
|
|
// to a sensible width
|
|
JPanel box = new JPanel(
|
|
new VGroupLayout(VGroupLayout.NONE, VGroupLayout.STRETCH,
|
|
5, VGroupLayout.CENTER)) {
|
|
public Dimension getPreferredSize () {
|
|
Dimension psize = super.getPreferredSize();
|
|
psize.width = Math.max(psize.width, 300);
|
|
return psize;
|
|
}
|
|
};
|
|
add(box);
|
|
|
|
// try obtaining our title text from a system property
|
|
String tstr = null;
|
|
try {
|
|
tstr = System.getProperty("logon.title");
|
|
} catch (Throwable t) {
|
|
}
|
|
if (tstr == null) {
|
|
tstr = "Mi Casa!";
|
|
}
|
|
|
|
// create a big fat label
|
|
JLabel title = new JLabel(tstr, JLabel.CENTER);
|
|
title.setFont(new Font("Helvetica", Font.BOLD, 24));
|
|
box.add(title);
|
|
|
|
// create the username bar
|
|
JPanel bar = new JPanel(new HGroupLayout(GroupLayout.STRETCH));
|
|
bar.add(new JLabel(_msgs.get("m.username")), GroupLayout.FIXED);
|
|
_username = new JTextField();
|
|
_username.setActionCommand("skipToPassword");
|
|
_username.addActionListener(this);
|
|
bar.add(_username);
|
|
box.add(bar);
|
|
|
|
// create the password bar
|
|
bar = new JPanel(new HGroupLayout(GroupLayout.STRETCH));
|
|
bar.add(new JLabel(_msgs.get("m.password")), GroupLayout.FIXED);
|
|
_password = new JPasswordField();
|
|
_password.setActionCommand("logon");
|
|
_password.addActionListener(this);
|
|
bar.add(_password);
|
|
box.add(bar);
|
|
|
|
// create the logon button bar
|
|
HGroupLayout gl = new HGroupLayout(GroupLayout.NONE);
|
|
gl.setJustification(GroupLayout.RIGHT);
|
|
bar = new JPanel(gl);
|
|
_logon = new JButton(_msgs.get("m.logon"));
|
|
_logon.setActionCommand("logon");
|
|
_logon.addActionListener(this);
|
|
bar.add(_logon);
|
|
box.add(bar);
|
|
|
|
box.add(new JLabel(_msgs.get("m.status")));
|
|
_status = new JTextArea() {
|
|
public Dimension getPreferredScrollableViewportSize ()
|
|
{
|
|
return new Dimension(10, 100);
|
|
}
|
|
};
|
|
_status.setEditable(false);
|
|
JScrollPane scroller = new JScrollPane(_status);
|
|
box.add(scroller);
|
|
|
|
// we'll want to listen for logon failure
|
|
_ctx.getClient().addClientObserver(this);
|
|
|
|
// start with focus in the username field
|
|
_username.requestFocusInWindow();
|
|
}
|
|
|
|
public void actionPerformed (ActionEvent e)
|
|
{
|
|
String cmd = e.getActionCommand();
|
|
if (cmd.equals("skipToPassword")) {
|
|
_password.requestFocusInWindow();
|
|
|
|
} else if (cmd.equals("logon")) {
|
|
logon();
|
|
|
|
} else {
|
|
System.out.println("Unknown action event: " + cmd);
|
|
}
|
|
}
|
|
|
|
// documentation inherited from interface
|
|
public void clientDidLogon (Client client)
|
|
{
|
|
_status.append(_msgs.get("m.logon_success") + "\n");
|
|
}
|
|
|
|
// documentation inherited from interface
|
|
public void clientDidLogoff (Client client)
|
|
{
|
|
_status.append(_msgs.get("m.logged_off") + "\n");
|
|
setLogonEnabled(true);
|
|
}
|
|
|
|
// documentation inherited from interface
|
|
public void clientFailedToLogon (Client client, Exception cause)
|
|
{
|
|
String msg;
|
|
if (cause instanceof LogonException) {
|
|
msg = MessageBundle.compose("m.logon_failed", cause.getMessage());
|
|
} else {
|
|
msg = MessageBundle.tcompose("m.logon_failed", cause.getMessage());
|
|
}
|
|
_status.append(_msgs.xlate(msg) + "\n");
|
|
setLogonEnabled(true);
|
|
}
|
|
|
|
// documentation inherited from interface
|
|
public void clientObjectDidChange (Client client)
|
|
{
|
|
// nothing we can do here...
|
|
}
|
|
|
|
// documentation inherited from interface
|
|
public void clientConnectionFailed (Client client, Exception cause)
|
|
{
|
|
String msg = MessageBundle.tcompose("m.connection_failed",
|
|
cause.getMessage());
|
|
_status.append(_msgs.xlate(msg) + "\n");
|
|
setLogonEnabled(true);
|
|
}
|
|
|
|
// documentation inherited from interface
|
|
public boolean clientWillLogoff (Client client)
|
|
{
|
|
// no vetoing here
|
|
return true;
|
|
}
|
|
|
|
protected void logon ()
|
|
{
|
|
// disable further logon attempts until we hear back
|
|
setLogonEnabled(false);
|
|
|
|
Name username = new Name(_username.getText().trim());
|
|
String password = new String(_password.getPassword()).trim();
|
|
|
|
String server = _ctx.getClient().getHostname();
|
|
int port = _ctx.getClient().getPorts()[0];
|
|
String msg = MessageBundle.tcompose("m.logging_on",
|
|
server, String.valueOf(port));
|
|
_status.append(_msgs.xlate(msg) + "\n");
|
|
|
|
// configure the client with some credentials and logon
|
|
Credentials creds = new UsernamePasswordCreds(username, password);
|
|
Client client = _ctx.getClient();
|
|
client.setCredentials(creds);
|
|
client.logon();
|
|
}
|
|
|
|
protected void setLogonEnabled (boolean enabled)
|
|
{
|
|
_username.setEnabled(enabled);
|
|
_password.setEnabled(enabled);
|
|
_logon.setEnabled(enabled);
|
|
}
|
|
|
|
protected MiCasaContext _ctx;
|
|
protected MessageBundle _msgs;
|
|
|
|
protected JTextField _username;
|
|
protected JPasswordField _password;
|
|
protected JButton _logon;
|
|
protected JTextArea _status;
|
|
}
|