/*******************************************************************************
 * 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;

import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.sse.ui.extension.IExtendedEditorAction;
import org.eclipse.wst.sse.ui.extension.IExtendedSimpleEditor;
import org.eclipse.wst.sse.ui.extension.SpellCheckProviderBuilder;
import org.eclipse.wst.sse.ui.extensions.ISelfValidateEditAction;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckAction;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckProvider;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckTarget;
import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;
import org.eclipse.wst.sse.ui.nls.ResourceHandler;


/**
 * Spell Check action
 */
public class SpellCheckActionWrapper extends Action implements IExtendedEditorAction, ISelfValidateEditAction, IPartListener {
	protected SpellCheckAction action = null;
	protected IWorkbenchPart activePart = null;

	protected IExtendedSimpleEditor fEditor = null;
	protected SpellCheckProvider provider = null;

	public SpellCheckActionWrapper() {
		super();

		IPartService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService();
		service.addPartListener(this);
		partActivated(service.getActivePart());

		//TODO DBK performance modification - change to delegate
		//     DBK There appears to only be one extender, and it doesn't specify
		//     DBK the icon / text -- it is determined by the target action.
		//     DBK This forces this plug-in to load the provider plug-in solely
		//     DBK to ask it what to display. Since presumably this is static,
		//     DBK I've moved it to here. Alternatively, you can comment out
		//     DBK the setInitializationData method, add the appropriate
		// interface,
		//     DBK and then extract the values from the extension itself (again,
		//     DBK thereby avoiding the load of the provider plug-in).
		//		setId("com.ibm.etools.spellcheck");
		//		setActionDefinitionId("com.ibm.etools.spellcheck");

		IPluginDescriptor localDescriptor = Platform.getPluginRegistry().getPluginDescriptor(EditorPlugin.ID);
		setText(localDescriptor.getResourceString("%Spell_Check_label")); //$NON-NLS-1$
		setToolTipText(localDescriptor.getResourceString("%Spell_Check_tooltip")); //$NON-NLS-1$

		setImageDescriptor(EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_CTOOL16_SPELLCHECK));
		setDisabledImageDescriptor(EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_DTOOL16_SPELLCHECK));
		setHoverImageDescriptor(EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_ETOOL16_SPELLCHECK));
	}

	private Display getDisplay() {

		return PlatformUI.getWorkbench().getDisplay();
	}

	private void initializeSpellCheckProviderAction() {
		//     DBK performance modification - There is only one extender, yet
		// there is a loop?
		//     DBK No references to multiple providers in run() method either.
		//     DBK I suggest reworking this to be a single-point extension.
		SpellCheckProvider[] providers = SpellCheckProviderBuilder.getInstance().getSpellCheckProviders();
		final int n = providers.length;
		for (int i = 0; i < n; i++) {
			action = providers[i].createSpellCheckAction();
		}
		update();

		//		TODO DBK performance modification - copied into this plug-in, this
		// is now unnecessary code
		//		if (action == null) return;
		//		IAction a = (IAction)action;
		//		
		//		setText(a.getText());
		//		setToolTipText(a.getToolTipText());
		//		setImageDescriptor(a.getImageDescriptor());
		//		setHoverImageDescriptor(a.getHoverImageDescriptor());
		//		setDisabledImageDescriptor(a.getDisabledImageDescriptor());
	}

	/**
	 * @see com.ibm.sed.edit.extension.IExtendedEditorAction#isVisible()
	 */
	public boolean isVisible() {
		if (fEditor == null)
			return true;

		IEditorPart part = fEditor.getEditorPart();
		if (part == null)
			return true;

		String cls = part.getClass().getName();
		if ("com.ibm.etools.webedit.editor.HTMLEditor".equals(cls)) //$NON-NLS-1$
			return false;

		Object target = part.getAdapter(SpellCheckTarget.class);
		return (target != null);
	}

	public void partActivated(IWorkbenchPart part) {
		IExtendedSimpleEditor editor = null;
		if (part != null && part != activePart) {
			if (part instanceof IExtendedSimpleEditor)
				editor = (IExtendedSimpleEditor) part;
			else if (part.getAdapter(IExtendedSimpleEditor.class) != null)
				editor = (IExtendedSimpleEditor) part.getAdapter(IExtendedSimpleEditor.class);
			else if (part.getAdapter(ITextEditor.class) instanceof IExtendedSimpleEditor)
				editor = (IExtendedSimpleEditor) part.getAdapter(ITextEditor.class);
		}
		this.activePart = part;
		setActiveExtendedEditor(editor);
		// lock onto the first valid editor part
		if (editor != null) {
			IPartService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService();
			service.removePartListener(this);
		}
		update();
	}

	public void partBroughtToTop(IWorkbenchPart part) {
		// do nothing
	}

	public void partClosed(IWorkbenchPart part) {
		if (part == null || part == fEditor) {
			setActiveExtendedEditor(null);
			update();
		}
	}

	public void partDeactivated(IWorkbenchPart part) {
		// do nothing
	}

	public void partOpened(IWorkbenchPart part) {
		// do nothing
	}

	public void run() {
		if (action == null)
			initializeSpellCheckProviderAction();
		if (action == null || !isEnabled()) {
			MessageDialog.openInformation(getDisplay().getActiveShell(), ResourceHandler.getString("Information"), //$NON-NLS-1$
						ResourceHandler.getString("PluginAction.operationNotAvailableMessage")); //$NON-NLS-1$
			setEnabled(false);
			return;
		}
		IAction a = (IAction) action;
		a.run();
	}

	/**
	 * @see com.ibm.sed.edit.extension.IExtendedEditorAction#setActiveExtendedEditor(IExtendedSimpleEditor)
	 */
	public void setActiveExtendedEditor(IExtendedSimpleEditor targetEditor) {
		fEditor = targetEditor;
	}

	public void update() {
		if (fEditor == null) {
			setEnabled(false);
			return;
		}

		if (action != null) {
			action.update();
			setEnabled(((IAction) action).isEnabled());
			return;
		}

		// Default is true since action isn't instantiated until run();
		// a second test is done later to see if the action is **really**
		// ready.
		setEnabled(true);
	}

}
