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.SVGLengthField;
21  import org.vectomatic.svg.edit.client.gxt.widget.SpinnerFieldExt;
22  import org.vectomatic.svg.edit.client.model.svg.SVGLength;
23  
24  import com.extjs.gxt.ui.client.data.ModelData;
25  import com.extjs.gxt.ui.client.event.ClickRepeaterEvent;
26  import com.extjs.gxt.ui.client.event.Events;
27  import com.extjs.gxt.ui.client.event.FieldEvent;
28  import com.extjs.gxt.ui.client.event.Listener;
29  import com.extjs.gxt.ui.client.util.ClickRepeater;
30  import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
31  import com.google.gwt.dom.client.Style;
32  import com.google.gwt.dom.client.Style.Unit;
33  
34  /**
35   * Binds an SVGLengthField to a model property of
36   * type SVGLength.
37   * @author laaglu
38   */
39  public class SVGLengthFieldBinding extends DelayedBindingBase {
40  	private SpinnerFieldExt valueField;
41  	private boolean disabled;
42  	private Listener<FieldEvent> changeListener = new Listener<FieldEvent>() {
43  		public void handleEvent(FieldEvent fe) {
44  			handleChange();
45  		}
46  	};
47  	
48  	private Listener<ClickRepeaterEvent> repeaterDownListener = new Listener<ClickRepeaterEvent>() {
49  		public void handleEvent(ClickRepeaterEvent re) {
50  			disabled = true;
51  		}
52  	};
53  	private Listener<ClickRepeaterEvent> repeaterUpListener = new Listener<ClickRepeaterEvent>() {
54  		public void handleEvent(ClickRepeaterEvent re) {
55  			disabled = false;
56  			handleChange();
57  		}
58  	};
59  
60  	public SVGLengthFieldBinding(SVGLengthField field, String property) {
61  		super(field, property);
62  	}
63  
64  	@Override
65  	public void bind(ModelData model) {
66  		super.bind(model);
67  		SVGLengthField lengthField = (SVGLengthField)field;
68  		valueField = lengthField.getValueField();
69  		valueField.addListener(Events.Change, changeListener);
70  		ClickRepeater repeater = valueField.getRepeater();
71  		repeater.addListener(Events.OnMouseDown, repeaterDownListener);
72  		repeater.addListener(Events.OnMouseUp, repeaterUpListener);
73  		ClickRepeater twinRepeater = valueField.getTwinRepeater();
74  		twinRepeater.addListener(Events.OnMouseDown, repeaterDownListener);
75  		twinRepeater.addListener(Events.OnMouseUp, repeaterUpListener);
76  		lengthField.getUnitField().addListener(Events.Change, changeListener);
77  		disabled = false;
78  	}
79  	
80  	@Override
81  	public void unbind() {
82  		SVGLengthField lengthField = (SVGLengthField)field;
83  		SpinnerFieldExt valueField = lengthField.getValueField();
84  		valueField.removeListener(Events.Change, changeListener);
85  		ClickRepeater repeater = valueField.getRepeater();
86  		repeater.removeListener(Events.OnMouseDown, repeaterDownListener);
87  		repeater.removeListener(Events.OnMouseUp, repeaterUpListener);
88  		ClickRepeater twinRepeater = valueField.getTwinRepeater();
89  		twinRepeater.removeListener(Events.OnMouseDown, repeaterDownListener);
90  		twinRepeater.removeListener(Events.OnMouseUp, repeaterUpListener);
91  		lengthField.getUnitField().removeListener(Events.Change, changeListener);
92  		super.unbind();
93  	}
94  	
95  	public void handleChange() {
96  		SVGLengthField lengthField = (SVGLengthField)field;
97  		SpinnerFieldExt valueField = lengthField.getValueField();
98  		SimpleComboBox<Unit> unitField = lengthField.getUnitField();
99  		Number value = valueField.getValue();
100 		if (value != null) {
101 			SVGLength length = model.get(property);
102 			length.setValue(value.floatValue());
103 			Style.Unit unit = null;
104 			String rawUnit = unitField.getRawValue();
105 			if (rawUnit != null && rawUnit.length() > 0) {
106 				unit = unitField.getSimpleValue();
107 			}
108 			length.setUnit(unit);
109 			model.set(property, length);
110 			if (!disabled) {
111 				commitChanges();
112 			}
113 		}
114 	}
115 }