001: /*
002: * Stateful.java - 0.9.0 01/13/2001 - 17:13:37
003: *
004: * Copyright (C) 2000,2003 Matt Albrecht
005: * groboclown@users.sourceforge.net
006: * http://groboutils.sourceforge.net
007: *
008: * Permission is hereby granted, free of charge, to any person obtaining a
009: * copy of this software and associated documentation files (the "Software"),
010: * to deal in the Software without restriction, including without limitation
011: * the rights to use, copy, modify, merge, publish, distribute, sublicense,
012: * and/or sell copies of the Software, and to permit persons to whom the
013: * Software is furnished to do so, subject to the following conditions:
014: *
015: * The above copyright notice and this permission notice shall be included in
016: * all copies or substantial portions of the Software.
017: *
018: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
019: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
020: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
021: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
022: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
023: * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
024: * DEALINGS IN THE SOFTWARE.
025: */
026:
027: package net.groboclown.util.states.v1;
028:
029: /**
030: *
031: *
032: * @author Matt Albrecht
033: * @version 0.9.0 Alpha
034: */
035: public class Stateful {
036: //---------------------------------------------------------------------
037: // Public Static Fields
038:
039: //---------------------------------------------------------------------
040: // Protected Static Fields
041:
042: //---------------------------------------------------------------------
043: // Private Static Fields
044:
045: //---------------------------------------------------------------------
046: // Public Fields
047:
048: //---------------------------------------------------------------------
049: // Protected Fields
050:
051: //---------------------------------------------------------------------
052: // Private Fields
053:
054: private IStatefulListener listener;
055: private StateCategory category;
056: private Object[] actions = null;
057: private int currentState = -1;
058: private Object currentAction = null;
059:
060: //---------------------------------------------------------------------
061: // Constructors
062:
063: /**
064: * Default Constructor
065: */
066: public Stateful(IStatefulListener listener) {
067: if (listener == null) {
068: throw new IllegalArgumentException("no null args");
069: }
070: this .listener = listener;
071: }
072:
073: //---------------------------------------------------------------------
074: // Public Methods
075:
076: /**
077: *
078: */
079: public void addStateAction(State s, Object action) {
080: if (this .category == null) {
081: throw new IllegalStateException(
082: "Stateful never intialized - you must add it to a set "
083: + "before adding State Actions");
084: }
085: if (!this .category.isOfCategory(s)) {
086: throw new IllegalStateException(
087: "State object not of state category");
088: }
089: this .actions[s.getIndex()] = action;
090:
091: if (s.getIndex() == this .currentState
092: && action != this .currentAction) {
093: // The current state's action has changed
094: this .listener.setAction(action);
095: this .currentAction = action;
096: }
097: }
098:
099: /**
100: *
101: */
102: public void removeStateAction(State s) {
103: addStateAction(s, null);
104: }
105:
106: /**
107: * Only calls the listener's setAction if the new state is different
108: * than the current state, and the new state's action object is
109: * different than the current action object.
110: */
111: public void setState(State s) {
112: if (this .category == null) {
113: throw new IllegalStateException(
114: "Stateful never intialized - you must add it to a set "
115: + "before adding State Actions");
116: }
117: if (!this .category.isOfCategory(s)) {
118: throw new IllegalStateException(
119: "State object not of state category");
120: }
121:
122: //
123: // perform a series of checks to see if we need to
124: // set this state.
125: //
126:
127: // check if the state is identical to the current state
128: int si = s.getIndex();
129: if (si == this .currentState) {
130: // do nothing - we're on the same state as we were
131: return;
132: }
133: this .currentState = si;
134:
135: // now check if the new state's action object is identical
136: // to the current action object.
137: Object a = actions[si];
138: if (this .currentAction == a) {
139: // do nothing - the state changed, but the action didn't
140: return;
141: }
142: this .currentAction = a;
143:
144: // we can set the state
145: this .listener.setAction(actions[s.getIndex()]);
146: }
147:
148: //---------------------------------------------------------------------
149: // Protected Methods
150:
151: protected void initialize(StateCategory s) {
152: if (this .actions != null) {
153: throw new IllegalStateException(
154: "Stateful already initialized");
155: }
156: this .actions = new Object[s.getMaximumStateCount()];
157: this .category = s;
158: }
159:
160: //---------------------------------------------------------------------
161: // Private Methods
162:
163: }
|