Re: dlls/shell32/dialogs.c:RunFileDlg - implemented

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2002-06-06 at 09:14, Mike McCormack wrote:
> 
> You'd better use cvs diff -u (you can add diff -u to your ~/.cvsrc so as 
> not to forget).
> 
> You should just submit the changelog entries like this:
> 

Well, here it is with these mods then.  I removed the stuff from the
ChangeLog file.  Everything quoted below still holds.

> ChangeLog:
> Added RunFileDlg with MRU list (based on the template found in
> Win98 shell32.dll)
> 
> Looks like good work though!
> 
> Mike
> 
> Nix N. Nix wrote:
> > I implemented RunFileDlg from dlls/shell32/dialogs.c, together with the
> > MRU list that Windoze has.  I placed the MRU list stuff in the same
> > registry key as in Windoze.  I had to add a dependency.  The
> > "&Browse..." button requires commdlg.  I didn't know how to do this in
> > the Makefile, so I used LoadLibraryEx.
> > 
> > Well, here it is (diff is against CVS from around Wed Jun  5 16:00:00
> > EDT 2002)

Thanks for the help.

Index: dlls/shell32/dialogs.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/dialogs.c,v
retrieving revision 1.5
diff -u -r1.5 dialogs.c
--- dlls/shell32/dialogs.c	31 May 2002 23:25:52 -0000	1.5
+++ dlls/shell32/dialogs.c	6 Jun 2002 15:15:11 -0000
@@ -21,6 +21,8 @@
 #include <string.h>
 #include <stdio.h>
 #include "winerror.h"
+#include "winreg.h"
+#include "commdlg.h"
 #include "wine/debug.h"
 
 #include "shellapi.h"
@@ -28,7 +30,21 @@
 #include "shell32_main.h"
 #include "undocshell.h"
 
