# Master/Detail Block



## Gast2 (7. Jan 2011)

Hallo zusammen,

ich habe versucht einen MasterDetail Block zu gestalten, aber mein Detail Block erscheint nie und bekommt auch keine Selection Change Events, weil ich bei der registerPages die Interface Klasse angebe anstatt die richtige Implementierung. Kann man nicht das Interface angeben?


```
protected void registerPages(DetailsPart detailsPart) {
//geht
			detailsPart.registerPage(MyItemImpl.class, new FahrtDetailPage());
//geht nicht
			detailsPart.registerPage(MyItem.class, new FahrtDetailPage());
		}
```




Außerdem verstehe ich nicht wie das Undo/Redo bei MultiPartEditoren z.B. wie bei plugin.xml Editor implementiert ist. Hat da jeder Editor einen eigenen EditingDomain Instanz oder teilen die sich alle den gleichen?


----------



## Gast2 (7. Jan 2011)

Noch einmal ne Frage zum Undo/Redo

Ich habe mit jetzt eine DetailPage gebastelt. Wenn ich aber die Selektion wechsel und somit auch das Objekt binde ich das Objekt neu. Aber dann spinnt das Databining komplett z.B. spingt der Cursor wenn man etwas eintipp immer wieder an die 1. Stelle. *würg*

Was ist denn falsch? Oder besser gesagt wie macht man es richtig?
Muss ich das selektion event immer wieder nur kopieren und eine working instanz von dem Objekt haben?

```
public static class FahrtDetailPage implements IDetailsPage {

			private IManagedForm form;
			private Text von;
			private Text bis;
			private Fahrt fahrt;
			private EditingDomain editingDomain;
			private DataBindingContext bindingContext = new EMFDataBindingContext();
	
			
			public FahrtDetailPage(EditingDomain editingDomain){
				this.editingDomain = editingDomain;
			}
			
			@Override
			public void initialize(IManagedForm form) {
				this.form = form;
			}

			@Override
			public boolean isDirty() {
				return ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded();
			}


			@Override
			public void selectionChanged(IFormPart part, ISelection selection) {
				fahrt = (Fahrt) ((IStructuredSelection)selection).getFirstElement();
				bindValue();
				
			}
			
			private void bindValue(){
				bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(200, bis), EMFEditProperties.value(editingDomain, MyPackage.Literals.FAHRT__BIS).observe(fahrt));
				bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(200, von), EMFEditProperties.value(editingDomain, MyPackage.Literals.FAHRT__VON).observe(fahrt));
			}

			@Override
			public void createContents(Composite parent) {
				TableWrapLayout layout = new TableWrapLayout();
				layout.topMargin = 5;
				layout.leftMargin = 5;
				layout.rightMargin = 2;
				layout.bottomMargin = 2;
				parent.setLayout(layout);
				
				FormToolkit toolkit = form.getToolkit();
				Section s1 = toolkit.createSection(parent, Section.DESCRIPTION);
				s1.marginWidth = 10;
				s1.setText("Fahrten Details");
				TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
				td.grabHorizontal = true;
				s1.setLayoutData(td);
				toolkit.createCompositeSeparator(s1);
				
				Composite client = toolkit.createComposite(s1);
				GridLayout glayout = new GridLayout();
				glayout.numColumns = 2;
				client.setLayout(glayout);
				toolkit.createLabel(client, "Von");
				von = toolkit.createText(client, "", SWT.BORDER);
				GridDataFactory.swtDefaults().grab(true, false).hint(10, SWT.DEFAULT).align(SWT.FILL, SWT.FILL).applyTo(von);
				
				toolkit.createLabel(client, "Bis");
				bis = toolkit.createText(client, "", SWT.BORDER);
				GridDataFactory.swtDefaults().grab(true, false).hint(10, SWT.DEFAULT).align(SWT.FILL, SWT.FILL).applyTo(bis);
				
				s1.setClient(client);
			}
			
		}
```


----------



## bobbytank (19. Jan 2012)

Hallo,

das gleiche Problem hatte ich auch.
Wir haben das gelöst, indem wir in 
	
	
	
	





```
selectionChanged()
```
 prüfen, ob sich die Auswahl wirklich geändert hat. Z.B. so:

```
public void selectionChanged(IFormPart part, ISelection selection) {
        IStructuredSelection structuredSelection = (IStructuredSelection) selection;
        if (structuredSelection.size() == 1) {
            if (structuredSelection.getFirstElement() != observableValue.getValue()) {
                observableValue.setValue((EObject) structuredSelection.getFirstElement());
                if (bindingContext != null) {
                    bindingContext.dispose();
                    bindingContext = null;
                }
                initBindings();
            }
        }
    }
```


----------



## Gast2 (19. Jan 2012)

Denkst du nach einem Jahr hab ich das Problem nicht gelöst .

Du einfach nur den DatabindingContext neu aufbauen und gut is...


----------

