01: package org.osbl.agent.gui;
02:
03: import org.osbl.agent.model.Action;
04:
05: /**
06: * Knows how to return its corresponding action and how to set up the
07: * UI-controls to reflect an action given.
08: *
09: * @author Sebastian Nozzi.
10: */
11: public abstract class ActionController extends OperationController {
12:
13: // TODO: this is not very portable or elegant. Avoid hardcoded and hidden values like this.
14: /** The package location in which ActionControllers can be found. */
15: protected static final String ACTION_CONTROLLERS_PACKAGE = "org.osbl.agent.gui.action";
16:
17: /**
18: * Given an Action instance, it tries to retrieve a corresponding ActionController object.
19: * That object reflects the state of the given Action.
20: *
21: * @param action an Action instance.
22: *
23: * @return the corresponding instantiated ActionController.
24: *
25: * @throws InstantiationException the instantiation exception
26: * @throws IllegalAccessException the illegal access exception
27: * @throws ClassNotFoundException the class not found exception
28: */
29: public static ActionController newInstance(Action action)
30: throws InstantiationException, IllegalAccessException,
31: ClassNotFoundException {
32:
33: // Create the ConditionController corresponding to the given condition.
34: ActionController result = (ActionController) newInstance(
35: action, ACTION_CONTROLLERS_PACKAGE);
36:
37: // Make the ActionController set itself up according to the
38: // parameters in the condition.
39: result.setAction(action);
40:
41: // Return the recently created and set-up Controller
42: return result;
43: }
44:
45: /**
46: * Makes the ActionController re-configure itself based on the passed Action.
47: * (So, this is no normal setter method; the Action is not retained).
48: *
49: * @param action the Action this ActionController should reflect.
50: */
51: public abstract void setAction(Action action);
52:
53: /**
54: * Generates a (new) Action instance according to the state of the UI controls.
55: * Subclasses should not override this method but {@link #populateAction(Action)} instead.
56: *
57: * @return a new Action instance.
58: */
59: public final Action getAction() {
60:
61: // Instantiate the corresponding Action (note that this will always
62: // instantiate a subclass of Action, depending in which ActionController
63: // this gets called).
64: // For example, if this is called inside a SetValueActionController then
65: // a SetValueAction will be instantiated.
66: Action result = (Action) newOperationInstance();
67:
68: // The Action instance just created is lacks relevant information, so...
69:
70: // ... this fills the Action with all relevant information corrsponding
71: // to the current status of the ActionController.
72:
73: // Note that each class overrides this method and sets the information
74: // corresponding to the Action it represents.
75: populateAction(result);
76:
77: // Return the populated Action.
78: return result;
79:
80: }
81:
82: /**
83: * Populates and configures a given Action object to reflect the state of this Controller.
84: * (especially the UI components).
85: *
86: * @param action the Action to be populated.
87: */
88: protected abstract void populateAction(Action action);
89:
90: }
|