From f78c67af16a12f2665e048550f4fa46abf5b9c90 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Thu, 8 Jan 2009 06:22:27 +0000 Subject: [PATCH] fixes #2431 svn changeset:6439/svn branch:trunk --- .../toolkit/tests/tickets/Ticket2431.java | 52 +++++++++++++++++++ src/com/itmill/toolkit/ui/Panel.java | 5 +- 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/com/itmill/toolkit/tests/tickets/Ticket2431.java diff --git a/src/com/itmill/toolkit/tests/tickets/Ticket2431.java b/src/com/itmill/toolkit/tests/tickets/Ticket2431.java new file mode 100644 index 0000000000..16e2d118b8 --- /dev/null +++ b/src/com/itmill/toolkit/tests/tickets/Ticket2431.java @@ -0,0 +1,52 @@ +package com.itmill.toolkit.tests.tickets; + +import com.itmill.toolkit.Application; +import com.itmill.toolkit.event.Action; +import com.itmill.toolkit.event.ShortcutAction; +import com.itmill.toolkit.event.Action.Handler; +import com.itmill.toolkit.event.ShortcutAction.KeyCode; +import com.itmill.toolkit.event.ShortcutAction.ModifierKey; +import com.itmill.toolkit.ui.Label; +import com.itmill.toolkit.ui.Window; + +public class Ticket2431 extends Application { + + @Override + public void init() { + + Window w = new Window(); + setMainWindow(w); + Label help = new Label( + "Use CTRL X to fire action, CTRL C to remove it (fails before fix)"); + + w.addComponent(help); + + w.addActionHandler(new Handler() { + + final ShortcutAction a1 = new ShortcutAction("action", KeyCode.X, + new int[] { ModifierKey.CTRL }); + final ShortcutAction a2 = new ShortcutAction("action", KeyCode.C, + new int[] { ModifierKey.CTRL }); + + Action[] actions = new Action[] { a1, a2 }; + + public Action[] getActions(Object target, Object sender) { + return actions; + } + + public void handleAction(Action action, Object sender, Object target) { + if (action == a1) { + getMainWindow().addComponent(new Label("CTRL X hit")); + } else { + actions = new Action[] { a2 }; + // annoyance, we need to repaint the panel or detect the + // action in presence in handler + getMainWindow().removeActionHandler(this); + getMainWindow().addActionHandler(this); + } + } + }); + + } + +} diff --git a/src/com/itmill/toolkit/ui/Panel.java b/src/com/itmill/toolkit/ui/Panel.java index 531fa193ff..1a8871e7e3 100644 --- a/src/com/itmill/toolkit/ui/Panel.java +++ b/src/com/itmill/toolkit/ui/Panel.java @@ -307,8 +307,9 @@ public class Panel extends AbstractComponentContainer implements Scrollable, final String key = (String) variables.get("action"); final Action action = (Action) actionMapper.get(key); if (action != null && actionHandlers != null) { - for (final Iterator i = actionHandlers.iterator(); i.hasNext();) { - ((Action.Handler) i.next()) + Object[] array = actionHandlers.toArray(); + for (int i = 0; i < array.length; i++) { + ((Action.Handler) array[i]) .handleAction(action, this, this); } } -- 2.39.5