View Javadoc

1   /**********************************************
2    * Copyright (C) 2011 Lukas Laag
3    * This file is part of svgreal.
4    * 
5    * svgreal is free software: you can redistribute it and/or modify
6    * it under the terms of the GNU General Public License as published by
7    * the Free Software Foundation, either version 3 of the License, or
8    * (at your option) any later version.
9    * 
10   * svgreal is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   * 
15   * You should have received a copy of the GNU General Public License
16   * along with svgreal.  If not, see http://www.gnu.org/licenses/
17   **********************************************/
18  package org.vectomatic.svg.edit.client.gxt.binding;
19  
20  import org.vectomatic.svg.edit.client.gxt.form.CssContainer;
21  import org.vectomatic.svg.edit.client.gxt.form.DashArrayField;
22  import org.vectomatic.svg.edit.client.gxt.form.FloatSliderField;
23  import org.vectomatic.svg.edit.client.gxt.form.ImageHrefField;
24  import org.vectomatic.svg.edit.client.gxt.form.PaintField;
25  import org.vectomatic.svg.edit.client.gxt.form.ResetButtonField;
26  import org.vectomatic.svg.edit.client.gxt.form.SVGLengthField;
27  import org.vectomatic.svg.edit.client.gxt.form.ToggleGroupField;
28  import org.vectomatic.svg.edit.client.gxt.widget.SpinnerFieldExt;
29  import org.vectomatic.svg.edit.client.model.CssMetadata;
30  import org.vectomatic.svg.edit.client.model.IFieldFactory;
31  import org.vectomatic.svg.edit.client.model.IMetadata;
32  import org.vectomatic.svg.edit.client.model.svg.ComboStore;
33  
34  import com.extjs.gxt.ui.client.binding.FieldBinding;
35  import com.extjs.gxt.ui.client.binding.FormBinding;
36  import com.extjs.gxt.ui.client.binding.SimpleComboBoxFieldBinding;
37  import com.extjs.gxt.ui.client.binding.TimeFieldBinding;
38  import com.extjs.gxt.ui.client.data.ModelData;
39  import com.extjs.gxt.ui.client.util.Format;
40  import com.extjs.gxt.ui.client.widget.Component;
41  import com.extjs.gxt.ui.client.widget.form.CheckBox;
42  import com.extjs.gxt.ui.client.widget.form.ComboBox;
43  import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
44  import com.extjs.gxt.ui.client.widget.form.Field;
45  import com.extjs.gxt.ui.client.widget.form.FormPanel;
46  import com.extjs.gxt.ui.client.widget.form.NumberField;
47  import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
48  import com.extjs.gxt.ui.client.widget.form.TextArea;
49  import com.extjs.gxt.ui.client.widget.form.TextField;
50  import com.extjs.gxt.ui.client.widget.form.TimeField;
51  import com.google.gwt.core.client.GWT;
52  import com.google.gwt.i18n.client.NumberFormat;
53  import com.google.gwt.user.client.ui.AbstractImagePrototype;
54  
55  /**
56   * Util class to operate on GXT forms
57   * @author laaglu
58   */
59  public class FormPanelUtils {
60  
61  	public static void createFieldBindings(FormPanel formPanel, FormBinding formBinding) {
62  		GWT.log("Field count: " + formPanel.getFields().size());
63  		for (Field<?> f : formPanel.getFields()) {
64  			if (formBinding.getBinding(f) == null) {
65  				String name = f.getName();
66  				if (name != null && name.length() > 0) {
67  					FieldBinding b = null;
68  					if (f instanceof SimpleComboBox) {
69  						b = new SimpleComboBoxFieldBinding((SimpleComboBox)f, f.getName());
70  					} else if (f instanceof SVGLengthField) {
71  						b = new SVGLengthFieldBinding((SVGLengthField)f, f.getName());
72  					} else if (f instanceof FloatSliderField) {
73  						b = new FloatSliderFieldBinding((FloatSliderField)f, f.getName());
74  					} else if (f instanceof PaintField) {
75  						b = new PaintFieldBinding((PaintField)f, f.getName());
76  					} else if (f instanceof ResetButtonField) {
77  						b = new ResetButtonBinding((ResetButtonField)f, f.getName());
78  					} else if (f instanceof TimeField) {
79  						b = new TimeFieldBinding((TimeField)f, f.getName());
80  					} else if (f instanceof SpinnerFieldExt) {
81  						b = new SpinnerFieldExtBinding((SpinnerFieldExt)f, f.getName());
82  					} else if (f instanceof DashArrayField) {
83  						b = new DashArrayFieldBinding((DashArrayField)f, f.getName());
84  					} else if (f instanceof ImageHrefField) {
85  						b = new ImageHrefFieldBinding((ImageHrefField)f, f.getName());
86  					} else {
87  						b = new FieldBinding(f, f.getName());
88  					}
89  					GWT.log("field: " + f.getName() + " -> " + b.getClass().getName());
90  					formBinding.addFieldBinding(b);
91  				}
92  			}
93  		}
94  	}
95  	
96  	public static final IFieldFactory TEXTFIELD_FACTORY = new IFieldFactory() {
97  		@Override
98  		public Component createField(IMetadata<?, ?> metadata) {
99  			TextField<String> textField = new TextField<String>();
100 			textField.setName(metadata.getName());
101 			textField.setFieldLabel(Format.capitalize(metadata.getDescription()));
102 			return textField;
103 		}
104 	};
105 
106 	public static final IFieldFactory TEXTAREA_FACTORY = new IFieldFactory() {
107 		@Override
108 		public Component createField(IMetadata<?, ?> metadata) {
109 			TextArea textArea = new TextArea();
110 			textArea.setName(metadata.getName());
111 			textArea.setFieldLabel(Format.capitalize(metadata.getDescription()));
112 			return textArea;
113 		}
114 	};
115 
116 	public static final IFieldFactory CHECKBOX_FACTORY = new IFieldFactory() {
117 		@Override
118 		public Component createField(IMetadata<?, ?> metadata) {
119 			CheckBox checkBox = new CheckBox();
120 			checkBox.setName(metadata.getName());
121 			checkBox.setBoxLabel(Format.capitalize(metadata.getDescription()));
122 			return checkBox;
123 		}
124 	};
125 	
126 	public static final IFieldFactory NUMBER_FIELD_FACTORY = new IFieldFactory() {
127 		@Override
128 		public Component createField(IMetadata<?, ?> metadata) {
129 		    NumberField valueField = new NumberField();
130 		    valueField.setName(metadata.getName());
131 		    valueField.setFieldLabel(Format.capitalize(metadata.getDescription()));
132 		    valueField.setPropertyEditorType(Float.class);
133 			return valueField;
134 		}
135 	};
136 
137 	public static final IFieldFactory SVGLENGTH_FIELD_FACTORY = new IFieldFactory() {
138 		@Override
139 		public Component createField(IMetadata<?, ?> metadata) {
140 			SVGLengthField field = new SVGLengthField(-Float.MAX_VALUE, Float.MAX_VALUE, 1f);
141 			field.setFieldLabel(Format.capitalize(metadata.getDescription()));
142 			field.setName(metadata.getName());
143 			return field;
144 		}
145 	};
146 	
147 	public static final class SvgLengthFieldFactory implements IFieldFactory {
148 		private float min;
149 		private float max;
150 		private float increment;
151 		public SvgLengthFieldFactory() {
152 			this(0f, 50f, 1f);
153 		}
154 		public SvgLengthFieldFactory(float min, float max, float increment) {
155 			this.min = min;
156 			this.max = max;
157 			this.increment = increment;
158 		}
159 		@Override
160 		public Component createField(IMetadata<?, ?> metadata) {
161 			return new CssContainer((CssMetadata<?>)metadata, new SVGLengthField(min, max, increment));
162 		}
163 	};
164 	
165 	public static final IFieldFactory SVGPAINT_FIELD_FACTORY = new IFieldFactory() {
166 		@Override
167 		public Component createField(IMetadata<?, ?> metadata) {
168 			return new CssContainer((CssMetadata<?>)metadata, new PaintField());
169 		}
170 	};
171 	
172 	public static final IFieldFactory SPINNER_FIELD_FACTORY = new IFieldFactory() {
173 		@Override
174 		public Component createField(IMetadata<?, ?> metadata) {
175 			SpinnerFieldExt spinnerField = new SpinnerFieldExt();
176 			spinnerField.setFireChangeEventOnSetValue(true);
177 			spinnerField.setAllowDecimals(true);
178 			spinnerField.setAllowNegative(false);
179 			spinnerField.setFormat(NumberFormat.getFormat("#0.0"));
180 			spinnerField.setMinValue(0);
181 			spinnerField.setMaxValue(100);
182 			return new CssContainer((CssMetadata<?>)metadata, spinnerField);
183 		}
184 	};
185 
186 	public static final IFieldFactory DASHARRAY_FIELD_FACTORY = new IFieldFactory() {
187 
188 		@Override
189 		public Component createField(IMetadata<?, ?> metadata) {
190 			return new CssContainer((CssMetadata<?>)metadata, new DashArrayField());
191 		}
192 		
193 	};
194 
195 	public static final IFieldFactory IMAGE_HREF_FIELD_FACTORY = new IFieldFactory() {
196 
197 		@Override
198 		public Component createField(IMetadata<?, ?> metadata) {
199 			ImageHrefField field = new ImageHrefField();
200 			field.setName(metadata.getName());
201 			field.setFieldLabel(Format.capitalize(metadata.getDescription()));
202 			return field;
203 		}
204 	};
205 	
206 	
207 	
208 	public static class ToggleGroupFieldFactory implements IFieldFactory {
209 		private String[] values;
210 		private String[] tooltips;
211 		private AbstractImagePrototype icons[];
212 		
213 		public ToggleGroupFieldFactory(String[] values,
214 				String[] tooltips,
215 				AbstractImagePrototype icons[]) {
216 			this.values = values;
217 			this.tooltips = tooltips;
218 			this.icons = icons;
219 		}
220 		
221 		@Override
222 		public Component createField(IMetadata<?, ?> metadata) {
223 			return new CssContainer((CssMetadata<?>)metadata, new ToggleGroupField(values, tooltips, icons));
224 		}
225 	}
226 	
227 	public static class ComboBoxFieldFactory implements IFieldFactory {
228 		private ComboStore store;
229 		public ComboBoxFieldFactory(ComboStore store) {
230 			this.store = store;
231 		}
232 		
233 		@Override
234 		public Component createField(IMetadata<?, ?> metadata) {
235 			ComboBox<ModelData> comboBox = new ComboBox<ModelData>();
236 			comboBox.setStore(store);
237 			comboBox.setAllowBlank(false);
238 			comboBox.setForceSelection(true);
239 			comboBox.setTemplate(store.hasIcons() ? getIconTemplate() : getTemplate());
240 			comboBox.setFireChangeEventOnSetValue(true);
241 			comboBox.setDisplayField(ComboStore.LABEL);
242 			comboBox.setTriggerAction(TriggerAction.ALL);
243 			comboBox.setTypeAhead(true);
244 			return comboBox;
245 		}
246 		
247 		private native String getTemplate() /*-{ 
248 		    return  [ 
249 		    '<tpl for=".">', 
250 		    '<div class="x-combo-list-item">{[values.label]}</div>', 
251 		    '</tpl>' 
252 		    ].join(""); 
253 		}-*/;  
254 		  
255 		private native String getIconTemplate() /*-{ 
256 		    return  [ 
257 		    '<tpl for=".">', 
258 		    '<div class="x-combo-list-item"><img width="16px" height="16px" src="{[values.icon]}"> {[values.label]}</div>', 
259 		    '</tpl>' 
260 		    ].join(""); 
261 		}-*/;  
262 	}
263 	
264 	public static class HSliderFieldFactory implements IFieldFactory {
265 		private float min;
266 		private float max;
267 		public HSliderFieldFactory(float min, float max) {
268 			this.min = min;
269 			this.max = max;
270 		}
271 		@Override
272 		public Component createField(IMetadata<?, ?> metadata) {
273 			return new CssContainer((CssMetadata<?>)metadata, new FloatSliderField(min, max));
274 		}
275 	};
276 	
277 	/**
278 	 * A field factory for CSS fields. CSS fields wrap another
279 	 * kind of field and provide a button to reset the field to
280 	 * its default CSS value.
281 	 * @author laaglu
282 	 */
283 	public static class CssFieldFactory implements IFieldFactory {
284 		private IFieldFactory factory;
285 		public CssFieldFactory(IFieldFactory factory) {
286 			this.factory = factory;
287 		}
288 		@Override
289 		public Component createField(IMetadata<?, ?> metadata) {
290 			return new CssContainer((CssMetadata<?>)metadata, factory.createField(metadata));
291 		}
292 	};
293 }