diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | win/tkWinDialog.c | 47 |
2 files changed, 46 insertions, 7 deletions
@@ -1,3 +1,9 @@ +2004-02-12 Jeff Hobbs <jeffh@ActiveState.com> + + * win/tkWinDialog.c (ChooseDirectoryValidateProc): create a pidl + for -initialdir if we have a UNC path because BFFM_SETSELECTION + doesn't support UNC paths in strings. + 2004-02-10 Donal K. Fellows <donal.k.fellows@man.ac.uk> * library/msgs/eo.msg: Language support for Esperanto and Polish from diff --git a/win/tkWinDialog.c b/win/tkWinDialog.c index 1ede6d5..ea08072 100644 --- a/win/tkWinDialog.c +++ b/win/tkWinDialog.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkWinDialog.c,v 1.33 2004/01/13 02:06:01 davygrvy Exp $ + * RCS: @(#) $Id: tkWinDialog.c,v 1.34 2004/02/13 01:28:19 hobbs Exp $ * */ @@ -1999,25 +1999,58 @@ ChooseDirectoryValidateProc ( SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM) selDir); // enable the OK button SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 1); - //EnableWindow(GetDlgItem(hwnd, IDOK), TRUE); SetCurrentDirectory(selDir); } else { // disable the OK button SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 0); - //EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); } UpdateWindow(hwnd); return 1; - case BFFM_INITIALIZED: + case BFFM_INITIALIZED: { /* * Directory browser intializing - tell it where to start from, * user specified parameter. */ - SetCurrentDirectory((char *) lpData); - SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData); - SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 1); + char *initDir = chooseDirSharedData->utfInitDir; + + SetCurrentDirectory(initDir); + if (*initDir == '\\') { + /* + * BFFM_SETSELECTION only understands UNC paths as pidls, + * so convert path to pidl using IShellFolder interface. + */ + LPMALLOC pMalloc; + LPSHELLFOLDER psfFolder; + + if (SUCCEEDED(SHGetMalloc(&pMalloc))) { + if (SUCCEEDED(SHGetDesktopFolder(&psfFolder))) { + LPITEMIDLIST pidlMain; + ULONG ulCount, ulAttr; + Tcl_DString ds; + + Tcl_UtfToExternalDString(TkWinGetUnicodeEncoding(), + initDir, -1, &ds); + if (SUCCEEDED(psfFolder->lpVtbl->ParseDisplayName( + psfFolder, hwnd, NULL, + (WCHAR *) Tcl_DStringValue(&ds), + &ulCount, &pidlMain, &ulAttr)) + && (pidlMain != NULL)) { + SendMessage(hwnd, BFFM_SETSELECTION, FALSE, + (LPARAM)pidlMain); + pMalloc->lpVtbl->Free(pMalloc, pidlMain); + } + psfFolder->lpVtbl->Release(psfFolder); + Tcl_DStringFree(&ds); + } + pMalloc->lpVtbl->Release(pMalloc); + } + } else { + SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)initDir); + } + SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 1); break; + } } return 0; |