diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-09-17 12:50:05 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-09-20 21:20:51 +0200 |
commit | 94d6fa11d086187b82adf9aa596e0f334827e095 (patch) | |
tree | 4a44af903b2572efe89ae5e8aa67bb092644e038 /cui/source/options/treeopt.cxx | |
parent | 3c84b18f4f0fe4058de60b1c62149275ed858b79 (diff) |
weld OfaTreeOptionsDialog
including ability to host a vcl::Window based XWindow hierarchy inside
a native widget, e.g. the dictionary extensions have option pages
Change-Id: I17d933bac12679e10164214a9045b677291a6557
Reviewed-on: https://gerrit.libreoffice.org/79070
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'cui/source/options/treeopt.cxx')
-rw-r--r-- | cui/source/options/treeopt.cxx | 510 |
1 files changed, 216 insertions, 294 deletions
diff --git a/cui/source/options/treeopt.cxx b/cui/source/options/treeopt.cxx index 8b593e86c362..42bd20cac460 100644 --- a/cui/source/options/treeopt.cxx +++ b/cui/source/options/treeopt.cxx @@ -444,9 +444,9 @@ struct OptionsPageInfo sal_uInt16 m_nPageId; OUString m_sPageURL; OUString m_sEventHdl; - VclPtr<ExtensionsTabPage> m_pExtPage; + std::unique_ptr<ExtensionsTabPage> m_xExtPage; - explicit OptionsPageInfo( sal_uInt16 nId ) : m_pPage( nullptr ), m_nPageId( nId ), m_pExtPage( nullptr ) {} + explicit OptionsPageInfo( sal_uInt16 nId ) : m_pPage( nullptr ), m_nPageId( nId ) {} }; struct OptionsGroupInfo @@ -463,46 +463,36 @@ struct OptionsGroupInfo }; #define INI_LIST() \ - m_pParent ( pParent ),\ - pCurrentPageEntry ( nullptr ),\ - sTitle ( GetText() ),\ - bForgetSelection ( false ),\ - bIsFromExtensionManager( false ), \ - bIsForSetDocumentLanguage( false ), \ - bNeedsRestart ( false ), \ - eRestartReason( svtools::RESTART_REASON_NONE ) + , m_pParent ( pParent )\ + , sTitle ( m_xDialog->get_title() )\ + , bForgetSelection ( false )\ + , bIsFromExtensionManager( false ) \ + , bIsForSetDocumentLanguage( false ) \ + , bNeedsRestart ( false ) \ + , eRestartReason( svtools::RESTART_REASON_NONE ) void OfaTreeOptionsDialog::InitWidgets() { - VclButtonBox *pButtonBox = get_action_area(); - pButtonBox->sort_native_button_order(); - - get(pOkPB, "ok"); - get(pApplyPB, "apply"); - get(pBackPB, "revert"); - get(pTreeLB, "pages"); - get(pTabBox, "box"); - Size aSize(pTabBox->LogicToPixel(Size(278, 259), MapMode(MapUnit::MapAppFont))); - pTabBox->set_width_request(aSize.Width()); + xOkPB = m_xBuilder->weld_button("ok"); + xApplyPB = m_xBuilder->weld_button("apply"); + xBackPB = m_xBuilder->weld_button("revert"); + xTreeLB = m_xBuilder->weld_tree_view("pages"); + xTabBox = m_xBuilder->weld_container("box"); + Size aSize(xTreeLB->get_approximate_digit_width() * 82, xTreeLB->get_height_rows(32)); #if HAVE_FEATURE_GPGME // tdf#115015: make enough space for crypto settings (approx. 14 text edits + padding) - pTabBox->set_height_request((Edit::GetMinimumEditSize().Height() + 6) * 14); + aSize.setHeight((Edit::GetMinimumEditSize().Height() + 6) * 14); #else - pTabBox->set_height_request(aSize.Height() - get_action_area()->get_preferred_size().Height()); + aSize.setHeight(aSize.Height() - get_action_area()->get_preferred_size().Height()); #endif - pTreeLB->set_width_request(pTreeLB->approximate_char_width() * 25); - pTreeLB->set_height_request(pTabBox->get_height_request()); - + xTabBox->set_size_request(aSize.Width(), aSize.Height()); + xTreeLB->set_size_request(xTreeLB->get_approximate_digit_width() * 30, aSize.Height()); } // Ctor() with Frame ----------------------------------------------------- -OfaTreeOptionsDialog::OfaTreeOptionsDialog( - vcl::Window* pParent, - const Reference< XFrame >& _xFrame, - bool bActivateLastSelection ) : - - SfxModalDialog( pParent, "OptionsDialog", "cui/ui/optionsdialog.ui" ), +OfaTreeOptionsDialog::OfaTreeOptionsDialog(weld::Window* pParent, const Reference< XFrame >& _xFrame, bool bActivateLastSelection) + : SfxOkDialogController(pParent, "cui/ui/optionsdialog.ui", "OptionsDialog") INI_LIST() { InitWidgets(); @@ -513,13 +503,12 @@ OfaTreeOptionsDialog::OfaTreeOptionsDialog( if (bActivateLastSelection) ActivateLastSelection(); - pTreeLB->SetAccessibleName(GetDisplayText()); + xTreeLB->set_accessible_name(m_xDialog->get_title()); } // Ctor() with ExtensionId ----------------------------------------------- -OfaTreeOptionsDialog::OfaTreeOptionsDialog( vcl::Window* pParent, const OUString& rExtensionId ) : - - SfxModalDialog( pParent, "OptionsDialog", "cui/ui/optionsdialog.ui" ), +OfaTreeOptionsDialog::OfaTreeOptionsDialog(weld::Window* pParent, const OUString& rExtensionId) + : SfxOkDialogController(pParent, "cui/ui/optionsdialog.ui", "OptionsDialog") INI_LIST() { InitWidgets(); @@ -532,20 +521,17 @@ OfaTreeOptionsDialog::OfaTreeOptionsDialog( vcl::Window* pParent, const OUString OfaTreeOptionsDialog::~OfaTreeOptionsDialog() { - disposeOnce(); -} + xCurrentPageEntry.reset(); -void OfaTreeOptionsDialog::dispose() -{ - pCurrentPageEntry = nullptr; - SvTreeListEntry* pEntry = pTreeLB ? pTreeLB->First() : nullptr; + std::unique_ptr<weld::TreeIter> xEntry = xTreeLB->make_iterator(); + bool bEntry = xTreeLB->get_iter_first(*xEntry); // first children - while(pEntry) + while (bEntry) { // if Child (has parent), then OptionsPageInfo - if(pTreeLB->GetParent(pEntry)) + if (xTreeLB->get_iter_depth(*xEntry)) { - OptionsPageInfo *pPageInfo = static_cast<OptionsPageInfo *>(pEntry->GetUserData()); + OptionsPageInfo *pPageInfo = reinterpret_cast<OptionsPageInfo*>(xTreeLB->get_id(*xEntry).toInt64()); if(pPageInfo->m_pPage) { pPageInfo->m_pPage->FillUserData(); @@ -568,42 +554,39 @@ void OfaTreeOptionsDialog::dispose() } } - pPageInfo->m_pExtPage.disposeAndClear(); + pPageInfo->m_xExtPage.reset(); delete pPageInfo; } - pEntry = pTreeLB->Next(pEntry); + bEntry = xTreeLB->iter_next(*xEntry); } // and parents - pEntry = pTreeLB ? pTreeLB->First() : nullptr; - while(pEntry) + bEntry = xTreeLB->get_iter_first(*xEntry); + while (bEntry) { - if(!pTreeLB->GetParent(pEntry)) + if (!xTreeLB->get_iter_depth(*xEntry)) { - OptionsGroupInfo* pGroupInfo = static_cast<OptionsGroupInfo*>(pEntry->GetUserData()); + OptionsGroupInfo* pGroupInfo = reinterpret_cast<OptionsGroupInfo*>(xTreeLB->get_id(*xEntry).toInt64()); delete pGroupInfo; } - pEntry = pTreeLB->Next(pEntry); + bEntry = xTreeLB->iter_next(*xEntry); } deleteGroupNames(); - m_pParent.clear(); - pOkPB.clear(); - pApplyPB.clear(); - pBackPB.clear(); - pTreeLB.clear(); - pTabBox.clear(); - SfxModalDialog::dispose(); } OptionsPageInfo* OfaTreeOptionsDialog::AddTabPage( sal_uInt16 nId, const OUString& rPageName, sal_uInt16 nGroup ) { OptionsPageInfo* pPageInfo = new OptionsPageInfo( nId ); - SvTreeListEntry* pParent = pTreeLB->GetEntry( nullptr, nGroup ); - DBG_ASSERT( pParent, "OfaTreeOptionsDialog::AddTabPage(): no group found" ); - SvTreeListEntry* pEntry = pTreeLB->InsertEntry( rPageName, pParent ); - pEntry->SetUserData( pPageInfo ); + + std::unique_ptr<weld::TreeIter> xParent = xTreeLB->make_iterator(); + xTreeLB->get_iter_first(*xParent); + xTreeLB->iter_nth_sibling(*xParent, nGroup); + + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pPageInfo)));; + xTreeLB->insert(xParent.get(), -1, &rPageName, &sId, nullptr, nullptr, nullptr, false, nullptr); + return pPageInfo; } @@ -613,64 +596,71 @@ sal_uInt16 OfaTreeOptionsDialog::AddGroup(const OUString& rGroupName, SfxModule* pCreateModule, sal_uInt16 nDialogId ) { - SvTreeListEntry* pEntry = pTreeLB->InsertEntry(rGroupName); OptionsGroupInfo* pInfo = new OptionsGroupInfo( pCreateShell, pCreateModule, nDialogId ); - pEntry->SetUserData(pInfo); + OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pInfo)));; + xTreeLB->append(sId, rGroupName); + sal_uInt16 nRet = 0; - pEntry = pTreeLB->First(); - while(pEntry) + std::unique_ptr<weld::TreeIter> xEntry = xTreeLB->make_iterator(); + bool bEntry = xTreeLB->get_iter_first(*xEntry); + while (bEntry) { - if(!pTreeLB->GetParent(pEntry)) + if (!xTreeLB->get_iter_depth(*xEntry)) nRet++; - pEntry = pTreeLB->Next(pEntry); + bEntry = xTreeLB->iter_next(*xEntry); } return nRet - 1; } -IMPL_LINK_NOARG(OfaTreeOptionsDialog, ShowPageHdl_Impl, SvTreeListBox*, void) +IMPL_LINK_NOARG(OfaTreeOptionsDialog, ShowPageHdl_Impl, weld::TreeView&, void) { SelectHdl_Impl(); } -IMPL_LINK_NOARG(OfaTreeOptionsDialog, BackHdl_Impl, Button*, void) +IMPL_LINK_NOARG(OfaTreeOptionsDialog, BackHdl_Impl, weld::Button&, void) { - if ( pCurrentPageEntry && pTreeLB->GetParent( pCurrentPageEntry ) ) + if (xCurrentPageEntry && xTreeLB->get_iter_depth(*xCurrentPageEntry)) { - OptionsPageInfo* pPageInfo = static_cast<OptionsPageInfo*>(pCurrentPageEntry->GetUserData()); - if ( pPageInfo->m_pPage ) + OptionsPageInfo* pPageInfo = reinterpret_cast<OptionsPageInfo*>(xTreeLB->get_id(*xCurrentPageEntry).toInt64()); + if (pPageInfo->m_pPage) { + std::unique_ptr<weld::TreeIter> xParent = xTreeLB->make_iterator(xCurrentPageEntry.get()); + xTreeLB->iter_parent(*xParent); OptionsGroupInfo* pGroupInfo = - static_cast<OptionsGroupInfo*>(pTreeLB->GetParent( pCurrentPageEntry )->GetUserData()); + reinterpret_cast<OptionsGroupInfo*>(xTreeLB->get_id(*xParent).toInt64()); pPageInfo->m_pPage->Reset( pGroupInfo->m_pInItemSet.get() ); } - else if ( pPageInfo->m_pExtPage ) - pPageInfo->m_pExtPage->ResetPage(); + else if ( pPageInfo->m_xExtPage ) + pPageInfo->m_xExtPage->ResetPage(); } } void OfaTreeOptionsDialog::ApplyOptions(bool deactivate) { - SvTreeListEntry* pEntry = pTreeLB->First(); - while ( pEntry ) + std::unique_ptr<weld::TreeIter> xEntry = xTreeLB->make_iterator(); + bool bEntry = xTreeLB->get_iter_first(*xEntry); + while (bEntry) { - if ( pTreeLB->GetParent( pEntry ) ) + if (xTreeLB->get_iter_depth(*xEntry)) { - OptionsPageInfo* pPageInfo = static_cast<OptionsPageInfo *>(pEntry->GetUserData()); + OptionsPageInfo* pPageInfo = reinterpret_cast<OptionsPageInfo*>(xTreeLB->get_id(*xEntry).toInt64()); if ( pPageInfo->m_pPage && !pPageInfo->m_pPage->HasExchangeSupport() ) { + std::unique_ptr<weld::TreeIter> xParent = xTreeLB->make_iterator(xEntry.get()); + xTreeLB->iter_parent(*xParent); OptionsGroupInfo* pGroupInfo = - static_cast<OptionsGroupInfo*>(pTreeLB->GetParent(pEntry)->GetUserData()); + reinterpret_cast<OptionsGroupInfo*>(xTreeLB->get_id(*xParent).toInt64()); pPageInfo->m_pPage->FillItemSet(pGroupInfo->m_pOutItemSet.get()); } - if ( pPageInfo->m_pExtPage ) + if ( pPageInfo->m_xExtPage ) { if ( deactivate ) { - pPageInfo->m_pExtPage->DeactivatePage(); + pPageInfo->m_xExtPage->DeactivatePage(); } - pPageInfo->m_pExtPage->SavePage(); + pPageInfo->m_xExtPage->SavePage(); } if ( pPageInfo->m_pPage && RID_OPTPAGE_CHART_DEFCOLORS == pPageInfo->m_nPageId ) { @@ -678,11 +668,11 @@ void OfaTreeOptionsDialog::ApplyOptions(bool deactivate) pPage->SaveChartOptions(); } } - pEntry = pTreeLB->Next(pEntry); + bEntry = xTreeLB->iter_next(*xEntry); } } -IMPL_LINK_NOARG(OfaTreeOptionsDialog, ApplyHdl_Impl, Button*, void) +IMPL_LINK_NOARG(OfaTreeOptionsDialog, ApplyHdl_Impl, weld::Button&, void) { ApplyOptions(/*deactivate =*/false); @@ -690,21 +680,22 @@ IMPL_LINK_NOARG(OfaTreeOptionsDialog, ApplyHdl_Impl, Button*, void) { SolarMutexGuard aGuard; if (svtools::executeRestartDialog(comphelper::getProcessComponentContext(), - GetFrameWeld(), eRestartReason)) - EndDialog(RET_OK); + m_xDialog.get(), eRestartReason)) + m_xDialog->response(RET_OK); } } -IMPL_LINK_NOARG(OfaTreeOptionsDialog, OKHdl_Impl, Button*, void) +IMPL_LINK_NOARG(OfaTreeOptionsDialog, OKHdl_Impl, weld::Button&, void) { - pTreeLB->EndSelection(); - if ( pCurrentPageEntry && pTreeLB->GetParent( pCurrentPageEntry ) ) + if (xCurrentPageEntry && xTreeLB->get_iter_depth(*xCurrentPageEntry)) { - OptionsPageInfo* pPageInfo = static_cast<OptionsPageInfo *>(pCurrentPageEntry->GetUserData()); + OptionsPageInfo* pPageInfo = reinterpret_cast<OptionsPageInfo*>(xTreeLB->get_id(*xCurrentPageEntry).toInt64()); if ( pPageInfo->m_pPage ) { - OptionsGroupInfo* pGroupInfo = - static_cast<OptionsGroupInfo *>(pTreeLB->GetParent(pCurrentPageEntry)->GetUserData()); + std::unique_ptr<weld::TreeIter> xParent = xTreeLB->make_iterator(xCurrentPageEntry.get()); + xTreeLB->iter_parent(*xParent); + + OptionsGroupInfo* pGroupInfo = reinterpret_cast<OptionsGroupInfo*>(xTreeLB->get_id(*xParent).toInt64()); if ( RID_SVXPAGE_COLOR != pPageInfo->m_nPageId && pPageInfo->m_pPage->HasExchangeSupport() ) { @@ -712,68 +703,34 @@ IMPL_LINK_NOARG(OfaTreeOptionsDialog, OKHdl_Impl, Button*, void) if ( nLeave == DeactivateRC::KeepPage ) { // the page mustn't be left - pTreeLB->Select(pCurrentPageEntry); + xTreeLB->select(*xCurrentPageEntry); return; } } - pPageInfo->m_pPage->Hide(); + pPageInfo->m_pPage->set_visible(false); } } ApplyOptions(/*deactivate =*/ true); - EndDialog(RET_OK); + m_xDialog->response(RET_OK); if ( bNeedsRestart ) { SolarMutexGuard aGuard; ::svtools::executeRestartDialog(comphelper::getProcessComponentContext(), - m_pParent->GetFrameWeld(), eRestartReason); - } -} - -// an opened group shall be completely visible -IMPL_STATIC_LINK( - OfaTreeOptionsDialog, ExpandedHdl_Impl, SvTreeListBox*, pBox, void ) -{ - pBox->Update(); - pBox->InitStartEntry(); - SvTreeListEntry* pEntry = pBox->GetHdlEntry(); - if(pEntry && pBox->IsExpanded(pEntry)) - { - sal_uInt32 nChildCount = pBox->GetChildCount( pEntry ); - - SvTreeListEntry* pNext = pEntry; - for(sal_uInt32 i = 0; i < nChildCount;i++) - { - pNext = pBox->GetNextEntryInView(pNext); - if(!pNext) - { - pBox->ScrollOutputArea( -static_cast<short>(nChildCount - i + 1) ); - break; - } - else - { - Size aSz(pBox->GetOutputSizePixel()); - int nHeight = pBox->GetEntryHeight(); - Point aPos(pBox->GetEntryPosition(pNext)); - if(aPos.Y()+nHeight > aSz.Height()) - { - pBox->ScrollOutputArea( -static_cast<short>(nChildCount - i + 1) ); - break; - } - } - } + m_pParent, eRestartReason); } } void OfaTreeOptionsDialog::ApplyItemSets() { - SvTreeListEntry* pEntry = pTreeLB->First(); - while(pEntry) + std::unique_ptr<weld::TreeIter> xEntry = xTreeLB->make_iterator(); + bool bEntry = xTreeLB->get_iter_first(*xEntry); + while (bEntry) { - if(!pTreeLB->GetParent(pEntry)) + if (!xTreeLB->get_iter_depth(*xEntry)) { - OptionsGroupInfo* pGroupInfo = static_cast<OptionsGroupInfo *>(pEntry->GetUserData()); + OptionsGroupInfo* pGroupInfo = reinterpret_cast<OptionsGroupInfo*>(xTreeLB->get_id(*xEntry).toInt64()); if(pGroupInfo->m_pOutItemSet) { if(pGroupInfo->m_pShell) @@ -782,28 +739,17 @@ void OfaTreeOptionsDialog::ApplyItemSets() ApplyItemSet( pGroupInfo->m_nDialogId, *pGroupInfo->m_pOutItemSet); } } - pEntry = pTreeLB->Next(pEntry); + bEntry = xTreeLB->iter_next(*xEntry); } } void OfaTreeOptionsDialog::InitTreeAndHandler() { - pTreeLB->SetNodeDefaultImages(); - - pTreeLB->SetHelpId( HID_OFADLG_TREELISTBOX ); - pTreeLB->SetStyle( pTreeLB->GetStyle()|WB_HASBUTTONS | WB_HASBUTTONSATROOT | - WB_HASLINES | WB_HASLINESATROOT | - WB_CLIPCHILDREN | WB_HSCROLL ); - pTreeLB->SetForceMakeVisible(true); - pTreeLB->SetQuickSearch(true); - pTreeLB->SetSpaceBetweenEntries( 0 ); - pTreeLB->SetSelectionMode( SelectionMode::Single ); - pTreeLB->SetSublistOpenWithLeftRight(); - pTreeLB->SetExpandedHdl( LINK( this, OfaTreeOptionsDialog, ExpandedHdl_Impl ) ); - pTreeLB->SetSelectHdl( LINK( this, OfaTreeOptionsDialog, ShowPageHdl_Impl ) ); - pBackPB->SetClickHdl( LINK( this, OfaTreeOptionsDialog, BackHdl_Impl ) ); - pApplyPB->SetClickHdl( LINK( this, OfaTreeOptionsDialog, ApplyHdl_Impl ) ); - pOkPB->SetClickHdl( LINK( this, OfaTreeOptionsDialog, OKHdl_Impl ) ); + xTreeLB->set_help_id(HID_OFADLG_TREELISTBOX); + xTreeLB->connect_changed( LINK( this, OfaTreeOptionsDialog, ShowPageHdl_Impl ) ); + xBackPB->connect_clicked( LINK( this, OfaTreeOptionsDialog, BackHdl_Impl ) ); + xApplyPB->connect_clicked( LINK( this, OfaTreeOptionsDialog, ApplyHdl_Impl ) ); + xOkPB->connect_clicked( LINK( this, OfaTreeOptionsDialog, OKHdl_Impl ) ); } void OfaTreeOptionsDialog::ActivatePage( sal_uInt16 nResId ) @@ -838,8 +784,9 @@ void OfaTreeOptionsDialog::ActivatePage( const OUString& rPageURL ) void OfaTreeOptionsDialog::ActivateLastSelection() { - SvTreeListEntry* pEntry = nullptr; - if ( pLastPageSaver ) + std::unique_ptr<weld::TreeIter> xEntry; + + if (pLastPageSaver) { OUString sLastURL = bIsFromExtensionManager ? pLastPageSaver->m_sLastPageURL_ExtMgr : pLastPageSaver->m_sLastPageURL_Tools; @@ -851,13 +798,14 @@ void OfaTreeOptionsDialog::ActivateLastSelection() bool bMustExpand = ( INetURLObject( sLastURL ).GetProtocol() == INetProtocol::File ); - SvTreeListEntry* pTemp = pTreeLB->First(); - while( !pEntry && pTemp ) + std::unique_ptr<weld::TreeIter> xTemp = xTreeLB->make_iterator(); + bool bTemp = xTreeLB->get_iter_first(*xTemp); + while (!bTemp) { // restore only selection of a leaf - if ( pTreeLB->GetParent( pTemp ) && pTemp->GetUserData() ) + if (xTreeLB->get_iter_depth(*xTemp) && xTreeLB->get_id(*xTemp).toInt64()) { - OptionsPageInfo* pPageInfo = static_cast<OptionsPageInfo*>(pTemp->GetUserData()); + OptionsPageInfo* pPageInfo = reinterpret_cast<OptionsPageInfo*>(xTreeLB->get_id(*xTemp).toInt64()); OUString sPageURL = pPageInfo->m_sPageURL; if ( bMustExpand ) { @@ -868,102 +816,65 @@ void OfaTreeOptionsDialog::ActivateLastSelection() if ( ( !bIsFromExtensionManager && pPageInfo->m_nPageId && pPageInfo->m_nPageId == pLastPageSaver->m_nLastPageId ) || ( !pPageInfo->m_nPageId && sLastURL == sPageURL ) ) - pEntry = pTemp; + { + xEntry = xTreeLB->make_iterator(xTemp.get()); + break; + } } - pTemp = pTreeLB->Next(pTemp); + bTemp = xTreeLB->iter_next(*xTemp); } } - if ( !pEntry ) + if (!xEntry) { - pEntry = pTreeLB->First(); - pEntry = pTreeLB->Next(pEntry); + xEntry = xTreeLB->make_iterator(); + if (!xTreeLB->get_iter_first(*xEntry) || !xTreeLB->iter_next(*xEntry)) + xEntry.reset(); } - if ( !pEntry ) + if (!xEntry) return; - SvTreeListEntry* pParent = pTreeLB->GetParent(pEntry); - pTreeLB->Expand(pParent); - pTreeLB->MakeVisible(pParent); - pTreeLB->MakeVisible(pEntry); - pTreeLB->Select(pEntry); - pTreeLB->GrabFocus(); -} - -bool OfaTreeOptionsDialog::EventNotify( NotifyEvent& rNEvt ) -{ - if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) - { - const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); - const vcl::KeyCode aKeyCode = pKEvt->GetKeyCode(); - - if( aKeyCode.GetCode() == KEY_PAGEUP || - aKeyCode.GetCode() == KEY_PAGEDOWN) - { - SvTreeListEntry* pCurEntry = pTreeLB->FirstSelected(); - SvTreeListEntry* pTemp = nullptr; - if(aKeyCode.GetCode() == KEY_PAGEDOWN) - { - pTemp = pTreeLB->Next( pCurEntry ) ; - if(pTemp && !pTreeLB->GetParent(pTemp)) - { - pTemp = pTreeLB->Next( pTemp ) ; - pTreeLB->Select(pTemp); - } - } - else - { - pTemp = pTreeLB->Prev( pCurEntry ) ; - if(pTemp && !pTreeLB->GetParent(pTemp)) - { - pTemp = pTreeLB->Prev( pTemp ) ; - } - } - if(pTemp) - { - if(!pTreeLB->IsExpanded(pTreeLB->GetParent(pTemp))) - pTreeLB->Expand(pTreeLB->GetParent(pTemp)); - pTreeLB->MakeVisible(pTemp); - pTreeLB->Select(pTemp); - } - } - } - return SfxModalDialog::EventNotify(rNEvt); + std::unique_ptr<weld::TreeIter> xParent(xTreeLB->make_iterator(xEntry.get())); + xTreeLB->iter_parent(*xParent); + xTreeLB->expand_row(*xParent); + xTreeLB->scroll_to_row(*xParent); + xTreeLB->scroll_to_row(*xEntry); + xTreeLB->set_cursor(*xEntry); + xTreeLB->select(*xEntry); + xTreeLB->grab_focus(); + SelectHdl_Impl(); } void OfaTreeOptionsDialog::SelectHdl_Impl() { - SvTreeListBox* pBox = pTreeLB; + std::unique_ptr<weld::TreeIter> xEntry(xTreeLB->make_iterator()); - if(pCurrentPageEntry == pBox->GetCurEntry()) - { - pBox->EndSelection(); + xTreeLB->get_cursor(xEntry.get()); + if (xCurrentPageEntry && xCurrentPageEntry->equal(*xEntry)) return; - } - SvTreeListEntry* pEntry = pBox->GetCurEntry(); - SvTreeListEntry* pParent = pBox->GetParent(pEntry); + std::unique_ptr<weld::TreeIter> xParent(xTreeLB->make_iterator(xEntry.get())); + bool bParent = xTreeLB->iter_parent(*xParent); // If the user has selected a category, automatically switch to a suitable // default sub-page instead. - if (!pParent) - { - pBox->EndSelection(); + if (!bParent) return; - } - - pBox->EndSelection(); TabPage* pOldPage = nullptr; TabPage* pNewPage = nullptr; - OptionsPageInfo* pOptPageInfo = ( pCurrentPageEntry && pTreeLB->GetParent( pCurrentPageEntry ) ) - ? static_cast<OptionsPageInfo*>(pCurrentPageEntry->GetUserData()) : nullptr; + OptionsPageInfo* pOptPageInfo = (xCurrentPageEntry && xTreeLB->get_iter_depth(*xCurrentPageEntry)) + ? reinterpret_cast<OptionsPageInfo*>(xTreeLB->get_id(*xCurrentPageEntry).toInt64()) : nullptr; if ( pOptPageInfo && pOptPageInfo->m_pPage && pOptPageInfo->m_pPage->IsVisible() ) { pOldPage = pOptPageInfo->m_pPage; - OptionsGroupInfo* pGroupInfo = static_cast<OptionsGroupInfo*>(pTreeLB->GetParent(pCurrentPageEntry)->GetUserData()); + + std::unique_ptr<weld::TreeIter> xCurParent(xTreeLB->make_iterator(xCurrentPageEntry.get())); + xTreeLB->iter_parent(*xCurParent); + + OptionsGroupInfo* pGroupInfo = reinterpret_cast<OptionsGroupInfo*>(xTreeLB->get_id(*xCurParent).toInt64()); DeactivateRC nLeave = DeactivateRC::LeavePage; if ( RID_SVXPAGE_COLOR != pOptPageInfo->m_nPageId && pOptPageInfo->m_pPage->HasExchangeSupport() ) nLeave = pOptPageInfo->m_pPage->DeactivatePage( pGroupInfo->m_pOutItemSet.get() ); @@ -971,20 +882,20 @@ void OfaTreeOptionsDialog::SelectHdl_Impl() if ( nLeave == DeactivateRC::KeepPage ) { // we cannot leave this page - pBox->Select( pCurrentPageEntry ); + xTreeLB->select(*xCurrentPageEntry); return; } else - pOptPageInfo->m_pPage->Hide(); + pOptPageInfo->m_pPage->set_visible(false); } - else if ( pOptPageInfo && pOptPageInfo->m_pExtPage ) + else if ( pOptPageInfo && pOptPageInfo->m_xExtPage ) { - pOptPageInfo->m_pExtPage->Hide(); - pOptPageInfo->m_pExtPage->DeactivatePage(); + pOptPageInfo->m_xExtPage->Hide(); + pOptPageInfo->m_xExtPage->DeactivatePage(); } - OptionsPageInfo *pPageInfo = static_cast<OptionsPageInfo *>(pEntry->GetUserData()); - OptionsGroupInfo* pGroupInfo = static_cast<OptionsGroupInfo *>(pParent->GetUserData()); + OptionsPageInfo *pPageInfo = reinterpret_cast<OptionsPageInfo*>(xTreeLB->get_id(*xEntry).toInt64()); + OptionsGroupInfo* pGroupInfo = reinterpret_cast<OptionsGroupInfo*>(xTreeLB->get_id(*xParent).toInt64()); if(!pPageInfo->m_pPage && pPageInfo->m_nPageId > 0) { if(!pGroupInfo->m_pInItemSet) @@ -996,7 +907,7 @@ void OfaTreeOptionsDialog::SelectHdl_Impl() *pGroupInfo->m_pInItemSet->GetPool(), pGroupInfo->m_pInItemSet->GetRanges()); - TabPageParent pPageParent(pTabBox); + TabPageParent pPageParent(xTabBox.get(), this); pPageInfo->m_pPage.disposeAndReset( ::CreateGeneralTabPage(pPageInfo->m_nPageId, pPageParent, *pGroupInfo->m_pInItemSet ) ); @@ -1011,16 +922,15 @@ void OfaTreeOptionsDialog::SelectHdl_Impl() pPageInfo->m_pPage->Reset( pGroupInfo->m_pInItemSet.get() ); } } - else if ( 0 == pPageInfo->m_nPageId && !pPageInfo->m_pExtPage ) + else if ( 0 == pPageInfo->m_nPageId && !pPageInfo->m_xExtPage ) { if ( !m_xContainerWinProvider.is() ) { m_xContainerWinProvider = awt::ContainerWindowProvider::create( ::comphelper::getProcessComponentContext() ); } - pPageInfo->m_pExtPage = VclPtr<ExtensionsTabPage>::Create( - - pTabBox, 0, pPageInfo->m_sPageURL, pPageInfo->m_sEventHdl, m_xContainerWinProvider ); + pPageInfo->m_xExtPage = std::make_unique<ExtensionsTabPage>( + xTabBox.get(), pPageInfo->m_sPageURL, pPageInfo->m_sEventHdl, m_xContainerWinProvider); } if ( pPageInfo->m_pPage ) @@ -1030,29 +940,30 @@ void OfaTreeOptionsDialog::SelectHdl_Impl() { pPageInfo->m_pPage->ActivatePage(*pGroupInfo->m_pOutItemSet); } - pPageInfo->m_pPage->Show(); + pPageInfo->m_pPage->set_visible(true); } - else if ( pPageInfo->m_pExtPage ) + else if ( pPageInfo->m_xExtPage ) { - pPageInfo->m_pExtPage->Show(); - pPageInfo->m_pExtPage->ActivatePage(); + pPageInfo->m_xExtPage->Show(); + pPageInfo->m_xExtPage->ActivatePage(); } { OUString sTitleText = sTitle - + " - " + pTreeLB->GetEntryText(pParent) - + " - " + pTreeLB->GetEntryText(pEntry); - SetText(sTitleText); + + " - " + xTreeLB->get_text(*xParent) + + " - " + xTreeLB->get_text(*xEntry); + m_xDialog->set_title(sTitleText); } - pCurrentPageEntry = pEntry; + xCurrentPageEntry = std::move(xEntry); + if ( !bForgetSelection ) { if ( !pLastPageSaver ) pLastPageSaver = new LastPageSaver; if ( !bIsFromExtensionManager ) pLastPageSaver->m_nLastPageId = pPageInfo->m_nPageId; - if ( pPageInfo->m_pExtPage ) + if ( pPageInfo->m_xExtPage ) { if ( bIsFromExtensionManager ) pLastPageSaver->m_sLastPageURL_ExtMgr = pPageInfo->m_sPageURL; @@ -1065,9 +976,9 @@ void OfaTreeOptionsDialog::SelectHdl_Impl() // restore lost focus, if necessary vcl::Window* pFocusWin = Application::GetFocusWindow(); // if the focused window is not the options treebox and the old page has the focus - if ( pFocusWin && pFocusWin != pBox && pOldPage && pOldPage->HasChildPathFocus() ) + if ( pFocusWin && !xTreeLB->has_focus() && pOldPage && pOldPage->HasChildPathFocus() ) // then set the focus to the new page or if we are on a group set the focus to the options treebox - pNewPage ? pNewPage->GrabFocus() : pBox->GrabFocus(); + pNewPage ? pNewPage->GrabFocus() : xTreeLB->grab_focus(); //fdo#58170 use current page's layout child HelpId, unless there isn't a //current page @@ -1078,7 +989,7 @@ void OfaTreeOptionsDialog::SelectHdl_Impl() assert(pFirstChild); sHelpId = pFirstChild->GetHelpId(); } - pBox->SetHelpId(sHelpId); + xTreeLB->set_help_id(sHelpId); } std::unique_ptr<SfxItemSet> OfaTreeOptionsDialog::CreateItemSet( sal_uInt16 nId ) @@ -1946,27 +1857,29 @@ VectorOfNodes OfaTreeOptionsDialog::LoadNodes( return aOutNodeList; } -static sal_uInt16 lcl_getGroupId( const OUString& rGroupName, const SvTreeListBox& rTreeLB ) +static sal_uInt16 lcl_getGroupId( const OUString& rGroupName, const weld::TreeView& rTreeLB ) { sal_uInt16 nRet = 0; - SvTreeListEntry* pEntry = rTreeLB.First(); - while( pEntry ) + + std::unique_ptr<weld::TreeIter> xEntry = rTreeLB.make_iterator(); + bool bEntry = rTreeLB.get_iter_first(*xEntry); + while (bEntry) { - if ( !rTreeLB.GetParent( pEntry ) ) + if (!rTreeLB.get_iter_depth(*xEntry)) { - OUString sTemp( rTreeLB.GetEntryText( pEntry ) ); - if ( sTemp == rGroupName ) + OUString sTemp(rTreeLB.get_text(*xEntry)); + if (sTemp == rGroupName) return nRet; nRet++; } - pEntry = rTreeLB.Next( pEntry ); + bEntry = rTreeLB.iter_next(*xEntry); } return USHRT_MAX; } static void lcl_insertLeaf( - OfaTreeOptionsDialog* pDlg, OptionsNode const * pNode, OptionsLeaf const * pLeaf, const SvTreeListBox& rTreeLB ) + OfaTreeOptionsDialog* pDlg, OptionsNode const * pNode, OptionsLeaf const * pLeaf, const weld::TreeView& rTreeLB ) { sal_uInt16 nGrpId = lcl_getGroupId( pNode->m_sLabel, rTreeLB ); if ( USHRT_MAX == nGrpId ) @@ -1989,13 +1902,13 @@ void OfaTreeOptionsDialog::InsertNodes( const VectorOfNodes& rNodeList ) { for ( size_t k = 0; k < j.size(); ++k ) { - lcl_insertLeaf( this, node.get(), j[k].get(), *pTreeLB ); + lcl_insertLeaf( this, node.get(), j[k].get(), *xTreeLB ); } } for ( auto const & j: node->m_aLeaves ) { - lcl_insertLeaf( this, node.get(), j.get(), *pTreeLB ); + lcl_insertLeaf( this, node.get(), j.get(), *xTreeLB ); } } } @@ -2007,7 +1920,7 @@ void OfaTreeOptionsDialog::SetNeedsRestart( svtools::RestartReason eReason) eRestartReason = eReason; } -short OfaTreeOptionsDialog::Execute() +short OfaTreeOptionsDialog::run() { std::unique_ptr< SvxDicListChgClamp > pClamp; if ( !bIsFromExtensionManager ) @@ -2016,7 +1929,8 @@ short OfaTreeOptionsDialog::Execute() Reference<css::linguistic2::XSearchableDictionaryList> xDictionaryList(LinguMgr::GetDictionaryList()); pClamp.reset( new SvxDicListChgClamp( xDictionaryList ) ); } - short nRet = SfxModalDialog::Execute(); + + short nRet = SfxOkDialogController::run(); if( RET_OK == nRet ) { @@ -2029,24 +1943,17 @@ short OfaTreeOptionsDialog::Execute() // class ExtensionsTabPage ----------------------------------------------- ExtensionsTabPage::ExtensionsTabPage( - vcl::Window* pParent, WinBits nStyle, const OUString& rPageURL, - const OUString& rEvtHdl, const Reference< awt::XContainerWindowProvider >& rProvider ) : - - TabPage( pParent, nStyle ), - - m_sPageURL ( rPageURL ), - m_sEventHdl ( rEvtHdl ), - m_xWinProvider ( rProvider ) + weld::Container* pParent, const OUString& rPageURL, + const OUString& rEvtHdl, const Reference< awt::XContainerWindowProvider >& rProvider ) + : m_pContainer(pParent) + , m_sPageURL(rPageURL) + , m_sEventHdl(rEvtHdl) + , m_xWinProvider(rProvider) { } ExtensionsTabPage::~ExtensionsTabPage() { - disposeOnce(); -} - -void ExtensionsTabPage::dispose() -{ Hide(); DeactivatePage(); @@ -2056,14 +1963,24 @@ void ExtensionsTabPage::dispose() { m_xPage->dispose(); } - catch ( const Exception & ) + catch (const Exception&) { } m_xPage.clear(); } - TabPage::dispose(); -} + if ( m_xPageParent.is() ) + { + try + { + m_xPageParent->dispose(); + } + catch (const Exception&) + { + } + m_xPageParent.clear(); + } +} void ExtensionsTabPage::CreateDialogWithHandler() { @@ -2078,8 +1995,8 @@ void ExtensionsTabPage::CreateDialogWithHandler() if ( !bWithHandler || m_xEventHdl.is() ) { - SetStyle( GetStyle() | WB_DIALOGCONTROL | WB_CHILDDLGCTRL ); - Reference< awt::XWindowPeer > xParent( VCLUnoHelper::GetInterface( this ), UNO_QUERY ); + m_xPageParent = m_pContainer->CreateChildFrame(); + Reference<awt::XWindowPeer> xParent(m_xPageParent, UNO_QUERY); m_xPage = m_xWinProvider->createContainerWindow( m_sPageURL, OUString(), xParent, m_xEventHdl ); @@ -2103,7 +2020,6 @@ void ExtensionsTabPage::CreateDialogWithHandler() } } - bool ExtensionsTabPage::DispatchAction( const OUString& rAction ) { bool bRet = false; @@ -2121,20 +2037,30 @@ bool ExtensionsTabPage::DispatchAction( const OUString& rAction ) return bRet; } -void ExtensionsTabPage::ActivatePage() +void ExtensionsTabPage::Show() { - TabPage::ActivatePage(); + if (!m_xPageParent.is()) + return; + m_xPageParent->setVisible(true); +} + +void ExtensionsTabPage::Hide() +{ + if (!m_xPageParent.is()) + return; + m_xPageParent->setVisible(false); +} +void ExtensionsTabPage::ActivatePage() +{ if ( !m_xPage.is() ) { CreateDialogWithHandler(); if ( m_xPage.is() ) { - Point aPos; - Size aSize = GetParent()->get_preferred_size(); - m_xPage->setPosSize( aPos.X() + 1, aPos.Y() + 1, - aSize.Width() - 2, aSize.Height() - 2, awt::PosSize::POSSIZE ); + auto aWindowRect = m_xPageParent->getPosSize(); + m_xPage->setPosSize(0, 0, aWindowRect.Width, aWindowRect.Height, awt::PosSize::POSSIZE); if ( !m_sEventHdl.isEmpty() ) DispatchAction( "initialize" ); } @@ -2148,20 +2074,16 @@ void ExtensionsTabPage::ActivatePage() void ExtensionsTabPage::DeactivatePage() { - TabPage::DeactivatePage(); - if ( m_xPage.is() ) m_xPage->setVisible( false ); } - void ExtensionsTabPage::ResetPage() { DispatchAction( "back" ); ActivatePage(); } - void ExtensionsTabPage::SavePage() { DispatchAction( "ok" ); |