Search code examples
eclipse-pluginswteclipse-rcpjface

In Eclipse WizardPage - Issues in Navigating between pages


I have written a small program which should navigate from one page to another. But I am unable to do that.

My requirement is

On PageOne, if the user Enters a value it should be validated i.e simple comparison in this case it is "123". if it matches the proceed to the next page as shown below:

Page One

enter image description here

Page Two

enter image description here

else throw a dialogue box below:

Page One

enter image description here

Page One Code:

    package testing.importWizards;

    import org.eclipse.jface.dialogs.MessageDialog;
    import org.eclipse.jface.wizard.IWizardPage;
    import org.eclipse.jface.wizard.WizardPage;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.KeyEvent;
    import org.eclipse.swt.events.KeyListener;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;

    public class PageOne extends WizardPage {
        private Text text1;
        private Composite container;
        boolean isVisible=false;

        public PageOne() {
            super("Page One");
            setTitle("Page One");
            setDescription("Fake Wizard: Page One");
        }

        @Override
        public void createControl(Composite parent) {
            container = new Composite(parent, SWT.NONE);
            GridLayout layout = new GridLayout();
            container.setLayout(layout);
            layout.numColumns = 2;
            Label label1 = new Label(container, SWT.NONE);
            label1.setText("Put a value here.");

            text1 = new Text(container, SWT.BORDER | SWT.SINGLE);
            text1.setText("");
            text1.addKeyListener(new KeyListener() {

                @Override
                public void keyPressed(KeyEvent e) {
                }

                @Override
                public void keyReleased(KeyEvent e) {
                    if (!text1.getText().isEmpty()) {
                        setPageComplete(true);
                    }
                }
            });
            GridData gd = new GridData(GridData.FILL_HORIZONTAL);
            text1.setLayoutData(gd);
            setControl(container);
            setPageComplete(false);
        }


        @Override
        public IWizardPage getNextPage() {
            // TODO Auto-generated method stub

            Shell shell=getShell();
            return super.getNextPage();
        }

        public String getText1() {
            return text1.getText();
        }
    }

Page Two Code:

    package testing.importWizards;


    import org.eclipse.jface.wizard.WizardPage;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.KeyEvent;
    import org.eclipse.swt.events.KeyListener;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Text;

    public class PageTwo extends WizardPage {
        private Text text1;
        private Composite container;

        public PageTwo() {
            super("Page Two");
            setTitle("Page Two");
            setDescription("Fake Wizard: Page Two");
        }

        @Override
        public void createControl(Composite parent) {
            container = new Composite(parent, SWT.NONE);
            GridLayout layout = new GridLayout();
            container.setLayout(layout);
            layout.numColumns = 2;
            Label label1 = new Label(container, SWT.NONE);
            label1.setText("Success");

            /*text1 = new Text(container, SWT.BORDER | SWT.SINGLE);
            text1.setText("");
            text1.addKeyListener(new KeyListener() {

                @Override
                public void keyPressed(KeyEvent e) {
                }

                @Override
                public void keyReleased(KeyEvent e) {
                    if (!text1.getText().isEmpty()) {
                        setPageComplete(true);
                    }
                }
            });*/
            GridData gd = new GridData(GridData.FILL_HORIZONTAL);
            //text1.setLayoutData(gd);
            setControl(container);
            //setPageComplete(false);
            setPageComplete(true);
        }

        public String getText1() {
            return text1.getText();
        }
    }

I have teid overriding setVisible and getNextPage Methods, but I am getting erroneous behaviour. Could someone please explaing me the logic for implementing the validation. Is my entire approach wrong?


Solution

  • Rather than displaying a dialog it is usual for a wizard page to display errors in the top area of the wizard using setErrorMessage or setError.

    Usually it is convenient to do the validation every time data on the page is changed. For your example page one something like:

    public class PageOne extends WizardPage
    {
      private Text text1;
    
      public PageOne()
      {
        super("testWizardPage");
    
        setTitle("Page One");
        setDescription("Fake Wizard: Page One");
      }
    
      @Override
      public void createControl(final Composite parent)
      {
        Composite container = new Composite(parent, SWT.NONE);
        container.setLayout(new GridLayout(2, false));
    
        Label label1 = new Label(container, SWT.NONE);
        label1.setText("Put a value here.");
    
        text1 = new Text(container, SWT.BORDER | SWT.SINGLE);
        text1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
    
        text1.addModifyListener(this::modifyListener);
    
        setControl(container);
    
        setPageComplete(false);
      }    
    
      private void modifyListener(final ModifyEvent event)
      {
        boolean empty = text1.getText().isEmpty();
    
        if (empty)
          setErrorMessage("Text must be entered");
        else
          setErrorMessage(null);
    
        setPageComplete(!empty);
      }
    }
    

    This is using a 'modify listener' on the text1 field and calling setErrorMessage and setPageComplete each time the field is changed.