comparison org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateListStrategy.d @ 78:0a55d2d5a946

Added file for databinding
author Frank Benoit <benoit@tionex.de>
date Tue, 14 Apr 2009 11:35:29 +0200
parents
children 383ce7bd736b
comparison
equal deleted inserted replaced
76:f05e6e8b2f2d 78:0a55d2d5a946
1 /*******************************************************************************
2 * Copyright (c) 2007, 2008 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 * Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
11 *******************************************************************************/
12
13 module org.eclipse.core.databinding.UpdateListStrategy;
14
15 import java.lang.all;
16
17 import org.eclipse.core.databinding.conversion.IConverter;
18 import org.eclipse.core.databinding.observable.list.IObservableList;
19 import org.eclipse.core.databinding.validation.ValidationStatus;
20 import org.eclipse.core.internal.databinding.BindingMessages;
21 import org.eclipse.core.runtime.IStatus;
22 import org.eclipse.core.runtime.Status;
23
24 /**
25 * Customizes a {@link Binding} between two
26 * {@link IObservableList observable lists}. The following behaviors can be
27 * customized via the strategy:
28 * <ul>
29 * <li>Conversion</li>
30 * <li>Automatic processing</li>
31 * </ul>
32 * <p>
33 * Conversion:<br/> When elements are added they can be
34 * {@link #convertcast(Object) converted} to the destination element type.
35 * </p>
36 * <p>
37 * Automatic processing:<br/> The processing to perform when the source
38 * observable changes. This behavior is configured via policies provided on
39 * construction of the strategy (e.g. {@link #POLICY_NEVER},
40 * {@link #POLICY_ON_REQUEST}, {@link #POLICY_UPDATE}).
41 * </p>
42 *
43 *
44 * @see DataBindingContext#bindList(IObservableList, IObservableList,
45 * UpdateListStrategy, UpdateListStrategy)
46 * @see IConverter
47 * @since 1.0
48 */
49 public class UpdateListStrategy : UpdateStrategy {
50
51 /**
52 * Policy constant denoting that the source observable's state should not be
53 * tracked and that the destination observable's state should never be
54 * updated.
55 */
56 public static int POLICY_NEVER = notInlined(1);
57
58 /**
59 * Policy constant denoting that the source observable's state should not be
60 * tracked, but that conversion and updating the destination observable's
61 * state should be performed when explicitly requested.
62 */
63 public static int POLICY_ON_REQUEST = notInlined(2);
64
65 /**
66 * Policy constant denoting that the source observable's state should be
67 * tracked, and that conversion and updating the destination observable's
68 * state should be performed automatically on every change of the source
69 * observable state.
70 */
71 public static int POLICY_UPDATE = notInlined(8);
72
73 /**
74 * Helper method allowing API evolution of the above constant values. The
75 * compiler will not inline constant values into client code if values are
76 * "computed" using this helper.
77 *
78 * @param i
79 * an integer
80 * @return the same integer
81 */
82 private static int notInlined(int i) {
83 return i;
84 }
85
86 protected IConverter converter;
87
88 private int updatePolicy;
89
90 protected bool provideDefaults;
91
92 /**
93 * Creates a new update list strategy for automatically updating the
94 * destination observable list whenever the source observable list changes.
95 * A default converter will be provided. The defaults can be changed by
96 * calling one of the setter methods.
97 */
98 public this() {
99 this(true, POLICY_UPDATE);
100 }
101
102 /**
103 * Creates a new update list strategy with a configurable update policy. A
104 * default converter will be provided. The defaults can be changed by
105 * calling one of the setter methods.
106 *
107 * @param updatePolicy
108 * one of {@link #POLICY_NEVER}, {@link #POLICY_ON_REQUEST}, or
109 * {@link #POLICY_UPDATE}
110 */
111 public this(int updatePolicy) {
112 this(true, updatePolicy);
113 }
114
115 /**
116 * Creates a new update list strategy with a configurable update policy. A
117 * default converter will be provided if <code>provideDefaults</code> is
118 * <code>true</code>. The defaults can be changed by calling one of the
119 * setter methods.
120 *
121 * @param provideDefaults
122 * if <code>true</code>, default validators and a default
123 * converter will be provided based on the observable list's
124 * type.
125 * @param updatePolicy
126 * one of {@link #POLICY_NEVER}, {@link #POLICY_ON_REQUEST}, or
127 * {@link #POLICY_UPDATE}
128 */
129 public this(bool provideDefaults, int updatePolicy) {
130 this.provideDefaults = provideDefaults;
131 this.updatePolicy = updatePolicy;
132 }
133
134 /**
135 * When an element is added to the destination converts the element from the
136 * source element type to the destination element type.
137 * <p>
138 * Default implementation will use the
139 * {@link #setConvertercast(IConverter) converter} if one exists. If no
140 * converter exists no conversion occurs.
141 * </p>
142 *
143 * @param element
144 * @return the converted element
145 */
146 public Object convert(Object element) {
147 return converter is null ? element : converter.convert(element);
148 }
149
150 /**
151 *
152 * @param source
153 * @param destination
154 */
155 protected void fillDefaults(IObservableList source,
156 IObservableList destination) {
157 Object sourceType = source.getElementType();
158 Object destinationType = destination.getElementType();
159 if (provideDefaults && sourceType !is null && destinationType !is null) {
160 if (converter is null) {
161 setConverter(createConverter(sourceType, destinationType));
162 }
163 }
164 if (converter !is null) {
165 if (sourceType !is null) {
166 checkAssignable(converter.getFromType(), sourceType,
167 "converter does not convert from type " + sourceType); //$NON-NLS-1$
168 }
169 if (destinationType !is null) {
170 checkAssignable(converter.getToType(), destinationType,
171 "converter does not convert to type " + destinationType); //$NON-NLS-1$
172 }
173 }
174 }
175
176 /**
177 * @return the update policy
178 */
179 public int getUpdatePolicy() {
180 return updatePolicy;
181 }
182
183 /**
184 * Sets the converter to be invoked when converting added elements from the
185 * source element type to the destination element type.
186 *
187 * @param converter
188 * @return the receiver, to enable method call chaining
189 */
190 public UpdateListStrategy setConverter(IConverter converter) {
191 this.converter = converter;
192 return this;
193 }
194
195 /**
196 * Adds the given element at the given index to the given observable list.
197 * Clients may extend but must call the super implementation.
198 *
199 * @param observableList
200 * @param element
201 * @param index
202 * @return a status
203 */
204 protected IStatus doAdd(IObservableList observableList, Object element,
205 int index) {
206 try {
207 observableList.add(index, element);
208 } catch (Exception ex) {
209 return ValidationStatus.error(BindingMessages
210 .getStringcast(BindingMessages.VALUEBINDING_ERROR_WHILE_SETTING_VALUE),
211 ex);
212 }
213 return Status.OK_STATUS;
214 }
215
216 /**
217 * Removes the element at the given index from the given observable list.
218 * Clients may extend but must call the super implementation.
219 *
220 * @param observableList
221 * @param index
222 * @return a status
223 */
224 protected IStatus doRemove(IObservableList observableList, int index) {
225 try {
226 observableList.remove(index);
227 } catch (Exception ex) {
228 return ValidationStatus.error(BindingMessages
229 .getStringcast(BindingMessages.VALUEBINDING_ERROR_WHILE_SETTING_VALUE),
230 ex);
231 }
232 return Status.OK_STATUS;
233 }
234 }