blob: 738223d113b09322236e4088c8ee64c90bced4f6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 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.ui.internal;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;
import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.internal.intro.IIntroConstants;
import org.eclipse.ui.internal.intro.IntroDescriptor;
import org.eclipse.ui.internal.intro.IntroMessages;
import org.eclipse.ui.intro.IIntroManager;
import org.eclipse.ui.intro.IIntroPart;
/**
* Workbench implementation of the IIntroManager interface.
*
* @since 3.0
*/
public class WorkbenchIntroManager implements IIntroManager {
private final Workbench workbench;
/**
* Create a new instance of the receiver.
*
* @param workbench the workbench instance
*/
WorkbenchIntroManager(Workbench workbench) {
this.workbench = workbench;
workbench.getExtensionTracker().registerHandler(new IExtensionChangeHandler(){
/* (non-Javadoc)
* @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker, org.eclipse.core.runtime.IExtension)
*/
public void addExtension(IExtensionTracker tracker,IExtension extension) {
//Do nothing
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#removeExtension(org.eclipse.core.runtime.IExtension, java.lang.Object[])
*/
public void removeExtension(IExtension source, Object[] objects) {
for (int i = 0; i < objects.length; i++) {
if (objects[i] instanceof IIntroPart) {
closeIntro((IIntroPart) objects[i]);
}
}
}}, null);
}
/**
* The currently active introPart in this workspace, <code>null</code> if none.
*/
private IIntroPart introPart;
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbench#closeIntro(org.eclipse.ui.intro.IIntroPart)
*/
public boolean closeIntro(IIntroPart part) {
if (introPart == null || !introPart.equals(part)) {
return false;
}
IViewPart introView = getViewIntroAdapterPart();
if (introView != null) {
//assumption is that there is only ever one intro per workbench
//if we ever support one per window then this will need revisiting
IWorkbenchPage page = introView.getSite().getPage();
IViewReference reference = page
.findViewReference(IIntroConstants.INTRO_VIEW_ID);
page.hideView(introView);
if (reference == null || reference.getPart(false) == null) {
introPart = null;
return true;
}
return false;
}
// if there is no part then null our reference
introPart = null;
return true;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbench#showIntro(org.eclipse.ui.IWorkbenchWindow)
*/
public IIntroPart showIntro(IWorkbenchWindow preferredWindow,
boolean standby) {
if (preferredWindow == null) {
preferredWindow = this.workbench.getActiveWorkbenchWindow();
}
if (preferredWindow == null) {
return null;
}
ViewIntroAdapterPart viewPart = getViewIntroAdapterPart();
if (viewPart == null) {
createIntro(preferredWindow);
} else {
try {
IWorkbenchPage page = viewPart.getSite().getPage();
IWorkbenchWindow window = page.getWorkbenchWindow();
if (!window.equals(preferredWindow)) {
window.getShell().setActive();
}
page.showView(IIntroConstants.INTRO_VIEW_ID);
} catch (PartInitException e) {
WorkbenchPlugin
.log(
"Could not open intro", new Status(IStatus.ERROR, WorkbenchPlugin.PI_WORKBENCH, IStatus.ERROR, "Could not open intro", e)); //$NON-NLS-1$ //$NON-NLS-2$
}
}
setIntroStandby(introPart, standby);
return introPart;
}
/**
* @param testWindow the window to test
* @return whether the intro exists in the given window
*/
/*package*/boolean isIntroInWindow(IWorkbenchWindow testWindow) {
ViewIntroAdapterPart viewPart = getViewIntroAdapterPart();
if (viewPart == null) {
return false;
}
IWorkbenchWindow window = viewPart.getSite().getWorkbenchWindow();
if (window.equals(testWindow)) {
return true;
}
return false;
}
/**
* Create a new Intro area (a view, currently) in the provided window. If there is no intro
* descriptor for this workbench then no work is done.
*
* @param preferredWindow the window to create the intro in.
*/
private void createIntro(IWorkbenchWindow preferredWindow) {
if (this.workbench.getIntroDescriptor() == null) {
return;
}
IWorkbenchPage workbenchPage = preferredWindow.getActivePage();
if (workbenchPage == null) {
return;
}
try {
workbenchPage.showView(IIntroConstants.INTRO_VIEW_ID);
} catch (PartInitException e) {
WorkbenchPlugin
.log(
IntroMessages.Intro_could_not_create_part, new Status(IStatus.ERROR, WorkbenchPlugin.PI_WORKBENCH, IStatus.ERROR, IntroMessages.Intro_could_not_create_part, e));
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbench#setIntroStandby(org.eclipse.ui.intro.IIntroPart, boolean)
*/
public void setIntroStandby(IIntroPart part, boolean standby) {
if (introPart == null || !introPart.equals(part)) {
return;
}
ViewIntroAdapterPart viewIntroAdapterPart = getViewIntroAdapterPart();
if (viewIntroAdapterPart == null) {
return;
}
PartPane pane = ((PartSite) viewIntroAdapterPart.getSite()).getPane();
if (standby == !pane.isZoomed()) {
// the zoom state is already correct - just update the part's state.
viewIntroAdapterPart.setStandby(standby);
return;
}
viewIntroAdapterPart.getSite().getPage().toggleZoom(
pane.getPartReference());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IWorkbench#isIntroStandby(org.eclipse.ui.intro.IIntroPart)
*/
public boolean isIntroStandby(IIntroPart part) {
if (introPart == null || !introPart.equals(part)) {
return false;
}
ViewIntroAdapterPart viewIntroAdapterPart = getViewIntroAdapterPart();
if (viewIntroAdapterPart == null) {
return false;
}
return !((PartSite) viewIntroAdapterPart.getSite()).getPane()
.isZoomed();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbench#findIntro()
*/
public IIntroPart getIntro() {
return introPart;
}
/**
* @return the <code>ViewIntroAdapterPart</code> for this workbench, <code>null</code> if it
* cannot be found.
*/
/*package*/ViewIntroAdapterPart getViewIntroAdapterPart() {
IWorkbenchWindow[] windows = this.workbench.getWorkbenchWindows();
for (int i = 0; i < windows.length; i++) {
IWorkbenchWindow window = windows[i];
WorkbenchPage page = (WorkbenchPage) window.getActivePage();
if (page == null) {
continue;
}
IPerspectiveDescriptor[] perspDescs = page.getOpenPerspectives();
for (int j = 0; j < perspDescs.length; j++) {
IPerspectiveDescriptor descriptor = perspDescs[j];
IViewReference reference = page.findPerspective(descriptor)
.findView(IIntroConstants.INTRO_VIEW_ID);
if (reference != null) {
IViewPart part = reference.getView(false);
if (part != null && part instanceof ViewIntroAdapterPart) {
return (ViewIntroAdapterPart) part;
}
}
}
}
return null;
}
/**
* @return a new IIntroPart. This has the side effect of setting the introPart field to the new
* value.
*/
/*package*/IIntroPart createNewIntroPart() throws CoreException {
IntroDescriptor introDescriptor = workbench.getIntroDescriptor();
introPart = introDescriptor == null ? null
: introDescriptor.createIntro();
if (introPart != null) {
workbench.getExtensionTracker().registerObject(
introDescriptor.getConfigurationElement()
.getDeclaringExtension(), introPart,
IExtensionTracker.REF_WEAK);
}
return introPart;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbench#hasIntro()
*/
public boolean hasIntro() {
return workbench.getIntroDescriptor() != null;
}
}