[106427] Performance : need a delay class loading for EditorExtension actions
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorActionBuilder.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorActionBuilder.java
index 9db1edf..ef7f745 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorActionBuilder.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/ExtendedEditorActionBuilder.java
@@ -45,6 +45,7 @@
 import org.eclipse.ui.part.MultiPageEditorSite;
 import org.eclipse.ui.texteditor.IUpdate;
 import org.eclipse.wst.sse.ui.internal.extension.ActionDescriptor;
+import org.eclipse.wst.sse.ui.internal.extension.IExtendedEditorActionProxyForDelayLoading;
 import org.eclipse.wst.sse.ui.internal.extension.RegistryReader;
 import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
 
@@ -153,6 +154,9 @@
 							// uncaught exceptions could cause the menu to not
 							// be shown
 							try {
+								if (((ad.getPopupMenuPath() != null) || (ad.getPopupMenuGroup() != null)) && (a instanceof IExtendedEditorActionProxyForDelayLoading)) {
+								    ((IExtendedEditorActionProxyForDelayLoading)a).realize();
+								}
 
 								IExtendedEditorAction eea = (IExtendedEditorAction) a;
 								eea.setActiveExtendedEditor(activeExtendedEditor);
@@ -196,6 +200,9 @@
 						ActionDescriptor ad = (ActionDescriptor) obj;
 						IAction a = ad.getAction();
 						if (a instanceof IExtendedEditorAction) {
+							if (((ad.getToolbarPath() != null) || (ad.getToolbarGroup() != null)) && (a instanceof IExtendedEditorActionProxyForDelayLoading)) {
+							    ((IExtendedEditorActionProxyForDelayLoading)a).realize();
+							}
 							IExtendedEditorAction eea = (IExtendedEditorAction) a;
 							eea.setActiveExtendedEditor(activeExtendedEditor);
 							eea.update();
@@ -258,8 +265,9 @@
 			else {
 				activeEditorIsVisible = site.getWorkbenchWindow().getPartService().getActivePart().equals(activeExtendedEditor.getEditorPart());
 			}
-			if (!activeEditorIsVisible)
-				return;
+			// due to a delay class loading, don't return now
+//			if (!activeEditorIsVisible)
+//				return;
 
 			IContributionItem[] items = menu.getItems();
 			if (items == null || items.length == 0)
@@ -275,6 +283,7 @@
 
 			Set keys = map.keySet();
 			Iterator it = keys.iterator();
+			boolean needActionContributionItemUpdate = false;
 			while (it.hasNext()) {
 				IContributionItem item = (IContributionItem) it.next();
 				IMenuManager mm = (IMenuManager) map.get(item);
@@ -282,22 +291,47 @@
 					try {
 						IAction action = ((ActionContributionItem) item).getAction();
 
-						if (action instanceof IUpdate) {
-							((IUpdate) action).update();
+						if (action instanceof IExtendedEditorActionProxyForDelayLoading) {
+						    IExtendedEditorActionProxyForDelayLoading eea = (IExtendedEditorActionProxyForDelayLoading)action;
+						    if (eea.isRealized() == false) {
+						        eea.realize();
+						        needActionContributionItemUpdate = true;
+						    }
 						}
 
-						boolean visible = true;
-						if (action instanceof IExtendedEditorAction) {
-							visible = ((IExtendedEditorAction) action).isVisible();
+						if (activeEditorIsVisible || needActionContributionItemUpdate) {
+							if (action instanceof IUpdate) {
+								((IUpdate) action).update();
+							}
 						}
-						item.setVisible(visible);
+
+						if (activeEditorIsVisible || needActionContributionItemUpdate) {
+							boolean visible = true;
+							if (action instanceof IExtendedEditorAction) {
+								visible = ((IExtendedEditorAction) action).isVisible();
+							}
+							item.setVisible(visible);
+						}
+
+						if (needActionContributionItemUpdate) {
+						    ((ActionContributionItem)item).update();
+						}
+
 					}
 					catch (Exception e) {
 						Logger.logException("updating actions", e); //$NON-NLS-1$
 					}
 				}
 			}
-			menu.update(false);
+			if (activeEditorIsVisible || needActionContributionItemUpdate) {
+			    if (needActionContributionItemUpdate) {
+			        // the action is realized so that need to update the menu w/
+			        // force set to true
+			        menu.update(true);
+			    } else {
+			        menu.update(false);
+			    }
+			}
 		}
 
 		public void setActiveEditor(IEditorPart editor) {
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ActionDescriptor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ActionDescriptor.java
index 530005e..d2ce7ac 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ActionDescriptor.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ActionDescriptor.java
@@ -267,8 +267,7 @@
 	/**
 	 */
 	private IAction createAction(IConfigurationElement actionElement) {
-
-		Object action = createExtension(actionElement, ATT_CLASS);
+		Object action = new ExtendedEditorActionProxyForDelayLoading(actionElement, ATT_CLASS);
 		if (action == null)
 			return null;
 		if (action instanceof IActionValidator) {
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxyForDelayLoading.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxyForDelayLoading.java
new file mode 100644
index 0000000..c4565df
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/ExtendedEditorActionProxyForDelayLoading.java
@@ -0,0 +1,752 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.ListenerList;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.HelpListener;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.wst.sse.ui.internal.IExtendedEditorAction;
+import org.eclipse.wst.sse.ui.internal.IExtendedSimpleEditor;
+import org.eclipse.wst.sse.ui.internal.Logger;
+import org.osgi.framework.Bundle;
+
+public class ExtendedEditorActionProxyForDelayLoading implements IExtendedEditorAction, IExtendedEditorActionProxyForDelayLoading, IAction {
+    private IAction proxy;
+    private IAction dummy = new Action() { // this is for mainly its property change notify...
+    };
+    // proxy'ed properties
+    private String p_id;
+    private boolean set_p_id;
+    private String p_text;
+    private boolean set_p_text;
+    private String p_toolTipText;
+    private boolean set_p_toolTipText;
+    private String p_actionDefinitionId;
+    private boolean set_p_actionDefinitionId;
+    private ImageDescriptor p_image;
+    private boolean set_p_image;
+    private ImageDescriptor p_hoverImage;
+    private boolean set_p_hoverImage;
+    private ImageDescriptor p_disabledImage;
+    private boolean set_p_disabledImage;
+    private int p_accelerator;
+    private boolean set_p_accelerator;
+    private int p_style = AS_PUSH_BUTTON;
+    //private boolean set_p_style;
+    private HelpListener p_helpListener;
+    private boolean set_p_helpListener;
+    private boolean p_enabled = true; // should be same as what is done in
+    private boolean set_p_enabled;
+    private ListenerList p_listeners = new ListenerList(3);
+    private boolean set_p_listeners;
+    private boolean p_checked;
+    private boolean set_p_checked;
+    private IExtendedSimpleEditor p_targetEditor;
+    private boolean set_p_targetEditor;
+	private boolean p_isvisible = true; // should be true
+	
+	private IConfigurationElement element;
+	private String classAttribute;
+
+	 /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+     */
+    public void addPropertyChangeListener(IPropertyChangeListener listener) {
+        p_listeners.add(listener);
+        set_p_listeners = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.addPropertyChangeListener(listener);
+        } else {
+        	dummy.addPropertyChangeListener(listener);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getAccelerator()
+     */
+    public int getAccelerator() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getAccelerator();
+        }
+        return p_accelerator;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getActionDefinitionId()
+     */
+    public String getActionDefinitionId() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getActionDefinitionId();
+        }
+        return p_actionDefinitionId;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getDescription()
+     */
+    public String getDescription() {
+        //        System.out.println(p_id + ": getDescription");
+        //        System.out.flush();
+        realize();
+        if (proxy != null) {
+            return proxy.getDescription();
+        }
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getDisabledImageDescriptor()
+     */
+    public ImageDescriptor getDisabledImageDescriptor() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getDisabledImageDescriptor();
+        }
+        return p_disabledImage;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getHelpListener()
+     */
+    public HelpListener getHelpListener() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getHelpListener();
+        }
+        return p_helpListener;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getHoverImageDescriptor()
+     */
+    public ImageDescriptor getHoverImageDescriptor() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getHoverImageDescriptor();
+        }
+        return p_hoverImage;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getId()
+     */
+    public String getId() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getId();
+        }
+        return p_id;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getImageDescriptor()
+     */
+    public ImageDescriptor getImageDescriptor() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getImageDescriptor();
+        }
+        return p_image;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getMenuCreator()
+     */
+    public IMenuCreator getMenuCreator() {
+        //        System.out.println(p_id + ": getMenuCreator");
+        //        System.out.flush();
+        realize();
+        if (proxy != null) {
+            return proxy.getMenuCreator();
+        }
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getStyle()
+     */
+    public int getStyle() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getStyle();
+        }
+        return p_style;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getText()
+     */
+    public String getText() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getText();
+        }
+        return p_text;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#getToolTipText()
+     */
+    public String getToolTipText() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.getToolTipText();
+        }
+        return p_toolTipText;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#isChecked()
+     */
+    public boolean isChecked() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.isChecked();
+        }
+        return p_checked;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#isEnabled()
+     */
+    public boolean isEnabled() {
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            return proxy.isEnabled();
+        }
+        return p_enabled;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
+     */
+    public void removePropertyChangeListener(IPropertyChangeListener listener) {
+        p_listeners.remove(listener);
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.removePropertyChangeListener(listener);
+        }
+        dummy.removePropertyChangeListener(listener);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#run()
+     */
+    public void run() {
+        realize();
+        if (proxy != null) {
+            // if this has a key accelerator, first update this action and to
+            // see if this action is enabled or not.
+            if ((proxy.getAccelerator() > 0) || (proxy.getActionDefinitionId() != null)) {
+                update();
+                if (isEnabled() == true) {
+                    proxy.run();
+                }
+            } else {
+                proxy.run();
+            }
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#runWithEvent(org.eclipse.swt.widgets.Event)
+     */
+    public void runWithEvent(Event event) {
+        realize();
+        if (proxy != null) {
+            // same as run()
+            if ((proxy.getAccelerator() > 0) || (proxy.getActionDefinitionId() != null)) {
+                update();
+                if (isEnabled() == true) {
+                    proxy.runWithEvent(event);
+                }
+            } else {
+                proxy.runWithEvent(event);
+            }
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setActionDefinitionId(java.lang.String)
+     */
+    public void setActionDefinitionId(String id) {
+        p_actionDefinitionId = id;
+        set_p_actionDefinitionId = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setActionDefinitionId(id);
+        } else {
+        	dummy.setActionDefinitionId(id);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setChecked(boolean)
+     */
+    public void setChecked(boolean checked) {
+        p_checked = checked;
+        set_p_checked = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setChecked(checked);
+        } else {
+        	dummy.setChecked(checked);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setDescription(java.lang.String)
+     */
+    public void setDescription(String text) {
+        //        System.out.println(p_id + ": setDescription");
+        //        System.out.flush();
+        realize();
+        if (proxy != null) {
+            proxy.setDescription(text);
+        } else {
+        	dummy.setDescription(text);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setDisabledImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+     */
+    public void setDisabledImageDescriptor(ImageDescriptor newImage) {
+        p_disabledImage = newImage;
+        set_p_disabledImage = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setDisabledImageDescriptor(newImage);
+        } else {
+        	dummy.setDisabledImageDescriptor(newImage);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setEnabled(boolean)
+     */
+    public void setEnabled(boolean enabled) {
+        p_enabled = enabled;
+        set_p_enabled = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setEnabled(enabled);
+        } else {
+        	dummy.setEnabled(enabled);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setHelpListener(org.eclipse.swt.events.HelpListener)
+     */
+    public void setHelpListener(HelpListener listener) {
+        p_helpListener = listener;
+        set_p_helpListener = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setHelpListener(listener);
+        } else {
+        	dummy.setHelpListener(listener);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setHoverImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+     */
+    public void setHoverImageDescriptor(ImageDescriptor newImage) {
+        p_hoverImage = newImage;
+        set_p_hoverImage = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setHoverImageDescriptor(newImage);
+        } else {
+        	dummy.setHoverImageDescriptor(newImage);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setId(java.lang.String)
+     */
+    public void setId(String id) {
+        p_id = id;
+        set_p_id = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setId(id);
+        } else {
+        	dummy.setId(id);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
+     */
+    public void setImageDescriptor(ImageDescriptor newImage) {
+        p_image = newImage;
+        set_p_image = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setImageDescriptor(newImage);
+        } else {
+        	dummy.setImageDescriptor(newImage);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setMenuCreator(org.eclipse.jface.action.IMenuCreator)
+     */
+    public void setMenuCreator(IMenuCreator creator) {
+        //        System.out.println(p_id + ": setMenuCreator");
+        //        System.out.flush();
+        realize();
+        if (proxy != null) {
+            proxy.setMenuCreator(creator);
+        } else {
+        	dummy.setMenuCreator(creator);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setText(java.lang.String)
+     */
+    public void setText(String text) {
+        p_text = text;
+        set_p_text = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setText(text);
+        } else {
+        	dummy.setText(text);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setToolTipText(java.lang.String)
+     */
+    public void setToolTipText(String text) {
+        p_toolTipText = text;
+        set_p_toolTipText = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setToolTipText(text);
+        } else {
+        	dummy.setToolTipText(text);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#setAccelerator(int)
+     */
+    public void setAccelerator(int keycode) {
+        p_accelerator = keycode;
+        set_p_accelerator = true;
+        // don't realize class.
+        // realize();
+        if (proxy != null) {
+            proxy.setAccelerator(keycode);
+        } else {
+        	dummy.setAccelerator(keycode);
+        }
+    }
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.sse.ui.internal.IExtendedEditorAction#setActiveExtendedEditor(com.ibm.sse.editor.extension.IExtendedSimpleEditor)
+	 */
+	public void setActiveExtendedEditor(IExtendedSimpleEditor targetEditor) {
+		p_targetEditor = targetEditor;
+		set_p_targetEditor = true;
+        // don't realize class.
+        // realize();
+        if ((proxy != null) && (proxy instanceof IExtendedEditorAction)) {
+            ((IExtendedEditorAction)proxy).setActiveExtendedEditor(targetEditor);
+        }
+	}
+
+	/* (non-Javadoc)
+	 * @see com.ibm.sse.editor.extension.IExtendedEditorAction#isVisible()
+	 */
+	public boolean isVisible() {
+        // don't realize class.
+        // realize();
+        if ((proxy != null) && (proxy instanceof IExtendedEditorAction)) {
+            return ((IExtendedEditorAction)proxy).isVisible();
+        }
+        return p_isvisible;
+	}
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.action.IAction#isHandled
+     */
+	public boolean isHandled() {
+		return false;
+	}
+
+	// see ActionDescriptor#createExtension
+	private static IAction newInstance(final IConfigurationElement elm, final String cla) {
+		final Object[] result = new Object[1];
+		// If plugin has been loaded create extension.
+		// Otherwise, show busy cursor then create extension.
+		Bundle bundle= Platform.getBundle(elm.getDeclaringExtension().getNamespace());
+		if (bundle != null && bundle.getState() == Bundle.ACTIVE) {
+			try {
+				result[0] = elm.createExecutableExtension(cla);
+			}
+			catch (Exception e) {
+				// catch and log ANY exception from extension point
+				handleCreateExecutableException(result, e);
+			}
+		}
+		else {
+			BusyIndicator.showWhile(null, new Runnable() {
+				public void run() {
+					try {
+						result[0] = elm.createExecutableExtension(cla);
+					}
+					catch (Exception e) {
+						// catch and log ANY exception from extension point
+						handleCreateExecutableException(result, e);
+					}
+				}
+			});
+		}
+		if ((result[0] != null) && (result[0] instanceof IAction)) {
+			return (IAction)result[0];
+		}
+		return null;
+    }
+	
+	private static void handleCreateExecutableException(final Object[] result, Throwable e) {
+		Logger.logException(e);
+		result[0] = null;
+	}
+
+	/**
+     * Instantiate a real class here
+     */
+    public void realize() {
+        if ((proxy == null) && (element != null) && (classAttribute != null)) {
+            proxy = newInstance(element, classAttribute);
+	        if (proxy != null) {
+	            element = null;
+	            classAttribute = null;
+	            // propagate proxy'ed properties
+	            if (set_p_listeners == true) {
+	                if (p_listeners.size() > 0) {
+	                    Object[] l = p_listeners.getListeners();
+	                    int ls = l.length;
+	                    for (int i = 0; i < ls; i++) {
+	                        IPropertyChangeListener pl = (IPropertyChangeListener) l[i];
+	                        proxy.addPropertyChangeListener(pl);
+	                        dummy.removePropertyChangeListener(pl); // remove listener from dymmy so that we don't send notifications twice anymore
+	                    }
+	                }
+	            }
+	            if (set_p_accelerator == true) {
+	                proxy.setAccelerator(p_accelerator);
+	            }
+	            if (set_p_actionDefinitionId == true) {
+	                if (p_actionDefinitionId != null) {
+	                    proxy.setActionDefinitionId(p_actionDefinitionId);
+	                }
+	            }
+	            if (set_p_checked == true) {
+	                proxy.setChecked(p_checked);
+	            }
+	            if (set_p_disabledImage == true) {
+	                if (p_disabledImage != null) {
+	                    proxy.setDisabledImageDescriptor(p_disabledImage);
+	                }
+	            }
+	            if (set_p_enabled == true) {
+	                proxy.setEnabled(p_enabled);
+	            }
+	            if (set_p_helpListener == true) {
+	                if (p_helpListener != null) {
+	                    proxy.setHelpListener(p_helpListener);
+	                }
+	            }
+	            if (set_p_hoverImage == true) {
+	                if (p_hoverImage != null) {
+	                    proxy.setHoverImageDescriptor(p_hoverImage);
+	                }
+	            }
+	            if (set_p_id == true) {
+	                if (p_id != null) {
+	                    proxy.setId(p_id);
+	                }
+	            }
+	            if (set_p_image == true) {
+	                if (p_image != null) {
+	                    proxy.setImageDescriptor(p_image);
+	                }
+	            }
+	            if (set_p_text == true) {
+	                if (p_text != null) {
+	                    proxy.setText(p_text);
+	                }
+	            }
+	            if (set_p_toolTipText == true) {
+	                if (p_toolTipText != null) {
+	                    proxy.setToolTipText(p_toolTipText);
+	                }
+	            }
+	            if (set_p_targetEditor == true) {
+	                if (p_targetEditor != null) {
+				        if (proxy instanceof IExtendedEditorAction) {
+				            ((IExtendedEditorAction)proxy).setActiveExtendedEditor(p_targetEditor);
+				        }
+	                }
+	            }
+	        }
+        }
+    }
+
+    public boolean isRealized() {
+        return (proxy != null);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.ui.texteditor.IUpdate#update()
+     */
+    public void update() {
+        // don't realize class.
+        // realize();
+        if ((proxy != null) && (proxy instanceof IUpdate)) {
+            ((IUpdate) proxy).update();
+        }
+    }
+
+    /**
+     * get a real action class
+     */
+    public IAction getAction() {
+        realize();
+        return proxy;
+    }
+
+
+    /**
+     * These are Actions's constructors
+     */
+    ExtendedEditorActionProxyForDelayLoading() {
+        super();
+     }
+    public ExtendedEditorActionProxyForDelayLoading(final IConfigurationElement element, final String classAttribute) {
+        super();
+        this.element = element;
+        this.classAttribute = classAttribute;
+    }
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/IExtendedEditorActionProxyForDelayLoading.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/IExtendedEditorActionProxyForDelayLoading.java
new file mode 100644
index 0000000..0152cbe
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/extension/IExtendedEditorActionProxyForDelayLoading.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jens Lukowski/Innoopract - initial renaming/restructuring
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal.extension;
+
+import org.eclipse.jface.action.IAction;
+
+
+public interface IExtendedEditorActionProxyForDelayLoading {
+    public IAction getAction();
+    public boolean isRealized();
+    public void realize();
+}