Search code examples
eclipse-pluginswteclipse-rcpjface

SWT-How to transfer data from One Page to another


I have a WizardPage called PageOne with a text box, I want to print the data entered in the textBox of PageOne to be displayed in Page two.

I have tried saving the value in another object and passing that object to PageTwo object and they try displaying, I have tried sending pageOne object itself. But in both the case it prints out NULL. I believe it is printing out the default value i.e null is loaded while loading the page.

How do I handle such scenarios?

Code:

PageOne:

 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(true);
    }

PageTwo:

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

    public PageTwo(PageOne pageOne) {
        super("PageTwo ");
        this.pageOne=pageOne;
        setTitle("PageTwo ");
        setDescription("Fake Wizard: PageTwo");
    }

    public void setText(Text text){
        this.text2=text;
    }

    @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);
        String result="";

        if(pageOne.getText()!=null){
            result=pageOne.getText().toString();
        }

        label1.setText("Put a value here."+result);

       /* 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(true);
    }

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

Update

Changes made:

In Wizard Page:

public void addPages() {
    super.addPages(); 
    DataTransferObject dto = new DataTransferObject();
    addPage(new PageOne(dto));
    addPage(new PageTwo(dto));
    addPage(new PageThree());
}

DataTransferObject

public class DataTransferObject {

    String data=null;

    public String getData(){
        return this.data;
    }

    public void setData(String data){
        this.data=data;
    }

}

PageOne:

public class PageOne extends WizardPage {
    private Text text1;
    private Composite container;
    private DataTransferObject dto;

    public Text getText(){
        return this.text1;
    }

    public PageOne(DataTransferObject dto) {
        super("PageOne ");
        setTitle("PageOne ");
        this.dto=dto;
        setDescription("Fake Wizard: PageOne");
    }

    @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(true);
    }

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

    @Override
    public IWizardPage getNextPage() {
        // TODO Auto-generated method stub
        System.out.println("Data is "+this.text1.getText().toString());
        dto.setData(this.text1.getText().toString());
        return super.getNextPage();
    }
}

PageTwo:

public class PageTwo extends WizardPage {
    private Text text1;
    private Composite container;
    private Text text2;
    PageOne pageOne;
    DataTransferObject dto; 

    public PageTwo(DataTransferObject dto) {
        super("PageTwo ");
        this.dto=dto;
        setTitle("PageTwo ");
        setDescription("Fake Wizard: PageTwo");
    }

    public void setText(Text text){
        this.text2=text;
    }

    @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);
        String result="";

        org.eclipse.swt.widgets.List single = new org.eclipse.swt.widgets.List(container, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
        if(!(dto.data==null)){
            single.add(dto.getData());
        }
        setControl(container);
        setPageComplete(true);
    }

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

UI Part:

PageOne enter image description here

Page Two

enter image description here


Solution

  • One way is to pass the same object to both pages when you construct them.

    So your Wizard might do:

    @Override
    public void addPages()
    {
      DataTransferObject dto = new DataTransferObject();
    
      addPage(new PageOne(dto));
    
      addPage(new PageTwo(dto);
    }
    

    And the wizard pages would look like:

    public class PageOne extends WizardPage {
        DataTransferObject dto;
    
        public PageOne(DataTransferObject dto) {
            super("PageOne");
    
            this.dto = dto;
        }
    
    public class PageTwo extends WizardPage {
        DataTransferObject dto;
    
        public PageTwo(DataTransferObject dto) {
            super("PageTwo ");
    
            this.dto = dto;
        }
    

    DataTransferObject is some class that you write containing the data you want to share. PageOne should set values in to the object so that PageTwo can retrieve them.

    PageTwo should wait for the setVisible call to access the data:

     @Override
     public void setVisible(final boolean visible)
     {
       if (visible)
        {
          // TODO access data and update the controls which show the data
        }
     }
    
    super.setVisible(visible);
    

    }

    The setVisible code must update the controls which have already been created. So for a Text control you would call setText and so on.