/*******************************************************************************
 * Copyright (c) 2003, 2010 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
 *******************************************************************************/
package org.eclipse.gef.ui.views.palette;

import org.eclipse.swt.widgets.Composite;

import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.IPageBookViewPage;
import org.eclipse.ui.part.MessagePage;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.PageBookView;

import org.eclipse.gef.internal.GEFMessages;

/**
 * The GEF palette view
 * 
 * @author Pratik Shah
 * @since 3.0
 */
public class PaletteView extends PageBookView {

	private boolean viewInPage = true;

	/**
	 * The ID for this view. This is the same as the String used to register
	 * this view with the platform's extension point.
	 */
	public static final String ID = "org.eclipse.gef.ui.palette_view"; //$NON-NLS-1$

	private IPerspectiveListener perspectiveListener = new IPerspectiveListener() {
		public void perspectiveChanged(IWorkbenchPage page,
				IPerspectiveDescriptor perspective, String changeId) {
		}

		// fix for bug 109245 and 69098 - fake a partActivated when the
		// perpsective is switched
		public void perspectiveActivated(IWorkbenchPage page,
				IPerspectiveDescriptor perspective) {
			viewInPage = page.findViewReference(ID) != null;
			// getBootstrapPart could return null; but isImportant() can handle
			// null
			partActivated(getBootstrapPart());
		}
	};

	/**
	 * Creates a default page saying that a palette is not available.
	 * 
	 * @see org.eclipse.ui.part.PageBookView#createDefaultPage(org.eclipse.ui.part.PageBook)
	 */
	protected IPage createDefaultPage(PageBook book) {
		MessagePage page = new MessagePage();
		initPage(page);
		page.createControl(book);
		page.setMessage(GEFMessages.Palette_Not_Available);
		return page;
	}

	/**
	 * Add a perspective listener so the palette view can be updated when the
	 * perspective is switched.
	 * 
	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
	 */
	public void createPartControl(Composite parent) {
		super.createPartControl(parent);
		getSite().getPage().getWorkbenchWindow()
				.addPerspectiveListener(perspectiveListener);
	}

	/**
	 * Remove the perspective listener.
	 * 
	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
	 */
	public void dispose() {
		getSite().getPage().getWorkbenchWindow()
				.removePerspectiveListener(perspectiveListener);
		super.dispose();
	}

	/**
	 * @see org.eclipse.ui.part.PageBookView#doCreatePage(org.eclipse.ui.IWorkbenchPart)
	 */
	protected PageRec doCreatePage(IWorkbenchPart part) {
		// Try to get a custom palette page
		Object obj = part.getAdapter(PalettePage.class);

		if (obj != null && obj instanceof IPage) {
			IPage page = (IPage) obj;
			page.createControl(getPageBook());
			initPage((IPageBookViewPage) page);
			return new PageRec(part, page);
		}
		// Use the default page by returning null
		return null;
	}

	/**
	 * @see PageBookView#doDestroyPage(org.eclipse.ui.IWorkbenchPart,
	 *      org.eclipse.ui.part.PageBookView.PageRec)
	 */
	protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
		rec.page.dispose();
	}

	/**
	 * The view shows the palette associated with the active editor.
	 * 
	 * @see PageBookView#getBootstrapPart()
	 */
	protected IWorkbenchPart getBootstrapPart() {
		IWorkbenchPage page = getSite().getPage();
		if (page != null)
			return page.getActiveEditor();
		return null;
	}

	/**
	 * Only editors in the same perspective as the view are important.
	 * 
	 * @see PageBookView#isImportant(org.eclipse.ui.IWorkbenchPart)
	 */
	protected boolean isImportant(IWorkbenchPart part) {
		// Workaround for Bug# 69098 -- This should be removed when/if Bug#
		// 70510 is fixed
		// We only want a palette page to be created when this view is visible
		// in the current
		// perspective, i.e., when both this view and the given editor are on
		// the same page.
		return viewInPage && part instanceof IEditorPart;
	}

}
