xref: /AOO41X/main/fpicker/source/win32/folderpicker/MtaFop.hxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _MTAFOP_HXX_
29 #define _MTAFOP_HXX_
30 
31 #include <sal/types.h>
32 #include <rtl/ustring.hxx>
33 #include <osl/mutex.hxx>
34 
35 #include <utility>
36 #ifdef __MINGW32__
37 #include <windows.h>
38 #endif
39 #if defined _MSC_VER
40 #pragma warning(push, 1)
41 #pragma warning(disable: 4917)
42 #endif
43 #include <objidl.h>
44 #include <shlobj.h>
45 #if defined _MSC_VER
46 #pragma warning(pop)
47 #endif
48 #include "..\misc\WinImplHelper.hxx"
49 
50 //----------------------------------------------------------------
51 // a simple helper class used to provide a buffer for different
52 // Win32 file and directory functions
53 //----------------------------------------------------------------
54 
55 class CAutoPathBuff
56 {
57 public:
58 	CAutoPathBuff( size_t size = 0 )
59 	{
60 		if (0 == size)
61 			size = 32000; // max path length under Win2000
62 
63 		pBuff = new sal_Unicode[size];
64 
65 		OSL_POSTCOND(pBuff,"Could not allocate path buffer");
66 	}
67 
68 	~CAutoPathBuff( )
69 	{
70 		delete [] pBuff;
71 	}
72 
73 	operator sal_Unicode*( )
74 	{
75 		OSL_PRECOND( pBuff, \
76 			"No path buffer allocated" );
77 		return pBuff;
78 	}
79 
80 	sal_Unicode* get( )
81 	{
82 		OSL_PRECOND( pBuff, \
83 			"No path buffer allocated" );
84 		return pBuff;
85 	}
86 
87 private:
88 	sal_Unicode* pBuff;
89 };
90 
91 //--------------------------------------------------------
92 // the Mta-Ole clipboard class is for internal use only!
93 // only one instance of this class should be created, the
94 // user has to ensure this!
95 // the class is not thread-safe because it will be used
96 // only from within the clipboard service and the methods
97 // of the clipboard service are already synchronized
98 //--------------------------------------------------------
99 
100 class CMtaFolderPicker
101 {
102 public:
103 	CMtaFolderPicker( sal_uInt32 Flags );
104 	virtual ~CMtaFolderPicker( );
105 
106 	// shell functions
107 	sal_Bool SAL_CALL browseForFolder( );
108 
109 	virtual void  SAL_CALL setDisplayDirectory( const rtl::OUString& aDirectory );
110 	virtual rtl::OUString  SAL_CALL getDisplayDirectory( );
111     virtual rtl::OUString SAL_CALL getDirectory( );
112 
113     virtual void SAL_CALL setDescription( const rtl::OUString& aDescription );
114 
115 	virtual void SAL_CALL setTitle( const rtl::OUString& aTitle );
116 	rtl::OUString  SAL_CALL getTitle( );
117 
118     //-----------------------------------------------------
119 	// XCancellable
120 	//-----------------------------------------------------
121 
122     virtual void SAL_CALL cancel( );
123 
124 protected:
125 	void SAL_CALL enableOk( sal_Bool bEnable );
126 	void SAL_CALL setSelection( const rtl::OUString& aDirectory );
127 	void SAL_CALL setStatusText( const rtl::OUString& aStatusText );
128 
129 	virtual void SAL_CALL onInitialized( );
130 	virtual void SAL_CALL onSelChanged( const rtl::OUString& aNewPath ) = 0;
131 
132 private:
133     sal_uInt32 onValidateFailed();
134 
135 	// helper functions
136 	LPITEMIDLIST  SAL_CALL getItemIdListFromPath( const rtl::OUString& aDirectory );
137 	rtl::OUString SAL_CALL getPathFromItemIdList( LPCITEMIDLIST lpItemIdList );
138 	void SAL_CALL releaseItemIdList( LPITEMIDLIST lpItemIdList );
139 
140 	unsigned int run( );
141 
142 	// create a hidden windows which serves as an request
143 	// target; so we guarantee synchronization
144 	sal_Bool SAL_CALL createStaRequestWindow( );
145 
146 	//---------------------------------------------------------------
147 	// message handler functions; remeber these functions are called
148 	// from a different thread context!
149 	//---------------------------------------------------------------
150 
151 	sal_Bool SAL_CALL onBrowseForFolder( );
152 
153 	static LRESULT CALLBACK StaWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
154 	static unsigned int WINAPI StaThreadProc( LPVOID pParam );
155 
156 	static int CALLBACK FolderPickerCallback( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData );
157 
158 protected:
159 	HWND m_hwnd;
160 
161 private:
162     ATOM SAL_CALL RegisterStaRequestWindowClass( );
163     void SAL_CALL UnregisterStaRequestWindowClass( );
164 
165 private:
166 	HANDLE						m_hStaThread;
167 	unsigned					m_uStaThreadId;
168 	HANDLE						m_hEvtThrdReady;
169 	HWND						m_hwndStaRequestWnd;
170 	rtl::OUString				m_dialogTitle;
171     rtl::OUString               m_Description;
172 	rtl::OUString				m_displayDir;
173     rtl::OUString               m_SelectedDir;
174 	BROWSEINFOW					m_bi;
175 	CAutoPathBuff				m_pathBuff;
176     HINSTANCE                   m_hInstance;
177 
178     // the request window class has to be registered only
179     // once per process, so multiple instance of this class
180     // share the registered window class
181     static ATOM       s_ClassAtom;
182     static osl::Mutex s_Mutex;
183     static sal_Int32  s_StaRequestWndRegisterCount;
184 
185 // prevent copy and assignment
186 private:
187 	CMtaFolderPicker( const CMtaFolderPicker& );
188 	CMtaFolderPicker& operator=( const CMtaFolderPicker& );
189 };
190 
191 #endif
192