Ignore:
Timestamp:
Jun 11, 2002, 8:30:56 AM (23 years ago)
Author:
sandervl
Message:

Wine updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/dialogs.c

    r8614 r8640  
    1 /* $Id: dialogs.c,v 1.3 2002-06-09 12:41:20 sandervl Exp $ */
    21/*
    32 *      common shell dialogs
     3 *
     4 * Copyright 2000 Juergen Schmied
     5 *
     6 * This library is free software; you can redistribute it and/or
     7 * modify it under the terms of the GNU Lesser General Public
     8 * License as published by the Free Software Foundation; either
     9 * version 2.1 of the License, or (at your option) any later version.
     10 *
     11 * This library is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 * Lesser General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU Lesser General Public
     17 * License along with this library; if not, write to the Free Software
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    419 */
    5 #ifdef __WIN32OS2__
    6 #define ICOM_CINTERFACE 1
    7 #include <odin.h>
    8 #endif
     20
    921#include <string.h>
    1022#include <stdio.h>
    1123#include "winerror.h"
    12 #include "debugtools.h"
     24#include "winreg.h"
     25#include "commdlg.h"
     26#include "wine/debug.h"
    1327
    1428#include "shellapi.h"
     
    1731#include "undocshell.h"
    1832
    19 DEFAULT_DEBUG_CHANNEL(shell);
     33typedef struct
     34    {
     35        HWND hwndOwner ;
     36        HICON hIcon ;
     37        LPCSTR lpstrDirectory ;
     38        LPCSTR lpstrTitle ;
     39        LPCSTR lpstrDescription ;
     40        UINT uFlags ;
     41    } RUNFILEDLGPARAMS ;
     42   
     43typedef BOOL (*LPFNOFN) (OPENFILENAMEA *) ;
     44
     45WINE_DEFAULT_DEBUG_CHANNEL(shell);
     46BOOL CALLBACK RunDlgProc (HWND, UINT, WPARAM, LPARAM) ;
     47void FillList (HWND, char *) ;
    2048
    2149
    2250/*************************************************************************
    2351 * PickIconDlg                                  [SHELL32.62]
    24  * 
     52 *
    2553 */
    2654BOOL WINAPI PickIconDlg(
     
    4977        UINT uFlags)
    5078{
    51         FIXME("(0x%04x 0x%04x %s %s %s 0x%08x):stub.\n",
    52            hwndOwner, hIcon, lpstrDirectory, lpstrTitle, lpstrDescription, uFlags);
     79
     80    RUNFILEDLGPARAMS rfdp = {hwndOwner, hIcon, lpstrDirectory, lpstrTitle, lpstrDescription, uFlags} ;
     81    HRSRC hRes;
     82    LPVOID template;
     83    TRACE("\n");
     84
     85    if(!(hRes = FindResourceA(shell32_hInstance, "SHELL_RUN_DLG", RT_DIALOGA)))
     86        {
     87        MessageBoxA (hwndOwner, "Couldn't find dialog.", "Nix", MB_OK) ;
     88        return;
     89        }
     90    if(!(template = (LPVOID)LoadResource(shell32_hInstance, hRes)))
     91        {
     92        MessageBoxA (hwndOwner, "Couldn't load dialog.", "Nix", MB_OK) ;
     93        return;
     94        }
     95
     96    DialogBoxIndirectParamA(GetWindowLongA( hwndOwner, GWL_HINSTANCE ),
     97                                      template, hwndOwner, RunDlgProc, (LPARAM)&rfdp);
     98
    5399}
     100
     101/* Dialog procedure for RunFileDlg */
     102BOOL CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     103    {
     104    int ic ;
     105    char *psz, szMsg[256] ;
     106    static RUNFILEDLGPARAMS *prfdp = NULL ;
     107   
     108    switch (message)
     109        {
     110        case WM_INITDIALOG :
     111            prfdp = (RUNFILEDLGPARAMS *)lParam ;
     112            SetWindowTextA (hwnd, prfdp->lpstrTitle) ;
     113            SetClassLongA (hwnd, GCL_HICON, prfdp->hIcon) ;
     114            SendMessageA (GetDlgItem (hwnd, 12297), STM_SETICON, (WPARAM)LoadIconA ((HINSTANCE)NULL, IDI_WINLOGOA), 0) ;
     115            FillList (GetDlgItem (hwnd, 12298), NULL) ;
     116            SetFocus (GetDlgItem (hwnd, 12298)) ;
     117            return TRUE ;
     118           
     119        case WM_COMMAND :
     120            {
     121            STARTUPINFOA si ;
     122            PROCESS_INFORMATION pi ;
     123           
     124            si.cb = sizeof (STARTUPINFOA) ;
     125            si.lpReserved = NULL ;
     126            si.lpDesktop = NULL ;
     127            si.lpTitle = NULL ;
     128            si.dwX = 0 ;
     129            si.dwY = 0 ;
     130            si.dwXSize = 0 ;
     131            si.dwYSize = 0 ;
     132            si.dwXCountChars = 0 ;
     133            si.dwYCountChars = 0 ;
     134            si.dwFillAttribute = 0 ;
     135            si.dwFlags = 0 ;
     136            si.cbReserved2 = 0 ;
     137            si.lpReserved2 = NULL ;
     138           
     139            switch (LOWORD (wParam))
     140                {
     141                case IDOK :
     142                    {
     143                    HWND htxt = (HWND)NULL ;
     144                    if ((ic = GetWindowTextLengthA (htxt = GetDlgItem (hwnd, 12298))))
     145                        {
     146                        psz = malloc (ic + 2) ;
     147                        GetWindowTextA (htxt, psz, ic + 1) ;
     148                       
     149                        if (!CreateProcessA (NULL, psz, NULL, NULL, TRUE,
     150                            NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
     151                            {
     152                            char *pszSysMsg = NULL ;
     153                            FormatMessageA (
     154                                FORMAT_MESSAGE_ALLOCATE_BUFFER |
     155                                FORMAT_MESSAGE_FROM_SYSTEM |
     156                                FORMAT_MESSAGE_IGNORE_INSERTS,
     157                                NULL, GetLastError (),
     158                                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
     159                                (LPSTR)&pszSysMsg, 0, NULL
     160                                ) ;
     161                            sprintf (szMsg, "Error: %s", pszSysMsg) ;
     162                            LocalFree ((HLOCAL)pszSysMsg) ;
     163                            MessageBoxA (hwnd, szMsg, "Nix", MB_OK | MB_ICONEXCLAMATION) ;
     164                           
     165                            free (psz) ;
     166                            SendMessageA (htxt, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
     167                            return TRUE ;
     168                            }
     169                        FillList (htxt, psz) ;
     170                        free (psz) ;
     171                        EndDialog (hwnd, 0) ;
     172                        }
     173                    }
     174                   
     175                case IDCANCEL :
     176                    EndDialog (hwnd, 0) ;
     177                    return TRUE ;
     178               
     179                case 12288 :
     180                    {
     181                    HMODULE hComdlg = (HMODULE)NULL ;
     182                    LPFNOFN ofnProc = NULL ;
     183                    static char szFName[1024] = "", szFileTitle[256] = "", szInitDir[768] = "" ;
     184                    static OPENFILENAMEA ofn =
     185                        {
     186                        sizeof (OPENFILENAMEA),
     187                        (HWND)NULL,
     188                        (HINSTANCE)NULL,
     189                        "Executable Files\0*.exe\0All Files\0*.*\0\0\0\0",
     190                        (LPSTR)NULL,
     191                        0,
     192                        0,
     193                        szFName,
     194                        1023,
     195                        szFileTitle,
     196                        255,
     197                        (LPCSTR)szInitDir,
     198                        "Browse",
     199                        OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST,
     200                        0,
     201                        0,
     202                        (LPCSTR)NULL,
     203                        0,
     204                        (LPOFNHOOKPROC)NULL,
     205                        (LPCSTR)NULL
     206                        } ;
     207                   
     208                    ofn.hwndOwner = hwnd ;
     209                   
     210                    if ((HMODULE)NULL == (hComdlg = LoadLibraryExA ("comdlg32", (HANDLE)NULL, 0)))
     211                        {
     212                        MessageBoxA (hwnd, "Unable to display dialog box (LoadLibraryEx) !", "Nix", MB_OK | MB_ICONEXCLAMATION) ;
     213                        return TRUE ;
     214                        }
     215                   
     216                    if ((LPFNOFN)NULL == (ofnProc = (LPFNOFN)GetProcAddress (hComdlg, "GetOpenFileNameA")))
     217                        {
     218                        MessageBoxA (hwnd, "Unable to display dialog box (GetProcAddress) !", "Nix", MB_OK | MB_ICONEXCLAMATION) ;
     219                        return TRUE ;
     220                        }
     221                   
     222                    ofnProc (&ofn) ;
     223                   
     224                    SetFocus (GetDlgItem (hwnd, IDOK)) ;
     225                    SetWindowTextA (GetDlgItem (hwnd, 12298), szFName) ;
     226                    SendMessageA (GetDlgItem (hwnd, 12298), CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
     227                    SetFocus (GetDlgItem (hwnd, IDOK)) ;
     228                   
     229                    FreeLibrary (hComdlg) ;
     230                   
     231                    return TRUE ;
     232                    }
     233                }
     234            return TRUE ;
     235            }
     236        }
     237       
     238    /* This should be DefDlgProcA, but that doesn't work */
     239    return FALSE ;
     240    }
     241
     242/* This grabs the MRU list from the registry and fills the combo for the "Run" dialog above */
     243void FillList (HWND hCb, char *pszLatest)
     244    {
     245    HKEY hkey ;
     246/*    char szDbgMsg[256] = "" ; */
     247    char *pszList = NULL, *pszCmd = NULL, cMatch = 0, cMax = 0x60, szIndex[2] = "-" ;
     248    DWORD icList = 0, icCmd = 0 ;
     249    int Nix ;
     250   
     251    SendMessageA (hCb, CB_RESETCONTENT, 0, 0) ;
     252   
     253    if (ERROR_SUCCESS != RegCreateKeyExA (
     254        HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU",
     255        0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL))
     256        MessageBoxA (hCb, "Unable to open registry key !", "Nix", MB_OK) ;
     257       
     258    if (ERROR_SUCCESS != RegQueryValueExA (hkey, "MRUList", NULL, NULL, NULL, &icList))
     259        MessageBoxA (hCb, "Unable to grab size for MRUList !", "Nix", MB_OK) ;
     260    if (icList > 0)
     261        {
     262        pszList = malloc (icList) ;
     263        if (ERROR_SUCCESS != RegQueryValueExA (hkey, "MRUList", NULL, NULL, pszList, &icList))
     264            MessageBoxA (hCb, "Unable to grab MRUList !", "Nix", MB_OK) ;
     265        }
     266    else
     267        {
     268        pszList = malloc (icList = 1) ;
     269        pszList[0] = 0 ;
     270        }
     271   
     272    for (Nix = 0 ; Nix < icList - 1 ; Nix++)
     273        {
     274        if (pszList[Nix] > cMax)
     275            cMax = pszList[Nix] ;
     276           
     277        szIndex[0] = pszList[Nix] ;
     278       
     279        if (ERROR_SUCCESS != RegQueryValueExA (hkey, szIndex, NULL, NULL, NULL, &icCmd))
     280            MessageBoxA (hCb, "Unable to grab size of index", "Nix", MB_OK) ;
     281        pszCmd = realloc (pszCmd, icCmd) ;
     282        if (ERROR_SUCCESS != RegQueryValueExA (hkey, szIndex, NULL, NULL, pszCmd, &icCmd))
     283            MessageBoxA (hCb, "Unable to grab index", "Nix", MB_OK) ;
     284       
     285        if (NULL != pszLatest)
     286            {
     287            if (!strcasecmp (pszCmd, pszLatest))
     288                {
     289                /*
     290                sprintf (szDbgMsg, "Found existing (%d).\n", Nix) ;
     291                MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ;
     292                */
     293                SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszCmd) ;
     294                SetWindowTextA (hCb, pszCmd) ;
     295                SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
     296                   
     297                cMatch = pszList[Nix] ;
     298                memmove (&pszList[1], pszList, Nix) ;
     299                pszList[0] = cMatch ;
     300                continue ;
     301                }
     302            }
     303           
     304        if (26 != icList - 1 || icList - 2 != Nix || cMatch || NULL == pszLatest)
     305            {
     306            /*
     307            sprintf (szDbgMsg, "Happily appending (%d).\n", Nix) ;
     308            MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ;
     309            */
     310            SendMessageA (hCb, CB_ADDSTRING, 0, (LPARAM)pszCmd) ;
     311            if (!Nix)
     312                {
     313                SetWindowTextA (hCb, pszCmd) ;
     314                SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
     315                }
     316               
     317            }
     318        else
     319            {
     320            /*
     321            sprintf (szDbgMsg, "Doing loop thing.\n") ;
     322            MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ;
     323            */
     324            SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszLatest) ;
     325            SetWindowTextA (hCb, pszLatest) ;
     326            SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
     327       
     328            cMatch = pszList[Nix] ;
     329            memmove (&pszList[1], pszList, Nix) ;
     330            pszList[0] = cMatch ;
     331            szIndex[0] = cMatch ;
     332            RegSetValueExA (hkey, szIndex, 0, REG_SZ, pszLatest, strlen (pszLatest) + 1) ;
     333            }
     334        }
     335
     336    if (!cMatch && NULL != pszLatest)
     337        {
     338        /*
     339        sprintf (szDbgMsg, "Simply inserting (increasing list).\n") ;
     340        MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ;
     341        */
     342        SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszLatest) ;
     343        SetWindowTextA (hCb, pszLatest) ;
     344        SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ;
     345       
     346        cMatch = ++cMax ;
     347        pszList = realloc (pszList, ++icList) ;
     348        memmove (&pszList[1], pszList, icList - 1) ;
     349        pszList[0] = cMatch ;
     350        szIndex[0] = cMatch ;
     351        RegSetValueExA (hkey, szIndex, 0, REG_SZ, pszLatest, strlen (pszLatest) + 1) ;
     352        }
     353
     354    RegSetValueExA (hkey, "MRUList", 0, REG_SZ, pszList, strlen (pszList) + 1) ;
     355   
     356    free (pszCmd) ;   
     357    free (pszList) ;
     358    }
    54359
    55360/*************************************************************************
     
    63368        TRACE("(0x%08x)\n", hWndOwner);
    64369#ifdef __WIN32OS2__
    65         if (MessageBoxA( hWndOwner, "Do you want to exit Odin?", "Shutdown", MB_YESNO|MB_ICONQUESTION) == IDOK)
     370        if (MessageBoxA( hWndOwner, "Do you want to exit Odin?", "Shutdown", MB_YESNO|MB_ICONQUESTION) == IDYES)
    66371#else
    67         if (MessageBoxA( hWndOwner, "Do you want to exit WINE?", "Shutdown", MB_YESNO|MB_ICONQUESTION) == IDOK)
     372        if (MessageBoxA( hWndOwner, "Do you want to exit WINE?", "Shutdown", MB_YESNO|MB_ICONQUESTION) == IDYES)
    68373#endif
    69374        {
Note: See TracChangeset for help on using the changeset viewer.