diff dwt/widgets/DirectoryDialog.d @ 31:92c102dd64a3

Added all widgets modules as dummy. Most modules of accessible are equal to the linux version, except Accessible.
author Frank Benoit <benoit@tionex.de>
date Mon, 28 Jan 2008 04:47:28 +0100
parents
children 43c42c637c9c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/widgets/DirectoryDialog.d	Mon Jan 28 04:47:28 2008 +0100
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 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 dwt.widgets.DirectoryDialog;
+
+import dwt.widgets.Dialog;
+import dwt.widgets.Shell;
+
+class DirectoryDialog : Dialog {
+    public this (Shell parent, int style) {
+        super (parent, style);
+    }
+}
+
+/++
+import dwt.DWT;
+import dwt.DWTException;
+import dwt.internal.Callback;
+import dwt.internal.win32.BROWSEINFO;
+import dwt.internal.win32.OS;
+import dwt.internal.win32.TCHAR;
+
+/**
+ * Instances of this class allow the user to navigate
+ * the file system and select a directory.
+ * <dl>
+ * <dt><b>Styles:</b></dt>
+ * <dd>(none)</dd>
+ * <dt><b>Events:</b></dt>
+ * <dd>(none)</dd>
+ * </dl>
+ * <p>
+ * IMPORTANT: This class is intended to be subclassed <em>only</em>
+ * within the DWT implementation.
+ * </p>
+ */
+
+public class DirectoryDialog extends Dialog {
+    String message = "", filterPath = "";  //$NON-NLS-1$//$NON-NLS-2$
+    String directoryPath;
+
+/**
+ * Constructs a new instance of this class given only its parent.
+ *
+ * @param parent a shell which will be the parent of the new instance
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * </ul>
+ * @exception DWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
+ *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
+ * </ul>
+ */
+public DirectoryDialog (Shell parent) {
+    this (parent, DWT.PRIMARY_MODAL);
+}
+
+/**
+ * Constructs a new instance of this class given its parent
+ * and a style value describing its behavior and appearance.
+ * <p>
+ * The style value is either one of the style constants defined in
+ * class <code>DWT</code> which is applicable to instances of this
+ * class, or must be built by <em>bitwise OR</em>'ing together
+ * (that is, using the <code>int</code> "|" operator) two or more
+ * of those <code>DWT</code> style constants. The class description
+ * lists the style constants that are applicable to the class.
+ * Style bits are also inherited from superclasses.
+ * </p>
+ *
+ * @param parent a shell which will be the parent of the new instance
+ * @param style the style of dialog to construct
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * </ul>
+ * @exception DWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
+ *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
+ * </ul>
+ */
+public DirectoryDialog (Shell parent, int style) {
+    super (parent, style);
+    checkSubclass ();
+}
+
+int BrowseCallbackProc (int hwnd, int uMsg, int lParam, int lpData) {
+    switch (uMsg) {
+        case OS.BFFM_INITIALIZED:
+            if (filterPath !is null && filterPath.length () !is 0) {
+                /* Use the character encoding for the default locale */
+                TCHAR buffer = new TCHAR (0, filterPath.replace ('/', '\\'), true);
+                OS.SendMessage (hwnd, OS.BFFM_SETSELECTION, 1, buffer);
+            }
+            if (title !is null && title.length () !is 0) {
+                /* Use the character encoding for the default locale */
+                TCHAR buffer = new TCHAR (0, title, true);
+                OS.SetWindowText (hwnd, buffer);
+            }
+            break;
+        case OS.BFFM_VALIDATEFAILEDA:
+        case OS.BFFM_VALIDATEFAILEDW:
+            /* Use the character encoding for the default locale */
+            int length = OS.IsUnicode ? OS.wcslen (lParam) : OS.strlen (lParam);
+            TCHAR buffer = new TCHAR (0, length);
+            int byteCount = buffer.length () * TCHAR.sizeof;
+            OS.MoveMemory (buffer, lParam, byteCount);
+            directoryPath = buffer.toString (0, length);
+            break;
+    }
+    return 0;
+}
+
+/**
+ * Returns the path which the dialog will use to filter
+ * the directories it shows.
+ *
+ * @return the filter path
+ *
+ * @see #setFilterPath
+ */
+public String getFilterPath () {
+    return filterPath;
+}
+
+/**
+ * Returns the dialog's message, which is a description of
+ * the purpose for which it was opened. This message will be
+ * visible on the dialog while it is open.
+ *
+ * @return the message
+ */
+public String getMessage () {
+    return message;
+}
+
+/**
+ * Makes the dialog visible and brings it to the front
+ * of the display.
+ *
+ * @return a string describing the absolute path of the selected directory,
+ *         or null if the dialog was cancelled or an error occurred
+ *
+ * @exception DWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the dialog has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the dialog</li>
+ * </ul>
+ */
+public String open () {
+    if (OS.IsWinCE) DWT.error (DWT.ERROR_NOT_IMPLEMENTED);
+
+    int hHeap = OS.GetProcessHeap ();
+
+    /* Get the owner HWND for the dialog */
+    int hwndOwner = 0;
+    if (parent !is null) hwndOwner = parent.handle;
+
+    /* Copy the message to OS memory */
+    int lpszTitle = 0;
+    if (message.length () !is 0) {
+        String string = message;
+        if (string.indexOf ('&') !is -1) {
+            int length = string.length ();
+            char [] buffer = new char [length * 2];
+            int index = 0;
+            for (int i=0; i<length; i++) {
+                char ch = string.charAt (i);
+                if (ch is '&') buffer [index++] = '&';
+                buffer [index++] = ch;
+            }
+            string = new String (buffer, 0, index);
+        }
+        /* Use the character encoding for the default locale */
+        TCHAR buffer = new TCHAR (0, string, true);
+        int byteCount = buffer.length () * TCHAR.sizeof;
+        lpszTitle = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
+        OS.MoveMemory (lpszTitle, buffer, byteCount);
+    }
+
+    /* Create the BrowseCallbackProc */
+    Callback callback = new Callback (this, "BrowseCallbackProc", 4); //$NON-NLS-1$
+    int lpfn = callback.getAddress ();
+    if (lpfn is 0) DWT.error (DWT.ERROR_NO_MORE_CALLBACKS);
+
+    /* Make the parent shell be temporary modal */
+    Shell oldModal = null;
+    Display display = parent.getDisplay ();
+    if ((style & (DWT.APPLICATION_MODAL | DWT.SYSTEM_MODAL)) !is 0) {
+        oldModal = display.getModalDialogShell ();
+        display.setModalDialogShell (parent);
+    }
+
+    directoryPath = null;
+    BROWSEINFO lpbi = new BROWSEINFO ();
+    lpbi.hwndOwner = hwndOwner;
+    lpbi.lpszTitle = lpszTitle;
+    lpbi.ulFlags = OS.BIF_NEWDIALOGSTYLE | OS.BIF_RETURNONLYFSDIRS | OS.BIF_EDITBOX | OS.BIF_VALIDATE;
+    lpbi.lpfn = lpfn;
+    /*
+    * Bug in Windows.  On some hardware configurations, SHBrowseForFolder()
+    * causes warning dialogs with the message "There is no disk in the drive
+    * Please insert a disk into \Device\Harddisk0\DR0".  This is possibly
+    * caused by SHBrowseForFolder() calling internally GetVolumeInformation().
+    * MSDN for GetVolumeInformation() says:
+    *
+    * "If you are attempting to obtain information about a floppy drive
+    * that does not have a floppy disk or a CD-ROM drive that does not
+    * have a compact disc, the system displays a message box asking the
+    * user to insert a floppy disk or a compact disc, respectively.
+    * To prevent the system from displaying this message box, call the
+    * SetErrorMode function with SEM_FAILCRITICALERRORS."
+    *
+    * The fix is to save and restore the error mode using SetErrorMode()
+    * with the SEM_FAILCRITICALERRORS flag around SHBrowseForFolder().
+    */
+    int oldErrorMode = OS.SetErrorMode (OS.SEM_FAILCRITICALERRORS);
+
+    /*
+    * Bug in Windows.  When a WH_MSGFILTER hook is used to run code
+    * during the message loop for SHBrowseForFolder(), running code
+    * in the hook can cause a GP.  Specifically, SetWindowText()
+    * for static controls seemed to make the problem happen.
+    * The fix is to disable async messages while the directory
+    * dialog is open.
+    *
+    * NOTE:  This only happens in versions of the comctl32.dll
+    * earlier than 6.0.
+    */
+    bool oldRunMessages = display.runMessages;
+    if (OS.COMCTL32_MAJOR < 6) display.runMessages = false;
+    int lpItemIdList = OS.SHBrowseForFolder (lpbi);
+    if (OS.COMCTL32_MAJOR < 6) display.runMessages = oldRunMessages;
+    OS.SetErrorMode (oldErrorMode);
+
+    /* Clear the temporary dialog modal parent */
+    if ((style & (DWT.APPLICATION_MODAL | DWT.SYSTEM_MODAL)) !is 0) {
+        display.setModalDialogShell (oldModal);
+    }
+
+    bool success = lpItemIdList !is 0;
+    if (success) {
+        /* Use the character encoding for the default locale */
+        TCHAR buffer = new TCHAR (0, OS.MAX_PATH);
+        if (OS.SHGetPathFromIDList (lpItemIdList, buffer)) {
+            directoryPath = buffer.toString (0, buffer.strlen ());
+            filterPath = directoryPath;
+        }
+    }
+
+    /* Free the BrowseCallbackProc */
+    callback.dispose ();
+
+    /* Free the OS memory */
+    if (lpszTitle !is 0) OS.HeapFree (hHeap, 0, lpszTitle);
+
+    /* Free the pointer to the ITEMIDLIST */
+    int [] ppMalloc = new int [1];
+    if (OS.SHGetMalloc (ppMalloc) is OS.S_OK) {
+        /* void Free (struct IMalloc *this, void *pv); */
+        OS.VtblCall (5, ppMalloc [0], lpItemIdList);
+    }
+
+    /*
+    * This code is intentionally commented.  On some
+    * platforms, the owner window is repainted right
+    * away when a dialog window exits.  This behavior
+    * is currently unspecified.
+    */
+//  if (hwndOwner !is 0) OS.UpdateWindow (hwndOwner);
+
+    /* Return the directory path */
+    if (!success) return null;
+    return directoryPath;
+}
+
+/**
+ * Sets the path that the dialog will use to filter
+ * the directories it shows to the argument, which may
+ * be null. If the string is null, then the operating
+ * system's default filter path will be used.
+ * <p>
+ * Note that the path string is platform dependent.
+ * For convenience, either '/' or '\' can be used
+ * as a path separator.
+ * </p>
+ *
+ * @param string the filter path
+ */
+public void setFilterPath (String string) {
+    filterPath = string;
+}
+
+/**
+ * Sets the dialog's message, which is a description of
+ * the purpose for which it was opened. This message will be
+ * visible on the dialog while it is open.
+ *
+ * @param string the message
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ * </ul>
+ */
+public void setMessage (String string) {
+    if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
+    message = string;
+}
+
+}
+++/
\ No newline at end of file