SWT Import Wizard - frage zur WizardPage

  • Themenstarter Themenstarter Vasida
  • Beginndatum Beginndatum
V

Vasida

Gast
Hi,

ich möchte für mein Program eine ganz popelige und einfach Importseite haben, wo man über einen browse button ein zu importierendes file auswählt und dieses dann verarbeitet.
Ich steige nicht durch den ziemlich undurchsichtigen Aufbau dieser WizardPages durch.

Ich habe mir über die plugin.xml das ImportWizard Template genommen und dann einen eigene WizardPage dazu gemacht.

Prinzipiell komme so weit, dass ich den Wizard über das Menu öffnen kann und in einer Zeile mein Textdatei auswählen kann. Das mache ich mit einem FileFieldEditor
Nur ich steige überhaupt durch, wie ich da jetzt "verarbeiten" kann. Wie schaffe ich es, dass z.B. der Finish-Button aktiviert wird? Ich kann zwar etwas auswählen, aber dann nichts weiter damit machen. Ich suche etwas wie eine Art run()-Methode.

Wo kann ich meine Prüfungen durchführen, ob die Eingabe gültig ist?

Mein ImportWizard sieht so aus:
Java:
	BookmarkImportWizardPage mainPage;

	public BookmarkImportWizard() {
		super();
	}

	public boolean performFinish() {
		File file = mainPage.getSelectedFile();
        if (file == null)
            return false;
        return true;
	}
	 
	public void init(IWorkbench workbench, IStructuredSelection selection) {
		setWindowTitle("File Import Wizard"); //NON-NLS-1
		setNeedsProgressMonitor(true);
		mainPage = new BookmarkImportWizardPage("Import Bookmarks",selection); //NON-NLS-1
	}
	
    public void addPages() {
        super.addPages(); 
        addPage(mainPage);        
    }

}

