tly
tly

Reputation: 1272

Eclipse: Using IStructuredSelection in INewWizard

I created a NewFile-Wizard for a plugin in eclipse. I would like to place the new file exactly where the forwarded IStructuredSelection points. My problem is that I only know how to handle instances of IResource but not other resources:

public class WizardNewShader extends Wizard implements INewWizard {

... implementations omitted...

    IContainer fileLocation;



    @Override
    public void init(IWorkbench workbench, IStructuredSelection selection) {
        Object s = selection.getFirstElement();
        if (s instanceof IResource) {
            if (s instanceof IContainer) {
                fileLocation = (IContainer) s;
            } else {
                fileLocation = ((IResource) s).getParent();
            }
        } else {
            System.out.println("what shall we do with a " + s.getClass() + "?");
        }
    }
}

Some container types work nicely, because they are instances of IResource, but others are not recognized:

what shall we do with a class org.eclipse.jdt.internal.core.PackageFragment?
what shall we do with a class org.eclipse.jdt.internal.core.JavaProject?
what shall we do with a class org.eclipse.cdt.internal.core.model.SourceRoot?

Is there any other way to handle theses resources than a big instanceof switch, that contains different code for every resource type?

Upvotes: 0

Views: 115

Answers (1)

greg-449
greg-449

Reputation: 111197

User interface objects generally don't implement the IResource interface directly, instead they provide an 'adapter'. In some cases they implement IAdaptable and you can get the resource using:

IAdaptable adaptable = (IAdaptable)s;

IResource resource = (IResource)adaptable.getAdapter(IResource.class);

In other cases the 'adapter manager' is used:

IResource resource = (IResource)Platform.getAdapterManager().getAdapter(s, IResource.class);

The adapter manager will generally deal with most cases.

Upvotes: 2

Related Questions