Eclipse-Platform Combo-Binding für User-Einträge

MarkusJo

Mitglied
Hallo,
ich habe eine editierbare ComboBox auf meinem Screen. Sie stellt einen String Array dar und ist auf ein String-Feld gebunden.

Das Binding sieht wie folgt aus

Java:
		IViewerObservableValue orderNumberViewerObsevable = ViewersObservables.observeSingleSelection(this.orderNumberComboViewer);
		IObservableValue orderNumberModelObsevable = EMFEditProperties.value(editingDomain, TimetablePackage.Literals.PROTOCOL_SHEET_ENTRY__ORDER_NUMBER).observeDetail(masterTreeViewerObservable);
		bindingContext.bindValue(orderNumberViewerObsevable, orderNumberModelObsevable);

Es funzt auch, wenn ich einen Eintrag auswähle der in der Input-Liste ist.....ich mag jedoch auch die Möglichkeit haben selbst einen Eintrag ins Textfeld der ComboBox zu tippen....der soll dann auch im gebunden String-Attribut stehen.....das funzt jedoch nicht. Wenn ich in die Combo einen String eintrage der nicht in der InputListe ist wird er nicht ins Modell geschrieben. Und wen ich ins Modell einen String schreibe der nicht in er InputListe ist wird dieser auch nicht hoch in die Ui (die Combo) geschrieben.

Geht das denn ? Was muss ich dazu noch tun ?

Grüße
 
Zuletzt bearbeitet von einem Moderator:
Es funzt auch, wenn ich einen Eintrag auswähle der in der Input-Liste ist.....ich mag jedoch auch die Möglichkeit haben selbst einen Eintrag ins Textfeld der ComboBox zu tippen....der soll dann auch im gebunden String-Attribut stehen.....das funzt jedoch nicht. Wenn ich in die Combo einen String eintrage der nicht in der InputListe ist wird er nicht ins Modell geschrieben. Und wen ich ins Modell einen String schreibe der nicht in er InputListe ist wird dieser auch nicht hoch in die Ui (die Combo) geschrieben.

Warum nimmst du für sowas eine Combo?

Nimm einfach ein Text mit AutoCompletion dann ist das binding auch easy und hast sogar Filterung dabei.

swt-jface:autocompletefield - Java Wiki
 
Ich nehme eine Combo, weil der Nutzer die Vorschläge alle direkt sehen soll und nicht erst wie bei Autocompletion wenn er erste Buchstaben eingestippt hat.

Weiß denn jemand ob/wie das geht ?
 
Geht auch ? Dass man bei dem AutoCompletion Feld die Auswahlen sieht ohne überhaupt einen Buchstaben eingegeben zu haben ? Wie ? Wo stehen die Eclipse Methodenvorschläge ?
 
Ja musst ein bischen Code lesen ist ja alles Open Source.
Die AutoCompletion Klasse ist ja nur ein Wrapper um das eigentlich Proposal, soviel ich weiß kannst du irgendwo ein Short Cut setzen wann die Liste aufgehen soll.
Musst halt eine MyAutoCompletion machen. Ich weiß ja nicht wann du die Completion öffnen willst.

War ja auch noch so eine Idee.
 
Nagut, das würde ich wohl finden.

Das Feldchen wäre für eine andere Stelle bei mir im Code schick....aber da geht es um comlexe Objekte die in der Auswahlliste zu sehen sein müssten.....also zwar schon deren Text-Repräsentation, aber dahinter würde ein Datentyp liegen der dann auch ins Modell geschrieben werden sollte. Das geht mir diesem Feld nicht oder ?

Gibt es etwas vorgefertigtes was das kann und was man auch schön per SWT-Bindung binden kann ?
 
Nagut, das würde ich wohl finden.

Das Feldchen wäre für eine andere Stelle bei mir im Code schick....aber da geht es um comlexe Objekte die in der Auswahlliste zu sehen sein müssten.....also zwar schon deren Text-Repräsentation, aber dahinter würde ein Datentyp liegen der dann auch ins Modell geschrieben werden sollte. Das geht mir diesem Feld nicht oder ?

