/*******************************************************************************
 * Copyright (c) 2001, 2005 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.views.contentoutline;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.TransferDragSourceListener;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateAction;
import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateActionContributionItem;
import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper;
import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages;

/**
 * Basic Configuration class for Outline Pages
 * 
 * @since 1.0
 */
public abstract class ContentOutlineConfiguration {
	/**
	 * Add a collapse action to help with navigation.
	 */
	private class CollapseTreeAction extends Action {
		private TreeViewer fTreeViewer = null;

		public CollapseTreeAction(TreeViewer viewer) {
			super(SSEUIMessages.ContentOutlineConfiguration_0, AS_PUSH_BUTTON); //$NON-NLS-1$
			setImageDescriptor(COLLAPSE_E);
			setDisabledImageDescriptor(COLLAPSE_D);
			setToolTipText(getText());
			fTreeViewer = viewer;
		}

		public void run() {
			super.run();
			fTreeViewer.collapseAll();
		}
	}

	/**
	 * Toggles whether incoming selection notification affects us
	 */
	private class ToggleLinkAction extends PropertyChangeUpdateAction {
		public ToggleLinkAction(IPreferenceStore store, String preference) {
			super(SSEUIMessages.ContentOutlineConfiguration_1, store, preference, true); //$NON-NLS-1$
			setToolTipText(getText());
			setDisabledImageDescriptor(SYNCED_D);
			setImageDescriptor(SYNCED_E);
			update();
		}

		public void update() {
			super.update();
			setLinkWithEditor(isChecked());
		}
	}