+typedef struct 
+    {
+	HWND hwndOwner ;
+	HICON hIcon ;
+	LPCSTR lpstrDirectory ;
+	LPCSTR lpstrTitle ;
+	LPCSTR lpstrDescription ;
+	UINT uFlags ;
+    } RUNFILEDLGPARAMS ;
+    
+typedef BOOL (*LPFNOFN) (OPENFILENAMEA *) ;
+
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
+BOOL CALLBACK RunDlgProc (HWND, UINT, WPARAM, LPARAM) ;
+void FillList (HWND, char *) ;
 
 
 /*************************************************************************
@@ -60,9 +76,286 @@
 	LPCSTR lpstrDescription,
 	UINT uFlags)
 {
-	FIXME("(0x%04x 0x%04x %s %s %s 0x%08x):stub.\n",
-	   hwndOwner, hIcon, lpstrDirectory, lpstrTitle, lpstrDescription, uFlags);
+
+    RUNFILEDLGPARAMS rfdp = {hwndOwner, hIcon, lpstrDirectory, lpstrTitle, lpstrDescription, uFlags} ;
+    HRSRC hRes;
+    LPVOID template;
+    TRACE("\n");
+
+    if(!(hRes = FindResourceA(shell32_hInstance, "SHELL_RUN_DLG", RT_DIALOGA)))
+        {
+        MessageBoxA (hwndOwner, "Couldn't find dialog.", "Nix", MB_OK) ;
+        return;
+        }
+    if(!(template = (LPVOID)LoadResource(shell32_hInstance, hRes)))
+        {
+        MessageBoxA (hwndOwner, "Couldn't load dialog.", "Nix", MB_OK) ;
+        return;
+        }
+
+    DialogBoxIndirectParamA(GetWindowLongA( hwndOwner, GWL_HINSTANCE ),
+                                      template, hwndOwner, RunDlgProc, (LPARAM)&rfdp);
+
 }
+
+/* Dialog procedure for RunFileDlg */
+BOOL CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+    {
+    int ic ;
+    char *psz, szMsg[256] ;
+    static RUNFILEDLGPARAMS *prfdp = NULL ;
+    
+    switch (message)
+        {
+        case WM_INITDIALOG :
+            prfdp = (RUNFILEDLGPARAMS *)lParam ;
+            SetWindowTextA (hwnd, prfdp->lpstrTitle) ;
+            SetClassLongA (hwnd, GCL_HICON, prfdp->hIcon) ;
+            SendMessageA (GetDlgItem (hwnd, 12297), STM_SETICON, (WPARAM)LoadIconA ((HINSTANCE)NULL, IDI_WINLOGOA), 0) ;
+            FillList (GetDlgItem (hwnd, 12298), NULL) ;
+            SetFocus (GetDlgItem (hwnd, 12298)) ;
+            break ;
+            
+        case WM_COMMAND :
+            {
+            STARTUPINFOA si ;
+            PROCESS_INFORMATION pi ;
+            
+            si.cb = sizeof (STARTUPINFOA) ;
+            si.lpReserved = NULL ;
+            si.lpDesktop = NULL ;
+            si.lpTitle = NULL ;
+            si.dwX = 0 ;
+            si.dwY = 0 ;
+            si.dwXSize = 0 ;
+            si.dwYSize = 0 ;
+            si.dwXCountChars = 0 ;
+            si.dwYCountChars = 0 ;
+            si.dwFillAttribute = 0 ;
+            si.dwFlags = 0 ;
+            si.cbReserved2 = 0 ;
+            si.lpReserved2 = NULL ;
+            
+            switch (LOWORD (wParam))
+                {
+                case IDOK :
+                    {
+                    HWND htxt = (HWND)NULL ;
+                    if ((ic = GetWindowTextLengthA (htxt = GetDlgItem (hwnd, 12298))))
+                        {
+                        psz = malloc (ic + 2) ;
+                        GetWindowTextA (htxt, psz, ic + 1) ;
+                        
+                        if (!CreateProcessA (NULL, psz, NULL, NULL, TRUE,
+                            NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
+                            {
+                            char *pszSysMsg = NULL ;
+                            FormatMessageA (
+                                FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                                FORMAT_MESSAGE_FROM_SYSTEM |
+                                FORMAT_MESSAGE_IGNORE_INSERTS,
+                                NULL, GetLastError (),
+                                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                                (LPSTR)&pszSysMsg, 0, NULL
+                                ) ;
+                            sprintf (szMsg, "Error: %s", pszSysMsg) ;
+                            LocalFree ((HLOCAL)pszSysMsg) ;
+                            MessageBoxA (hwnd, szMsg, "Nix", MB_OK | MB_ICONEXCLAMATION) ;
+                            
+                            free (psz) ;
+                            SendMessageA (htxt, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
+                            break ;
+                            }
+                        FillList (htxt, psz) ;
+                        free (psz) ;
+                        EndDialog (hwnd, 0) ;
+                        }
+                    }
+                    
+                case IDCANCEL :
+                    EndDialog (hwnd, 0) ;
+                    break ;
+                
+                case 12288 :
+                    {
+                    HMODULE hComdlg = (HMODULE)NULL ;
+                    LPFNOFN ofnProc = NULL ;
+                    static char szFName[1024] = "", szFileTitle[256] = "", szInitDir[768] = "" ;
+                    static OPENFILENAMEA ofn =
+                        {
+                        sizeof (OPENFILENAMEA),
+                        (HWND)NULL,
+                        (HINSTANCE)NULL,
+                        "Executable Files\0*.exe\0All Files\0*.*\0\0\0\0",
+                        (LPSTR)NULL,
+                        0,
+                        0,
+                        szFName,
+                        1023,
+                        szFileTitle,
+                        255,
+                        (LPCSTR)szInitDir,
+                        "Browse",
+                        OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST,
+                        0,
+                        0, 
+                        (LPCSTR)NULL,
+                        0,
+                        (LPOFNHOOKPROC)NULL, 
+                        (LPCSTR)NULL
+                        } ;
+                    
+                    ofn.hwndOwner = hwnd ;
+                    
+                    if ((HMODULE)NULL == (hComdlg = LoadLibraryExA ("comdlg32", (HANDLE)NULL, 0)))
+                        {
+                        MessageBoxA (hwnd, "Unable to display dialog box (LoadLibraryEx) !", "Nix", MB_OK | MB_ICONEXCLAMATION) ;
+                        break ;
+                        }
+                    
+                    if ((LPFNOFN)NULL == (ofnProc = (LPFNOFN)GetProcAddress (hComdlg, "GetOpenFileNameA")))
+                        {
+                        MessageBoxA (hwnd, "Unable to display dialog box (GetProcAddress) !", "Nix", MB_OK | MB_ICONEXCLAMATION) ;
+                        break ;
+                        }
+                    
+                    ofnProc (&ofn) ;
+                    
+                    SetFocus (GetDlgItem (hwnd, IDOK)) ;
+                    SetWindowTextA (GetDlgItem (hwnd, 12298), szFName) ;
+                    SendMessageA (GetDlgItem (hwnd, 12298), CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
+                    SetFocus (GetDlgItem (hwnd, IDOK)) ;
+                    
+                    FreeLibrary (hComdlg) ;
+                    
+                    break ;
+                    }
+                }
+            break ;
+            }
+        }
+        
+    /* This should be DefDlgProcA, but that doesn't work */
+    return DefWindowProcA (hwnd, message, wParam, lParam) ;
+    }
+
+/* This grabs the MRU list from the registry and fills the combo for the "Run" dialog above */
+void FillList (HWND hCb, char *pszLatest)
+    {
+    HKEY hkey ;
+/*    char szDbgMsg[256] = "" ; */
+    char *pszList = NULL, *pszCmd = NULL, cMatch = 0, cMax = 0x60, szIndex[2] = "-" ;
+    DWORD icList = 0, icCmd = 0 ;
+    int Nix ;
+    
+    SendMessageA (hCb, CB_RESETCONTENT, 0, 0) ;
+    
+    if (ERROR_SUCCESS != RegCreateKeyExA (
+        HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU",
+        0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL))
+        MessageBoxA (hCb, "Unable to open registry key !", "Nix", MB_OK) ;
+        
+    if (ERROR_SUCCESS != RegQueryValueExA (hkey, "MRUList", NULL, NULL, NULL, &icList))
+        MessageBoxA (hCb, "Unable to grab size for MRUList !", "Nix", MB_OK) ;
+    if (icList > 0)
+        {
+        pszList = malloc (icList) ;
+        if (ERROR_SUCCESS != RegQueryValueExA (hkey, "MRUList", NULL, NULL, pszList, &icList))
+            MessageBoxA (hCb, "Unable to grab MRUList !", "Nix", MB_OK) ;
+        }
+    else
+        {
+        pszList = malloc (icList = 1) ;
+        pszList[0] = 0 ;
+        }
+    
+    for (Nix = 0 ; Nix < icList - 1 ; Nix++)
+        {
+        if (pszList[Nix] > cMax)
+            cMax = pszList[Nix] ;
+            
+        szIndex[0] = pszList[Nix] ;
+        
+        if (ERROR_SUCCESS != RegQueryValueExA (hkey, szIndex, NULL, NULL, NULL, &icCmd))
+            MessageBoxA (hCb, "Unable to grab size of index", "Nix", MB_OK) ;
+        pszCmd = realloc (pszCmd, icCmd) ;
+        if (ERROR_SUCCESS != RegQueryValueExA (hkey, szIndex, NULL, NULL, pszCmd, &icCmd))
+            MessageBoxA (hCb, "Unable to grab index", "Nix", MB_OK) ;
+        
+        if (NULL != pszLatest)
+            {
+            if (!strcasecmp (pszCmd, pszLatest))
+                {
+                /*
+                sprintf (szDbgMsg, "Found existing (%d).\n", Nix) ;
+                MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ;
+                */
+                SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszCmd) ;
+                SetWindowTextA (hCb, pszCmd) ;
+                SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
+                    
+                cMatch = pszList[Nix] ;
+                memmove (&pszList[1], pszList, Nix) ;
+                pszList[0] = cMatch ;
+                continue ;
+                }
+            }
+            
+        if (26 != icList - 1 || icList - 2 != Nix || cMatch || NULL == pszLatest)
+            {
+            /*
+            sprintf (szDbgMsg, "Happily appending (%d).\n", Nix) ;
+            MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ;
+            */
+            SendMessageA (hCb, CB_ADDSTRING, 0, (LPARAM)pszCmd) ;
+            if (!Nix)
+                {
+                SetWindowTextA (hCb, pszCmd) ;
+                SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
+                }
+                
+            }
+        else
+            {
+            /*
+            sprintf (szDbgMsg, "Doing loop thing.\n") ;
+            MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ;
+            */
+            SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszLatest) ;
+            SetWindowTextA (hCb, pszLatest) ;
+            SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
+        
+            cMatch = pszList[Nix] ;
+            memmove (&pszList[1], pszList, Nix) ;
+            pszList[0] = cMatch ;
+            szIndex[0] = cMatch ;
+            RegSetValueExA (hkey, szIndex, 0, REG_SZ, pszLatest, strlen (pszLatest) + 1) ;
+            }
+        }
+
+    if (!cMatch && NULL != pszLatest)
+        {
+        /*
+        sprintf (szDbgMsg, "Simply inserting (increasing list).\n") ;
+        MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ;
+        */
+        SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszLatest) ;
+        SetWindowTextA (hCb, pszLatest) ;
+        SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
+        
+        cMatch = ++cMax ;
+        pszList = realloc (pszList, ++icList) ;
+        memmove (&pszList[1], pszList, icList - 1) ;
+        pszList[0] = cMatch ;
+        szIndex[0] = cMatch ;
+        RegSetValueExA (hkey, szIndex, 0, REG_SZ, pszLatest, strlen (pszLatest) + 1) ;
+        }
+
+    RegSetValueExA (hkey, "MRUList", 0, REG_SZ, pszList, strlen (pszList) + 1) ;
+    
+    free (pszCmd) ;    
+    free (pszList) ;
+    }
 
 /*************************************************************************
  * ExitWindowsDialog				[SHELL32.60]
Index: dlls/shell32/shell32_En.rc
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_En.rc,v
retrieving revision 1.6
diff -u -r1.6 shell32_En.rc
--- dlls/shell32/shell32_En.rc	1 Jun 2002 02:55:50 -0000	1.6
+++ dlls/shell32/shell32_En.rc	6 Jun 2002 15:15:11 -0000
@@ -30,6 +30,20 @@
  LTEXT "Wine was brought to you by:", 98, 8, 55, 137, 10
 }
 
+SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "Helv"
+{
+ ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
+ LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18
+ LTEXT "&Open:", 12305, 7, 39, 24, 10
+ CONTROL "", 12298, "COMBOBOX", WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
+ DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP
+ PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
+ PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP
+}
+
 /*	columns in the shellview	*/
 STRINGTABLE LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 BEGIN

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux