# Umgang mit Wizard



## MZ3291 (5. Nov 2012)

Hallo

ich habe mal wieder ein Problem bezüglich meinem Plugin. Diesmal ist es hoffentlich etwas einfacher und offensichtlicher.
Dazu erstmal die Info: ich bin beim QuickFix und möchte soetwas wie "Create new class .." nachbasteln.. habe gelesen, dass so etwas machbar ist, indem ich eine Klasse schreibe, die von WizardPage und eine, die von Wizard erbt.

Die eine Klasse sieht etwa so aus:


```
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;

public class ResourceWizard extends Wizard implements INewWizard {

	private ResourceWizardPage resourceWizardPage;
	private String value;
	
	private IStructuredSelection structuredSelection;
	private IWorkbench workbench;

	
	public ResourceWizard(String value) {
		super();
		this.value = value;
	}
	
	@Override
	public void addPages(){
		super.addPages();
		resourceWizardPage = new ResourceWizardPage("", value);
		addPage(resourceWizardPage);
	}
	
	@Override
	public void init(IWorkbench workbench, IStructuredSelection selection) {
		this.workbench = workbench;
		this.structuredSelection = selection;
	}

	@Override
	public boolean performFinish() {
		return true;
	}

}
```

Dazu jetzt meine Fragen:

1. Warum soll ich sowohl WIzard extenden als auch INewWizard implementieren? Ist beides erforderlich? Hab das nur irgendwo gelesen, wo das so verwendet wurde, bin mir da nicht sicher.

2. Wenn ich diesen Wizard verwende, sprich der Dialog angezeigt wird, muss ich soweit ich weiß, erst das Objekt erzeugen und dann init aufrufen. Dazu b rauche ich aber IWorkbench und IstructuredSelection.. 
ich habe aber weder noch.. maximal einen InvocationContext (da der Aufruf in einer eigenen Implementierung von IJavaCompletionProposal geschieht). 
Hat jemand einen Hinweis wie ich da rankomme? oder falls das gar nicht so möglich ist, wie ich das haben möchte, wie ich das anders bewerkstelligen kann?

Wäre echt nett, wenn ich ein paar Hinweise bekommen könnte.

Grüße und Danke für jede Hilfe, MZ


----------



## Gonzo17 (6. Nov 2012)

MZ3291 hat gesagt.:


> 1. Warum soll ich sowohl WIzard extenden als auch INewWizard implementieren? Ist beides erforderlich? Hab das nur irgendwo gelesen, wo das so verwendet wurde, bin mir da nicht sicher.



Um einen Wizard als Wizard zum Erzeugen einer neuen Datei einzubinden, musst du den Extension Point 
	
	
	
	





```
org.eclipse.ui.newWizards
```
 verwenden. Im Interface 
	
	
	
	





```
INewWizard
```
 steht das auch nochmal so:



> Interface for creation wizards.
> 
> Clients should implement this interface and include the name of their class in a wizard contributed to the workbench's creation wizard extension point (named "org.eclipse.ui.newWizards"). For example, the plug-in's XML markup might contain:
> 
> ...







MZ3291 hat gesagt.:


> 2. Wenn ich diesen Wizard verwende, sprich der Dialog angezeigt wird, muss ich soweit ich weiß, erst das Objekt erzeugen und dann init aufrufen. Dazu b rauche ich aber IWorkbench und IstructuredSelection..
> ich habe aber weder noch.. maximal einen InvocationContext (da der Aufruf in einer eigenen Implementierung von IJavaCompletionProposal geschieht).
> Hat jemand einen Hinweis wie ich da rankomme? oder falls das gar nicht so möglich ist, wie ich das haben möchte, wie ich das anders bewerkstelligen kann?



Öhm, da komme ich nicht ganz mit. Wieso musst du 
	
	
	
	





```
init
```
 aufrufen? Das wird in der Regel schon getan. Die Oberklasse 
	
	
	
	





```
Wizard
```
 hat ja keine 
	
	
	
	





```
init
```
-Methode, die kommt ebenfalls vom Interface mit, genauer von 
	
	
	
	





```
IWorkbenchWizard
```
 (von dem 
	
	
	
	





```
INewWizard
```
 erbt). Es gibt bestimmte Unterklassen wie 
	
	
	
	





```
BasicNewFileResourceWizard
```
, die sogar noch spezifischer sind und die du nehmen kannst statt 
	
	
	
	





```
Wizard
```
 und 
	
	
	
	





```
INewWizard
```
. Generell kannst du schlicht folgendes machen:


```
@Override
	public void init(IWorkbench workbench, IStructuredSelection selection)  {
		super.init(workbench, selection);
        // ...
	}
```


----------



## MZ3291 (6. Nov 2012)

Danke für die Antwort.. Das mit dem Extension Point hab ich erstmal schön übersehen ^^ Habe meine Klasse ein wenig verändert und einen funktionierenden WIzard den ich mit Ctrl + n finden kann. Auch die Funktion ist korrekt.



> Öhm, da komme ich nicht ganz mit. Wieso musst du init aufrufen? Das wird in der Regel schon getan.



Wenn ich vor mich hin tippe kann ich mit Quick Fix einfach zB eine neue Klasse erstellen Ich tippe zB:

```
EineKlasse klasse = new EineKlasse();
```
Da es die Klasse noch nicht gibt, wird "EineKlasse" in beiden Stellen markiert. Mit Ctrl + 1 bekomme ich die Möglichkeit "Create class "EineKlasse" oder so ähnlich.. und soetwas würde ich gerne nachbauen..

Mein WIzard funktioniert, mein QUickFix auch.. aber wenn der Lösungsvorschlag (den ich erstellt habe) ausgewählt wird, müsste mein WIzard irgendwie aufgerufen werden. Und wie das funktioniert, weiß ich nicht..

Um es deutlicher zu machen: Ich habe die Klasse AddResourceProposal erstellt, die IJavaCompletionProposal implementiert. Meine Vorschläge werden auch beim Quick Fix korrekt angezeigt.. nun überschreibt meine Klasse die Methode apply(IDocument document), in der ich irgendwie den WIzard starten/ öffnen/ anzeigen will.. 
Nur das wie fehlt 

Ich hoffe ich konnte mich jetzt deutlicher ausdrücken..


----------



## MZ3291 (6. Nov 2012)

Wie so oft hat sich das Problem shcon wieder fast von selbst gelöst ^^ Hier der entscheidende Teil:


```
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

public class AddResourceProposal implements IJavaCompletionProposal {

	private String resourceValue;
....
	@Override
	public void apply(IDocument document) {
		Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
		PropertyKeyWizard propertyKeyWizard = new PropertyKeyWizard(resourceValue);
		WizardDialog wizardDialog = new WizardDialog(parent, propertyKeyWizard);
		wizardDialog.open();	
	}
....
}
```


----------

