| /******************************************************************************* |
| * Copyright (c) 2001, 2008 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 String p_description; |
| private boolean set_p_text; |
| private boolean set_p_description; |
| 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(); |
| if (proxy != null) { |
| return proxy.getDescription(); |
| } |
| return p_description; |
| } |
| |
| /* |
| * (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(); |
| } |
| if (p_text != null) { |
| return p_text; |
| } |
| return ""; |
| } |
| |
| /* |
| * (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; |
| } |
| |
| /** |
| * Check if the contributing bundle is active |
| */ |
| public boolean isBundleActive() { |
| Bundle bundle = Platform.getBundle(element.getDeclaringExtension().getNamespace()); |
| if (bundle != null && bundle.getState() != Bundle.ACTIVE) { |
| return false; |
| } |
| return true; |
| } |
| |
| /* |
| * (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 description) { |
| p_description = description; |
| set_p_description = true; |
| // don't realize class. |
| // realize(); |
| if (proxy != null) { |
| proxy.setDescription(description); |
| } else { |
| dummy.setDescription(description); |
| } |
| } |
| |
| /* |
| * (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, elm.getAttribute(cla)); |
| } |
| } |
| 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, elm.getAttribute(cla)); |
| } |
| } |
| }); |
| } |
| if ((result[0] != null) && (result[0] instanceof IAction)) { |
| return (IAction)result[0]; |
| } |
| return null; |
| } |
| |
| private static void handleCreateExecutableException(final Object[] result, Throwable e, String classname) { |
| Logger.logException("Unable to create proxy action for " + classname, 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) { |
| // 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_description == true) { |
| if (p_description != null) { |
| proxy.setDescription(p_description); |
| } |
| } |
| 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; |
| } |
| } |