view jface/snippets/wizard/Snippet047WizardWithLongRunningOperation.d @ 146:7c4b76583cb8

Added new JFace snippets
author Frank Benoit <benoit@tionex.de>
date Mon, 11 Aug 2008 11:17:37 +0200
parents
children
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2005, 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 * Port to the D programming language:
 *     Frank Benoit <benoit@tionex.de>
 *******************************************************************************/
module jface.snippets.wizard.Snippet047WizardWithLongRunningOperation;

import dwtx.jface.viewers.ArrayContentProvider;
import dwtx.jface.viewers.ISelectionChangedListener;
import dwtx.jface.viewers.SelectionChangedEvent;
import dwtx.jface.viewers.TableViewer;
import dwtx.jface.wizard.IWizardPage;
import dwtx.jface.wizard.Wizard;
import dwtx.jface.wizard.WizardDialog;
import dwtx.jface.wizard.WizardPage;
import dwt.DWT;
import dwt.events.SelectionAdapter;
import dwt.events.SelectionEvent;
import dwt.layout.FillLayout;
import dwt.layout.GridData;
import dwt.layout.GridLayout;
import dwt.widgets.Button;
import dwt.widgets.Composite;
import dwt.widgets.Display;
import dwt.widgets.Label;
import dwt.widgets.ProgressBar;
import dwt.widgets.Shell;

import dwt.dwthelper.utils;
import dwt.dwthelper.Runnable;
import dwtx.dwtxhelper.Collection;
import tango.core.Thread;
import tango.text.convert.Format;
import tango.util.log.Trace;

import dwtx.jface.operation.ModalContext;

/**
 * Example how to load data from a background thread into a TableViewer
 *
 * @author Tom Schindl <tom.schindl@bestsolution.at>
 * @since 1.0
 */
public class Snippet047WizardWithLongRunningOperation {

    private static class MyWizard : Wizard {

        private int loadingType;

        public this(int loadingType) {
            this.loadingType = loadingType;
        }

        /*
         * (non-Javadoc)
         *
         * @see dwtx.jface.wizard.Wizard#addPages()
         */
        public void addPages() {
            addPage(new MyWizardPageThread("Thread Page", loadingType));
            addPage(new MyWizardPage("Standard Page"));
        }

        public bool performFinish() {
            return true;
        }

        /*
         * (non-Javadoc)
         *
         * @see dwtx.jface.wizard.Wizard#canFinish()
         */
        public bool canFinish() {
            IWizardPage[] pages = getPages();
            for (int i = 0; i < pages.length; i++) {
                if (!pages[i].isPageComplete()) {
                    return false;
                }
            }

            return true;
        }

    };

    private static class MyWizardPage : WizardPage {

        protected this(String pageName) {
            super(pageName);
            setTitle(pageName);
        }

        public /+override+/ void createControl(Composite parent) {
            Composite comp = new Composite(parent, DWT.NONE);
            setControl(comp);
        }
    }

    private static class MyWizardPageThread : WizardPage {
        private int loadingType;
        private bool loading = true;
        private TableViewer v;

        protected this(String pageName, int loadingType) {
            super(pageName);
            this.loadingType = loadingType;
            setTitle(pageName);
        }

        public /+override+/ void createControl(Composite parent) {
            auto mt = new MyThread();
            mt.parent = parent;

            mt.comp = new Composite(parent, DWT.NONE);
            mt.comp.setLayout(new GridLayout(1, false));

            v = new TableViewer(mt.comp, DWT.FULL_SELECTION);
            v.setContentProvider(new ArrayContentProvider!(Object)());
            v.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
            v.addSelectionChangedListener(new class ISelectionChangedListener {

                public void selectionChanged(SelectionChangedEvent event) {
                    getWizard().getContainer().updateButtons();
                }

            });

            mt.barContainer = new Composite(mt.comp, DWT.NONE);
            mt.barContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            mt.barContainer.setLayout(new GridLayout(2, false));

            Label l = new Label(mt.barContainer, DWT.NONE);
            l.setText("Loading Data");

            mt.bar = new ProgressBar(mt.barContainer,
                    (loadingType == 1) ? DWT.INDETERMINATE : DWT.NONE);
            mt.bar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

            if (loadingType == 2) {
                mt.bar.setMaximum(10);
            }

            setControl(mt.comp);

            ModalContext.run( dgRunnable(&mt.threadWork), true, getProgressMonitor(), getShell().getDisplay() );

            //Thread t = new Thread(&mt.threadWork);

            // t.start();
        }
        class MyThread {
            private Composite parent;
            private Composite barContainer;
            private Composite comp;
            private ProgressBar bar;

            private void threadWork(){
                if (loadingType == 1) {
                    try {
                        Thread.sleep(10.000);
                        ArrayList ms = new ArrayList();
                        for (int i = 0; i < 10; i++) {
                            ms.add(new MyModel(i));
                        }

                        if (v.getTable().isDisposed()) {
                            return;
                        }

                        parent.getDisplay().asyncExec(dgRunnable((ArrayList ms_){
                                v.setInput(ms_);
                                (cast(GridData) barContainer.getLayoutData()).exclude = true;
                                comp.layout(true);
                        }, ms ));
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        ExceptionPrintStackTrace(e);
                    }
                } else {
                    ArrayList ms = new ArrayList();
                    parent.getDisplay().syncExec( dgRunnable( (ArrayList ms_){
                        v.setInput(ms_);
                    }, ms ));

                    for (int i = 0; i < 10; i++) {
                        int j = i;
                        if (v.getTable().isDisposed()) {
                            return;
                        }
                        parent.getDisplay().asyncExec( dgRunnable( (int j_){
                            MyModel tmp = new MyModel(j_);
                            v.add(tmp);
                            ms.add(tmp);
                            bar.setSelection(j_ + 1);
                        }, j ));

                        try {
                            Thread.sleep(1.000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            ExceptionPrintStackTrace(e);
                        }
                    }

                    parent.getDisplay().asyncExec(dgRunnable( {

                            (cast(GridData) barContainer.getLayoutData()).exclude = true;
                            comp.layout(true);
                    }));
                }

                parent.getDisplay().syncExec(dgRunnable( {
                    loading = false;
                    getWizard().getContainer().updateButtons();
                }));
            }
        }
        public bool isPageComplete() {
            return !loading && !v.getSelection().isEmpty();
        }

    }

    private static class MyModel {
        private int index;

        public this(int index) {
            this.index = index;
        }

        public String toString() {
            return Format("Item-{}", index);
        }
    }

    static Shell shell;
    public static void main(String[] args) {
        Display display = new Display();

        shell = new Shell(display);
        shell.setLayout(new FillLayout());

        Button b = new Button(shell, DWT.PUSH);
        b.setText("Load in one Chunk");
        b.addSelectionListener(new class SelectionAdapter {

            public void widgetSelected(SelectionEvent e) {
                WizardDialog dialog = new WizardDialog(shell, new MyWizard(1));
                dialog.open();
            }

        });

        b = new Button(shell, DWT.PUSH);
        b.setText("Load Item by Item");
        b.addSelectionListener(new class SelectionAdapter {

            public void widgetSelected(SelectionEvent e) {
                WizardDialog dialog = new WizardDialog(shell, new MyWizard(2));
                dialog.open();
            }

        });

        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }

        display.dispose();
    }
}

void main(){
    Snippet047WizardWithLongRunningOperation.main(null);
}