blob: ae34c17296d71eefd38bb8e3d5e76c07abdcd923 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2006 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.ui.internal;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveListener;
import org.eclipse.ui.IPluginContribution;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.activities.IIdentifier;
import org.eclipse.ui.activities.IIdentifierListener;
import org.eclipse.ui.activities.IWorkbenchActivitySupport;
import org.eclipse.ui.activities.IdentifierEvent;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.views.IViewDescriptor;
/**
* Helper methods that the internal layout classes (<code>PageLayout</code> and
* <code>FolderLayout</code>) utilize for activities support and view creation.
*
* @since 3.0
*/
class LayoutHelper {
/**
* Not intended to be instantiated.
*/
private LayoutHelper() {
//no-op
}
/**
* Creates a series of listeners that will activate the provided view on the
* provided page layout when <code>IIdenfier</code> enablement changes. The
* rules for this activation are as follows: <p>
* <ul>
* <li> if the identifier becomes enabled and the perspective of the page
* layout is the currently active perspective in its window, then activate
* the views immediately.
* <li> if the identifier becomes enabled and the perspective of the page
* layout is not the currently active perspecitve in its window, then add an
* <code>IPerspectiveListener</code> to the window and activate the views
* when the perspective becomes active.
*
* @param pageLayout <code>PageLayout</code>.
* @param viewId the view id to activate upon <code>IIdentifier</code> enablement.
*/
public static final void addViewActivator(PageLayout pageLayout,
final String viewId) {
if (viewId == null) {
return;
}
ViewFactory viewFactory = pageLayout.getViewFactory();
final IWorkbenchPage partPage = viewFactory.getWorkbenchPage();
if (partPage == null) {
return;
}
final IPerspectiveDescriptor partPerspective = pageLayout
.getDescriptor();
IWorkbenchActivitySupport support = PlatformUI.getWorkbench()
.getActivitySupport();
IViewDescriptor descriptor = viewFactory.getViewRegistry().find(viewId);
if (!(descriptor instanceof IPluginContribution)) {
return;
}
IIdentifier identifier = support.getActivityManager().getIdentifier(
WorkbenchActivityHelper
.createUnifiedId((IPluginContribution) descriptor));
identifier.addIdentifierListener(new IIdentifierListener() {
/* (non-Javadoc)
* @see org.eclipse.ui.activities.IIdentifierListener#identifierChanged(org.eclipse.ui.activities.IdentifierEvent)
*/
public void identifierChanged(IdentifierEvent identifierEvent) {
if (identifierEvent.hasEnabledChanged()) {
IIdentifier thisIdentifier = identifierEvent
.getIdentifier();
if (thisIdentifier.isEnabled()) {
// show view
thisIdentifier.removeIdentifierListener(this);
IWorkbenchPage activePage = partPage
.getWorkbenchWindow().getActivePage();
if (partPage == activePage
&& partPerspective == activePage
.getPerspective()) {
// show immediately.
try {
partPage.showView(viewId);
} catch (PartInitException e) {
WorkbenchPlugin.log(getClass(), "identifierChanged", e); //$NON-NLS-1$
}
} else { // show when the perspective becomes active
partPage.getWorkbenchWindow()
.addPerspectiveListener(
new IPerspectiveListener() {
/* (non-Javadoc)
* @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
*/
public void perspectiveActivated(
IWorkbenchPage page,
IPerspectiveDescriptor newPerspective) {
if (partPerspective == newPerspective) {
partPage
.getWorkbenchWindow()
.removePerspectiveListener(
this);
try {
page
.showView(viewId);
} catch (PartInitException e) {
WorkbenchPlugin.log(getClass(), "perspectiveActivated", e); //$NON-NLS-1$
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
*/
public void perspectiveChanged(
IWorkbenchPage page,
IPerspectiveDescriptor perspective,
String changeId) {
// no-op
}
});
}
}
}
}
});
}
/**
* Create the view. If it's already been been created in the provided
* factory, return the shared instance.
*
* @param factory the <code>ViewFactory</code> to use.
* @param viewID the view id to use.
* @return the new <code>ViewPane</code>.
* @throws PartInitException thrown if there is a problem creating the view.
*/
public static final ViewPane createView(ViewFactory factory, String viewId)
throws PartInitException {
WorkbenchPartReference ref = (WorkbenchPartReference) factory
.createView(ViewFactory.extractPrimaryId(viewId), ViewFactory
.extractSecondaryId(viewId));
ViewPane newPart = (ViewPane) ref.getPane();
return newPart;
}
}