PROP : Add the open URL 39/20239/1
authorjaeyeol lee <jaeyeol148.lee@samsung.com>
Wed, 30 Apr 2014 04:36:23 +0000 (13:36 +0900)
committerjaeyeol lee <jaeyeol148.lee@samsung.com>
Wed, 30 Apr 2014 04:36:23 +0000 (13:36 +0900)
Change-Id: I4566751e5d7ea2fa97bd3659f2f4cc7544323ed1
Signed-off-by: jaeyeol lee <jaeyeol148.lee@samsung.com>
14 files changed:
org.tizen.webuibuilder/res/xslt/index_managed_js_ver0_0_1.xslt
org.tizen.webuibuilder/src/org/tizen/webuibuilder/gef/commands/SetPartMovePageEventCommand.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/gef/commands/SetPartOpenUrlEventCommand.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/model/Part.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/model/app/AppManagerForHTML.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/model/app/io/HtmlMetaReader_ver_1.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/model/app/io/HtmlMetaWriter_ver_1.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/model/io/ModelDeserializer.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/model/io/ModelSerializer.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionEventComposite.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionEventDelegater.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionOpenUrlComposite.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionSelectBarComposite.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionTab.java

index e634cd3..d659bb8 100644 (file)
@@ -74,6 +74,8 @@ app.init = function() {
                </xsl:when>
                <xsl:when test="name() = 'gotoPage'">
                </xsl:when>
+               <xsl:when test="name() = 'openUrl'">
+               </xsl:when>
                <xsl:otherwise>
                        <xsl:value-of select="concat($class_name, '.prototype.', @id, ' = ')"/>
                        <xsl:value-of select="concat('undefined;', $newline)"/>
@@ -111,6 +113,8 @@ app.init = function() {
 </xsl:when>
 <xsl:when test="name() = 'gotoPage'">
 </xsl:when>
+<xsl:when test="name() = 'openUrl'">
+</xsl:when>
 <xsl:otherwise>
 <xsl:text>
                /**
@@ -153,6 +157,15 @@ app.init = function() {
 </xsl:if>
 </xsl:for-each>
 
+<xsl:for-each select=".//tizen.page//*">
+<xsl:if test="name() = 'openUrl'">
+<xsl:if test="../@id != $page_name">
+<xsl:value-of select="concat($tab, $tab, $class_name, '.prototype.', ../@id, '.bind(')"/>
+<xsl:value-of select="concat('&quot;', substring(@event, 3), '&quot;, ', 'function(event) { window.location.href = ', '&quot;', @url, '&quot;', ' });', $newline)"/>
+</xsl:if>
+</xsl:if>
+</xsl:for-each>
+
 <xsl:value-of select="concat($newline, $tab, '});', $newline, $newline)"/>
 
 <xsl:if test=".//tizen.page//*[@data-bind]">
index 125c645..5dd761b 100644 (file)
@@ -78,9 +78,9 @@ public class SetPartMovePageEventCommand extends Command {
     /**
      * Undoes a {@link SetPartMovePageEventCommand}.
      */
-    // @Override
-    // public void undo() {
-    // part.setEventValue(eventName, oldEventValue, index);
-    // }
+     @Override
+     public void undo() {
+        part.removeGotoPageEventValue(eventName);
+     }
 
 }
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/gef/commands/SetPartOpenUrlEventCommand.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/gef/commands/SetPartOpenUrlEventCommand.java
new file mode 100644 (file)
index 0000000..d645bd5
--- /dev/null
@@ -0,0 +1,52 @@
+package org.tizen.webuibuilder.gef.commands;
+
+import org.eclipse.gef.commands.Command;
+import org.tizen.webuibuilder.model.Part;
+
+public class SetPartOpenUrlEventCommand extends Command {
+
+       private Part part;
+       private String eventName;
+       private String urlValue;
+
+       public SetPartOpenUrlEventCommand(Part model, String triggerNameSrc,
+                       String urlValue) {
+               this.part = model;
+        this.eventName = triggerNameSrc;
+        this.urlValue = urlValue;
+       }
+       
+       /**
+     * Checks whether a {@link SetPartOpenUrlEventCommand} can be executed.
+     * 
+     * @return <code>true</code> if a {@link SetPartOpenUrlEventCommand} can be executed, and
+     *         <code>false</code> otherwise
+     */
+    @Override
+    public boolean canExecute() {
+        if (part == null) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+    
+    /**
+     * Executes a {@link SetPartOpenUrlEventCommand}.
+     */
+    @Override
+    public void execute() {
+        if (canExecute()) {
+            part.setOpenUrlEventValue(eventName, urlValue);
+        }
+    }
+    
+    /**
+     * Undoes a {@link SetPartOpenUrlEventCommand}.
+     */
+     @Override
+     public void undo() {
+        part.removeOpenUrlEventValue(eventName);
+     }
+
+}
index 748490b..d3c9a6f 100644 (file)
@@ -125,8 +125,9 @@ public class Part implements ISerializer {
     private Map<String, CssSelector> selectors = new HashMap<String, CssSelector>();
 
     private AbsolutePositionProvider absolutePositionProvider = null;
-    private Map<String, GotoPageProperty> gotoPageproperties =
+    private Map<String, GotoPageProperty> gotoPageProperties =
             new HashMap<String, GotoPageProperty>();
+    private Map<String, String> openUrlProperties = new HashMap<String, String>();
 
     /**
      * A dom element.
@@ -1188,6 +1189,16 @@ public class Part implements ISerializer {
     // fireEvent(new PartEvent(PartEvent.EventType.EVENT_CHANGED, this,
     // eventName, oldValue));
     // }
+    
+    /**
+     * Resets event value corresponding event name.
+     * 
+     * @param eventName
+     *            an event name
+     */
+    public void resetEventValue(String eventName) {
+        events.remove(eventName);
+    }
 
     public void setGotoPageEventValue(String eventName, String pageValue, String transitionValue) {
         if (pageValue == null || transitionValue == null) {
@@ -1195,28 +1206,55 @@ public class Part implements ISerializer {
         }
 
         if ((pageValue.equals(EMPTY)) || (transitionValue.equals(EMPTY))) {
-            gotoPageproperties.put(eventName, null);
+            gotoPageProperties.remove(eventName);
         } else {
-            gotoPageproperties.put(eventName, new GotoPageProperty(pageValue, transitionValue));
+            gotoPageProperties.put(eventName, new GotoPageProperty(pageValue, transitionValue));
         }
+        fireEvent(new PartEvent(PartEvent.EventType.EVENT_CHANGED, this, eventName, null));
     }
 
     public Map<String, GotoPageProperty> getGotoPageproperties() {
-        return gotoPageproperties;
+        return gotoPageProperties;
     }
 
     public GotoPageProperty getGotoPageproperty(String eventName) {
-        return gotoPageproperties.get(eventName);
+        return gotoPageProperties.get(eventName);
+    }
+    
+    public void removeGotoPageEventValue(String eventName) {
+        gotoPageProperties.remove(eventName);
+        fireEvent(new PartEvent(PartEvent.EventType.EVENT_CHANGED, this, eventName, null));
+    }
+    
+    public Map<String, String> getOpenUrlProperties() {
+        return openUrlProperties;
+    }
+    
+    public String getOpenUrlEventValues(String eventName) {
+        return openUrlProperties.get(eventName);
     }
 
-    /**
-     * Resets event value corresponding event name.
-     * 
-     * @param eventName
-     *            an event name
-     */
-    public void resetEventValue(String eventName) {
-        events.remove(eventName);
+    public void setOpenUrlEventValue(String eventName, String urlValue) {
+        if (urlValue == null ) {
+            return;
+        }
+        
+        if (urlValue.equals(BuilderConstants.EMPTY)) {
+            openUrlProperties.remove(eventName);
+        } else { 
+            String oldValue = getOpenUrlEventValues(eventName);
+            if (urlValue.equals(oldValue)) {
+                return;
+            }
+            openUrlProperties.put(eventName, urlValue);
+        }
+
+        fireEvent(new PartEvent(PartEvent.EventType.EVENT_CHANGED, this, eventName, null));
+    }
+
+    public void removeOpenUrlEventValue(String eventName) {
+        openUrlProperties.remove(eventName);
+        fireEvent(new PartEvent(PartEvent.EventType.EVENT_CHANGED, this, eventName, null));
     }
 
     /**
index ca20363..bde48a5 100644 (file)
@@ -163,6 +163,17 @@ public class AppManagerForHTML extends AppManager {
                     }
                 }
             }
+            
+            if ((partList.get(i).getOpenUrlProperties() != null)
+                    && (!partList.get(i).getOpenUrlProperties().isEmpty())) {
+                for (Entry<String, String> url : partList.get(i).getOpenUrlProperties().entrySet()) {
+                    String value = url.getValue();
+
+                    if (value != null) {
+                        targetPartList.get(i).setOpenUrlEventValue(url.getKey(), value);
+                    }
+                }
+            }
 
             if (partList.get(i).getChildren() != null) {
                 setActionProperties(targetPartList.get(i), partList.get(i));
index a6cb6d7..8d6f4f1 100644 (file)
@@ -434,15 +434,18 @@ public class HtmlMetaReader_ver_1 {
                                part.setEventValue(eventAttr.getName(), eventAttr.getValue());
                            }
                        } else if (child.getNodeName().equals("gotoPage")) {
-                           List<String> strList = new ArrayList<String>();
-       
                                attrList = child.getAttributes();
-                           for (int j = 0; j < attrList.getLength(); j++) {
-                               Attr eventAttr = (Attr) attrList.item(j);
-                               strList.add(eventAttr.getValue());
-                           }
-                           part.setGotoPageEventValue(strList.get(0), strList.get(1), strList.get(2));
-       
+                               String event = ((Attr)attrList.getNamedItem("event")).getValue();
+                        String destinationPage = ((Attr)attrList.getNamedItem("destinationPage")).getValue();
+                        String transition = ((Attr)attrList.getNamedItem("transition")).getValue();
+                               
+                        part.setGotoPageEventValue(event, destinationPage, transition);
+                       } else if (child.getNodeName().equals("openUrl")) {
+                           attrList = child.getAttributes();
+                        String event = ((Attr)attrList.getNamedItem("event")).getValue();
+                        String url = ((Attr)attrList.getNamedItem("url")).getValue();
+                        
+                        part.setOpenUrlEventValue(event, url);
                        } else {
                            childpart = parseElement(fileData, (Element)child, partFactory, selectors);
                            part.addChildWhenPageRead(childpart);
index f275b4b..6a14a9c 100644 (file)
@@ -250,6 +250,16 @@ public class HtmlMetaWriter_ver_1 {
                 elem.appendChild(element);
             }
         }
+        
+        for (Entry<String, String> openUrlEvent : part.getOpenUrlProperties().entrySet()) {
+            String value = openUrlEvent.getValue();
+            if (value != null) {
+                Element element = doc.createElement("openUrl");
+                element.setAttribute("event", openUrlEvent.getKey());
+                element.setAttribute("url", value);
+                elem.appendChild(element);
+            }
+        }
 
         for (Part child : part.getChildren()) {
             elem.appendChild(writePart(doc, child, includePid));
index 89341a4..4f135d0 100644 (file)
@@ -89,15 +89,18 @@ public class ModelDeserializer {
                             part.setEventValue(eventAttr.getName(), eventAttr.getValue());
                         }
                     } else if (childElem.getNodeName().equals("gotoPage")) {
-                        List<String> strList = new ArrayList<String>();
-
                         attrList = childElem.getAttributes();
-                        for (int j = 0; j < attrList.getLength(); j++) {
-                            Attr eventAttr = (Attr) attrList.item(j);
-                            strList.add(eventAttr.getValue());
-                        }
-                        part.setGotoPageEventValue(strList.get(0), strList.get(1), strList.get(2));
-
+                        String event = ((Attr)attrList.getNamedItem("event")).getValue();
+                        String destinationPage = ((Attr)attrList.getNamedItem("destinationPage")).getValue();
+                        String transition = ((Attr)attrList.getNamedItem("transition")).getValue();
+                        
+                        part.setGotoPageEventValue(event, destinationPage, transition);
+                    } else if (childElem.getNodeName().equals("openUrl")) {
+                        attrList = childElem.getAttributes();
+                        String event = ((Attr)attrList.getNamedItem("event")).getValue();
+                        String url = ((Attr)attrList.getNamedItem("url")).getValue();
+                        
+                        part.setOpenUrlEventValue(event, url);
                     } else {
                         Part childpart = parseElement(childElem, partFactory);
                         part.addChildWhenPageRead(childpart);
index b5acd5d..613b1bd 100644 (file)
@@ -121,6 +121,16 @@ public class ModelSerializer {
                 elem.appendChild(element);
             }
         }
+        
+        for (Entry<String, String> openUrlEvent : part.getOpenUrlProperties().entrySet()) {
+            String value = openUrlEvent.getValue();
+            if (value != null) {
+                Element element = doc.createElement("openUrl");
+                element.setAttribute("event", openUrlEvent.getKey());
+                element.setAttribute("url", value);
+                elem.appendChild(element);
+            }
+        }
 
         for (Part child : part.getChildren()) {
             elem.appendChild(writePart(doc, child, includePid));
index 8edcf7a..59747b3 100644 (file)
@@ -355,6 +355,12 @@ public class ActionEventComposite extends Composite {
             ActionSelectBarComposite bar = addSelectionBar();
             bar.setGotoPageUiRefresh();
         }
+        
+        String urlValue = model.getOpenUrlEventValues(triggerName);
+        if (urlValue != null) {
+            ActionSelectBarComposite bar = addSelectionBar();
+            bar.setOpenUrlUiRefresh();
+        }
 
     }
 }
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionEventDelegater.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionEventDelegater.java
new file mode 100644 (file)
index 0000000..9db1e66
--- /dev/null
@@ -0,0 +1,47 @@
+package org.tizen.webuibuilder.ui.views.properties.action;
+
+import org.tizen.webuibuilder.model.IPartListener;
+import org.tizen.webuibuilder.model.PartEvent;
+
+public class ActionEventDelegater implements IPartListener {
+
+    private ActionTab actionTab;
+
+    public ActionEventDelegater(ActionTab actionTab) {
+        this.actionTab = actionTab;
+    }
+
+    @Override
+    public void childAdded(PartEvent event) {
+    }
+
+    @Override
+    public void childMoved(PartEvent event) {
+    }
+
+    @Override
+    public void childRemoved(PartEvent event) {
+    }
+
+    @Override
+    public void propertyChanged(PartEvent event) {
+    }
+
+    @Override
+    public void positionChanged(PartEvent event) {
+    }
+
+    @Override
+    public void eventChanged(PartEvent event) {
+        actionTab.refresh();
+    }
+
+    @Override
+    public void visualPositionChanged(PartEvent event) {
+    }
+
+    @Override
+    public void needRefresh(PartEvent event) {
+    }
+
+}
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionOpenUrlComposite.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/properties/action/ActionOpenUrlComposite.java
new file mode 100644 (file)
index 0000000..bf941cc
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * UI Builder
+ *
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
+
+
+package org.tizen.webuibuilder.ui.views.properties.action;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.tizen.webuibuilder.BuilderConstants;
+import org.tizen.webuibuilder.gef.commands.SetPartOpenUrlEventCommand;
+
+
+/**
+ * gotoUrl ui composite making in action tab in properties view
+ * 
+ */
+public class ActionOpenUrlComposite extends Composite implements IActionActionComposite {
+
+    private Composite parent;
+    private ActionEventComposite trigger;
+    private List<Composite> childComposites = new ArrayList<Composite>();
+    private Text urlText;
+
+    // private List<Method> methods = new ArrayList<Method>();
+
+    /**
+     * constructor
+     * 
+     * @param parent
+     *            {@link Composite}
+     * @param style
+     */
+    ActionOpenUrlComposite(Composite parent, int style, ActionEventComposite trigger) {
+        super(parent, style);
+
+        this.parent = parent;
+        this.trigger = trigger;
+        
+        GridLayout layout = new GridLayout(1, false);
+        setLayout(layout);
+
+        init();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.swt.widgets.Widget#dispose()
+     */
+    @Override
+    public void dispose() {
+
+        if (childComposites != null)
+            childComposites.clear();
+
+        super.dispose();
+    }
+
+    /**
+     * initialize layout and composite
+     */
+    private void init() {
+        drawComponents();
+        this.layout();
+        parent.layout();
+    }
+
+    /**
+     * drawComponents
+     */
+    private void drawComponents() {
+
+        urlText = ActionCompositeUtils.createLabelAndText(this, "Url");
+        /* Button bt = ActionCompositeUtils.createLabelAndCheckbox(this, "Open in new window"); */
+        
+        String url = trigger.getModel().getOpenUrlEventValues(trigger.getTriggerNameSrc());
+        if (url != null) {
+            urlText.setText(url);
+        }
+        
+        addListenersToText(urlText);
+    }
+
+    private void addListenersToText(Text text) {
+       text.addListener(SWT.Traverse, new Listener() {
+
+            @Override
+            public void handleEvent(Event event) {
+
+                switch (event.type) {
+                    case SWT.Traverse:
+                        if (event.detail == SWT.TRAVERSE_RETURN) {
+                               valueChanged();
+                        } else if (event.detail == SWT.TRAVERSE_ESCAPE) {
+                            ((ActionSelectBarComposite) parent).deleteCompositesCommnad();
+                        }
+                        break;
+
+                    default:
+                        break;
+                }
+            }
+
+        });
+
+       text.addListener(SWT.MouseDoubleClick, new Listener() {
+
+            @Override
+            public void handleEvent(Event event) {
+
+                switch (event.type) {
+                    case SWT.MouseDoubleClick:
+                        valueChanged();
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+       }
+    
+    private void valueChanged() {
+       String urlValue = urlText.getText();
+       if ((urlValue == null) || (urlValue.equals(BuilderConstants.EMPTY))) {
+            return;
+        }
+       
+       trigger.getCommandStack().execute(new SetPartOpenUrlEventCommand(trigger.getModel(), trigger
+                         .getTriggerNameSrc(), urlValue));
+       }
+
+       /*
+     * (non-Javadoc)
+     * 
+     * @see org.tizen.webuibuilder.animator.ui.action.IActionActionComposite#removeCommand()
+     */
+    @Override
+    public void removeCommand() {
+       trigger.getCommandStack().execute(new SetPartOpenUrlEventCommand(trigger.getModel(), trigger
+                .getTriggerNameSrc(), ""));
+
+    }
+}
index 739b69b..d7b5e4d 100644 (file)
@@ -54,7 +54,7 @@ import org.tizen.webuibuilder.utility.ResourceManager;
 public class ActionSelectBarComposite extends Composite {
 
     public enum ActionSelecteTypes {
-        RUN_JAVASCRIPT(0), GOTO_PAGE(1), GOTO_URL(2), START_ANIMATIONGROUP(3), PAUSE_ANIMATIONGROUP(
+        RUN_JAVASCRIPT(0), GOTO_PAGE(1), OPEN_URL(2), START_ANIMATIONGROUP(3), PAUSE_ANIMATIONGROUP(
                 4), CONTINUE_ANIMATIONGROUP(5), GOTOTIME_ANIMATIONGROUP(6), REMOVE(7), ENUM_MAX_SIZE(
                 8);
 
@@ -86,7 +86,7 @@ public class ActionSelectBarComposite extends Composite {
     private String customEvent = null;
 
     private static String[] actionListString = new String[] { "Run Java Script Function",
-            "GO to Page..", "Go To URL..", "Start Animation Group..", "Pause Animation Group..",
+            "GO to Page..", "Open URL..", "Start Animation Group..", "Pause Animation Group..",
             "Continue Animation Group..", "Go to Time in Animation Group.." };
 
     /**
@@ -264,8 +264,8 @@ public class ActionSelectBarComposite extends Composite {
             case 1: /* GoToPage */
                 createGoToPageComposite();
                 break;
-            case 2: /* GoToURL */
-                createGoToUrlComposite();
+            case 2: /* OpenURL */
+                createOpenUrlComposite();
                 break;
             case 3: /* "Start Animation Group.." */
             case 4: /* "Pause Animation Group..", */
@@ -384,9 +384,9 @@ public class ActionSelectBarComposite extends Composite {
     /**
      * createGoToPageComposite
      */
-    private void createGoToUrlComposite() {
+    private void createOpenUrlComposite() {
 
-        childComposite = new ActionGoToUrlComposite(thisComposite, style);
+        childComposite = new ActionOpenUrlComposite(thisComposite, style, triggerEvent);
         childComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
     }
 
@@ -500,6 +500,14 @@ public class ActionSelectBarComposite extends Composite {
         selectCombo.select(ActionSelecteTypes.GOTO_PAGE.getIndex());
         setGotoPageUiNSet();
     }
+    
+    /**
+     * setOpenUrlUiRefresh
+     */
+    public void setOpenUrlUiRefresh() {
+        selectCombo.select(ActionSelecteTypes.OPEN_URL.getIndex());
+        setOpenUrlUiNSet();
+    }
 
     /**
      * setEventHandlerUiNSet
@@ -514,6 +522,13 @@ public class ActionSelectBarComposite extends Composite {
     private void setGotoPageUiNSet() {
         createGoToPageComposite();
     }
+    
+    /**
+     * setOpenUrlUiNSet
+     */
+    private void setOpenUrlUiNSet() {
+        createOpenUrlComposite();
+    }
 
     /**
      * setAnimationUiNSet
index bd6e82c..3d05f7a 100644 (file)
@@ -86,6 +86,7 @@ public class ActionTab extends PropertiesTabItem {
     private List<Method> actionsMethods = new ArrayList<Method>();
 
     private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
+    private ActionEventDelegater delegater;
 
     /**
      * @param tabFolder
@@ -95,11 +96,39 @@ public class ActionTab extends PropertiesTabItem {
      */
     public ActionTab(CTabFolder tabFolder, CommandStack commandStack, DesignerGoingBridge goingBridge) {
         super(tabFolder, SWT.NONE, TabIndex.ACTION.getIndex(), goingBridge);
-
+        this.delegater = new ActionEventDelegater(this);
         this.commandStack = commandStack;
 
         init();
     }
+    
+    @Override
+    public void dispose() {
+        removeListeners();
+    }
+    
+    @Override
+    public void setModel(List<Part> models) {
+        super.setModel(models);
+
+        removeListeners();
+        addListeners();
+    }
+
+    private void addListeners() {
+        Part model = getModel();
+        if (model != null) {
+            model.addPartListener(delegater);
+        }
+    }
+
+    private void removeListeners() {
+        Part model = getModel();
+        if (model != null) {
+            // TODO : support multi selection
+            model.removePartListener(delegater);
+        }
+    }
 
     /**
      * initialize layout and composite
@@ -233,9 +262,11 @@ public class ActionTab extends PropertiesTabItem {
                 return;
             }
 
+            ActionEventComposite actionEventComposite;
+            
             // check already exist event handler in model
             for (EventDescriptor event : events) {
-                ActionEventComposite actionEventComposite =
+                actionEventComposite =
                         new ActionEventComposite(content, SWT.NONE, event, toolkit, model,
                                                  commandStack);
                 actionEventComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));