blob: eb05385ec6d654e892602492b063541836b66343 [file] [log] [blame]
package org.eclipse.ui.internal.databinding;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.property.value.ValueProperty;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbenchPartReference;
/**
* A property for observing the active {@link IWorkbenchPartReference} of a
* {@link IPartService}.
*
* @param <S> the source type
*/
public class ActivePartProperty<S extends IPartService> extends ValueProperty<S, IWorkbenchPartReference> {
@Override
public Object getValueType() {
return IWorkbenchPartReference.class;
}
@Override
protected IWorkbenchPartReference doGetValue(S source) {
return source.getActivePartReference();
}
@Override
protected void doSetValue(S source, IWorkbenchPartReference value) {
throw new UnsupportedOperationException();
}
@Override
public IObservableValue<IWorkbenchPartReference> observe(Realm realm, S source) {
return new ListeningValue<>(realm) {
private final IPartListener2 listener = new IPartListener2() {
@Override
public void partActivated(IWorkbenchPartReference partRef) {
protectedSetValue(partRef);
}
@Override
public void partDeactivated(IWorkbenchPartReference partRef) {
if (partRef == doGetValue()) {
protectedSetValue(null);
}
}
};
@Override
protected void startListening() {
source.addPartListener(listener);
}
@Override
protected void stopListening() {
source.removePartListener(listener);
}
@Override
protected IWorkbenchPartReference calculate() {
return ActivePartProperty.this.getValue(source);
}
@Override
public Object getValueType() {
return ActivePartProperty.this.getValueType();
}
};
}
}