	ImageDescriptor COLLAPSE_D = EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_DLCL_COLLAPSEALL);
	ImageDescriptor COLLAPSE_E = EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_ELCL_COLLAPSEALL);

	private boolean fIsLinkWithEditor = false;

	private ILabelProvider fLabelProvider;
	private IContributionItem[] fMenuContributions = null;
	private IContributionItem[] fToolbarContributions = null;
	private final String OUTLINE_LINK_PREF = "outline-link-editor"; //$NON-NLS-1$
	ImageDescriptor SYNCED_D = EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_DLCL_SYNCED);
	ImageDescriptor SYNCED_E = EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_ELCL_SYNCED);

	/**
	 * Create new instance of ContentOutlineConfiguration
	 */
	public ContentOutlineConfiguration() {
		// Must have empty constructor to createExecutableExtension
		super();
	}

	/**
	 * Creates the contributions for the view's local menu. Subclasses should
	 * merge their contributions with these.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return menu contributions
	 */
	protected IContributionItem[] createMenuContributions(TreeViewer viewer) {
		IContributionItem toggleLinkItem = new PropertyChangeUpdateActionContributionItem(new ToggleLinkAction(getPreferenceStore(), OUTLINE_LINK_PREF));
		IContributionItem[] items = new IContributionItem[]{toggleLinkItem};
		return items;
	}

	/**
	 * Creates the toolbar contributions. Subclasses should merge their
	 * contributions with these.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return toolbar contributions
	 */
	protected IContributionItem[] createToolbarContributions(TreeViewer viewer) {
		IContributionItem collapseAllItem = new ActionContributionItem(new CollapseTreeAction(viewer));
		IContributionItem[] items = new IContributionItem[]{collapseAllItem};
		return items;
	}

	/**
	 * Returns the ContentProvider to use with the given viewer.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return the IContentProvider to use with this viewer
	 */
	public abstract IContentProvider getContentProvider(TreeViewer viewer);

	/**
	 * Returns an array of KeyListeners to attach to the given viewer's
	 * control or null.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return an array of KeyListeners to attach to the TreeViewer's Control,
	 *         or null. The listeners should adhere to the KeyEvent.doit field
	 *         to ensure proper behaviors. Ordering of the event notifications
	 *         is dependent on the Control in the TreeViewer.
	 */
	public KeyListener[] getKeyListeners(TreeViewer viewer) {
		return null;
	}

	/**
	 * Returns the LabelProvider for the items within the given viewer.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return the ILabelProvider for items within the viewer
	 */
	public ILabelProvider getLabelProvider(TreeViewer viewer) {
		if (fLabelProvider == null)
			fLabelProvider = new LabelProvider();
		return fLabelProvider;
	}

	/**
	 * Returns the menu contribution items for the local menu in the outline.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return IContributionItem[] for the local menu
	 */
	public final IContributionItem[] getMenuContributions(TreeViewer viewer) {
		if (fMenuContributions == null) {
			fMenuContributions = createMenuContributions(viewer);
		}
		return fMenuContributions;
	}

	/**
	 * Returns the menu listener to notify when the given viewer's context
	 * menu is about to be shown or null.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return the IMenuListener to notify when the viewer's context menu is
	 *         about to be shown, or null
	 */
	public IMenuListener getMenuListener(TreeViewer viewer) {
		return null;
	}

	/**
	 * Returns the PreferenceStore to use for this configuration.
	 * 
	 * @return the preference store in which to remember preferences (such as
	 *         the link-with-editor toggle state)
	 */
	protected IPreferenceStore getPreferenceStore() {
		return SSEUIPlugin.getInstance().getPreferenceStore();
	}

	/**
	 * Returns the (filtered) selection from the given selection.
	 * 
	 * @param selection
	 *            model selection
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return The (filtered) selection from this event. Uses include mapping
	 *         model selection onto elements provided by the content provider.
	 *         Should only return elements that will be shown in the Tree
	 *         Control.
	 */
	public ISelection getSelection(TreeViewer viewer, ISelection selection) {
		return selection;
	}

	/**
	 * @since 2.0
	 * @param treeViewer
	 * @return a label provider providing the status line contents
	 */
	public ILabelProvider getStatusLineLabelProvider(TreeViewer treeViewer) {
		return null;
	}

	/**
	 * Returns contribution items for the local toolbar in the outline.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 * @return IContributionItem[] for the local toolbar
	 */
	public final IContributionItem[] getToolbarContributions(TreeViewer viewer) {
		if (fToolbarContributions == null) {
			fToolbarContributions = createToolbarContributions(viewer);
		}
		return fToolbarContributions;
	}

	/**
	 * Adopted since you can't easily removeDragSupport from
	 * StructuredViewers.
	 * 
	 * @param treeViewer
	 *            the TreeViewer associated with this configuration
	 * @return an array of TransferDragSourceListeners
	 */
	public TransferDragSourceListener[] getTransferDragSourceListeners(TreeViewer treeViewer) {
		return new TransferDragSourceListener[0];
	}

	/**
	 * Adopted since you can't easily removeDropSupport from
	 * StructuredViewers.
	 * 
	 * @param treeViewer
	 *            the TreeViewer associated with this configuration
	 * @return an array of TransferDropTargetListeners
	 */
	public TransferDropTargetListener[] getTransferDropTargetListeners(TreeViewer treeViewer) {
		return new TransferDropTargetListener[0];
	}

	/**
	 * Returns true if node selection changes affect selection in the
	 * TreeViewer.
	 * 
	 * @param treeViewer
	 *            the TreeViewer associated with this configuration
	 * @return true if outline is currently linked to selection in editor,
	 *         false otherwise
	 */
	public boolean isLinkedWithEditor(TreeViewer treeViewer) {
		return fIsLinkWithEditor;
	}

	/**
	 * Sets whether or not outline view should be linked with selection in
	 * editor.
	 * 
	 * @param isLinkWithEditor
	 *            The isLinkWithEditor to set.
	 */
	void setLinkWithEditor(boolean isLinkWithEditor) {
		fIsLinkWithEditor = isLinkWithEditor;
	}

	/**
	 * General hook for resource releasing and listener removal when
	 * configurations change or the viewer is disposed of. This implementation
	 * stops of any remaining PropertyChangeUpdateActionContributionItem from
	 * preference listening.
	 * 
	 * @param viewer
	 *            the TreeViewer associated with this configuration
	 */
	public void unconfigure(TreeViewer viewer) {
		if (fToolbarContributions != null) {
			for (int i = 0; i < fToolbarContributions.length; i++) {
				if (fToolbarContributions[i] instanceof PropertyChangeUpdateActionContributionItem) {
					((PropertyChangeUpdateActionContributionItem) fToolbarContributions[i]).disconnect();
				}
			}
			fToolbarContributions = null;
		}
		if (fMenuContributions != null) {
			for (int i = 0; i < fMenuContributions.length; i++) {
				if (fMenuContributions[i] instanceof PropertyChangeUpdateActionContributionItem) {
					((PropertyChangeUpdateActionContributionItem) fMenuContributions[i]).disconnect();
				}
			}
			fMenuContributions = null;
		}
	}
}