Gibt es etwas vorgefertigtes was das kann und was man auch schön per SWT-Bindung binden kann ?

Ja mach einfach mal ein fertiges KSKB, um dein Problem nachzuvollziehen. Normal sollte das auch so mit einer Combo gehen. Ich sehe kein Grund war dagegen spricht. Bist hast du nur die Selection gebunden, die Eingabe musst du natürlich auch noch binden.

EDIT:
Also du brauchst ein 2tes Binding mit sowas hier
IObservableValue widgetObservable1 = WidgetProperties.text().observe(viewer.getControl());
 
Zuletzt bearbeitet von einem Moderator:
Hier hast mal was zum rumspielen
Java:
package test;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.fieldassist.AutoCompleteField;
import org.eclipse.jface.fieldassist.ComboContentAdapter;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

public class View extends ViewPart {
	public static final String ID = "test.view";

	private ComboViewer viewer;

	private Person person = new Person();

	/**
	 * The content provider class is responsible for providing objects to the
	 * view. It can wrap existing objects in adapters or simply return objects
	 * as-is. These objects may be sensitive to the current input of the view,
	 * or ignore it and always show the same content (like Task List, for
	 * example).
	 */
	class ViewContentProvider implements IStructuredContentProvider {
		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
		}

		public void dispose() {
		}

		public Object[] getElements(Object parent) {
			if (parent instanceof Object[]) {
				return (Object[]) parent;
			}
			return new Object[0];
		}
	}

	class ViewLabelProvider extends LabelProvider implements
			ITableLabelProvider {
		public String getColumnText(Object obj, int index) {
			return getText(obj);
		}

		public Image getColumnImage(Object obj, int index) {
			return getImage(obj);
		}

		public Image getImage(Object obj) {
			return PlatformUI.getWorkbench().getSharedImages()
					.getImage(ISharedImages.IMG_OBJ_ELEMENT);
		}
	}

	/**
	 * This is a callback that will allow us to create the viewer and initialize
	 * it.
	 */
	public void createPartControl(Composite parent) {
		viewer = new ComboViewer(parent, SWT.DROP_DOWN);
		viewer.setContentProvider(new ViewContentProvider());
		viewer.setLabelProvider(new ViewLabelProvider());
		// Provide the input to the ContentProvider
		viewer.setInput(new String[] { "One", "Two", "Three" });

		viewer.addFilter(new ViewerFilter() {
			
			@Override
			public boolean select(Viewer viewer, Object parentElement, Object element) {
				return element.toString().equals("One") || element.toString().equals("Three");
			}
		});
		
		new AutoCompleteField(viewer.getCombo(), new ComboContentAdapter(), new String[] { "One", "Two", "Three" });
		
		
		DataBindingContext bindingContext = new DataBindingContext();


		// The second key to binding a combo to an Enum is to use a
		// selection observable from the ComboViewer:
		IObservableValue widgetObservable = ViewersObservables.observeSingleSelection(viewer);
		bindingContext.bindValue(widgetObservable, PojoObservables.observeValue(person, "name"));
		
		IObservableValue widgetObservable1 = WidgetProperties.text().observe(viewer.getControl());
		bindingContext.bindValue(widgetObservable1, PojoObservables.observeValue(person, "name"));

		Button button = new Button(parent, SWT.PUSH);
		button.addSelectionListener(new SelectionListener() {

			@Override
			public void widgetSelected(SelectionEvent e) {
				System.out.println(person.getName());

			}

			@Override
			public void widgetDefaultSelected(SelectionEvent e) {
				// TODO Auto-generated method stub

			}
		});

	}

	/**
	 * Passing the focus request to the viewer's control.
	 */
	public void setFocus() {
		viewer.getControl().setFocus();
	}

	public static class Person {
		private String name;
		private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
				this);

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
			changeSupport.firePropertyChange("name", "", name);
		}

		public void addPropertyChangeListener(final PropertyChangeListener listener) {
			changeSupport.addPropertyChangeListener(listener);
		}

		public void removePropertyChangeListener(final PropertyChangeListener listener) {
			changeSupport.removePropertyChangeListener(listener);
		}
	}
}
 

Zurück
Oben