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.widget.SpinnerFieldExt;
21  
22  import com.extjs.gxt.ui.client.data.ModelData;
23  import com.extjs.gxt.ui.client.event.ClickRepeaterEvent;
24  import com.extjs.gxt.ui.client.event.Events;
25  import com.extjs.gxt.ui.client.event.FieldEvent;
26  import com.extjs.gxt.ui.client.event.Listener;
27  import com.extjs.gxt.ui.client.util.ClickRepeater;
28  
29  /**
30   * Bind a spinner with a 
31   * CSS property of an SVGStyleElementModel. It makes the
32   * changes of the spinner value atomic with respect to the
33   * object model, even when the spinner buttons are held down 
34   * @author laaglu
35   */
36  public class SpinnerFieldExtBinding extends DelayedBindingBase {
37  	private SpinnerFieldExt spinnerField;
38  	private boolean disabled;
39  	private Listener<FieldEvent> changeListener = new Listener<FieldEvent>() {
40  		public void handleEvent(FieldEvent fe) {
41  			handleChange();
42  		}
43  	};
44  	
45  	private Listener<ClickRepeaterEvent> repeaterDownListener = new Listener<ClickRepeaterEvent>() {
46  		public void handleEvent(ClickRepeaterEvent re) {
47  			disabled = true;
48  		}
49  	};
50  	private Listener<ClickRepeaterEvent> repeaterUpListener = new Listener<ClickRepeaterEvent>() {
51  		public void handleEvent(ClickRepeaterEvent re) {
52  			disabled = false;
53  			handleChange();
54  		}
55  	};
56  	
57  	public SpinnerFieldExtBinding(SpinnerFieldExt field, String property) {
58  		super(field, property);
59  		this.spinnerField = field;
60  	}
61  
62  
63  	@Override
64  	public void bind(ModelData model) {
65  		super.bind(model);
66  		spinnerField.addListener(Events.Change, changeListener);
67  		ClickRepeater repeater = spinnerField.getRepeater();
68  		repeater.addListener(Events.OnMouseDown, repeaterDownListener);
69  		repeater.addListener(Events.OnMouseUp, repeaterUpListener);
70  		ClickRepeater twinRepeater = spinnerField.getTwinRepeater();
71  		twinRepeater.addListener(Events.OnMouseDown, repeaterDownListener);
72  		twinRepeater.addListener(Events.OnMouseUp, repeaterUpListener);
73  	}
74  	
75  	@Override
76  	public void unbind() {
77  		spinnerField.removeListener(Events.Change, changeListener);
78  		ClickRepeater repeater = spinnerField.getRepeater();
79  		repeater.removeListener(Events.OnMouseDown, repeaterDownListener);
80  		repeater.removeListener(Events.OnMouseUp, repeaterUpListener);
81  		ClickRepeater twinRepeater = spinnerField.getTwinRepeater();
82  		twinRepeater.removeListener(Events.OnMouseDown, repeaterDownListener);
83  		twinRepeater.removeListener(Events.OnMouseUp, repeaterUpListener);
84  		super.unbind();
85  	}
86  
87  	public void handleChange() {
88  		if (!disabled) {
89  			commitChanges();
90  		}
91  	}
92  }