blob: 0f94dbc89f88c69ffd87c60bda60c14006fbba18 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 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.services;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.ui.AbstractSourceProvider;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.internal.util.Util;
/**
* Provides notifications when the active part changes.
*
* @since 3.1
*/
public class ActivePartSourceProvider extends AbstractSourceProvider {
/**
* The names of the sources supported by this source provider.
*/
private static final String[] PROVIDED_SOURCE_NAMES = new String[] {
ISources.ACTIVE_EDITOR_ID_NAME, ISources.ACTIVE_EDITOR_NAME,
ISources.ACTIVE_PART_ID_NAME, ISources.ACTIVE_PART_NAME,
ISources.ACTIVE_SITE_NAME };
/**
* The last active editor part seen as active by this provider. This value
* may be <code>null</code> if there is no currently active editor.
*/
private IEditorPart lastActiveEditor = null;
/**
* The last active editor id seen as active by this provider. This value may
* be <code>null</code> if there is no currently active editor.
*/
private String lastActiveEditorId = null;
/**
* The last active part seen as active by this provider. This value may be
* <code>null</code> if there is no currently active part.
*/
private IWorkbenchPart lastActivePart = null;
/**
* The last active part id seen as active by this provider. This value may
* be <code>null</code> if there is no currently active part.
*/
private String lastActivePartId = null;
/**
* The last active part site seen by this provider. This value may be
* <code>null</code> if there is no currently active site.
*/
private IWorkbenchPartSite lastActivePartSite = null;
private final IPartListener partListener = new IPartListener() {
public final void partActivated(final IWorkbenchPart part) {
checkActivePart();
}
public final void partBroughtToTop(final IWorkbenchPart part) {
checkActivePart();
}
public final void partClosed(final IWorkbenchPart part) {
checkActivePart();
}
public final void partDeactivated(final IWorkbenchPart part) {
checkActivePart();
}
public final void partOpened(final IWorkbenchPart part) {
checkActivePart();
}
};
private final IWindowListener windowListener = new IWindowListener() {
public final void windowActivated(final IWorkbenchWindow window) {
checkActivePart();
}
public final void windowClosed(final IWorkbenchWindow window) {
if (window != null) {
window.getPartService().removePartListener(partListener);
}
checkActivePart();
}
public final void windowDeactivated(final IWorkbenchWindow window) {
checkActivePart();
}
public final void windowOpened(final IWorkbenchWindow window) {
if (window != null) {
window.getPartService().addPartListener(partListener);
}
checkActivePart();
}
};
/**
* The workbench on which this source provider will act.
*/
private final IWorkbench workbench;
/**
* Constructs a new instance of <code>ShellSourceProvider</code>.
*
* @param workbench
* The workbench on which to monitor shell activations; must not
* be <code>null</code>.
*/
public ActivePartSourceProvider(final IWorkbench workbench) {
this.workbench = workbench;
workbench.addWindowListener(windowListener);
}
private final void checkActivePart() {
final Map currentState = getCurrentState();
int sources = 0;
// Figure out what was changed.
final Object newActivePart = currentState
.get(ISources.ACTIVE_PART_NAME);
if (!Util.equals(newActivePart, lastActivePart)) {
sources |= ISources.ACTIVE_PART;
lastActivePart = (IWorkbenchPart) newActivePart;
}
final Object newActivePartId = currentState
.get(ISources.ACTIVE_PART_ID_NAME);
if (!Util.equals(newActivePartId, lastActivePartId)) {
sources |= ISources.ACTIVE_PART_ID;
lastActivePartId = (String) newActivePartId;
}
final Object newActivePartSite = currentState
.get(ISources.ACTIVE_SITE_NAME);
if (!Util.equals(newActivePartSite, lastActivePartSite)) {
sources |= ISources.ACTIVE_SITE;
lastActivePartSite = (IWorkbenchPartSite) newActivePartSite;
}
final Object newActiveEditor = currentState
.get(ISources.ACTIVE_EDITOR_NAME);
if (!Util.equals(newActiveEditor, lastActiveEditor)) {
sources |= ISources.ACTIVE_EDITOR;
lastActiveEditor = (IEditorPart) newActiveEditor;
}
final Object newActiveEditorId = currentState
.get(ISources.ACTIVE_EDITOR_ID_NAME);
if (!Util.equals(newActiveEditorId, lastActiveEditorId)) {
sources |= ISources.ACTIVE_EDITOR_ID;
lastActiveEditorId = (String) newActiveEditorId;
}
// Fire the event, if something has changed.
if (sources != 0) {
if (DEBUG) {
if ((sources & ISources.ACTIVE_PART) != 0) {
logDebuggingInfo("Active part changed to " //$NON-NLS-1$
+ lastActivePart);
}
if ((sources & ISources.ACTIVE_PART_ID) != 0) {
logDebuggingInfo("Active part id changed to " //$NON-NLS-1$
+ lastActivePartId);
}
if ((sources & ISources.ACTIVE_SITE) != 0) {
logDebuggingInfo("Active site changed to " //$NON-NLS-1$
+ lastActivePartSite);
}
if ((sources & ISources.ACTIVE_EDITOR) != 0) {
logDebuggingInfo("Active editor changed to " //$NON-NLS-1$
+ lastActiveEditor);
}
if ((sources & ISources.ACTIVE_EDITOR_ID) != 0) {
logDebuggingInfo("Active editor id changed to " //$NON-NLS-1$
+ lastActiveEditorId);
}
}
fireSourceChanged(sources, currentState);
}
}
public final void dispose() {
workbench.removeWindowListener(windowListener);
}
public final Map getCurrentState() {
final Map currentState = new HashMap(7);
currentState.put(ISources.ACTIVE_SITE_NAME, null);
currentState.put(ISources.ACTIVE_PART_NAME, null);
currentState.put(ISources.ACTIVE_PART_ID_NAME, null);
currentState.put(ISources.ACTIVE_EDITOR_NAME, null);
currentState.put(ISources.ACTIVE_EDITOR_ID_NAME, null);
final IWorkbenchWindow activeWorkbenchWindow = workbench
.getActiveWorkbenchWindow();
if (activeWorkbenchWindow != null) {
final IWorkbenchPage activeWorkbenchPage = activeWorkbenchWindow
.getActivePage();
if (activeWorkbenchPage != null) {
// Check the active workbench part.
final IWorkbenchPart newActivePart = activeWorkbenchPage
.getActivePart();
currentState.put(ISources.ACTIVE_PART_NAME, newActivePart);
if (newActivePart != null) {
final IWorkbenchPartSite activeWorkbenchPartSite = newActivePart
.getSite();
currentState.put(ISources.ACTIVE_SITE_NAME,
activeWorkbenchPartSite);
if (activeWorkbenchPartSite != null) {
final String newActivePartId = activeWorkbenchPartSite
.getId();
currentState.put(ISources.ACTIVE_PART_ID_NAME,
newActivePartId);
}
}
// Check the active editor part.
final IEditorPart newActiveEditor = activeWorkbenchPage
.getActiveEditor();
currentState.put(ISources.ACTIVE_EDITOR_NAME, newActiveEditor);
if (newActiveEditor != null) {
final IEditorSite activeEditorSite = newActiveEditor
.getEditorSite();
if (activeEditorSite != null) {
final String newActiveEditorId = activeEditorSite
.getId();
currentState.put(ISources.ACTIVE_EDITOR_ID_NAME,
newActiveEditorId);
}
}
}
}
return currentState;
}
public final String[] getProvidedSourceNames() {
return PROVIDED_SOURCE_NAMES;
}
}