# DetailsMasterBlock



## dzim (27. Okt 2009)

Hallo,

ich habe kürzlich ein wenig über den MasterDetailsBlock gelesen (der gerne als *die* Struktur in der GUI-Programmierung bezeichnet wird) und würde diesen gerne in meine (sowieso Forms-basierte) App einbinden.
Ganz klar bin ich aber noch nicht mit der Verwendung gekommen...
Wenn ich es richtig verstehe, muss ich wenigstens eine DetailsPage/-Part implementieren (wenn ich es richtig verstehe könnte man sogar MasterPages ineinander schachteln, oder?).

Es wird von statischem oder dynamischen verlinken gesprochen - das sicher über die Methode 'registerPages()' geschehen soll, die man erst noch implementieren muss.
Dann wird von dem IDetailsPageProvider, den man verwenden muss, um bei Klick in der Liste/in dem Baum des Masters eine enstprechende Page geöffnet wird...
Das hab ich alles ehrlich gesagt noch nicht ganz verstanden?

Könnt ihr mir mit Links zu Tutorials, praktischen Tipps o.ä. weiter helfen?

Danke jedenfalls schon vorab!
Daniel


----------



## Wildcard (27. Okt 2009)

Der einfache statische Fall: du registrierst Pages auf einen bestimmten Objekt-Type. ZB eine Foo Detail Page für Bar Objekte. Wird nun im Master ein Bar Objekt selektiert, zeigt das Framework automatisch die passende Foo Page an.


----------



## dzim (28. Okt 2009)

Hi Wildcard!

Ja, das hatte ich schon so verstanden - und das finde ich ja auch gut! Nur die Frage, wo genau ich was anmelde, ist mir noch unklar...

Ich habe ja im Normalfall irgendeinen Viewer und dort eine selectionChanged. Das ich darauf reagieren kann, ist mir klar, nur wie binde ich das jetzt an den Master? Und wie binde ich dann die Details an den Master?  Geschieht das dann über die IDetailsPageProvider?

edit: Ich habe mir diesen Uralt-Artikel Eclipse Forms: Rich UI for Rich Client Applications angeschaut und auch in dei Quellen geschaut. Das Prinzip ist mir klar: MasterDetailsBlock - Master implementieren, x DetailsPages implementieren.

Grob ist mir auch klar, wie das mit dem IDetailsPageProvider geht:
getPage gibt dir die konkrete Implementierung der Seite zu einem Key.
getPageKey gibt dir die (Klasse?) zurück, welche für eine Seite zuständig ist.

Aber der konkrete Aufruf über den Aufruf managedForm.fireSelectionChanged(section, selection); ist mir noch nicht wirklich klar geworden...


----------



## dzim (28. Okt 2009)

So, ich habe jetzt noch ein bisschen herumgespielt, so dass ich die Zeit überbrücken kann, bevor ich mich wieder um die DetailPages kümmere.

Ich habe - es ging leider wirklich nicht anders, da ich nicht mit einer FormPage arbeite, sondern mit etwas selbstgestricktem - ein Composite für meinen Master gebaut.

Das Composite bekommt das FormToolkit und konstruiert eine ScrolledForm. in dem ScrolledForm soll dann der MasterDetailsBlock eingearbeitet werden.


```
public GuidedConfigSettingsFormsComposite(Composite parent, int style,
			FormToolkit formToolkit) {
		super(parent, style);

		ConfigPlugin.getDefault().getGuidedConfigEventManager()
				.registerListener(this);

		this.toolkit = formToolkit;

		toolkit.adapt(this);
		toolkit.paintBordersFor(this);
		setLayout(new FormLayout());

		ScrolledForm scrolledForm = formToolkit.createScrolledForm(this);
		{
			FormData formData = new FormData();
			formData.bottom = new FormAttachment(100);
			formData.right = new FormAttachment(100);
			formData.top = new FormAttachment(0);
			formData.left = new FormAttachment(0);
			scrolledForm.setLayoutData(formData);
		}
		scrolledForm.setText("Guided Configuration: Settings XML");

		formToolkit.decorateFormHeading(scrolledForm.getForm());
		formToolkit.paintBordersFor(scrolledForm);

		ManagedForm managedForm = new ManagedForm(formToolkit, scrolledForm);
		scrolledForm.getBody().setLayout(new FormLayout());

		GuidedConfigSettingsMaster settingsMaster = new GuidedConfigSettingsMaster();
		settingsMaster.createContent(managedForm);

		// FormData formData = new FormData();
		// formData.bottom = new FormAttachment(100, -10);
		// formData.right = new FormAttachment(100, -10);
		// formData.top = new FormAttachment(0, 10);
		// formData.left = new FormAttachment(0, 10);
		// managedForm.getForm().getBody().setLayoutData(formData);
	}
```

Problem: Die MasterSection ist immer oben links in den Rand des Bodies gequetscht - oder anders: Der MasterDetailsBlock nimmt die gesamte Body-Fläche des ScrolledForms ein - ich hätte aber gerne einen kleinen Rand.
Kann man das irgendwie machen? Der untere auskommentierte Codeblock macht es jedenfalls nicht und es sieht zur Zeit eher häßlich aus!


----------



## Wildcard (28. Okt 2009)

Ich verwende meistens GridLayout, nur vom draufschauen kann ich dir da also nicht helfen.
Benutz evtl. den VE, der hat guten Forms Support.
Die Selection regelst du normalerweise über in dem du einen SelectionProvider registrierst. Falls du einen JFace Viewer im Master hast, kannst du direkt den Viewer als Selection Provider verwenden.
Bin zur Zeit noch auf dem Eclipse Summit. Wenn du also Beispielcode benötigst, geht ds frühstens Freitag.


----------



## dzim (29. Okt 2009)

Ich nutze in aller Regel das FormLayout im Instantiations-SWTDesigner - für FormLayout geht er relativ gut, mit GridLayout komm ich allerdings nicht so ganz klar... Obwohl es wahrscheinlich das einfachere der Layouts ist.
Ich spiel erst mal noch ein wenig mit den Einstellungen rum - getreu dem Motto: "Lerning by doing!"
Wer weiß, vielleicht hab ich ja Glück!

Eclipse Summin - in Ludwigsburg war das, nicht wahr? - ich hab gestern bei Golem gelesen, dass es dabei auch zu einer gewissen Annäherung von Microsoft an Eclipse gab - speziell an einige Firmen, die schon lange für Eclipse entwickeln (Tasktop oder wie sie heißen, und andere). Es soll dann auch, wenn ich es richtig verstanden habe, plugins für einige MS-typische Produkte geben...

Man, das ist sicher interessant dort! Ich wünsch dir dann mal noch viel Spaß!!!


----------

