Better handling of custom templates and hooks.
Bug fixes.
This commit is contained in:
parent
697a621a7c
commit
ebcc72c925
|
@ -1,6 +1,20 @@
|
|||
/*
|
||||
* COMMDLG - File Open Dialogs Win95 look and feel
|
||||
*
|
||||
* FIXME: The whole concept of handling unicode is badly broken.
|
||||
* many hook-messages expecting a pointer to a
|
||||
* OPENFILENAMEA or W structure. With the current architecture
|
||||
* we would have to convert the beast at every call to a hook.
|
||||
* we have to find a better solution but if would likely cause
|
||||
* a complete rewrite with after we shouldhandle the
|
||||
* OPENFILENAME structure without any converting (jsch).
|
||||
*
|
||||
* FIXME: any hook gets a OPENFILENAMEA structure
|
||||
*
|
||||
* FIXME: CDN_FILEOK is wrong implemented, other CDN_ messages likely too
|
||||
*
|
||||
* FIXME: old style hook messages are not implemented (except FILEOKSTRING)
|
||||
*
|
||||
* FIXME: lpstrCustomFilter not handled
|
||||
*
|
||||
* FIXME: if the size of lpstrFile (nMaxFile) is too small the first
|
||||
|
@ -12,7 +26,7 @@
|
|||
*
|
||||
* FIXME: flags not implemented: OFN_CREATEPROMPT, OFN_DONTADDTORECENT,
|
||||
* OFN_ENABLEINCLUDENOTIFY, OFN_ENABLESIZING, OFN_EXTENSIONDIFFERENT,
|
||||
* OFN_NOCHANGEDIR, OFN_NODEREFERENCELINKS, OFN_READONLYRETURN,
|
||||
* OFN_NOCHANGEDIR, OFN_NODEREFERENCELINKS, OFN_NOREADONLYRETURN,
|
||||
* OFN_NOTESTFILECREATE, OFN_OVERWRITEPROMPT, OFN_USEMONIKERS
|
||||
*
|
||||
* FIXME: lCustData for lpfnHook (WM_INITDIALOG)
|
||||
|
@ -44,6 +58,14 @@
|
|||
|
||||
DEFAULT_DEBUG_CHANNEL(commdlg);
|
||||
|
||||
#define UNIMPLEMENTED_FLAGS \
|
||||
(OFN_CREATEPROMPT | OFN_DONTADDTORECENT |\
|
||||
OFN_ENABLEINCLUDENOTIFY | OFN_ENABLESIZING | OFN_EXTENSIONDIFFERENT |\
|
||||
OFN_NOCHANGEDIR | OFN_NODEREFERENCELINKS | OFN_NOREADONLYRETURN |\
|
||||
OFN_NOTESTFILECREATE | OFN_OVERWRITEPROMPT /*| OFN_USEMONIKERS*/)
|
||||
|
||||
#define IsHooked(fodInfos) \
|
||||
((fodInfos->ofnInfos->Flags & OFN_ENABLEHOOK) && fodInfos->ofnInfos->lpfnHook)
|
||||
/***********************************************************************
|
||||
* Data structure and global variables
|
||||
*/
|
||||
|
@ -130,11 +152,11 @@ static const char defaultFilter[] = "*.*";
|
|||
*/
|
||||
|
||||
/* Internal functions used by the dialog */
|
||||
static LRESULT FILEDLG95_OnWMInitDialog(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT FILEDLG95_FillControls(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam);
|
||||
static LRESULT FILEDLG95_OnWMGetIShellBrowser(HWND hwnd);
|
||||
BOOL FILEDLG95_OnOpen(HWND hwnd);
|
||||
static LRESULT FILEDLG95_InitUI(HWND hwnd);
|
||||
static LRESULT FILEDLG95_InitControls(HWND hwnd);
|
||||
static void FILEDLG95_Clean(HWND hwnd);
|
||||
|
||||
/* Functions used by the shell navigation */
|
||||
|
@ -197,6 +219,13 @@ BOOL WINAPI GetFileName95(FileOpenDlgInfos *fodInfos)
|
|||
HRSRC hRes;
|
||||
HANDLE hDlgTmpl = 0;
|
||||
|
||||
/* test for missing functionality */
|
||||
if (fodInfos->ofnInfos->Flags & UNIMPLEMENTED_FLAGS)
|
||||
{
|
||||
FIXME("Flags 0x%08lx not yet implemented\n",
|
||||
fodInfos->ofnInfos->Flags & UNIMPLEMENTED_FLAGS);
|
||||
}
|
||||
|
||||
/* Create the dialog from a template */
|
||||
|
||||
if(!(hRes = FindResourceA(COMMDLG_hInstance32,MAKEINTRESOURCEA(NEWFILEOPENORD),RT_DIALOGA)))
|
||||
|
@ -210,6 +239,16 @@ BOOL WINAPI GetFileName95(FileOpenDlgInfos *fodInfos)
|
|||
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* old style hook messages */
|
||||
if (IsHooked(fodInfos))
|
||||
{
|
||||
fodInfos->HookMsg.fileokstring = RegisterWindowMessageA(FILEOKSTRING);
|
||||
fodInfos->HookMsg.lbselchstring = RegisterWindowMessageA(LBSELCHSTRING);
|
||||
fodInfos->HookMsg.helpmsgstring = RegisterWindowMessageA(HELPMSGSTRING);
|
||||
fodInfos->HookMsg.sharevistring = RegisterWindowMessageA(SHAREVISTRING);
|
||||
}
|
||||
|
||||
lRes = DialogBoxIndirectParamA(COMMDLG_hInstance32,
|
||||
(LPDLGTEMPLATEA) template,
|
||||
fodInfos->ofnInfos->hwndOwner,
|
||||
|
@ -254,14 +293,6 @@ BOOL WINAPI GetFileDialog95A(LPOPENFILENAMEA ofn,UINT iDlgType)
|
|||
dwFlags = ofn->Flags;
|
||||
ofn->Flags = ofn->Flags|OFN_WINE;
|
||||
|
||||
/* Replace the NULL lpstrInitialDir by the current folder */
|
||||
if(!ofn->lpstrInitialDir)
|
||||
{
|
||||
lpstrInitialDir = ofn->lpstrInitialDir;
|
||||
ofn->lpstrInitialDir = MemAlloc(MAX_PATH);
|
||||
GetCurrentDirectoryA(MAX_PATH,(LPSTR)ofn->lpstrInitialDir);
|
||||
}
|
||||
|
||||
/* Initialise the dialog property */
|
||||
fodInfos->DlgInfos.dwDlgProp = 0;
|
||||
fodInfos->DlgInfos.hwndCustomDlg = (HWND)NULL;
|
||||
|
@ -297,20 +328,61 @@ BOOL WINAPI GetFileDialog95A(LPOPENFILENAMEA ofn,UINT iDlgType)
|
|||
* Copy the OPENFILENAMEW structure in a FileOpenDlgInfos structure.
|
||||
* Call GetFileName95 with this structure and clean the memory.
|
||||
*
|
||||
* IN : The OPENFILENAMEW initialisation structure passed to
|
||||
* GetOpenFileNameW win api function (see filedlg.c)
|
||||
* FIXME: lpstrCustomFilter has to converted back
|
||||
*
|
||||
* FIXME:
|
||||
* some more strings are needing to be convertet AtoW
|
||||
*/
|
||||
|
||||
/* converting IN arguments */
|
||||
#define AllocInArgWtoA(arg, save) \
|
||||
if(arg) \
|
||||
{ \
|
||||
save = arg; \
|
||||
arg = MemAlloc(lstrlenW(arg)); \
|
||||
lstrcpyWtoA((LPSTR)arg, save); \
|
||||
}
|
||||
|
||||
#define FreeInArg(arg, save) \
|
||||
if(arg) \
|
||||
{ \
|
||||
MemFree((LPSTR)arg); \
|
||||
arg = save; \
|
||||
}
|
||||
|
||||
/* converting OUT arguments */
|
||||
#define AllocOutArgWtoA(arg, save, len) \
|
||||
if(arg) \
|
||||
{ \
|
||||
save = arg; \
|
||||
arg = MemAlloc(len); \
|
||||
}
|
||||
|
||||
#define FreeOutArg(arg, save, len) \
|
||||
if(arg) \
|
||||
{ \
|
||||
lstrcpynAtoW(save, (LPCSTR)arg, len); \
|
||||
MemFree(arg); \
|
||||
arg = save; \
|
||||
}
|
||||
|
||||
BOOL WINAPI GetFileDialog95W(LPOPENFILENAMEW ofn,UINT iDlgType)
|
||||
{
|
||||
BOOL ret;
|
||||
FileOpenDlgInfos *fodInfos;
|
||||
HINSTANCE hInstance;
|
||||
LPCSTR lpstrFilter = NULL;
|
||||
LPSTR lpstrCustomFilter = NULL;
|
||||
|
||||
/* out arguments */
|
||||
LPWSTR lpstrFile = NULL;
|
||||
LPWSTR lpstrFileTitle = NULL;
|
||||
|
||||
/* in/out arguments */
|
||||
LPWSTR lpstrCustomFilter = NULL;
|
||||
|
||||
/* input arguments */
|
||||
LPCWSTR lpstrFilter = NULL;
|
||||
LPCWSTR lpstrInitialDir = NULL;
|
||||
LPCWSTR lpstrTitle = NULL;
|
||||
LPCWSTR lpstrDefExt = NULL;
|
||||
LPCWSTR lpTemplateName = NULL;
|
||||
DWORD dwFlags;
|
||||
|
||||
/* Initialise FileOpenDlgInfos structure*/
|
||||
|
@ -320,71 +392,70 @@ BOOL WINAPI GetFileDialog95W(LPOPENFILENAMEW ofn,UINT iDlgType)
|
|||
/* Pass in the original ofn */
|
||||
fodInfos->ofnInfos = (LPOPENFILENAMEA) ofn;
|
||||
|
||||
/* Save hInstance */
|
||||
hInstance = fodInfos->ofnInfos->hInstance;
|
||||
fodInfos->ofnInfos->hInstance = MapHModuleLS(ofn->hInstance);
|
||||
|
||||
/* Save lpstrFilter */
|
||||
/* convert lpstrFilter */
|
||||
if (ofn->lpstrFilter)
|
||||
{
|
||||
LPWSTR s;
|
||||
LPCWSTR s;
|
||||
LPSTR x, y;
|
||||
int n;
|
||||
|
||||
lpstrFilter = fodInfos->ofnInfos->lpstrFilter;
|
||||
lpstrFilter = ofn->lpstrFilter;
|
||||
|
||||
/* filter is a list... title\0ext\0......\0\0 */
|
||||
s = (LPWSTR)ofn->lpstrFilter;
|
||||
s = ofn->lpstrFilter;
|
||||
|
||||
while (*s)
|
||||
s = s+lstrlenW(s)+1;
|
||||
while (*s) s = s+lstrlenW(s)+1;
|
||||
s++;
|
||||
n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */
|
||||
x = y = (LPSTR)MemAlloc(n);
|
||||
s = (LPWSTR)ofn->lpstrFilter;
|
||||
while (*s) {
|
||||
while (*s)
|
||||
{
|
||||
lstrcpyWtoA(x,s);
|
||||
x+=strlen(x)+1;
|
||||
s+=lstrlenW(s)+1;
|
||||
}
|
||||
*x=0;
|
||||
fodInfos->ofnInfos->lpstrFilter = (LPSTR)y;
|
||||
(LPSTR)ofn->lpstrFilter = y;
|
||||
}
|
||||
/* Save lpstrCustomFilter */
|
||||
|
||||
/* convert lpstrCustomFilter */
|
||||
if (ofn->lpstrCustomFilter)
|
||||
{
|
||||
LPWSTR s;
|
||||
LPSTR x,y;
|
||||
int n;
|
||||
|
||||
lpstrCustomFilter = fodInfos->ofnInfos->lpstrCustomFilter;
|
||||
lpstrCustomFilter = ofn->lpstrCustomFilter;
|
||||
/* filter is a list... title\0ext\0......\0\0 */
|
||||
s = (LPWSTR)ofn->lpstrCustomFilter;
|
||||
while (*s)
|
||||
s = s+lstrlenW(s)+1;
|
||||
s = ofn->lpstrCustomFilter;
|
||||
while (*s) s = s+lstrlenW(s)+1;
|
||||
s++;
|
||||
n = s - ofn->lpstrCustomFilter;
|
||||
x = y = (LPSTR)MemAlloc(n);
|
||||
s = (LPWSTR)ofn->lpstrCustomFilter;
|
||||
while (*s) {
|
||||
s = ofn->lpstrCustomFilter;
|
||||
while (*s)
|
||||
{
|
||||
lstrcpyWtoA(x,s);
|
||||
x+=strlen(x)+1;
|
||||
s+=lstrlenW(s)+1;
|
||||
}
|
||||
*x=0;
|
||||
fodInfos->ofnInfos->lpstrCustomFilter = (LPSTR)y;
|
||||
(LPSTR)ofn->lpstrCustomFilter = y;
|
||||
}
|
||||
|
||||
/* Save Flags */
|
||||
dwFlags = fodInfos->ofnInfos->Flags;
|
||||
fodInfos->ofnInfos->Flags = ofn->Flags|OFN_WINE|OFN_UNICODE;
|
||||
/* convert string arguments, save others */
|
||||
AllocOutArgWtoA(ofn->lpstrFile, lpstrFile, ofn->nMaxFile);
|
||||
AllocOutArgWtoA(ofn->lpstrFileTitle, lpstrFileTitle, ofn->nMaxFileTitle);
|
||||
AllocInArgWtoA(ofn->lpstrInitialDir, lpstrInitialDir);
|
||||
AllocInArgWtoA(ofn->lpstrTitle, lpstrTitle);
|
||||
AllocInArgWtoA(ofn->lpstrDefExt, lpstrDefExt);
|
||||
AllocInArgWtoA(ofn->lpTemplateName, lpTemplateName);
|
||||
dwFlags = ofn->Flags;
|
||||
hInstance = ofn->hInstance;
|
||||
|
||||
/* Initialise the dialog property */
|
||||
fodInfos->DlgInfos.dwDlgProp = 0;
|
||||
|
||||
/* allocate ansi filename buffer */
|
||||
lpstrFile = ofn->lpstrFile;
|
||||
ofn->lpstrFile = MemAlloc(ofn->nMaxFile);
|
||||
ofn->Flags = ofn->Flags|OFN_WINE|OFN_UNICODE;
|
||||
ofn->hInstance = MapHModuleLS(ofn->hInstance);
|
||||
|
||||
switch(iDlgType)
|
||||
{
|
||||
|
@ -399,46 +470,36 @@ BOOL WINAPI GetFileDialog95W(LPOPENFILENAMEW ofn,UINT iDlgType)
|
|||
ret = 0;
|
||||
}
|
||||
|
||||
/* Cleaning */
|
||||
/* Restore Flags */
|
||||
fodInfos->ofnInfos->Flags = dwFlags;
|
||||
/* restore saved IN arguments and convert OUT arguments back */
|
||||
ofn->Flags = dwFlags;
|
||||
ofn->hInstance = hInstance;
|
||||
FreeInArg(ofn->lpstrFilter, lpstrFilter);
|
||||
FreeInArg(ofn->lpstrCustomFilter, lpstrCustomFilter);
|
||||
FreeOutArg(ofn->lpstrFile, lpstrFile, ofn->nMaxFile);
|
||||
FreeOutArg(ofn->lpstrFileTitle, lpstrFileTitle, ofn->nMaxFileTitle);
|
||||
FreeInArg(ofn->lpstrInitialDir, lpstrInitialDir);
|
||||
FreeInArg(ofn->lpstrTitle, lpstrTitle);
|
||||
FreeInArg(ofn->lpstrDefExt, lpstrDefExt);
|
||||
FreeInArg(ofn->lpTemplateName, lpTemplateName);
|
||||
|
||||
/* Restore lpstrFilter */
|
||||
if (fodInfos->ofnInfos->lpstrFilter)
|
||||
{
|
||||
MemFree((LPVOID)(fodInfos->ofnInfos->lpstrFilter));
|
||||
fodInfos->ofnInfos->lpstrFilter = lpstrFilter;
|
||||
}
|
||||
if (fodInfos->ofnInfos->lpstrCustomFilter)
|
||||
{
|
||||
MemFree((LPVOID)(fodInfos->ofnInfos->lpstrCustomFilter));
|
||||
fodInfos->ofnInfos->lpstrCustomFilter = lpstrCustomFilter;
|
||||
}
|
||||
|
||||
/* Restore hInstance */
|
||||
fodInfos->ofnInfos->hInstance = hInstance;
|
||||
MemFree((LPVOID)(fodInfos));
|
||||
|
||||
/* filename */
|
||||
lstrcpynAtoW(lpstrFile, (LPCSTR)ofn->lpstrFile, ofn->nMaxFile);
|
||||
MemFree(ofn->lpstrFile);
|
||||
ofn->lpstrFile = lpstrFile;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
|
||||
{
|
||||
|
||||
HWND hwndChild,hwndStc32;
|
||||
RECT rectParent, rectChild, rectCtrl, rectStc32, rectTemp;
|
||||
POINT ptMoveCtl;
|
||||
POINT ptParentClient;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
ptMoveCtl.x = ptMoveCtl.y = 0;
|
||||
hwndStc32=GetDlgItem(hwndChildDlg,stc32);
|
||||
GetClientRect(hwndParentDlg,&rectParent);
|
||||
GetClientRect(hwndChildDlg,&rectChild);
|
||||
|
||||
if(hwndStc32)
|
||||
{
|
||||
GetWindowRect(hwndStc32,&rectStc32);
|
||||
|
@ -458,6 +519,7 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
|
|||
ptMoveCtl.x = (rectStc32.right - rectTemp.right);
|
||||
ptParentClient.x = max((rectParent.right-rectParent.left),((rectChild.right-rectChild.left)+rectStc32.right-rectTemp.right));
|
||||
}
|
||||
|
||||
if(rectStc32.bottom < rectTemp.bottom)
|
||||
{
|
||||
ptParentClient.y = max((rectParent.bottom-rectParent.top),(rectChild.bottom-rectChild.top));
|
||||
|
@ -471,8 +533,8 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
|
|||
}
|
||||
else
|
||||
{
|
||||
if( (GetWindow(hwndChildDlg,GW_CHILD)) == (HWND) NULL)
|
||||
return;
|
||||
if( (GetWindow(hwndChildDlg,GW_CHILD)) == (HWND) NULL) return;
|
||||
|
||||
SetRectEmpty(&rectTemp);
|
||||
ptParentClient.x = max((rectParent.right-rectParent.left),(rectChild.right-rectChild.left));
|
||||
ptParentClient.y = (rectParent.bottom-rectParent.top) + (rectChild.bottom-rectChild.top);
|
||||
|
@ -482,8 +544,7 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
|
|||
SetRect(&rectParent,rectParent.left,rectParent.top,rectParent.left+ptParentClient.x,rectParent.top+ptParentClient.y);
|
||||
AdjustWindowRectEx( &rectParent,GetWindowLongA(hwndParentDlg,GWL_STYLE),FALSE,GetWindowLongA(hwndParentDlg,GWL_EXSTYLE));
|
||||
|
||||
SetWindowPos(hwndChildDlg, 0, 0,0, ptParentClient.x,ptParentClient.y,
|
||||
SWP_NOZORDER );
|
||||
SetWindowPos(hwndChildDlg, 0, 0,0, ptParentClient.x,ptParentClient.y, SWP_NOZORDER );
|
||||
SetWindowPos(hwndParentDlg, 0, rectParent.left,rectParent.top, (rectParent.right- rectParent.left),
|
||||
(rectParent.bottom-rectParent.top),SWP_NOMOVE | SWP_NOZORDER);
|
||||
|
||||
|
@ -517,16 +578,19 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
|
|||
rectCtrl.top += ptMoveCtl.y;
|
||||
}
|
||||
else if (rectCtrl.left >= rectTemp.right)
|
||||
{
|
||||
rectCtrl.left += ptMoveCtl.x;
|
||||
}
|
||||
else if (rectCtrl.top >= rectTemp.bottom)
|
||||
{
|
||||
rectCtrl.top += ptMoveCtl.y;
|
||||
}
|
||||
|
||||
SetWindowPos( hwndChild, 0, rectCtrl.left, rectCtrl.top,
|
||||
rectCtrl.right-rectCtrl.left,rectCtrl.bottom-rectCtrl.top,
|
||||
SWP_NOSIZE | SWP_NOZORDER );
|
||||
}
|
||||
}
|
||||
while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != (HWND)NULL);
|
||||
} while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != (HWND)NULL);
|
||||
}
|
||||
hwndChild = GetWindow(hwndParentDlg,GW_CHILD);
|
||||
|
||||
|
@ -542,7 +606,6 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
|
|||
{
|
||||
if(hwndChild != hwndChildDlg)
|
||||
{
|
||||
|
||||
if (GetWindowLongA( hwndChild, GWL_STYLE ) & WS_MAXIMIZE)
|
||||
continue;
|
||||
GetWindowRect(hwndChild,&rectCtrl);
|
||||
|
@ -555,17 +618,20 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
|
|||
rectCtrl.right-rectCtrl.left,rectCtrl.bottom-rectCtrl.top,
|
||||
SWP_NOSIZE |SWP_NOZORDER );
|
||||
}
|
||||
}
|
||||
while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != (HWND)NULL);
|
||||
} while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != (HWND)NULL);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
HRESULT WINAPI FileOpenDlgProcUserTemplate(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(GetParent(hwnd),FileOpenDlgInfosStr);
|
||||
|
||||
#if 0
|
||||
TRACE("0x%04x\n", uMsg);
|
||||
#endif
|
||||
|
||||
switch(uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
|
@ -573,13 +639,16 @@ HRESULT WINAPI FileOpenDlgProcUserTemplate(HWND hwnd, UINT uMsg, WPARAM wParam,
|
|||
fodInfos = (FileOpenDlgInfos *)lParam;
|
||||
lParam = (LPARAM) fodInfos->ofnInfos;
|
||||
ArrangeCtrlPositions(hwnd,GetParent(hwnd));
|
||||
if(fodInfos && (fodInfos->ofnInfos->Flags & OFN_ENABLEHOOK) && fodInfos->ofnInfos->lpfnHook)
|
||||
|
||||
if(fodInfos && IsHooked(fodInfos))
|
||||
return CallWindowProcA((WNDPROC)fodInfos->ofnInfos->lpfnHook,hwnd,uMsg,wParam,lParam);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if(fodInfos && (fodInfos->ofnInfos->Flags & OFN_ENABLEHOOK) && fodInfos->ofnInfos->lpfnHook )
|
||||
|
||||
if(fodInfos && IsHooked(fodInfos))
|
||||
return CallWindowProcA((WNDPROC)fodInfos->ofnInfos->lpfnHook,hwnd,uMsg,wParam,lParam);
|
||||
|
||||
return DefWindowProcA(hwnd,uMsg,wParam,lParam);
|
||||
}
|
||||
|
||||
|
@ -589,7 +658,11 @@ HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos,HWND hwnd)
|
|||
HRSRC hRes;
|
||||
HANDLE hDlgTmpl = 0;
|
||||
HWND hChildDlg = 0;
|
||||
if (fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATE || fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATEHANDLE)
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
if (fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATE ||
|
||||
fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATEHANDLE)
|
||||
{
|
||||
if (fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATEHANDLE)
|
||||
{
|
||||
|
@ -598,7 +671,6 @@ HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos,HWND hwnd)
|
|||
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
|
||||
return (HWND)NULL;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -609,8 +681,7 @@ HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos,HWND hwnd)
|
|||
return (HWND)NULL;
|
||||
}
|
||||
if (!(hDlgTmpl = LoadResource( MapHModuleSL(fodInfos->ofnInfos->hInstance),
|
||||
hRes )) ||
|
||||
!(template = LockResource( hDlgTmpl )))
|
||||
hRes )) || !(template = LockResource( hDlgTmpl )))
|
||||
{
|
||||
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
|
||||
return (HWND)NULL;
|
||||
|
@ -624,7 +695,7 @@ HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos,HWND hwnd)
|
|||
return hChildDlg;
|
||||
}
|
||||
}
|
||||
else if(fodInfos->ofnInfos->Flags & OFN_ENABLEHOOK && fodInfos->ofnInfos->lpfnHook)
|
||||
else if( IsHooked(fodInfos))
|
||||
{
|
||||
RECT rectHwnd;
|
||||
DLGTEMPLATE tmplate;
|
||||
|
@ -651,16 +722,26 @@ return (HWND)NULL;
|
|||
HRESULT SendCustomDlgNotificationMessage(HWND hwndParentDlg, UINT uCode)
|
||||
{
|
||||
FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(hwndParentDlg,FileOpenDlgInfosStr);
|
||||
if(!fodInfos)
|
||||
return 0;
|
||||
|
||||
TRACE("0x%04x 0x%04x\n",hwndParentDlg, uCode);
|
||||
|
||||
if(!fodInfos) return 0;
|
||||
|
||||
if(fodInfos->ofnInfos->Flags & OFN_UNICODE)
|
||||
FIXME("sending OPENFILENAMEA structure. Hook is expecting OPENFILENAMEW!");
|
||||
|
||||
if(fodInfos->DlgInfos.hwndCustomDlg)
|
||||
{
|
||||
OFNOTIFYA ofnNotify;
|
||||
HRESULT ret;
|
||||
ofnNotify.hdr.hwndFrom=hwndParentDlg;
|
||||
ofnNotify.hdr.idFrom=0;
|
||||
ofnNotify.hdr.code = uCode;
|
||||
ofnNotify.lpOFN = fodInfos->ofnInfos;
|
||||
return SendMessageA(fodInfos->DlgInfos.hwndCustomDlg,WM_NOTIFY,0,(LPARAM)&ofnNotify);
|
||||
TRACE("CALL NOTIFY for %x\n", uCode);
|
||||
ret = SendMessageA(fodInfos->DlgInfos.hwndCustomDlg,WM_NOTIFY,0,(LPARAM)&ofnNotify);
|
||||
TRACE("RET NOTIFY\n");
|
||||
return ret;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -733,18 +814,28 @@ HRESULT FILEDLG95_HandleCustomDialogMessages(HWND hwnd, UINT uMsg, WPARAM wParam
|
|||
*/
|
||||
HRESULT WINAPI FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
#if 0
|
||||
TRACE("0x%04x 0x%04x\n", hwnd, uMsg);
|
||||
#endif
|
||||
|
||||
switch(uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
FileOpenDlgInfos * fodInfos = (FileOpenDlgInfos *)lParam;
|
||||
|
||||
/* Adds the FileOpenDlgInfos in the property list of the dialog
|
||||
so it will be easily accessible through a GetPropA(...) */
|
||||
SetPropA(hwnd, FileOpenDlgInfosStr, (HANDLE) lParam);
|
||||
SetPropA(hwnd, FileOpenDlgInfosStr, (HANDLE) fodInfos);
|
||||
|
||||
FILEDLG95_OnWMInitDialog(hwnd, wParam, lParam);
|
||||
((FileOpenDlgInfos *)lParam)->DlgInfos.hwndCustomDlg =
|
||||
fodInfos->DlgInfos.hwndCustomDlg =
|
||||
CreateTemplateDialog((FileOpenDlgInfos *)lParam, hwnd);
|
||||
|
||||
FILEDLG95_InitControls(hwnd);
|
||||
SendCustomDlgNotificationMessage(hwnd,CDN_INITDONE);
|
||||
FILEDLG95_FillControls(hwnd, wParam, lParam);
|
||||
return 0;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
return FILEDLG95_OnWMCommand(hwnd, wParam, lParam);
|
||||
case WM_DRAWITEM:
|
||||
|
@ -812,13 +903,133 @@ HRESULT WINAPI FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|||
}
|
||||
|
||||
/***********************************************************************
|
||||
* FILEDLG95_OnWMInitDialog
|
||||
* FILEDLG95_InitControls
|
||||
*
|
||||
* WM_INITDIALOG message handler
|
||||
* WM_INITDIALOG message handler (before hook notification)
|
||||
*/
|
||||
static LRESULT FILEDLG95_OnWMInitDialog(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||
static LRESULT FILEDLG95_InitControls(HWND hwnd)
|
||||
{
|
||||
LPITEMIDLIST pidlItemId;
|
||||
TBBUTTON tbb[] =
|
||||
{
|
||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 },
|
||||
{VIEW_PARENTFOLDER, FCIDM_TB_UPFOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 },
|
||||
{VIEW_NEWFOLDER+1, FCIDM_TB_DESKTOP, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 },
|
||||
{VIEW_NEWFOLDER, FCIDM_TB_NEWFOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 },
|
||||
{VIEW_LIST, FCIDM_TB_SMALLICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
{VIEW_DETAILS, FCIDM_TB_REPORTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
};
|
||||
TBADDBITMAP tba[] =
|
||||
{
|
||||
{ HINST_COMMCTRL, IDB_VIEW_SMALL_COLOR },
|
||||
{ COMDLG32_hInstance, 800 } // desktop icon
|
||||
};
|
||||
|
||||
RECT rectTB;
|
||||
|
||||
FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(hwnd,FileOpenDlgInfosStr);
|
||||
|
||||
TRACE("%p\n", fodInfos);
|
||||
|
||||
/* Get the hwnd of the controls */
|
||||
fodInfos->DlgInfos.hwndFileName = GetDlgItem(hwnd,IDC_FILENAME);
|
||||
fodInfos->DlgInfos.hwndFileTypeCB = GetDlgItem(hwnd,IDC_FILETYPE);
|
||||
fodInfos->DlgInfos.hwndLookInCB = GetDlgItem(hwnd,IDC_LOOKIN);
|
||||
|
||||
/* construct the toolbar */
|
||||
GetWindowRect(GetDlgItem(hwnd,IDC_TOOLBARSTATIC),&rectTB);
|
||||
MapWindowPoints( 0, hwnd,(LPPOINT)&rectTB,2);
|
||||
|
||||
fodInfos->DlgInfos.hwndTB = CreateWindowExA(0, TOOLBARCLASSNAMEA, (LPSTR) NULL,
|
||||
WS_CHILD | WS_GROUP | TBSTYLE_TOOLTIPS | CCS_NODIVIDER | CCS_NORESIZE,
|
||||
0, 0, 150, 26, hwnd, (HMENU) IDC_TOOLBAR, COMMDLG_hInstance32, NULL);
|
||||
|
||||
SetWindowPos(fodInfos->DlgInfos.hwndTB, 0,
|
||||
rectTB.left,rectTB.top, rectTB.right-rectTB.left, rectTB.bottom-rectTB.top,
|
||||
SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOZORDER );
|
||||
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
|
||||
|
||||
/* fixme: use TB_LOADIMAGES when implemented */
|
||||
/* SendMessageA(fodInfos->DlgInfos.hwndTB, TB_LOADIMAGES, (WPARAM) IDB_VIEW_SMALL_COLOR, HINST_COMMCTRL);*/
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_ADDBITMAP, (WPARAM) 12, (LPARAM) &tba[0]);
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_ADDBITMAP, (WPARAM) 1, (LPARAM) &tba[1]);
|
||||
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_ADDBUTTONSA, (WPARAM) 9,(LPARAM) &tbb);
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_AUTOSIZE, 0, 0);
|
||||
|
||||
/* Set the window text with the text specified in the OPENFILENAME structure */
|
||||
if(fodInfos->ofnInfos->lpstrTitle)
|
||||
{
|
||||
SetWindowTextA(hwnd,fodInfos->ofnInfos->lpstrTitle);
|
||||
}
|
||||
else if (fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG)
|
||||
{
|
||||
SetWindowTextA(hwnd,"Save");
|
||||
}
|
||||
|
||||
/* Initialise the file name edit control */
|
||||
if(fodInfos->ofnInfos->lpstrFile)
|
||||
{
|
||||
LPSTR lpstrFile = COMDLG32_PathFindFileNameA(fodInfos->ofnInfos->lpstrFile);
|
||||
SetDlgItemTextA(hwnd, IDC_FILENAME, lpstrFile);
|
||||
}
|
||||
|
||||
/* Must the open as read only check box be checked ?*/
|
||||
if(fodInfos->ofnInfos->Flags & OFN_READONLY)
|
||||
{
|
||||
SendDlgItemMessageA(hwnd,IDC_OPENREADONLY,BM_SETCHECK,(WPARAM)TRUE,0);
|
||||
}
|
||||
|
||||
/* Must the open as read only check box be hid ?*/
|
||||
if(fodInfos->ofnInfos->Flags & OFN_HIDEREADONLY)
|
||||
{
|
||||
ShowWindow(GetDlgItem(hwnd,IDC_OPENREADONLY),SW_HIDE);
|
||||
}
|
||||
|
||||
/* Must the help button be hid ?*/
|
||||
if (!(fodInfos->ofnInfos->Flags & OFN_SHOWHELP))
|
||||
{
|
||||
ShowWindow(GetDlgItem(hwnd, pshHelp), SW_HIDE);
|
||||
}
|
||||
|
||||
/* Resize the height, if open as read only checkbox ad help button
|
||||
are hidden and we are not using a custom template */
|
||||
if ( (fodInfos->ofnInfos->Flags & OFN_HIDEREADONLY) &&
|
||||
(!(fodInfos->ofnInfos->Flags &
|
||||
(OFN_SHOWHELP|OFN_ENABLETEMPLATE|OFN_ENABLETEMPLATEHANDLE))))
|
||||
{
|
||||
RECT rectDlg, rectHelp, rectCancel;
|
||||
GetWindowRect(hwnd, &rectDlg);
|
||||
GetWindowRect(GetDlgItem(hwnd, pshHelp), &rectHelp);
|
||||
GetWindowRect(GetDlgItem(hwnd, IDCANCEL), &rectCancel);
|
||||
/* subtract the height of the help button plus the space between
|
||||
the help button and the cancel button to the height of the dialog */
|
||||
SetWindowPos(hwnd, 0, 0, 0, rectDlg.right-rectDlg.left,
|
||||
(rectDlg.bottom-rectDlg.top) - (rectHelp.bottom - rectCancel.bottom),
|
||||
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
|
||||
}
|
||||
|
||||
/* change Open to Save FIXME: use resources */
|
||||
if (fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG)
|
||||
{
|
||||
SetDlgItemTextA(hwnd,IDOK,"&Save");
|
||||
SetDlgItemTextA(hwnd,IDC_LOOKINSTATIC,"Save &in");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* FILEDLG95_FillControls
|
||||
*
|
||||
* WM_INITDIALOG message handler (after hook notification)
|
||||
*/
|
||||
static LRESULT FILEDLG95_FillControls(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LPITEMIDLIST pidlItemId = NULL;
|
||||
|
||||
FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) lParam;
|
||||
|
||||
TRACE("dir=%s file=%s\n",
|
||||
|
@ -832,15 +1043,11 @@ static LRESULT FILEDLG95_OnWMInitDialog(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
GetCurrentDirectoryA(MAX_PATH,path);
|
||||
pidlItemId = GetPidlFromName(fodInfos->Shell.FOIShellFolder, path);
|
||||
|
||||
}
|
||||
|
||||
/* Initialise shell objects */
|
||||
FILEDLG95_SHELL_Init(hwnd);
|
||||
|
||||
/* Initialise dialog UI */
|
||||
FILEDLG95_InitUI(hwnd);
|
||||
|
||||
/* Initialize the Look In combo box */
|
||||
FILEDLG95_LOOKIN_Init(fodInfos->DlgInfos.hwndLookInCB);
|
||||
|
||||
|
@ -947,124 +1154,6 @@ static LRESULT FILEDLG95_OnWMGetIShellBrowser(HWND hwnd)
|
|||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* FILEDLG95_InitUI
|
||||
*
|
||||
*/
|
||||
static LRESULT FILEDLG95_InitUI(HWND hwnd)
|
||||
{
|
||||
TBBUTTON tbb[] =
|
||||
{
|
||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 },
|
||||
{VIEW_PARENTFOLDER, FCIDM_TB_UPFOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 },
|
||||
{VIEW_NEWFOLDER+1, FCIDM_TB_DESKTOP, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 },
|
||||
{VIEW_NEWFOLDER, FCIDM_TB_NEWFOLDER, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0, 0}, 0, 0 },
|
||||
{VIEW_LIST, FCIDM_TB_SMALLICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
{VIEW_DETAILS, FCIDM_TB_REPORTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0, 0}, 0, 0 },
|
||||
};
|
||||
TBADDBITMAP tba[] =
|
||||
{
|
||||
{ HINST_COMMCTRL, IDB_VIEW_SMALL_COLOR },
|
||||
{ COMDLG32_hInstance, 800 } // desktop icon
|
||||
};
|
||||
|
||||
RECT rectTB;
|
||||
|
||||
FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(hwnd,FileOpenDlgInfosStr);
|
||||
|
||||
TRACE("%p\n", fodInfos);
|
||||
|
||||
/* Get the hwnd of the controls */
|
||||
fodInfos->DlgInfos.hwndFileName = GetDlgItem(hwnd,IDC_FILENAME);
|
||||
fodInfos->DlgInfos.hwndFileTypeCB = GetDlgItem(hwnd,IDC_FILETYPE);
|
||||
fodInfos->DlgInfos.hwndLookInCB = GetDlgItem(hwnd,IDC_LOOKIN);
|
||||
|
||||
/* construct the toolbar */
|
||||
GetWindowRect(GetDlgItem(hwnd,IDC_TOOLBARSTATIC),&rectTB);
|
||||
MapWindowPoints( 0, hwnd,(LPPOINT)&rectTB,2);
|
||||
|
||||
fodInfos->DlgInfos.hwndTB = CreateWindowExA(0, TOOLBARCLASSNAMEA, (LPSTR) NULL,
|
||||
WS_CHILD | WS_GROUP | TBSTYLE_TOOLTIPS | CCS_NODIVIDER | CCS_NORESIZE,
|
||||
0, 0, 150, 26,
|
||||
hwnd, (HMENU) IDC_TOOLBAR, COMMDLG_hInstance32, NULL);
|
||||
|
||||
SetWindowPos(fodInfos->DlgInfos.hwndTB, 0,
|
||||
rectTB.left,rectTB.top, rectTB.right-rectTB.left, rectTB.bottom-rectTB.top,
|
||||
SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOZORDER );
|
||||
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
|
||||
|
||||
/* fixme: use TB_LOADIMAGES when implemented */
|
||||
/* SendMessageA(fodInfos->DlgInfos.hwndTB, TB_LOADIMAGES, (WPARAM) IDB_VIEW_SMALL_COLOR, HINST_COMMCTRL);*/
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_ADDBITMAP, (WPARAM) 12, (LPARAM) &tba[0]);
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_ADDBITMAP, (WPARAM) 1, (LPARAM) &tba[1]);
|
||||
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_ADDBUTTONSA, (WPARAM) 9,(LPARAM) &tbb);
|
||||
SendMessageA(fodInfos->DlgInfos.hwndTB, TB_AUTOSIZE, 0, 0);
|
||||
|
||||
/* Set the window text with the text specified in the OPENFILENAME structure */
|
||||
if(fodInfos->ofnInfos->lpstrTitle)
|
||||
{
|
||||
SetWindowTextA(hwnd,fodInfos->ofnInfos->lpstrTitle);
|
||||
}
|
||||
else if (fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG)
|
||||
{
|
||||
SetWindowTextA(hwnd,"Save");
|
||||
}
|
||||
|
||||
/* Initialise the file name edit control */
|
||||
if(fodInfos->ofnInfos->lpstrFile)
|
||||
{
|
||||
LPSTR lpstrFile = COMDLG32_PathFindFileNameA(fodInfos->ofnInfos->lpstrFile);
|
||||
SetDlgItemTextA(hwnd, IDC_FILENAME, lpstrFile);
|
||||
}
|
||||
|
||||
/* Must the open as read only check box be checked ?*/
|
||||
if(fodInfos->ofnInfos->Flags & OFN_READONLY)
|
||||
{
|
||||
SendDlgItemMessageA(hwnd,IDC_OPENREADONLY,BM_SETCHECK,(WPARAM)TRUE,0);
|
||||
}
|
||||
|
||||
/* Must the open as read only check box be hid ?*/
|
||||
if(fodInfos->ofnInfos->Flags & OFN_HIDEREADONLY)
|
||||
{
|
||||
ShowWindow(GetDlgItem(hwnd,IDC_OPENREADONLY),SW_HIDE);
|
||||
}
|
||||
|
||||
/* Must the help button be hid ?*/
|
||||
if (!(fodInfos->ofnInfos->Flags & OFN_SHOWHELP))
|
||||
{
|
||||
ShowWindow(GetDlgItem(hwnd, pshHelp), SW_HIDE);
|
||||
}
|
||||
|
||||
/* Resize the height, if open as read only checkbox ad help button
|
||||
are hidden */
|
||||
if ( (fodInfos->ofnInfos->Flags & OFN_HIDEREADONLY) &&
|
||||
(!(fodInfos->ofnInfos->Flags & OFN_SHOWHELP)) )
|
||||
{
|
||||
RECT rectDlg, rectHelp, rectCancel;
|
||||
GetWindowRect(hwnd, &rectDlg);
|
||||
GetWindowRect(GetDlgItem(hwnd, pshHelp), &rectHelp);
|
||||
GetWindowRect(GetDlgItem(hwnd, IDCANCEL), &rectCancel);
|
||||
/* subtract the height of the help button plus the space between
|
||||
the help button and the cancel button to the height of the dialog */
|
||||
SetWindowPos(hwnd, 0, 0, 0, rectDlg.right-rectDlg.left,
|
||||
(rectDlg.bottom-rectDlg.top) - (rectHelp.bottom - rectCancel.bottom),
|
||||
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
|
||||
}
|
||||
|
||||
/* change Open to Save FIXME: use resources */
|
||||
if (fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG)
|
||||
{
|
||||
SetDlgItemTextA(hwnd,IDOK,"&Save");
|
||||
SetDlgItemTextA(hwnd,IDC_LOOKINSTATIC,"Save &in");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* FILEDLG95_OnOpenMultipleFiles
|
||||
*
|
||||
|
@ -1116,7 +1205,8 @@ BOOL FILEDLG95_OnOpenMultipleFiles(HWND hwnd, LPSTR lpstrFileList, UINT nFileCou
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
lpstrTemp += strlen(lpstrFileList) + 1;
|
||||
/* move to the next file in the list of files */
|
||||
lpstrTemp += strlen(lpstrTemp) + 1;
|
||||
COMDLG32_SHFree(pidl);
|
||||
}
|
||||
}
|
||||
|
@ -1268,11 +1358,16 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
|
|||
DWORD dwEaten, dwAttributes;
|
||||
|
||||
lpszTemp = COMDLG32_PathFindNextComponentA(lpszTemp);
|
||||
|
||||
if (!lpszTemp) break; /* end of path */
|
||||
|
||||
if(*lpszTemp)
|
||||
lstrcpynAtoW(lpwstrTemp, lpszTemp1, lpszTemp - lpszTemp1);
|
||||
else
|
||||
{
|
||||
lstrcpyAtoW(lpwstrTemp, lpszTemp1); /* last element */
|
||||
|
||||
/* if the last element is a wildcard do a search */
|
||||
if(strpbrk(lpszTemp1, "*?") != NULL)
|
||||
{
|
||||
nOpenAction = ONOPEN_SEARCH;
|
||||
|
@ -1286,31 +1381,9 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
|
|||
if(lstrlenW(lpwstrTemp)==2) COMDLG32_PathAddBackslashW(lpwstrTemp);
|
||||
|
||||
dwAttributes = SFGAO_FOLDER;
|
||||
if(FAILED(IShellFolder_ParseDisplayName(lpsf, hwnd, NULL, lpwstrTemp, &dwEaten, &pidl, &dwAttributes)))
|
||||
if(SUCCEEDED(IShellFolder_ParseDisplayName(lpsf, hwnd, NULL, lpwstrTemp, &dwEaten, &pidl, &dwAttributes)))
|
||||
{
|
||||
if(*lpszTemp) /* points to trailing null for last path element */
|
||||
{
|
||||
if(fodInfos->ofnInfos->Flags & OFN_PATHMUSTEXIST)
|
||||
{
|
||||
FILEDLG95_OnOpenMessage(hwnd, 0, IDS_PATHNOTEXISTING);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(fodInfos->ofnInfos->Flags & OFN_FILEMUSTEXIST)
|
||||
{
|
||||
FILEDLG95_OnOpenMessage(hwnd, 0, IDS_FILENOTEXISTING);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* change to the current folder */
|
||||
nOpenAction = ONOPEN_OPEN;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* the path component is valid */
|
||||
/* the path component is valid, we have a pidl of the next path component */
|
||||
TRACE("parse OK attr=0x%08lx pidl=%p\n", dwAttributes, pidl);
|
||||
if(dwAttributes & SFGAO_FOLDER)
|
||||
{
|
||||
|
@ -1334,13 +1407,32 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
|
|||
COMDLG32_SHFree(pidl);
|
||||
pidl = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(*lpszTemp) /* points to trailing null for last path element */
|
||||
{
|
||||
if(fodInfos->ofnInfos->Flags & OFN_PATHMUSTEXIST)
|
||||
{
|
||||
FILEDLG95_OnOpenMessage(hwnd, 0, IDS_PATHNOTEXISTING);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(fodInfos->ofnInfos->Flags & OFN_FILEMUSTEXIST)
|
||||
{
|
||||
FILEDLG95_OnOpenMessage(hwnd, 0, IDS_FILENOTEXISTING);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* change to the current folder */
|
||||
nOpenAction = ONOPEN_OPEN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(pidl) COMDLG32_SHFree(pidl);
|
||||
}
|
||||
|
||||
/* path is valid, clean the edit box */
|
||||
SetDlgItemTextA(hwnd,IDC_FILENAME,"");
|
||||
|
||||
/*
|
||||
Step 3: here we have a cleaned up and validated path
|
||||
|
||||
|
@ -1428,6 +1520,23 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
|
|||
strncpy(fodInfos->ofnInfos->lpstrFileTitle, lpstrFileTitle, fodInfos->ofnInfos->nMaxFileTitle);
|
||||
}
|
||||
|
||||
/* ask the hook if we can close */
|
||||
if(IsHooked(fodInfos))
|
||||
{
|
||||
/* FIXME we are sending ASCII-structures. Does not work with NT */
|
||||
/* first old style */
|
||||
TRACE("---\n");
|
||||
CallWindowProcA((WNDPROC)fodInfos->ofnInfos->lpfnHook, hwnd,
|
||||
fodInfos->HookMsg.fileokstring, 0, (LPARAM)fodInfos->ofnInfos);
|
||||
if (GetWindowLongA(hwnd, DWL_MSGRESULT))
|
||||
{
|
||||
TRACE("cancled\n");
|
||||
ret = FALSE;
|
||||
goto ret;
|
||||
}
|
||||
}
|
||||
|
||||
TRACE("close\n");
|
||||
FILEDLG95_Clean(hwnd);
|
||||
ret = EndDialog(hwnd, TRUE);
|
||||
}
|
||||
|
@ -1984,7 +2093,7 @@ static int FILEDLG95_LOOKIN_AddItem(HWND hwnd,LPITEMIDLIST pidl, int iInsertId)
|
|||
SFOLDER *tmpFolder;
|
||||
LookInInfos *liInfos;
|
||||
|
||||
TRACE("\n");
|
||||
TRACE("%08x\n", iInsertId);
|
||||
|
||||
if(!pidl)
|
||||
return -1;
|
||||
|
@ -2015,11 +2124,14 @@ static int FILEDLG95_LOOKIN_AddItem(HWND hwnd,LPITEMIDLIST pidl, int iInsertId)
|
|||
SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX
|
||||
| SHGFI_PIDL | SHGFI_SMALLICON | SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED);
|
||||
|
||||
TRACE("-- Add %s attr=%08lx\n", sfi.szDisplayName, sfi.dwAttributes);
|
||||
|
||||
if((sfi.dwAttributes & SFGAO_FILESYSANCESTOR) || (sfi.dwAttributes & SFGAO_FILESYSTEM))
|
||||
{
|
||||
int iItemID;
|
||||
|
||||
TRACE("-- Add %s at %u\n", sfi.szDisplayName, tmpFolder->m_iIndent);
|
||||
|
||||
/* Add the item at the end of the list */
|
||||
if(iInsertId < 0)
|
||||
{
|
||||
|
@ -2151,7 +2263,7 @@ static int FILEDLG95_LOOKIN_SearchItem(HWND hwnd,WPARAM searchArg,int iSearchMet
|
|||
int i = 0;
|
||||
int iCount = CBGetCount(hwnd);
|
||||
|
||||
TRACE("\n");
|
||||
TRACE("0x%08x 0x%x\n",searchArg, iSearchMethod);
|
||||
|
||||
if (iCount != CB_ERR)
|
||||
{
|
||||
|
|
|
@ -17,50 +17,29 @@
|
|||
#include "debugtools.h"
|
||||
#include "cdlg.h"
|
||||
|
||||
#define INITGUID
|
||||
#include "initguid.h"
|
||||
#include "wine/obj_serviceprovider.h"
|
||||
|
||||
DEFAULT_DEBUG_CHANNEL(commdlg);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
||||
ICOM_VTABLE(IShellBrowser) * lpVtbl;
|
||||
ICOM_VTABLE(ICommDlgBrowser) * lpVtblCommDlgBrowser;
|
||||
ICOM_VTABLE(IServiceProvider)* lpVtblServiceProvider;
|
||||
DWORD ref; /* Reference counter */
|
||||
HWND hwndOwner; /* Owner dialog of the interface */
|
||||
|
||||
} IShellBrowserImpl;
|
||||
|
||||
/**************************************************************************
|
||||
* Structure
|
||||
* vtable
|
||||
*/
|
||||
static ICOM_VTABLE(IShellBrowser) IShellBrowserImpl_Vtbl =
|
||||
{
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
/* IUnknown */
|
||||
IShellBrowserImpl_QueryInterface,
|
||||
IShellBrowserImpl_AddRef,
|
||||
IShellBrowserImpl_Release,
|
||||
/* IOleWindow */
|
||||
IShellBrowserImpl_GetWindow,
|
||||
IShellBrowserImpl_ContextSensitiveHelp,
|
||||
/* IShellBrowser */
|
||||
IShellBrowserImpl_InsertMenusSB,
|
||||
IShellBrowserImpl_SetMenuSB,
|
||||
IShellBrowserImpl_RemoveMenusSB,
|
||||
IShellBrowserImpl_SetStatusTextSB,
|
||||
IShellBrowserImpl_EnableModelessSB,
|
||||
IShellBrowserImpl_TranslateAcceleratorSB,
|
||||
IShellBrowserImpl_BrowseObject,
|
||||
IShellBrowserImpl_GetViewStateStream,
|
||||
IShellBrowserImpl_GetControlWindow,
|
||||
IShellBrowserImpl_SendControlMsg,
|
||||
IShellBrowserImpl_QueryActiveShellView,
|
||||
IShellBrowserImpl_OnViewWindowActive,
|
||||
IShellBrowserImpl_SetToolbarItems
|
||||
};
|
||||
|
||||
static ICOM_VTABLE(ICommDlgBrowser) IShellBrowserImpl_ICommDlgBrowser_Vtbl =
|
||||
{
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
/* IUnknown */
|
||||
IShellBrowserImpl_ICommDlgBrowser_QueryInterface,
|
||||
IShellBrowserImpl_ICommDlgBrowser_AddRef,
|
||||
IShellBrowserImpl_ICommDlgBrowser_Release,
|
||||
/* ICommDlgBrowser */
|
||||
IShellBrowserImpl_ICommDlgBrowser_OnDefaultCommand,
|
||||
IShellBrowserImpl_ICommDlgBrowser_OnStateChange,
|
||||
IShellBrowserImpl_ICommDlgBrowser_IncludeObject
|
||||
};
|
||||
|
||||
static ICOM_VTABLE(IShellBrowser) IShellBrowserImpl_Vtbl;
|
||||
static ICOM_VTABLE(ICommDlgBrowser) IShellBrowserImpl_ICommDlgBrowser_Vtbl;
|
||||
static ICOM_VTABLE(IServiceProvider) IShellBrowserImpl_IServiceProvider_Vtbl;
|
||||
|
||||
/**************************************************************************
|
||||
* Local Prototypes
|
||||
|
@ -91,6 +70,47 @@ extern BOOL FILEDLG95_OnOpen(HWND hwnd);
|
|||
extern HRESULT SendCustomDlgNotificationMessage(HWND hwndParentDlg, UINT uCode);
|
||||
|
||||
|
||||
/*
|
||||
* Helper functions
|
||||
*/
|
||||
|
||||
/* copied from shell32 to avoid linking to it */
|
||||
static HRESULT COMDLG32_StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
|
||||
{
|
||||
TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
|
||||
|
||||
switch (src->uType)
|
||||
{
|
||||
case STRRET_WSTR:
|
||||
lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
|
||||
COMDLG32_SHFree(src->u.pOleStr);
|
||||
break;
|
||||
|
||||
case STRRET_CSTRA:
|
||||
lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
|
||||
break;
|
||||
|
||||
case STRRET_OFFSETA:
|
||||
if (pidl)
|
||||
{
|
||||
lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
FIXME("unknown type!\n");
|
||||
if (len)
|
||||
{ *(LPSTR)dest = '\0';
|
||||
}
|
||||
return(FALSE);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* IShellBrowser
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* IShellBrowserImpl_Construct
|
||||
*/
|
||||
|
@ -107,8 +127,8 @@ IShellBrowser * IShellBrowserImpl_Construct(HWND hwndOwner)
|
|||
|
||||
/* Initialisation of the vTables */
|
||||
sb->lpVtbl = &IShellBrowserImpl_Vtbl;
|
||||
sb->lpVtbl2 = &IShellBrowserImpl_ICommDlgBrowser_Vtbl;
|
||||
|
||||
sb->lpVtblCommDlgBrowser = &IShellBrowserImpl_ICommDlgBrowser_Vtbl;
|
||||
sb->lpVtblServiceProvider = &IShellBrowserImpl_IServiceProvider_Vtbl;
|
||||
COMDLG32_SHGetSpecialFolderLocation(hwndOwner, CSIDL_DESKTOP,
|
||||
&fodInfos->ShellInfos.pidlAbsCurrent);
|
||||
|
||||
|
@ -117,17 +137,6 @@ IShellBrowser * IShellBrowserImpl_Construct(HWND hwndOwner)
|
|||
return (IShellBrowser *) sb;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
*
|
||||
* The INTERFACE of the IShellBrowser object
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* IUnknown
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* IShellBrowserImpl_QueryInterface
|
||||
*/
|
||||
|
@ -137,7 +146,7 @@ HRESULT WINAPI IShellBrowserImpl_QueryInterface(IShellBrowser *iface,
|
|||
{
|
||||
ICOM_THIS(IShellBrowserImpl, iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
TRACE("(%p)\n\t%s\n", This, debugstr_guid(riid));
|
||||
|
||||
*ppvObj = NULL;
|
||||
|
||||
|
@ -153,13 +162,18 @@ HRESULT WINAPI IShellBrowserImpl_QueryInterface(IShellBrowser *iface,
|
|||
}
|
||||
|
||||
else if(IsEqualIID(riid, &IID_ICommDlgBrowser)) /*ICommDlgBrowser*/
|
||||
{ *ppvObj = (ICommDlgBrowser*) &(This->lpVtbl2);
|
||||
{ *ppvObj = (ICommDlgBrowser*) &(This->lpVtblCommDlgBrowser);
|
||||
}
|
||||
|
||||
else if(IsEqualIID(riid, &IID_IServiceProvider)) /* IServiceProvider */
|
||||
{ *ppvObj = (ICommDlgBrowser*) &(This->lpVtblServiceProvider);
|
||||
}
|
||||
|
||||
if(*ppvObj)
|
||||
{ IUnknown_AddRef( (IShellBrowser*) *ppvObj);
|
||||
return S_OK;
|
||||
}
|
||||
FIXME("Unknown interface requested\n");
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
@ -296,7 +310,11 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
|||
psfTmp = GetShellFolderFromPidl(pidlTmp);
|
||||
}
|
||||
|
||||
if(!psfTmp) return E_FAIL;
|
||||
if(!psfTmp)
|
||||
{
|
||||
ERR("could not browse to folder\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
/* If the pidl to browse to is equal to the actual pidl ...
|
||||
do nothing and pretend you did it*/
|
||||
|
@ -304,6 +322,7 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
|||
{
|
||||
IShellFolder_Release(psfTmp);
|
||||
COMDLG32_SHFree(pidlTmp);
|
||||
TRACE("keep current folder\n");
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
|
@ -315,8 +334,9 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
|||
}
|
||||
|
||||
/* Create the associated view */
|
||||
TRACE("create view object\n");
|
||||
if(FAILED(hRes = IShellFolder_CreateViewObject(psfTmp, fodInfos->ShellInfos.hwndOwner,
|
||||
&IID_IShellView, (LPVOID *)&psvTmp))) return hRes;
|
||||
&IID_IShellView, (LPVOID *)&psvTmp))) goto error;
|
||||
|
||||
/* Check if listview has focus */
|
||||
bViewHasFocus = IsChild(fodInfos->ShellInfos.hwndView,GetFocus());
|
||||
|
@ -348,7 +368,7 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
|||
TRACE("create view window\n");
|
||||
if(FAILED(hRes = IShellView_CreateViewWindow(psvTmp, NULL,
|
||||
&fodInfos->ShellInfos.folderSettings, fodInfos->Shell.FOIShellBrowser,
|
||||
&fodInfos->ShellInfos.rectView, &hwndView))) return hRes;
|
||||
&fodInfos->ShellInfos.rectView, &hwndView))) goto error;
|
||||
|
||||
fodInfos->ShellInfos.hwndView = hwndView;
|
||||
|
||||
|
@ -364,6 +384,9 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
|||
SetFocus(fodInfos->ShellInfos.hwndView);
|
||||
|
||||
return hRes;
|
||||
error:
|
||||
ERR("Failed with error 0x%08lx\n", hRes);
|
||||
return hRes;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
@ -406,7 +429,7 @@ HRESULT WINAPI IShellBrowserImpl_GetViewStateStream(IShellBrowser *iface,
|
|||
{
|
||||
ICOM_THIS(IShellBrowserImpl, iface);
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
FIXME("(%p 0x%08lx %p)\n", This, grfMode, ppStrm);
|
||||
|
||||
/* Feature not implemented */
|
||||
return E_NOTIMPL;
|
||||
|
@ -566,6 +589,34 @@ HRESULT WINAPI IShellBrowserImpl_TranslateAcceleratorSB(IShellBrowser *iface,
|
|||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static ICOM_VTABLE(IShellBrowser) IShellBrowserImpl_Vtbl =
|
||||
{
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
/* IUnknown */
|
||||
IShellBrowserImpl_QueryInterface,
|
||||
IShellBrowserImpl_AddRef,
|
||||
IShellBrowserImpl_Release,
|
||||
/* IOleWindow */
|
||||
IShellBrowserImpl_GetWindow,
|
||||
IShellBrowserImpl_ContextSensitiveHelp,
|
||||
/* IShellBrowser */
|
||||
IShellBrowserImpl_InsertMenusSB,
|
||||
IShellBrowserImpl_SetMenuSB,
|
||||
IShellBrowserImpl_RemoveMenusSB,
|
||||
IShellBrowserImpl_SetStatusTextSB,
|
||||
IShellBrowserImpl_EnableModelessSB,
|
||||
IShellBrowserImpl_TranslateAcceleratorSB,
|
||||
IShellBrowserImpl_BrowseObject,
|
||||
IShellBrowserImpl_GetViewStateStream,
|
||||
IShellBrowserImpl_GetControlWindow,
|
||||
IShellBrowserImpl_SendControlMsg,
|
||||
IShellBrowserImpl_QueryActiveShellView,
|
||||
IShellBrowserImpl_OnViewWindowActive,
|
||||
IShellBrowserImpl_SetToolbarItems
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* ICommDlgBrowser
|
||||
*/
|
||||
|
@ -573,7 +624,8 @@ HRESULT WINAPI IShellBrowserImpl_TranslateAcceleratorSB(IShellBrowser *iface,
|
|||
/***************************************************************************
|
||||
* IShellBrowserImpl_ICommDlgBrowser_QueryInterface
|
||||
*/
|
||||
HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_QueryInterface(ICommDlgBrowser *iface,
|
||||
HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_QueryInterface(
|
||||
ICommDlgBrowser *iface,
|
||||
REFIID riid,
|
||||
LPVOID *ppvObj)
|
||||
{
|
||||
|
@ -689,38 +741,6 @@ HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_OnStateChange(ICommDlgBrowser *
|
|||
return NOERROR;
|
||||
}
|
||||
|
||||
/* copied from shell32 to avoid linking to it */
|
||||
static HRESULT COMDLG32_StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
|
||||
{
|
||||
TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
|
||||
|
||||
switch (src->uType)
|
||||
{
|
||||
case STRRET_WSTR:
|
||||
lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
|
||||
COMDLG32_SHFree(src->u.pOleStr);
|
||||
break;
|
||||
|
||||
case STRRET_CSTRA:
|
||||
lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
|
||||
break;
|
||||
|
||||
case STRRET_OFFSETA:
|
||||
if (pidl)
|
||||
{
|
||||
lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
FIXME("unknown type!\n");
|
||||
if (len)
|
||||
{ *(LPSTR)dest = '\0';
|
||||
}
|
||||
return(FALSE);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
/**************************************************************************
|
||||
* IShellBrowserImpl_ICommDlgBrowser_IncludeObject
|
||||
*/
|
||||
|
@ -793,3 +813,104 @@ HRESULT IShellBrowserImpl_ICommDlgBrowser_OnSelChange(ICommDlgBrowser *iface, IS
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static ICOM_VTABLE(ICommDlgBrowser) IShellBrowserImpl_ICommDlgBrowser_Vtbl =
|
||||
{
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
/* IUnknown */
|
||||
IShellBrowserImpl_ICommDlgBrowser_QueryInterface,
|
||||
IShellBrowserImpl_ICommDlgBrowser_AddRef,
|
||||
IShellBrowserImpl_ICommDlgBrowser_Release,
|
||||
/* ICommDlgBrowser */
|
||||
IShellBrowserImpl_ICommDlgBrowser_OnDefaultCommand,
|
||||
IShellBrowserImpl_ICommDlgBrowser_OnStateChange,
|
||||
IShellBrowserImpl_ICommDlgBrowser_IncludeObject
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* IServiceProvider
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* IShellBrowserImpl_IServiceProvider_QueryInterface
|
||||
*/
|
||||
HRESULT WINAPI IShellBrowserImpl_IServiceProvider_QueryInterface(
|
||||
IServiceProvider *iface,
|
||||
REFIID riid,
|
||||
LPVOID *ppvObj)
|
||||
{
|
||||
_ICOM_THIS_FromIServiceProvider(IShellBrowser,iface);
|
||||
|
||||
FIXME("(%p)\n", This);
|
||||
|
||||
return IShellBrowserImpl_QueryInterface(This,riid,ppvObj);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* IShellBrowserImpl_IServiceProvider_AddRef
|
||||
*/
|
||||
ULONG WINAPI IShellBrowserImpl_IServiceProvider_AddRef(IServiceProvider * iface)
|
||||
{
|
||||
_ICOM_THIS_FromIServiceProvider(IShellBrowser,iface);
|
||||
|
||||
FIXME("(%p)\n", This);
|
||||
|
||||
return IShellBrowserImpl_AddRef(This);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* IShellBrowserImpl_IServiceProvider_Release
|
||||
*/
|
||||
ULONG WINAPI IShellBrowserImpl_IServiceProvider_Release(IServiceProvider * iface)
|
||||
{
|
||||
_ICOM_THIS_FromIServiceProvider(IShellBrowser,iface);
|
||||
|
||||
FIXME("(%p)\n", This);
|
||||
|
||||
return IShellBrowserImpl_Release(This);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* IShellBrowserImpl_IServiceProvider_Release
|
||||
*
|
||||
* NOTES
|
||||
* the w2k shellview asks for
|
||||
* guidService = SID_STopLevelBrowser
|
||||
* riid = IShellBrowser
|
||||
*
|
||||
* FIXME
|
||||
* this is a hack!
|
||||
*/
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_IServiceProvider_QueryService(
|
||||
IServiceProvider * iface,
|
||||
REFGUID guidService,
|
||||
REFIID riid,
|
||||
void** ppv)
|
||||
{
|
||||
_ICOM_THIS_FromIServiceProvider(IShellBrowser,iface);
|
||||
|
||||
FIXME("(%p)\n\t%s\n\t%s\n", This,debugstr_guid(guidService), debugstr_guid(riid) );
|
||||
|
||||
*ppv = NULL;
|
||||
if(guidService && IsEqualIID(guidService, &SID_STopLevelBrowser))
|
||||
{
|
||||
return IShellBrowserImpl_QueryInterface(This,riid,ppv);
|
||||
}
|
||||
FIXME("(%p) unknown interface requested\n", This);
|
||||
return E_NOINTERFACE;
|
||||
|
||||
}
|
||||
|
||||
static ICOM_VTABLE(IServiceProvider) IShellBrowserImpl_IServiceProvider_Vtbl =
|
||||
{
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
/* IUnknown */
|
||||
IShellBrowserImpl_IServiceProvider_QueryInterface,
|
||||
IShellBrowserImpl_IServiceProvider_AddRef,
|
||||
IShellBrowserImpl_IServiceProvider_Release,
|
||||
/* IServiceProvider */
|
||||
IShellBrowserImpl_IServiceProvider_QueryService
|
||||
};
|
||||
|
|
|
@ -15,7 +15,11 @@
|
|||
/***********************************************************************
|
||||
* Defines and global variables
|
||||
*/
|
||||
#define _ICOM_THIS_FromICommDlgBrowser(Class,name) Class* This = (Class*) (((char*)name)-sizeof(void *))
|
||||
#define _ICommDlgBrowser_Offset ((int)(&(((IShellBrowserImpl*)0)->lpVtblCommDlgBrowser)))
|
||||
#define _ICOM_THIS_FromICommDlgBrowser(class, name) class* This = (class*)(((char*)name)-_ICommDlgBrowser_Offset);
|
||||
|
||||
#define _IServiceProvider_Offset ((int)(&(((IShellBrowserImpl*)0)->lpVtblServiceProvider)))
|
||||
#define _ICOM_THIS_FromIServiceProvider(class, name) class* This = (class*)(((char*)name)-_IServiceProvider_Offset);
|
||||
|
||||
/* dialog internal property */
|
||||
|
||||
|
@ -28,16 +32,6 @@
|
|||
*/
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
||||
ICOM_VTABLE(IShellBrowser)* lpVtbl; /* IShellBrowser VTable */
|
||||
ICOM_VTABLE(ICommDlgBrowser)* lpVtbl2; /* ICommDlgBrowser VTable */
|
||||
DWORD ref; /* Reference counter */
|
||||
HWND hwndOwner; /* Owner dialog of the interface */
|
||||
|
||||
} IShellBrowserImpl;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
||||
|
@ -67,6 +61,13 @@ typedef struct
|
|||
DWORD dwDlgProp;
|
||||
} DlgInfos;
|
||||
|
||||
struct {
|
||||
UINT fileokstring;
|
||||
UINT lbselchstring;
|
||||
UINT helpmsgstring;
|
||||
UINT sharevistring;
|
||||
} HookMsg;
|
||||
|
||||
} FileOpenDlgInfos;
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -124,100 +125,6 @@ typedef struct
|
|||
/* Constructor */
|
||||
IShellBrowser * IShellBrowserImpl_Construct(HWND hwndOwner);
|
||||
|
||||
/* IUnknown */
|
||||
HRESULT WINAPI IShellBrowserImpl_QueryInterface(IShellBrowser *iface,
|
||||
REFIID riid,
|
||||
LPVOID *ppvObj);
|
||||
|
||||
ULONG WINAPI IShellBrowserImpl_AddRef(IShellBrowser * iface);
|
||||
|
||||
ULONG WINAPI IShellBrowserImpl_Release(IShellBrowser * iface);
|
||||
|
||||
/* IOleWindow */
|
||||
HRESULT WINAPI IShellBrowserImpl_GetWindow(IShellBrowser * iface,
|
||||
HWND * phwnd);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_ContextSensitiveHelp(IShellBrowser * iface,
|
||||
BOOL fEnterMode);
|
||||
|
||||
/* IShellBrowser */
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
||||
LPCITEMIDLIST pidl,
|
||||
UINT wFlags);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_EnableModelessSB(IShellBrowser *iface,
|
||||
BOOL fEnable);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_GetControlWindow(IShellBrowser *iface,
|
||||
UINT id,
|
||||
HWND *lphwnd);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_GetViewStateStream(IShellBrowser *iface,
|
||||
DWORD grfMode,
|
||||
LPSTREAM *ppStrm);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_InsertMenusSB(IShellBrowser *iface,
|
||||
HMENU hmenuShared,
|
||||
LPOLEMENUGROUPWIDTHS lpMenuWidths);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_OnViewWindowActive(IShellBrowser *iface,
|
||||
IShellView *ppshv);
|
||||
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_QueryActiveShellView(IShellBrowser *iface,
|
||||
IShellView **ppshv);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_RemoveMenusSB(IShellBrowser *iface,
|
||||
HMENU hmenuShared);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_SendControlMsg(IShellBrowser *iface,
|
||||
UINT id,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam,
|
||||
LRESULT *pret);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_SetMenuSB(IShellBrowser *iface,
|
||||
HMENU hmenuShared,
|
||||
HOLEMENU holemenuReserved,
|
||||
HWND hwndActiveObject);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_SetStatusTextSB(IShellBrowser *iface,
|
||||
LPCOLESTR lpszStatusText);
|
||||
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_SetToolbarItems(IShellBrowser *iface,
|
||||
LPTBBUTTON lpButtons,
|
||||
UINT nButtons,
|
||||
UINT uFlags);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_TranslateAcceleratorSB(IShellBrowser *iface,
|
||||
LPMSG lpmsg,
|
||||
WORD wID);
|
||||
|
||||
|
||||
/* ICommDlgBrowser */
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_QueryInterface(ICommDlgBrowser *iface,
|
||||
REFIID riid,
|
||||
LPVOID *ppvObj);
|
||||
|
||||
ULONG WINAPI IShellBrowserImpl_ICommDlgBrowser_AddRef(ICommDlgBrowser * iface);
|
||||
|
||||
ULONG WINAPI IShellBrowserImpl_ICommDlgBrowser_Release(ICommDlgBrowser * iface);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_OnDefaultCommand(ICommDlgBrowser *iface,
|
||||
IShellView *ppshv);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_OnStateChange(ICommDlgBrowser *iface,
|
||||
IShellView *ppshv,
|
||||
ULONG uChange);
|
||||
|
||||
HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_IncludeObject(ICommDlgBrowser *iface,
|
||||
IShellView * ppshv,
|
||||
LPCITEMIDLIST pidl);
|
||||
|
||||
|
||||
LPITEMIDLIST GetPidlFromDataObject ( IDataObject *doSelected, UINT nPidlIndex);
|
||||
UINT GetNumSelected(IDataObject *doSelected);
|
||||
|
|
|
@ -36,6 +36,8 @@ extern "C" {
|
|||
#define OFN_LONGNAMES 0x00200000
|
||||
#define OFN_ENABLEINCLUDENOTIFY 0x00400000
|
||||
#define OFN_ENABLESIZING 0x00800000
|
||||
#define OFN_DONTADDTORECENT 0x02000000
|
||||
#define OFN_FORCESHOWHIDDEN 0x10000000
|
||||
|
||||
/* WINE internal flags */
|
||||
#define OFN_UNICODE 0x40000000 /*to differ between 32W/A hook*/
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Defines the COM interfaces and APIs related to IServiceProvider
|
||||
*
|
||||
* Depends on 'obj_base.h'.
|
||||
*/
|
||||
|
||||
#ifndef __WINE_WINE_OBJ_SERVICEPROVIDER_H
|
||||
#define __WINE_WINE_OBJ_SERVICEPROVIDER_H
|
||||
|
||||
#include "wine/obj_base.h"
|
||||
#include "winbase.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* defined(__cplusplus) */
|
||||
|
||||
/*****************************************************************************
|
||||
* Predeclare the interfaces
|
||||
*/
|
||||
DEFINE_GUID(IID_IServiceProvider, 0x6d5140c1, 0x7436, 0x11ce, 0x80, 0x34, 0x00, 0xaa, 0x00, 0x60, 0x09, 0xfa);
|
||||
typedef struct IServiceProvider IServiceProvider, *LPSERVICEPROVIDER;
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* IServiceProvider interface
|
||||
*/
|
||||
#define ICOM_INTERFACE IServiceProvider
|
||||
#define IServiceProvider_METHODS \
|
||||
ICOM_METHOD3( HRESULT, QueryService, REFGUID, guidService, REFIID, riid, void**, ppv)
|
||||
#define IServiceProvider_IMETHODS \
|
||||
IUnknown_IMETHODS \
|
||||
IServiceProvider_METHODS
|
||||
ICOM_DEFINE(IServiceProvider,IUnknown)
|
||||
#undef ICOM_INTERFACE
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
#define IServiceProvider_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
|
||||
#define IServiceProvider_AddRef(p) ICOM_CALL (AddRef,p)
|
||||
#define IServiceProvider_Release(p) ICOM_CALL (Release,p)
|
||||
/*** IServiceProvider methods ***/
|
||||
#define IServiceProvider_QueryService(p,a,b,c) ICOM_CALL3(QueryService,p,a,b,c)
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* defined(__cplusplus) */
|
||||
|
||||
#endif /* __WINE_WINE_OBJ_SERVICEPROVIDER_H */
|
|
@ -15,6 +15,8 @@ extern "C" {
|
|||
|
||||
#define SID_SShellBrowser IID_IShellBrowser
|
||||
|
||||
DEFINE_GUID(SID_STopLevelBrowser, 0x4C96BE40L, 0x915C, 0x11CF, 0x99, 0xD3, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37);
|
||||
|
||||
/* targets for GetWindow/SendControlMsg */
|
||||
#define FCW_STATUS 0x0001
|
||||
#define FCW_TOOLBAR 0x0002
|
||||
|
|
Loading…
Reference in New Issue