1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _MTAFOP_HXX_ 25 #define _MTAFOP_HXX_ 26 27 #include <sal/types.h> 28 #include <rtl/ustring.hxx> 29 #include <osl/mutex.hxx> 30 31 #include <utility> 32 #ifdef __MINGW32__ 33 #include <windows.h> 34 #endif 35 #if defined _MSC_VER 36 #pragma warning(push, 1) 37 #pragma warning(disable: 4917) 38 #endif 39 #include <objidl.h> 40 #include <shlobj.h> 41 #if defined _MSC_VER 42 #pragma warning(pop) 43 #endif 44 #include "..\misc\WinImplHelper.hxx" 45 46 //---------------------------------------------------------------- 47 // a simple helper class used to provide a buffer for different 48 // Win32 file and directory functions 49 //---------------------------------------------------------------- 50 51 class CAutoPathBuff 52 { 53 public: CAutoPathBuff(size_t size=0)54 CAutoPathBuff( size_t size = 0 ) 55 { 56 if (0 == size) 57 size = 32000; // max path length under Win2000 58 59 pBuff = new sal_Unicode[size]; 60 61 OSL_POSTCOND(pBuff,"Could not allocate path buffer"); 62 } 63 ~CAutoPathBuff()64 ~CAutoPathBuff( ) 65 { 66 delete [] pBuff; 67 } 68 operator sal_Unicode*()69 operator sal_Unicode*( ) 70 { 71 OSL_PRECOND( pBuff, \ 72 "No path buffer allocated" ); 73 return pBuff; 74 } 75 get()76 sal_Unicode* get( ) 77 { 78 OSL_PRECOND( pBuff, \ 79 "No path buffer allocated" ); 80 return pBuff; 81 } 82 83 private: 84 sal_Unicode* pBuff; 85 }; 86 87 //-------------------------------------------------------- 88 // the Mta-Ole clipboard class is for internal use only! 89 // only one instance of this class should be created, the 90 // user has to ensure this! 91 // the class is not thread-safe because it will be used 92 // only from within the clipboard service and the methods 93 // of the clipboard service are already synchronized 94 //-------------------------------------------------------- 95 96 class CMtaFolderPicker 97 { 98 public: 99 CMtaFolderPicker( sal_uInt32 Flags ); 100 virtual ~CMtaFolderPicker( ); 101 102 // shell functions 103 sal_Bool SAL_CALL browseForFolder( ); 104 105 virtual void SAL_CALL setDisplayDirectory( const rtl::OUString& aDirectory ); 106 virtual rtl::OUString SAL_CALL getDisplayDirectory( ); 107 virtual rtl::OUString SAL_CALL getDirectory( ); 108 109 virtual void SAL_CALL setDescription( const rtl::OUString& aDescription ); 110 111 virtual void SAL_CALL setTitle( const rtl::OUString& aTitle ); 112 rtl::OUString SAL_CALL getTitle( ); 113 114 //----------------------------------------------------- 115 // XCancellable 116 //----------------------------------------------------- 117 118 virtual void SAL_CALL cancel( ); 119 120 protected: 121 void SAL_CALL enableOk( sal_Bool bEnable ); 122 void SAL_CALL setSelection( const rtl::OUString& aDirectory ); 123 void SAL_CALL setStatusText( const rtl::OUString& aStatusText ); 124 125 virtual void SAL_CALL onInitialized( ); 126 virtual void SAL_CALL onSelChanged( const rtl::OUString& aNewPath ) = 0; 127 128 private: 129 sal_uInt32 onValidateFailed(); 130 131 // helper functions 132 LPITEMIDLIST SAL_CALL getItemIdListFromPath( const rtl::OUString& aDirectory ); 133 rtl::OUString SAL_CALL getPathFromItemIdList( LPCITEMIDLIST lpItemIdList ); 134 void SAL_CALL releaseItemIdList( LPITEMIDLIST lpItemIdList ); 135 136 unsigned int run( ); 137 138 // create a hidden windows which serves as an request 139 // target; so we guarantee synchronization 140 sal_Bool SAL_CALL createStaRequestWindow( ); 141 142 //--------------------------------------------------------------- 143 // message handler functions; remeber these functions are called 144 // from a different thread context! 145 //--------------------------------------------------------------- 146 147 sal_Bool SAL_CALL onBrowseForFolder( ); 148 149 static LRESULT CALLBACK StaWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); 150 static unsigned int WINAPI StaThreadProc( LPVOID pParam ); 151 152 static int CALLBACK FolderPickerCallback( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData ); 153 154 protected: 155 HWND m_hwnd; 156 157 private: 158 ATOM SAL_CALL RegisterStaRequestWindowClass( ); 159 void SAL_CALL UnregisterStaRequestWindowClass( ); 160 161 private: 162 HANDLE m_hStaThread; 163 unsigned m_uStaThreadId; 164 HANDLE m_hEvtThrdReady; 165 HWND m_hwndStaRequestWnd; 166 rtl::OUString m_dialogTitle; 167 rtl::OUString m_Description; 168 rtl::OUString m_displayDir; 169 rtl::OUString m_SelectedDir; 170 BROWSEINFOW m_bi; 171 CAutoPathBuff m_pathBuff; 172 HINSTANCE m_hInstance; 173 174 // the request window class has to be registered only 175 // once per process, so multiple instance of this class 176 // share the registered window class 177 static ATOM s_ClassAtom; 178 static osl::Mutex s_Mutex; 179 static sal_Int32 s_StaRequestWndRegisterCount; 180 181 // prevent copy and assignment 182 private: 183 CMtaFolderPicker( const CMtaFolderPicker& ); 184 CMtaFolderPicker& operator=( const CMtaFolderPicker& ); 185 }; 186 187 #endif 188