summaryrefslogtreecommitdiff
path: root/fpicker/source/win32/filepicker/FileOpenDlg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'fpicker/source/win32/filepicker/FileOpenDlg.cxx')
-rw-r--r--fpicker/source/win32/filepicker/FileOpenDlg.cxx562
1 files changed, 0 insertions, 562 deletions
diff --git a/fpicker/source/win32/filepicker/FileOpenDlg.cxx b/fpicker/source/win32/filepicker/FileOpenDlg.cxx
deleted file mode 100644
index 8d4537c7dcc8..000000000000
--- a/fpicker/source/win32/filepicker/FileOpenDlg.cxx
+++ /dev/null
@@ -1,562 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <osl/diagnose.h>
-#include "../misc/WinImplHelper.hxx"
-#include "FileOpenDlg.hxx"
-
-
-// constants
-
-
-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 override 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 sal_Int32 MAX_FILENAME_BUFF_SIZE = 32000;
- const sal_Int32 MAX_FILETITLE_BUFF_SIZE = 32000;
- const sal_Int32 MAX_FILTER_BUFF_SIZE = 4096;
-
- const PCWSTR CURRENT_INSTANCE = L"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;
- }
-};
-
-
-CFileOpenDialog::CFileOpenDialog(
- bool bFileOpenDialog,
- sal_uInt32 dwFlags,
- sal_uInt32 dwTemplateId,
- HINSTANCE hInstance) :
- m_hwndFileOpenDlg(nullptr),
- m_hwndFileOpenDlgChild(nullptr),
- 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(nullptr)
-{
- // initialize the OPENFILENAME struct
- ZeroMemory(&m_ofn, sizeof(m_ofn));
- m_ofn.lStructSize = sizeof(m_ofn);
-
- // 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 |
- OFN_FILEMUSTEXIST |
- OFN_OVERWRITEPROMPT |
- 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<PWSTR>(const_cast<sal_Unicode*>(m_fileNameBuffer.getStr()));
- m_ofn.nMaxFile = m_fileNameBuffer.getCapacity();
-
- m_ofn.lpstrFileTitle = reinterpret_cast<PWSTR>(const_cast<sal_Unicode*>(m_fileTitleBuffer.getStr()));
- m_ofn.nMaxFileTitle = m_fileTitleBuffer.getCapacity();
-
- m_ofn.lpfnHook = CFileOpenDialog::ofnHookProc;
-
- // set a custom template
-
- if (dwTemplateId)
- {
- 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
- m_ofn.lCustData = reinterpret_cast<sal_IntPtr>(this);
-}
-
-
-CFileOpenDialog::~CFileOpenDialog()
-{
-}
-
-
-void SAL_CALL CFileOpenDialog::setTitle(const OUString& aTitle)
-{
- m_dialogTitle = aTitle;
- m_ofn.lpstrTitle = reinterpret_cast<PCWSTR>(m_dialogTitle.getStr());
-}
-
-
-void CFileOpenDialog::setFilter(const OUString& aFilter)
-{
- // Format is like
- // "*.TXT" or multiple separate by ';' like "*.TXT;*.DOC;*.SXW"
- // Do not include spaces in the pattern string
- m_filterBuffer.ensureCapacity(aFilter.getLength());
- m_filterBuffer.setLength(0);
- m_filterBuffer.append(aFilter);
- m_ofn.lpstrFilter = reinterpret_cast<PCWSTR>(m_filterBuffer.getStr());
-}
-
-
-bool CFileOpenDialog::setFilterIndex(sal_uInt32 aIndex)
-{
- OSL_ASSERT(aIndex > 0);
- m_ofn.nFilterIndex = aIndex;
- return true;
-}
-
-
-sal_uInt32 CFileOpenDialog::getSelectedFilterIndex() const
-{
- return m_ofn.nFilterIndex;
-}
-
-
-void SAL_CALL CFileOpenDialog::setDefaultName(const OUString& aName)
-{
- m_fileNameBuffer.setLength(0);
- m_fileNameBuffer.append(aName);
- m_ofn.lpstrFile = reinterpret_cast<PWSTR>(const_cast<sal_Unicode*>(m_fileNameBuffer.getStr()));
-}
-
-
-void SAL_CALL CFileOpenDialog::setDisplayDirectory(const OUString& aDirectory)
-{
- m_displayDirectory = aDirectory;
- m_ofn.lpstrInitialDir = reinterpret_cast<PCWSTR>(m_displayDirectory.getStr());
-}
-
-
-OUString SAL_CALL CFileOpenDialog::getLastDisplayDirectory() const
-{
- return m_displayDirectory;
-}
-
-
-OUString SAL_CALL CFileOpenDialog::getFullFileName() const
-{
- return OUString(m_fileNameBuffer.getStr(),
- wcslenex(m_fileNameBuffer.getStr()));
-}
-
-
-OUString SAL_CALL CFileOpenDialog::getFileName() const
-{
- return OUString(m_fileTitleBuffer.getStr());
-}
-
-
-OUString CFileOpenDialog::getFileExtension()
-{
- if (m_ofn.nFileExtension)
- return OUString(m_fileNameBuffer.getStr() + m_ofn.nFileExtension,
- rtl_ustr_getLength(m_fileNameBuffer.getStr() + m_ofn.nFileExtension));
-
- return OUString();
-}
-
-
-void CFileOpenDialog::setDefaultFileExtension(const OUString& aExtension)
-{
- m_defaultExtension = aExtension;
- m_ofn.lpstrDefExt = reinterpret_cast<PCWSTR>(m_defaultExtension.getStr());
-}
-
-
-void SAL_CALL CFileOpenDialog::setMultiSelectionMode(bool bMode)
-{
- if (bMode)
- m_ofn.Flags |= OFN_ALLOWMULTISELECT;
- else
- m_ofn.Flags &= ~OFN_ALLOWMULTISELECT;
-}
-
-
-bool SAL_CALL CFileOpenDialog::getMultiSelectionMode() const
-{
- return ((m_ofn.Flags & OFN_ALLOWMULTISELECT) > 0);
-}
-
-
-sal_Int16 SAL_CALL CFileOpenDialog::doModal()
-{
- sal_Int16 nRC = -1;
-
- // pre-processing
- if (preModal())
- {
- bool bRet;
-
- if (m_bFileOpenDialog)
- bRet = m_GetFileNameWrapper.getOpenFileName(
- reinterpret_cast<LPOPENFILENAME>(&m_ofn));
- else
- bRet = m_GetFileNameWrapper.getSaveFileName(
- reinterpret_cast<LPOPENFILENAME>(&m_ofn));
-
- nRC = 1;
-
- if (!bRet)
- nRC = (0 == m_GetFileNameWrapper.commDlgExtendedError()) ? 0 : -1;
-
- // post-processing
- postModal(nRC);
- }
-
- return nRC;
-}
-
-
-sal_uInt32 SAL_CALL CFileOpenDialog::getLastDialogError()
-{
- return CommDlgExtendedError();
-}
-
-
-bool SAL_CALL CFileOpenDialog::preModal()
-{
- return true;
-}
-
-
-void SAL_CALL CFileOpenDialog::postModal(sal_Int16 nDialogResult)
-{
- OSL_ASSERT((-1 <= nDialogResult) && (nDialogResult <= 1));
-
- if (1 == nDialogResult)
- {
- // 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 = OUString(reinterpret_cast<const sal_Unicode*>(m_ofn.lpstrFile),m_ofn.nFileOffset);
- }
-}
-
-
-OUString SAL_CALL CFileOpenDialog::getCurrentFilePath() const
-{
- OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
-
- LPARAM nLen = SendMessageW(
- m_hwndFileOpenDlg,
- CDM_GETFILEPATH,
- m_helperBuffer.getCapacity(),
- reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
-
- if (nLen > 0)
- {
- m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
- return OUString(m_helperBuffer.getStr());
- }
- return OUString();
-}
-
-
-OUString SAL_CALL CFileOpenDialog::getCurrentFolderPath() const
-{
- OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
-
- LPARAM nLen = SendMessageW(
- m_hwndFileOpenDlg,
- CDM_GETFOLDERPATH,
- m_helperBuffer.getCapacity(),
- reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
-
- if (nLen > 0)
- {
- m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
- return OUString(m_helperBuffer.getStr());
- }
- return OUString();
-}
-
-
-OUString SAL_CALL CFileOpenDialog::getCurrentFileName() const
-{
- OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
-
- LPARAM nLen = SendMessageW(
- m_hwndFileOpenDlg,
- CDM_GETSPEC,
- m_helperBuffer.getCapacity(),
- reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
-
- if (nLen > 0)
- {
- m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
- return OUString(m_helperBuffer.getStr());
- }
- return OUString();
-}
-
-
-sal_uInt32 SAL_CALL CFileOpenDialog::onShareViolation(const OUString&)
-{
- return 0;
-}
-
-
-sal_uInt32 SAL_CALL CFileOpenDialog::onFileOk()
-{
- return 0;
-}
-
-
-void SAL_CALL CFileOpenDialog::onSelChanged(HWND)
-{
-}
-
-
-void SAL_CALL CFileOpenDialog::onHelp()
-{
-}
-
-
-void SAL_CALL CFileOpenDialog::onInitDone()
-{
- 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 )
-{
- switch(lpOfNotify->hdr.code)
- {
- case CDN_SHAREVIOLATION:
- return onShareViolation(reinterpret_cast<const sal_Unicode*>(lpOfNotify->pszFile));
-
- case CDN_FILEOK:
- return onFileOk();
-
- case CDN_SELCHANGE:
- onSelChanged(lpOfNotify->hdr.hwndFrom);
- break;
-
- case CDN_HELP:
- onHelp();
- break;
-
- case CDN_INITDONE:
- onInitDone();
- break;
-
- case CDN_FOLDERCHANGE:
- onFolderChanged();
- break;
-
- case CDN_TYPECHANGE:
- m_ofn.nFilterIndex = lpOfNotify->lpOFN->nFilterIndex;
- onTypeChanged(lpOfNotify->lpOFN->nFilterIndex);
- break;
- }
-
- return 0;
-}
-
-
-void SAL_CALL CFileOpenDialog::handleInitDialog(HWND hwndDlg, HWND hwndChild)
-{
- m_hwndFileOpenDlg = hwndDlg;
- m_hwndFileOpenDlgChild = hwndChild;
-
- OSL_ASSERT(GetParent(hwndChild) == hwndDlg);
-
- // calling virtual function which the client can override
- onInitDialog(hwndDlg);
-}
-
-
-UINT_PTR CALLBACK CFileOpenDialog::ofnHookProc(
- HWND hChildDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
-{
- HWND hwndDlg = GetParent(hChildDlg);
- CFileOpenDialog* pImpl = nullptr;
-
- switch( uiMsg )
- {
- case WM_INITDIALOG:
- {
- LPOPENFILENAME_ lpofn = reinterpret_cast<LPOPENFILENAME_>(lParam);
- pImpl = reinterpret_cast<CFileOpenDialog*>(lpofn->lCustData);
- OSL_ASSERT(pImpl);
-
- // subclass the base dialog for WM_NCDESTROY processing
- pImpl->m_pfnBaseDlgProc =
- reinterpret_cast<WNDPROC>(
- SetWindowLongPtr(
- hwndDlg,
- GWLP_WNDPROC,
- reinterpret_cast<LONG_PTR>(CFileOpenDialog::BaseDlgProc)));
- // connect the instance handle to the window
- SetPropW(hwndDlg, CURRENT_INSTANCE, pImpl);
- pImpl->handleInitDialog(hwndDlg, hChildDlg);
- }
- return 0;
-
- case WM_NOTIFY:
- {
- pImpl = getCurrentInstance(hwndDlg);
- return pImpl->onWMNotify(
- hChildDlg, reinterpret_cast<LPOFNOTIFY>(lParam));
- }
-
- case WM_COMMAND:
- {
- pImpl = getCurrentInstance(hwndDlg);
- OSL_ASSERT(pImpl);
-
- return pImpl->onCtrlCommand(
- hChildDlg, LOWORD(wParam), HIWORD(lParam));
- }
- }
-
- return 0;
-}
-
-
-LRESULT CALLBACK CFileOpenDialog::BaseDlgProc(
- HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam)
-{
- CFileOpenDialog* pImpl = nullptr;
-
- if (WM_NCDESTROY == wMessage)
- {
- pImpl = static_cast<CFileOpenDialog*>(
- RemovePropW(hWnd,CURRENT_INSTANCE));
-
- SetWindowLongPtr(hWnd, GWLP_WNDPROC,
- reinterpret_cast<LONG_PTR>(pImpl->m_pfnBaseDlgProc));
- }
- else
- {
- pImpl = getCurrentInstance(hWnd);
- }
-
- OSL_ASSERT(pImpl);
-
- return CallWindowProc(
- reinterpret_cast<WNDPROC>(pImpl->m_pfnBaseDlgProc),
- hWnd,wMessage,wParam,lParam);
-}
-
-
-CFileOpenDialog* SAL_CALL CFileOpenDialog::getCurrentInstance(HWND hwnd)
-{
- OSL_ASSERT(IsWindow( hwnd));
- return static_cast<CFileOpenDialog*>(
- GetPropW(hwnd, CURRENT_INSTANCE));
-}
-
-
-void SAL_CALL CFileOpenDialog::centerPositionToParent() const
-{
- OSL_PRECOND(IsWindow(m_hwndFileOpenDlg), "no dialog window, call method only after or in onInitDone");
-
- HWND hwndParent = m_ofn.hwndOwner;
-
- if (!IsWindow(hwndParent))
- hwndParent = GetDesktopWindow();
-
- OSL_ASSERT(IsWindow(hwndParent));
-
- RECT rcPar;
- GetWindowRect(hwndParent, &rcPar);
-
- RECT rcDlg;
- GetWindowRect(m_hwndFileOpenDlg, &rcDlg);
-
- int lDlgW = rcDlg.right - rcDlg.left;
- int lDlgH = rcDlg.bottom - rcDlg.top;
-
- int x = (rcPar.left + rcPar.right - lDlgW) / 2;
- int y = (rcPar.top + rcPar.bottom - lDlgH) / 2;
-
- HDC hdc = GetDC(m_hwndFileOpenDlg);
-
- int hResol = GetDeviceCaps(hdc, HORZRES);
- int vResol = GetDeviceCaps(hdc, VERTRES);
-
- ReleaseDC(m_hwndFileOpenDlg, hdc);
-
- if (x < 0)
- x = 0;
- else if ((x + lDlgW) > hResol)
- x = hResol - lDlgW;
-
- if (y < 0)
- y = 0;
- else if ((y + lDlgH) > vResol)
- y = vResol - lDlgH;
-
- SetWindowPos(
- m_hwndFileOpenDlg,
- nullptr, x, y, 0, 0,
- SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */