3d6aa4cd15
git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@48 ed5b42cb-e716-0410-a449-f6a68f950b19
202 lines
5.7 KiB
Java
202 lines
5.7 KiB
Java
//
|
|
// $Id$
|
|
//
|
|
// Narya library - tools for developing networked games
|
|
// Copyright (C) 2002-2005 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.jme.chat;
|
|
|
|
import java.util.StringTokenizer;
|
|
|
|
import com.jme.renderer.ColorRGBA;
|
|
|
|
import com.jmex.bui.BButton;
|
|
import com.jmex.bui.BContainer;
|
|
import com.jmex.bui.BTextArea;
|
|
import com.jmex.bui.BTextField;
|
|
import com.jmex.bui.event.ActionEvent;
|
|
import com.jmex.bui.event.ActionListener;
|
|
import com.jmex.bui.layout.BorderLayout;
|
|
import com.jmex.bui.layout.GroupLayout;
|
|
|
|
import com.threerings.util.Name;
|
|
|
|
import com.threerings.crowd.chat.client.ChatDirector;
|
|
import com.threerings.crowd.chat.client.ChatDisplay;
|
|
import com.threerings.crowd.chat.client.SpeakService;
|
|
import com.threerings.crowd.chat.data.ChatCodes;
|
|
import com.threerings.crowd.chat.data.ChatMessage;
|
|
import com.threerings.crowd.chat.data.SystemMessage;
|
|
import com.threerings.crowd.chat.data.UserMessage;
|
|
import com.threerings.crowd.data.PlaceObject;
|
|
|
|
import com.threerings.jme.JmeContext;
|
|
import com.threerings.jme.Log;
|
|
|
|
/**
|
|
* Displays chat messages and allows for their input.
|
|
*/
|
|
public class ChatView extends BContainer
|
|
implements ChatDisplay
|
|
{
|
|
public ChatView (JmeContext ctx, ChatDirector chatdtr)
|
|
{
|
|
_chatdtr = chatdtr;
|
|
setLayoutManager(new BorderLayout(2, 2));
|
|
add(_text = new BTextArea(), BorderLayout.CENTER);
|
|
_incont = new BContainer(GroupLayout.makeHStretch());
|
|
add(_incont, BorderLayout.SOUTH);
|
|
_incont.add(_input = new BTextField());
|
|
_input.addListener(_inlist);
|
|
}
|
|
|
|
public void willEnterPlace (PlaceObject plobj)
|
|
{
|
|
setSpeakService(plobj.speakService, null);
|
|
}
|
|
|
|
public void didLeavePlace (PlaceObject plobj)
|
|
{
|
|
clearSpeakService();
|
|
}
|
|
|
|
public void setSpeakService (SpeakService spsvc, String localType)
|
|
{
|
|
if (spsvc != null) {
|
|
_spsvc = spsvc;
|
|
_localType = localType;
|
|
_chatdtr.addChatDisplay(this);
|
|
}
|
|
}
|
|
|
|
public void clearSpeakService ()
|
|
{
|
|
if (_spsvc != null) {
|
|
_chatdtr.removeChatDisplay(this);
|
|
_spsvc = null;
|
|
_localType = null;
|
|
}
|
|
}
|
|
|
|
public void setChatButton (BButton button)
|
|
{
|
|
_incont.add(button, GroupLayout.FIXED);
|
|
button.addListener(_inlist);
|
|
}
|
|
|
|
/**
|
|
* Instructs our chat input field to request focus.
|
|
*/
|
|
public void requestFocus ()
|
|
{
|
|
_input.requestFocus();
|
|
}
|
|
|
|
// documentation inherited from interface ChatDisplay
|
|
public void clear ()
|
|
{
|
|
}
|
|
|
|
// documentation inherited from interface ChatDisplay
|
|
public boolean displayMessage (ChatMessage msg, boolean alreadyDisplayed)
|
|
{
|
|
// we may be restricted in the chat types we handle
|
|
if (!handlesType(msg.localtype)) {
|
|
return false;
|
|
}
|
|
|
|
if (msg instanceof UserMessage) {
|
|
UserMessage umsg = (UserMessage) msg;
|
|
if (umsg.localtype == ChatCodes.USER_CHAT_TYPE) {
|
|
append("[" + umsg.speaker + " whispers] ", ColorRGBA.green);
|
|
append(umsg.message + "\n");
|
|
} else {
|
|
append("<" + umsg.speaker + "> ", ColorRGBA.blue);
|
|
append(umsg.message + "\n");
|
|
}
|
|
return true;
|
|
|
|
} else if (msg instanceof SystemMessage) {
|
|
append(msg.message + "\n", ColorRGBA.red);
|
|
return true;
|
|
|
|
} else {
|
|
Log.warning("Received unknown message type: " + msg + ".");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// documentation inherited
|
|
public void setEnabled (boolean enabled)
|
|
{
|
|
_input.setEnabled(enabled);
|
|
}
|
|
|
|
protected void displayError (String message)
|
|
{
|
|
append(message + "\n", ColorRGBA.red);
|
|
}
|
|
|
|
protected void append (String text, ColorRGBA color)
|
|
{
|
|
_text.appendText(text, color);
|
|
}
|
|
|
|
protected void append (String text)
|
|
{
|
|
_text.appendText(text);
|
|
}
|
|
|
|
protected boolean handlesType (String localType)
|
|
{
|
|
return _localType == null || _localType.equals(localType);
|
|
}
|
|
|
|
protected boolean handleInput (String text)
|
|
{
|
|
if (text.length() == 0) {
|
|
// no empty banter
|
|
return false;
|
|
}
|
|
String msg = _chatdtr.requestChat(_spsvc, text, true);
|
|
if (msg.equals(ChatCodes.SUCCESS)) {
|
|
return true;
|
|
} else {
|
|
_chatdtr.displayFeedback(null, msg);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/** Used to trigger sending chat (on return key or button press). */
|
|
protected ActionListener _inlist = new ActionListener() {
|
|
public void actionPerformed (ActionEvent event) {
|
|
if (handleInput(_input.getText())) {
|
|
_input.setText("");
|
|
}
|
|
}
|
|
};
|
|
|
|
protected ChatDirector _chatdtr;
|
|
protected SpeakService _spsvc;
|
|
protected String _localType;
|
|
|
|
protected BTextArea _text;
|
|
protected BContainer _incont;
|
|
protected BTextField _input;
|
|
}
|