Some stuff.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3962 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -0,0 +1,70 @@
|
|||||||
|
//
|
||||||
|
// $Id: LocationDecoder.java 3914 2006-03-06 21:51:59Z mdb $
|
||||||
|
//
|
||||||
|
// Narya library - tools for developing networked games
|
||||||
|
// Copyright (C) 2002-2006 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.crowd.client {
|
||||||
|
|
||||||
|
import com.threerings.crowd.client.LocationReceiver;
|
||||||
|
import com.threerings.presents.client.InvocationDecoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatches calls to a {@link LocationReceiver} instance.
|
||||||
|
*/
|
||||||
|
public class LocationDecoder extends InvocationDecoder
|
||||||
|
{
|
||||||
|
/** The generated hash code used to identify this receiver class. */
|
||||||
|
public static const RECEIVER_CODE :String = "58f2830e027f4f3377e100ef12332497";
|
||||||
|
|
||||||
|
/** The method id used to dispatch {@link LocationReceiver#forcedMove}
|
||||||
|
* notifications. */
|
||||||
|
public static const FORCED_MOVE :int = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a decoder that may be registered to dispatch invocation
|
||||||
|
* service notifications to the specified receiver.
|
||||||
|
*/
|
||||||
|
public function LocationDecoder (receiver :LocationReceiver)
|
||||||
|
{
|
||||||
|
this.receiver = receiver;
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public override function getReceiverCode () :String
|
||||||
|
{
|
||||||
|
return RECEIVER_CODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public override function dispatchNotification (
|
||||||
|
methodId :int, args :Array) :void
|
||||||
|
{
|
||||||
|
switch (methodId) {
|
||||||
|
case FORCED_MOVE:
|
||||||
|
(receiver as LocationReceiver).forcedMove(
|
||||||
|
(args[0] as int)
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
super.dispatchNotification(methodId, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,267 @@
|
|||||||
|
//
|
||||||
|
// $Id: PlaceController.java 3440 2005-03-30 01:09:30Z mdb $
|
||||||
|
//
|
||||||
|
// 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.crowd.client {
|
||||||
|
|
||||||
|
import com.threerings.crowd.data.PlaceConfig;
|
||||||
|
import com.threerings.crowd.data.PlaceObject;
|
||||||
|
import com.threerings.crowd.util.CrowdContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controls the user interface that is used to display a place. When the
|
||||||
|
* client moves to a new place, the appropriate place controller is
|
||||||
|
* constructed and requested to create and display the appopriate user
|
||||||
|
* interface for that place.
|
||||||
|
*/
|
||||||
|
public /*abstract*/ class PlaceController /*extends Controller*/
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Initializes this place controller with a reference to the context
|
||||||
|
* that they can use to access client services and to the
|
||||||
|
* configuration record for this place. The controller should create
|
||||||
|
* as much of its user interface that it can without having access to
|
||||||
|
* the place object because this will be invoked in parallel with the
|
||||||
|
* fetching of the place object. When the place object is obtained,
|
||||||
|
* the controller will be notified and it can then finish the user
|
||||||
|
* interface configuration and put the user interface into operation.
|
||||||
|
*
|
||||||
|
* @param ctx the client context.
|
||||||
|
* @param config the place configuration for this place.
|
||||||
|
*/
|
||||||
|
public function init (ctx :CrowdContext, config :PlaceConfig) :void
|
||||||
|
{
|
||||||
|
// keep these around
|
||||||
|
_ctx = ctx;
|
||||||
|
_config = config;
|
||||||
|
|
||||||
|
// create our user interface
|
||||||
|
_view = createPlaceView(_ctx);
|
||||||
|
|
||||||
|
// // initialize our delegates
|
||||||
|
// applyToDelegates(new DelegateOp() {
|
||||||
|
// public void apply (PlaceControllerDelegate delegate) {
|
||||||
|
// delegate.init(_ctx, _config);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
|
// let the derived classes do any initialization stuff
|
||||||
|
didInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derived classes can override this and perform any
|
||||||
|
* post-initialization processing they might need. They should of
|
||||||
|
* course be sure to call <code>super.didInit()</code>.
|
||||||
|
*/
|
||||||
|
protected function didInit () :void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a reference to the place view associated with this
|
||||||
|
* controller. This is only valid after a call has been made to {@link
|
||||||
|
* #init}.
|
||||||
|
*/
|
||||||
|
public function getPlaceView () :PlaceView
|
||||||
|
{
|
||||||
|
return _view;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link PlaceConfig} associated with this place.
|
||||||
|
*/
|
||||||
|
public function getPlaceConfig () :PlaceConfig
|
||||||
|
{
|
||||||
|
return _config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the user interface that will be used to display this place.
|
||||||
|
* The view instance returned will later be configured with the place
|
||||||
|
* object, once it becomes available.
|
||||||
|
*
|
||||||
|
* @param ctx a reference to the {@link CrowdContext} associated with
|
||||||
|
* this controller.
|
||||||
|
*/
|
||||||
|
protected function createPlaceView (ctx :CrowdContext) :PlaceView
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is called by the location director once the place object has
|
||||||
|
* been fetched. The place controller will dispatch the place object
|
||||||
|
* to the user interface hierarchy via {@link
|
||||||
|
* PlaceViewUtil#dispatchWillEnterPlace}. Derived classes can override
|
||||||
|
* this and perform any other starting up that they need to do
|
||||||
|
*/
|
||||||
|
public function willEnterPlace (plobj :PlaceObject) :void
|
||||||
|
{
|
||||||
|
// keep a handle on our place object
|
||||||
|
_plobj = plobj;
|
||||||
|
|
||||||
|
if (_view != null ) {
|
||||||
|
// let the UI hierarchy know that we've got our place
|
||||||
|
PlaceViewUtil.dispatchWillEnterPlace(_view, plobj);
|
||||||
|
// and display the user interface
|
||||||
|
_ctx.setPlaceView(_view);
|
||||||
|
}
|
||||||
|
|
||||||
|
// // let our delegates know what's up
|
||||||
|
// applyToDelegates(new DelegateOp() {
|
||||||
|
// public void apply (PlaceControllerDelegate delegate) {
|
||||||
|
// delegate.willEnterPlace(plobj);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called before a request is submitted to the server to leave the
|
||||||
|
* current place. As such, this method may be called multiple times
|
||||||
|
* before {@link #didLeavePlace} is finally called. The request to
|
||||||
|
* leave may be rejected, but if a place controller needs to flush any
|
||||||
|
* information to the place manager before it leaves, it should so do
|
||||||
|
* here. This is the only place in which the controller is guaranteed
|
||||||
|
* to be able to communicate to the place manager, as by the time
|
||||||
|
* {@link #didLeavePlace} is called, the place manager may have
|
||||||
|
* already been destroyed.
|
||||||
|
*/
|
||||||
|
public function mayLeavePlace (plobj :PlaceObject) :void
|
||||||
|
{
|
||||||
|
// // let our delegates know what's up
|
||||||
|
// applyToDelegates(new DelegateOp() {
|
||||||
|
// public void apply (PlaceControllerDelegate delegate) {
|
||||||
|
// delegate.mayLeavePlace(plobj);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is called by the location director when we are leaving this
|
||||||
|
* place and need to clean up after ourselves and shutdown. Derived
|
||||||
|
* classes should override this method (being sure to call
|
||||||
|
* <code>super.didLeavePlace</code>) and perform any necessary
|
||||||
|
* cleanup.
|
||||||
|
*/
|
||||||
|
public function didLeavePlace (plobj :PlaceObject) :void
|
||||||
|
{
|
||||||
|
// // let our delegates know what's up
|
||||||
|
// applyToDelegates(new DelegateOp() {
|
||||||
|
// public void apply (PlaceControllerDelegate delegate) {
|
||||||
|
// delegate.didLeavePlace(plobj);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
|
// let the UI hierarchy know that we're outta here
|
||||||
|
if (_view != null ) {
|
||||||
|
PlaceViewUtil.dispatchDidLeavePlace(_view, plobj);
|
||||||
|
_ctx.clearPlaceView(_view);
|
||||||
|
_view = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_plobj = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles basic place controller action events. Derived classes
|
||||||
|
* should be sure to call <code>super.handleAction</code> for events
|
||||||
|
* they don't specifically handle.
|
||||||
|
*/
|
||||||
|
// public boolean handleAction (final ActionEvent action)
|
||||||
|
// {
|
||||||
|
// final boolean[] handled = new boolean[1];
|
||||||
|
//
|
||||||
|
// // let our delegates have a crack at the action
|
||||||
|
// applyToDelegates(new DelegateOp() {
|
||||||
|
// public void apply (PlaceControllerDelegate delegate) {
|
||||||
|
// // we take advantage of short-circuiting here
|
||||||
|
// handled[0] = handled[0] || delegate.handleAction(action);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// // if they didn't handly it, pass it off to the super class
|
||||||
|
// return handled[0] ? true : super.handleAction(action);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the supplied delegate to the list for this controller.
|
||||||
|
*/
|
||||||
|
// protected void addDelegate (PlaceControllerDelegate delegate)
|
||||||
|
// {
|
||||||
|
// if (_delegates == null) {
|
||||||
|
// _delegates = new ArrayList();
|
||||||
|
// }
|
||||||
|
// _delegates.add(delegate);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to call methods in delegates.
|
||||||
|
*/
|
||||||
|
// protected static interface DelegateOp
|
||||||
|
// {
|
||||||
|
// public void apply (PlaceControllerDelegate delegate);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the supplied operation to the registered delegates.
|
||||||
|
*/
|
||||||
|
// protected void applyToDelegates (DelegateOp op)
|
||||||
|
// {
|
||||||
|
// if (_delegates != null) {
|
||||||
|
// int dcount = _delegates.size();
|
||||||
|
// for (int i = 0; i < dcount; i++) {
|
||||||
|
// op.apply((PlaceControllerDelegate)_delegates.get(i));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the supplied operation to the registered delegates that
|
||||||
|
* derive from the specified class.
|
||||||
|
*/
|
||||||
|
// protected void applyToDelegates (Class dclass, DelegateOp op)
|
||||||
|
// {
|
||||||
|
// if (_delegates != null) {
|
||||||
|
// int dcount = _delegates.size();
|
||||||
|
// for (int i = 0; i < dcount; i++) {
|
||||||
|
// PlaceControllerDelegate delegate =
|
||||||
|
// (PlaceControllerDelegate)_delegates.get(i);
|
||||||
|
// if (dclass.isAssignableFrom(delegate.getClass())) {
|
||||||
|
// op.apply(delegate);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
/** A reference to the active client context. */
|
||||||
|
protected var _ctx :CrowdContext;
|
||||||
|
|
||||||
|
/** A reference to our place configuration. */
|
||||||
|
protected var _config :PlaceConfig;
|
||||||
|
|
||||||
|
/** A reference to the place object for which we're controlling a user
|
||||||
|
* interface. */
|
||||||
|
protected var _plobj :PlaceObject;
|
||||||
|
|
||||||
|
/** A reference to the root user interface component. */
|
||||||
|
protected var _view :PlaceView;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
//
|
||||||
|
// $Id: PlaceViewUtil.java 3098 2004-08-27 02:12:55Z mdb $
|
||||||
|
//
|
||||||
|
// 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.crowd.client {
|
||||||
|
|
||||||
|
import flash.display.DisplayObjectContainer;
|
||||||
|
|
||||||
|
import com.threerings.crowd.Log;
|
||||||
|
import com.threerings.crowd.data.PlaceObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a mechanism for dispatching notifications to all user
|
||||||
|
* interface elements in a hierarchy that implement the {@link PlaceView}
|
||||||
|
* interface. Look at the documentation for {@link PlaceView} for more
|
||||||
|
* explanation.
|
||||||
|
*/
|
||||||
|
public class PlaceViewUtil
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Dispatches a call to {@link PlaceView#willEnterPlace} to all UI
|
||||||
|
* elements in the hierarchy rooted at the component provided via the
|
||||||
|
* <code>root</code> parameter.
|
||||||
|
*
|
||||||
|
* @param root the component at which to start traversing the UI
|
||||||
|
* hierarchy.
|
||||||
|
* @param plobj the place object that is about to be entered.
|
||||||
|
*/
|
||||||
|
public static function dispatchWillEnterPlace (
|
||||||
|
root :Object, plobj :PlaceObject) :void
|
||||||
|
{
|
||||||
|
dispatch(root, plobj, "willEnterPlace");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatches a call to {@link PlaceView#didLeavePlace} to all UI
|
||||||
|
* elements in the hierarchy rooted at the component provided via the
|
||||||
|
* <code>root</code> parameter.
|
||||||
|
*
|
||||||
|
* @param root the component at which to start traversing the UI
|
||||||
|
* hierarchy.
|
||||||
|
* @param plobj the place object that is about to be entered.
|
||||||
|
*/
|
||||||
|
public static function dispatchDidLeavePlace (
|
||||||
|
root :Object, plobj :PlaceObject) :void
|
||||||
|
{
|
||||||
|
dispatch(root, plobj, "didLeavePlace");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function dispatch (
|
||||||
|
root :Object, plobj :PlaceObject, funct :String) :void
|
||||||
|
{
|
||||||
|
// dispatch the call on this component if it implements PlaceView
|
||||||
|
if (root is PlaceView) {
|
||||||
|
try {
|
||||||
|
(root as PlaceView)[funct](plobj);
|
||||||
|
} catch (e :Error) {
|
||||||
|
Log.warning("Component choked on " + funct + "() " +
|
||||||
|
"[component=" + root + ", plobj=" + plobj + "].");
|
||||||
|
Log.logStackTrace(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now traverse all of this component's children
|
||||||
|
if (root is DisplayObjectContainer) {
|
||||||
|
var cont :DisplayObjectContainer = (root as DisplayObjectContainer);
|
||||||
|
for (var ii :int = 0; ii < cont.numChildren; ii++) {
|
||||||
|
dispatch(cont.getChildAt(ii), plobj, funct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
package com.threerings.util {
|
package com.threerings.util {
|
||||||
|
|
||||||
import flash.util.describeType;
|
|
||||||
|
|
||||||
public class ClassUtil
|
public class ClassUtil
|
||||||
{
|
{
|
||||||
public static function getClassName (obj :Object) :String
|
public static function getClassName (obj :Object) :String
|
||||||
@@ -37,7 +35,7 @@ public class ClassUtil
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: there's currently no way to determine final from the class
|
// TODO: there's currently no way to determine final from the class
|
||||||
//var attrs :XMLList = describeType(type).elements("type");
|
//var attrs :XMLList = flash.util.describeType(type).elements("type");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user