diff dwtx/jface/internal/text/link/contentassist/AdditionalInfoController2.d @ 129:eb30df5ca28b

Added JFace Text sources
author Frank Benoit <benoit@tionex.de>
date Sat, 23 Aug 2008 19:10:48 +0200
parents
children b56e9be9fe88
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtx/jface/internal/text/link/contentassist/AdditionalInfoController2.d	Sat Aug 23 19:10:48 2008 +0200
@@ -0,0 +1,262 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+
+module dwtx.jface.internal.text.link.contentassist.AdditionalInfoController2;
+
+import dwt.dwthelper.utils;
+
+
+
+
+
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.widgets.Control;
+import dwt.widgets.Table;
+import dwt.widgets.TableItem;
+import dwtx.core.runtime.Assert;
+import dwtx.jface.text.AbstractInformationControlManager;
+import dwtx.jface.text.IInformationControl;
+import dwtx.jface.text.IInformationControlCreator;
+import dwtx.jface.text.contentassist.ICompletionProposal;
+import dwtx.jface.text.contentassist.ICompletionProposalExtension3;
+
+
+
+/**
+ * Displays the additional information available for a completion proposal.
+ *
+ * @since 2.0
+ */
+class AdditionalInfoController2 : AbstractInformationControlManager , Runnable {
+
+    /**
+     * Internal table selection listener.
+     */
+    private class TableSelectionListener : SelectionListener {
+
+        /*
+         * @see SelectionListener#widgetSelected(SelectionEvent)
+         */
+        public void widgetSelected(SelectionEvent e) {
+            handleTableSelectionChanged();
+        }
+
+        /*
+         * @see SelectionListener#widgetDefaultSelected(SelectionEvent)
+         */
+        public void widgetDefaultSelected(SelectionEvent e) {
+        }
+    }
+
+
+    /** The proposal table */
+    private Table fProposalTable;
+    /** The thread controlling the delayed display of the additional info */
+    private Thread fThread;
+    /** Indicates whether the display delay has been reset */
+    private bool fIsReset= false;
+    /** Object to synchronize display thread and table selection changes */
+    private final Object fMutex= new Object();
+    /** Thread access lock. */
+    private final Object fThreadAccess= new Object();
+    /** Object to synchronize initial display of additional info */
+    private Object fStartSignal;
+    /** The table selection listener */
+    private SelectionListener fSelectionListener= new TableSelectionListener();
+    /** The delay after which additional information is displayed */
+    private int fDelay;
+
+
+    /**
+     * Creates a new additional information controller.
+     *
+     * @param creator the information control creator to be used by this controller
+     * @param delay time in milliseconds after which additional info should be displayed
+     */
+    AdditionalInfoController2(IInformationControlCreator creator, int delay) {
+        super(creator);
+        fDelay= delay;
+        setAnchor(ANCHOR_RIGHT);
+        setFallbackAnchors(new Anchor[] {ANCHOR_RIGHT, ANCHOR_LEFT, ANCHOR_BOTTOM });
+    }
+
+    /*
+     * @see AbstractInformationControlManager#install(Control)
+     */
+    public void install(Control control) {
+
+        if (fProposalTable is control) {
+            // already installed
+            return;
+        }
+
+        super.install(control);
+
+        Assert.isTrue(control instanceof Table);
+        fProposalTable= (Table) control;
+        fProposalTable.addSelectionListener(fSelectionListener);
+        synchronized (fThreadAccess) {
+            if (fThread !is null)
+                fThread.interrupt();
+            fThread= new Thread(this, ContentAssistMessages.getString("InfoPopup.info_delay_timer_name")); //$NON-NLS-1$
+
+            fStartSignal= new Object();
+            synchronized (fStartSignal) {
+                fThread.start();
+                try {
+                    // wait until thread is ready
+                    fStartSignal.wait();
+                } catch (InterruptedException x) {
+                }
+            }
+        }
+    }
+
+    /*
+     * @see AbstractInformationControlManager#disposeInformationControl()
+     */
+     public void disposeInformationControl() {
+
+        synchronized (fThreadAccess) {
+            if (fThread !is null) {
+                fThread.interrupt();
+                fThread= null;
+            }
+        }
+
+        if (fProposalTable !is null && !fProposalTable.isDisposed()) {
+            fProposalTable.removeSelectionListener(fSelectionListener);
+            fProposalTable= null;
+        }
+
+        super.disposeInformationControl();
+    }
+
+    /*
+     * @see java.lang.Runnable#run()
+     */
+    public void run() {
+        try {
+            while (true) {
+
+                synchronized (fMutex) {
+
+                    if (fStartSignal !is null) {
+                        synchronized (fStartSignal) {
+                            fStartSignal.notifyAll();
+                            fStartSignal= null;
+                        }
+                    }
+
+                    // Wait for a selection event to occur.
+                    fMutex.wait();
+
+                    while (true) {
+                        fIsReset= false;
+                        // Delay before showing the popup.
+                        fMutex.wait(fDelay);
+                        if (!fIsReset)
+                            break;
+                    }
+                }
+
+                if (fProposalTable !is null && !fProposalTable.isDisposed()) {
+                    fProposalTable.getDisplay().asyncExec(new Runnable() {
+                        public void run() {
+                            if (!fIsReset)
+                                showInformation();
+                        }
+                    });
+                }
+
+            }
+        } catch (InterruptedException e) {
+        }
+
+        synchronized (fThreadAccess) {
+            // only null fThread if it is us!
+            if (Thread.currentThread() is fThread)
+                fThread= null;
+        }
+    }
+
+    /**
+     *Handles a change of the line selected in the associated selector.
+     */
+    public void handleTableSelectionChanged() {
+
+        if (fProposalTable !is null && !fProposalTable.isDisposed() && fProposalTable.isVisible()) {
+            synchronized (fMutex) {
+                fIsReset= true;
+                fMutex.notifyAll();
+            }
+        }
+    }
+
+    /*
+     * @see AbstractInformationControlManager#computeInformation()
+     */
+    protected void computeInformation() {
+
+        if (fProposalTable is null || fProposalTable.isDisposed())
+            return;
+
+        TableItem[] selection= fProposalTable.getSelection();
+        if (selection !is null && selection.length > 0) {
+
+            TableItem item= selection[0];
+
+            // compute information
+            String information= null;
+            Object d= item.getData();
+
+            if (d instanceof ICompletionProposal) {
+                ICompletionProposal p= (ICompletionProposal) d;
+                information= p.getAdditionalProposalInfo();
+            }
+
+            if (d instanceof ICompletionProposalExtension3)
+                setCustomInformationControlCreator(((ICompletionProposalExtension3) d).getInformationControlCreator());
+            else
+                setCustomInformationControlCreator(null);
+
+            // compute subject area
+            setMargins(4, -1);
+            Rectangle area= fProposalTable.getBounds();
+            area.x= 0; // subject area is the whole subject control
+            area.y= 0;
+
+            // set information & subject area
+            setInformation(information, area);
+        }
+    }
+
+    /*
+     * @see dwtx.jface.text.AbstractInformationControlManager#computeSizeConstraints(Control, IInformationControl)
+     */
+    protected Point computeSizeConstraints(Control subjectControl, IInformationControl informationControl) {
+        // at least as big as the proposal table
+        Point sizeConstraint= super.computeSizeConstraints(subjectControl, informationControl);
+        Point size= subjectControl.getSize();
+        if (sizeConstraint.x < size.x)
+            sizeConstraint.x= size.x;
+        if (sizeConstraint.y < size.y)
+            sizeConstraint.y= size.y;
+        return sizeConstraint;
+    }
+}
+
+