Files
libreoffice/fpicker/source/win32/filepicker/FileOpenDlg.cxx

692 lines
20 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
2012-04-16 16:36:15 +02:00
#if defined _WIN32_WINNT
# undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0500
//------------------------------------------------------------------------
// includes
//------------------------------------------------------------------------
#include <tchar.h>
#include <osl/diagnose.h>
#include "../misc/WinImplHelper.hxx"
#include "FileOpenDlg.hxx"
//------------------------------------------------------------------------
// constants
//------------------------------------------------------------------------
2001-07-09 11:58:25 +00:00
namespace /* private */
{
// we choose such large buffers because the size of
// an single line edit field can be up to 32k; if
// a user has a multi selection FilePicker and selects
// a lot of files in a large directory we may reach this
// limit and don't want to get out of memory;
// another much more elegant way would be to subclass the
// FileOpen dialog and overload the BM_CLICK event of the
// OK button so that we determine the size of the text
// currently in the edit field and resize our buffer
// appropriately - in the future we will do this
const size_t MAX_FILENAME_BUFF_SIZE = 32000;
const size_t MAX_FILETITLE_BUFF_SIZE = 32000;
const size_t MAX_FILTER_BUFF_SIZE = 4096;
const LPCTSTR CURRENT_INSTANCE = TEXT("CurrInst");
//------------------------------------------
// find an appropriate parent window
//------------------------------------------
inline bool is_current_process_window(HWND hwnd)
{
DWORD pid;
GetWindowThreadProcessId(hwnd, &pid);
return (pid == GetCurrentProcessId());
}
HWND choose_parent_window()
{
HWND hwnd_parent = GetForegroundWindow();
if (!is_current_process_window(hwnd_parent))
hwnd_parent = GetDesktopWindow();
return hwnd_parent;
}
2001-07-09 11:58:25 +00:00
};
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
CFileOpenDialog::CFileOpenDialog(
2002-03-28 07:57:33 +00:00
bool bFileOpenDialog,
sal_uInt32 dwFlags,
sal_uInt32 dwTemplateId,
2002-03-28 07:57:33 +00:00
HINSTANCE hInstance) :
m_hwndFileOpenDlg(0),
m_hwndFileOpenDlgChild(0),
m_bFileOpenDialog(bFileOpenDialog),
m_filterBuffer(MAX_FILTER_BUFF_SIZE),
m_fileTitleBuffer(MAX_FILETITLE_BUFF_SIZE),
m_helperBuffer(MAX_FILENAME_BUFF_SIZE),
m_fileNameBuffer(MAX_FILENAME_BUFF_SIZE),
m_pfnBaseDlgProc(0)
{
// initialize the OPENFILENAME struct
2011-07-20 21:51:04 +03:00
ZeroMemory(&m_ofn, sizeof(m_ofn));
m_ofn.lStructSize = sizeof(m_ofn);
2002-07-03 10:42:37 +00:00
// 0x02000000 for #97681, sfx will make the entry into
// the recent document list
m_ofn.Flags |= dwFlags |
OFN_EXPLORER |
OFN_ENABLEHOOK |
OFN_HIDEREADONLY |
OFN_PATHMUSTEXIST |
2001-07-09 11:58:25 +00:00
OFN_FILEMUSTEXIST |
2002-03-21 06:37:44 +00:00
OFN_OVERWRITEPROMPT |
2002-07-03 10:42:37 +00:00
OFN_ENABLESIZING |
OFN_DONTADDTORECENT; // 0x02000000 -> OFN_DONTADDTORECENT only available with new platform sdk
// it is a little hack but how else could
// we get a parent window (using a vcl window?)
m_ofn.hwndOwner = choose_parent_window();
m_ofn.lpstrFile = reinterpret_cast<LPTSTR>(const_cast<sal_Unicode*>(m_fileNameBuffer.getStr()));
2002-03-28 07:57:33 +00:00
m_ofn.nMaxFile = m_fileNameBuffer.getCapacity();
m_ofn.lpstrFileTitle = reinterpret_cast<LPTSTR>(const_cast<sal_Unicode*>(m_fileTitleBuffer.getStr()));
2002-03-28 07:57:33 +00:00
m_ofn.nMaxFileTitle = m_fileTitleBuffer.getCapacity();
m_ofn.lpfnHook = CFileOpenDialog::ofnHookProc;
// set a custom template
2002-03-28 07:57:33 +00:00
if (dwTemplateId)
{
2002-03-28 07:57:33 +00:00
OSL_ASSERT(hInstance);
m_ofn.Flags |= OFN_ENABLETEMPLATE;
m_ofn.lpTemplateName = MAKEINTRESOURCE(dwTemplateId);
m_ofn.hInstance = hInstance;
}
// set a pointer to myself as ofn parameter
2002-03-28 07:57:33 +00:00
m_ofn.lCustData = reinterpret_cast<long>(this);
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
CFileOpenDialog::~CFileOpenDialog()
{
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void SAL_CALL CFileOpenDialog::setTitle(const rtl::OUString& aTitle)
{
2002-03-28 07:57:33 +00:00
m_dialogTitle = aTitle;
m_ofn.lpstrTitle = reinterpret_cast<LPCTSTR>(m_dialogTitle.getStr());
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void CFileOpenDialog::setFilter(const rtl::OUString& aFilter)
{
// Format is like
// "*.TXT" or multiple separate by ';' like "*.TXT;*.DOC;*.SXW"
// Do not include spaces in the pattern string
2002-03-28 07:57:33 +00:00
m_filterBuffer.ensureCapacity(aFilter.getLength());
m_filterBuffer.setLength(0);
m_filterBuffer.append(aFilter);
m_ofn.lpstrFilter = reinterpret_cast<LPCTSTR>(m_filterBuffer.getStr());
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
bool CFileOpenDialog::setFilterIndex(sal_uInt32 aIndex)
{
2002-03-28 07:57:33 +00:00
OSL_ASSERT(aIndex > 0);
m_ofn.nFilterIndex = aIndex;
return sal_True;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
sal_uInt32 CFileOpenDialog::getSelectedFilterIndex() const
{
return m_ofn.nFilterIndex;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void SAL_CALL CFileOpenDialog::setDefaultName(const rtl::OUString& aName)
{
2002-03-28 07:57:33 +00:00
m_fileNameBuffer.setLength(0);
m_fileNameBuffer.append(aName);
m_ofn.lpstrFile = reinterpret_cast<LPTSTR>(const_cast<sal_Unicode*>(m_fileNameBuffer.getStr()));
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void SAL_CALL CFileOpenDialog::setDisplayDirectory(const rtl::OUString& aDirectory)
{
m_displayDirectory = aDirectory;
m_ofn.lpstrInitialDir = reinterpret_cast<LPCTSTR>(m_displayDirectory.getStr());
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
rtl::OUString SAL_CALL CFileOpenDialog::getLastDisplayDirectory() const
{
return m_displayDirectory;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
rtl::OUString SAL_CALL CFileOpenDialog::getFullFileName() const
{
2002-03-28 07:57:33 +00:00
return rtl::OUString(m_fileNameBuffer.getStr(),
_wcslenex(m_fileNameBuffer.getStr()));
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
rtl::OUString SAL_CALL CFileOpenDialog::getFileName() const
{
2011-10-05 14:12:02 +02:00
return rtl::OUString(m_fileTitleBuffer.getStr());
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
rtl::OUString CFileOpenDialog::getFileExtension()
{
2002-03-28 07:57:33 +00:00
if (m_ofn.nFileExtension)
return rtl::OUString(m_fileNameBuffer.getStr() + m_ofn.nFileExtension,
rtl_ustr_getLength(m_fileNameBuffer.getStr() + m_ofn.nFileExtension));
2002-03-28 07:57:33 +00:00
return rtl::OUString();
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void CFileOpenDialog::setDefaultFileExtension(const rtl::OUString& aExtension)
{
m_defaultExtension = aExtension;
m_ofn.lpstrDefExt = reinterpret_cast<LPCTSTR>(m_defaultExtension.getStr());
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void SAL_CALL CFileOpenDialog::setMultiSelectionMode(bool bMode)
{
2002-03-28 07:57:33 +00:00
if (bMode)
m_ofn.Flags |= OFN_ALLOWMULTISELECT;
2002-03-28 07:57:33 +00:00
else
m_ofn.Flags &= ~OFN_ALLOWMULTISELECT;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
bool SAL_CALL CFileOpenDialog::getMultiSelectionMode() const
{
2002-03-28 07:57:33 +00:00
return ((m_ofn.Flags & OFN_ALLOWMULTISELECT) > 0);
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
sal_Int16 SAL_CALL CFileOpenDialog::doModal()
{
sal_Int16 nRC = -1;
// pre-processing
2002-03-28 07:57:33 +00:00
if (preModal())
{
2002-03-28 07:57:33 +00:00
bool bRet;
2002-03-28 07:57:33 +00:00
if (m_bFileOpenDialog)
bRet = m_GetFileNameWrapper.getOpenFileName(
reinterpret_cast<LPOPENFILENAME>(&m_ofn));
2002-03-28 07:57:33 +00:00
else
bRet = m_GetFileNameWrapper.getSaveFileName(
reinterpret_cast<LPOPENFILENAME>(&m_ofn));
2002-03-28 07:57:33 +00:00
nRC = 1;
if (!bRet)
nRC = (0 == m_GetFileNameWrapper.commDlgExtendedError()) ? 0 : -1;
// post-processing
2002-03-28 07:57:33 +00:00
postModal(nRC);
}
return nRC;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
sal_uInt32 SAL_CALL CFileOpenDialog::getLastDialogError() const
{
2002-03-28 07:57:33 +00:00
return CommDlgExtendedError();
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
bool SAL_CALL CFileOpenDialog::preModal()
{
return sal_True;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void SAL_CALL CFileOpenDialog::postModal(sal_Int16 nDialogResult)
{
2002-03-28 07:57:33 +00:00
OSL_ASSERT((-1 <= nDialogResult) && (nDialogResult <= 1));
2002-03-28 07:57:33 +00:00
if (1 == nDialogResult)
{
2002-03-28 07:57:33 +00:00
// Attention: assuming that nFileOffset is always greater 0 because under
// Windows there is always a drive letter or a server in a complete path
// the OPENFILENAME docu never says that nFileOffset can be 0
m_displayDirectory = rtl::OUString(reinterpret_cast<const sal_Unicode*>(m_ofn.lpstrFile),m_ofn.nFileOffset);
}
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
rtl::OUString SAL_CALL CFileOpenDialog::getCurrentFilePath() const
{
2002-03-28 07:57:33 +00:00
OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
LPARAM nLen = SendMessage(
m_hwndFileOpenDlg,
CDM_GETFILEPATH,
2002-03-28 07:57:33 +00:00
m_helperBuffer.getCapacity(),
reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
2002-03-28 07:57:33 +00:00
if (nLen > 0)
{
m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
2011-10-05 14:12:02 +02:00
return rtl::OUString(m_helperBuffer.getStr());
2002-03-28 07:57:33 +00:00
}
return rtl::OUString();
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
rtl::OUString SAL_CALL CFileOpenDialog::getCurrentFolderPath() const
{
2002-03-28 07:57:33 +00:00
OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
LPARAM nLen = SendMessage(
m_hwndFileOpenDlg,
CDM_GETFOLDERPATH,
2002-03-28 07:57:33 +00:00
m_helperBuffer.getCapacity(),
reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
2002-03-28 07:57:33 +00:00
if (nLen > 0)
{
m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
2011-10-05 14:12:02 +02:00
return rtl::OUString(m_helperBuffer.getStr());
2002-03-28 07:57:33 +00:00
}
return rtl::OUString();
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
rtl::OUString SAL_CALL CFileOpenDialog::getCurrentFileName() const
{
2002-03-28 07:57:33 +00:00
OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
LPARAM nLen = SendMessage(
m_hwndFileOpenDlg,
CDM_GETSPEC,
2002-03-28 07:57:33 +00:00
m_helperBuffer.getCapacity(),
reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
2002-03-28 07:57:33 +00:00
if (nLen > 0)
{
m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
2011-10-05 14:12:02 +02:00
return rtl::OUString(m_helperBuffer.getStr());
2002-03-28 07:57:33 +00:00
}
return rtl::OUString();
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
sal_uInt32 SAL_CALL CFileOpenDialog::onShareViolation(const rtl::OUString&)
{
return 0;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
sal_uInt32 SAL_CALL CFileOpenDialog::onFileOk()
{
return 0;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
void SAL_CALL CFileOpenDialog::onSelChanged(HWND)
{
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void SAL_CALL CFileOpenDialog::onHelp()
{
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
void SAL_CALL CFileOpenDialog::onInitDone()
{
2002-03-28 07:57:33 +00:00
centerPositionToParent();
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
void SAL_CALL CFileOpenDialog::onFolderChanged()
{
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
void SAL_CALL CFileOpenDialog::onTypeChanged(sal_uInt32)
{
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
sal_uInt32 SAL_CALL CFileOpenDialog::onCtrlCommand(HWND, sal_uInt16, sal_uInt16)
{
return 0;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
sal_uInt32 SAL_CALL CFileOpenDialog::onWMNotify( HWND, LPOFNOTIFY lpOfNotify )
{
2002-03-28 07:57:33 +00:00
switch(lpOfNotify->hdr.code)
{
case CDN_SHAREVIOLATION:
return onShareViolation(reinterpret_cast<const sal_Unicode*>(lpOfNotify->pszFile));
case CDN_FILEOK:
2002-03-28 07:57:33 +00:00
return onFileOk();
case CDN_SELCHANGE:
2002-03-28 07:57:33 +00:00
onSelChanged(lpOfNotify->hdr.hwndFrom);
break;
case CDN_HELP:
2002-03-28 07:57:33 +00:00
onHelp();
break;
case CDN_INITDONE:
2002-03-28 07:57:33 +00:00
onInitDone();
break;
case CDN_FOLDERCHANGE:
2002-03-28 07:57:33 +00:00
onFolderChanged();
break;
case CDN_TYPECHANGE:
2001-07-09 11:58:25 +00:00
m_ofn.nFilterIndex = lpOfNotify->lpOFN->nFilterIndex;
2002-03-28 07:57:33 +00:00
onTypeChanged(lpOfNotify->lpOFN->nFilterIndex);
break;
}
return 0;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void SAL_CALL CFileOpenDialog::handleInitDialog(HWND hwndDlg, HWND hwndChild)
{
m_hwndFileOpenDlg = hwndDlg;
m_hwndFileOpenDlgChild = hwndChild;
2002-03-28 07:57:33 +00:00
OSL_ASSERT(GetParent(hwndChild) == hwndDlg);
2001-07-09 11:58:25 +00:00
// calling virtual function which the
// client can overload
onInitDialog(hwndDlg);
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
UINT_PTR CALLBACK CFileOpenDialog::ofnHookProc(
HWND hChildDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndDlg = GetParent(hChildDlg);
2001-07-09 11:58:25 +00:00
CFileOpenDialog* pImpl = NULL;
switch( uiMsg )
{
case WM_INITDIALOG:
2001-07-09 11:58:25 +00:00
{
_LPOPENFILENAME lpofn = reinterpret_cast<_LPOPENFILENAME>(lParam);
2002-03-28 07:57:33 +00:00
pImpl = reinterpret_cast<CFileOpenDialog*>(lpofn->lCustData);
OSL_ASSERT(pImpl);
2001-07-09 11:58:25 +00:00
// subclass the base dialog for WM_NCDESTROY processing
pImpl->m_pfnBaseDlgProc =
reinterpret_cast<WNDPROC>(
SetWindowLongPtr(
hwndDlg,
GWLP_WNDPROC,
reinterpret_cast<LONG_PTR>(CFileOpenDialog::BaseDlgProc)));
2001-07-09 11:58:25 +00:00
// connect the instance handle to the window
SetProp(hwndDlg, CURRENT_INSTANCE, pImpl);
2002-03-28 07:57:33 +00:00
pImpl->handleInitDialog(hwndDlg, hChildDlg);
2001-07-09 11:58:25 +00:00
}
return 0;
case WM_NOTIFY:
2001-07-09 11:58:25 +00:00
{
2002-03-28 07:57:33 +00:00
pImpl = getCurrentInstance(hwndDlg);
2001-07-09 11:58:25 +00:00
return pImpl->onWMNotify(
hChildDlg, reinterpret_cast<LPOFNOTIFY>(lParam));
2001-07-09 11:58:25 +00:00
}
case WM_COMMAND:
2001-07-09 11:58:25 +00:00
{
2002-03-28 07:57:33 +00:00
pImpl = getCurrentInstance(hwndDlg);
OSL_ASSERT(pImpl);
2001-07-09 11:58:25 +00:00
return pImpl->onCtrlCommand(
2002-03-28 07:57:33 +00:00
hChildDlg, LOWORD(wParam), HIWORD(lParam));
2001-07-09 11:58:25 +00:00
}
}
return 0;
}
2001-07-09 11:58:25 +00:00
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
LRESULT CALLBACK CFileOpenDialog::BaseDlgProc(
HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam)
2001-07-09 11:58:25 +00:00
{
2002-03-28 07:57:33 +00:00
CFileOpenDialog* pImpl = 0;
2001-07-09 11:58:25 +00:00
2002-03-28 07:57:33 +00:00
if (WM_NCDESTROY == wMessage)
2001-07-09 11:58:25 +00:00
{
2002-03-28 07:57:33 +00:00
pImpl = reinterpret_cast<CFileOpenDialog*>(
RemoveProp(hWnd,CURRENT_INSTANCE));
2001-07-09 11:58:25 +00:00
SetWindowLongPtr(hWnd, GWLP_WNDPROC,
reinterpret_cast<LONG_PTR>(pImpl->m_pfnBaseDlgProc));
2002-03-28 07:57:33 +00:00
}
else
{
pImpl = getCurrentInstance(hWnd);
}
2001-07-09 11:58:25 +00:00
2002-03-28 07:57:33 +00:00
OSL_ASSERT(pImpl);
2001-07-09 11:58:25 +00:00
return CallWindowProc(
2002-03-28 07:57:33 +00:00
reinterpret_cast<WNDPROC>(pImpl->m_pfnBaseDlgProc),
hWnd,wMessage,wParam,lParam);
2001-07-09 11:58:25 +00:00
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
CFileOpenDialog* SAL_CALL CFileOpenDialog::getCurrentInstance(HWND hwnd)
2001-07-09 11:58:25 +00:00
{
OSL_ASSERT(IsWindow( hwnd));
2002-03-28 07:57:33 +00:00
return reinterpret_cast<CFileOpenDialog*>(
GetProp(hwnd, CURRENT_INSTANCE));
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
2002-03-28 07:57:33 +00:00
void SAL_CALL CFileOpenDialog::centerPositionToParent() const
{
2002-03-28 07:57:33 +00:00
OSL_PRECOND(IsWindow(m_hwndFileOpenDlg), "no dialog window, call method only after or in onInitDone");
HWND hwndParent = m_ofn.hwndOwner;
2002-03-28 07:57:33 +00:00
if (!IsWindow(hwndParent))
hwndParent = GetDesktopWindow();
2002-03-28 07:57:33 +00:00
OSL_ASSERT(IsWindow(hwndParent));
2002-03-28 07:57:33 +00:00
RECT rcPar;
GetWindowRect(hwndParent, &rcPar);
2002-03-28 07:57:33 +00:00
RECT rcDlg;
GetWindowRect(m_hwndFileOpenDlg, &rcDlg);
2002-03-28 07:57:33 +00:00
int lDlgW = rcDlg.right - rcDlg.left;
int lDlgH = rcDlg.bottom - rcDlg.top;
2002-03-28 07:57:33 +00:00
int x = (rcPar.left + rcPar.right - lDlgW) / 2;
int y = (rcPar.top + rcPar.bottom - lDlgH) / 2;
2002-03-28 07:57:33 +00:00
HDC hdc = GetDC(m_hwndFileOpenDlg);
2002-03-28 07:57:33 +00:00
int hResol = GetDeviceCaps(hdc, HORZRES);
int vResol = GetDeviceCaps(hdc, VERTRES);
2002-03-28 07:57:33 +00:00
ReleaseDC(m_hwndFileOpenDlg, hdc);
2002-03-28 07:57:33 +00:00
if (x < 0)
x = 0;
2002-03-28 07:57:33 +00:00
else if ((x + lDlgW) > hResol)
x = hResol - lDlgW;
2002-03-28 07:57:33 +00:00
if (y < 0)
y = 0;
2002-03-28 07:57:33 +00:00
else if ((y + lDlgH) > vResol)
y = vResol - lDlgH;
SetWindowPos(
m_hwndFileOpenDlg,
2002-03-28 07:57:33 +00:00
NULL, x, y, 0, 0,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */