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



## MarkusJo (9. Mrz 2012)

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 


```
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


----------



## Gast2 (9. Mrz 2012)

MarkusJo hat gesagt.:


> 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


----------



## MarkusJo (9. Mrz 2012)

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 ?


----------



## Gast2 (9. Mrz 2012)

MarkusJo hat gesagt.:


> 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.



Geht auch siehe Eclipse Methodenvorschläge...


----------



## MarkusJo (9. Mrz 2012)

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 ?


----------



## MarkusJo (9. Mrz 2012)

Bei dem Feld kann man nicht konfigurieren ab wieviel Zeichen er die Auswahlliste öffnet oder ? Finde da keine Setter.


----------



## Gast2 (9. Mrz 2012)

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.


----------



## MarkusJo (12. Mrz 2012)

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 ?


----------



## Gast2 (12. Mrz 2012)

MarkusJo hat gesagt.:


> 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());


----------



## Gast2 (13. Mrz 2012)

Hier hast mal was zum rumspielen

```
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);
		}
	}
}
```


----------

