SWT CalendarCombo (Nebula) & EMF Databinding

lumo

Top Contributor
Hallo,

Hat einer von euch schon ein datenbinding mittels EMF mit dem CalendarCombo geschafft?
ich versuche das jetzt seit einiger zeit und schaffe das nur in eine richtung (daten -> gui)
sobald der gui die daten ändert werden die im modell hinten nicht mitgezogen...

Java:
		EMFDataBindingContext ctx = new EMFDataBindingContext();
		IObservableValue mObs = EMFProperties.value(FeaturePath
				.fromList(FormPackage.Literals.TEST_CLASS__DATE))
				.observe(data);
		//  binding
		IObservableValue uiObs = new CalendarComboSelectionProperty().observe(cc);
		ctx.bindValue(uiObs, mObs);

Java:
import java.util.Calendar;

import org.eclipse.jface.databinding.swt.WidgetValueProperty;
import org.eclipse.nebula.widgets.calendarcombo.CalendarCombo;
import org.eclipse.swt.SWT;

public class CalendarComboSelectionProperty extends WidgetValueProperty {
	public CalendarComboSelectionProperty() {
		super(SWT.Selection);
	}

	public Object getValueType() {
		return Calendar.class;
	}

	@Override
	protected Object doGetValue(Object source) {
		CalendarCombo cc = (CalendarCombo) source;
		return cc.getDate();
	}

	@Override
	protected void doSetValue(Object source, Object value) {
		CalendarCombo cc = (CalendarCombo) source;
		if (!cc.isDisposed()) {
			if (value instanceof Calendar) {
				cc.setDate((Calendar) value);
			}
		}
	}
}

sieht jemand was ich da falsch mache?

übrigens: data = DataFactory.getTestData(); <-- das ist meine EMF klasse

danke
Lumo
 
G

Gast2

Gast
Ja wie sollen die Daten auch zurück ins Model kommen ohne Listener???

Probier mal das ist ungetestet kann sein dass ich noch den falschen Listener verwende kenn mich mit der CalendarCombo nicht aus, aber das Prinzip sollte klar werden

Java:
import java.util.Calendar;
import java.util.Date;

import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
import org.eclipse.nebula.widgets.calendarcombo.CalendarCombo;
import org.eclipse.nebula.widgets.calendarcombo.ICalendarListener;


public class CalendarComboObservableValue extends AbstractObservableValue {
	
	/**
	 * The Control being observed here.
	 */
	protected final CalendarCombo calendarCombo;
	
	/**
	 * Flag to prevent infinite recursion in {@link #doSetValue(Object)}.
	 */
	protected boolean updating = false;
	
	/**
	 * The "old" selection before a selection event is fired.
	 */
	protected Date currentSelection;
	
	private ICalendarListener listener = new ICalendarListener() {
		
		public void popupClosed() {
			if (!updating) {
				Date newSelection = CalendarComboObservableValue.this.calendarCombo.getDate().getTime();
				fireValueChange(Diffs.createValueDiff(currentSelection, newSelection));
				currentSelection = newSelection;
			}
			
		}
		
		public void dateRangeChanged(Calendar arg0, Calendar arg1) {
			// TODO Auto-generated method stub
			
		}
		
		public void dateChanged(Calendar arg0) {
			// TODO Auto-generated method stub
			
		}
	};
	
	/**
	 * Observe the selection property of the provided CDateTime control.
	 * @param calendarCombo the control to observe
	 */
	public CalendarComboObservableValue(CalendarCombo calendarCombo) {
		this.calendarCombo = calendarCombo;
		currentSelection = calendarCombo.getDate().getTime();
		this.calendarCombo.addCalendarListener(listener);
	}

	@Override
	public synchronized void dispose() {
		calendarCombo.removeCalendarListener(listener);
		super.dispose();
	}

	protected Object doGetValue() {
		if(!calendarCombo.isDisposed()) {
			return calendarCombo.getDate().getTime();
		}
		return null;
	}
	
	protected void doSetValue(Object value) {
		if(value instanceof Date && !calendarCombo.isDisposed()) {
			Date oldValue;
			Date newValue;
			try {
				updating = true;
				oldValue = calendarCombo.getDate().getTime();
				newValue = (Date) value;
				calendarCombo.setDate(newValue);
				currentSelection = newValue;
				fireValueChange(Diffs.createValueDiff(oldValue, newValue));
			} finally {
				updating = false;
			}
		}
	}

	public Object getValueType() {
		return Date.class;
	}
	
}
 

lumo

Top Contributor
hm;
ich hab fast das selbe gestern auch noch implementiert;
nur dass ich im ICalendarListener bei dateChanged & dateRangeChanged den code drin hatte, den du beim popupclosed hast...

keine ahnung warum ich das nicht probiert hab.
SirWayne, hab noch das Date in den Calendar umgewandelt (weil ich überall nen Calendar hab und kein Date)
und klappt...

DANKE
 

Ähnliche Java Themen


Oben