Meine dazugehörige Page:
Java:
public class BookmarkImportWizardPage
	extends WizardPage
{

	private Composite container;
	private final IStructuredSelection selection;
	private FileFieldEditor fileFieldEditor;

	protected BookmarkImportWizardPage(String pageName,
			IStructuredSelection selection)
	{
		super(pageName);
		this.selection = selection;
	}

	@Override
	public void createControl(Composite parent)
	{

		container = new Composite(parent, SWT.NONE);

		fileFieldEditor = new FileFieldEditor("Import", "Select file",
				container);
		fileFieldEditor.setFileExtensions(new String[] { "*.xxxx" });

		// Required to avoid an error in the system
		setControl(container);
		setPageComplete(false);

	}

	public File getSelectedFile()
	{
		System.out.println("getSelectedFile()");
		return null;
	}
 
Hallo,

ich weiß nicht ob der FileFieldEditor außerhalb der Eclipse Preferences benutzt werden kann, oder wie das Konfiguriert wird. Ich habe mal schnell was in den Editor gehackt... Ich habe den Code nicht getestet, aber eventuelle Fehler sollten leicht zu finden sein.

Java:
public class BookmarkImportWizardPage
    extends WizardPage implements PropertyChangeListener{
	
	private Composite container;
	private final IStructuredSelection selection;
	private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

	public void addPropertyChangeListener(String propertyName,
			PropertyChangeListener listener) {
		pcs.addPropertyChangeListener(propertyName, listener);

	}
	
	public void addPropertyChangeListener(PropertyChangeListener listener) {
		pcs.addPropertyChangeListener(listener);

	}

	public void removePropertyChangeListener(PropertyChangeListener listener) {
		pcs.removePropertyChangeListener(listener);
	}

	@Override
	public void propertyChange(PropertyChangeEvent evt) {
		
	}
	
	public BookmarkImportWizardPage(String pageName,
	IStructuredSelection selection)
	{
		super(pageName);
		this.selection = selection;
	}
	
	private Text text;
	private String filename;

	public String getFilename(){
		return filename;
	}

	public void setFilename(String filename){
		pcs.firePropertyChange("filename", this.filename, this.filename = filename);
	}
	
	@Override
	public void createControl(Composite parent)


		container = new Composite(parent, SWT.NONE);
		
		Label label = new Label(composite_4, SWT.NONE);
		label.setLocation(0, 88);
		label.setSize(75, 15);
		label.setText("Importfile:");
		
		text = new Text(container, SWT.BORDER);
		text.setLocation(0, 109);
		text.setSize(422, 21);

		Button button = new Button(container, SWT.NONE);
		button.setLocation(0, 136);
		button.setSize(143, 25);
		button.setText("Select Importfile");
		
		button.addListener(SWT.Selection, new Listener(){

			@Override
			public void handleEvent(Event event) {
				FileDialog fd = new FileDialog(getSite().getShell(), SWT.OPEN);
		        fd.setText("Select Importfile");
		        fd.setFilterNames (new String [] {"Excel-File"});
		        fd.setFilterExtensions (new String [] {"*.xls*"});
		        String fileName = fd.open();
		        
		        if (fileName == null)
		            return;//Process canceled by user
		        text.setText(fileName);
			}
			
			
		});
		bindValues();
	}
	
	private void bindValues(){
		IValidator valFile = new IValidator(){

			@Override
			public IStatus validate(Object value) {
				String s = String.valueOf(value);
				
				File f = new File(s);
				if(f.exists()){
					setPageComplete(true);
					return ValidationStatus.ok();
				}
				return ValidationStatus.error("Is not a file");
			}
			
		};
		
		UpdateValueStrategy strategyFile = new UpdateValueStrategy();
		strategyFile.setBeforeSetValidator(valFile);
		
		IObservableValue widgetValue = WidgetProperties.text(SWT.Modify).observe(text);
		IObservableValue modelValue = BeanProperties.value(BookmarkImportWizardPage.class, "filename").observe(this);
		
		bindValue = ctx.bindValue(widgetValue, modelValue, strategyFile, null);
		ControlDecorationSupport.create(bindValue, SWT.TOP | SWT.LEFT);
	}


So sollte es funktionieren...

Gruß

MIMO
 
Wollte kein neuen Thread aufmachen,habe nämlich eine ähnliche Frage.
Bin auch gerade dabei eine Wizard Page zu bauen und scheitere daran das Textfeld oder den Button des FileFieldEditors anzusprechen,um bei verändertem Inhalt im Textfeld vom FileFieldEditors daraufhin meinen DirectoryFieldEditor zu "disablen".
Ist das möglich?
Die obige Antwort basiert darauf den FileFieldEditor ganz weg zu lassen,was ich jedoch nicht möchte,da die Eclipse Wizards meines Erachtens auch auf den jeweiligen Editoren basieren.In Eclipse wird das "disablen" durch RadioButtons gehandelt.Wenn jemand diese Möglichkeit aufzeigen würde,wäre ich natürlich auch sehr dankbar.
 
Die obige Antwort basiert darauf den FileFieldEditor ganz weg zu lassen,was ich jedoch nicht möchte,da die Eclipse Wizards meines Erachtens auch auf den jeweiligen Editoren basieren.In Eclipse wird das "disablen" durch RadioButtons gehandelt.Wenn jemand diese Möglichkeit aufzeigen würde,wäre ich natürlich auch sehr dankbar.
Die FieldEditors sind aber nicht für Wizards gedacht. Wie in der API Doc steht, werden sie normal nur im Zusammenhang mit einer entsprechenden Preference Page und dem Preference Store verwendet.
Field editors should be used in conjunction with a field editor preference page (FieldEditorPreferencePage) which coordinates everything and provides the message line which display messages emanating from the editor.

Das Databinding wie von 'mimo' gezeigt ist ein sauberer Weg. Wenn man sowieso schon ein anständiges Datenmodell (am besten EMF) dahinter liegen hat, dann fällt auch der ganze PCS Boiler Plate Code weg.
 
Habs jetzt hinbekommen🙂Nun habe ich noch eine weitere Frage.Die WizardPage steht soweit,aber wie schaffe ich es nun das ausgewählte Projekt im Package Explorer in einem Path oder String zu speichern und dem Import Wizard zu übergeben.Daraufhin muss man auf meiner Import Page den FileDialog nicht benutzen,da der Pfad von dem ausgewählten Projekt schon im Textfeld steht.Bin im Internet auf IResource gestoßen,wenn das etwas damit zu tun hat.Was dieses Interface angeht blick ich aber nicht ganz durch.
 
Habe es nun endlich selber herausgefunden.

IStructuredSelection ss = (IStructuredSelection) selection;
Object firstElement = ss.getFirstElement();
if (firstElement instanceof IAdaptable)
{
IProject project = (IProject)((IAdaptable)firstElement).getAdapter(IProject.class);
IPath path = project.getLocation();
System.out.println(path);
}
 

Neue Themen


Zurück
Oben