diff options
-rw-r--r-- | cui/source/dialogs/cuigaldlg.cxx | 232 | ||||
-rw-r--r-- | cui/source/inc/cuigaldlg.hxx | 42 | ||||
-rw-r--r-- | cui/uiconfig/ui/galleryfilespage.ui | 88 | ||||
-rw-r--r-- | extras/source/glade/libreoffice-catalog.xml.in | 3 | ||||
-rw-r--r-- | include/svx/galctrl.hxx | 21 | ||||
-rw-r--r-- | svx/source/gallery2/galctrl.cxx | 86 |
6 files changed, 288 insertions, 184 deletions
diff --git a/cui/source/dialogs/cuigaldlg.cxx b/cui/source/dialogs/cuigaldlg.cxx index aacb1f37ff89..f2eeb836e15c 100644 --- a/cui/source/dialogs/cuigaldlg.cxx +++ b/cui/source/dialogs/cuigaldlg.cxx @@ -73,31 +73,29 @@ SearchThread::SearchThread( SearchProgress* pProgress, { } - SearchThread::~SearchThread() { } - void SearchThread::execute() { - const OUString aFileType( mpBrowser->m_pCbbFileType->GetText() ); + const OUString aFileType(mpBrowser->m_xCbbFileType->get_active_text()); - if( !aFileType.isEmpty() ) + if (!aFileType.isEmpty()) { - const sal_Int32 nFileNumber = mpBrowser->m_pCbbFileType->GetEntryPos( aFileType ); + const int nFileNumber = mpBrowser->m_xCbbFileType->find_text(aFileType); sal_Int32 nBeginFormat, nEndFormat; std::vector< OUString > aFormats; - if( !nFileNumber || ( nFileNumber >= mpBrowser->m_pCbbFileType->GetEntryCount() ) ) + if( !nFileNumber || nFileNumber == -1) { nBeginFormat = 1; - nEndFormat = mpBrowser->m_pCbbFileType->GetEntryCount() - 1; + nEndFormat = mpBrowser->m_xCbbFileType->get_count() - 1; } else nBeginFormat = nEndFormat = nFileNumber; - for( sal_Int32 i = nBeginFormat; i <= nEndFormat; ++i ) + for (sal_Int32 i = nBeginFormat; i <= nEndFormat; ++i) aFormats.push_back( mpBrowser->aFilterEntryList[ i ]->aFilterName.toAsciiLowerCase() ); ImplSearch( maStartURL, aFormats, mpBrowser->bSearchRecursive ); @@ -171,9 +169,9 @@ void SearchThread::ImplSearch( const INetURLObject& rStartURL, mpBrowser->aFoundList.push_back( aFoundURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) ); - mpBrowser->m_pLbxFound->InsertEntry( - GetReducedString( aFoundURL, 50 ), - static_cast<sal_uInt16>(mpBrowser->aFoundList.size()) - 1 ); + mpBrowser->m_xLbxFound->insert_text( + mpBrowser->aFoundList.size() - 1, + GetReducedString(aFoundURL, 50)); } } } @@ -279,16 +277,24 @@ void TakeThread::execute() GalleryTheme* pThm = mpBrowser->GetXChgData()->pTheme; std::unique_ptr<GalleryProgress> pStatusProgress; + std::vector<int> aSelectedRows; + { SolarMutexGuard aGuard; pStatusProgress.reset(new GalleryProgress); - nEntries = mpBrowser->bTakeAll ? mpBrowser->m_pLbxFound->GetEntryCount() : mpBrowser->m_pLbxFound->GetSelectedEntryCount(); + if (mpBrowser->bTakeAll) + nEntries = mpBrowser->m_xLbxFound->n_children(); + else + { + aSelectedRows = mpBrowser->m_xLbxFound->get_selected_rows(); + nEntries = aSelectedRows.size(); + } pThm->LockBroadcaster(); } for( sal_Int32 i = 0; i < nEntries && schedule(); ++i ) { - const sal_Int32 nPos = mpBrowser->bTakeAll ? i : mpBrowser->m_pLbxFound->GetSelectedEntryPos( i ); + const sal_Int32 nPos = mpBrowser->bTakeAll ? i : aSelectedRows[i]; const INetURLObject aURL( mpBrowser->aFoundList[ nPos ]); mrTakenList.push_back( static_cast<sal_uLong>(nPos) ); @@ -359,8 +365,8 @@ IMPL_LINK_NOARG(TakeProgress, CleanUpHdl, void*, void) sal_uInt32 i, nCount; GetParent()->EnterWait(); - pBrowser->m_pLbxFound->SetUpdateMode( false ); - pBrowser->m_pLbxFound->SetNoSelection(); + pBrowser->m_xLbxFound->select(-1); + pBrowser->m_xLbxFound->freeze(); // mark all taken positions in aRemoveEntries for( i = 0, nCount = maTakenList.size(); i < nCount; ++i ) @@ -382,17 +388,17 @@ IMPL_LINK_NOARG(TakeProgress, CleanUpHdl, void*, void) // refill list box for( i = 0, nCount = aRemoveEntries.size(); i < nCount; ++i ) if( !aRemoveEntries[ i ] ) - aRemainingVector.push_back( pBrowser->m_pLbxFound->GetEntry( static_cast<sal_uInt16>(i) ) ); + aRemainingVector.push_back(pBrowser->m_xLbxFound->get_text(i)); - pBrowser->m_pLbxFound->Clear(); + pBrowser->m_xLbxFound->clear(); for( i = 0, nCount = aRemainingVector.size(); i < nCount; ++i ) - pBrowser->m_pLbxFound->InsertEntry( aRemainingVector[ i ] ); + pBrowser->m_xLbxFound->append_text(aRemainingVector[i]); aRemainingVector.clear(); - pBrowser->m_pLbxFound->SetUpdateMode( true ); - pBrowser->SelectFoundHdl( *pBrowser->m_pLbxFound ); + pBrowser->m_xLbxFound->thaw(); + pBrowser->SelectFoundHdl( *pBrowser->m_xLbxFound ); GetParent()->LeaveWait(); EndDialog( RET_OK ); @@ -653,57 +659,51 @@ VclPtr<SfxTabPage> TPGalleryThemeGeneral::Create(TabPageParent pParent, const Sf return VclPtr<TPGalleryThemeGeneral>::Create(pParent, *rSet); } -TPGalleryThemeProperties::TPGalleryThemeProperties( vcl::Window* pWindow, const SfxItemSet& rSet ) - : SfxTabPage(pWindow, "GalleryFilesPage", "cui/ui/galleryfilespage.ui", &rSet) +TPGalleryThemeProperties::TPGalleryThemeProperties(TabPageParent pWindow, const SfxItemSet& rSet) + : SfxTabPage(pWindow, "cui/ui/galleryfilespage.ui", "GalleryFilesPage", &rSet) , pData(nullptr) - , nFirstExtFilterPos(0) , bEntriesFound(false) , bInputAllowed(true) , bTakeAll(false) , bSearchRecursive(false) , xDialogListener(new ::svt::DialogClosedListener()) + , m_xCbbFileType(m_xBuilder->weld_combo_box("filetype")) + , m_xLbxFound(m_xBuilder->weld_tree_view("files")) + , m_xBtnSearch(m_xBuilder->weld_button("findfiles")) + , m_xBtnTake(m_xBuilder->weld_button("add")) + , m_xBtnTakeAll(m_xBuilder->weld_button("addall")) + , m_xCbxPreview(m_xBuilder->weld_check_button("preview")) + , m_xWndPreview(new weld::CustomWeld(*m_xBuilder, "image", m_aWndPreview)) { - get(m_pCbbFileType, "filetype"); - get(m_pLbxFound, "files"); - Size aSize(LogicToPixel(Size(172, 156), MapMode(MapUnit::MapAppFont))); - m_pLbxFound->set_width_request(aSize.Width()); - m_pLbxFound->set_height_request(aSize.Height()); - m_pLbxFound->EnableMultiSelection(true); - get(m_pBtnSearch, "findfiles"); - get(m_pBtnTake, "add"); - get(m_pBtnTakeAll, "addall"); - get(m_pCbxPreview, "preview"); - get(m_pWndPreview, "image"); - + m_xLbxFound->set_size_request(m_xLbxFound->get_approximate_digit_width() * 35, + m_xLbxFound->get_height_rows(15)); + m_xLbxFound->set_selection_mode(true); xDialogListener->SetDialogClosedLink( LINK( this, TPGalleryThemeProperties, DialogClosedHdl ) ); } - void TPGalleryThemeProperties::SetXChgData( ExchangeData* _pData ) { pData = _pData; aPreviewTimer.SetInvokeHandler( LINK( this, TPGalleryThemeProperties, PreviewTimerHdl ) ); aPreviewTimer.SetTimeout( 500 ); - m_pBtnSearch->SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickSearchHdl)); - m_pBtnTake->SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickTakeHdl)); - m_pBtnTakeAll->SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickTakeAllHdl)); - m_pCbxPreview->SetClickHdl(LINK(this, TPGalleryThemeProperties, ClickPreviewHdl)); - m_pCbbFileType->SetSelectHdl(LINK(this, TPGalleryThemeProperties, SelectFileTypeHdl)); - m_pCbbFileType->EnableDDAutoWidth( false ); - m_pLbxFound->SetDoubleClickHdl(LINK(this, TPGalleryThemeProperties, DClickFoundHdl)); - m_pLbxFound->SetSelectHdl(LINK(this, TPGalleryThemeProperties, SelectFoundHdl)); - m_pLbxFound->InsertEntry(CuiResId(RID_SVXSTR_GALLERY_NOFILES)); - m_pLbxFound->Show(); + m_xBtnSearch->connect_clicked(LINK(this, TPGalleryThemeProperties, ClickSearchHdl)); + m_xBtnTake->connect_clicked(LINK(this, TPGalleryThemeProperties, ClickTakeHdl)); + m_xBtnTakeAll->connect_clicked(LINK(this, TPGalleryThemeProperties, ClickTakeAllHdl)); + m_xCbxPreview->connect_toggled(LINK(this, TPGalleryThemeProperties, ClickPreviewHdl)); + m_xCbbFileType->connect_changed(LINK(this, TPGalleryThemeProperties, SelectFileTypeHdl)); + m_xLbxFound->connect_row_activated(LINK(this, TPGalleryThemeProperties, DClickFoundHdl)); + m_xLbxFound->connect_changed(LINK(this, TPGalleryThemeProperties, SelectFoundHdl)); + m_xLbxFound->append_text(CuiResId(RID_SVXSTR_GALLERY_NOFILES)); + m_xLbxFound->show(); FillFilterList(); - m_pBtnTake->Enable(); - m_pBtnTakeAll->Disable(); - m_pCbxPreview->Disable(); + m_xBtnTake->set_sensitive(true); + m_xBtnTakeAll->set_sensitive(false); + m_xCbxPreview->set_sensitive(false); } - void TPGalleryThemeProperties::StartSearchFiles( const OUString& _rFolderURL, short _nDlgResult ) { if ( RET_OK == _nDlgResult ) @@ -714,37 +714,24 @@ void TPGalleryThemeProperties::StartSearchFiles( const OUString& _rFolderURL, sh } } - TPGalleryThemeProperties::~TPGalleryThemeProperties() { disposeOnce(); } - void TPGalleryThemeProperties::dispose() { xMediaPlayer.clear(); xDialogListener.clear(); - aFilterEntryList.clear(); - - m_pCbbFileType.clear(); - m_pLbxFound.clear(); - m_pBtnSearch.clear(); - m_pBtnTake.clear(); - m_pBtnTakeAll.clear(); - m_pCbxPreview.clear(); - m_pWndPreview.clear(); SfxTabPage::dispose(); } - -VclPtr<SfxTabPage> TPGalleryThemeProperties::Create( TabPageParent pParent, const SfxItemSet* rSet ) +VclPtr<SfxTabPage> TPGalleryThemeProperties::Create(TabPageParent pParent, const SfxItemSet* rSet) { - return VclPtr<TPGalleryThemeProperties>::Create( pParent.pParent, *rSet ); + return VclPtr<TPGalleryThemeProperties>::Create(pParent, *rSet); } - OUString TPGalleryThemeProperties::addExtension( const OUString& _rDisplayText, const OUString& _rExtension ) { OUString sRet = _rDisplayText; @@ -755,7 +742,6 @@ OUString TPGalleryThemeProperties::addExtension( const OUString& _rDisplayText, return sRet; } - void TPGalleryThemeProperties::FillFilterList() { GraphicFilter &rFilter = GraphicFilter::GetGraphicFilter(); @@ -803,12 +789,8 @@ void TPGalleryThemeProperties::FillFilterList() { std::unique_ptr<FilterEntry> pFilterEntry(new FilterEntry); pFilterEntry->aFilterName = aExt; - size_t pos = m_pCbbFileType->InsertEntry( aName ); - if ( pos < aFilterEntryList.size() ) { - aFilterEntryList.insert( aFilterEntryList.begin() + pos, std::move(pFilterEntry) ); - } else { - aFilterEntryList.push_back( std::move(pFilterEntry) ); - } + m_xCbbFileType->append_text(aName); + aFilterEntryList.push_back(std::move(pFilterEntry)); } } @@ -827,21 +809,10 @@ void TPGalleryThemeProperties::FillFilterList() std::unique_ptr<FilterEntry> pFilterEntry(new FilterEntry); pFilterEntry->aFilterName = aFilter.second.getToken( 0, ';', nIndex ); aFilterWildcard += pFilterEntry->aFilterName; - nFirstExtFilterPos = m_pCbbFileType->InsertEntry( - addExtension( aFilter.first, aFilterWildcard ) - ); - if ( nFirstExtFilterPos < aFilterEntryList.size() ) { - aFilterEntryList.insert( - aFilterEntryList.begin() + nFirstExtFilterPos, - std::move(pFilterEntry) - ); - } else { - aFilterEntryList.push_back( std::move(pFilterEntry) ); - } + m_xCbbFileType->append_text(addExtension(aFilter.first, aFilterWildcard)); + aFilterEntryList.push_back( std::move(pFilterEntry) ); } } -#else - (void) nFirstExtFilterPos; #endif // 'All' filters @@ -887,19 +858,15 @@ void TPGalleryThemeProperties::FillFilterList() std::unique_ptr<FilterEntry> pFilterEntry(new FilterEntry); pFilterEntry->aFilterName = CuiResId(RID_SVXSTR_GALLERY_ALLFILES); - pFilterEntry->aFilterName = addExtension( pFilterEntry->aFilterName, aExtensions ); - size_t pos = m_pCbbFileType->InsertEntry( pFilterEntry->aFilterName, 0 ); - m_pCbbFileType->SetText( pFilterEntry->aFilterName ); - if ( pos < aFilterEntryList.size() ) { - aFilterEntryList.insert( aFilterEntryList.begin() + pos, std::move(pFilterEntry) ); - } else { - aFilterEntryList.push_back( std::move(pFilterEntry) ); - } + pFilterEntry->aFilterName = addExtension(pFilterEntry->aFilterName, aExtensions); + m_xCbbFileType->insert_text(0, pFilterEntry->aFilterName); + m_xCbbFileType->set_active(0); + aFilterEntryList.insert(aFilterEntryList.begin(), std::move(pFilterEntry)); } -IMPL_LINK_NOARG(TPGalleryThemeProperties, SelectFileTypeHdl, ComboBox&, void) +IMPL_LINK_NOARG(TPGalleryThemeProperties, SelectFileTypeHdl, weld::ComboBox&, void) { - OUString aText( m_pCbbFileType->GetText() ); + OUString aText(m_xCbbFileType->get_active_text()); if( bInputAllowed && ( aLastFilterName != aText ) ) { @@ -917,9 +884,9 @@ void TPGalleryThemeProperties::SearchFiles() VclPtrInstance<SearchProgress> pProgress( this, aURL ); aFoundList.clear(); - m_pLbxFound->Clear(); + m_xLbxFound->clear(); - pProgress->SetFileType( m_pCbbFileType->GetText() ); + pProgress->SetFileType( m_xCbbFileType->get_active_text() ); pProgress->SetDirectory( INetURLObject() ); pProgress->Update(); @@ -928,8 +895,7 @@ void TPGalleryThemeProperties::SearchFiles() }); } - -IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickSearchHdl, Button*, void) +IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickSearchHdl, weld::Button&, void) { if( bInputAllowed ) { @@ -966,7 +932,7 @@ IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickSearchHdl, Button*, void) void TPGalleryThemeProperties::TakeFiles() { - if( m_pLbxFound->GetSelectedEntryCount() || ( bTakeAll && bEntriesFound ) ) + if (m_xLbxFound->count_selected_rows() || (bTakeAll && bEntriesFound)) { VclPtrInstance<TakeProgress> pTakeProgress( this ); pTakeProgress->Update(); @@ -978,39 +944,38 @@ void TPGalleryThemeProperties::TakeFiles() } } - -IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickPreviewHdl, Button*, void) +IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickPreviewHdl, weld::ToggleButton&, void) { if ( bInputAllowed ) { aPreviewTimer.Stop(); aPreviewString.clear(); - if( !m_pCbxPreview->IsChecked() ) + if (!m_xCbxPreview->get_active()) { xMediaPlayer.clear(); - m_pWndPreview->SetGraphic( Graphic() ); - m_pWndPreview->Invalidate(); + m_aWndPreview.SetGraphic(Graphic()); + m_aWndPreview.Invalidate(); } else DoPreview(); } } - void TPGalleryThemeProperties::DoPreview() { - OUString aString( m_pLbxFound->GetSelectedEntry() ); + int nIndex = m_xLbxFound->get_selected_index(); + OUString aString(m_xLbxFound->get_text(nIndex)); - if( aString != aPreviewString ) + if (aString != aPreviewString) { - INetURLObject _aURL( aFoundList[ m_pLbxFound->GetEntryPos( aString ) ] ); + INetURLObject _aURL(aFoundList[nIndex]); bInputAllowed = false; - if ( !m_pWndPreview->SetGraphic( _aURL ) ) + if (!m_aWndPreview.SetGraphic(_aURL)) { GetParent()->LeaveWait(); - ErrorHandler::HandleError( ERRCODE_IO_NOTEXISTSPATH ); + ErrorHandler::HandleError(ERRCODE_IO_NOTEXISTSPATH, GetDialogFrameWeld()); GetParent()->EnterWait(); } #if HAVE_FEATURE_AVMEDIA @@ -1026,14 +991,13 @@ void TPGalleryThemeProperties::DoPreview() } } - -IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickTakeHdl, Button*, void) +IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickTakeHdl, weld::Button&, void) { if( bInputAllowed ) { aPreviewTimer.Stop(); - if( !m_pLbxFound->GetSelectedEntryCount() || !bEntriesFound ) + if (!m_xLbxFound->count_selected_rows() || !bEntriesFound) { SvxOpenGraphicDialog aDlg("Gallery", GetFrameWeld()); aDlg.EnableLink(false); @@ -1050,8 +1014,7 @@ IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickTakeHdl, Button*, void) } } - -IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickTakeAllHdl, Button*, void) +IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickTakeAllHdl, weld::Button&, void) { if( bInputAllowed ) { @@ -1061,10 +1024,9 @@ IMPL_LINK_NOARG(TPGalleryThemeProperties, ClickTakeAllHdl, Button*, void) } } - -IMPL_LINK_NOARG(TPGalleryThemeProperties, SelectFoundHdl, ListBox&, void) +IMPL_LINK_NOARG(TPGalleryThemeProperties, SelectFoundHdl, weld::TreeView&, void) { - if( bInputAllowed ) + if (bInputAllowed) { bool bPreviewPossible = false; @@ -1072,38 +1034,36 @@ IMPL_LINK_NOARG(TPGalleryThemeProperties, SelectFoundHdl, ListBox&, void) if( bEntriesFound ) { - if( m_pLbxFound->GetSelectedEntryCount() == 1 ) + if (m_xLbxFound->count_selected_rows() == 1) { - m_pCbxPreview->Enable(); + m_xCbxPreview->set_sensitive(true); bPreviewPossible = true; } else - m_pCbxPreview->Disable(); + m_xCbxPreview->set_sensitive(false); if( !aFoundList.empty() ) - m_pBtnTakeAll->Enable(); + m_xBtnTakeAll->set_sensitive(true); else - m_pBtnTakeAll->Disable(); + m_xBtnTakeAll->set_sensitive(false); } - if( bPreviewPossible && m_pCbxPreview->IsChecked() ) + if (bPreviewPossible && m_xCbxPreview->get_active()) aPreviewTimer.Start(); } } - -IMPL_LINK_NOARG(TPGalleryThemeProperties, DClickFoundHdl, ListBox&, void) +IMPL_LINK_NOARG(TPGalleryThemeProperties, DClickFoundHdl, weld::TreeView&, void) { if( bInputAllowed ) { aPreviewTimer.Stop(); - if (m_pLbxFound->GetSelectedEntryCount() == 1 && bEntriesFound) - ClickTakeHdl(nullptr); + if (m_xLbxFound->count_selected_rows() == 1 && bEntriesFound) + ClickTakeHdl(*m_xBtnTake); } } - IMPL_LINK_NOARG(TPGalleryThemeProperties, PreviewTimerHdl, Timer *, void) { aPreviewTimer.Stop(); @@ -1114,16 +1074,16 @@ void TPGalleryThemeProperties::EndSearchProgressHdl(sal_Int32 /*nResult*/) { if( !aFoundList.empty() ) { - m_pLbxFound->SelectEntryPos( 0 ); - m_pBtnTakeAll->Enable(); - m_pCbxPreview->Enable(); + m_xLbxFound->select(0); + m_xBtnTakeAll->set_sensitive(true); + m_xCbxPreview->set_sensitive(true); bEntriesFound = true; } else { - m_pLbxFound->InsertEntry( CuiResId( RID_SVXSTR_GALLERY_NOFILES ) ); - m_pBtnTakeAll->Disable(); - m_pCbxPreview->Disable(); + m_xLbxFound->append_text(CuiResId(RID_SVXSTR_GALLERY_NOFILES)); + m_xBtnTakeAll->set_sensitive(false); + m_xCbxPreview->set_sensitive(false); bEntriesFound = false; } } diff --git a/cui/source/inc/cuigaldlg.hxx b/cui/source/inc/cuigaldlg.hxx index 9b5231b1ea6d..a6085e86e07b 100644 --- a/cui/source/inc/cuigaldlg.hxx +++ b/cui/source/inc/cuigaldlg.hxx @@ -232,14 +232,6 @@ class TPGalleryThemeProperties : public SfxTabPage friend class TakeProgress; friend class TakeThread; - VclPtr<ComboBox> m_pCbbFileType; - VclPtr<ListBox> m_pLbxFound; - VclPtr<PushButton> m_pBtnSearch; - VclPtr<PushButton> m_pBtnTake; - VclPtr<PushButton> m_pBtnTakeAll; - VclPtr<CheckBox> m_pCbxPreview; - VclPtr<GalleryPreview> m_pWndPreview; - ExchangeData* pData; std::vector<OUString> aFoundList; std::vector< std::unique_ptr<FilterEntry> > @@ -248,7 +240,6 @@ class TPGalleryThemeProperties : public SfxTabPage OUString aLastFilterName; OUString aPreviewString; INetURLObject aURL; - sal_uInt16 nFirstExtFilterPos; bool bEntriesFound; bool bInputAllowed; bool bTakeAll; @@ -258,6 +249,15 @@ class TPGalleryThemeProperties : public SfxTabPage css::uno::Reference< css::media::XPlayer > xMediaPlayer; css::uno::Reference< css::ui::dialogs::XFolderPicker2 > xFolderPicker; + SvxGalleryPreview m_aWndPreview; + std::unique_ptr<weld::ComboBox> m_xCbbFileType; + std::unique_ptr<weld::TreeView> m_xLbxFound; + std::unique_ptr<weld::Button> m_xBtnSearch; + std::unique_ptr<weld::Button> m_xBtnTake; + std::unique_ptr<weld::Button> m_xBtnTakeAll; + std::unique_ptr<weld::CheckButton> m_xCbxPreview; + std::unique_ptr<weld::CustomWeld> m_xWndPreview; + virtual void Reset( const SfxItemSet* /*rSet*/ ) override {} virtual bool FillItemSet( SfxItemSet* /*rSet*/ ) override { return true; } static OUString addExtension( const OUString&, const OUString& ); @@ -268,19 +268,19 @@ class TPGalleryThemeProperties : public SfxTabPage void DoPreview(); void EndSearchProgressHdl(sal_Int32 nResult); - DECL_LINK( ClickPreviewHdl, Button*, void ); - DECL_LINK( ClickSearchHdl, Button*, void ); - DECL_LINK( ClickTakeHdl, Button*, void ); - DECL_LINK( ClickTakeAllHdl, Button*, void ); - DECL_LINK( SelectFoundHdl, ListBox&, void ); - DECL_LINK( SelectFileTypeHdl, ComboBox&, void ); - DECL_LINK( DClickFoundHdl, ListBox&, void ); - DECL_LINK( PreviewTimerHdl, Timer*, void ); - DECL_LINK( DialogClosedHdl, css::ui::dialogs::DialogClosedEvent*, void ); + DECL_LINK(ClickPreviewHdl, weld::ToggleButton&, void); + DECL_LINK(ClickSearchHdl, weld::Button&, void); + DECL_LINK(ClickTakeHdl, weld::Button&, void); + DECL_LINK(ClickTakeAllHdl, weld::Button&, void); + DECL_LINK(SelectFoundHdl, weld::TreeView&, void); + DECL_LINK(SelectFileTypeHdl, weld::ComboBox&, void); + DECL_LINK(DClickFoundHdl, weld::TreeView&, void); + DECL_LINK(PreviewTimerHdl, Timer*, void); + DECL_LINK(DialogClosedHdl, css::ui::dialogs::DialogClosedEvent*, void); public: - TPGalleryThemeProperties( vcl::Window* pWindow, const SfxItemSet& rSet ); - virtual ~TPGalleryThemeProperties() override; + TPGalleryThemeProperties(TabPageParent pWindow, const SfxItemSet& rSet); + virtual ~TPGalleryThemeProperties() override; virtual void dispose() override; void SetXChgData( ExchangeData* pData ); @@ -288,7 +288,7 @@ public: void StartSearchFiles( const OUString& _rFolderURL, short _nDlgResult ); - static VclPtr<SfxTabPage> Create( TabPageParent pParent, const SfxItemSet* rSet ); + static VclPtr<SfxTabPage> Create(TabPageParent pParent, const SfxItemSet* rSet); }; #endif // INCLUDED_CUI_SOURCE_INC_CUIGALDLG_HXX diff --git a/cui/uiconfig/ui/galleryfilespage.ui b/cui/uiconfig/ui/galleryfilespage.ui index 9fd436d697b7..456627d16cd1 100644 --- a/cui/uiconfig/ui/galleryfilespage.ui +++ b/cui/uiconfig/ui/galleryfilespage.ui @@ -1,8 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.18.3 --> +<!-- Generated with glade 3.22.1 --> <interface domain="cui"> <requires lib="gtk+" version="3.18"/> - <requires lib="LibreOffice" version="1.0"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkGrid" id="GalleryFilesPage"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -15,6 +22,7 @@ <property name="visible">True</property> <property name="can_focus">False</property> <property name="hexpand">True</property> + <property name="vexpand">True</property> <property name="row_spacing">12</property> <child> <object class="GtkGrid" id="grid2"> @@ -26,10 +34,10 @@ <object class="GtkLabel" id="label1"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="xalign">0</property> <property name="label" translatable="yes" context="galleryfilespage|label1">_File type:</property> <property name="use_underline">True</property> <property name="mnemonic_widget">filetype</property> + <property name="xalign">0</property> </object> <packing> <property name="left_attach">0</property> @@ -37,16 +45,16 @@ </packing> </child> <child> - <object class="VclComboBoxText" id="filetype"> + <object class="GtkComboBoxText" id="filetype"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="hexpand">True</property> <property name="has_entry">True</property> - <property name="max_width_chars">30</property> + <property name="width_request">0</property> <child internal-child="entry"> <object class="GtkEntry" id="comboboxtext-entry"> <property name="can_focus">False</property> - <property name="width_chars">30</property> + <property name="activates_default">True</property> </object> </child> </object> @@ -62,20 +70,43 @@ </packing> </child> <child> - <object class="GtkTreeView" id="files:border"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hexpand">True</property> <property name="vexpand">True</property> - <property name="show_expanders">False</property> - <child internal-child="selection"> - <object class="GtkTreeSelection" id="treeview-selection1"> - <property name="mode">multiple</property> - </object> - </child> - <child internal-child="accessible"> - <object class="AtkObject" id="files:border-atkobject"> - <property name="AtkObject::accessible-name" translatable="yes" context="galleryfilespage|files-atkobject">Files Found</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="files"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">liststore1</property> + <property name="headers_visible">False</property> + <property name="headers_clickable">False</property> + <property name="search_column">0</property> + <property name="show_expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"> + <property name="mode">multiple</property> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="treeviewcolumn1"> + <child> + <object class="GtkCellRendererText" id="cellrenderertext1"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="types-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="galleryfilespage|files-atkobject">Files Found</property> + </object> + </child> </object> </child> </object> @@ -116,14 +147,27 @@ </packing> </child> <child> - <object class="svxcorelo-GalleryPreview" id="image:border"> + <object class="GtkScrolledWindow"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> - <child internal-child="accessible"> - <object class="AtkObject" id="image:border-atkobject"> - <property name="AtkObject::accessible-name" translatable="yes" context="galleryfilespage|image-atkobject">Preview</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkDrawingArea" id="image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="image-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="galleryfilespage|image-atkobject">Preview</property> + </object> + </child> + </object> + </child> </object> </child> </object> diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in index 9318e114ef05..3777421a0cc8 100644 --- a/extras/source/glade/libreoffice-catalog.xml.in +++ b/extras/source/glade/libreoffice-catalog.xml.in @@ -154,9 +154,6 @@ <glade-widget-class title="Mark Preview" name="swuilo-SwMarkPreview" generic-name="Mark Preview Window" parent="GtkDrawingArea" icon-name="widget-gtk-drawingarea"/> - <glade-widget-class title="Gallery Preview" name="svxcorelo-GalleryPreview" - generic-name="Gallery Preview" parent="GtkDrawingArea" - icon-name="widget-gtk-drawingarea"/> <glade-widget-class title="Html Attribute Preview" name="sduilo-SdHtmlAttrPreview" generic-name="Html Attribute Preview" parent="GtkDrawingArea" icon-name="widget-gtk-drawingarea"/> diff --git a/include/svx/galctrl.hxx b/include/svx/galctrl.hxx index 8d60b8f4fc27..c2109ee521ce 100644 --- a/include/svx/galctrl.hxx +++ b/include/svx/galctrl.hxx @@ -26,6 +26,7 @@ #include <vcl/menu.hxx> #include <vcl/edit.hxx> #include <vcl/combobox.hxx> +#include <vcl/customweld.hxx> #include <svl/slstitm.hxx> #include <vcl/transfer.hxx> #include <svtools/valueset.hxx> @@ -75,6 +76,26 @@ public: static void PreviewMedia( const INetURLObject& rURL ); }; +class SVX_DLLPUBLIC SvxGalleryPreview : public weld::CustomWidgetController +{ +private: + GraphicObject aGraphicObj; + tools::Rectangle aPreviewRect; + + SVX_DLLPRIVATE bool ImplGetGraphicCenterRect( const Graphic& rGraphic, tools::Rectangle& rResultRect ) const; + SVX_DLLPRIVATE void InitSettings(); + + SVX_DLLPRIVATE virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override; + +public: + + SvxGalleryPreview(); + + virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override; + void SetGraphic( const Graphic& rGraphic ) { aGraphicObj.SetGraphic( rGraphic ); } + bool SetGraphic( const INetURLObject& ); +}; + class GalleryIconView : public ValueSet, public DropTargetHelper, public DragSourceHelper { using ValueSet::StartDrag; diff --git a/svx/source/gallery2/galctrl.cxx b/svx/source/gallery2/galctrl.cxx index af00c3fd15e0..6e68f49cb644 100644 --- a/svx/source/gallery2/galctrl.cxx +++ b/svx/source/gallery2/galctrl.cxx @@ -51,8 +51,6 @@ GalleryPreview::GalleryPreview(vcl::Window* pParent, WinBits nStyle, GalleryThem InitSettings(); } -VCL_BUILDER_FACTORY_CONSTRUCTOR(GalleryPreview, WB_TABSTOP) - Size GalleryPreview::GetOptimalSize() const { return LogicToPixel(Size(70, 88), MapMode(MapUnit::MapAppFont)); @@ -257,6 +255,90 @@ void GalleryPreview::PreviewMedia( const INetURLObject& rURL ) #endif } +SvxGalleryPreview::SvxGalleryPreview() +{ +} + +void SvxGalleryPreview::SetDrawingArea(weld::DrawingArea* pDrawingArea) +{ + CustomWidgetController::SetDrawingArea(pDrawingArea); + Size aSize(pDrawingArea->get_ref_device().LogicToPixel(Size(70, 88), MapMode(MapUnit::MapAppFont))); + pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); + pDrawingArea->set_help_id(HID_GALLERY_WINDOW); +} + +bool SvxGalleryPreview::SetGraphic( const INetURLObject& _aURL ) +{ + bool bRet = true; + Graphic aGraphic; +#if HAVE_FEATURE_AVMEDIA + if( ::avmedia::MediaWindow::isMediaURL( _aURL.GetMainURL( INetURLObject::DecodeMechanism::Unambiguous ), "" ) ) + { + aGraphic = BitmapEx(RID_SVXBMP_GALLERY_MEDIA); + } + else +#endif + { + GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter(); + GalleryProgress aProgress( &rFilter ); + if( rFilter.ImportGraphic( aGraphic, _aURL ) ) + bRet = false; + } + + SetGraphic( aGraphic ); + Invalidate(); + return bRet; +} + +bool SvxGalleryPreview::ImplGetGraphicCenterRect( const Graphic& rGraphic, tools::Rectangle& rResultRect ) const +{ + const Size aWinSize(GetOutputSizePixel()); + Size aNewSize(GetDrawingArea()->get_ref_device().LogicToPixel(rGraphic.GetPrefSize(), rGraphic.GetPrefMapMode())); + bool bRet = false; + + if( aNewSize.Width() && aNewSize.Height() ) + { + // scale to fit window + const double fGrfWH = static_cast<double>(aNewSize.Width()) / aNewSize.Height(); + const double fWinWH = static_cast<double>(aWinSize.Width()) / aWinSize.Height(); + + if ( fGrfWH < fWinWH ) + { + aNewSize.setWidth( static_cast<long>( aWinSize.Height() * fGrfWH ) ); + aNewSize.setHeight( aWinSize.Height() ); + } + else + { + aNewSize.setWidth( aWinSize.Width() ); + aNewSize.setHeight( static_cast<long>( aWinSize.Width() / fGrfWH) ); + } + + const Point aNewPos( ( aWinSize.Width() - aNewSize.Width() ) >> 1, + ( aWinSize.Height() - aNewSize.Height() ) >> 1 ); + + rResultRect = tools::Rectangle( aNewPos, aNewSize ); + bRet = true; + } + + return bRet; +} + +void SvxGalleryPreview::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) +{ + rRenderContext.SetBackground(Wallpaper(GALLERY_BG_COLOR)); + + if (ImplGetGraphicCenterRect(aGraphicObj.GetGraphic(), aPreviewRect)) + { + const Point aPos( aPreviewRect.TopLeft() ); + const Size aSize( aPreviewRect.GetSize() ); + + if( aGraphicObj.IsAnimated() ) + aGraphicObj.StartAnimation(&rRenderContext, aPos, aSize); + else + aGraphicObj.Draw(&rRenderContext, aPos, aSize); + } +} + static void drawTransparenceBackground(vcl::RenderContext& rOut, const Point& rPos, const Size& rSize) { |