package org.eclipse.ufacekit.ui.swing.databinding.internal.swing.properties;
import java.awt.Container;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.ufacekit.ui.swing.databinding.internal.swing.IDelegateRegistration;
import org.eclipse.ufacekit.ui.swing.databinding.internal.swing.SwingVetoableValueDecorator;
import org.eclipse.ufacekit.ui.swing.databinding.swing.ISwingObservableValue;
import org.eclipse.ufacekit.ui.swing.databinding.swing.SwingProperties.TextType;
/**
* @since 3.3
*
*/
public class JTextComponentTextProperty extends WidgetStringValueProperty<TextType, JTextComponent> {
/**
*
*/
public JTextComponentTextProperty() {
this(null);
}
/**
* @param events
*/
public JTextComponentTextProperty(TextType[] events) {
super(checkEvents(events), staleEvents(events));
}
private static TextType[] checkEvents(TextType[] events) {
if (events != null)
for (int i = 0; i < events.length; i++)
checkEvent(events[i]);
return events;
}
private static void checkEvent(TextType event) {
if (event == null)
throw new IllegalArgumentException("UpdateEventType [" //$NON-NLS-1$
+ event + "] is not supported."); //$NON-NLS-1$
}
private static TextType[] staleEvents(TextType[] changeEvents) {
if (changeEvents != null)
for (int i = 0; i < changeEvents.length; i++)
if (changeEvents[i] == TextType.Modify)
return null;
return new TextType[] { TextType.Modify };
}
String doGetStringValue(Object source) {
return ((JTextComponent) source).getText();
}
void doSetStringValue(Object source, String value) {
((JTextComponent) source).setText(value == null ? "" : value); //$NON-NLS-1$
}
public String toString() {
return "Text.text <String>"; //$NON-NLS-1$
}
protected ISwingObservableValue wrapObservable(IObservableValue observable,
Container widget) {
JTextComponent component = (JTextComponent) widget;
return new SwingVetoableValueDecorator(widget, this, observable) {
@Override
protected IDelegateRegistration registerEventDelegate(Delegate delegate) {
// TODO Auto-generated method stub
return null;
}
};
}
@Override
protected IDelegateRegistration registerDelegate(final TextType type,
final JTextComponent widget, final WidgetListener.Delegate delegate) {
switch (type) {
case Modify:
final DocumentListener listener = new DocumentListener() {
public void changedUpdate(DocumentEvent documentevent) {
//FIXME Why not update here?
}
public void insertUpdate(DocumentEvent documentevent) {
delegate.handle(type, widget);
}
public void removeUpdate(DocumentEvent documentevent) {
delegate.handle(type, widget);
}
};
widget.getDocument().addDocumentListener(listener);
return new IDelegateRegistration() {
public void dispose() {
widget.getDocument().removeDocumentListener(listener);
}
};
case FocusOut:
final FocusListener l = new FocusAdapter() {
public void focusLost(FocusEvent e) {
delegate.handle(type, widget);
}
};
widget.addFocusListener(l);
return new IDelegateRegistration() {
public void dispose() {
widget.removeFocusListener(l);
}
};
// case DefaultSelection:
// break;
default:
throw new IllegalArgumentException("Unsupported type '"+type+"'");
}
}
}