/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_cui.hxx" #include #include #include #include #include #include #include #include #include #include #include #include "cuigaldlg.hxx" #include "helpid.hrc" #include #include #include #include #include #include #include #include #include #include #include #include "dialmgr.hxx" #include "gallery.hrc" // -------------- // - Namespaces - // -------------- using namespace ::ucbhelper; using namespace ::rtl; using namespace ::cppu; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::ucb; using namespace ::com::sun::star::ui::dialogs; using namespace ::com::sun::star::uno; // ----------- // - Defines - // ----------- #define MAXPATH 1024 // ---------------- // - SearchThread - // ---------------- SearchThread::SearchThread( SearchProgress* pProgess, TPGalleryThemeProperties* pBrowser, const INetURLObject& rStartURL ) : mpProgress ( pProgess ), mpBrowser ( pBrowser ), maStartURL ( rStartURL ) { } // ------------------------------------------------------------------------ SearchThread::~SearchThread() { } // ------------------------------------------------------------------------ void SAL_CALL SearchThread::run() { const String aFileType( mpBrowser->aCbbFileType.GetText() ); if( aFileType.Len() ) { const sal_uInt16 nFileNumber = mpBrowser->aCbbFileType.GetEntryPos( aFileType ); sal_uInt16 nBeginFormat, nEndFormat; ::std::vector< String > aFormats; if( !nFileNumber || ( nFileNumber >= mpBrowser->aCbbFileType.GetEntryCount() ) ) { nBeginFormat = 1; nEndFormat = mpBrowser->aCbbFileType.GetEntryCount() - 1; } else nBeginFormat = nEndFormat = nFileNumber; for( sal_uInt16 i = nBeginFormat; i <= nEndFormat; ++i ) aFormats.push_back( ( (FilterEntry*) mpBrowser->aFilterEntryList.GetObject( i ) )->aFilterName.ToLowerAscii() ); ImplSearch( maStartURL, aFormats, mpBrowser->bSearchRecursive ); } } // ------------------------------------------------------------------------ void SAL_CALL SearchThread::onTerminated() { Application::PostUserEvent( LINK( mpProgress, SearchProgress, CleanUpHdl ) ); } // ------------------------------------------------------------------------ void SearchThread::ImplSearch( const INetURLObject& rStartURL, const ::std::vector< String >& rFormats, sal_Bool bRecursive ) { { ::vos::OGuard aGuard( Application::GetSolarMutex() ); mpProgress->SetDirectory( rStartURL ); mpProgress->Sync(); } try { ::com::sun::star::uno::Reference< XCommandEnvironment > xEnv; Content aCnt( rStartURL.GetMainURL( INetURLObject::NO_DECODE ), xEnv ); Sequence< OUString > aProps( 2 ); aProps.getArray()[ 0 ] = OUString::createFromAscii( "IsFolder" ); aProps.getArray()[ 1 ] = OUString::createFromAscii( "IsDocument" ); ::com::sun::star::uno::Reference< XResultSet > xResultSet( aCnt.createCursor( aProps, INCLUDE_FOLDERS_AND_DOCUMENTS ) ); if( xResultSet.is() ) { ::com::sun::star::uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY_THROW ); ::com::sun::star::uno::Reference< XRow > xRow( xResultSet, UNO_QUERY_THROW ); while( xResultSet->next() && schedule() ) { INetURLObject aFoundURL( xContentAccess->queryContentIdentifierString() ); DBG_ASSERT( aFoundURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); sal_Bool bFolder = xRow->getBoolean( 1 ); // property "IsFolder" if ( xRow->wasNull() ) bFolder = sal_False; if( bRecursive && bFolder ) ImplSearch( aFoundURL, rFormats, sal_True ); else { sal_Bool bDocument = xRow->getBoolean( 2 ); // property "IsDocument" if ( xRow->wasNull() ) bDocument = sal_False; if( bDocument ) { GraphicDescriptor aDesc( aFoundURL ); String aFileName; if( ( aDesc.Detect() && ::std::find( rFormats.begin(), rFormats.end(), aDesc.GetImportFormatShortName( aDesc.GetFileFormat() ).ToLowerAscii() ) != rFormats.end() ) || ::std::find( rFormats.begin(), rFormats.end(), String(aFoundURL.GetExtension().toAsciiLowerCase()) ) != rFormats.end() ) { ::vos::OGuard aGuard( Application::GetSolarMutex() ); mpBrowser->aFoundList.Insert( new String( aFoundURL.GetMainURL( INetURLObject::NO_DECODE ) ), LIST_APPEND ); mpBrowser->aLbxFound.InsertEntry( GetReducedString( aFoundURL, 50 ), (sal_uInt16) mpBrowser->aFoundList.Count() - 1 ); } } } } } } catch( const ContentCreationException& ) { } catch( const ::com::sun::star::uno::RuntimeException& ) { } catch( const ::com::sun::star::uno::Exception& ) { } } // ------------------ // - SearchProgress - // ------------------ SearchProgress::SearchProgress( Window* pParent, const INetURLObject& rStartURL ) : ModalDialog ( pParent, CUI_RES(RID_SVXDLG_GALLERY_SEARCH_PROGRESS ) ), aFtSearchDir ( this, CUI_RES( FT_SEARCH_DIR ) ), aFLSearchDir ( this, CUI_RES( FL_SEARCH_DIR ) ), aFtSearchType ( this, CUI_RES( FT_SEARCH_TYPE ) ), aFLSearchType ( this, CUI_RES( FL_SEARCH_TYPE ) ), aBtnCancel ( this, CUI_RES( BTN_CANCEL ) ), maSearchThread ( this, (TPGalleryThemeProperties*) pParent, rStartURL ) { FreeResource(); aBtnCancel.SetClickHdl( LINK( this, SearchProgress, ClickCancelBtn ) ); } // ------------------------------------------------------------------------ void SearchProgress::Terminate() { maSearchThread.terminate(); } // ------------------------------------------------------------------------ IMPL_LINK( SearchProgress, ClickCancelBtn, void*, EMPTYARG ) { Terminate(); return 0L; } // ------------------------------------------------------------------------ IMPL_LINK( SearchProgress, CleanUpHdl, void*, EMPTYARG ) { EndDialog( RET_OK ); delete this; return 0L; } // ------------------------------------------------------------------------ short SearchProgress::Execute() { DBG_ERROR( "SearchProgress cannot be executed via Dialog::Execute!\n" "It creates a thread that will call back to VCL apartment => deadlock!\n" "Use Dialog::StartExecuteModal to execute the dialog!" ); return RET_CANCEL; } // ------------------------------------------------------------------------ void SearchProgress::StartExecuteModal( const Link& rEndDialogHdl ) { maSearchThread.create(); ModalDialog::StartExecuteModal( rEndDialogHdl ); } // -------------- // - TakeThread - // -------------- TakeThread::TakeThread( TakeProgress* pProgess, TPGalleryThemeProperties* pBrowser, List& rTakenList ) : mpProgress ( pProgess ), mpBrowser ( pBrowser ), mrTakenList ( rTakenList ) { } // ------------------------------------------------------------------------ TakeThread::~TakeThread() { } // ------------------------------------------------------------------------ void SAL_CALL TakeThread::run() { String aName; INetURLObject aURL; sal_uInt16 nEntries; GalleryTheme* pThm = mpBrowser->GetXChgData()->pTheme; sal_uInt16 nPos; GalleryProgress* pStatusProgress; { ::vos::OGuard aGuard( Application::GetSolarMutex() ); pStatusProgress = new GalleryProgress; nEntries = mpBrowser->bTakeAll ? mpBrowser->aLbxFound.GetEntryCount() : mpBrowser->aLbxFound.GetSelectEntryCount(); pThm->LockBroadcaster(); } for( sal_uInt16 i = 0; i < nEntries && schedule(); i++ ) { // kompletten Filenamen aus FoundList holen if( mpBrowser->bTakeAll ) aURL = INetURLObject(*mpBrowser->aFoundList.GetObject( nPos = i )); else aURL = INetURLObject(*mpBrowser->aFoundList.GetObject( nPos = mpBrowser->aLbxFound.GetSelectEntryPos( i ) )); // Position in Taken-Liste uebernehmen mrTakenList.Insert( (void*) (sal_uLong)nPos, LIST_APPEND ); { ::vos::OGuard aGuard( Application::GetSolarMutex() ); mpProgress->SetFile( aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ); pStatusProgress->Update( i, nEntries - 1 ); mpProgress->Sync(); pThm->InsertURL( aURL ); } } { ::vos::OGuard aGuard( Application::GetSolarMutex() ); pThm->UnlockBroadcaster(); delete pStatusProgress; } } // ------------------------------------------------------------------------ void SAL_CALL TakeThread::onTerminated() { Application::PostUserEvent( LINK( mpProgress, TakeProgress, CleanUpHdl ) ); } // ---------------- // - TakeProgress - // ---------------- TakeProgress::TakeProgress( Window* pWindow ) : ModalDialog ( pWindow, CUI_RES( RID_SVXDLG_GALLERY_TAKE_PROGRESS ) ), aFtTakeFile ( this, CUI_RES( FT_TAKE_FILE ) ), aFLTakeProgress( this, CUI_RES( FL_TAKE_PROGRESS ) ), aBtnCancel ( this, CUI_RES( BTN_CANCEL ) ), maTakeThread ( this, (TPGalleryThemeProperties*) pWindow, maTakenList ) { FreeResource(); aBtnCancel.SetClickHdl( LINK( this, TakeProgress, ClickCancelBtn ) ); } // ------------------------------------------------------------------------ void TakeProgress::Terminate() { maTakeThread.terminate(); } // ------------------------------------------------------------------------ IMPL_LINK( TakeProgress, ClickCancelBtn, void*, EMPTYARG ) { Terminate(); return 0L; } // ------------------------------------------------------------------------ IMPL_LINK( TakeProgress, CleanUpHdl, void*, EMPTYARG ) { TPGalleryThemeProperties* mpBrowser = (TPGalleryThemeProperties*) GetParent(); ::std::bit_vector aRemoveEntries( mpBrowser->aFoundList.Count(), false ); ::std::vector< String > aRemainingVector; sal_uInt32 i, nCount; GetParent()->EnterWait(); mpBrowser->aLbxFound.SetUpdateMode( sal_False ); mpBrowser->aLbxFound.SetNoSelection(); // mark all taken positions in aRemoveEntries for( i = 0UL, nCount = maTakenList.Count(); i < nCount; ++i ) aRemoveEntries[ (sal_uLong) maTakenList.GetObject( i ) ] = true; maTakenList.Clear(); // refill found list for( i = 0, nCount = aRemoveEntries.size(); i < nCount; ++i ) if( !aRemoveEntries[ i ] ) aRemainingVector.push_back( *mpBrowser->aFoundList.GetObject( i ) ); for( String* pStr = mpBrowser->aFoundList.First(); pStr; pStr = mpBrowser->aFoundList.Next() ) delete pStr; mpBrowser->aFoundList.Clear(); for( i = 0, nCount = aRemainingVector.size(); i < nCount; ++i ) mpBrowser->aFoundList.Insert( new String( aRemainingVector[ i ] ), LIST_APPEND ); aRemainingVector.clear(); // refill list box for( i = 0, nCount = aRemoveEntries.size(); i < nCount; ++i ) if( !aRemoveEntries[ i ] ) aRemainingVector.push_back( mpBrowser->aLbxFound.GetEntry( (sal_uInt16) i ) ); mpBrowser->aLbxFound.Clear(); for( i = 0, nCount = aRemainingVector.size(); i < nCount; ++i ) mpBrowser->aLbxFound.InsertEntry( aRemainingVector[ i ] ); aRemainingVector.clear(); mpBrowser->aLbxFound.SetUpdateMode( sal_True ); mpBrowser->SelectFoundHdl( NULL ); GetParent()->LeaveWait(); EndDialog( RET_OK ); delete this; return 0L; } // ------------------------------------------------------------------------ short TakeProgress::Execute() { DBG_ERROR( "TakeProgress cannot be executed via Dialog::Execute!\n" "It creates a thread that will call back to VCL apartment => deadlock!\n" "Use Dialog::StartExecuteModal to execute the dialog!" ); return RET_CANCEL; } // ------------------------------------------------------------------------ void TakeProgress::StartExecuteModal( const Link& rEndDialogHdl ) { maTakeThread.create(); ModalDialog::StartExecuteModal( rEndDialogHdl ); } // --------------------- // - ActualizeProgress - // --------------------- ActualizeProgress::ActualizeProgress( Window* pWindow, GalleryTheme* pThm ) : ModalDialog ( pWindow, CUI_RES( RID_SVXDLG_GALLERY_ACTUALIZE_PROGRESS ) ), aFtActualizeFile ( this, CUI_RES( FT_ACTUALIZE_FILE ) ), aFLActualizeProgress ( this, CUI_RES( FL_ACTUALIZE_PROGRESS ) ), aBtnCancel ( this, CUI_RES( BTN_CANCEL ) ), pTheme ( pThm ) { FreeResource(); aBtnCancel.SetClickHdl( LINK( this, ActualizeProgress, ClickCancelBtn ) ); } // ------------------------------------------------------------------------ short ActualizeProgress::Execute() { short nRet; pTimer = new Timer; if ( pTimer ) { pTimer->SetTimeoutHdl( LINK( this, ActualizeProgress, TimeoutHdl ) ); pTimer->SetTimeout( 500 ); pTimer->Start(); } nRet = ModalDialog::Execute(); return nRet; } // ------------------------------------------------------------------------ IMPL_LINK( ActualizeProgress, ClickCancelBtn, void*, EMPTYARG ) { pTheme->AbortActualize(); EndDialog( RET_OK ); return 0L; } // ------------------------------------------------------------------------ IMPL_LINK( ActualizeProgress, TimeoutHdl, Timer*, _pTimer ) { if ( _pTimer ) { _pTimer->Stop(); delete _pTimer; } pTheme->Actualize( LINK( this, ActualizeProgress, ActualizeHdl ), &aStatusProgress ); ClickCancelBtn( NULL ); return 0; } // ------------------------------------------------------------------------ IMPL_LINK( ActualizeProgress, ActualizeHdl, INetURLObject*, pURL ) { for( long i = 0; i < 128; i++ ) Application::Reschedule(); Flush(); Sync(); if( pURL ) { aFtActualizeFile.SetText( GetReducedString( *pURL, 30 ) ); aFtActualizeFile.Flush(); aFtActualizeFile.Sync(); } return 0; } // --------------- // - TitleDialog - // --------------- TitleDialog::TitleDialog( Window* pParent, const String& rOldTitle ) : ModalDialog ( pParent, CUI_RES( RID_SVXDLG_GALLERY_TITLE ) ), maOk ( this, CUI_RES( BTN_OK ) ), maCancel ( this, CUI_RES( BTN_CANCEL ) ), maHelp ( this, CUI_RES( BTN_HELP ) ), maFL ( this, CUI_RES( FL_TITLE ) ), maEdit ( this, CUI_RES( EDT_TITLE ) ) { FreeResource(); maEdit.SetText( rOldTitle ); maEdit.GrabFocus(); } // ------------------- // - GalleryIdDialog - // ------------------- GalleryIdDialog::GalleryIdDialog( Window* pParent, GalleryTheme* _pThm ) : ModalDialog ( pParent, CUI_RES( RID_SVXDLG_GALLERY_THEMEID ) ), aBtnOk ( this, CUI_RES( BTN_OK ) ), aBtnCancel ( this, CUI_RES( BTN_CANCEL ) ), aFLId ( this, CUI_RES( FL_ID ) ), aLbResName ( this, CUI_RES( LB_RESNAME ) ), pThm ( _pThm ) { FreeResource(); aLbResName.InsertEntry( String( RTL_CONSTASCII_USTRINGPARAM( "!!! No Id !!!" ) ) ); GalleryTheme::InsertAllThemes( aLbResName ); aLbResName.SelectEntryPos( (sal_uInt16) pThm->GetId() ); aLbResName.GrabFocus(); aBtnOk.SetClickHdl( LINK( this, GalleryIdDialog, ClickOkHdl ) ); } // ----------------------------------------------------------------------------- IMPL_LINK( GalleryIdDialog, ClickOkHdl, void*, EMPTYARG ) { Gallery* pGal = pThm->GetParent(); const sal_uLong nId = GetId(); sal_Bool bDifferentThemeExists = sal_False; for( sal_uLong i = 0, nCount = pGal->GetThemeCount(); i < nCount && !bDifferentThemeExists; i++ ) { const GalleryThemeEntry* pInfo = pGal->GetThemeInfo( i ); if( ( pInfo->GetId() == nId ) && ( pInfo->GetThemeName() != pThm->GetName() ) ) { String aStr( CUI_RES( RID_SVXSTR_GALLERY_ID_EXISTS ) ); aStr += String( RTL_CONSTASCII_USTRINGPARAM( " (" ) ); aStr += pInfo->GetThemeName(); aStr += ')'; InfoBox aBox( this, aStr ); aBox.Execute(); aLbResName.GrabFocus(); bDifferentThemeExists = sal_True; } } if( !bDifferentThemeExists ) EndDialog( RET_OK ); return 0L; } // -------------------------- // - GalleryThemeProperties - // -------------------------- GalleryThemeProperties::GalleryThemeProperties( Window* pParent, ExchangeData* _pData, SfxItemSet* pItemSet ) : SfxTabDialog ( pParent, CUI_RES( RID_SVXTABDLG_GALLERYTHEME ), pItemSet ), pData ( _pData ) { FreeResource(); AddTabPage( RID_SVXTABPAGE_GALLERY_GENERAL, TPGalleryThemeGeneral::Create, 0 ); AddTabPage( RID_SVXTABPAGE_GALLERYTHEME_FILES, TPGalleryThemeProperties::Create, 0 ); if( pData->pTheme->IsReadOnly() ) RemoveTabPage( RID_SVXTABPAGE_GALLERYTHEME_FILES ); String aText( GetText() ); aText += pData->pTheme->GetName(); if( pData->pTheme->IsReadOnly() ) aText += String( CUI_RES( RID_SVXSTR_GALLERY_READONLY ) ); SetText( aText ); } // ------------------------------------------------------------------------ void GalleryThemeProperties::PageCreated( sal_uInt16 nId, SfxTabPage &rPage ) { if( RID_SVXTABPAGE_GALLERY_GENERAL == nId ) ( (TPGalleryThemeGeneral&) rPage ).SetXChgData( pData ); else ( (TPGalleryThemeProperties&) rPage ).SetXChgData( pData ); } // ------------------------- // - TPGalleryThemeGeneral - // ------------------------- TPGalleryThemeGeneral::TPGalleryThemeGeneral( Window* pParent, const SfxItemSet& rSet ) : SfxTabPage ( pParent, CUI_RES( RID_SVXTABPAGE_GALLERY_GENERAL ), rSet ), aFiMSImage ( this, CUI_RES( FI_MS_IMAGE ) ), aEdtMSName ( this, CUI_RES( EDT_MS_NAME ) ), aFlMSGeneralFirst ( this, CUI_RES( FL_MS_GENERAL_FIRST ) ), aFtMSType ( this, CUI_RES( FT_MS_TYPE ) ), aFtMSShowType ( this, CUI_RES( FT_MS_SHOW_TYPE ) ), aFtMSPath ( this, CUI_RES( FT_MS_PATH ) ), aFtMSShowPath ( this, CUI_RES( FT_MS_SHOW_PATH ) ), aFtMSContent ( this, CUI_RES( FT_MS_CONTENT ) ), aFtMSShowContent ( this, CUI_RES( FT_MS_SHOW_CONTENT ) ), aFlMSGeneralSecond ( this, CUI_RES( FL_MS_GENERAL_SECOND ) ), aFtMSChangeDate ( this, CUI_RES( FT_MS_CHANGEDATE ) ), aFtMSShowChangeDate ( this, CUI_RES( FT_MS_SHOW_CHANGEDATE ) ) { FreeResource(); } // ------------------------------------------------------------------------ void TPGalleryThemeGeneral::SetXChgData( ExchangeData* _pData ) { pData = _pData; GalleryTheme* pThm = pData->pTheme; String aOutStr( String::CreateFromInt32( pThm->GetObjectCount() ) ); String aObjStr( CUI_RES( RID_SVXSTR_GALLERYPROPS_OBJECT ) ); String aAccess; String aType( CUI_RES( RID_SVXSTR_GALLERYPROPS_GALTHEME ) ); sal_Bool bReadOnly = pThm->IsReadOnly() && !pThm->IsImported(); aEdtMSName.SetHelpId( HID_GALLERY_EDIT_MSNAME ); aEdtMSName.SetText( pThm->GetName() ); aEdtMSName.SetReadOnly( bReadOnly ); if( bReadOnly ) aEdtMSName.Disable(); else aEdtMSName.Enable(); if( pThm->IsReadOnly() ) aType += String( CUI_RES( RID_SVXSTR_GALLERY_READONLY ) ); aFtMSShowType.SetText( aType ); aFtMSShowPath.SetText( pThm->GetSdgURL().GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ); // Ein- oder Mehrzahl? if ( 1 == pThm->GetObjectCount() ) aObjStr = aObjStr.GetToken( 0 ); else aObjStr = aObjStr.GetToken( 1 ); aOutStr += ' '; aOutStr += aObjStr; aFtMSShowContent.SetText( aOutStr ); // get locale wrapper (singleton) const LocaleDataWrapper& aLocaleData = SvtSysLocale().GetLocaleData(); // ChangeDate/Time aAccess = aLocaleData.getDate( pData->aThemeChangeDate ); aAccess += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) ); aAccess += aLocaleData.getTime( pData->aThemeChangeTime ); aFtMSShowChangeDate.SetText( aAccess ); // Image setzen sal_uInt16 nId; if( pThm->IsImported() ) nId = RID_SVXBMP_THEME_IMPORTED_BIG; else if( pThm->IsReadOnly() ) nId = RID_SVXBMP_THEME_READONLY_BIG; else if( pThm->IsDefault() ) nId = RID_SVXBMP_THEME_DEFAULT_BIG; else nId = RID_SVXBMP_THEME_NORMAL_BIG; aFiMSImage.SetImage( Image( Bitmap( CUI_RES( nId ) ), COL_LIGHTMAGENTA ) ); } // ------------------------------------------------------------------------ sal_Bool TPGalleryThemeGeneral::FillItemSet( SfxItemSet& /*rSet*/ ) { pData->aEditedTitle = aEdtMSName.GetText(); return sal_True; } // ------------------------------------------------------------------------ SfxTabPage* TPGalleryThemeGeneral::Create( Window* pParent, const SfxItemSet& rSet ) { return new TPGalleryThemeGeneral( pParent, rSet ); } // ---------------------------- // - TPGalleryThemeProperties - // ---------------------------- TPGalleryThemeProperties::TPGalleryThemeProperties( Window* pWindow, const SfxItemSet& rSet ) : SfxTabPage ( pWindow, CUI_RES( RID_SVXTABPAGE_GALLERYTHEME_FILES ), rSet ), aBtnSearch ( this, CUI_RES(BTN_SEARCH ) ), aBtnTake ( this, CUI_RES(BTN_TAKE ) ), aBtnTakeAll ( this, CUI_RES(BTN_TAKEALL ) ), aCbxPreview ( this, CUI_RES(CBX_PREVIEW ) ), aCbbFileType ( this, CUI_RES(CBB_FILETYPE ) ), aLbxFound ( this, CUI_RES(LBX_FOUND ) ), aFtFileType ( this, CUI_RES(FT_FILETYPE ) ), aWndPreview ( this, CUI_RES( WND_BRSPRV ) ), nCurFilterPos (0), nFirstExtFilterPos (0), bEntriesFound (sal_False), bInputAllowed (sal_True), bSearchRecursive (sal_False), xDialogListener ( new ::svt::DialogClosedListener() ) { FreeResource(); xDialogListener->SetDialogClosedLink( LINK( this, TPGalleryThemeProperties, DialogClosedHdl ) ); } // ------------------------------------------------------------------------ void TPGalleryThemeProperties::SetXChgData( ExchangeData* _pData ) { pData = _pData; aPreviewTimer.SetTimeoutHdl( LINK( this, TPGalleryThemeProperties, PreviewTimerHdl ) ); aPreviewTimer.SetTimeout( 500 ); aBtnSearch.SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickSearchHdl)); aBtnTake.SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickTakeHdl)); aBtnTakeAll.SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickTakeAllHdl)); aCbxPreview.SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickPreviewHdl)); aCbbFileType.SetSelectHdl(LINK(this, TPGalleryThemeProperties, SelectFileTypeHdl)); aCbbFileType.EnableDDAutoWidth( sal_False ); aLbxFound.SetDoubleClickHdl(LINK(this, TPGalleryThemeProperties, DClickFoundHdl)); aLbxFound.SetSelectHdl(LINK(this, TPGalleryThemeProperties, SelectFoundHdl)); aLbxFound.InsertEntry(String(CUI_RES(RID_SVXSTR_GALLERY_NOFILES))); aLbxFound.Show(); FillFilterList(); aBtnTake.Enable(); aBtnTakeAll.Disable(); aCbxPreview.Disable(); } // ------------------------------------------------------------------------ void TPGalleryThemeProperties::StartSearchFiles( const String& _rFolderURL, short _nDlgResult ) { if ( RET_OK == _nDlgResult ) { aURL = INetURLObject( _rFolderURL ); bSearchRecursive = sal_True; // UI choice no longer possible, windows file picker allows no user controls SearchFiles(); } nCurFilterPos = aCbbFileType.GetEntryPos( aCbbFileType.GetText() ); } // ------------------------------------------------------------------------ TPGalleryThemeProperties::~TPGalleryThemeProperties() { xMediaPlayer.clear(); xDialogListener.clear(); for( String* pStr = aFoundList.First(); pStr; pStr = aFoundList.Next() ) delete pStr; for( void* pEntry = aFilterEntryList.First(); pEntry; pEntry = aFilterEntryList.Next() ) delete (FilterEntry*) pEntry; } // ------------------------------------------------------------------------ SfxTabPage* TPGalleryThemeProperties::Create( Window* pParent, const SfxItemSet& rSet ) { return new TPGalleryThemeProperties( pParent, rSet ); } // ------------------------------------------------------------------------ ::rtl::OUString TPGalleryThemeProperties::addExtension( const ::rtl::OUString& _rDisplayText, const ::rtl::OUString& _rExtension ) { ::rtl::OUString sAllFilter( RTL_CONSTASCII_USTRINGPARAM( "(*.*)" ) ); ::rtl::OUString sOpenBracket( RTL_CONSTASCII_USTRINGPARAM( " (" ) ); ::rtl::OUString sCloseBracket( RTL_CONSTASCII_USTRINGPARAM( ")" ) ); ::rtl::OUString sRet = _rDisplayText; if ( sRet.indexOf( sAllFilter ) == -1 ) { String sExt = _rExtension; sRet += sOpenBracket; sRet += sExt; sRet += sCloseBracket; } return sRet; } // ------------------------------------------------------------------------ void TPGalleryThemeProperties::FillFilterList() { GraphicFilter* pFilter = GraphicFilter::GetGraphicFilter(); String aExt; String aName; FilterEntry* pFilterEntry; FilterEntry* pTestEntry; sal_uInt16 i, nKeyCount; sal_Bool bInList; // graphic filters for( i = 0, nKeyCount = pFilter->GetImportFormatCount(); i < nKeyCount; i++ ) { aExt = pFilter->GetImportFormatShortName( i ); aName = pFilter->GetImportFormatName( i ); pTestEntry = (FilterEntry*) aFilterEntryList.First(); bInList = sal_False; String aExtensions; int j = 0; String sWildcard; while( sal_True ) { sWildcard = pFilter->GetImportWildcard( i, j++ ); if ( !sWildcard.Len() ) break; if ( aExtensions.Search( sWildcard ) == STRING_NOTFOUND ) { if ( aExtensions.Len() ) aExtensions += sal_Unicode(';'); aExtensions += sWildcard; } } aName = addExtension( aName, aExtensions ); while( pTestEntry ) { if ( pTestEntry->aFilterName == aExt ) { bInList = sal_True; break; } pTestEntry = (FilterEntry*) aFilterEntryList.Next(); } if ( !bInList ) { pFilterEntry = new FilterEntry; pFilterEntry->aFilterName = aExt; aFilterEntryList.Insert( pFilterEntry, aCbbFileType.InsertEntry( aName ) ); } } // media filters static const ::rtl::OUString aWildcard( RTL_CONSTASCII_USTRINGPARAM( "*." ) ); ::avmedia::FilterNameVector aFilters; const ::rtl::OUString aSeparator( RTL_CONSTASCII_USTRINGPARAM( ";" ) ); ::rtl::OUString aAllTypes; ::avmedia::MediaWindow::getMediaFilters( aFilters ); for( unsigned long l = 0; l < aFilters.size(); ++l ) { for( sal_Int32 nIndex = 0; nIndex >= 0; ) { ::rtl::OUString aFilterWildcard( aWildcard ); pFilterEntry = new FilterEntry; pFilterEntry->aFilterName = aFilters[ l ].second.getToken( 0, ';', nIndex ); nFirstExtFilterPos = aCbbFileType.InsertEntry( addExtension( aFilters[ l ].first, aFilterWildcard += pFilterEntry->aFilterName ) ); aFilterEntryList.Insert( pFilterEntry, nFirstExtFilterPos ); } } // 'All' filters String aExtensions; // graphic filters for ( i = 0; i < nKeyCount; ++i ) { int j = 0; String sWildcard; while( sal_True ) { sWildcard = pFilter->GetImportWildcard( i, j++ ); if ( !sWildcard.Len() ) break; if ( aExtensions.Search( sWildcard ) == STRING_NOTFOUND ) { if ( aExtensions.Len() ) aExtensions += sal_Unicode( ';' ); aExtensions += sWildcard; } } } // media filters for( unsigned long k = 0; k < aFilters.size(); ++k ) { for( sal_Int32 nIndex = 0; nIndex >= 0; ) { if ( aExtensions.Len() ) aExtensions += sal_Unicode( ';' ); ( aExtensions += String( aWildcard ) ) += String( aFilters[ k ].second.getToken( 0, ';', nIndex ) ); } } #if defined(WNT) if ( aExtensions.Len() > 240 ) aExtensions = DEFINE_CONST_UNICODE( "*.*" ); #endif pFilterEntry = new FilterEntry; pFilterEntry->aFilterName = String( CUI_RES( RID_SVXSTR_GALLERY_ALLFILES ) ); pFilterEntry->aFilterName = addExtension( pFilterEntry->aFilterName, aExtensions ); aFilterEntryList.Insert(pFilterEntry, aCbbFileType. InsertEntry( pFilterEntry->aFilterName, 0 ) ); aCbbFileType.SetText( pFilterEntry->aFilterName ); } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, SelectFileTypeHdl, void *, EMPTYARG ) { String aText( aCbbFileType.GetText() ); if( bInputAllowed && ( aLastFilterName != aText ) ) { aLastFilterName = aText; if( QueryBox( this, WB_YES_NO, String( CUI_RES( RID_SVXSTR_GALLERY_SEARCH ) ) ).Execute() == RET_YES ) SearchFiles(); } return 0L; } // ------------------------------------------------------------------------ void TPGalleryThemeProperties::SearchFiles() { SearchProgress* pProgress = new SearchProgress( this, aURL ); for( String* pStr = aFoundList.First(); pStr; pStr = aFoundList.Next() ) delete pStr; aFoundList.Clear(); aLbxFound.Clear(); pProgress->SetFileType( aCbbFileType.GetText() ); pProgress->SetDirectory( rtl::OUString() ); pProgress->Update(); pProgress->StartExecuteModal( LINK( this, TPGalleryThemeProperties, EndSearchProgressHdl ) ); } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, ClickCloseBrowserHdl, void *, EMPTYARG ) { if( bInputAllowed ) aPreviewTimer.Stop(); return 0L; } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, ClickSearchHdl, void *, EMPTYARG ) { if( bInputAllowed ) { try { // setup folder picker ::com::sun::star::uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); if( xMgr.is() ) { xFolderPicker = ::com::sun::star::uno::Reference< XFolderPicker >( xMgr->createInstance( OUString::createFromAscii( "com.sun.star.ui.dialogs.FolderPicker" )), UNO_QUERY ); if ( xFolderPicker.is() ) { String aDlgPathName( SvtPathOptions().GetGraphicPath() ); xFolderPicker->setDisplayDirectory(aDlgPathName); aPreviewTimer.Stop(); ::com::sun::star::uno::Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY ); if ( xAsyncDlg.is() ) xAsyncDlg->startExecuteModal( xDialogListener.get() ); else { if( xFolderPicker->execute() == RET_OK ) { aURL = INetURLObject( xFolderPicker->getDirectory() ); bSearchRecursive = sal_True; // UI choice no longer possible, windows file picker allows no user controls SearchFiles(); } nCurFilterPos = aCbbFileType.GetEntryPos( aCbbFileType.GetText() ); } } } } catch(IllegalArgumentException) { #ifdef DBG_UTIL DBG_ERROR( "Folder picker failed with illegal arguments" ); #endif } } return 0L; } // ------------------------------------------------------------------------ void TPGalleryThemeProperties::TakeFiles() { if( aLbxFound.GetSelectEntryCount() || ( bTakeAll && bEntriesFound ) ) { TakeProgress* pTakeProgress = new TakeProgress( this ); pTakeProgress->Update(); pTakeProgress->StartExecuteModal( Link() /* no postprocessing needed, pTakeProgress will be deleted in TakeProgress::CleanupHdl */ ); } } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, ClickPreviewHdl, void *, EMPTYARG ) { if ( bInputAllowed ) { aPreviewTimer.Stop(); aPreviewString.Erase(); if( !aCbxPreview.IsChecked() ) { xMediaPlayer.clear(); aWndPreview.SetGraphic( Graphic() ); aWndPreview.Invalidate(); } else DoPreview(); } return 0; } // ------------------------------------------------------------------------ void TPGalleryThemeProperties::DoPreview() { String aString( aLbxFound.GetSelectEntry() ); if( aString != aPreviewString ) { INetURLObject _aURL( *aFoundList.GetObject( aLbxFound.GetEntryPos( aString ) ) ); bInputAllowed = sal_False; if ( !aWndPreview.SetGraphic( _aURL ) ) { GetParent()->LeaveWait(); ErrorHandler::HandleError( ERRCODE_IO_NOTEXISTSPATH ); GetParent()->EnterWait(); } else if( ::avmedia::MediaWindow::isMediaURL( _aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ) ) { xMediaPlayer = ::avmedia::MediaWindow::createPlayer( _aURL.GetMainURL( INetURLObject::NO_DECODE ) ); if( xMediaPlayer.is() ) xMediaPlayer->start(); } bInputAllowed = sal_True; aPreviewString = aString; } } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, ClickTakeHdl, void*, EMPTYARG ) { if( bInputAllowed ) { aPreviewTimer.Stop(); if( !aLbxFound.GetSelectEntryCount() || !bEntriesFound ) { SvxOpenGraphicDialog aDlg(String( RTL_CONSTASCII_USTRINGPARAM( "Gallery" ) ) ); aDlg.EnableLink(sal_False); aDlg.AsLink(sal_False); if( !aDlg.Execute() ) pData->pTheme->InsertURL( INetURLObject( aDlg.GetPath() ) ); } else { bTakeAll = sal_False; TakeFiles(); } } return 0L; } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, ClickTakeAllHdl, void *, EMPTYARG ) { if( bInputAllowed ) { aPreviewTimer.Stop(); bTakeAll = sal_True; TakeFiles(); } return 0L; } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, SelectFoundHdl, void *, EMPTYARG ) { if( bInputAllowed ) { sal_Bool bPreviewPossible = sal_False; aPreviewTimer.Stop(); if( bEntriesFound ) { if( aLbxFound.GetSelectEntryCount() == 1 ) { aCbxPreview.Enable(); bPreviewPossible = sal_True; } else aCbxPreview.Disable(); if( aFoundList.Count() ) aBtnTakeAll.Enable(); else aBtnTakeAll.Disable(); } if( bPreviewPossible && aCbxPreview.IsChecked() ) aPreviewTimer.Start(); } return 0; } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, DClickFoundHdl, void *, EMPTYARG ) { if( bInputAllowed ) { aPreviewTimer.Stop(); return (aLbxFound.GetSelectEntryCount() == 1 && bEntriesFound) ? ClickTakeHdl(NULL) : 0; } else return 0; } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, PreviewTimerHdl, void *, EMPTYARG ) { aPreviewTimer.Stop(); DoPreview(); return 0L; } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, EndSearchProgressHdl, SearchProgress *, EMPTYARG ) { if( aFoundList.Count() ) { aLbxFound.SelectEntryPos( 0 ); aBtnTakeAll.Enable(); aCbxPreview.Enable(); bEntriesFound = sal_True; } else { aLbxFound.InsertEntry( String( CUI_RES( RID_SVXSTR_GALLERY_NOFILES ) ) ); aBtnTakeAll.Disable(); aCbxPreview.Disable(); bEntriesFound = sal_False; } return 0L; } // ------------------------------------------------------------------------ IMPL_LINK( TPGalleryThemeProperties, DialogClosedHdl, ::com::sun::star::ui::dialogs::DialogClosedEvent*, pEvt ) { DBG_ASSERT( xFolderPicker.is() == sal_True, "TPGalleryThemeProperties::DialogClosedHdl(): no folder picker" ); String sURL = String( xFolderPicker->getDirectory() ); StartSearchFiles( sURL, pEvt->DialogResult ); return 0L; }