1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_fpicker.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
28*b1cdbd2cSJim Jagielski // includes
29*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
30*b1cdbd2cSJim Jagielski #include "filepickerstate.hxx"
31*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
32*b1cdbd2cSJim Jagielski #include "controlaccess.hxx"
33*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ListBoxControlActions.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ControlActions.hpp>
37*b1cdbd2cSJim Jagielski #include "controlcommandrequest.hxx"
38*b1cdbd2cSJim Jagielski #include "controlcommandresult.hxx"
39*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.hxx>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XInterface.hpp>
41*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
42*b1cdbd2cSJim Jagielski #include "FileOpenDlg.hxx"
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <memory>
45*b1cdbd2cSJim Jagielski #include "..\misc\WinImplHelper.hxx"
46*b1cdbd2cSJim Jagielski //---------------------------------------------
47*b1cdbd2cSJim Jagielski //
48*b1cdbd2cSJim Jagielski //---------------------------------------------
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski using rtl::OUString;
51*b1cdbd2cSJim Jagielski using com::sun::star::uno::Any;
52*b1cdbd2cSJim Jagielski using com::sun::star::uno::Sequence;
53*b1cdbd2cSJim Jagielski using com::sun::star::uno::Reference;
54*b1cdbd2cSJim Jagielski using com::sun::star::uno::XInterface;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds;
57*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui::dialogs::CommonFilePickerElementIds;
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui::dialogs::ListboxControlActions;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski //---------------------------------------------
61*b1cdbd2cSJim Jagielski //
62*b1cdbd2cSJim Jagielski //---------------------------------------------
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski const sal_Int32 MAX_LABEL = 256;
65*b1cdbd2cSJim Jagielski const sal_Int16 LISTBOX_LABEL_OFFSET = 100;
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski //---------------------------------------------
68*b1cdbd2cSJim Jagielski // declaration
69*b1cdbd2cSJim Jagielski //---------------------------------------------
70*b1cdbd2cSJim Jagielski 
~CFilePickerState()71*b1cdbd2cSJim Jagielski CFilePickerState::~CFilePickerState( )
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski }
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski //---------------------------------------------
76*b1cdbd2cSJim Jagielski //
77*b1cdbd2cSJim Jagielski //---------------------------------------------
78*b1cdbd2cSJim Jagielski 
CNonExecuteFilePickerState()79*b1cdbd2cSJim Jagielski CNonExecuteFilePickerState::CNonExecuteFilePickerState( ) :
80*b1cdbd2cSJim Jagielski     m_FirstControlCommand( NULL )
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski //---------------------------------------------
85*b1cdbd2cSJim Jagielski //
86*b1cdbd2cSJim Jagielski //---------------------------------------------
87*b1cdbd2cSJim Jagielski 
~CNonExecuteFilePickerState()88*b1cdbd2cSJim Jagielski CNonExecuteFilePickerState::~CNonExecuteFilePickerState( )
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski     reset( );
91*b1cdbd2cSJim Jagielski }
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski //---------------------------------------------
94*b1cdbd2cSJim Jagielski //
95*b1cdbd2cSJim Jagielski //---------------------------------------------
96*b1cdbd2cSJim Jagielski 
setValue(sal_Int16 aControlId,sal_Int16 aControlAction,const Any & aValue)97*b1cdbd2cSJim Jagielski void SAL_CALL CNonExecuteFilePickerState::setValue( sal_Int16 aControlId, sal_Int16 aControlAction, const Any& aValue )
98*b1cdbd2cSJim Jagielski {
99*b1cdbd2cSJim Jagielski     CValueControlCommand* value_command = new CValueControlCommand(
100*b1cdbd2cSJim Jagielski         aControlId, aControlAction, aValue );
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     addControlCommand( value_command );
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski //---------------------------------------------
106*b1cdbd2cSJim Jagielski //
107*b1cdbd2cSJim Jagielski //---------------------------------------------
108*b1cdbd2cSJim Jagielski 
getValue(sal_Int16 aControlId,sal_Int16 aControlAction)109*b1cdbd2cSJim Jagielski Any SAL_CALL CNonExecuteFilePickerState::getValue( sal_Int16 aControlId, sal_Int16 aControlAction )
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski     CValueControlCommandRequest value_request( aControlId, aControlAction );
112*b1cdbd2cSJim Jagielski     Any aAny;
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 	if (m_FirstControlCommand)
115*b1cdbd2cSJim Jagielski 	{
116*b1cdbd2cSJim Jagielski 		// pass the request along the command-chain
117*b1cdbd2cSJim Jagielski 		std::auto_ptr< CControlCommandResult > result( m_FirstControlCommand->handleRequest( &value_request ) );
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 		OSL_ENSURE( result.get(), "invalid getValue request" );
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 		if ( result.get() )
122*b1cdbd2cSJim Jagielski 		{
123*b1cdbd2cSJim Jagielski 			// #101753 must remove assertion else running into deadlock
124*b1cdbd2cSJim Jagielski 			// because getValue may be called asynchronously from main thread
125*b1cdbd2cSJim Jagielski 			// with locked SOLAR_MUTEX but we also need SOLAR_MUTEX in
126*b1cdbd2cSJim Jagielski 			// WinFileOpenDialog::onInitDone ... but we cannot dismiss the
127*b1cdbd2cSJim Jagielski 			// assertion dialog because at this point the FileOpen Dialog
128*b1cdbd2cSJim Jagielski 			// has aleady the focus but is not yet visible :-(
129*b1cdbd2cSJim Jagielski 			// The real cure is to remove the VCL/SOLAR_MUTEX dependency
130*b1cdbd2cSJim Jagielski 			// cause by the use of our resource manager and not being able to
131*b1cdbd2cSJim Jagielski 			// generate native windows resources
132*b1cdbd2cSJim Jagielski 			//OSL_ENSURE( result->hasResult( ), "invalid getValue request" );
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 			if ( result->hasResult( ) )
135*b1cdbd2cSJim Jagielski 			{
136*b1cdbd2cSJim Jagielski 				CValueCommandResult* value_result = dynamic_cast< CValueCommandResult* >( result.get( ) );
137*b1cdbd2cSJim Jagielski 				OSL_ENSURE( value_result, "should have be a CValueCommandResult" );
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 				aAny = value_result->getValue( );
140*b1cdbd2cSJim Jagielski 				OSL_ENSURE( aAny.hasValue( ), "empty any" );
141*b1cdbd2cSJim Jagielski 			}
142*b1cdbd2cSJim Jagielski 		}
143*b1cdbd2cSJim Jagielski 	}
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski     return aAny;
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski //---------------------------------------------
149*b1cdbd2cSJim Jagielski //
150*b1cdbd2cSJim Jagielski //---------------------------------------------
151*b1cdbd2cSJim Jagielski 
enableControl(sal_Int16 aControlId,sal_Bool bEnable)152*b1cdbd2cSJim Jagielski void SAL_CALL CNonExecuteFilePickerState::enableControl( sal_Int16 aControlId, sal_Bool bEnable )
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski     CEnableControlCommand* enable_command = new CEnableControlCommand(
155*b1cdbd2cSJim Jagielski         aControlId, bEnable );
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski     addControlCommand( enable_command );
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski //---------------------------------------------
161*b1cdbd2cSJim Jagielski //
162*b1cdbd2cSJim Jagielski //---------------------------------------------
163*b1cdbd2cSJim Jagielski 
setLabel(sal_Int16 aControlId,const::rtl::OUString & aLabel)164*b1cdbd2cSJim Jagielski void SAL_CALL CNonExecuteFilePickerState::setLabel( sal_Int16 aControlId, const ::rtl::OUString& aLabel )
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski     CLabelControlCommand* label_command = new CLabelControlCommand(
167*b1cdbd2cSJim Jagielski         aControlId, aLabel );
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski     addControlCommand( label_command );
170*b1cdbd2cSJim Jagielski }
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski //---------------------------------------------
173*b1cdbd2cSJim Jagielski //
174*b1cdbd2cSJim Jagielski //---------------------------------------------
175*b1cdbd2cSJim Jagielski 
getLabel(sal_Int16 aControlId)176*b1cdbd2cSJim Jagielski OUString SAL_CALL CNonExecuteFilePickerState::getLabel( sal_Int16 aControlId )
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski     CControlCommandRequest label_request( aControlId );
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski     // pass the request along the command-chain
181*b1cdbd2cSJim Jagielski     std::auto_ptr< CControlCommandResult > result( m_FirstControlCommand->handleRequest( &label_request ) );
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     OSL_ENSURE( result->hasResult( ), "invalid getValue request" );
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     OUString aLabel;
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     if ( result->hasResult( ) )
188*b1cdbd2cSJim Jagielski     {
189*b1cdbd2cSJim Jagielski         CLabelCommandResult* label_result = dynamic_cast< CLabelCommandResult* >( result.get( ) );
190*b1cdbd2cSJim Jagielski         OSL_ENSURE( label_result, "should have be a CLabelCommandResult" );
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski         aLabel = label_result->getLabel( );
193*b1cdbd2cSJim Jagielski     }
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski     return aLabel;
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski /*  #i26224#
199*b1cdbd2cSJim Jagielski     When typing file names with drive letter but without '\'
200*b1cdbd2cSJim Jagielski     in the "File name" box of the FileOpen dialog the FileOpen
201*b1cdbd2cSJim Jagielski     dialog makes strange paths out of them e.g. "d:.\test.sxw".
202*b1cdbd2cSJim Jagielski     Such file names will not be accepted by sal so we fix these
203*b1cdbd2cSJim Jagielski     somehow broken paths here. */
MatchFixBrokenPath(const OUString & path)204*b1cdbd2cSJim Jagielski OUString MatchFixBrokenPath(const OUString& path)
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski     OSL_ASSERT(path.getLength() >= 4);
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski     if (path[1] == ':' && path[2] == '.' && path[3] == '\\')
209*b1cdbd2cSJim Jagielski     {
210*b1cdbd2cSJim Jagielski         // skip the '.'
211*b1cdbd2cSJim Jagielski         return (path.copy(0,2) + path.copy(3));
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski     return path;
214*b1cdbd2cSJim Jagielski }
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------------------
217*b1cdbd2cSJim Jagielski //
218*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------------------
trimTrailingSpaces(const::rtl::OUString & rString)219*b1cdbd2cSJim Jagielski static ::rtl::OUString trimTrailingSpaces(const ::rtl::OUString& rString)
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     rtl::OUString aResult(rString);
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski     sal_Int32 nIndex = rString.lastIndexOf(' ');
224*b1cdbd2cSJim Jagielski     if (nIndex == rString.getLength()-1)
225*b1cdbd2cSJim Jagielski     {
226*b1cdbd2cSJim Jagielski         while (nIndex >= 0 && rString[nIndex] == ' ')
227*b1cdbd2cSJim Jagielski             nIndex--;
228*b1cdbd2cSJim Jagielski         if (nIndex >= 0)
229*b1cdbd2cSJim Jagielski             aResult = rString.copy(0,nIndex+1);
230*b1cdbd2cSJim Jagielski         else
231*b1cdbd2cSJim Jagielski             aResult = ::rtl::OUString();
232*b1cdbd2cSJim Jagielski     }
233*b1cdbd2cSJim Jagielski     return aResult;
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski 
getFiles(CFileOpenDialog * aFileOpenDialog)236*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL CNonExecuteFilePickerState::getFiles( CFileOpenDialog* aFileOpenDialog )
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski     OSL_PRECOND( aFileOpenDialog, "invalid parameter" );
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski     Sequence< OUString > aFilePathList;
241*b1cdbd2cSJim Jagielski     OUString aFilePathURL;
242*b1cdbd2cSJim Jagielski     OUString aFilePath;
243*b1cdbd2cSJim Jagielski     ::osl::FileBase::RC rc;
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski     aFilePath = aFileOpenDialog->getFullFileName( );
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     if ( aFilePath.getLength( ) )
248*b1cdbd2cSJim Jagielski     {
249*b1cdbd2cSJim Jagielski         // tokenize the returned string and copy the
250*b1cdbd2cSJim Jagielski         // sub-strings separately into a sequence
251*b1cdbd2cSJim Jagielski         const sal_Unicode* pTemp = aFilePath.getStr();
252*b1cdbd2cSJim Jagielski         const sal_Unicode* pStrEnd = pTemp + aFilePath.getLength();
253*b1cdbd2cSJim Jagielski         sal_uInt32 lSubStr;
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski         while (pTemp < pStrEnd)
256*b1cdbd2cSJim Jagielski         {
257*b1cdbd2cSJim Jagielski             // detect the length of the next sub string
258*b1cdbd2cSJim Jagielski             lSubStr = rtl_ustr_getLength(pTemp);
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski             aFilePathList.realloc(aFilePathList.getLength() + 1);
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski             aFilePathList[aFilePathList.getLength() - 1] =
263*b1cdbd2cSJim Jagielski                 MatchFixBrokenPath(OUString(pTemp, lSubStr));
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski             pTemp += (lSubStr + 1);
266*b1cdbd2cSJim Jagielski         }
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski         // change all entries to file URLs
269*b1cdbd2cSJim Jagielski         sal_Int32 lenFileList = aFilePathList.getLength( );
270*b1cdbd2cSJim Jagielski 		OSL_ASSERT( lenFileList >= 1 );
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski         for ( sal_Int32 i = 0; i < lenFileList; i++ )
273*b1cdbd2cSJim Jagielski         {
274*b1cdbd2cSJim Jagielski 			aFilePath = trimTrailingSpaces(aFilePathList[i]);
275*b1cdbd2cSJim Jagielski 			rc = ::osl::FileBase::getFileURLFromSystemPath(
276*b1cdbd2cSJim Jagielski                 aFilePath, aFilePathURL );
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski             // we do return all or nothing, that means
279*b1cdbd2cSJim Jagielski             // in case of failures we destroy the sequence
280*b1cdbd2cSJim Jagielski             // and return an empty sequence
281*b1cdbd2cSJim Jagielski             if ( rc != ::osl::FileBase::E_None )
282*b1cdbd2cSJim Jagielski             {
283*b1cdbd2cSJim Jagielski                 aFilePathList.realloc( 0 );
284*b1cdbd2cSJim Jagielski                 break;
285*b1cdbd2cSJim Jagielski             }
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski             aFilePathList[i] = aFilePathURL;
288*b1cdbd2cSJim Jagielski         }
289*b1cdbd2cSJim Jagielski     }
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski     return aFilePathList;
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski //---------------------------------------------
295*b1cdbd2cSJim Jagielski //
296*b1cdbd2cSJim Jagielski //---------------------------------------------
297*b1cdbd2cSJim Jagielski 
getDisplayDirectory(CFileOpenDialog * aFileOpenDialog)298*b1cdbd2cSJim Jagielski OUString SAL_CALL CNonExecuteFilePickerState::getDisplayDirectory( CFileOpenDialog* aFileOpenDialog )
299*b1cdbd2cSJim Jagielski {
300*b1cdbd2cSJim Jagielski     OSL_PRECOND( aFileOpenDialog, "invalid parameter" );
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski     OUString pathURL;
303*b1cdbd2cSJim Jagielski     OUString displayDir;
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski     displayDir = aFileOpenDialog->getLastDisplayDirectory( );
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 	if ( displayDir.getLength( ) )
308*b1cdbd2cSJim Jagielski         ::osl::FileBase::getFileURLFromSystemPath( displayDir, pathURL );
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski 	return pathURL;
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski //---------------------------------------------
314*b1cdbd2cSJim Jagielski //
315*b1cdbd2cSJim Jagielski //---------------------------------------------
316*b1cdbd2cSJim Jagielski 
reset()317*b1cdbd2cSJim Jagielski void SAL_CALL CNonExecuteFilePickerState::reset( )
318*b1cdbd2cSJim Jagielski {
319*b1cdbd2cSJim Jagielski     CControlCommand* nextCommand;
320*b1cdbd2cSJim Jagielski     CControlCommand* currentCommand = m_FirstControlCommand;
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski     while( currentCommand )
323*b1cdbd2cSJim Jagielski     {
324*b1cdbd2cSJim Jagielski         nextCommand = currentCommand->getNextCommand( );
325*b1cdbd2cSJim Jagielski         delete currentCommand;
326*b1cdbd2cSJim Jagielski         currentCommand = nextCommand;
327*b1cdbd2cSJim Jagielski     }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski     m_FirstControlCommand = NULL;
330*b1cdbd2cSJim Jagielski }
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski //---------------------------------------------
333*b1cdbd2cSJim Jagielski //
334*b1cdbd2cSJim Jagielski //---------------------------------------------
335*b1cdbd2cSJim Jagielski 
getControlCommand() const336*b1cdbd2cSJim Jagielski CControlCommand* SAL_CALL CNonExecuteFilePickerState::getControlCommand( ) const
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski     return m_FirstControlCommand;
339*b1cdbd2cSJim Jagielski }
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski //---------------------------------------------
342*b1cdbd2cSJim Jagielski // we append new control commands to the end
343*b1cdbd2cSJim Jagielski // of the list so that we are sure the commands
344*b1cdbd2cSJim Jagielski // will be executed as the client issued it
345*b1cdbd2cSJim Jagielski //---------------------------------------------
346*b1cdbd2cSJim Jagielski 
addControlCommand(CControlCommand * aControlCommand)347*b1cdbd2cSJim Jagielski void SAL_CALL CNonExecuteFilePickerState::addControlCommand( CControlCommand* aControlCommand )
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski     OSL_ASSERT( aControlCommand );
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski     if ( NULL == m_FirstControlCommand )
352*b1cdbd2cSJim Jagielski     {
353*b1cdbd2cSJim Jagielski         m_FirstControlCommand = aControlCommand;
354*b1cdbd2cSJim Jagielski     }
355*b1cdbd2cSJim Jagielski     else
356*b1cdbd2cSJim Jagielski     {
357*b1cdbd2cSJim Jagielski         CControlCommand* pNextControlCommand = m_FirstControlCommand;
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski         while ( pNextControlCommand->getNextCommand( ) != NULL )
360*b1cdbd2cSJim Jagielski             pNextControlCommand = pNextControlCommand->getNextCommand( );
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski         pNextControlCommand->setNextCommand( aControlCommand );
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski }
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski //#######################################################################
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski //---------------------------------------------
369*b1cdbd2cSJim Jagielski //
370*b1cdbd2cSJim Jagielski //---------------------------------------------
371*b1cdbd2cSJim Jagielski 
CExecuteFilePickerState(HWND hwndDlg)372*b1cdbd2cSJim Jagielski CExecuteFilePickerState::CExecuteFilePickerState( HWND hwndDlg ) :
373*b1cdbd2cSJim Jagielski     m_hwndDlg( hwndDlg )
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski }
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski //---------------------------------------------
378*b1cdbd2cSJim Jagielski //
379*b1cdbd2cSJim Jagielski //---------------------------------------------
380*b1cdbd2cSJim Jagielski 
setValue(sal_Int16 aControlId,sal_Int16 aControlAction,const Any & aValue)381*b1cdbd2cSJim Jagielski void SAL_CALL CExecuteFilePickerState::setValue( sal_Int16 aControlId, sal_Int16 aControlAction, const Any& aValue )
382*b1cdbd2cSJim Jagielski {
383*b1cdbd2cSJim Jagielski     // we do not support SET_HELP_URL/GET_HELP_URL
384*b1cdbd2cSJim Jagielski     if ( com::sun::star::ui::dialogs::ControlActions::SET_HELP_URL == aControlAction )
385*b1cdbd2cSJim Jagielski         return;
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski     HWND hwndCtrl = GetHwndDlgItem( aControlId );
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 	// the filter listbox can be manipulated via this
390*b1cdbd2cSJim Jagielski 	// method the caller should use XFilterManager
391*b1cdbd2cSJim Jagielski     if ( !hwndCtrl || (aControlId == LISTBOX_FILTER) )
392*b1cdbd2cSJim Jagielski     {
393*b1cdbd2cSJim Jagielski         OSL_ENSURE( sal_False, "invalid control id" );
394*b1cdbd2cSJim Jagielski         return;
395*b1cdbd2cSJim Jagielski     }
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski     CTRL_CLASS aCtrlClass = GetCtrlClass( hwndCtrl );
398*b1cdbd2cSJim Jagielski     if ( UNKNOWN == aCtrlClass )
399*b1cdbd2cSJim Jagielski     {
400*b1cdbd2cSJim Jagielski         OSL_ENSURE( sal_False, "unsupported control class" );
401*b1cdbd2cSJim Jagielski         return;
402*b1cdbd2cSJim Jagielski     }
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski     CTRL_SETVALUE_FUNCTION_T lpfnSetValue =
405*b1cdbd2cSJim Jagielski         GetCtrlSetValueFunction( aCtrlClass, aControlAction );
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski     if ( !lpfnSetValue )
408*b1cdbd2cSJim Jagielski     {
409*b1cdbd2cSJim Jagielski         OSL_ENSURE( sal_False, "unsupported control action" );
410*b1cdbd2cSJim Jagielski         return;
411*b1cdbd2cSJim Jagielski     }
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski     // the function that we call should throw an IllegalArgumentException if
414*b1cdbd2cSJim Jagielski     // the given value is invalid or empty, that's why we provide a Reference
415*b1cdbd2cSJim Jagielski     // to an XInterface and a argument position
416*b1cdbd2cSJim Jagielski     lpfnSetValue( hwndCtrl, aValue, Reference< XInterface >( ), 3 );
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski //---------------------------------------------
420*b1cdbd2cSJim Jagielski //
421*b1cdbd2cSJim Jagielski //---------------------------------------------
422*b1cdbd2cSJim Jagielski 
getValue(sal_Int16 aControlId,sal_Int16 aControlAction)423*b1cdbd2cSJim Jagielski Any SAL_CALL CExecuteFilePickerState::getValue( sal_Int16 aControlId, sal_Int16 aControlAction )
424*b1cdbd2cSJim Jagielski {
425*b1cdbd2cSJim Jagielski     // we do not support SET_HELP_URL/GET_HELP_URL
426*b1cdbd2cSJim Jagielski     if ( com::sun::star::ui::dialogs::ControlActions::GET_HELP_URL == aControlAction )
427*b1cdbd2cSJim Jagielski         return Any( );
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski     HWND hwndCtrl = GetHwndDlgItem( aControlId );
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 	// the filter listbox can be manipulated via this
432*b1cdbd2cSJim Jagielski 	// method the caller should use XFilterManager
433*b1cdbd2cSJim Jagielski     if ( !hwndCtrl || (aControlId == LISTBOX_FILTER) )
434*b1cdbd2cSJim Jagielski     {
435*b1cdbd2cSJim Jagielski         OSL_ENSURE( sal_False, "invalid control id" );
436*b1cdbd2cSJim Jagielski         return Any( );
437*b1cdbd2cSJim Jagielski     }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski     CTRL_CLASS aCtrlClass = GetCtrlClass( hwndCtrl );
440*b1cdbd2cSJim Jagielski     if ( UNKNOWN == aCtrlClass )
441*b1cdbd2cSJim Jagielski     {
442*b1cdbd2cSJim Jagielski         OSL_ENSURE( sal_False, "unsupported control class" );
443*b1cdbd2cSJim Jagielski         return Any( );
444*b1cdbd2cSJim Jagielski     }
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski     CTRL_GETVALUE_FUNCTION_T lpfnGetValue =
447*b1cdbd2cSJim Jagielski         GetCtrlGetValueFunction( aCtrlClass, aControlAction );
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski     if ( !lpfnGetValue )
450*b1cdbd2cSJim Jagielski     {
451*b1cdbd2cSJim Jagielski         OSL_ENSURE( sal_False, "unsupported control action" );
452*b1cdbd2cSJim Jagielski         return Any( );
453*b1cdbd2cSJim Jagielski     }
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski     return lpfnGetValue( hwndCtrl );
456*b1cdbd2cSJim Jagielski }
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski //---------------------------------------------
459*b1cdbd2cSJim Jagielski //
460*b1cdbd2cSJim Jagielski //---------------------------------------------
461*b1cdbd2cSJim Jagielski 
enableControl(sal_Int16 aControlId,sal_Bool bEnable)462*b1cdbd2cSJim Jagielski void SAL_CALL CExecuteFilePickerState::enableControl( sal_Int16 aControlId, sal_Bool bEnable )
463*b1cdbd2cSJim Jagielski {
464*b1cdbd2cSJim Jagielski     HWND hwndCtrl = GetHwndDlgItem( aControlId );
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski     OSL_ENSURE( IsWindow( hwndCtrl ), "invalid element id");
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski     EnableWindow( hwndCtrl, bEnable );
469*b1cdbd2cSJim Jagielski }
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski //---------------------------------------------
472*b1cdbd2cSJim Jagielski //
473*b1cdbd2cSJim Jagielski //---------------------------------------------
474*b1cdbd2cSJim Jagielski 
setLabel(sal_Int16 aControlId,const OUString & aLabel)475*b1cdbd2cSJim Jagielski void SAL_CALL CExecuteFilePickerState::setLabel( sal_Int16 aControlId, const OUString& aLabel )
476*b1cdbd2cSJim Jagielski {
477*b1cdbd2cSJim Jagielski     HWND hwndCtrl = GetHwndDlgItem( aControlId );
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski     OSL_ENSURE( IsWindow( hwndCtrl ), "invalid element id");
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski     if ( IsListboxControl( hwndCtrl ) )
482*b1cdbd2cSJim Jagielski         hwndCtrl = GetListboxLabelItem( aControlId );
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski     OUString aWinLabel = SOfficeToWindowsLabel( aLabel );
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski 	// somewhat risky because we don't know if OUString
487*b1cdbd2cSJim Jagielski 	// has a terminating '\0'
488*b1cdbd2cSJim Jagielski     SetWindowText( hwndCtrl, reinterpret_cast<LPCTSTR>(aWinLabel.getStr( )) );
489*b1cdbd2cSJim Jagielski }
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski //---------------------------------------------
492*b1cdbd2cSJim Jagielski //
493*b1cdbd2cSJim Jagielski //---------------------------------------------
494*b1cdbd2cSJim Jagielski 
getLabel(sal_Int16 aControlId)495*b1cdbd2cSJim Jagielski OUString SAL_CALL CExecuteFilePickerState::getLabel( sal_Int16 aControlId )
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski     HWND hwndCtrl = GetHwndDlgItem( aControlId );
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski     OSL_ENSURE( IsWindow( hwndCtrl ), "invalid element id");
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski     if ( IsListboxControl( hwndCtrl ) )
502*b1cdbd2cSJim Jagielski         hwndCtrl = GetListboxLabelItem( aControlId );
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski     sal_Unicode aLabel[MAX_LABEL];
505*b1cdbd2cSJim Jagielski     int nRet = GetWindowText( hwndCtrl, reinterpret_cast<LPTSTR>(aLabel), MAX_LABEL );
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski     OUString ctrlLabel;
508*b1cdbd2cSJim Jagielski     if ( nRet )
509*b1cdbd2cSJim Jagielski     {
510*b1cdbd2cSJim Jagielski         ctrlLabel = OUString( aLabel, rtl_ustr_getLength( aLabel ) );
511*b1cdbd2cSJim Jagielski         ctrlLabel = WindowsToSOfficeLabel( aLabel );
512*b1cdbd2cSJim Jagielski     }
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski     return ctrlLabel;
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski //---------------------------------------------
518*b1cdbd2cSJim Jagielski //
519*b1cdbd2cSJim Jagielski //---------------------------------------------
520*b1cdbd2cSJim Jagielski 
getFiles(CFileOpenDialog * aFileOpenDialog)521*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL CExecuteFilePickerState::getFiles( CFileOpenDialog* aFileOpenDialog )
522*b1cdbd2cSJim Jagielski {
523*b1cdbd2cSJim Jagielski     OSL_POSTCOND( aFileOpenDialog, "invalid parameter" );
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski     Sequence< OUString > aFilePathList;
526*b1cdbd2cSJim Jagielski     OUString aFilePathURL;
527*b1cdbd2cSJim Jagielski     OUString aFilePath;
528*b1cdbd2cSJim Jagielski     ::osl::FileBase::RC rc;
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski 	// in execution mode getFullFileName doesn't
531*b1cdbd2cSJim Jagielski 	// return anything, so we must use another way
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski     // returns the currently selected file(s)
534*b1cdbd2cSJim Jagielski     // including path information
535*b1cdbd2cSJim Jagielski     aFilePath = aFileOpenDialog->getCurrentFilePath( );
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski 	// if multiple files are selected or the user
538*b1cdbd2cSJim Jagielski 	// typed anything that doesn't seem to be a valid
539*b1cdbd2cSJim Jagielski 	// file name getFileURLFromSystemPath fails
540*b1cdbd2cSJim Jagielski 	// and we return an empty file list
541*b1cdbd2cSJim Jagielski     rc = ::osl::FileBase::getFileURLFromSystemPath(
542*b1cdbd2cSJim Jagielski         aFilePath, aFilePathURL );
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski     if ( ::osl::FileBase::E_None == rc )
545*b1cdbd2cSJim Jagielski     {
546*b1cdbd2cSJim Jagielski         aFilePathList.realloc( 1 );
547*b1cdbd2cSJim Jagielski         aFilePathList[0] = aFilePathURL;
548*b1cdbd2cSJim Jagielski     }
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski     return aFilePathList;
551*b1cdbd2cSJim Jagielski }
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski //---------------------------------------------
554*b1cdbd2cSJim Jagielski //
555*b1cdbd2cSJim Jagielski //---------------------------------------------
556*b1cdbd2cSJim Jagielski 
getDisplayDirectory(CFileOpenDialog * aFileOpenDialog)557*b1cdbd2cSJim Jagielski OUString SAL_CALL CExecuteFilePickerState::getDisplayDirectory( CFileOpenDialog* aFileOpenDialog )
558*b1cdbd2cSJim Jagielski {
559*b1cdbd2cSJim Jagielski     OSL_POSTCOND( aFileOpenDialog, "invalid parameter" );
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski     OUString pathURL;
562*b1cdbd2cSJim Jagielski     OUString displayDir;
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski     displayDir = aFileOpenDialog->getCurrentFolderPath( );
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski     if ( displayDir.getLength( ) )
567*b1cdbd2cSJim Jagielski         ::osl::FileBase::getFileURLFromSystemPath( displayDir, pathURL );
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski 	return pathURL;
570*b1cdbd2cSJim Jagielski }
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski //---------------------------------------------
573*b1cdbd2cSJim Jagielski //
574*b1cdbd2cSJim Jagielski //---------------------------------------------
575*b1cdbd2cSJim Jagielski 
initFilePickerControls(CControlCommand * firstControlCommand)576*b1cdbd2cSJim Jagielski void SAL_CALL CExecuteFilePickerState::initFilePickerControls( CControlCommand* firstControlCommand )
577*b1cdbd2cSJim Jagielski {
578*b1cdbd2cSJim Jagielski     CControlCommand* aControlCommand = firstControlCommand;
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski     while ( aControlCommand )
581*b1cdbd2cSJim Jagielski     {
582*b1cdbd2cSJim Jagielski         aControlCommand->exec( this );
583*b1cdbd2cSJim Jagielski         aControlCommand = aControlCommand->getNextCommand( );
584*b1cdbd2cSJim Jagielski     }
585*b1cdbd2cSJim Jagielski }
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski //---------------------------------------------
588*b1cdbd2cSJim Jagielski //
589*b1cdbd2cSJim Jagielski //---------------------------------------------
590*b1cdbd2cSJim Jagielski 
cacheControlState(HWND hwndControl,CFilePickerState * aNonExecFilePickerState)591*b1cdbd2cSJim Jagielski void SAL_CALL CExecuteFilePickerState::cacheControlState( HWND hwndControl, CFilePickerState* aNonExecFilePickerState )
592*b1cdbd2cSJim Jagielski {
593*b1cdbd2cSJim Jagielski     OSL_ENSURE( hwndControl && aNonExecFilePickerState, "invalid parameters" );
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski     CTRL_CLASS aCtrlClass = GetCtrlClass( hwndControl );
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski     sal_Int16 aControlAction;
598*b1cdbd2cSJim Jagielski     CTRL_GETVALUE_FUNCTION_T lpfnGetValue;
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski     if ( CHECKBOX == aCtrlClass )
601*b1cdbd2cSJim Jagielski     {
602*b1cdbd2cSJim Jagielski         aControlAction = 0;
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski         lpfnGetValue = GetCtrlGetValueFunction( aCtrlClass, aControlAction );
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski         OSL_ASSERT( lpfnGetValue );
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski         aNonExecFilePickerState->setValue(
609*b1cdbd2cSJim Jagielski             sal::static_int_cast< sal_Int16 >( GetDlgCtrlID( hwndControl ) ),
610*b1cdbd2cSJim Jagielski             aControlAction,
611*b1cdbd2cSJim Jagielski             lpfnGetValue( hwndControl ) );
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski         aNonExecFilePickerState->setLabel(
614*b1cdbd2cSJim Jagielski             sal::static_int_cast< sal_Int16 >( GetDlgCtrlID( hwndControl ) ),
615*b1cdbd2cSJim Jagielski             getLabel(
616*b1cdbd2cSJim Jagielski                 sal::static_int_cast< sal_Int16 >(
617*b1cdbd2cSJim Jagielski                     GetDlgCtrlID( hwndControl ) ) ) );
618*b1cdbd2cSJim Jagielski     }
619*b1cdbd2cSJim Jagielski     else if ( LISTBOX == aCtrlClass )
620*b1cdbd2cSJim Jagielski     {
621*b1cdbd2cSJim Jagielski         // for listboxes we save only the
622*b1cdbd2cSJim Jagielski         // last selected item and the last
623*b1cdbd2cSJim Jagielski         // selected item index
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski         aControlAction = GET_SELECTED_ITEM;
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski         lpfnGetValue = GetCtrlGetValueFunction( aCtrlClass, aControlAction );
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski         aNonExecFilePickerState->setValue(
630*b1cdbd2cSJim Jagielski             sal::static_int_cast< sal_Int16 >( GetDlgCtrlID( hwndControl ) ),
631*b1cdbd2cSJim Jagielski             aControlAction,
632*b1cdbd2cSJim Jagielski             lpfnGetValue( hwndControl ) );
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski         aControlAction = ::com::sun::star::ui::dialogs::ControlActions::GET_SELECTED_ITEM_INDEX;
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski         lpfnGetValue = GetCtrlGetValueFunction( aCtrlClass, aControlAction );
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski         aNonExecFilePickerState->setValue(
639*b1cdbd2cSJim Jagielski             sal::static_int_cast< sal_Int16 >( GetDlgCtrlID( hwndControl ) ),
640*b1cdbd2cSJim Jagielski             aControlAction,
641*b1cdbd2cSJim Jagielski             lpfnGetValue( hwndControl ) );
642*b1cdbd2cSJim Jagielski     }
643*b1cdbd2cSJim Jagielski }
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski //---------------------------------------------
646*b1cdbd2cSJim Jagielski //
647*b1cdbd2cSJim Jagielski //---------------------------------------------
648*b1cdbd2cSJim Jagielski 
setHwnd(HWND hwndDlg)649*b1cdbd2cSJim Jagielski void SAL_CALL CExecuteFilePickerState::setHwnd( HWND hwndDlg )
650*b1cdbd2cSJim Jagielski {
651*b1cdbd2cSJim Jagielski     m_hwndDlg = hwndDlg;
652*b1cdbd2cSJim Jagielski }
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski //---------------------------------------------
655*b1cdbd2cSJim Jagielski //
656*b1cdbd2cSJim Jagielski //---------------------------------------------
657*b1cdbd2cSJim Jagielski 
IsListboxControl(HWND hwndControl) const658*b1cdbd2cSJim Jagielski inline sal_Bool SAL_CALL CExecuteFilePickerState::IsListboxControl( HWND hwndControl ) const
659*b1cdbd2cSJim Jagielski {
660*b1cdbd2cSJim Jagielski     OSL_PRECOND( IsWindow( hwndControl ), "invalid parameter" );
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski     CTRL_CLASS aCtrlClass = GetCtrlClass( hwndControl );
663*b1cdbd2cSJim Jagielski     return ( LISTBOX == aCtrlClass );
664*b1cdbd2cSJim Jagielski }
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski //---------------------------------------------
667*b1cdbd2cSJim Jagielski // because listboxes (comboboxes) and their labels
668*b1cdbd2cSJim Jagielski // are seperated we have to translate the listbox
669*b1cdbd2cSJim Jagielski // id to their corresponding label id
670*b1cdbd2cSJim Jagielski // the convention is that the label id of a listbox
671*b1cdbd2cSJim Jagielski // is the id of the listbox + 100
672*b1cdbd2cSJim Jagielski //---------------------------------------------
673*b1cdbd2cSJim Jagielski 
ListboxIdToListboxLabelId(sal_Int16 aListboxId) const674*b1cdbd2cSJim Jagielski inline sal_Int16 SAL_CALL CExecuteFilePickerState::ListboxIdToListboxLabelId( sal_Int16 aListboxId ) const
675*b1cdbd2cSJim Jagielski {
676*b1cdbd2cSJim Jagielski     return ( aListboxId + LISTBOX_LABEL_OFFSET );
677*b1cdbd2cSJim Jagielski }
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski //---------------------------------------------
680*b1cdbd2cSJim Jagielski //
681*b1cdbd2cSJim Jagielski //---------------------------------------------
682*b1cdbd2cSJim Jagielski 
GetListboxLabelItem(sal_Int16 aControlId) const683*b1cdbd2cSJim Jagielski inline HWND SAL_CALL CExecuteFilePickerState::GetListboxLabelItem( sal_Int16 aControlId ) const
684*b1cdbd2cSJim Jagielski {
685*b1cdbd2cSJim Jagielski     sal_Int16 aLabelId = ListboxIdToListboxLabelId( aControlId );
686*b1cdbd2cSJim Jagielski     HWND hwndCtrl = GetHwndDlgItem( aLabelId );
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski     OSL_ASSERT( IsWindow( hwndCtrl ) );
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski     return hwndCtrl;
691*b1cdbd2cSJim Jagielski }
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski //---------------------------------------------
694*b1cdbd2cSJim Jagielski //
695*b1cdbd2cSJim Jagielski //---------------------------------------------
696*b1cdbd2cSJim Jagielski 
GetHwndDlgItem(sal_Int16 aControlId,sal_Bool bIncludeStdCtrls) const697*b1cdbd2cSJim Jagielski HWND SAL_CALL CExecuteFilePickerState::GetHwndDlgItem( sal_Int16 aControlId, sal_Bool bIncludeStdCtrls ) const
698*b1cdbd2cSJim Jagielski {
699*b1cdbd2cSJim Jagielski     OSL_ENSURE( IsWindow( m_hwndDlg ), "no valid parent window set before" );
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski     HWND hwndCtrl = GetDlgItem( m_hwndDlg, aControlId );
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski     // maybe it's a control of the dialog itself for instance
704*b1cdbd2cSJim Jagielski     // the ok and cancel button
705*b1cdbd2cSJim Jagielski     if ( !hwndCtrl && bIncludeStdCtrls )
706*b1cdbd2cSJim Jagielski     {
707*b1cdbd2cSJim Jagielski 		hwndCtrl = GetDlgItem(
708*b1cdbd2cSJim Jagielski             GetParent( m_hwndDlg ),
709*b1cdbd2cSJim Jagielski             CommonFilePickerCtrlIdToWinFileOpenCtrlId( aControlId ) );
710*b1cdbd2cSJim Jagielski     }
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski 	return hwndCtrl;
713*b1cdbd2cSJim Jagielski }
714