1 13 package org.eclipse.jface.internal.databinding.internal.swt; 14 15 import org.eclipse.core.databinding.observable.Diffs; 16 import org.eclipse.core.databinding.observable.IObservable; 17 import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTVetoableValue; 18 import org.eclipse.swt.SWT; 19 import org.eclipse.swt.events.VerifyEvent; 20 import org.eclipse.swt.events.VerifyListener; 21 import org.eclipse.swt.widgets.Event; 22 import org.eclipse.swt.widgets.Listener; 23 import org.eclipse.swt.widgets.Text; 24 25 43 public class TextObservableValue extends AbstractSWTVetoableValue { 44 45 48 private final Text text; 49 50 55 private boolean updating = false; 56 57 61 private final int updateEventType; 62 63 66 private static final int[] validUpdateEventTypes = new int[] { SWT.Modify, 67 SWT.FocusOut, SWT.NONE }; 68 69 72 private String oldValue; 73 74 private Listener updateListener = new Listener() { 75 public void handleEvent(Event event) { 76 if (!updating) { 77 String newValue = text.getText(); 78 79 if (!newValue.equals(oldValue)) { 80 fireValueChange(Diffs.createValueDiff(oldValue, newValue)); 81 oldValue = newValue; 82 } 83 } 84 } 85 }; 86 87 private VerifyListener verifyListener; 88 89 102 public TextObservableValue(final Text text, int updateEventType) { 103 super(text); 104 boolean eventValid = false; 105 for (int i = 0; !eventValid && i < validUpdateEventTypes.length; i++) { 106 eventValid = (updateEventType == validUpdateEventTypes[i]); 107 } 108 if (!eventValid) { 109 throw new IllegalArgumentException ( 110 "UpdateEventType [" + updateEventType + "] is not supported."); } 112 this.text = text; 113 this.updateEventType = updateEventType; 114 if (updateEventType != SWT.None) { 115 text.addListener(updateEventType, updateListener); 116 } 117 118 oldValue = text.getText(); 119 120 verifyListener = new VerifyListener() { 121 public void verifyText(VerifyEvent e) { 122 if (!updating) { 123 String currentText = TextObservableValue.this.text 124 .getText(); 125 String newText = currentText.substring(0, e.start) + e.text 126 + currentText.substring(e.end); 127 if (!fireValueChanging(Diffs.createValueDiff(currentText, 128 newText))) { 129 e.doit = false; 130 } 131 } 132 } 133 }; 134 text.addVerifyListener(verifyListener); 135 } 136 137 146 protected void doSetApprovedValue(final Object value) { 147 try { 148 updating = true; 149 text.setText(value == null ? "" : value.toString()); oldValue = text.getText(); 151 } finally { 152 updating = false; 153 } 154 } 155 156 161 public Object doGetValue() { 162 return oldValue = text.getText(); 163 } 164 165 171 public Object getValueType() { 172 return String .class; 173 } 174 175 public void dispose() { 176 if (!text.isDisposed()) { 177 if (updateEventType != SWT.None) { 178 text.removeListener(updateEventType, updateListener); 179 } 180 text.removeVerifyListener(verifyListener); 181 } 182 super.dispose(); 183 } 184 } 185 | Popular Tags |