view jface/ActionAndStatusbar.d @ 171:0a21c7cabc16

presentation windows
author Frank Benoit <benoit@tionex.de>
date Sun, 26 Oct 2008 14:07:11 +0100
parents 6e6405809faf
children
line wrap: on
line source

/*
DWT/JFace in Action
GUI Design with Eclipse 3.0
Matthew Scarpino, Stephen Holder, Stanford Ng, and Laurent Mihalkovic

ISBN: 1932394273

Publisher: Manning

Port to the D programming language:
    Frank Benoit <benoit@tionex.de>
Added some stuff to play with the statusbar and its progressmonitor

*/
module jface.ActionAndStatusbar;

import dwtx.jface.action.Action;
import dwtx.jface.action.ActionContributionItem;
import dwtx.jface.action.MenuManager;
import dwtx.jface.action.StatusLineManager;
import dwtx.jface.action.ToolBarManager;
import dwtx.jface.action.Separator;
import dwtx.jface.resource.ImageDescriptor;
import dwtx.jface.window.ApplicationWindow;
import dwtx.core.runtime.IProgressMonitor;
import dwt.DWT;
import dwt.widgets.Composite;
import dwt.widgets.Control;
import dwt.widgets.Display;
import dwt.widgets.Group;
import dwt.widgets.Button;
import dwt.widgets.Event;
import dwt.widgets.Listener;
import dwt.widgets.Text;
import dwt.layout.GridData;
import dwt.layout.GridLayout;

import tango.text.convert.Format;
version(JIVE) import jive.stacktrace;
import dwt.dwthelper.utils;
import dwt.dwthelper.Runnable;

void main() {
    auto swin = new ActionAndStatusbar();
    swin.setBlockOnOpen(true);
    swin.open();
    Display.getCurrent().dispose();
}

public class ActionAndStatusbar : ApplicationWindow {
    StatusLineManager slm;

    StatusAction status_action;

    ActionContributionItem aci;

    public this() {
        super(null);
        slm = new StatusLineManager();
        status_action = new StatusAction(slm);
        aci = new ActionContributionItem(status_action);
        addStatusLine();
        addMenuBar();
        addToolBar(DWT.FLAT | DWT.WRAP);
    }

    protected Control createContents(Composite parent) {
        getShell().setText("Action/Contribution Example");
        //parent.setSize(290, 150);
        //aci.fill(parent);
        Composite comp = cast(Composite) super.createContents(parent);
        comp.setLayout( new GridLayout());
        new Text( comp, DWT.BORDER );
        auto grp = new Group(comp, DWT.None);
        grp.setLayoutData( new GridData( GridData.FILL_BOTH ));
        //grp.setSize( 200, 200 );
        grp.setText("Action enable" );
        grp.setLayout(new GridLayout( 1, true ));
        with( new Button( grp, DWT.RADIO )){
            setText( "On" );
            addListener( DWT.Selection, dgListener( &doEnable, true ));
        }
        with( new Button( grp, DWT.RADIO )){
            setText( "Off" );
            addListener( DWT.Selection, dgListener( &doEnable, false ));
        }
        return comp;
    }
    void doEnable( Event e, bool state ){
        status_action.setEnabled( state );
    }

    protected MenuManager createMenuManager() {
        MenuManager main_menu = new MenuManager(null);
        MenuManager file_menu = new MenuManager("File");
        MenuManager action_menu = new MenuManager("Menu");
        main_menu.add(file_menu);
        main_menu.add(action_menu);
        action_menu.add(status_action);
        file_menu.add(status_action);
        return main_menu;
    }

    protected ToolBarManager createToolBarManager(int style) {
        ToolBarManager tool_bar_manager = new ToolBarManager(style);
        tool_bar_manager.add(status_action);
        tool_bar_manager.add(new Separator());
        tool_bar_manager.add(status_action);
        return tool_bar_manager;
    }

    protected StatusLineManager createStatusLineManager() {
        return slm;
    }
}

class StatusAction : Action {
    StatusLineManager statman;

    short triggercount = 0;

    public this(StatusLineManager sm) {
        super("&Trigger@Ctrl+T", AS_PUSH_BUTTON);
        statman = sm;
        setToolTipText("Trigger the Action");
        setImageDescriptor(ImageDescriptor.createFromFile(
            getImportData!("eclipse-icon-red-16.png")));
    }

    public void run() {
        triggercount++;
        statman.setMessage( Format("The status action has fired. Count: {}", triggercount));

        if( triggercount % 5 == 0 ){
            statman.setCancelEnabled(true);
            auto pm = statman.getProgressMonitor();
            pm.setCanceled(false);
            pm.beginTask( "Task", 100 );
            auto runner = new class(pm) Runnable {
                IProgressMonitor pm;
                int w;
                this(IProgressMonitor a){
                    this.pm = a;
                }
                void run(){
                    const incr = 2;
                    this.pm.worked( incr );
                    w += incr;
                    if( w < 100 && !this.pm.isCanceled() ){
                        Display.getCurrent().timerExec( 100, this);
                    }
                    else{
                        this.pm.done();
                    }
                }
            };
            Display.getCurrent().syncExec(runner);
        }
    }
}