summaryrefslogtreecommitdiff
path: root/fpicker/source/win32/filepicker/FileOpenDlg.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'fpicker/source/win32/filepicker/FileOpenDlg.hxx')
-rw-r--r--fpicker/source/win32/filepicker/FileOpenDlg.hxx327
1 files changed, 327 insertions, 0 deletions
diff --git a/fpicker/source/win32/filepicker/FileOpenDlg.hxx b/fpicker/source/win32/filepicker/FileOpenDlg.hxx
new file mode 100644
index 000000000000..f1d8753dcf43
--- /dev/null
+++ b/fpicker/source/win32/filepicker/FileOpenDlg.hxx
@@ -0,0 +1,327 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#ifndef _FILEOPENDLG_HXX_
+#define _FILEOPENDLG_HXX_
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+
+#include <sal/types.h>
+
+#ifndef _RTL_USTRING_HXX_
+#include <rtl/ustring>
+#endif
+#include <rtl/ustrbuf.hxx>
+
+#include "platform_xp.h"
+#include "getfilenamewrapper.hxx"
+
+// because we don't want to import the new W2k platform skd
+// into our build environment if have stolen the definition
+// for the new OPENFILENAME structure from the new headers
+
+#ifndef _CDSIZEOF_STRUCT
+#define _CDSIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member))
+#endif
+
+typedef struct _tagOFNA {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ LPCSTR lpstrFilter;
+ LPSTR lpstrCustomFilter;
+ DWORD nMaxCustFilter;
+ DWORD nFilterIndex;
+ LPSTR lpstrFile;
+ DWORD nMaxFile;
+ LPSTR lpstrFileTitle;
+ DWORD nMaxFileTitle;
+ LPCSTR lpstrInitialDir;
+ LPCSTR lpstrTitle;
+ DWORD Flags;
+ WORD nFileOffset;
+ WORD nFileExtension;
+ LPCSTR lpstrDefExt;
+ LPARAM lCustData;
+ LPOFNHOOKPROC lpfnHook;
+ LPCSTR lpTemplateName;
+#ifdef _MAC
+ LPEDITMENU lpEditInfo;
+ LPCSTR lpstrPrompt;
+#endif
+#if (_WIN32_WINNT >= 0x0500)
+ void * pvReserved;
+ DWORD dwReserved;
+ DWORD FlagsEx;
+#endif // (_WIN32_WINNT >= 0x0500)
+} _OPENFILENAMEA, *_LPOPENFILENAMEA;
+
+typedef struct _tagOFNW {
+ DWORD lStructSize;
+ HWND hwndOwner;
+ HINSTANCE hInstance;
+ LPCWSTR lpstrFilter;
+ LPWSTR lpstrCustomFilter;
+ DWORD nMaxCustFilter;
+ DWORD nFilterIndex;
+ LPWSTR lpstrFile;
+ DWORD nMaxFile;
+ LPWSTR lpstrFileTitle;
+ DWORD nMaxFileTitle;
+ LPCWSTR lpstrInitialDir;
+ LPCWSTR lpstrTitle;
+ DWORD Flags;
+ WORD nFileOffset;
+ WORD nFileExtension;
+ LPCWSTR lpstrDefExt;
+ LPARAM lCustData;
+ LPOFNHOOKPROC lpfnHook;
+ LPCWSTR lpTemplateName;
+#if (_WIN32_WINNT >= 0x0500)
+ void * pvReserved;
+ DWORD dwReserved;
+ DWORD FlagsEx;
+#endif // (_WIN32_WINNT >= 0x0500)
+} _OPENFILENAMEW, *_LPOPENFILENAMEW;
+
+#ifdef UNICODE
+typedef _OPENFILENAMEW _OPENFILENAME;
+typedef _LPOPENFILENAMEW _LPOPENFILENAME;
+#else
+typedef _OPENFILENAMEA _OPENFILENAME;
+typedef _LPOPENFILENAMEA _LPOPENFILENAME;
+#endif // UNICODE
+
+#if (_WIN32_WINNT >= 0x0500)
+ #define _OPENFILENAME_SIZE_VERSION_400A _CDSIZEOF_STRUCT(_OPENFILENAMEA,lpTemplateName)
+ #define _OPENFILENAME_SIZE_VERSION_400W _CDSIZEOF_STRUCT(_OPENFILENAMEW,lpTemplateName)
+ #ifdef UNICODE
+ #define _OPENFILENAME_SIZE_VERSION_400 _OPENFILENAME_SIZE_VERSION_400W
+ #else
+ #define _OPENFILENAME_SIZE_VERSION_400 _OPENFILENAME_SIZE_VERSION_400A
+ #endif // !UNICODE
+#else
+ #error _WIN32_WINNT seams not to be valid.
+#endif // (_WIN32_WINNT >= 0x0500)
+
+
+//-------------------------------------------------------------
+// A simple wrapper class around the Win32 GetOpenFileName API.
+// This class is not thread-safe and only one instance at a
+// time is allowed
+//-------------------------------------------------------------
+
+class CFileOpenDialog
+{
+public:
+ // ctor
+ // bFileOpenDialog idicates if we want a FileOpen or FileSave
+ // dialog
+ // dwFlags see OPENFILENAME
+ // dwTemplateId - an ID for custom templates
+ // hInstance - an instance handle for the module
+ // which provides the custom template, unused if dwTemplateId
+ // is 0
+ CFileOpenDialog(
+ bool bFileOpenDialog = sal_True,
+ sal_uInt32 dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
+ sal_uInt32 dwTemplateId = 0,
+ HINSTANCE hInstance = 0);
+
+ virtual ~CFileOpenDialog();
+
+ virtual void SAL_CALL setTitle(const rtl::OUString& aTitle);
+
+ // to set a filter string using the M$ format
+ // e.g. FltName\0*.txt;*.rtf\0...\0\0
+ void SAL_CALL setFilter(const rtl::OUString& aFilter);
+
+ // set the index of the current filter when the
+ // dialog is about to shown, the index starts with 1
+ // the function succeeded if the given filter index
+ // is greater than zero and is a valid position
+ // within filter string that was previously set
+ bool SAL_CALL setFilterIndex(sal_uInt32 aIndex);
+
+ // get the index of the currently selected filter
+ // the index of the returned filter starts with 1
+ sal_uInt32 SAL_CALL getSelectedFilterIndex() const;
+
+ // set the name and optional the path of the
+ // file that will be initially be shown when
+ // the dialog will be displayed
+ virtual void SAL_CALL setDefaultName(const rtl::OUString& aName);
+
+ // set the initial directory
+ virtual void SAL_CALL setDisplayDirectory(const rtl::OUString& aDirectory);
+
+ // returns only the path of the selected file
+ virtual rtl::OUString SAL_CALL getLastDisplayDirectory() const;
+
+ // returns the full file name including drive letter, path
+ // file name and file extension
+ virtual rtl::OUString SAL_CALL getFullFileName() const;
+
+ // returns the file name and the file extension without
+ // drive letter and path
+ rtl::OUString SAL_CALL getFileName() const;
+
+ // returns the file extension of the selected file
+ rtl::OUString SAL_CALL getFileExtension();
+
+ // set a default extension, only the first three letters of
+ // the given extension will be used; the given extension
+ // should not contain a '.'
+ void SAL_CALL setDefaultFileExtension(const rtl::OUString& aExtension);
+
+ // enables or disables the multiselection mode for
+ // the FileOpen/FileSave dialog
+ void SAL_CALL setMultiSelectionMode(bool bMode);
+
+ // returns whether multi-selection mode is enabled or not
+ bool SAL_CALL getMultiSelectionMode() const;
+
+ // shows the dialog, calls preModal before
+ // showing the dialog and postModal after
+ // showing the dialog
+ // the method returns:
+ // 0 - when the dialog was canceled by the user
+ // 1 - when the dialog was closed with ok
+ // -1 - when an error occured
+ sal_Int16 SAL_CALL doModal();
+
+ // returns the last dialog error that occured
+ sal_uInt32 SAL_CALL getLastDialogError() const;
+
+ // retrievs the currently selected file
+ // including path and drive information
+ // can be called only if the dialog is
+ // already displayed
+ rtl::OUString SAL_CALL getCurrentFilePath() const;
+
+ // retrievs the currently selected folder
+ rtl::OUString SAL_CALL getCurrentFolderPath() const;
+
+ // retrievs the currently selected file name
+ // without drive and path
+ rtl::OUString SAL_CALL getCurrentFileName() const;
+
+protected:
+ // have to be overwritten when subclasses
+ // want to do special pre- and post-modal
+ // processing
+
+ // if preModal return true processing will
+ // continue else doModal exit without showing
+ // a dialog and returns -1
+ virtual bool SAL_CALL preModal();
+
+ // post modal processing
+ // the function should accept only values returned from
+ // doModal and act appropriately
+ virtual void SAL_CALL postModal(sal_Int16 nDialogResult);
+
+ // message handler, to be overwritten by subclasses
+ virtual sal_uInt32 SAL_CALL onShareViolation(const rtl::OUString& aPathName);
+ virtual sal_uInt32 SAL_CALL onFileOk();
+ virtual void SAL_CALL onSelChanged(HWND hwndListBox);
+ virtual void SAL_CALL onHelp();
+
+ // only called back if OFN_EXPLORER is set
+ virtual void SAL_CALL onInitDone();
+ virtual void SAL_CALL onFolderChanged();
+ virtual void SAL_CALL onTypeChanged(sal_uInt32 nFilterIndex);
+
+ virtual void SAL_CALL onInitDialog(HWND hwndDlg) = 0;
+
+ virtual sal_uInt32 SAL_CALL onCtrlCommand(HWND hwndDlg, sal_uInt16 ctrlId, sal_uInt16 notifyCode);
+
+ sal_uInt32 SAL_CALL onWMNotify(HWND hwndChild, LPOFNOTIFYW lpOfNotify);
+
+ // we use non-virtual functions to do necessary work before
+ // calling the virtual funtions (see Gamma: Template method)
+ void SAL_CALL handleInitDialog(HWND hwndDlg, HWND hwndChild);
+
+protected:
+
+ // handle to the window of the
+ // FileOpen/FileSave dialog
+ // will be set on message
+ // WM_INITDIALOG, before this
+ // value is undefined
+ HWND m_hwndFileOpenDlg;
+ HWND m_hwndFileOpenDlgChild;
+
+ _OPENFILENAME m_ofn;
+
+ // we connect the instance with the dialog window using
+ // SetProp, with this function we can reconnect from
+ // callback functions to this instance
+ static CFileOpenDialog* SAL_CALL getCurrentInstance(HWND hwnd);
+
+ void SAL_CALL centerPositionToParent() const;
+
+private:
+ // FileOpen or FileSaveDialog
+ bool m_bFileOpenDialog;
+ rtl::OUString m_dialogTitle;
+ rtl::OUString m_displayDirectory;
+ rtl::OUString m_defaultExtension;
+
+ mutable rtl::OUStringBuffer m_filterBuffer;
+ mutable rtl::OUStringBuffer m_fileTitleBuffer;
+ mutable rtl::OUStringBuffer m_helperBuffer;
+ mutable rtl::OUStringBuffer m_fileNameBuffer;
+
+ CGetFileNameWrapper m_GetFileNameWrapper;
+
+ WNDPROC m_pfnBaseDlgProc;
+
+ // callback function
+ static unsigned int CALLBACK ofnHookProc(
+ HWND hChildDlg, // handle to child dialog box
+ unsigned int uiMsg, // message identifier
+ WPARAM wParam, // message parameter
+ LPARAM lParam // message parameter
+ );
+
+ // we have to subclass the dialog in order
+ // to clean up the window property we are
+ // using to connect the window with a class
+ // instance in WM_NCDESTROY
+ static LRESULT CALLBACK BaseDlgProc(
+ HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam );
+
+private:
+ // avoid copy and assignment
+ CFileOpenDialog(const CFileOpenDialog&);
+ CFileOpenDialog& operator=(const CFileOpenDialog&);
+};
+
+#endif