view jface/snippets/viewers/Snippet010OwnerDraw.d @ 145:161f7698cfb8

Moved jface snippets to viewers subpackage, there are more with conflicting numbers for other packages
author Frank Benoit <benoit@tionex.de>
date Fri, 08 Aug 2008 14:40:21 +0200
parents jface/snippets/Snippet010OwnerDraw.d@781fd8aadeae
children
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2006, 2008 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
 *     oliver.schaefer@mbtech-services.com - Fix for Bug 225051 [Snippets] Snippet010OwnerDraw - Wrong german flag
 * Port to the D programming language:
 *     yidabu at gmail dot com  ( D China http://www.d-programming-language-china.org/ )
 *******************************************************************************/
module snippets.viewers.Snippet010OwnerDraw.d;

import dwtx.jface.resource.JFaceResources;
import dwtx.jface.viewers.Viewer;
import dwtx.jface.viewers.ColumnPixelData;
import dwtx.jface.viewers.IStructuredContentProvider;
import dwtx.jface.viewers.OwnerDrawLabelProvider;
import dwtx.jface.viewers.StructuredSelection;
import dwtx.jface.viewers.TableLayout;
import dwtx.jface.viewers.TableViewer;
import dwt.DWT;
import dwt.graphics.Rectangle;
import dwt.graphics.TextLayout;
import dwt.graphics.TextStyle;
import dwt.layout.GridData;
import dwt.layout.GridLayout;
import dwt.widgets.Composite;
import dwt.widgets.Display;
import dwt.widgets.Event;
import dwt.widgets.Shell;
import dwt.widgets.TableColumn;

import dwt.dwthelper.utils;

void main(String[] args) {
    Snippet010OwnerDraw.main(args);
}

public class Snippet010OwnerDraw {

    public static void main(String[] args) {

        Display display = new Display();
        Shell shell = new Shell(display, DWT.CLOSE);
        shell.setSize(400, 400);
        shell.setLayout(new GridLayout());

        Snippet010OwnerDraw example = new Snippet010OwnerDraw();
        example.createPartControl(shell);

        shell.open();

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

    private static int COLUMN_COUNT = 3;

    class CountryEntry {

        String name;

        String cupYear;

        private String baseName;

        /**
         * Create a new instance of the receiver.
         *
         * @param countryName
         * @param worldCupYear
         */
        this(String countryName, String englishName, String worldCupYear) {
            name = countryName;
            cupYear = worldCupYear;
            baseName = englishName;
        }

        /**
         * @param index
         * @return
         */
        public int getHeight(Event event) {
            switch (event.index) {
            case 0:
                return event.gc.textExtent(name).y;
            case 1:
                return 50;
            case 2:
                return event.gc.textExtent(cupYear).y;
            default:
                return 10;
            }
        }

        /**
         * @param index
         * @return
         */
        public int getWidth(Event event) {

            switch (event.index) {
            case 0:
                return event.gc.textExtent(getDisplayString().toString()).x + 4;

            case 1:
                return 200;

            case 2:
                return event.gc.textExtent(cupYear).x + 5;

            default:
                return 10;
            }
        }

        /**
         * Draw the flag in bounds.
         *
         * @param event
         */
        protected void drawFlag(Event event) {
            event.gc.setBackground(viewer.getControl().getDisplay()
                    .getSystemColor(DWT.COLOR_BLUE));

            Rectangle bounds = event.getBounds();
            bounds.width += 100;
            event.gc.fillRectangle(bounds);
        }

        /**
         * Draw the cup year
         *
         * @param event
         */
        private void drawCupYear(Event event) {
            event.gc.drawText(cupYear, event.x, event.y);

        }

        /**
         * Draw the name of the receiver.
         *
         * @param event
         */
        protected void drawName(Event event) {

            StringBuffer buffer = getDisplayString();

            Display display = viewer.getControl().getDisplay();
            TextLayout layout = new TextLayout(display);
            layout.setText(buffer.toString());

            TextStyle plain = new TextStyle(JFaceResources
                    .getFont(JFaceResources.DEFAULT_FONT), display
                    .getSystemColor(DWT.COLOR_LIST_FOREGROUND), display
                    .getSystemColor(DWT.COLOR_LIST_BACKGROUND));

            TextStyle italic = new TextStyle(JFaceResources.getFontRegistry()
                    .getItalic(JFaceResources.DEFAULT_FONT), display
                    .getSystemColor(DWT.COLOR_BLUE), display
                    .getSystemColor(DWT.COLOR_LIST_BACKGROUND));

            layout.setStyle(plain, 0, name.length - 1);
            layout.setStyle(italic, name.length, buffer.length - 1);

            layout.draw(event.gc, event.x, event.y);

        }

        /**
         * @return
         */
        private StringBuffer getDisplayString() {
            StringBuffer buffer = new StringBuffer();
            buffer.append(name);
            buffer.append(" (");
            buffer.append(baseName);
            buffer.append(")");
            return buffer;
        }

        /**
         * @param event
         */
        public void draw(Event event) {

            switch (event.index) {
            case 0:
                drawName(event);
                break;
            case 1:
                drawFlag(event);
                break;
            case 2:
                drawCupYear(event);
                break;

            default:
                break;
            }

        }
    }

    private class GermanyEntry : CountryEntry {

        this() {
            super("Deutschland", "Germany", "1954 1974 1990");
        }

        /*
         * (non-Javadoc)
         *
         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
         */
        protected void drawFlag(Event event) {

            Rectangle bounds = event.getBounds();
            bounds.width += 100;
            int stripeHeight = bounds.height / 3;
            Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
                    stripeHeight);

            event.gc.setBackground(viewer.getControl().getDisplay()
                    .getSystemColor(DWT.COLOR_BLACK));
            event.gc.fillRectangle(stripe);

            stripe.y += stripeHeight;

            event.gc.setBackground(viewer.getControl().getDisplay()
                    .getSystemColor(DWT.COLOR_RED));
            event.gc.fillRectangle(stripe);

            stripe.y += stripeHeight;

            event.gc.setBackground(viewer.getControl().getDisplay()
                    .getSystemColor(DWT.COLOR_YELLOW));
            event.gc.fillRectangle(stripe);

        }

    }

    private class AustriaEntry : CountryEntry {

        this() {
            super("\u00D6sterreich", "Austria", "TBD");
        }

        /*
         * (non-Javadoc)
         *
         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
         */
        protected void drawFlag(Event event) {

            Rectangle bounds = event.getBounds();
            bounds.width += 100;
            int stripeHeight = bounds.height / 3;
            Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
                    stripeHeight);

            event.gc.setBackground(viewer.getControl().getDisplay()
                    .getSystemColor(DWT.COLOR_RED));
            event.gc.fillRectangle(stripe);

            stripe.y += stripeHeight;

            event.gc.setBackground(viewer.getControl().getDisplay()
                    .getSystemColor(DWT.COLOR_WHITE));
            event.gc.fillRectangle(stripe);

            stripe.y += stripeHeight;

            event.gc.setBackground(viewer.getControl().getDisplay()
                    .getSystemColor(DWT.COLOR_RED));
            event.gc.fillRectangle(stripe);

        }
    }

    private class EnglandEntry : CountryEntry {
        this() {
            super("Blighty", "England", "1966");
        }

        /*
         * (non-Javadoc)
         *
         * @see dwtx.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(dwt.widgets.Event)
         */
        protected void drawFlag(Event event) {

            Rectangle bounds = event.getBounds();
            bounds.width += 100;

            event.gc.setBackground(viewer.getControl().getDisplay()
                    .getSystemColor(DWT.COLOR_RED));
            event.gc.fillRectangle(new Rectangle(bounds.width / 2 + bounds.x
                    - 5, bounds.y, 10, bounds.height));
            event.gc.fillRectangle(new Rectangle(bounds.x, bounds.height / 2
                    + bounds.y - 5, bounds.width, 10));

        }
    }

    private TableViewer viewer;

    private CountryEntry[] entries;

    public this() {
        entries = new CountryEntry[3];
        entries[0] = new AustriaEntry();
        entries[1] = new GermanyEntry();
        entries[2] = new EnglandEntry();
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(dwt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        viewer = new TableViewer(parent, DWT.FULL_SELECTION);

        viewer.setContentProvider(new class() IStructuredContentProvider {
            /*
             * (non-Javadoc)
             *
             * @see dwtx.jface.viewers.IContentProvider#dispose()
             */
            public void dispose() {
            };

            /*
             * (non-Javadoc)
             *
             * @see dwtx.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
             */
            public Object[] getElements(Object inputElement) {
                return (cast(Snippet010OwnerDraw) inputElement).entries;
            };

            /*
             * (non-Javadoc)
             *
             * @see dwtx.jface.viewers.IContentProvider#inputChanged(dwtx.jface.viewers.Viewer,
             *      java.lang.Object, java.lang.Object)
             */
            public void inputChanged(Viewer viewer,
                    Object oldInput, Object newInput) {
            }

        });
        createColumns();

        viewer.setLabelProvider(new class() OwnerDrawLabelProvider {


            protected void measure(Event event, Object element) {
                CountryEntry country = cast(CountryEntry) element;

                event.setBounds(new Rectangle(event.x, event.y, country.getWidth(event),
                        country.getHeight(event)));

            }

            /*
             * (non-Javadoc)
             *
             * @see dwtx.jface.viewers.OwnerDrawLabelProvider#paint(dwt.widgets.Event,
             *      java.lang.Object)
             */
            protected void paint(Event event, Object element) {
                CountryEntry entry = cast(CountryEntry) element;
                entry.draw(event);

            }
        });

        OwnerDrawLabelProvider.setUpOwnerDraw(viewer);
        viewer.setInput(this);
        GridData data = new GridData(GridData.GRAB_HORIZONTAL
                | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);

        viewer.getControl().setLayoutData(data);

        viewer.setSelection(new StructuredSelection(entries[1]));
    }

    /**
     * Create the columns to be used in the tree.
     */
    private void createColumns() {
        TableLayout layout = new TableLayout();
        viewer.getTable().setLayout(layout);
        viewer.getTable().setHeaderVisible(true);
        viewer.getTable().setLinesVisible(true);

        for (int i = 0; i < COLUMN_COUNT; i++) {
            TableColumn tc = new TableColumn(viewer.getTable(), DWT.NONE, i);
            layout.addColumnData(new ColumnPixelData(100));
            tc.setText(getTitleFor(i));
        }
        ;
    }

    /**
     * @param i
     * @return
     */
    private String getTitleFor(int i) {
        switch (i) {
        case 0:
            return "Name";
        case 1:
            return "Flag";
        case 2:
            return "World Cup Year";
        }
        return "Unknown";
    }

    public void setFocus() {

    }

}