KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jface > internal > databinding > provisional > observable > value > AbstractVetoableValue


1 /*******************************************************************************
2  * Copyright (c) 2005, 2006 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jface.internal.databinding.provisional.observable.value;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.Collection JavaDoc;
15 import java.util.HashSet JavaDoc;
16
17 import org.eclipse.jface.internal.databinding.provisional.observable.Diffs;
18
19 /**
20  * @since 1.0
21  *
22  */

23 public abstract class AbstractVetoableValue extends AbstractObservableValue
24         implements IVetoableValue {
25
26     public void setValue(Object JavaDoc value) {
27         Object JavaDoc currentValue = doGetValue();
28         ValueDiff diff = Diffs.createValueDiff(currentValue, value);
29         boolean okToProceed = fireValueChanging(diff);
30         if (!okToProceed) {
31             throw new ChangeVetoException("Change not permitted"); //$NON-NLS-1$
32
}
33         doSetValue(value);
34         fireValueChange(diff);
35     }
36
37     private Collection JavaDoc valueChangingListeners = null;
38
39     public void addValueChangingListener(IValueChangingListener listener) {
40         if (valueChangingListeners == null) {
41             boolean hadListeners = hasListeners();
42             valueChangingListeners = new ArrayList JavaDoc();
43             valueChangingListeners.add(listener);
44             if (!hadListeners) {
45                 firstListenerAdded();
46             }
47         } else if (valueChangingListeners.size() > 16) {
48             HashSet JavaDoc listenerList = new HashSet JavaDoc();
49             listenerList.addAll(valueChangingListeners);
50             valueChangingListeners = listenerList;
51             valueChangingListeners.add(listener);
52         }
53     }
54
55     public void removeValueChangingListener(IValueChangingListener listener) {
56         valueChangingListeners.remove(listener);
57         if (valueChangingListeners.size() == 0) {
58             valueChangingListeners = null;
59         }
60         if (!hasListeners()) {
61             lastListenerRemoved();
62         }
63     }
64
65     /**
66      * Notifies listeners about a pending change, and returns true if no
67      * listener vetoed the change.
68      *
69      * @param diff
70      * @return false if the change was vetoed, true otherwise
71      */

72     protected boolean fireValueChanging(ValueDiff diff) {
73         if (valueChangingListeners != null) {
74             IValueChangingListener[] listeners = (IValueChangingListener[]) valueChangingListeners
75                     .toArray(new IValueChangingListener[valueChangingListeners
76                             .size()]);
77             for (int i = 0; i < listeners.length; i++) {
78                 boolean okToProceed = listeners[i].handleValueChanging(this,
79                         diff);
80                 if (!okToProceed) {
81                     return false;
82                 }
83             }
84         }
85         return true;
86     }
87
88     protected abstract void doSetValue(Object JavaDoc value);
89
90     protected boolean hasListeners() {
91         return super.hasListeners();
92     }
93
94     public void dispose() {
95         super.dispose();
96     }
97
98 }
99
Popular Tags