/*******************************************************************************
* Copyright (c) 2006-2013 The RCP Company 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:
* The RCP Company - initial API and implementation
*******************************************************************************/
package com.rcpcompany.uibindings.uiAttributes;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.fieldassist.IControlContentAdapter;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Widget;
import com.rcpcompany.uibindings.IUIAttribute;
import com.rcpcompany.uibindings.internal.UIAttributeImpl;
/**
* Abstract base class for all {@link IUIAttribute} implementations. Used to isolate the concreate
* implementations from trivial changes in the interface.
*
* @author Tonny Madsen, The RCP Company
*/
public abstract class AbstractUIAttribute extends UIAttributeImpl {
@Override
public abstract Widget getWidget();
@Override
public IObservableValue getImageValue() {
return null;
}
@Override
public Image getImage() {
final IObservableValue value = getImageValue();
if (value == null) return null;
return (Image) value.getValue();
}
@Override
public abstract IObservableValue getCurrentValue();
@Override
public Cursor getCursor() {
final IObservableValue value = getCursorValue();
if (value == null) return null;
return (Cursor) value.getValue();
}
@Override
public IObservableList getPossibleValuesList() {
return null;
}
@Override
public IObservableList getStyleRangeList() {
return null;
}
@Override
public List<StyleRange> getStyleRanges() {
final IObservableList list = getStyleRangeList();
if (list == null) return null;
return list;
}
@Override
public IObservableValue getMaxValue() {
return null;
}
@Override
public IObservableValue getMinValue() {
return null;
}
@Override
public IObservableValue getTooltipValue() {
return null;
}
@Override
public String getTooltip() {
final IObservableValue value = getTooltipValue();
if (value == null) return null;
return (String) value.getValue();
}
@Override
public IControlContentAdapter getFieldAssistAdapter() {
return null;
}
@Override
public IObservableValue getFontValue() {
return null;
}
@Override
public Font getFont() {
final IObservableValue value = getFontValue();
if (value == null) return null;
return (Font) value.getValue();
}
@Override
public IObservableValue getForegroundValue() {
return null;
}
@Override
public Color getForeground() {
final IObservableValue value = getForegroundValue();
if (value == null) return null;
return (Color) value.getValue();
}
@Override
public IObservableValue getBackgroundValue() {
return null;
}
@Override
public Color getBackground() {
final IObservableValue value = getBackgroundValue();
if (value == null) return null;
return (Color) value.getValue();
}
@Override
public IObservableValue getEnabledValue() {
return null;
}
@Override
public Boolean isEnabled() {
final IObservableValue value = getEnabledValue();
if (value == null) return null;
return (Boolean) value.getValue();
}
private List<IObservable> myObservables = new ArrayList<IObservable>();
/**
* All observable listeners for this object goes via this...
*/
protected IChangeListener[] myListeners = null;
@Override
public void dispose() {
for (final IObservable v : myObservables) {
// IManager.Factory.getManager().stopMonitorObservableDispose(v);
if (myListeners != null) {
for (final IChangeListener myListener : myListeners) {
if (myListener != null) {
v.removeChangeListener(myListener);
}
}
myListeners = null;
}
v.dispose();
}
super.dispose();
myObservables = null;
}
/**
* Adds an observable that must be disposed when this attribute is disposed.
*
* @param observable the observable to dispose
* @return the observable itself
*/
protected final IObservableValue addObservable(IObservableValue observable) {
addObservable((IObservable) observable);
return observable;
}
/**
* Adds an observable that must be disposed when this attribute is disposed.
*
* @param observable the observable to dispose
* @return the observable itself
*/
protected final IObservableList addObservable(IObservableList observable) {
addObservable((IObservable) observable);
return observable;
}
private final void addObservable(IObservable observable) {
myObservables.add(observable);
/*
* Hmm... If we monitor the observable, there is a small problem when the widget is
* disposed. In this case, will the observable be disposed, and the monitor dispose listener
* will be called before the binding has had any changes to remove anything...
*/
// IManager.Factory.getManager().startMonitorObservableDispose(observable, this);
if (myListeners != null) {
for (final IChangeListener myListener : myListeners) {
if (myListener != null) {
observable.addChangeListener(myListener);
}
}
}
}
/**
* Adds the specified change listener to all the observable values of this attribute.
*
* @param listener the listener to add
*/
public void addChangeListener(IChangeListener listener) {
int i = -1;
if (myListeners == null) {
// The standard case is exactly one listener
myListeners = new IChangeListener[1];
i = 0;
} else {
final int l = myListeners.length;
for (int n = 0; n < l; n++) {
if (myListeners[n] == null) {
i = n;
break;
}
}
if (i == -1) {
final IChangeListener[] newListeners = new IChangeListener[l + 2];
System.arraycopy(myListeners, 0, newListeners, 0, l);
myListeners = newListeners;
i = l;
}
}
myListeners[i] = listener;
for (final IObservable o : myObservables) {
o.addChangeListener(listener);
}
}
/**
* Removes the specified change listener from all the observable values of this attribute.
*
* @param listener the listener to remove
*/
public void removeChangeListener(IChangeListener listener) {
if (myListeners == null) return;
for (int n = 0; n < myListeners.length; n++) {
if (myListeners[n] == listener) {
myListeners[n] = null;
break;
}
}
for (final IObservable o : myObservables) {
o.removeChangeListener(listener);
}
}
}