view dwtx/novocode/ishell/internal/CustomDrawnButton.d @ 190:df4e66472aff

novocode line endings, indention
author Frank Benoit <benoit@tionex.de>
date Sun, 26 Oct 2008 15:04:41 +0100
parents e3780acbbf80
children
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2005 Stefan Zeiger 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.novocode.com/legal/epl-v10.html
 * 
 * Contributors:
 *     Stefan Zeiger (szeiger@novocode.com) - initial API and implementation
 *******************************************************************************/

module dwtx.novocode.ishell.internal.CustomDrawnButton;

import dwt.DWT;
import dwt.graphics.Point;
import dwt.widgets.Canvas;
import dwt.widgets.Composite;
import dwt.widgets.Display;
import dwt.widgets.Event;
import dwt.widgets.Listener;


/**
 * A simple button control which needs to be subclassed to draw a specific
 * kind of button. This base class provides the event handling.
 * 
 * @author Stefan Zeiger (szeiger@novocode.com)
 * @since Jan 30, 2005
 * @version $Id: CustomDrawnButton.java 320 2005-02-26 13:37:02 +0000 (Sat, 26 Feb 2005) szeiger $
 */

class CustomDrawnButton : Canvas
{
    private bool pressed;
    private Display display;
    private bool drawnMouseIn = false;


    this(Composite parent, int style)
    {
        super(parent, style);
        this.display = getDisplay();

        addListener(DWT.Paint, dgListener(&paintListener));

        addListener(DWT.MouseDown, dgListener(&onMouseDown));

        addListener(DWT.MouseUp, dgListener(&onMouseUp));

        addListener(DWT.MouseMove, dgListener(&onMouseMove));
    }


    private void paintListener(Event event)
    {
        bool mouseIn = mouseIn();
        onPaint(event, pressed && mouseIn);
        drawnMouseIn = mouseIn;
    }


    private void onMouseDown(Event event)
    {
        if(event.button is 1)
        {
            pressed = true;
            redraw();
        }
        else if(event.button is 3 && (event.stateMask & DWT.BUTTON1) !is 0) // chord click
        {
            pressed = false;
            redraw();
        }
    }


    private void onMouseUp(Event event)
    {
        if(pressed && (event.stateMask & DWT.BUTTON1) !is 0)
        {
            pressed = false;
            if(mouseIn())
            {
                Event selectionEvent = new Event();
                notifyListeners(DWT.Selection, selectionEvent);
            }
            if(!isDisposed()) redraw();
        }
    }


    private void onMouseMove(Event event)
    {
        if(!pressed) return;
        bool mouseIn = mouseIn();
        if(mouseIn is drawnMouseIn) return;
        redraw();
    }


    private bool mouseIn()
    {
        Point p = toControl(display.getCursorLocation());
        if(p.x < -1 || p.y < -1) return false;
        Point size = getSize();
        return p.x <= size.x+1 && p.y <= size.y+1;
    }


    public Point computeSize(int wHint, int hHint, bool changed)
    {
        checkWidget();
        if(wHint is DWT.DEFAULT) wHint = 0;
        if(hHint is DWT.DEFAULT) hHint = 0;
        return new Point(wHint, hHint);
    }


    public bool setFocus()
    {
        checkWidget();
        return false;
    }


    public bool isReparentable ()
    {
        checkWidget();
        return false;
    }


    protected abstract void onPaint(Event event, bool pressed);
}