При переходе от WizardsPage1 к 2 через следующий, как заставить пользователя остаться на той же странице, если нажата кнопка отмены индикатора выполнения? - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть страница мастера, как показано ниже -

enter image description here

Когда нажата кнопка Next, панель прогесов отображается, как показано ниже -

enter image description here

Если действие панели Progess отменено, я хочу сохранить пользователя на той же странице, откуда нажимается следующая кнопка. Как я могу добиться этого?

Я делаю ниже, чтобы показать индикатор выполнения WizardPage2

@Override
    public void setVisible(boolean visible) {
        if (visible) {
            InterfacePage interfacePage = (InterfacePage) (getWizard().getPage("NewInterfacePage"));
            String interfaceId = interfacePage.getInterfaceID();

            try {
                getContainer().run(true, true, new IRunnableWithProgress() {

                    @Override
                    public void run(IProgressMonitor arg0) throws InvocationTargetException, InterruptedException {
                        int amount = 10;
                        arg0.beginTask("Fetching details from External System...", 10);
                        for (int i = 0; i < amount; i++) {
                            arg0.internalWorked(1);
                            Thread.sleep(2000);
                            if (arg0.isCanceled()) {
                                cancelled = true;

                                break;
                            }
                        }
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        super.setVisible(visible);
    }

Пример кода, который не работает -

Главный мастер -

public class TemplateCreationWizard extends Wizard implements INewWizard, IExecutableExtension {

    private InterfacePage interfacePage;
    private InterfaceDetailsPage interfaceDetailsPage;
    private ErrorPage error;
    private IConfigurationElement _configurationElement;

    private SelectedServerNode iServer;

    public TemplateCreationWizard() {
        setWindowTitle("Auto Development");
    }

    @Override
    public void addPages() {
        super.addPages();

        if (iServer.isConnected()) {
            interfacePage = new InterfacePage(iServer);
            interfaceDetailsPage = new InterfaceDetailsPage(iServer);

            addPage(interfacePage);
            addPage(interfaceDetailsPage);

            setNeedsProgressMonitor(true);
        } else {
            error = new ErrorPage(iServer);
            addPage(error);
        }

    }

    @Override
    public boolean performFinish() {
        // will do something
        return true;
    }

    @Override
    public void init(IWorkbench workbench, IStructuredSelection selection) {

        try {
            TreeSelection treeSelection = (TreeSelection) selection;

            TreePath[] treePaths = treeSelection.getPaths();
            if (null != treePaths && treePaths.length > 0) {
                TreePath treePath = treePaths[0];
                ISServerNode serverNode = (ISServerNode) treePath.getFirstSegment();
                ServerConnection iData = serverNode.getServerConnection();
                if (null != iData) {
                    iServer = createSelectedServerNode(iData);
                    // do domething
                }
            } else {
                // ... logic in case appropriate node is not selected
                System.out.println("<empty selection>");
            }
        } catch (Exception exception) {

        }

    }

    @Override
    public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
            throws CoreException {
        _configurationElement = config;

    }


    @Override
    public IWizardPage getNextPage(final IWizardPage page) {
        if (!(page instanceof InterfacePage))  //Next page from first page?
            return super.getNextPage(page);

         //Moving from first to second page, run the progress

        try {
            getContainer().run(true, true, new IRunnableWithProgress() {

                @Override
                public void run(IProgressMonitor arg0) throws InvocationTargetException, InterruptedException {
                    int amount = 10;
                    arg0.beginTask("Fetching details from External System...", 10);
                    for (int i = 0; i < amount; i++) {
                        arg0.internalWorked(1);
                        Thread.sleep(2000);

                    }
                }
            });
        } catch (InvocationTargetException ex) {
             //TODO deal with error
        } catch (InterruptedException ex) {
             //Cancelled
            return null;  //Stay on same page
        }
        return super.getNextPage(page);
    }
}

Страницы мастера -

Страница 1 -

public class InterfacePage extends WizardPage {
    private SelectedServerNode iServer = null;

    private class CompleteListener implements KeyListener {
        @Override
        public void keyPressed(KeyEvent e) {
        }
        @Override
        public void keyReleased(KeyEvent e) {
            boolean hasInterfaceID = !"".equals(getTextFrom(interfaceId));
            if (!hasInterfaceID) {
                setMessage("Please enter an Interface ID", IMessageProvider.ERROR);
            }
            if (hasInterfaceID) {
                setMessage(null);
            }
            setPageComplete(hasInterfaceID);
        }
    }

    private Text interfaceId;
    protected InterfacePage(SelectedServerNode iServer) {
        super("InterfacePage");

        this.iServer = iServer;
        setTitle("Some title");
        setMessage("Some message");
    }

    @Override
    public void createControl(Composite parent) {
        Composite page = new Composite(parent, SWT.NONE);
        setControl(page);
        setPageComplete(false);

        // page.setLayout(new GridLayout(2, false));
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        gridLayout.makeColumnsEqualWidth = false;
        page.setLayout(gridLayout);

        page.setLayoutData(new GridData(GridData.FILL_BOTH));

        Label label = new Label(page, SWT.NONE);
        label.setText("Interface ID:");

        interfaceId = new Text(page, SWT.BORDER);
        GridData interfaceIdGridData = new GridData(GridData.FILL_HORIZONTAL);
        interfaceId.setLayoutData(interfaceIdGridData);

        CompleteListener listener = new CompleteListener();
        interfaceId.addKeyListener(listener);

    }


    @Override
    public boolean canFlipToNextPage()
    {
      // Default calls getNextPage() which runs the progress just checking page complete is enough here
      return isPageComplete();
    }


    private String getTextFrom(Text text) {
        return text == null || text.isDisposed() ? null : text.getText();
    }

    public String getInterfaceID() {
        return getTextFrom(interfaceId);
    }

}

Страница 2 -

public class InterfaceDetailsPage extends WizardPage {

    private SelectedServerNode iServer;

    protected InterfaceDetailsPage(SelectedServerNode iServer) {
        super("InterfaceDetailsPage");

        this.iServer = iServer;
        setTitle("Interface ID details");
        setMessage("Provided Interface ID details is shown below");
    }
    @Override
    public void createControl(Composite parent) {

            Composite page = new Composite(parent, SWT.NONE);
            setControl(page);
            page.setLayout(new FillLayout());

    }

    @Override
    public IWizard getWizard() {
        IWizard wizard = super.getWizard();
        return wizard;
    }
    @Override
    public void setVisible(boolean visible) {

        if (visible) {
            InterfacePage interfacePage = (InterfacePage) (getWizard().getPage("InterfacePage"));
            String interfaceId = interfacePage.getInterfaceID();
            // do something...
        }
        super.setVisible(visible);
    }

}

1 Ответ

1 голос
/ 09 февраля 2020

Лучший способ сделать индикатор выполнения между страницами - переопределить метод getNextPage вашего класса Wizard. getNextPage может вернуть null, чтобы остановить изменение.

@Override
public IWizardPage getNextPage(final IWizardPage page)
{
  if (!(page instanceof YourFirstPage))  // Next page from first page?
    return super.getNextPage(page);

  // Moving from first to second page, run the progress

  try
   {
     getContainer().run .....
   }
  catch (InvocationTargetException ex)
   {
     // TODO deal with error
   }
  catch (InterruptedException ex)
   {
     // Cancelled
     return null;  // Stay on same page
   }

  return super.getNextPage(page);
}

Вам также потребуется переопределить canFlipToNextPage в первой странице WizardPage, поскольку вызовы по умолчанию getNextPage:

@Override
public boolean canFlipToNextPage()
{
  // Default calls getNextPage() which runs the progress just checking page complete is enough here
  return isPageComplete();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...