changeset 147:5f508f322464

more JFace examples
author Frank Benoit <benoit@tionex.de>
date Sat, 16 Aug 2008 13:21:55 +0200
parents 7c4b76583cb8
children 168b3c176815
files jface/snippets/viewers/Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI.d jface/user/Decoration.d jface/user/PopUp.d
diffstat 3 files changed, 567 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/snippets/viewers/Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI.d	Sat Aug 16 13:21:55 2008 +0200
@@ -0,0 +1,334 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Tom Schindl 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:
+ *     Tom Schindl - initial API and implementation
+ *******************************************************************************/
+
+module snippets.viewers.Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI;
+
+
+import dwtx.jface.action.Action;
+import dwtx.jface.action.IMenuListener;
+import dwtx.jface.action.IMenuManager;
+import dwtx.jface.action.MenuManager;
+import dwtx.jface.internal.ConfigureColumnsDialog;
+import dwtx.jface.viewers.CellEditor;
+import dwtx.jface.viewers.ColumnLabelProvider;
+import dwtx.jface.viewers.EditingSupport;
+import dwtx.jface.viewers.IStructuredContentProvider;
+import dwtx.jface.viewers.TableViewer;
+import dwtx.jface.viewers.TableViewerColumn;
+import dwtx.jface.viewers.TextCellEditor;
+import dwtx.jface.viewers.Viewer;
+import dwtx.jface.window.SameShellProvider;
+import dwt.DWT;
+import dwt.events.MouseAdapter;
+import dwt.events.MouseEvent;
+import dwt.layout.FillLayout;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.dwthelper.utils;
+import dwtx.jface.window.IShellProvider;
+
+/**
+ * Explore the new API added in 3.3 and see how easily you can create reusable
+ * components
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ * @since 3.2
+ */
+public class Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI {
+
+    public class Person {
+        public String givenname;
+
+        public String surname;
+
+        public String email;
+
+        public this(String givenname, String surname, String email) {
+            this.givenname = givenname;
+            this.surname = surname;
+            this.email = email;
+        }
+    }
+
+    private class MyContentProvider : IStructuredContentProvider {
+
+        public Object[] getElements(Object inputElement) {
+            return arrayFromObject!(Person)( inputElement );
+        }
+
+        public void dispose() {
+        }
+
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+        }
+
+    }
+
+
+
+    private class GivenNameLabelProvider : ColumnLabelProvider {
+        public String getText(Object element) {
+            return (cast(Person) element).givenname;
+        }
+    }
+
+    private class GivenNameEditing : EditingSupport {
+        private TextCellEditor cellEditor;
+
+        public this(TableViewer viewer) {
+            super(viewer);
+            cellEditor = new TextCellEditor(viewer.getTable());
+        }
+
+        protected bool canEdit(Object element) {
+            return true;
+        }
+
+        protected CellEditor getCellEditor(Object element) {
+            return cellEditor;
+        }
+
+        protected Object getValue(Object element) {
+            return stringcast((cast(Person) element).givenname);
+        }
+
+        protected void setValue(Object element, Object value) {
+            (cast(Person) element).givenname = stringcast(value);
+            getViewer().update(element, null);
+        }
+    }
+
+    private class SurNameLabelProvider : ColumnLabelProvider {
+        public String getText(Object element) {
+            return (cast(Person) element).surname;
+        }
+    }
+
+    private class SurNameEditing : EditingSupport {
+        private TextCellEditor cellEditor;
+
+        public this( TableViewer viewer ) {
+            super(viewer);
+            cellEditor = new TextCellEditor(viewer.getTable());
+        }
+
+        protected bool canEdit(Object element) {
+            return true;
+        }
+
+        protected CellEditor getCellEditor(Object element) {
+            return cellEditor;
+        }
+
+        protected Object getValue(Object element) {
+            return stringcast((cast(Person) element).surname);
+        }
+
+        protected void setValue(Object element, Object value) {
+            (cast(Person) element).surname = stringcast(value);
+            getViewer().update(element, null);
+        }
+    }
+
+    private class EmailLabelProvider : ColumnLabelProvider {
+        public String getText(Object element) {
+            return (cast(Person) element).email;
+        }
+    }
+
+    private class EmailEditing : EditingSupport {
+        private TextCellEditor cellEditor;
+
+        public this( TableViewer viewer ) {
+            super(viewer);
+            cellEditor = new TextCellEditor(viewer.getTable());
+        }
+
+        protected bool canEdit(Object element) {
+            return true;
+        }
+
+        protected CellEditor getCellEditor(Object element) {
+            return cellEditor;
+        }
+
+        protected Object getValue(Object element) {
+            return stringcast((cast(Person) element).email);
+        }
+
+        protected void setValue(Object element, Object value) {
+            (cast(Person) element).email = stringcast(value);
+            getViewer().update(element, null);
+        }
+    }
+
+    private int activeColumn = -1;
+
+    private TableViewerColumn column;
+    TableViewer v;
+    public this(Shell shell) {
+        v = new TableViewer(shell, DWT.BORDER
+                | DWT.FULL_SELECTION);
+
+        TableViewerColumn column = new TableViewerColumn(v,DWT.NONE);
+        column.setLabelProvider(new GivenNameLabelProvider());
+        column.setEditingSupport(new GivenNameEditing(v));
+
+        column.getColumn().setWidth(200);
+        column.getColumn().setText("Givenname");
+        column.getColumn().setMoveable(true);
+
+        column = new TableViewerColumn(v,DWT.NONE);
+        column.setLabelProvider(new SurNameLabelProvider());
+        column.setEditingSupport(new SurNameEditing(v));
+        column.getColumn().setWidth(200);
+        column.getColumn().setText("Surname");
+        column.getColumn().setMoveable(true);
+
+        Person[] model = createModel();
+
+        v.setContentProvider(new MyContentProvider());
+        v.setInput(new ArrayWrapperObject(model));
+        v.getTable().setLinesVisible(true);
+        v.getTable().setHeaderVisible(true);
+
+        addMenu();
+        triggerColumnSelectedColumn();
+    }
+
+    private void triggerColumnSelectedColumn() {
+        v.getTable().addMouseListener(new class() MouseAdapter {
+
+            public void mouseDown(MouseEvent e) {
+                int x = 0;
+                for (int i = 0; i < v.getTable().getColumnCount(); i++) {
+                    x += v.getTable().getColumn(i).getWidth();
+                    if (e.x <= x) {
+                        activeColumn = i;
+                        break;
+                    }
+                }
+            }
+
+        });
+    }
+
+    private void removeEmailColumn() {
+        column.getColumn().dispose();
+        v.refresh();
+    }
+
+    private void addEmailColumn(int columnIndex) {
+        column = new TableViewerColumn(v, DWT.NONE, columnIndex);
+        column.setLabelProvider(new EmailLabelProvider());
+        column.setEditingSupport(new EmailEditing(v));
+        column.getColumn().setText("E-Mail");
+        column.getColumn().setResizable(false);
+
+        v.refresh();
+
+        column.getColumn().setWidth(200);
+
+    }
+
+    private Action insertEmailBefore;
+    private Action insertEmailAfter;
+    private Action removeEmail;
+    private Action configureColumns;
+
+    private void addMenu() {
+        MenuManager mgr = new MenuManager();
+
+        insertEmailBefore = new class("Insert E-Mail before") Action {
+            this(String name){ super(name); }
+            public void run() {
+                addEmailColumn(activeColumn);
+            }
+        };
+
+        insertEmailAfter = new class("Insert E-Mail after") Action {
+            this(String name){ super(name); }
+            public void run() {
+                addEmailColumn(activeColumn + 1);
+            }
+        };
+
+        removeEmail = new class("Remove E-Mail") Action {
+            this(String name){ super(name); }
+            public void run() {
+                removeEmailColumn();
+            }
+        };
+
+        configureColumns = new class("Configure Columns...") Action {
+            this(String name){ super(name); }
+            public void run() {
+                // Note: the following is not API!
+                (new ConfigureColumnsDialog(cast(IShellProvider)new SameShellProvider(v.getControl()), v.getTable())).open();
+            }
+        };
+
+        mgr.setRemoveAllWhenShown(true);
+        mgr.addMenuListener(new class() IMenuListener {
+
+            public void menuAboutToShow(IMenuManager manager) {
+                if (v.getTable().getColumnCount() == 2) {
+                    manager.add(insertEmailBefore);
+                    manager.add(insertEmailAfter);
+                } else {
+                    manager.add(removeEmail);
+                }
+                manager.add(configureColumns);
+            }
+
+        });
+
+        v.getControl().setMenu(mgr.createContextMenu(v.getControl()));
+    }
+
+    private Person[] createModel() {
+        Person[] persons = new Person[3];
+        persons[0] = new Person("Tom", "Schindl", "tom.schindl@bestsolution.at");
+        persons[1] = new Person("Boris", "Bokowski",
+                "boris_bokowski@ca.ibm.com");
+        persons[2] = new Person("Tod", "Creasey", "tod_creasey@ca.ibm.com");
+
+        return persons;
+    }
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) {
+        Display display = new Display();
+
+        Shell shell = new Shell(display);
+        shell.setLayout(new FillLayout());
+        new Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI(shell);
+        shell.open();
+
+        while (!shell.isDisposed()) {
+            if (!display.readAndDispatch())
+                display.sleep();
+        }
+
+        display.dispose();
+
+    }
+
+}
+
+void main(){
+    Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI.main(null);
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/user/Decoration.d	Sat Aug 16 13:21:55 2008 +0200
@@ -0,0 +1,148 @@
+module user.Decoration;
+
+import tango.util.log.Trace;
+
+import dwt.dwthelper.utils;
+import dwt.DWT;
+
+import dwt.layout.GridLayout;
+import dwt.layout.GridData;
+
+import dwt.graphics.Image;
+
+import dwt.widgets.Text;
+import dwt.widgets.Control;
+import dwt.widgets.Composite;
+import dwt.widgets.Group;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.widgets.Listener;
+import dwt.widgets.Event;
+
+import dwtx.jface.bindings.keys.KeyStroke;
+
+import dwtx.jface.dialogs.TitleAreaDialog;
+import dwtx.jface.dialogs.IDialogConstants;
+import dwtx.jface.dialogs.IMessageProvider;
+import dwtx.jface.dialogs.Dialog;
+import dwtx.jface.resource.JFaceResources;
+
+import dwtx.jface.fieldassist.FieldDecorationRegistry;
+import dwtx.jface.fieldassist.FieldDecoration;
+import dwtx.jface.fieldassist.DecoratedField;
+import dwtx.jface.fieldassist.TextControlCreator;
+import dwtx.jface.fieldassist.ContentProposalAdapter;
+import dwtx.jface.fieldassist.TextContentAdapter;
+import dwtx.jface.fieldassist.SimpleContentProposalProvider;
+import dwtx.jface.fieldassist.IContentProposal;
+
+import dwtx.jface.viewers.ILabelProvider;
+import dwtx.jface.viewers.ILabelProviderListener;
+
+version(JIVE) import jive.stacktrace;
+
+class MyDialog : TitleAreaDialog {
+
+    private DecoratedField textField;
+    private uint step;
+    private FieldDecoration[] decos;
+
+    this( Shell parent ){
+        super(parent);
+    }
+    protected Control createContents(Composite parent) {
+        Control contents = super.createContents(parent);
+        setTitle("Show Decoration");
+        setMessage("Type into the text field to change the decoration", IMessageProvider.INFORMATION);
+        return contents;
+    }
+    protected  Control  createDialogArea(Composite parent) {
+
+        Composite comp = new Composite(parent, DWT.NONE);
+
+        comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+        comp.setLayout(new GridLayout(1, false));
+
+
+        auto registry = FieldDecorationRegistry.getDefault();
+        decos ~= registry.getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL );
+        decos ~= registry.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR );
+        decos ~= registry.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR_QUICKFIX );
+        decos ~= registry.getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION );
+        decos ~= registry.getFieldDecoration(FieldDecorationRegistry.DEC_REQUIRED );
+        decos ~= registry.getFieldDecoration(FieldDecorationRegistry.DEC_WARNING );
+        decos ~= null;
+
+        with( textField = new DecoratedField(comp, DWT.BORDER, new TextControlCreator())){
+            addFieldDecoration( decos[0], DWT.TOP | DWT.LEFT, false);
+
+            getLayoutControl().setLayoutData( new GridData(
+                GridData.FILL_HORIZONTAL  ) );
+
+            auto text = cast(Text)getControl();
+            assert(text);
+            text.addListener(DWT.Verify, dgListener(&handleVerify));
+        }
+        Text text;
+        with( text = new Text( comp, DWT.BORDER )){
+            auto gd = new GridData( GridData.FILL, GridData.VERTICAL_ALIGN_CENTER, true, false );
+            gd.horizontalIndent = registry.getMaximumDecorationWidth();
+            setLayoutData( gd );
+            setText( "without Decoration" );
+
+        }
+            ContentProposalAdapter adapter = new ContentProposalAdapter(
+                text,
+                new TextContentAdapter(),
+                new SimpleContentProposalProvider([
+                    "The very first proposal"[],
+                    "second proposal",
+                    "and a last one"]),
+                KeyStroke.getInstance(DWT.CTRL, ' '),
+                null);
+            adapter.setLabelProvider( new class ILabelProvider {
+                uint idx;
+                Image  getImage(Object element){
+                    idx++;
+                    switch(idx % 4){
+                    case 0: return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
+                    case 1: return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
+                    case 2: return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
+                    case 3: return JFaceResources.getImage(Dialog.DLG_IMG_HELP);
+                    default: return null;
+                    }
+                }
+                String     getText(Object element){
+                    return (cast(IContentProposal)element).getContent();
+                }
+                void   addListener(ILabelProviderListener listener){}
+                void   dispose(){}
+                bool   isLabelProperty(Object element, String property){ return true; }
+                void   removeListener(ILabelProviderListener listener){}
+        });
+        return comp;
+    }
+    private void handleVerify(Event e){
+        FieldDecoration deco;
+        deco = decos[ step % decos.length ];
+        if( deco ){
+            textField.hideDecoration(deco);
+        }
+        step++;
+        deco = decos[ step % decos.length ];
+        if( deco ){
+            textField.addFieldDecoration( deco, DWT.TOP | DWT.LEFT, false);
+        }
+    }
+    protected void createButtonsForButtonBar(Composite parent) {
+        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+    }
+}
+
+
+void main(){
+    auto d = new Display();
+    (new MyDialog(null)).open();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jface/user/PopUp.d	Sat Aug 16 13:21:55 2008 +0200
@@ -0,0 +1,85 @@
+module user.PopUp;
+import tango.util.log.Trace;
+
+import dwt.dwthelper.utils;
+import dwt.DWT;
+
+import dwt.layout.GridLayout;
+import dwt.layout.GridData;
+
+import dwt.graphics.Image;
+
+import dwt.widgets.Text;
+import dwt.widgets.Control;
+import dwt.widgets.Composite;
+import dwt.widgets.Group;
+import dwt.widgets.Display;
+import dwt.widgets.Shell;
+import dwt.widgets.Listener;
+import dwt.widgets.Event;
+import dwt.widgets.Button;
+
+import dwtx.jface.dialogs.PopupDialog;
+
+import dwtx.jface.window.ApplicationWindow;
+
+class App : ApplicationWindow {
+
+    this(){
+        super(null);
+        setBlockOnOpen(true);
+    }
+    protected override Control createContents(Composite parent) {
+        Composite comp = cast(Composite)super.createContents(parent);
+        getShell().setText("Test PopupDialog");
+
+        comp.setLayout(new GridLayout(1, false));
+
+
+        auto btn = new Button( comp, DWT.PUSH );
+        btn.addListener( DWT.Selection, dgListener( & doBtn1 ));
+        btn.setText( "Btn 1" );
+        return comp;
+    }
+    void doBtn1( Event e ){
+        Trace.formatln( "btn1");
+        auto pu = new PopupDialog(
+            getShell(),
+            PopupDialog.HOVER_SHELLSTYLE ,
+            true,
+            true,
+            true,
+            true,
+            true,
+            "Title",
+            "Info line...");
+        pu.open();
+    }
+    void doBtn2( Event e ){
+        Trace.formatln( "btn1");
+        auto pu = new PopupDialog(
+            getShell(),
+            PopupDialog.HOVER_SHELLSTYLE,
+            false,
+            true,
+            true,
+            true,
+            true,
+            "Title",
+            "Text\non the other line...");
+        pu.open();
+    }
+
+}
+
+
+
+void main(){
+    auto d = new Display();
+    auto app = new App();
+    app.open();
+}
+
+
+
+