blob: fd9121aa91f55cc20b737365586528f81b932f4d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 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.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.internal.misc.UIListenerLogging;
/**
* A part service for a workbench window.
*/
public class WWinPartService implements IPartService {
private PartService partService = new PartService(UIListenerLogging.WINDOW_PARTLISTENER_EVENTS,
UIListenerLogging.WINDOW_PARTLISTENER2_EVENTS);
private WindowSelectionService selectionService;
private IWorkbenchPage activePage;
private class WWinListener implements IPartListener2, IPageChangedListener {
public void partActivated(IWorkbenchPartReference ref) {
updateActivePart();
}
public void partBroughtToTop(IWorkbenchPartReference ref) {
partService.firePartBroughtToTop(ref);
}
public void partClosed(IWorkbenchPartReference ref) {
partService.firePartClosed(ref);
}
public void partDeactivated(IWorkbenchPartReference ref) {
updateActivePart();
}
public void partOpened(IWorkbenchPartReference ref) {
partService.firePartOpened(ref);
}
public void partHidden(IWorkbenchPartReference ref) {
partService.firePartHidden(ref);
}
public void partVisible(IWorkbenchPartReference ref) {
partService.firePartVisible(ref);
}
public void partInputChanged(IWorkbenchPartReference ref) {
partService.firePartInputChanged(ref);
}
public void pageChanged(PageChangedEvent event) {
partService.firePageChanged(event);
}
}
private IPartListener2 partListner = new WWinListener();
/**
* Creates a new part service for a workbench window.
*
* @param window
* the workbench window
*/
public WWinPartService(IWorkbenchWindow window) {
selectionService = new WindowSelectionService(window);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public void addPartListener(IPartListener l) {
partService.addPartListener(l);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public void addPartListener(IPartListener2 l) {
partService.addPartListener(l);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public void removePartListener(IPartListener l) {
partService.removePartListener(l);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public void removePartListener(IPartListener2 l) {
partService.removePartListener(l);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public IWorkbenchPart getActivePart() {
return partService.getActivePart();
}
private void updateActivePart() {
IWorkbenchPartReference activeRef = null;
IWorkbenchPart activePart = null;
if (activePage != null) {
activePart = activePage.getActivePart();
activeRef = activePage.getActivePartReference();
}
selectionService.setActivePart(activePart);
partService.setActivePart(activeRef);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public IWorkbenchPartReference getActivePartReference() {
return partService.getActivePartReference();
}
/*
* Returns the selection service.
*/
ISelectionService getSelectionService() {
return selectionService;
}
/*
* Notifies that a page has been activated.
*/
void pageActivated(IWorkbenchPage newPage) {
// Optimize.
if (newPage == activePage) {
return;
}
// Fire events in the following order:
// 1. For each open part in the new page, open it and then (if applicable) make it visible
// 2. Deactivate old active part
// 3. Activate the new active part
// 4. For each open part in the old page, make it invisible then close it
// Hook listener on the new page.
if (newPage != null) {
IWorkbenchPartReference[] refs = ((WorkbenchPage)newPage).getOpenParts();
for (int i = 0; i < refs.length; i++) {
IWorkbenchPartReference reference = refs[i];
partService.firePartOpened(reference);
IWorkbenchPart part = reference.getPart(false);
if (part != null && newPage.isPartVisible(part)) {
partService.firePartVisible(reference);
}
}
partService.setActivePart(newPage.getActivePartReference());
selectionService.setActivePart(newPage.getActivePart());
} else {
partService.setActivePart(null);
selectionService.setActivePart(null);
}
// Unhook listener from the old page.
reset();
// Update active page.
activePage = newPage;
if (newPage != null) {
newPage.addPartListener(partListner);
}
}
/*
* Notifies that a page has been closed
*/
void pageClosed(IWorkbenchPage page) {
// Unhook listener from the old page.
if (page == activePage) {
reset();
}
}
/*
* Notifies that a page has been opened.
*/
void pageOpened(IWorkbenchPage page) {
pageActivated(page);
}
/*
* Resets the part service. The active page, part and selection are
* dereferenced.
*/
private void reset() {
IWorkbenchPage tempPage = activePage;
activePage = null;
if (tempPage != null) {
WorkbenchPage page = (WorkbenchPage)tempPage;
IWorkbenchPartReference[] refs = page.getOpenParts();
for (int i = 0; i < refs.length; i++) {
IWorkbenchPartReference reference = refs[i];
if (page.isPartVisible(reference)) {
partService.firePartHidden(reference);
}
partService.firePartClosed(reference);
}
tempPage.removePartListener(partListner);
}
}
}