trace/tracebuilder/com.nokia.tracebuilder.eclipse/src/com/nokia/tracebuilder/eclipse/WorkbenchListener.java
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 24 Aug 2010 14:01:48 +0300
changeset 16 72f198be1c1d
parent 10 ed1c9f64298a
permissions -rw-r--r--
Crash Analyser Carbide Extension 1.4.0

/*
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
* Workbench listener
*
*/
package com.nokia.tracebuilder.eclipse;

import java.util.ArrayList;
import java.util.Iterator;

import org.eclipse.core.resources.IFile;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPageListener;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.ITextEditor;

import com.nokia.tracebuilder.file.FileUtils;

/**
 * Workbench listener
 * 
 */
final class WorkbenchListener implements IWindowListener, IPageListener,
		IPartListener2 {

	/**
	 * List of open windows
	 */
	private ArrayList<IWorkbenchWindow> windowList = new ArrayList<IWorkbenchWindow>();

	/**
	 * Callback for editor notifications
	 */
	private WorkbenchListenerCallback callback;

	/**
	 * Constructor
	 * 
	 * @param callback
	 *            callback for editor notifications
	 */
	WorkbenchListener(WorkbenchListenerCallback callback) {
		this.callback = callback;
	}

	/**
	 * Starts this listener
	 */
	void startListener() {
		PlatformUI.getWorkbench().addWindowListener(this);
		IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
				.getWorkbenchWindows();
		for (IWorkbenchWindow element : windows) {
			windowOpened(element);
		}
	}

	/**
	 * Stops this listener
	 */
	void stopListener() {
		Iterator<IWorkbenchWindow> itr;
		do {
			itr = windowList.iterator();
			if (itr.hasNext()) {
				windowClosed(itr.next());
			}
		} while (itr.hasNext());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IWindowListener#
	 *      windowActivated(org.eclipse.ui.IWorkbenchWindow)
	 */
	public void windowActivated(IWorkbenchWindow window) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IWindowListener#
	 *      windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
	 */
	public void windowDeactivated(IWorkbenchWindow window) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IWindowListener#
	 *      windowClosed(org.eclipse.ui.IWorkbenchWindow)
	 */
	public void windowClosed(IWorkbenchWindow window) {
		window.removePageListener(this);
		windowList.remove(window);
		IWorkbenchPage[] pages = window.getPages();
		for (IWorkbenchPage element : pages) {
			pageClosed(element);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IWindowListener#
	 *      windowOpened(org.eclipse.ui.IWorkbenchWindow)
	 */
	public void windowOpened(IWorkbenchWindow window) {
		boolean found = false;
		for (int j = 0; j < windowList.size(); j++) {
			if (windowList.get(j) == window) {
				found = true;
			}
		}
		if (!found) {
			window.addPageListener(this);
			IWorkbenchPage[] pages = window.getPages();
			for (IWorkbenchPage element : pages) {
				pageOpened(element);
			}
			windowList.add(window);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPageListener#pageActivated(org.eclipse.ui.IWorkbenchPage)
	 */
	public void pageActivated(IWorkbenchPage page) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPageListener#pageClosed(org.eclipse.ui.IWorkbenchPage)
	 */
	public void pageClosed(IWorkbenchPage page) {
		page.removePartListener(this);
		IEditorReference[] editors = page.getEditorReferences();
		for (IEditorReference element : editors) {
			partClosed(element);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPageListener#pageOpened(org.eclipse.ui.IWorkbenchPage)
	 */
	public void pageOpened(IWorkbenchPage page) {
		page.addPartListener(this);
		IEditorReference[] references = page.getEditorReferences();
		for (IEditorReference element : references) {
			partOpened(element);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
	 */
	public void partOpened(IWorkbenchPartReference partRef) {
		IFile file = WorkbenchUtils.getEditorFile(partRef);
		if (file != null && FileUtils.isFileAllowed(file.getName())) {
			callback.editorOpened((ITextEditor) ((IEditorReference) partRef)
					.getEditor(false), file);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
	 */
	public void partClosed(IWorkbenchPartReference partRef) {
		if (partRef != null) {
			IFile file = WorkbenchUtils.getEditorFile(partRef);

			if (partRef instanceof IEditorReference) {
				IEditorPart editorPart = ((IEditorReference) partRef)
						.getEditor(false);
				// Check that editorPart is instance of ITextEditor
				if (editorPart instanceof ITextEditor) {
					// Variable file might be null, but it does not matter. So
					// null check is not needed.
					callback.editorClosed((ITextEditor) editorPart, file);
				}
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
	 */
	public void partActivated(IWorkbenchPartReference partRef) {
		IFile file = WorkbenchUtils.getEditorFile(partRef);
		if (file != null && FileUtils.isFileAllowed(file.getName())) {
			callback.editorActivated((ITextEditor) ((IEditorReference) partRef)
					.getEditor(false), file);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
	 */
	public void partDeactivated(IWorkbenchPartReference partRef) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
	 */
	public void partInputChanged(IWorkbenchPartReference partRef) {
		IFile file = WorkbenchUtils.getEditorFile(partRef);
		if (file != null && FileUtils.isFileAllowed(file.getName())) {
			callback.editorReplaced((ITextEditor) ((IEditorReference) partRef)
					.getEditor(false), file);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
	 */
	public void partBroughtToTop(IWorkbenchPartReference partRef) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
	 */
	public void partVisible(IWorkbenchPartReference partRef) {
		IFile file = WorkbenchUtils.getEditorFile(partRef);
		if (file != null && FileUtils.isFileAllowed(file.getName())) {
			callback.editorVisible((ITextEditor) ((IEditorReference) partRef)
					.getEditor(false), file);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
	 */
	public void partHidden(IWorkbenchPartReference partRef) {
		IFile file = WorkbenchUtils.getEditorFile(partRef);
		if (file != null && FileUtils.isFileAllowed(file.getName())) {
			callback.editorHidden((ITextEditor) ((IEditorReference) partRef)
					.getEditor(false), file);
		}
	}

}