Разрешить запуск мастера только из существующего проекта - PullRequest
2 голосов
/ 04 мая 2011

Я делаю Мастер импорта для плагина Eclipse.

Это должно быть разрешено только в том случае, если выделение является IP-проектом и отображает ошибку (и закрывается само) в противном случае.

Как вы это осуществите?

Я пытался использовать getShell().close() и getContainer().getShell().close() из моего OwnWizard.init(...) метода, если выбор не IProject, но я получаю NullPointerException в отношении getShell() (кажется, что он еще не действителен).

Я пытался использовать этот фрагмент:

public class GetPackWizard extends Wizard implements IImportWizard {
private IProject project = null;
// ...
@Override
public void addPages() {
    logger.trace("Adding pages.");
    addPage(new SelectPackagesWizardPage(project));
    versionsPage = new SelectVersionsWizardPage(project);
    addPage(versionsPage);
}

//...
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
    project = null;
    if (selection.size() > 0) {
        Object obj = selection.getFirstElement();
        if (obj instanceof IResource) {
            IResource resource = (IResource)obj;
                if (obj instanceof IProject)
                    project = (IProject)obj;
                else
                    project = resource.getProject();
        }
    }

    if (project == null) {
        MessageDialog.openError(
            getShell(),
            "GetPack Wizard", 
            "You must run this wizard from a project."
        );
        performCancel();
    }
}

Хотя мастер закрывается, метод addPages() все еще вызывается, что приводит к некоторому NullPointerException (так как поле project имеет значение null).

Есть ли способ, которым я могу предотвратить это? Было бы здорово, если бы мне не пришлось переопределять метод createControls() Wizard:)

Спасибо за вашу помощь,

С уважением,

Грег *.

1 Ответ

2 голосов
/ 04 мая 2011

Поскольку вы говорите о закрытии shell и т. Д., Я предполагаю, что вы уже выяснили, выбор является IP-проектом и отображает ошибку .

Закрытие мастера:

Все стандартные мастера реализуют абстрактные org.eclipse.jface.wizard.Wizard. Если вы хотите закрыть его, просто вызовите его метод performCancel(). (я не знал, что вы вызываете getShell().close() в init())


Обновление:

Причина проста. Когда вы выбираете определенного мастера в мастере import и нажимаете «Далее», из org.eclipse.jface.wizard.WizardSelectionPage

вызывается следующий метод
public IWizardPage getNextPage() 
{
    if (selectedNode == null) {
        return null;
    }

    boolean isCreated = selectedNode.isContentCreated();

    IWizard wizard = selectedNode.getWizard(); // THIS WILL CALL THE INIT

    if (wizard == null) {
        setSelectedNode(null);
        return null;
    }

    if (!isCreated) {
        // Allow the wizard to create its pages
        wizard.addPages();              // THIS IS ADDING THE EXTRA PAGES
    }

    return wizard.getStartingPage();
}

Как вы можете видеть, оператор IselectedNode.getWizard(); приходит раньше, чем wizard.addPages();, поэтому даже если вы определили, что выбор не является IProject и называется performCancel() (что не будет иметь никакого эффекта в качестве dialog-content- сама область не создается) она все равно будет переходить на wizard.addPages();.

Как вы уже заметили, getShell() в методе init() вернет null. Чтобы решить эту проблему (к сожалению), вы должны переопределить public void createPageControls(Composite pageContainer), , но не волнуйтесь, требуемое изменение минимально:

public void createPageControls(Composite pageContainer) {
    if(flag){
        getShell().close();
        return;
    }
    super.createPageControls(pageContainer);
}

Для справки см. Полный код ниже:

public class MyImportWizard extends Wizard implements IImportWizard {

    private IProject project = null;

    private boolean flag = false;

    public void addPages() {
        if(!flag)
            System.out.println("Hello");
    }

    public void createPageControls(Composite pageContainer) {
        if(flag){
            getShell().close();
            return;
        }
        super.createPageControls(pageContainer);
    }

    public void init(IWorkbench workbench, IStructuredSelection selection) 
    {
        project = null;
        if (selection.size() > 0) {
            Object obj = selection.getFirstElement();
            if (obj instanceof IResource) {
                IResource resource = (IResource)obj;
                if (obj instanceof IProject)
                    project = (IProject)obj;
                else
                    project = resource.getProject();
            }
        }

        if (project == null) {
            MessageDialog.openError(
                    getShell(),
                    "GetPack Wizard", 
                    "You must run this wizard from a project."
            );
            flag = true;
        }
    }

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

Попробуйте, а пока я посмотрю, можно ли сделать это более изощренно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...