KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jface > internal > databinding > internal > beans > JavaBeanObservableMultiMapping


1 /*******************************************************************************
2  * Copyright (c) 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
12 package org.eclipse.jface.internal.databinding.internal.beans;
13
14 import java.beans.PropertyChangeListener JavaDoc;
15 import java.beans.PropertyDescriptor JavaDoc;
16 import java.util.Collections JavaDoc;
17 import java.util.Set JavaDoc;
18
19 import org.eclipse.core.runtime.IStatus;
20 import org.eclipse.core.runtime.Status;
21 import org.eclipse.jface.internal.databinding.provisional.observable.IObservableCollection;
22 import org.eclipse.jface.internal.databinding.provisional.observable.mapping.MappingDiff;
23 import org.eclipse.jface.internal.databinding.provisional.observable.mapping.ObservableMultiMappingWithDomain;
24 import org.eclipse.jface.util.Assert;
25 import org.eclipse.jface.util.Policy;
26
27 /**
28  * @since 1.0
29  *
30  */

31 public class JavaBeanObservableMultiMapping extends
32         ObservableMultiMappingWithDomain {
33
34     private final PropertyDescriptor JavaDoc[] propertyDescriptors;
35
36     private PropertyChangeListener JavaDoc elementListener = new PropertyChangeListener JavaDoc() {
37         public void propertyChange(final java.beans.PropertyChangeEvent JavaDoc event) {
38             if (!updating) {
39                 for (int i = 0; i < propertyDescriptors.length; i++) {
40                     if (propertyDescriptors[i].getName().equals(
41                             event.getPropertyName())) {
42                         final int[] indices = new int[] { i };
43                         final Set JavaDoc elements = Collections.singleton(event
44                                 .getSource());
45                         fireMappingValueChange(new MappingDiff() {
46                             public Set JavaDoc getElements() {
47                                 return elements;
48                             }
49
50                             public int[] getAffectedIndices() {
51                                 return indices;
52                             }
53
54                             public Object JavaDoc[] getOldMappingValues(Object JavaDoc element,
55                                     int[] indices) {
56                                 return new Object JavaDoc[] { event.getOldValue() };
57                             }
58
59                             public Object JavaDoc[] getNewMappingValues(Object JavaDoc element,
60                                     int[] indices) {
61                                 return new Object JavaDoc[] { event.getNewValue() };
62                             }
63                         });
64                     }
65                 }
66             }
67         }
68     };
69
70     private ListenerSupport listenerSupport = new ListenerSupport(
71             elementListener);
72
73     private boolean updating = false;
74
75     /**
76      * @param domain
77      * @param propertyDescriptors
78      */

79     public JavaBeanObservableMultiMapping(IObservableCollection domain,
80             PropertyDescriptor JavaDoc[] propertyDescriptors) {
81         this.propertyDescriptors = propertyDescriptors;
82         for (int i = 0; i < propertyDescriptors.length; i++) {
83             Assert.isTrue(propertyDescriptors[i]!=null);
84         }
85         initDomain(domain);
86     }
87
88     protected void addListenerTo(Object JavaDoc domainElement) {
89         listenerSupport.hookListener(domainElement);
90     }
91
92     protected void removeListenerFrom(Object JavaDoc domainElement) {
93         listenerSupport.unhookListener(domainElement);
94     }
95
96     private Object JavaDoc doGetMappingValue(Object JavaDoc element,
97             PropertyDescriptor JavaDoc propertyDescriptor) {
98         try {
99             return propertyDescriptor.getReadMethod().invoke(element,
100                     new Object JavaDoc[0]);
101         } catch (Exception JavaDoc e) {
102             Policy.getLog().log(
103                     new Status(IStatus.ERROR, Policy.JFACE, IStatus.ERROR,
104                             "cannot get value", e)); //$NON-NLS-1$
105
}
106         return null;
107     }
108
109     public void setMappingValues(Object JavaDoc element, int[] indices, Object JavaDoc[] values) {
110         for (int i = 0; i < indices.length; i++) {
111             setMappingValue(element, propertyDescriptors[indices[i]], values[i]);
112         }
113     }
114
115     private void setMappingValue(Object JavaDoc element,
116             PropertyDescriptor JavaDoc propertyDescriptor, Object JavaDoc value) {
117         try {
118             propertyDescriptor.getWriteMethod().invoke(element,
119                     new Object JavaDoc[] { value });
120         } catch (Exception JavaDoc e) {
121             Policy.getLog().log(
122                     new Status(IStatus.ERROR, Policy.JFACE, IStatus.ERROR,
123                             "cannot set value", e)); //$NON-NLS-1$
124
}
125     }
126
127     protected Object JavaDoc[] doGetMappingValues(Object JavaDoc element, int[] indices) {
128         Object JavaDoc[] result = new Object JavaDoc[indices.length];
129         for (int i = 0; i < result.length; i++) {
130             if(indices[i] < propertyDescriptors.length) {
131                 result[i] = doGetMappingValue(element,
132                         propertyDescriptors[indices[i]]);
133             } else {
134                 result[i] = null;
135             }
136         }
137         return result;
138     }
139
140     public Object JavaDoc[] getValueTypes() {
141         Class JavaDoc[] result = new Class JavaDoc[propertyDescriptors.length];
142         for (int i = 0; i < result.length; i++) {
143             result[i] = propertyDescriptors[i].getPropertyType();
144         }
145         return result;
146     }
147
148 }
149
Popular Tags