/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_fpicker.hxx" // includes ******************************************************************* #include "iodlgimp.hxx" #include "svtools/headbar.hxx" #include #include #include #include #include #include #include // #97148# --------------- #include "svl/ctypeitm.hxx" #include "svl/eitem.hxx" #include "unotools/viewoptions.hxx" #include "svtools/fileview.hxx" #include "svtools/inettbc.hxx" #include "iodlg.hxx" #include "iodlg.hrc" #include "svtools/imagemgr.hxx" #include #include "unotools/useroptions.hxx" #include "rtl/instance.hxx" #include #define _SVSTDARR_STRINGSSORTDTOR #define _SVSTDARR_STRINGSDTOR #define _SVSTDARR_USHORTS #include "svl/svstdarr.hxx" using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; using namespace ::utl; // some stuff for easier changes for SvtViewOptions static const sal_Char* pViewOptDataName = "dialog data"; #define VIEWOPT_DATANAME ::rtl::OUString::createFromAscii( pViewOptDataName ) static inline void SetViewOptUserItem( SvtViewOptions& rOpt, const String& rData ) { rOpt.SetUserItem( VIEWOPT_DATANAME, makeAny( ::rtl::OUString( rData ) ) ); } static inline String GetViewOptUserItem( const SvtViewOptions& rOpt ) { Any aAny( rOpt.GetUserItem( VIEWOPT_DATANAME ) ); ::rtl::OUString aUserData; aAny >>= aUserData; return String( aUserData ); } // defines f"ur den Style der BrowseBox #define STYLE_MULTI_SELECTION \ CNTVIEWSTYLE_NODE_BUTTONS | \ CNTVIEWSTYLE_NODE_BUTTONS_AT_ROOT | \ CNTVIEWSTYLE_SHOW_MESSAGES | \ CNTVIEWSTYLE_SHOW_FOLDERS | \ CNTVIEWSTYLE_NO_SMARTHIGHLIGHT | \ CNTVIEWSTYLE_HIDE_OPENMENU | \ CNTVIEWSTYLE_DEFAULT_APPEARANCE | \ CNTVIEWSTYLE_SORT_BY_FOLDER #define STYLE_SINGLE_SELECTION \ STYLE_MULTI_SELECTION | CNTVIEWSTYLE_SINGLE_SELECTION #define BOOL_NOT_INITIALIZE ((sal_Bool)2) //***************************************************************************** // ResMgrHolder / SvtSimpleResId //***************************************************************************** namespace { struct ResMgrHolder { ResMgr * operator ()() { return ResMgr::CreateResMgr (CREATEVERSIONRESMGR_NAME(svl)); } static ResMgr * getOrCreate() { return rtl_Instance< ResMgr, ResMgrHolder, osl::MutexGuard, osl::GetGlobalMutex >::create ( ResMgrHolder(), osl::GetGlobalMutex()); } }; struct SvtSimpleResId : public ResId { SvtSimpleResId (sal_uInt16 nId) : ResId (nId, *ResMgrHolder::getOrCreate()) {} }; } //***************************************************************************** // SvtFileDialogFilter_Impl //***************************************************************************** DBG_NAME( SvtFileDialogFilter_Impl ) SvtFileDialogFilter_Impl::SvtFileDialogFilter_Impl( const String& rName, const String& rType ) :m_aName( rName ) ,m_aType( rType ) { DBG_CTOR( SvtFileDialogFilter_Impl, NULL ); m_aType.ToLowerAscii(); } //***************************************************************************** SvtFileDialogFilter_Impl::~SvtFileDialogFilter_Impl() { DBG_DTOR( SvtFileDialogFilter_Impl, NULL ); } //***************************************************************************** // SvtFileDialogFilterList_Impl //***************************************************************************** SV_IMPL_PTRARR( SvtFileDialogFilterList_Impl, SvtFileDialogFilter_Impl* ); //============================================================================= //= SvtFileDialogURLSelector //============================================================================= //----------------------------------------------------------------------------- SvtFileDialogURLSelector::SvtFileDialogURLSelector( SvtFileDialog* _pParent, const ResId& _rResId, sal_uInt16 _nButtonId ) :MenuButton ( _pParent, _rResId ) ,m_pParent ( _pParent ) ,m_pMenu ( new PopupMenu ) { SetStyle( GetStyle() | WB_NOPOINTERFOCUS | WB_RECTSTYLE | WB_SMALLSTYLE ); SetModeImage( m_pParent->GetButtonImage( _nButtonId ) ); SetMenuMode( MENUBUTTON_MENUMODE_TIMED ); SetDropDown( PUSHBUTTON_DROPDOWN_TOOLBOX ); } //----------------------------------------------------------------------------- SvtFileDialogURLSelector::~SvtFileDialogURLSelector() { delete m_pMenu; } //----------------------------------------------------------------------------- void SvtFileDialogURLSelector::OpenURL( const String& rURL ) { INetURLObject aObj( rURL ); DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "SvtFileDialogURLSelector::OpenURL: Invalid URL!" ); m_pParent->OpenURL_Impl( aObj.GetMainURL( INetURLObject::NO_DECODE ) ); } //----------------------------------------------------------------------------- void SvtFileDialogURLSelector::Activate() { m_pMenu->Clear(); FillURLMenu( m_pMenu ); SetPopupMenu( m_pMenu ); } //============================================================================= //= SvtUpButton_Impl //============================================================================= //----------------------------------------------------------------------------- SvtUpButton_Impl::SvtUpButton_Impl( SvtFileDialog* pParent, const ResId& rResId ) :SvtFileDialogURLSelector( pParent, rResId, IMG_FILEDLG_BTN_UP ) ,_pURLs ( NULL ) { } //----------------------------------------------------------------------------- SvtUpButton_Impl::~SvtUpButton_Impl() { delete _pURLs; } //----------------------------------------------------------------------------- void SvtUpButton_Impl::FillURLMenu( PopupMenu* _pMenu ) { SvtFileView* pBox = GetDialogParent()->GetView(); sal_uInt16 nItemId = 1; delete _pURLs; _pURLs = new SvStringsDtor; // "Ubergeordnete Ebenen bestimmen. INetURLObject aObject( pBox->GetViewURL() ); sal_Int32 nCount = aObject.getSegmentCount(); ::svtools::VolumeInfo aVolInfo( sal_True /* volume */, sal_False /* remote */, sal_False /* removable */, sal_False /* floppy */, sal_False /* compact disk */ ); sal_Bool bIsHighContrast = pBox->GetSettings().GetStyleSettings().GetHighContrastMode(); Image aVolumeImage( SvFileInformationManager::GetFolderImage( aVolInfo, bIsHighContrast ) ); while ( nCount >= 1 ) { aObject.removeSegment(); String* pParentURL = new String( aObject.GetMainURL( INetURLObject::NO_DECODE ) ); if ( GetDialogParent()->isUrlAllowed( *pParentURL ) ) { String aTitle; // 97148# -------------------------------- if ( !GetDialogParent()->ContentGetTitle( *pParentURL, aTitle ) || aTitle.Len() == 0 ) aTitle = aObject.getName(); Image aImage = ( nCount > 1 ) // if nCount == 1 means workplace, which detects the wrong image ? SvFileInformationManager::GetImage( aObject, bIsHighContrast ) : aVolumeImage; _pMenu->InsertItem( nItemId++, aTitle, aImage ); _pURLs->Insert( pParentURL, _pURLs->Count() ); if ( nCount == 1 ) { // adjust the title of the top level entry (the workspace) _pMenu->SetItemText( --nItemId, SvtSimpleResId( STR_SVT_MIMETYPE_CNT_FSYSBOX ) ); } } --nCount; } } //----------------------------------------------------------------------------- void SvtUpButton_Impl::Select() { sal_uInt16 nId = GetCurItemId(); if ( nId ) { --nId; DBG_ASSERT( nId <= _pURLs->Count(), "SvtUpButton_Impl:falscher Index" ); String aURL = *(_pURLs->GetObject( nId )); GetDialogParent()->OpenURL_Impl( aURL ); } } //----------------------------------------------------------------------------- void SvtUpButton_Impl::Click() { GetDialogParent()->PrevLevel_Impl(); } //============================================================================= //= SvtTravelButton_Impl //============================================================================= //----------------------------------------------------------------------------- SvtTravelButton_Impl::SvtTravelButton_Impl( SvtFileDialog* pParent, const ResId& rResId ) :SvtFileDialogURLSelector ( pParent, rResId, IMG_FILEDLG_BTN_STD ) { SetDropDown( 0 ); // by default, don't drop down, as we don't have favourites } //----------------------------------------------------------------------------- void SvtTravelButton_Impl::SetFavouriteLocations( const ::std::vector< String >& _rLocations ) { m_aFavourites = _rLocations; // enable the drop down if and only if we have favourites SetDropDown( m_aFavourites.empty() ? 0 : PUSHBUTTON_DROPDOWN_TOOLBOX ); } //----------------------------------------------------------------------------- SvtTravelButton_Impl::~SvtTravelButton_Impl() { } //----------------------------------------------------------------------------- void SvtTravelButton_Impl::FillURLMenu( PopupMenu* _pMenu ) { if ( m_aFavourites.empty() ) // though we claimed that we do not want to have a drop down button // in this case, VCL nevertheless behaves as if we had one .... :( return; _pMenu->Clear(); sal_Bool bIsHighContrast = GetDialogParent()->GetView()->GetSettings().GetStyleSettings().GetHighContrastMode(); sal_uInt16 nItemId = 1; String sDisplayName; ::std::vector< String >::const_iterator aLoop; for ( aLoop = m_aFavourites.begin(); aLoop != m_aFavourites.end(); ++aLoop, ++nItemId ) { if ( GetDialogParent()->isUrlAllowed( *aLoop ) ) { Image aImage = SvFileInformationManager::GetImage( INetURLObject(*aLoop), bIsHighContrast ); if ( LocalFileHelper::ConvertURLToSystemPath(*aLoop, sDisplayName) ) _pMenu->InsertItem( nItemId, sDisplayName, aImage ); else _pMenu->InsertItem( nItemId, *aLoop, aImage ); } } } //----------------------------------------------------------------------------- void SvtTravelButton_Impl::Select() { sal_uInt16 nId = GetCurItemId(); if ( nId ) { --nId; DBG_ASSERT( nId < m_aFavourites.size(), "SvtTravelButton_Impl::Select: invalid index!" ); if ( nId < m_aFavourites.size() ) OpenURL( m_aFavourites[ nId ] ); } } //----------------------------------------------------------------------------- void SvtTravelButton_Impl::Click() { OpenURL( GetDialogParent()->GetStandardDir() ); } //***************************************************************************** // SvtExpFileDlg_Impl //***************************************************************************** SvtExpFileDlg_Impl::SvtExpFileDlg_Impl( WinBits ) : _pLbFilter ( NULL ), _pCurFilter ( NULL ), _pFilter ( new SvtFileDialogFilterList_Impl() ), _pUserFilter ( NULL ), _pFtFileName ( NULL ), _pEdFileName ( NULL ), _pFtFileVersion ( NULL ), _pLbFileVersion ( NULL ), _pFtTemplates ( NULL ), _pLbTemplates ( NULL ), _pFtImageTemplates ( NULL ), _pLbImageTemplates ( NULL ), _pFtFileType ( NULL ), _pBtnFileOpen ( NULL ), _pBtnCancel ( NULL ), _pBtnHelp ( NULL ), _pBtnUp ( NULL ), _pBtnNewFolder ( NULL ), _pBtnStandard ( NULL ), _pCbPassword ( NULL ), _pFtCurrentPath ( NULL ), _pCbAutoExtension ( NULL ), _pCbOptions ( NULL ), _nState ( FILEDLG_STATE_REMOTE ), _nStyle ( 0 ), _bDoubleClick ( sal_False ), m_bNeedDelayedFilterExecute ( sal_False ), _pDefaultFilter ( NULL ), _bMultiSelection ( sal_False ), _nFixDeltaHeight ( 0 ), _bFolderHasOpened ( sal_False ) { } //***************************************************************************** SvtExpFileDlg_Impl::~SvtExpFileDlg_Impl() { delete _pFtCurrentPath; delete _pCbPassword; delete _pCbAutoExtension; delete _pCbOptions; delete _pBtnStandard; delete _pBtnNewFolder; delete _pBtnUp; delete _pBtnHelp; delete _pBtnCancel; delete _pBtnFileOpen; delete _pLbFilter; delete _pFtFileType; delete _pLbFileVersion; delete _pFtFileVersion; delete _pFtTemplates; delete _pLbTemplates; delete _pFtImageTemplates; delete _pLbImageTemplates; delete _pEdFileName; delete _pFtFileName; delete _pUserFilter; delete _pFilter; } //***************************************************************************** void SvtExpFileDlg_Impl::SetStandardDir( const String& _rDir ) { _aStdDir = _rDir; if ( 0 == _aStdDir.Len() ) _aStdDir.AssignAscii( "file:///" ); } //***************************************************************************** #if OSL_DEBUG_LEVEL > 0 //----------------------------------------------------------------------------- namespace { String lcl_DecoratedFilter( const String& _rOriginalFilter ) { String aDecoratedFilter = '<'; aDecoratedFilter += _rOriginalFilter; aDecoratedFilter += '>'; return aDecoratedFilter; } } #endif //----------------------------------------------------------------------------- void SvtExpFileDlg_Impl::ClearFilterList( ) { _pLbFilter->Clear(); } //----------------------------------------------------------------------------- void SvtExpFileDlg_Impl::SetCurFilter( SvtFileDialogFilter_Impl* pFilter, const String& rDisplayName ) { DBG_ASSERT( pFilter, "SvtExpFileDlg_Impl::SetCurFilter: invalid filter!" ); DBG_ASSERT( ( rDisplayName == pFilter->GetName() ) || ( rDisplayName == lcl_DecoratedFilter( pFilter->GetName() ) ), "SvtExpFileDlg_Impl::SetCurFilter: arguments are inconsistent!" ); _pCurFilter = pFilter; m_sCurrentFilterDisplayName = rDisplayName; } //----------------------------------------------------------------------------- void SvtExpFileDlg_Impl::InsertFilterListEntry( const SvtFileDialogFilter_Impl* _pFilterDesc ) { String sName = _pFilterDesc->GetName(); if ( _pFilterDesc->isGroupSeparator() ) sName = String::CreateFromAscii( "------------------------------------------" ); else sName = _pFilterDesc->GetName(); // insert an set user data sal_uInt16 nPos = _pLbFilter->InsertEntry( sName ); _pLbFilter->SetEntryData( nPos, const_cast< void* >( static_cast< const void* >( _pFilterDesc ) ) ); } //----------------------------------------------------------------------------- void SvtExpFileDlg_Impl::InitFilterList( ) { // clear the current list ClearFilterList( ); // reinit it sal_uInt16 nPos = _pFilter->Count(); // search for the first entry which is no group separator while ( nPos-- && _pFilter->GetObject( nPos ) && _pFilter->GetObject( nPos )->isGroupSeparator() ) ; // add all following entries while ( (sal_Int16)nPos >= 0 ) InsertFilterListEntry( _pFilter->GetObject( nPos-- ) ); } //----------------------------------------------------------------------------- void SvtExpFileDlg_Impl::CreateFilterListControl( Window* _pParent, const ResId& _rId ) { DBG_ASSERT( !_pLbFilter, "SvtExpFileDlg_Impl::CreateFilterListControl: already created the control!" ); if ( !_pLbFilter ) { _pLbFilter = new ListBox( _pParent, _rId ); _pLbFilter->SetDropDownLineCount( 10 ); } }