registering actions as event listeners on the app

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

registering actions as event listeners on the app

gr8coat
This post was updated on .
Awhile back Todd wrote :

Action is a higher level abstraction that at the event handler level.  For
instance, I have things like NewInvoiceAction, DeleteInvoiceAction,
ProvideFeedbackAction, etc.  They each register themselves as event
listeners on the app and maintain an internal state -- thus allowing them
to perform their action at any time without needing to know how they were
triggered.  They also maintain their own enabled/disabled state in a
similar fashion.  Then I wire up my buttons, menus, and keystrokes to my
actions, and my get auto-disabling of those buttons and menu items for free.


Can someone provide an example of actions registering themselves as event
listeners on the app?

Thanks.
C
Reply | Threaded
Open this post in threaded view
|

RE: registering actions as event listeners on the app

Roger Whitcomb-2

So, I don’t know if this is overly complicated, but (since I like enums for things like this) we implemented something like this:

public enum Actions

{

      OPEN_FILE {

            @Override

            public void perform(ContextInfo contextInfo) {

                  // do the work here

            }

      },

      CLOSE_FILE {

etc.

      // Custom method that is implemented by each action to perform its work

      public abstract void perform(ContextInfo contextInfo);

}

 

Then I made my custom action class that takes one of these enums as a parameter and does the self-registration at construction time:

public class CustomAction extends org.apache.pivot.wtk.Action

{

      private Actions action;

      public CustomAction(Actions action, boolean enabled) {

            this.action = action;

            // Register ourselves with the named action dictionary in the application

            Action.getNamedActions().put(action.toString(), this);

            setEnabled(enabled);

      }

      @Override

      public void perform(Component comp) {

            ContextInfo contextInfo = new ContextInfo();

            // derive the context from the given component

            …

            this.action.perform(contextInfo);

      }

 

As Todd indicated, each CustomAction also deals with its enabled/disabled state like this:

      public static CustomAction getAction(Actions a) {

          return (CustomAction) Action.getNamedActions().get(a.toString());

      }

 

      public static boolean isEnabled(Actions a) {

          return getAction(a).isEnabled();

      }

 

      public static void setEnabled(Actions a, boolean enabled) {

          getAction(a).setEnabled(enabled);

      }

 

So that I can write code (using my enum  so I don’t misspell the names) like this:

      CustomAction.setEnabled(Actions.OPEN_FILE, true);

 

Also, if there is ever a need to perform an action explicitly, you can do this:

      CustomAction.getAction(Actions.SAVE_FILE).perform(/* component here */);

 

Then finally, in the “startup” method of the main class, I do this to register all the actions:

      for (Actions a : Actions.values()) {

            new CustomAction(a);

      }

 

 

HTH,

~Roger Whitcomb

 

From: Cynthia Schwartz [mailto:[hidden email]]
Sent: Wednesday, May 29, 2013 8:27 AM
To: [hidden email]
Subject: registering actions as event listeners on the app

 

Awhile back Todd wrote :

 

Action is a higher level abstraction that at the event handler level.  For instance, I have things like NewInvoiceAction, DeleteInvoiceAction, ProvideFeedbackAction, etc.  They each register themselves as event listeners on the app and maintain an internal state -- thus allowing them to perform their action at any time without needing to know how they were triggered.  They also maintain their own enabled/disabled state in a similar fashion.  Then I wire up my buttons, menus, and keystrokes to my actions, and my get auto-disabling of those buttons and menu items for free.

 

 

Can someone provide an example of them rgister themselves as event listeners on the app?

 

Thanks.

C