michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef nsFilePicker_h__ michael@0: #define nsFilePicker_h__ michael@0: michael@0: #include michael@0: michael@0: // For Vista IFileDialog interfaces which aren't exposed michael@0: // unless _WIN32_WINNT >= _WIN32_WINNT_LONGHORN. michael@0: #if _WIN32_WINNT < _WIN32_WINNT_LONGHORN michael@0: #define _WIN32_WINNT_bak _WIN32_WINNT michael@0: #undef _WIN32_WINNT michael@0: #define _WIN32_WINNT _WIN32_WINNT_LONGHORN michael@0: #define _WIN32_IE_bak _WIN32_IE michael@0: #undef _WIN32_IE michael@0: #define _WIN32_IE _WIN32_IE_IE70 michael@0: #endif michael@0: michael@0: #include "nsIFile.h" michael@0: #include "nsITimer.h" michael@0: #include "nsISimpleEnumerator.h" michael@0: #include "nsCOMArray.h" michael@0: #include "nsAutoPtr.h" michael@0: #include "nsBaseFilePicker.h" michael@0: #include "nsString.h" michael@0: #include "nsdefs.h" michael@0: #include michael@0: #include michael@0: #undef LogSeverity // SetupAPI.h #defines this as DWORD michael@0: michael@0: class nsILoadContext; michael@0: michael@0: class nsBaseWinFilePicker : michael@0: public nsBaseFilePicker michael@0: { michael@0: public: michael@0: NS_IMETHOD GetDefaultString(nsAString& aDefaultString); michael@0: NS_IMETHOD SetDefaultString(const nsAString& aDefaultString); michael@0: NS_IMETHOD GetDefaultExtension(nsAString& aDefaultExtension); michael@0: NS_IMETHOD SetDefaultExtension(const nsAString& aDefaultExtension); michael@0: michael@0: protected: michael@0: nsString mDefaultFilePath; michael@0: nsString mDefaultFilename; michael@0: nsString mDefaultExtension; michael@0: }; michael@0: michael@0: /** michael@0: * Native Windows FileSelector wrapper michael@0: */ michael@0: michael@0: class nsFilePicker : michael@0: public IFileDialogEvents, michael@0: public nsBaseWinFilePicker michael@0: { michael@0: public: michael@0: nsFilePicker(); michael@0: virtual ~nsFilePicker(); michael@0: michael@0: NS_IMETHOD Init(nsIDOMWindow *aParent, const nsAString& aTitle, int16_t aMode); michael@0: michael@0: NS_DECL_ISUPPORTS michael@0: michael@0: // IUnknown's QueryInterface michael@0: STDMETHODIMP QueryInterface(REFIID refiid, void** ppvResult); michael@0: michael@0: // nsIFilePicker (less what's in nsBaseFilePicker and nsBaseWinFilePicker) michael@0: NS_IMETHOD GetFilterIndex(int32_t *aFilterIndex); michael@0: NS_IMETHOD SetFilterIndex(int32_t aFilterIndex); michael@0: NS_IMETHOD GetFile(nsIFile * *aFile); michael@0: NS_IMETHOD GetFileURL(nsIURI * *aFileURL); michael@0: NS_IMETHOD GetFiles(nsISimpleEnumerator **aFiles); michael@0: NS_IMETHOD Show(int16_t *aReturnVal); michael@0: NS_IMETHOD ShowW(int16_t *aReturnVal); michael@0: NS_IMETHOD AppendFilter(const nsAString& aTitle, const nsAString& aFilter); michael@0: michael@0: // IFileDialogEvents michael@0: HRESULT STDMETHODCALLTYPE OnFileOk(IFileDialog *pfd); michael@0: HRESULT STDMETHODCALLTYPE OnFolderChanging(IFileDialog *pfd, IShellItem *psiFolder); michael@0: HRESULT STDMETHODCALLTYPE OnFolderChange(IFileDialog *pfd); michael@0: HRESULT STDMETHODCALLTYPE OnSelectionChange(IFileDialog *pfd); michael@0: HRESULT STDMETHODCALLTYPE OnShareViolation(IFileDialog *pfd, IShellItem *psi, FDE_SHAREVIOLATION_RESPONSE *pResponse); michael@0: HRESULT STDMETHODCALLTYPE OnTypeChange(IFileDialog *pfd); michael@0: HRESULT STDMETHODCALLTYPE OnOverwrite(IFileDialog *pfd, IShellItem *psi, FDE_OVERWRITE_RESPONSE *pResponse); michael@0: michael@0: protected: michael@0: enum PickerType { michael@0: PICKER_TYPE_OPEN, michael@0: PICKER_TYPE_SAVE, michael@0: }; michael@0: michael@0: /* method from nsBaseFilePicker */ michael@0: virtual void InitNative(nsIWidget *aParent, michael@0: const nsAString& aTitle); michael@0: static void GetQualifiedPath(const wchar_t *aInPath, nsString &aOutPath); michael@0: void GetFilterListArray(nsString& aFilterList); michael@0: bool FilePickerWrapper(OPENFILENAMEW* ofn, PickerType aType); michael@0: bool ShowXPFolderPicker(const nsString& aInitialDir); michael@0: bool ShowXPFilePicker(const nsString& aInitialDir); michael@0: bool ShowFolderPicker(const nsString& aInitialDir, bool &aWasInitError); michael@0: bool ShowFilePicker(const nsString& aInitialDir, bool &aWasInitError); michael@0: void AppendXPFilter(const nsAString& aTitle, const nsAString& aFilter); michael@0: void RememberLastUsedDirectory(); michael@0: bool IsPrivacyModeEnabled(); michael@0: bool IsDefaultPathLink(); michael@0: bool IsDefaultPathHtml(); michael@0: void SetDialogHandle(HWND aWnd); michael@0: bool ClosePickerIfNeeded(bool aIsXPDialog); michael@0: static void PickerCallbackTimerFunc(nsITimer *aTimer, void *aPicker); michael@0: static UINT_PTR CALLBACK MultiFilePickerHook(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); michael@0: static UINT_PTR CALLBACK FilePickerHook(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); michael@0: michael@0: nsCOMPtr mLoadContext; michael@0: nsCOMPtr mParentWidget; michael@0: nsString mTitle; michael@0: nsCString mFile; michael@0: nsString mFilterList; michael@0: int16_t mSelectedType; michael@0: nsCOMArray mFiles; michael@0: static char mLastUsedDirectory[]; michael@0: nsString mUnicodeFile; michael@0: static char16_t *mLastUsedUnicodeDirectory; michael@0: HWND mDlgWnd; michael@0: michael@0: class ComDlgFilterSpec michael@0: { michael@0: public: michael@0: ComDlgFilterSpec() {} michael@0: ~ComDlgFilterSpec() {} michael@0: michael@0: const uint32_t Length() { michael@0: return mSpecList.Length(); michael@0: } michael@0: michael@0: const bool IsEmpty() { michael@0: return (mSpecList.Length() == 0); michael@0: } michael@0: michael@0: const COMDLG_FILTERSPEC* get() { michael@0: return mSpecList.Elements(); michael@0: } michael@0: michael@0: void Append(const nsAString& aTitle, const nsAString& aFilter); michael@0: private: michael@0: nsAutoTArray mSpecList; michael@0: nsAutoTArray mStrings; michael@0: }; michael@0: michael@0: ComDlgFilterSpec mComFilterList; michael@0: DWORD mFDECookie; michael@0: }; michael@0: michael@0: #if defined(_WIN32_WINNT_bak) michael@0: #undef _WIN32_WINNT michael@0: #define _WIN32_WINNT _WIN32_WINNT_bak michael@0: #undef _WIN32_IE michael@0: #define _WIN32_IE _WIN32_IE_bak michael@0: #endif michael@0: michael@0: #endif // nsFilePicker_h__