Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
dd16b91a
Commit
dd16b91a
authored
Apr 30, 2009
by
Rein Klazes
Committed by
Alexandre Julliard
May 01, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
comdlg32: Implement OFN_ENABLESIZING flag for GetOpenFileName and friends.
parent
ebeabf11
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
162 additions
and
2 deletions
+162
-2
filedlg.c
dlls/comdlg32/filedlg.c
+159
-2
filedlgbrowser.h
dlls/comdlg32/filedlgbrowser.h
+3
-0
No files found.
dlls/comdlg32/filedlg.c
View file @
dd16b91a
...
...
@@ -37,7 +37,6 @@
* FIXME: add to recent docs
*
* FIXME: flags not implemented: OFN_DONTADDTORECENT,
* OFN_ENABLESIZING,
* OFN_NODEREFERENCELINKS, OFN_NOREADONLYRETURN,
* OFN_NOTESTFILECREATE, OFN_USEMONIKERS
*
...
...
@@ -82,7 +81,7 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
commdlg
);
#define UNIMPLEMENTED_FLAGS \
(OFN_DONTADDTORECENT |
OFN_ENABLESIZING |
\
(OFN_DONTADDTORECENT |\
OFN_NODEREFERENCELINKS | OFN_NOREADONLYRETURN |\
OFN_NOTESTFILECREATE
/*| OFN_USEMONIKERS*/
)
...
...
@@ -271,6 +270,13 @@ static BOOL GetFileName95(FileOpenDlgInfos *fodInfos)
return
FALSE
;
}
if
(
fodInfos
->
ofnInfos
->
Flags
&
OFN_ENABLESIZING
)
{
((
LPDLGTEMPLATEW
)
template
)
->
style
|=
WS_SIZEBOX
;
fodInfos
->
sizedlg
.
cx
=
fodInfos
->
sizedlg
.
cy
=
0
;
fodInfos
->
initial_size
.
x
=
fodInfos
->
initial_size
.
y
=
0
;
}
/* old style hook messages */
if
(
IsHooked
(
fodInfos
))
{
...
...
@@ -979,6 +985,125 @@ static INT_PTR FILEDLG95_HandleCustomDialogMessages(HWND hwnd, UINT uMsg, WPARAM
}
/***********************************************************************
* FILEDLG95_OnWMGetMMI
*
* WM_GETMINMAXINFO message handler for resizable dialogs
*/
static
LRESULT
FILEDLG95_OnWMGetMMI
(
HWND
hwnd
,
LPMINMAXINFO
mmiptr
)
{
FileOpenDlgInfos
*
fodInfos
=
GetPropA
(
hwnd
,
FileOpenDlgInfosStr
);
if
(
!
(
fodInfos
->
ofnInfos
->
Flags
&
OFN_ENABLESIZING
))
return
FALSE
;
if
(
fodInfos
->
initial_size
.
x
||
fodInfos
->
initial_size
.
y
)
{
mmiptr
->
ptMinTrackSize
=
fodInfos
->
initial_size
;
}
return
TRUE
;
}
/***********************************************************************
* FILEDLG95_OnWMSize
*
* WM_SIZE message handler, resize the dialog. Re-arrange controls.
*
* FIXME: this could be made more elaborate. Now use a simple scheme
* where the file view is enlarged and the controls are either moved
* vertically or horizontally to get out of the way. Only the "grip"
* is moved in both directions to stay in the corner.
*/
static
LRESULT
FILEDLG95_OnWMSize
(
HWND
hwnd
,
WPARAM
wParam
,
LPARAM
lParam
)
{
RECT
rc
,
rcview
;
int
chgx
,
chgy
;
HWND
ctrl
;
HDWP
hdwp
;
FileOpenDlgInfos
*
fodInfos
;
if
(
wParam
!=
SIZE_RESTORED
)
return
FALSE
;
fodInfos
=
GetPropA
(
hwnd
,
FileOpenDlgInfosStr
);
if
(
!
(
fodInfos
->
ofnInfos
->
Flags
&
OFN_ENABLESIZING
))
return
FALSE
;
/* get the new dialog rectangle */
GetWindowRect
(
hwnd
,
&
rc
);
/* not initialized yet */
if
(
(
fodInfos
->
sizedlg
.
cx
==
0
&&
fodInfos
->
sizedlg
.
cy
==
0
)
||
((
fodInfos
->
sizedlg
.
cx
==
rc
.
right
-
rc
.
left
)
&&
/* no change */
(
fodInfos
->
sizedlg
.
cy
==
rc
.
bottom
-
rc
.
top
)))
return
FALSE
;
chgx
=
rc
.
right
-
rc
.
left
-
fodInfos
->
sizedlg
.
cx
;
chgy
=
rc
.
bottom
-
rc
.
top
-
fodInfos
->
sizedlg
.
cy
;
fodInfos
->
sizedlg
.
cx
=
rc
.
right
-
rc
.
left
;
fodInfos
->
sizedlg
.
cy
=
rc
.
bottom
-
rc
.
top
;
/* change the size of the view window */
GetWindowRect
(
fodInfos
->
ShellInfos
.
hwndView
,
&
rcview
);
MapWindowPoints
(
NULL
,
hwnd
,
(
LPPOINT
)
&
rcview
,
2
);
hdwp
=
BeginDeferWindowPos
(
10
);
DeferWindowPos
(
hdwp
,
fodInfos
->
ShellInfos
.
hwndView
,
NULL
,
0
,
0
,
rcview
.
right
-
rcview
.
left
+
chgx
,
rcview
.
bottom
-
rcview
.
top
+
chgy
,
SWP_NOMOVE
|
SWP_NOACTIVATE
|
SWP_NOZORDER
);
/* change position and sizes of the controls */
for
(
ctrl
=
GetWindow
(
hwnd
,
GW_CHILD
);
ctrl
;
ctrl
=
GetWindow
(
ctrl
,
GW_HWNDNEXT
))
{
GetWindowRect
(
ctrl
,
&
rc
);
MapWindowPoints
(
NULL
,
hwnd
,
(
LPPOINT
)
&
rc
,
2
);
if
(
ctrl
==
fodInfos
->
DlgInfos
.
hwndGrip
)
{
DeferWindowPos
(
hdwp
,
ctrl
,
NULL
,
rc
.
left
+
chgx
,
rc
.
top
+
chgy
,
0
,
0
,
SWP_NOSIZE
|
SWP_NOACTIVATE
|
SWP_NOZORDER
);
}
else
if
(
rc
.
top
>
rcview
.
bottom
)
{
/* if it was below the shell view
* move to bottom */
DeferWindowPos
(
hdwp
,
ctrl
,
NULL
,
rc
.
left
,
rc
.
top
+
chgy
,
rc
.
right
-
rc
.
left
,
rc
.
bottom
-
rc
.
top
,
SWP_NOSIZE
|
SWP_NOACTIVATE
|
SWP_NOZORDER
);
}
else
if
(
rc
.
left
>
rcview
.
right
)
{
/* if it was to the right of the shell view
* move to right */
DeferWindowPos
(
hdwp
,
ctrl
,
NULL
,
rc
.
left
+
chgx
,
rc
.
top
,
rc
.
right
-
rc
.
left
,
rc
.
bottom
-
rc
.
top
,
SWP_NOSIZE
|
SWP_NOACTIVATE
|
SWP_NOZORDER
);
}
}
if
(
fodInfos
->
DlgInfos
.
hwndCustomDlg
&&
(
fodInfos
->
ofnInfos
->
Flags
&
(
OFN_ENABLETEMPLATE
|
OFN_ENABLETEMPLATEHANDLE
)))
{
GetClientRect
(
hwnd
,
&
rc
);
DeferWindowPos
(
hdwp
,
fodInfos
->
DlgInfos
.
hwndCustomDlg
,
NULL
,
0
,
0
,
rc
.
right
,
rc
.
bottom
,
SWP_NOMOVE
|
SWP_NOACTIVATE
|
SWP_NOZORDER
);
for
(
ctrl
=
GetWindow
(
fodInfos
->
DlgInfos
.
hwndCustomDlg
,
GW_CHILD
);
ctrl
;
ctrl
=
GetWindow
(
ctrl
,
GW_HWNDNEXT
))
{
GetWindowRect
(
ctrl
,
&
rc
);
MapWindowPoints
(
NULL
,
hwnd
,
(
LPPOINT
)
&
rc
,
2
);
if
(
rc
.
top
>
rcview
.
bottom
)
{
/* if it was below the shell view
* move to bottom */
DeferWindowPos
(
hdwp
,
ctrl
,
NULL
,
rc
.
left
,
rc
.
top
+
chgy
,
rc
.
right
-
rc
.
left
,
rc
.
bottom
-
rc
.
top
,
SWP_NOSIZE
|
SWP_NOACTIVATE
|
SWP_NOZORDER
);
}
else
if
(
rc
.
left
>
rcview
.
right
)
{
/* if it was to the right of the shell view
* move to right */
DeferWindowPos
(
hdwp
,
ctrl
,
NULL
,
rc
.
left
+
chgx
,
rc
.
top
,
rc
.
right
-
rc
.
left
,
rc
.
bottom
-
rc
.
top
,
SWP_NOSIZE
|
SWP_NOACTIVATE
|
SWP_NOZORDER
);
}
}
}
EndDeferWindowPos
(
hdwp
);
/* should not be needed */
RedrawWindow
(
hwnd
,
NULL
,
0
,
RDW_ALLCHILDREN
|
RDW_INVALIDATE
);
return
TRUE
;
}
/***********************************************************************
* FileOpenDlgProc95
*
* File open dialog procedure
...
...
@@ -994,6 +1119,9 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
case
WM_INITDIALOG
:
{
FileOpenDlgInfos
*
fodInfos
=
(
FileOpenDlgInfos
*
)
lParam
;
RECT
rc
;
int
gripx
=
GetSystemMetrics
(
SM_CYHSCROLL
);
int
gripy
=
GetSystemMetrics
(
SM_CYVSCROLL
);
/* Adds the FileOpenDlgInfos in the property list of the dialog
so it will be easily accessible through a GetPropA(...) */
...
...
@@ -1001,17 +1129,46 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
FILEDLG95_InitControls
(
hwnd
);
if
(
fodInfos
->
ofnInfos
->
Flags
&
OFN_ENABLESIZING
)
{
GetWindowRect
(
hwnd
,
&
rc
);
fodInfos
->
DlgInfos
.
hwndGrip
=
CreateWindowExA
(
0
,
"SCROLLBAR"
,
NULL
,
WS_CHILD
|
WS_GROUP
|
WS_VISIBLE
|
WS_CLIPSIBLINGS
|
SBS_SIZEGRIP
|
SBS_SIZEBOXBOTTOMRIGHTALIGN
,
rc
.
right
-
gripx
,
rc
.
bottom
-
gripy
,
gripx
,
gripy
,
hwnd
,
(
HMENU
)
-
1
,
COMDLG32_hInstance
,
NULL
);
}
fodInfos
->
DlgInfos
.
hwndCustomDlg
=
CreateTemplateDialog
((
FileOpenDlgInfos
*
)
lParam
,
hwnd
);
FILEDLG95_ResizeControls
(
hwnd
,
wParam
,
lParam
);
FILEDLG95_FillControls
(
hwnd
,
wParam
,
lParam
);
if
(
fodInfos
->
ofnInfos
->
Flags
&
OFN_ENABLESIZING
)
{
GetWindowRect
(
hwnd
,
&
rc
);
/* FIXME: should remember sizes of last invocation */
fodInfos
->
sizedlg
.
cx
=
rc
.
right
-
rc
.
left
;
fodInfos
->
sizedlg
.
cy
=
rc
.
bottom
-
rc
.
top
;
fodInfos
->
initial_size
.
x
=
fodInfos
->
sizedlg
.
cx
;
fodInfos
->
initial_size
.
y
=
fodInfos
->
sizedlg
.
cy
;
GetClientRect
(
hwnd
,
&
rc
);
SetWindowPos
(
fodInfos
->
DlgInfos
.
hwndGrip
,
NULL
,
rc
.
right
-
gripx
,
rc
.
bottom
-
gripy
,
0
,
0
,
SWP_NOSIZE
|
SWP_NOACTIVATE
|
SWP_NOZORDER
);
}
SendCustomDlgNotificationMessage
(
hwnd
,
CDN_INITDONE
);
SendCustomDlgNotificationMessage
(
hwnd
,
CDN_FOLDERCHANGE
);
SendCustomDlgNotificationMessage
(
hwnd
,
CDN_SELCHANGE
);
return
0
;
}
case
WM_SIZE
:
return
FILEDLG95_OnWMSize
(
hwnd
,
wParam
,
lParam
);
case
WM_GETMINMAXINFO
:
return
FILEDLG95_OnWMGetMMI
(
hwnd
,
(
LPMINMAXINFO
)
lParam
);
case
WM_COMMAND
:
return
FILEDLG95_OnWMCommand
(
hwnd
,
wParam
,
lParam
);
case
WM_DRAWITEM
:
...
...
dlls/comdlg32/filedlgbrowser.h
View file @
dd16b91a
...
...
@@ -58,6 +58,8 @@ typedef struct
LPCWSTR
defext
;
LPCWSTR
filter
;
LPCWSTR
customfilter
;
SIZE
sizedlg
;
/* remember the size of the dialog */
POINT
initial_size
;
/* remember the initial size of the dialog */
struct
{
IShellBrowser
*
FOIShellBrowser
;
IShellFolder
*
FOIShellFolder
;
...
...
@@ -78,6 +80,7 @@ typedef struct
HWND
hwndLookInCB
;
HWND
hwndFileName
;
HWND
hwndTB
;
HWND
hwndGrip
;
HWND
hwndCustomDlg
;
DWORD
dwDlgProp
;
}
DlgInfos
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment