diff --git a/src/java/com/threerings/crowd/client/PlaceView.java b/src/java/com/threerings/crowd/client/PlaceView.java new file mode 100644 index 000000000..471527d14 --- /dev/null +++ b/src/java/com/threerings/crowd/client/PlaceView.java @@ -0,0 +1,58 @@ +// +// $Id: PlaceView.java,v 1.1 2001/10/04 20:02:49 mdb Exp $ + +package com.threerings.cocktail.party.util; + +import com.threerings.cocktail.party.data.PlaceObject; + +/** + * This interface provides a convenient means for decoupling user + * interface components that interact with a place object and that need to + * keep themselves up to date when the client moves from place to place. + * + *

In general, such components need to know when the client is about + * to enter a place so that they can subscribe if necessary or at least + * extract information about the place. They also need to know when a + * client has left a place so that they can unsubscribe and clean up after + * themselves. This is the information that the place view interface makes + * available to them in a decoupled way. + * + *

The part of the client implementation that is responsible for the + * main user interface can act as a location observer, and it can make use + * of {@link PlaceViewUtil} to dispatch notification of place changes to + * every PlaceView implementing user interface element in the + * user interface hierarchy with calls to {@link + * PlaceViewUtil#dispatchWillEnterPlace} and {@link + * PlaceViewUtil#dispatchDidLeavePlace}. These functions traverse the UI + * hierarchy (starting with the element provided which would generally be + * the top-level UI element, and dispatch calls to {@link #willEnterPlace} + * and {@link #willLeavePlace} respectively on any UI element they find + * that implements PlaceView. + * + *

By doing this, the client code can simply create place-sensitive + * user interface elements and stick them in the user interface and + * essentially forget about them, knowing that they will all be notified + * of place entering and exiting by virtue of the single dispatching + * calls. It is useful to note that place-sensitive user interface + * elements will also generally need a reference to the {@link + * PartyContext} derivative in use by the client, but those are best + * supplied at construct time. + */ +public interface PlaceView +{ + /** + * Called when the client has entered a place and is about to display + * the user interface for that place. + * + * @param plobj the place object that was just entered. + */ + public void willEnterPlace (PlaceObject plobj); + + /** + * Called after the client has left a place and needs to clean up + * after the user interface that was displaying that place. + * + * @param plobj the place object that was just left. + */ + public void didLeavePlace (PlaceObject plobj); +} diff --git a/src/java/com/threerings/crowd/client/PlaceViewUtil.java b/src/java/com/threerings/crowd/client/PlaceViewUtil.java new file mode 100644 index 000000000..2f87f0b82 --- /dev/null +++ b/src/java/com/threerings/crowd/client/PlaceViewUtil.java @@ -0,0 +1,85 @@ +// +// $Id: PlaceViewUtil.java,v 1.1 2001/10/04 20:02:49 mdb Exp $ + +package com.threerings.cocktail.party.util; + +import java.awt.Component; +import java.awt.Container; + +import com.threerings.cocktail.party.Log; +import com.threerings.cocktail.party.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 + * root 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 void dispatchWillEnterPlace ( + Component root, PlaceObject plobj) + { + // dispatch the call on this component if it implements PlaceView + if (root instanceof PlaceView) { + try { + ((PlaceView)root).willEnterPlace(plobj); + } catch (Exception e) { + Log.warning("Component choked on willEnterPlace() " + + "[component=" + root + ", plobj=" + plobj + "]."); + Log.logStackTrace(e); + } + } + + // now traverse all of this component's children + if (root instanceof Container) { + Container cont = (Container)root; + int ccount = cont.getComponentCount(); + for (int i = 0; i < ccount; i++) { + dispatchWillEnterPlace(cont.getComponent(i), plobj); + } + } + } + + /** + * Dispatches a call to {@link PlaceView#didLeavePlace} to all UI + * elements in the hierarchy rooted at the component provided via the + * root 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 void dispatchDidLeavePlace ( + Component root, PlaceObject plobj) + { + // dispatch the call on this component if it implements PlaceView + if (root instanceof PlaceView) { + try { + ((PlaceView)root).didLeavePlace(plobj); + } catch (Exception e) { + Log.warning("Component choked on didLeavePlace() " + + "[component=" + root + ", plobj=" + plobj + "]."); + Log.logStackTrace(e); + } + } + + // now traverse all of this component's children + if (root instanceof Container) { + Container cont = (Container)root; + int ccount = cont.getComponentCount(); + for (int i = 0; i < ccount; i++) { + dispatchDidLeavePlace(cont.getComponent(i), plobj); + } + } + } +}