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 // includes *******************************************************************
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "iodlgimp.hxx"
30*b1cdbd2cSJim Jagielski #include "svtools/headbar.hxx"
31*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
32*b1cdbd2cSJim Jagielski #include <tools/wldcrd.hxx>
33*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/menu.hxx>
35*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
36*b1cdbd2cSJim Jagielski #include <vcl/lstbox.hxx>
37*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
38*b1cdbd2cSJim Jagielski // #97148# ---------------
39*b1cdbd2cSJim Jagielski #include "svl/ctypeitm.hxx"
40*b1cdbd2cSJim Jagielski #include "svl/eitem.hxx"
41*b1cdbd2cSJim Jagielski #include "unotools/viewoptions.hxx"
42*b1cdbd2cSJim Jagielski #include "svtools/fileview.hxx"
43*b1cdbd2cSJim Jagielski #include "svtools/inettbc.hxx"
44*b1cdbd2cSJim Jagielski #include "iodlg.hxx"
45*b1cdbd2cSJim Jagielski #include "iodlg.hrc"
46*b1cdbd2cSJim Jagielski #include "svtools/imagemgr.hxx"
47*b1cdbd2cSJim Jagielski #include <unotools/localfilehelper.hxx>
48*b1cdbd2cSJim Jagielski #include "unotools/useroptions.hxx"
49*b1cdbd2cSJim Jagielski #include "rtl/instance.hxx"
50*b1cdbd2cSJim Jagielski #include <svl/svl.hrc>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #define _SVSTDARR_STRINGSSORTDTOR
53*b1cdbd2cSJim Jagielski #define _SVSTDARR_STRINGSDTOR
54*b1cdbd2cSJim Jagielski #define _SVSTDARR_USHORTS
55*b1cdbd2cSJim Jagielski #include "svl/svstdarr.hxx"
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
59*b1cdbd2cSJim Jagielski using namespace ::utl;
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski // some stuff for easier changes for SvtViewOptions
62*b1cdbd2cSJim Jagielski static const sal_Char*		pViewOptDataName = "dialog data";
63*b1cdbd2cSJim Jagielski #define VIEWOPT_DATANAME	::rtl::OUString::createFromAscii( pViewOptDataName )
64*b1cdbd2cSJim Jagielski 
SetViewOptUserItem(SvtViewOptions & rOpt,const String & rData)65*b1cdbd2cSJim Jagielski static inline void SetViewOptUserItem( SvtViewOptions& rOpt, const String& rData )
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski 	rOpt.SetUserItem( VIEWOPT_DATANAME, makeAny( ::rtl::OUString( rData ) ) );
68*b1cdbd2cSJim Jagielski }
69*b1cdbd2cSJim Jagielski 
GetViewOptUserItem(const SvtViewOptions & rOpt)70*b1cdbd2cSJim Jagielski static inline String GetViewOptUserItem( const SvtViewOptions& rOpt )
71*b1cdbd2cSJim Jagielski {
72*b1cdbd2cSJim Jagielski 	Any aAny( rOpt.GetUserItem( VIEWOPT_DATANAME ) );
73*b1cdbd2cSJim Jagielski 	::rtl::OUString aUserData;
74*b1cdbd2cSJim Jagielski 	aAny >>= aUserData;
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 	return String( aUserData );
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski // defines f"ur den Style der BrowseBox
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski #define STYLE_MULTI_SELECTION	\
83*b1cdbd2cSJim Jagielski 	CNTVIEWSTYLE_NODE_BUTTONS | \
84*b1cdbd2cSJim Jagielski 	CNTVIEWSTYLE_NODE_BUTTONS_AT_ROOT | \
85*b1cdbd2cSJim Jagielski 	CNTVIEWSTYLE_SHOW_MESSAGES | \
86*b1cdbd2cSJim Jagielski 	CNTVIEWSTYLE_SHOW_FOLDERS | \
87*b1cdbd2cSJim Jagielski 	CNTVIEWSTYLE_NO_SMARTHIGHLIGHT | \
88*b1cdbd2cSJim Jagielski 	CNTVIEWSTYLE_HIDE_OPENMENU | \
89*b1cdbd2cSJim Jagielski 	CNTVIEWSTYLE_DEFAULT_APPEARANCE | \
90*b1cdbd2cSJim Jagielski 	CNTVIEWSTYLE_SORT_BY_FOLDER
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski #define STYLE_SINGLE_SELECTION	\
93*b1cdbd2cSJim Jagielski 	STYLE_MULTI_SELECTION | CNTVIEWSTYLE_SINGLE_SELECTION
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski #define BOOL_NOT_INITIALIZE		((sal_Bool)2)
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski //*****************************************************************************
98*b1cdbd2cSJim Jagielski // ResMgrHolder / SvtSimpleResId
99*b1cdbd2cSJim Jagielski //*****************************************************************************
100*b1cdbd2cSJim Jagielski namespace
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski 	struct ResMgrHolder
103*b1cdbd2cSJim Jagielski 	{
operator ()__anon3b34a2430111::ResMgrHolder104*b1cdbd2cSJim Jagielski 		ResMgr * operator ()()
105*b1cdbd2cSJim Jagielski 		{
106*b1cdbd2cSJim Jagielski 			return ResMgr::CreateResMgr (CREATEVERSIONRESMGR_NAME(svl));
107*b1cdbd2cSJim Jagielski 		}
getOrCreate__anon3b34a2430111::ResMgrHolder108*b1cdbd2cSJim Jagielski 		static ResMgr * getOrCreate()
109*b1cdbd2cSJim Jagielski 		{
110*b1cdbd2cSJim Jagielski 			return rtl_Instance<
111*b1cdbd2cSJim Jagielski 				ResMgr, ResMgrHolder,
112*b1cdbd2cSJim Jagielski 				osl::MutexGuard, osl::GetGlobalMutex >::create (
113*b1cdbd2cSJim Jagielski 					ResMgrHolder(), osl::GetGlobalMutex());
114*b1cdbd2cSJim Jagielski 		}
115*b1cdbd2cSJim Jagielski 	};
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	struct SvtSimpleResId : public ResId
118*b1cdbd2cSJim Jagielski 	{
SvtSimpleResId__anon3b34a2430111::SvtSimpleResId119*b1cdbd2cSJim Jagielski 		SvtSimpleResId (sal_uInt16 nId) : ResId (nId, *ResMgrHolder::getOrCreate()) {}
120*b1cdbd2cSJim Jagielski 	};
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski //*****************************************************************************
124*b1cdbd2cSJim Jagielski // SvtFileDialogFilter_Impl
125*b1cdbd2cSJim Jagielski //*****************************************************************************
126*b1cdbd2cSJim Jagielski 
DBG_NAME(SvtFileDialogFilter_Impl)127*b1cdbd2cSJim Jagielski DBG_NAME( SvtFileDialogFilter_Impl )
128*b1cdbd2cSJim Jagielski SvtFileDialogFilter_Impl::SvtFileDialogFilter_Impl( const String& rName, const String& rType )
129*b1cdbd2cSJim Jagielski 	:m_aName( rName )
130*b1cdbd2cSJim Jagielski 	,m_aType( rType )
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski 	DBG_CTOR( SvtFileDialogFilter_Impl, NULL );
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	m_aType.ToLowerAscii();
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski //*****************************************************************************
138*b1cdbd2cSJim Jagielski 
~SvtFileDialogFilter_Impl()139*b1cdbd2cSJim Jagielski SvtFileDialogFilter_Impl::~SvtFileDialogFilter_Impl()
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski 	DBG_DTOR( SvtFileDialogFilter_Impl, NULL );
142*b1cdbd2cSJim Jagielski }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski //*****************************************************************************
145*b1cdbd2cSJim Jagielski // SvtFileDialogFilterList_Impl
146*b1cdbd2cSJim Jagielski //*****************************************************************************
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski SV_IMPL_PTRARR( SvtFileDialogFilterList_Impl, SvtFileDialogFilter_Impl* );
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski //=============================================================================
151*b1cdbd2cSJim Jagielski //= SvtFileDialogURLSelector
152*b1cdbd2cSJim Jagielski //=============================================================================
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
SvtFileDialogURLSelector(SvtFileDialog * _pParent,const ResId & _rResId,sal_uInt16 _nButtonId)155*b1cdbd2cSJim Jagielski SvtFileDialogURLSelector::SvtFileDialogURLSelector( SvtFileDialog* _pParent, const ResId& _rResId, sal_uInt16 _nButtonId )
156*b1cdbd2cSJim Jagielski     :MenuButton ( _pParent, _rResId )
157*b1cdbd2cSJim Jagielski 	,m_pParent  ( _pParent )
158*b1cdbd2cSJim Jagielski     ,m_pMenu    ( new PopupMenu )
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski 	SetStyle( GetStyle() | WB_NOPOINTERFOCUS | WB_RECTSTYLE | WB_SMALLSTYLE );
161*b1cdbd2cSJim Jagielski 	SetModeImage( m_pParent->GetButtonImage( _nButtonId ) );
162*b1cdbd2cSJim Jagielski 	SetMenuMode( MENUBUTTON_MENUMODE_TIMED );
163*b1cdbd2cSJim Jagielski 	SetDropDown( PUSHBUTTON_DROPDOWN_TOOLBOX );
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
~SvtFileDialogURLSelector()167*b1cdbd2cSJim Jagielski SvtFileDialogURLSelector::~SvtFileDialogURLSelector()
168*b1cdbd2cSJim Jagielski {
169*b1cdbd2cSJim Jagielski 	delete m_pMenu;
170*b1cdbd2cSJim Jagielski }
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
OpenURL(const String & rURL)173*b1cdbd2cSJim Jagielski void SvtFileDialogURLSelector::OpenURL( const String& rURL )
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski 	INetURLObject aObj( rURL );
176*b1cdbd2cSJim Jagielski     DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "SvtFileDialogURLSelector::OpenURL: Invalid URL!" );
177*b1cdbd2cSJim Jagielski 	m_pParent->OpenURL_Impl( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
178*b1cdbd2cSJim Jagielski }
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
Activate()181*b1cdbd2cSJim Jagielski void SvtFileDialogURLSelector::Activate()
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski 	m_pMenu->Clear();
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     FillURLMenu( m_pMenu );
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 	SetPopupMenu( m_pMenu );
188*b1cdbd2cSJim Jagielski }
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski //=============================================================================
191*b1cdbd2cSJim Jagielski //= SvtUpButton_Impl
192*b1cdbd2cSJim Jagielski //=============================================================================
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
SvtUpButton_Impl(SvtFileDialog * pParent,const ResId & rResId)195*b1cdbd2cSJim Jagielski SvtUpButton_Impl::SvtUpButton_Impl( SvtFileDialog* pParent, const ResId& rResId )
196*b1cdbd2cSJim Jagielski     :SvtFileDialogURLSelector( pParent, rResId, IMG_FILEDLG_BTN_UP )
197*b1cdbd2cSJim Jagielski 	,_pURLs			         ( NULL )
198*b1cdbd2cSJim Jagielski {
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
~SvtUpButton_Impl()202*b1cdbd2cSJim Jagielski SvtUpButton_Impl::~SvtUpButton_Impl()
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski 	delete _pURLs;
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
FillURLMenu(PopupMenu * _pMenu)208*b1cdbd2cSJim Jagielski void SvtUpButton_Impl::FillURLMenu( PopupMenu* _pMenu )
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski 	SvtFileView* pBox = GetDialogParent()->GetView();
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 	sal_uInt16 nItemId = 1;
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	delete _pURLs;
215*b1cdbd2cSJim Jagielski 	_pURLs = new SvStringsDtor;
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 	// "Ubergeordnete Ebenen bestimmen.
218*b1cdbd2cSJim Jagielski 	INetURLObject aObject( pBox->GetViewURL() );
219*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = aObject.getSegmentCount();
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 	::svtools::VolumeInfo aVolInfo( sal_True /* volume */, sal_False /* remote */,
222*b1cdbd2cSJim Jagielski 									sal_False /* removable */, sal_False /* floppy */,
223*b1cdbd2cSJim Jagielski 									sal_False /* compact disk */ );
224*b1cdbd2cSJim Jagielski 	sal_Bool bIsHighContrast = pBox->GetSettings().GetStyleSettings().GetHighContrastMode();
225*b1cdbd2cSJim Jagielski 	Image aVolumeImage( SvFileInformationManager::GetFolderImage( aVolInfo, bIsHighContrast ) );
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 	while ( nCount >= 1 )
228*b1cdbd2cSJim Jagielski 	{
229*b1cdbd2cSJim Jagielski 		aObject.removeSegment();
230*b1cdbd2cSJim Jagielski 		String* pParentURL = new String( aObject.GetMainURL( INetURLObject::NO_DECODE ) );
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski         if ( GetDialogParent()->isUrlAllowed( *pParentURL ) )
233*b1cdbd2cSJim Jagielski         {
234*b1cdbd2cSJim Jagielski 		    String aTitle;
235*b1cdbd2cSJim Jagielski 		    // 97148# --------------------------------
236*b1cdbd2cSJim Jagielski 		    if ( !GetDialogParent()->ContentGetTitle( *pParentURL, aTitle ) || aTitle.Len() == 0 )
237*b1cdbd2cSJim Jagielski 			    aTitle = aObject.getName();
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 		    Image aImage = ( nCount > 1 ) // if nCount == 1 means workplace, which detects the wrong image
240*b1cdbd2cSJim Jagielski 			    ? SvFileInformationManager::GetImage( aObject, bIsHighContrast )
241*b1cdbd2cSJim Jagielski 			    : aVolumeImage;
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski             _pMenu->InsertItem( nItemId++, aTitle, aImage );
244*b1cdbd2cSJim Jagielski             _pURLs->Insert( pParentURL, _pURLs->Count() );
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski             if ( nCount == 1 )
247*b1cdbd2cSJim Jagielski             {
248*b1cdbd2cSJim Jagielski                 // adjust the title of the top level entry (the workspace)
249*b1cdbd2cSJim Jagielski                 _pMenu->SetItemText( --nItemId, SvtSimpleResId( STR_SVT_MIMETYPE_CNT_FSYSBOX ) );
250*b1cdbd2cSJim Jagielski             }
251*b1cdbd2cSJim Jagielski         }
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski         --nCount;
254*b1cdbd2cSJim Jagielski 	}
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
Select()258*b1cdbd2cSJim Jagielski void SvtUpButton_Impl::Select()
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski 	sal_uInt16 nId = GetCurItemId();
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	if ( nId )
263*b1cdbd2cSJim Jagielski 	{
264*b1cdbd2cSJim Jagielski 		--nId;
265*b1cdbd2cSJim Jagielski 		DBG_ASSERT( nId <= _pURLs->Count(), "SvtUpButton_Impl:falscher Index" );
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski         String aURL = *(_pURLs->GetObject( nId ));
268*b1cdbd2cSJim Jagielski 		GetDialogParent()->OpenURL_Impl( aURL );
269*b1cdbd2cSJim Jagielski 	}
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
Click()273*b1cdbd2cSJim Jagielski void SvtUpButton_Impl::Click()
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski 	GetDialogParent()->PrevLevel_Impl();
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski //=============================================================================
279*b1cdbd2cSJim Jagielski //= SvtTravelButton_Impl
280*b1cdbd2cSJim Jagielski //=============================================================================
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
SvtTravelButton_Impl(SvtFileDialog * pParent,const ResId & rResId)283*b1cdbd2cSJim Jagielski SvtTravelButton_Impl::SvtTravelButton_Impl( SvtFileDialog* pParent, const ResId& rResId )
284*b1cdbd2cSJim Jagielski     :SvtFileDialogURLSelector   ( pParent, rResId, IMG_FILEDLG_BTN_STD )
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski 	SetDropDown( 0 );   // by default, don't drop down, as we don't have favourites
287*b1cdbd2cSJim Jagielski }
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
SetFavouriteLocations(const::std::vector<String> & _rLocations)290*b1cdbd2cSJim Jagielski void SvtTravelButton_Impl::SetFavouriteLocations( const ::std::vector< String >& _rLocations )
291*b1cdbd2cSJim Jagielski {
292*b1cdbd2cSJim Jagielski     m_aFavourites = _rLocations;
293*b1cdbd2cSJim Jagielski     // enable the drop down if and only if we have favourites
294*b1cdbd2cSJim Jagielski     SetDropDown( m_aFavourites.empty() ? 0 : PUSHBUTTON_DROPDOWN_TOOLBOX );
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
~SvtTravelButton_Impl()298*b1cdbd2cSJim Jagielski SvtTravelButton_Impl::~SvtTravelButton_Impl()
299*b1cdbd2cSJim Jagielski {
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
FillURLMenu(PopupMenu * _pMenu)303*b1cdbd2cSJim Jagielski void SvtTravelButton_Impl::FillURLMenu( PopupMenu* _pMenu )
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski     if ( m_aFavourites.empty() )
306*b1cdbd2cSJim Jagielski         // though we claimed that we do not want to have a drop down button
307*b1cdbd2cSJim Jagielski         // in this case, VCL nevertheless behaves as if we had one .... :(
308*b1cdbd2cSJim Jagielski         return;
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski     _pMenu->Clear();
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 	sal_Bool bIsHighContrast = GetDialogParent()->GetView()->GetSettings().GetStyleSettings().GetHighContrastMode();
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski     sal_uInt16 nItemId = 1;
315*b1cdbd2cSJim Jagielski     String sDisplayName;
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski     ::std::vector< String >::const_iterator aLoop;
318*b1cdbd2cSJim Jagielski     for ( aLoop = m_aFavourites.begin(); aLoop != m_aFavourites.end(); ++aLoop, ++nItemId )
319*b1cdbd2cSJim Jagielski     {
320*b1cdbd2cSJim Jagielski         if ( GetDialogParent()->isUrlAllowed( *aLoop ) )
321*b1cdbd2cSJim Jagielski         {
322*b1cdbd2cSJim Jagielski 		    Image aImage = SvFileInformationManager::GetImage(
323*b1cdbd2cSJim Jagielski 				INetURLObject(*aLoop), bIsHighContrast );
324*b1cdbd2cSJim Jagielski             if ( LocalFileHelper::ConvertURLToSystemPath(*aLoop, sDisplayName) )
325*b1cdbd2cSJim Jagielski                 _pMenu->InsertItem( nItemId, sDisplayName, aImage );
326*b1cdbd2cSJim Jagielski             else
327*b1cdbd2cSJim Jagielski                 _pMenu->InsertItem( nItemId, *aLoop, aImage );
328*b1cdbd2cSJim Jagielski         }
329*b1cdbd2cSJim Jagielski     }
330*b1cdbd2cSJim Jagielski }
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
Select()333*b1cdbd2cSJim Jagielski void SvtTravelButton_Impl::Select()
334*b1cdbd2cSJim Jagielski {
335*b1cdbd2cSJim Jagielski 	sal_uInt16 nId = GetCurItemId();
336*b1cdbd2cSJim Jagielski 	if ( nId )
337*b1cdbd2cSJim Jagielski 	{
338*b1cdbd2cSJim Jagielski 		--nId;
339*b1cdbd2cSJim Jagielski         DBG_ASSERT( nId < m_aFavourites.size(), "SvtTravelButton_Impl::Select: invalid index!" );
340*b1cdbd2cSJim Jagielski         if ( nId < m_aFavourites.size() )
341*b1cdbd2cSJim Jagielski             OpenURL( m_aFavourites[ nId ] );
342*b1cdbd2cSJim Jagielski 	}
343*b1cdbd2cSJim Jagielski }
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
Click()346*b1cdbd2cSJim Jagielski void SvtTravelButton_Impl::Click()
347*b1cdbd2cSJim Jagielski {
348*b1cdbd2cSJim Jagielski 	OpenURL( GetDialogParent()->GetStandardDir() );
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski //*****************************************************************************
352*b1cdbd2cSJim Jagielski // SvtExpFileDlg_Impl
353*b1cdbd2cSJim Jagielski //*****************************************************************************
354*b1cdbd2cSJim Jagielski 
SvtExpFileDlg_Impl(WinBits)355*b1cdbd2cSJim Jagielski SvtExpFileDlg_Impl::SvtExpFileDlg_Impl( WinBits )	:
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski     _pLbFilter          ( NULL ),
358*b1cdbd2cSJim Jagielski     _pCurFilter         ( NULL ),
359*b1cdbd2cSJim Jagielski     _pFilter            ( new SvtFileDialogFilterList_Impl() ),
360*b1cdbd2cSJim Jagielski     _pUserFilter        ( NULL ),
361*b1cdbd2cSJim Jagielski 	_pFtFileName        ( NULL ),
362*b1cdbd2cSJim Jagielski 	_pEdFileName        ( NULL ),
363*b1cdbd2cSJim Jagielski 	_pFtFileVersion     ( NULL ),
364*b1cdbd2cSJim Jagielski 	_pLbFileVersion     ( NULL ),
365*b1cdbd2cSJim Jagielski 	_pFtTemplates		( NULL ),
366*b1cdbd2cSJim Jagielski 	_pLbTemplates		( NULL ),
367*b1cdbd2cSJim Jagielski 	_pFtImageTemplates	( NULL ),
368*b1cdbd2cSJim Jagielski 	_pLbImageTemplates	( NULL ),
369*b1cdbd2cSJim Jagielski 	_pFtFileType        ( NULL ),
370*b1cdbd2cSJim Jagielski     _pBtnFileOpen       ( NULL ),
371*b1cdbd2cSJim Jagielski 	_pBtnCancel         ( NULL ),
372*b1cdbd2cSJim Jagielski 	_pBtnHelp			( NULL ),
373*b1cdbd2cSJim Jagielski 	_pBtnUp             ( NULL ),
374*b1cdbd2cSJim Jagielski 	_pBtnNewFolder      ( NULL ),
375*b1cdbd2cSJim Jagielski 	_pBtnStandard       ( NULL ),
376*b1cdbd2cSJim Jagielski 	_pCbPassword        ( NULL ),
377*b1cdbd2cSJim Jagielski 	_pFtCurrentPath     ( NULL ),
378*b1cdbd2cSJim Jagielski 	_pCbAutoExtension   ( NULL ),
379*b1cdbd2cSJim Jagielski 	_pCbOptions			( NULL ),
380*b1cdbd2cSJim Jagielski 	_nState             ( FILEDLG_STATE_REMOTE ),
381*b1cdbd2cSJim Jagielski 	_nStyle				( 0 ),
382*b1cdbd2cSJim Jagielski 	_bDoubleClick       ( sal_False ),
383*b1cdbd2cSJim Jagielski     m_bNeedDelayedFilterExecute ( sal_False ),
384*b1cdbd2cSJim Jagielski     _pDefaultFilter     ( NULL ),
385*b1cdbd2cSJim Jagielski     _bMultiSelection    ( sal_False ),
386*b1cdbd2cSJim Jagielski     _nFixDeltaHeight    ( 0 ),
387*b1cdbd2cSJim Jagielski     _bFolderHasOpened   ( sal_False )
388*b1cdbd2cSJim Jagielski {
389*b1cdbd2cSJim Jagielski }
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski //*****************************************************************************
392*b1cdbd2cSJim Jagielski 
~SvtExpFileDlg_Impl()393*b1cdbd2cSJim Jagielski SvtExpFileDlg_Impl::~SvtExpFileDlg_Impl()
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski 	delete _pFtCurrentPath;
396*b1cdbd2cSJim Jagielski 	delete _pCbPassword;
397*b1cdbd2cSJim Jagielski 	delete _pCbAutoExtension;
398*b1cdbd2cSJim Jagielski 	delete _pCbOptions;
399*b1cdbd2cSJim Jagielski 	delete _pBtnStandard;
400*b1cdbd2cSJim Jagielski 	delete _pBtnNewFolder;
401*b1cdbd2cSJim Jagielski 	delete _pBtnUp;
402*b1cdbd2cSJim Jagielski 	delete _pBtnHelp;
403*b1cdbd2cSJim Jagielski 	delete _pBtnCancel;
404*b1cdbd2cSJim Jagielski 	delete _pBtnFileOpen;
405*b1cdbd2cSJim Jagielski 	delete _pLbFilter;
406*b1cdbd2cSJim Jagielski 	delete _pFtFileType;
407*b1cdbd2cSJim Jagielski 	delete _pLbFileVersion;
408*b1cdbd2cSJim Jagielski 	delete _pFtFileVersion;
409*b1cdbd2cSJim Jagielski 	delete _pFtTemplates;
410*b1cdbd2cSJim Jagielski 	delete _pLbTemplates;
411*b1cdbd2cSJim Jagielski 	delete _pFtImageTemplates;
412*b1cdbd2cSJim Jagielski 	delete _pLbImageTemplates;
413*b1cdbd2cSJim Jagielski 	delete _pEdFileName;
414*b1cdbd2cSJim Jagielski 	delete _pFtFileName;
415*b1cdbd2cSJim Jagielski 	delete _pUserFilter;
416*b1cdbd2cSJim Jagielski 	delete _pFilter;
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski //*****************************************************************************
420*b1cdbd2cSJim Jagielski 
SetStandardDir(const String & _rDir)421*b1cdbd2cSJim Jagielski void SvtExpFileDlg_Impl::SetStandardDir( const String& _rDir )
422*b1cdbd2cSJim Jagielski {
423*b1cdbd2cSJim Jagielski 	_aStdDir = _rDir;
424*b1cdbd2cSJim Jagielski 	if ( 0 == _aStdDir.Len() )
425*b1cdbd2cSJim Jagielski 		_aStdDir.AssignAscii( "file:///" );
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski //*****************************************************************************
429*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
430*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
431*b1cdbd2cSJim Jagielski namespace {
lcl_DecoratedFilter(const String & _rOriginalFilter)432*b1cdbd2cSJim Jagielski 	String lcl_DecoratedFilter( const String& _rOriginalFilter )
433*b1cdbd2cSJim Jagielski 	{
434*b1cdbd2cSJim Jagielski 		String aDecoratedFilter = '<';
435*b1cdbd2cSJim Jagielski 		aDecoratedFilter += _rOriginalFilter;
436*b1cdbd2cSJim Jagielski 		aDecoratedFilter += '>';
437*b1cdbd2cSJim Jagielski 		return aDecoratedFilter;
438*b1cdbd2cSJim Jagielski 	}
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski #endif
441*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
442*b1cdbd2cSJim Jagielski 
ClearFilterList()443*b1cdbd2cSJim Jagielski void SvtExpFileDlg_Impl::ClearFilterList( )
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski 	_pLbFilter->Clear();
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
SetCurFilter(SvtFileDialogFilter_Impl * pFilter,const String & rDisplayName)449*b1cdbd2cSJim Jagielski void SvtExpFileDlg_Impl::SetCurFilter( SvtFileDialogFilter_Impl* pFilter, const String& rDisplayName )
450*b1cdbd2cSJim Jagielski {
451*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pFilter, "SvtExpFileDlg_Impl::SetCurFilter: invalid filter!" );
452*b1cdbd2cSJim Jagielski 	DBG_ASSERT( ( rDisplayName == pFilter->GetName() )
453*b1cdbd2cSJim Jagielski 			||	( rDisplayName == lcl_DecoratedFilter( pFilter->GetName() ) ),
454*b1cdbd2cSJim Jagielski 			"SvtExpFileDlg_Impl::SetCurFilter: arguments are inconsistent!" );
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski 	_pCurFilter = pFilter;
457*b1cdbd2cSJim Jagielski 	m_sCurrentFilterDisplayName = rDisplayName;
458*b1cdbd2cSJim Jagielski }
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
InsertFilterListEntry(const SvtFileDialogFilter_Impl * _pFilterDesc)461*b1cdbd2cSJim Jagielski void SvtExpFileDlg_Impl::InsertFilterListEntry( const SvtFileDialogFilter_Impl* _pFilterDesc )
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski 	String sName = _pFilterDesc->GetName();
464*b1cdbd2cSJim Jagielski 	if ( _pFilterDesc->isGroupSeparator() )
465*b1cdbd2cSJim Jagielski 		sName = String::CreateFromAscii( "------------------------------------------" );
466*b1cdbd2cSJim Jagielski 	else
467*b1cdbd2cSJim Jagielski 		sName = _pFilterDesc->GetName();
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 	// insert an set user data
470*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = _pLbFilter->InsertEntry( sName );
471*b1cdbd2cSJim Jagielski 	_pLbFilter->SetEntryData( nPos, const_cast< void* >( static_cast< const void* >( _pFilterDesc ) ) );
472*b1cdbd2cSJim Jagielski }
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
475*b1cdbd2cSJim Jagielski 
InitFilterList()476*b1cdbd2cSJim Jagielski void SvtExpFileDlg_Impl::InitFilterList( )
477*b1cdbd2cSJim Jagielski {
478*b1cdbd2cSJim Jagielski 	// clear the current list
479*b1cdbd2cSJim Jagielski 	ClearFilterList( );
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski 	// reinit it
482*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = _pFilter->Count();
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 	// search for the first entry which is no group separator
485*b1cdbd2cSJim Jagielski 	while ( nPos-- && _pFilter->GetObject( nPos ) && _pFilter->GetObject( nPos )->isGroupSeparator() )
486*b1cdbd2cSJim Jagielski 		;
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski 	// add all following entries
489*b1cdbd2cSJim Jagielski 	while ( (sal_Int16)nPos >= 0 )
490*b1cdbd2cSJim Jagielski 		InsertFilterListEntry( _pFilter->GetObject( nPos-- ) );
491*b1cdbd2cSJim Jagielski }
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
494*b1cdbd2cSJim Jagielski 
CreateFilterListControl(Window * _pParent,const ResId & _rId)495*b1cdbd2cSJim Jagielski void SvtExpFileDlg_Impl::CreateFilterListControl( Window* _pParent, const ResId& _rId )
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !_pLbFilter, "SvtExpFileDlg_Impl::CreateFilterListControl: already created the control!" );
498*b1cdbd2cSJim Jagielski 	if ( !_pLbFilter )
499*b1cdbd2cSJim Jagielski     {
500*b1cdbd2cSJim Jagielski 		_pLbFilter = new ListBox( _pParent, _rId );
501*b1cdbd2cSJim Jagielski         _pLbFilter->SetDropDownLineCount( 10 );
502*b1cdbd2cSJim Jagielski     }
503*b1cdbd2cSJim Jagielski }
504