/************************************************************** * * 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_sfx2.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "app.hrc" #include "sfx2/sfxresid.hxx" //----------------------------------------------------------------------------- using namespace ::com::sun::star; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::ui::dialogs; using namespace ::com::sun::star::uno; using namespace ::rtl; using namespace ::cppu; //----------------------------------------------------------------------------- sal_uInt16 SvxOpenGrfErr2ResId( short err ) { switch( err ) { case GRFILTER_OPENERROR: return RID_SVXSTR_GRFILTER_OPENERROR; case GRFILTER_IOERROR: return RID_SVXSTR_GRFILTER_IOERROR; case GRFILTER_VERSIONERROR: return RID_SVXSTR_GRFILTER_VERSIONERROR; case GRFILTER_FILTERERROR: return RID_SVXSTR_GRFILTER_FILTERERROR; case GRFILTER_FORMATERROR: default: return RID_SVXSTR_GRFILTER_FORMATERROR; } } struct SvxOpenGrf_Impl { SvxOpenGrf_Impl (); sfx2::FileDialogHelper aFileDlg; uno::Reference < XFilePickerControlAccess > xCtrlAcc; }; SvxOpenGrf_Impl::SvxOpenGrf_Impl() : aFileDlg(SFXWB_GRAPHIC) { uno::Reference < XFilePicker > xFP = aFileDlg.GetFilePicker(); xCtrlAcc = uno::Reference < XFilePickerControlAccess >(xFP, UNO_QUERY); } SvxOpenGraphicDialog::SvxOpenGraphicDialog( const String& rTitle ) : mpImpl( new SvxOpenGrf_Impl ) { mpImpl->aFileDlg.SetTitle(rTitle); } SvxOpenGraphicDialog::~SvxOpenGraphicDialog() { } short SvxOpenGraphicDialog::Execute() { sal_uInt16 nImpRet; sal_Bool bQuitLoop(sal_False); while( bQuitLoop == sal_False && mpImpl->aFileDlg.Execute() == ERRCODE_NONE ) { if( GetPath().Len() ) { GraphicFilter* pFilter = GraphicFilter::GetGraphicFilter(); INetURLObject aObj( GetPath() ); // check whether we can load the graphic String aCurFilter( GetCurrentFilter() ); sal_uInt16 nFormatNum = pFilter->GetImportFormatNumber( aCurFilter ); sal_uInt16 nRetFormat = 0; sal_uInt16 nFound = USHRT_MAX; // non-local? if ( INET_PROT_FILE != aObj.GetProtocol() ) { SfxMedium aMed( aObj.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ, sal_True ); aMed.DownLoad(); SvStream* pStream = aMed.GetInStream(); if( pStream ) nImpRet = pFilter->CanImportGraphic( aObj.GetMainURL( INetURLObject::NO_DECODE ), *pStream, nFormatNum, &nRetFormat ); else nImpRet = pFilter->CanImportGraphic( aObj, nFormatNum, &nRetFormat ); if ( GRFILTER_OK != nImpRet ) { if ( !pStream ) nImpRet = pFilter->CanImportGraphic( aObj, GRFILTER_FORMAT_DONTKNOW, &nRetFormat ); else nImpRet = pFilter->CanImportGraphic( aObj.GetMainURL( INetURLObject::NO_DECODE ), *pStream, GRFILTER_FORMAT_DONTKNOW, &nRetFormat ); } } else { if( (nImpRet=pFilter->CanImportGraphic( aObj, nFormatNum, &nRetFormat )) != GRFILTER_OK ) nImpRet = pFilter->CanImportGraphic( aObj, GRFILTER_FORMAT_DONTKNOW, &nRetFormat ); } if ( GRFILTER_OK == nImpRet ) nFound = nRetFormat; // could not load? if ( nFound == USHRT_MAX ) { WarningBox aWarningBox( NULL, WB_3DLOOK | WB_RETRY_CANCEL, String( SfxResId( SvxOpenGrfErr2ResId(nImpRet) ) ) ); bQuitLoop = aWarningBox.Execute()==RET_RETRY ? sal_False : sal_True; } else { // setup appropriate filter (so next time, it will work) if( pFilter->GetImportFormatCount() ) { String aFormatName(pFilter->GetImportFormatName(nFound)); SetCurrentFilter(aFormatName); } return nImpRet; } } } // cancel return -1; } void SvxOpenGraphicDialog::SetPath( const String& rPath ) { mpImpl->aFileDlg.SetDisplayDirectory(rPath); } void SvxOpenGraphicDialog::SetPath( const String& rPath, sal_Bool bLinkState ) { SetPath(rPath); AsLink(bLinkState); } void SvxOpenGraphicDialog::EnableLink( sal_Bool state ) { if( mpImpl->xCtrlAcc.is() ) { try { mpImpl->xCtrlAcc->enableControl( ExtendedFilePickerElementIds::CHECKBOX_LINK, state ); } catch(IllegalArgumentException) { #ifdef DBG_UTIL DBG_ERROR( "Cannot enable \"link\" checkbox" ); #endif } } } void SvxOpenGraphicDialog::AsLink(sal_Bool bState) { if( mpImpl->xCtrlAcc.is() ) { try { Any aAny; aAny <<= bState; mpImpl->xCtrlAcc->setValue( ExtendedFilePickerElementIds::CHECKBOX_LINK, 0, aAny ); } catch(IllegalArgumentException) { #ifdef DBG_UTIL DBG_ERROR( "Cannot check \"link\" checkbox" ); #endif } } } sal_Bool SvxOpenGraphicDialog::IsAsLink() const { try { if( mpImpl->xCtrlAcc.is() ) { Any aVal = mpImpl->xCtrlAcc->getValue( ExtendedFilePickerElementIds::CHECKBOX_LINK, 0 ); DBG_ASSERT(aVal.hasValue(), "Value CBX_INSERT_AS_LINK not found"); return aVal.hasValue() ? *(sal_Bool*) aVal.getValue() : sal_False; } } catch(IllegalArgumentException) { #ifdef DBG_UTIL DBG_ERROR( "Cannot access \"link\" checkbox" ); #endif } return sal_False; } int SvxOpenGraphicDialog::GetGraphic(Graphic& rGraphic) const { return mpImpl->aFileDlg.GetGraphic(rGraphic); } String SvxOpenGraphicDialog::GetPath() const { return mpImpl->aFileDlg.GetPath(); } String SvxOpenGraphicDialog::GetCurrentFilter() const { return mpImpl->aFileDlg.GetCurrentFilter(); } void SvxOpenGraphicDialog::SetCurrentFilter(const String& rStr) { mpImpl->aFileDlg.SetCurrentFilter(rStr); } void SvxOpenGraphicDialog::SetControlHelpIds( const sal_Int16* _pControlId, const char** _pHelpId ) { mpImpl->aFileDlg.SetControlHelpIds( _pControlId, _pHelpId ); }