From 24d6c704a6a5fb9d0bfbea4156a8d95c27693544 Mon Sep 17 00:00:00 2001 From: Katarina Behrens Date: Wed, 15 Apr 2015 14:50:43 +0200 Subject: tdf#62101: Show only file extensions we're able to insert Change-Id: If8f53ac8af85f15958cd488fb0fd4c37997963c9 --- sd/source/ui/func/fuinsfil.cxx | 106 ++++++++++++++++++++++++++++------------- 1 file changed, 72 insertions(+), 34 deletions(-) (limited to 'sd') diff --git a/sd/source/ui/func/fuinsfil.cxx b/sd/source/ui/func/fuinsfil.cxx index ce6d3e755681..7b554d2f74d7 100644 --- a/sd/source/ui/func/fuinsfil.cxx +++ b/sd/source/ui/func/fuinsfil.cxx @@ -69,6 +69,42 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::ui::dialogs; using namespace ::com::sun::star; +typedef ::std::pair< OUString, OUString > FilterDesc; + +namespace +{ + +OUString lcl_GetExtensionsList ( ::std::vector< FilterDesc > const& rFilterDescList ) +{ + OUString aExtensions; + ::std::vector< FilterDesc >::const_iterator aIter( rFilterDescList.begin() ); + + while (aIter != rFilterDescList.end()) + { + OUString sWildcard = (*aIter).second; + + if ( aExtensions.indexOf( sWildcard ) == -1 ) + { + if ( !aExtensions.isEmpty() ) + aExtensions += ";"; + aExtensions += sWildcard; + } + + ++aIter; + } + + return aExtensions; +} + +void lcl_AddFilter ( ::std::vector< FilterDesc >& rFilterDescList, + const SfxFilter *pFilter ) +{ + if (pFilter) + rFilterDescList.push_back( ::std::make_pair( pFilter->GetUIName(), pFilter->GetDefaultExtension() ) ); +} + +} + namespace sd { TYPEINIT1( FuInsertFile, FuPoor ); @@ -93,10 +129,11 @@ rtl::Reference FuInsertFile::Create( ViewShell* pViewSh, ::sd::Window* p void FuInsertFile::DoExecute( SfxRequest& rReq ) { SfxFilterMatcher& rMatcher = SfxGetpApp()->GetFilterMatcher(); - ::std::vector< OUString > aFilterVector; + ::std::vector< FilterDesc > aFilterVector; + ::std::vector< OUString > aOtherFilterVector; const SfxItemSet* pArgs = rReq.GetArgs (); - FuInsertFile::GetSupportedFilterVector( aFilterVector ); + FuInsertFile::GetSupportedFilterVector( aOtherFilterVector ); if (!pArgs) { @@ -128,72 +165,73 @@ void FuInsertFile::DoExecute( SfxRequest& rReq ) // Get filter for current format try { - OUString aAllSpec( SD_RESSTR( STR_ALL_FILES ) ); - - xFilterManager->appendFilter( aAllSpec, OUString("*.*") ); - xFilterManager->setCurrentFilter( aAllSpec ); // set default-filter () - // Get main filter const SfxFilter* pFilter = SfxFilter::GetDefaultFilterFromFactory( aOwnCont ); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); // get template filter if( mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS ) pFilter = DrawDocShell::Factory().GetTemplateFilter(); else pFilter = GraphicDocShell::Factory().GetTemplateFilter(); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); // get cross filter pFilter = SfxFilter::GetDefaultFilterFromFactory( aOtherCont ); - if( pFilter ) - { - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); - } + lcl_AddFilter( aFilterVector, pFilter ); // get Powerpoint filter OUString aExt = ".ppt"; pFilter = aMatch.GetFilter4Extension( aExt ); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); // Get other draw/impress filters pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARIMPRESS_60, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH ); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARIMPRESS_60, SfxFilterFlags::TEMPLATEPATH ); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW_60, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH ); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW_60, SfxFilterFlags::TEMPLATEPATH ); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH ); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW, SfxFilterFlags::TEMPLATEPATH ); - if( pFilter ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + lcl_AddFilter( aFilterVector, pFilter ); // add additional supported filters - ::std::vector< OUString >::const_iterator aIter( aFilterVector.begin() ); + ::std::vector< OUString >::const_iterator aOtherIter( aOtherFilterVector.begin() ); - while( aIter != aFilterVector.end() ) + while( aOtherIter != aOtherFilterVector.end() ) { - if( ( pFilter = rMatcher.GetFilter4Mime( *aIter ) ) != NULL ) - xFilterManager->appendFilter( pFilter->GetUIName(), pFilter->GetDefaultExtension() ); + if( ( pFilter = rMatcher.GetFilter4Mime( *aOtherIter ) ) != NULL ) + lcl_AddFilter( aFilterVector, pFilter ); + ++aOtherIter; + } + + // set default-filter () + OUString aAllSpec( SD_RESSTR( STR_ALL_FILES ) ); + OUString aExtensions = lcl_GetExtensionsList( aFilterVector ); + OUString aGUIName = aAllSpec + " (" + aExtensions + ")"; + + xFilterManager->appendFilter( aGUIName, aExtensions ); + xFilterManager->setCurrentFilter( aAllSpec ); + + // add filters to filter manager finally + ::std::vector< ::std::pair < OUString, OUString > >::const_iterator aIter( aFilterVector.begin() ); + + while( aIter != aFilterVector.end() ) + { + xFilterManager->appendFilter( (*aIter).first, (*aIter).second ); ++aIter; } + } catch (const IllegalArgumentException&) { @@ -252,7 +290,7 @@ void FuInsertFile::DoExecute( SfxRequest& rReq ) } else { - bool bFound = ( ::std::find( aFilterVector.begin(), aFilterVector.end(), pFilter->GetMimeType() ) != aFilterVector.end() ); + bool bFound = ( ::std::find( aOtherFilterVector.begin(), aOtherFilterVector.end(), pFilter->GetMimeType() ) != aOtherFilterVector.end() ); if( !bFound && ( aFilterName.indexOf( "Text" ) != -1 || aFilterName.indexOf( "Rich" ) != -1 || -- cgit