/*******************************************************************************
* Copyright (c) 2003, 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
*******************************************************************************/
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;
}
}