/*******************************************************************************
* 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;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.internal.misc.UIListenerLogging;
public class PartService implements IPartService {
private static Point ZERO = new Point(0,0);
private PartListenerList listeners = new PartListenerList();
private PartListenerList2 listeners2 = new PartListenerList2();
private IWorkbenchPartReference activePart = null;
private String debugListenersKey;
private String debugListeners2Key;
public PartService(String debugListenersKey, String debugListeners2Key) {
this.debugListeners2Key = debugListeners2Key;
this.debugListenersKey = debugListenersKey;
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public void addPartListener(IPartListener l) {
listeners.addPartListener(l);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public void addPartListener(IPartListener2 l) {
listeners2.addPartListener(l);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public void removePartListener(IPartListener l) {
listeners.removePartListener(l);
}
/*
* (non-Javadoc)
* Method declared on IPartService
*/
public void removePartListener(IPartListener2 l) {
listeners2.removePartListener(l);
}
private abstract class PartListener implements Listener {
IWorkbenchPartReference ref;
public PartListener(IWorkbenchPartReference ref) {
this.ref = ref;
}
public void handleEvent(Event event) {
if (event.type == SWT.Resize || event.type == SWT.Show
|| event.type == SWT.Activate) {
Control control = (Control) event.widget;
if (!control.isDisposed() && !control.getSize().equals(ZERO)
&& control.isVisible()) {
removeMe(event);
fire();
}
} else if (event.type == SWT.Dispose) {
removeMe(event);
}
}
private void removeMe(Event event) {
event.widget.removeListener(SWT.Resize, this);
event.widget.removeListener(SWT.Show, this);
event.widget.removeListener(SWT.Dispose, this);
// this is a "safety" event
event.widget.removeListener(SWT.Activate, this);
}
abstract void fire();
}
private class PartActivated extends PartListener {
public PartActivated(IWorkbenchPartReference ref) {
super(ref);
}
void fire() {
firePartActivated(ref);
}
}
private class PartVisible extends PartListener {
public PartVisible(IWorkbenchPartReference ref) {
super(ref);
}
void fire() {
firePartVisible(ref);
}
}
private class PartTop extends PartListener {
public PartTop(IWorkbenchPartReference ref) {
super(ref);
}
void fire() {
firePartBroughtToTop(ref);
}
}
private Control deferControl(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
if (part != null) {
Control control = ((PartSite) part.getSite()).getPane()
.getControl();
if (control != null && !control.isDisposed()
&& (!control.isVisible() || control.getSize().equals(ZERO))) {
return control;
}
}
return null;
}
/**
* @param ref
*/
private void firePartActivated(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
if (part != null) {
Control control = deferControl(ref);
if (control!=null) {
addControlListener(control, new PartActivated(ref));
return;
}
UIListenerLogging.logPartListenerEvent(debugListenersKey, this,
part, UIListenerLogging.PE_ACTIVATED);
listeners.firePartActivated(part);
}
UIListenerLogging.logPartListener2Event(debugListeners2Key, this, ref, UIListenerLogging.PE2_ACTIVATED);
listeners2.firePartActivated(ref);
}
private void addControlListener(Control control, PartListener listener) {
control.addListener(SWT.Resize, listener);
control.addListener(SWT.Show, listener);
control.addListener(SWT.Activate, listener);
control.addListener(SWT.Dispose, listener);
}
/**
* @param ref
*/
public void firePartBroughtToTop(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
if (part != null) {
Control control = deferControl(ref);
if (control!=null) {
addControlListener(control, new PartTop(ref));
return;
}
UIListenerLogging.logPartListenerEvent(debugListenersKey, this,
part, UIListenerLogging.PE_PART_BROUGHT_TO_TOP);
listeners.firePartBroughtToTop(part);
}
UIListenerLogging.logPartListener2Event(debugListeners2Key, this, ref, UIListenerLogging.PE2_PART_BROUGHT_TO_TOP);
listeners2.firePartBroughtToTop(ref);
}
/**
* @param ref
*/
public void firePartClosed(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
if(part != null) {
UIListenerLogging.logPartListenerEvent(debugListenersKey, this, part, UIListenerLogging.PE_PART_CLOSED);
listeners.firePartClosed(part);
}
UIListenerLogging.logPartListener2Event(debugListeners2Key, this, ref, UIListenerLogging.PE2_PART_CLOSED);
listeners2.firePartClosed(ref);
}
/**
* @param ref
*/
private void firePartDeactivated(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
if(part != null) {
UIListenerLogging.logPartListenerEvent(debugListenersKey, this, part, UIListenerLogging.PE_PART_DEACTIVATED);
listeners.firePartDeactivated(part);
}
UIListenerLogging.logPartListener2Event(debugListeners2Key, this, ref, UIListenerLogging.PE2_PART_DEACTIVATED);
listeners2.firePartDeactivated(ref);
}
public void firePartVisible(IWorkbenchPartReference ref) {
Control control = deferControl(ref);
if (control!=null) {
addControlListener(control, new PartVisible(ref));
return;
}
UIListenerLogging.logPartListener2Event(debugListeners2Key, this, ref, UIListenerLogging.PE2_PART_VISIBLE);
listeners2.firePartVisible(ref);
}
public void firePartHidden(IWorkbenchPartReference ref) {
UIListenerLogging.logPartListener2Event(debugListeners2Key, this, ref, UIListenerLogging.PE2_PART_HIDDEN);
listeners2.firePartHidden(ref);
}
public void firePartInputChanged(IWorkbenchPartReference ref) {
UIListenerLogging.logPartListener2Event(debugListeners2Key, this, ref, UIListenerLogging.PE2_PART_INPUT_CHANGED);
listeners2.firePartInputChanged(ref);
}
/**
* @param ref
*/
public void firePartOpened(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
if(part != null) {
UIListenerLogging.logPartListenerEvent(debugListenersKey, this, part, UIListenerLogging.PE_PART_OPENED);
listeners.firePartOpened(part);
}
UIListenerLogging.logPartListener2Event(debugListeners2Key, this, ref, UIListenerLogging.PE2_PART_OPENED);
listeners2.firePartOpened(ref);
}
public IWorkbenchPart getActivePart() {
return activePart == null ? null : activePart.getPart(false);
}
public IWorkbenchPartReference getActivePartReference() {
return activePart;
}
public void setActivePart(IWorkbenchPartReference ref) {
IWorkbenchPartReference oldRef = activePart;
// Filter out redundant activation events
if (oldRef == ref) {
return;
}
if (oldRef != null) {
firePartDeactivated(oldRef);
}
activePart = ref;
if (ref != null) {
firePartActivated(ref);
}
}
}