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