/*******************************************************************************
* Copyright 2005-2007, CHISEL Group, University of Victoria, Victoria, BC, Canada
* and IBM Corporation. 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:
* The Chisel Group, University of Victoria
*******************************************************************************/
package net.sourceforge.tagsea.core.ui.internal;
import java.util.HashSet;
import net.sourceforge.tagsea.TagSEAPlugin;
import net.sourceforge.tagsea.core.internal.ITagSEAPreferences;
import net.sourceforge.tagsea.core.ui.TagSEAView;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.IPageListener;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
* Class responsible for publishing various UI events including opening and closing of views, various
* changes to the filtering mechanisms, etc.
* @author Del Myers
*
*/
public class UIEventModel {
private HashSet<ITagSEAUIListener> listeners;
private WindowListener windowListener;
private IPropertyChangeListener preferenceListener;
private class WindowListener implements IWindowListener {
private IWorkbenchWindow currentWindow;
private PageListener pageListener = new PageListener();
public void windowActivated(IWorkbenchWindow window) {
if (currentWindow != null) {
currentWindow.removePageListener(pageListener);
}
this.currentWindow = window;
if (window.getActivePage() != null) pageListener.pageActivated(window.getActivePage());
window.addPageListener(pageListener);
}
public void windowClosed(IWorkbenchWindow window) {}
public void windowDeactivated(IWorkbenchWindow window) {
if (window == currentWindow) {
currentWindow.removePageListener(pageListener);
currentWindow = null;
}
}
public void windowOpened(IWorkbenchWindow window) {}
/**
*
*/
public void stop() {
if (currentWindow != null) {
currentWindow.removePageListener(pageListener);
currentWindow = null;
pageListener.stop();
}
}
}
private class PageListener implements IPageListener {
IWorkbenchPart part;
IWorkbenchPage currentPage;
IPartListener2 partListener = new PartListener();
/* (non-Javadoc)
* @see org.eclipse.ui.IPageListener#pageActivated(org.eclipse.ui.IWorkbenchPage)
*/
public void pageActivated(IWorkbenchPage page) {
if (currentPage != null) {
currentPage.removePartListener(partListener);
}
this.currentPage = page;
if (page.getActivePartReference() != null) partListener.partActivated(page.getActivePartReference());
page.addPartListener(partListener);
}
public void pageClosed(IWorkbenchPage page) {
if (page == currentPage) {
currentPage.removePartListener(partListener);
currentPage = null;
}
}
public void pageOpened(IWorkbenchPage page) {}
public void stop() {
if (currentPage != null) {
currentPage.removePartListener(partListener);
currentPage = null;
}
}
}
private class PartListener implements IPartListener2 {
private boolean isInterestingView(IWorkbenchPartReference partRef) {
//return TagsView.ID.equals(partRef.getId()) || WaypointView.ID.equals(partRef.getId());
return TagSEAView.ID.equals(partRef.getId());
}
public void partActivated(IWorkbenchPartReference partRef) {
if (isInterestingView(partRef)) {
fireEvent(TagSEAUIEvent.createViewEvent(TagSEAUIEvent.VIEW_ACTIVATED, partRef.getId(), null));
}
}
public void partBroughtToTop(IWorkbenchPartReference partRef) {
if (isInterestingView(partRef)) {
fireEvent(TagSEAUIEvent.createViewEvent(TagSEAUIEvent.VIEW_TOP, partRef.getId(), null));
}
}
public void partClosed(IWorkbenchPartReference partRef) {
if (isInterestingView(partRef)) {
fireEvent(TagSEAUIEvent.createViewEvent(TagSEAUIEvent.VIEW_CLOSED, partRef.getId(), null));
}
}
public void partDeactivated(IWorkbenchPartReference partRef) {
if (isInterestingView(partRef)) {
fireEvent(TagSEAUIEvent.createViewEvent(TagSEAUIEvent.VIEW_DEACTIVATED, partRef.getId(), null));
}
}
public void partHidden(IWorkbenchPartReference partRef) {
if (isInterestingView(partRef)) {
fireEvent(TagSEAUIEvent.createViewEvent(TagSEAUIEvent.VIEW_HIDDEN, partRef.getId(), null));
}
}
public void partInputChanged(IWorkbenchPartReference partRef) {}
public void partOpened(IWorkbenchPartReference partRef) {
if (isInterestingView(partRef)) {
fireEvent(TagSEAUIEvent.createViewEvent(TagSEAUIEvent.VIEW_OPENED, partRef.getId(), null));
}
}
public void partVisible(IWorkbenchPartReference partRef) {}
}
private class PreferenceListener implements IPropertyChangeListener {
public void propertyChange(PropertyChangeEvent event) {
if (ITagSEAPreferences.FILTERED_WAYPOINT_TYPES.equals(event.getProperty())) {
fireEvent(TagSEAUIEvent.createFilterEvent());
} else if (ITagSEAPreferences.TAGS_VIEW_TREE.equals(event.getProperty())) {
fireEvent(TagSEAUIEvent.createViewEvent(TagSEAUIEvent.VIEW_HIERARCHY, TagSEAView.ID, event.getNewValue().toString()));
}
}
}
public UIEventModel() {
listeners = new HashSet<ITagSEAUIListener>();
windowListener = new WindowListener();
preferenceListener = new PreferenceListener();
}
public void addListener(ITagSEAUIListener listener) {
listeners.add(listener);
}
public void removeListener(ITagSEAUIListener listener) {
listeners.remove(listener);
}
public void fireEvent(TagSEAUIEvent event) {
ITagSEAUIListener[] array = listeners.toArray(new ITagSEAUIListener[listeners.size()]);
for (ITagSEAUIListener listener : array) {
listener.eventPerformed(event);
}
}
/**
* Hooks this publisher to the platform ui to listen for view opening/closing and specific preference
* changes for filtering.
*
*/
public void hookToUI() {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
windowListener.windowActivated(window);
}
PlatformUI.getWorkbench().addWindowListener(windowListener);
IPreferenceStore store = TagSEAPlugin.getDefault().getPreferenceStore();
Object tree = store.getString(ITagSEAPreferences.TAGS_VIEW_TREE);
fireEvent(TagSEAUIEvent.createFilterEvent());
fireEvent(TagSEAUIEvent.createViewEvent(TagSEAUIEvent.VIEW_HIERARCHY, TagSEAView.ID, tree.toString()));
store.addPropertyChangeListener(preferenceListener);
}
/**
* Releases all listeners and stops the publishing of events.
*/
public void stop() {
PlatformUI.getWorkbench().removeWindowListener(windowListener);
windowListener.stop();
TagSEAPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(preferenceListener);
}
}