/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
struct Data_Impl
{
OUString sId; // The ID
CreateTabPage fnCreatePage; // Pointer to Factory
GetTabPageRanges fnGetRanges; // Pointer to Ranges-Function
std::unique_ptr<SfxTabPage> xTabPage; // The TabPage itself bool bRefresh; // Flag: Page must be re-initialized
Default implementation of the virtual ActivatePage method. This method is called when a page of dialogue supports the exchange of data between pages. <SfxTabPage::DeactivatePage(SfxItemSet *)>
*/
{
}
Default implementation of the virtual DeactivatePage method. This method is called by Sfx when leaving a page; the application can, through the return value, control whether to leave the page. If the page is displayed through bHasExchangeSupport which supports data exchange between pages, then a pointer to the exchange set is passed as parameter. This takes on data for the exchange, then the set is available as a parameter in <SfxTabPage::ActivatePage(const SfxItemSet &)>.
[Return value]
DeactivateRC::LeavePage; Allow leaving the page
*/
{ return DeactivateRC::LeavePage;
}
void SfxTabPage::FillUserData()
/* [Description]
Virtual method is called by the base class in the destructor to save specific information of the TabPage in the ini-file. When overriding a string must be compiled, which is then flushed with the <SetUserData()>.
*/
Handler of the Ok-Buttons This calls the current page <SfxTabPage::DeactivatePage(SfxItemSet *)>. Returns <DeactivateRC::LeavePage>, <SfxTabDialog::Ok()> is called and the Dialog is ended.
*/
{ if (PrepareLeaveCurrentPage())
m_xDialog->response(Ok());
}
Handler of the User-Buttons This calls the current page <SfxTabPage::DeactivatePage(SfxItemSet *)>. returns this <DeactivateRC::LeavePage> and <SfxTabDialog::Ok()> is called. Then the Dialog is ended with the Return value <SfxTabDialog::Ok()>
*/
{ if (PrepareLeaveCurrentPage())
{ short nRet = Ok(); if (RET_OK == nRet)
nRet = RET_USER; else
nRet = RET_CANCEL;
m_xDialog->response(nRet);
}
}
Handler behind the reset button. The Current Page is new initialized with their initial data, all the settings that the user has made on this page are repealed.
*/
{ auto it = Find(m_pImpl->aData, m_xTabCtrl->get_current_page_ident());
assert(it != m_pImpl->aData.end() && "Id not known");
(*it)->xTabPage->Reset(m_pSet.get()); // Also reset relevant items of ExampleSet and OutSet to initial state if (!(*it)->fnGetRanges) return;
if (!m_xExampleSet)
m_xExampleSet.reset(new SfxItemSet(*m_pSet));
for (constauto & rPair : aTmpRanges)
{ // Correct Range with multiple values
sal_uInt16 nTmp = rPair.first, nTmpEnd = rPair.second;
DBG_ASSERT(nTmp <= nTmpEnd, "Range is sorted the wrong way");
if (nTmp > nTmpEnd)
{ // If really sorted wrongly, then set new
std::swap(nTmp, nTmpEnd);
}
while (nTmp && nTmp <= nTmpEnd)
{ // Iterate over the Range and set the Items
sal_uInt16 nWh = pPool->GetWhichIDFromSlotID(nTmp); const SfxPoolItem* pItem; if (SfxItemState::SET == m_pSet->GetItemState(nWh, false, &pItem))
{
m_xExampleSet->Put(*pItem);
} else
{
m_xExampleSet->ClearItem(nWh);
}
m_pOutSet->ClearItem(nWh);
nTmp++;
}
}
}
/* [Description]
Handler behind the Standard-Button. This button is available when editing style sheets. All the set attributes in the edited stylesheet are deleted.
*/
IMPL_LINK_NOARG(SfxTabDialogController, BaseFmtHdl, weld::Button&, void)
{
m_bStandardPushed = true;
auto it = Find(m_pImpl->aData, m_xTabCtrl->get_current_page_ident());
assert(it != m_pImpl->aData.end() && "Id not known");
if (!(*it)->fnGetRanges) return;
if (!m_xExampleSet)
m_xExampleSet.reset(new SfxItemSet(*m_pSet));
for (constauto& rPair : aTmpRanges)
{ // Correct Range with multiple values
sal_uInt16 nTmp = rPair.first, nTmpEnd = rPair.second;
DBG_ASSERT( nTmp <= nTmpEnd, "Range is sorted the wrong way" );
if ( nTmp > nTmpEnd )
{ // If really sorted wrongly, then set new
std::swap(nTmp, nTmpEnd);
}
while ( nTmp && nTmp <= nTmpEnd ) // guard against overflow
{ // Iterate over the Range and set the Items
sal_uInt16 nWh = pPool->GetWhichIDFromSlotID(nTmp);
m_xExampleSet->ClearItem(nWh);
aTmpSet.ClearItem(nWh); // At the Outset of InvalidateItem, // so that the change takes effect
m_pOutSet->InvalidateItem(nWh);
nTmp++;
}
} // Set all Items as new -> the call the current Page Reset()
assert((*it)->xTabPage && "the Page is gone");
(*it)->xTabPage->Reset(&aTmpSet);
(*it)->xTabPage->mpImpl->mbStandard = true;
}
Handler that is called by StarView for switching to a different page. If possible the <SfxTabPage::Reset(const SfxItemSet &)> or <SfxTabPage::ActivatePage(const SfxItemSet &)> is called on the new page
*/
{
assert(!m_pImpl->aData.empty() && "no Pages registered"); auto it = Find(m_pImpl->aData, rPage); if (it == m_pImpl->aData.end())
{
SAL_WARN("sfx.dialog", "Tab Page ID '" << rPage << "' not known, this is pretty serious and needs investigation"); return;
}
SfxTabPage* pTabPage = (*it)->xTabPage.get(); if (!pTabPage) return;
if ((*it)->bRefresh)
pTabPage->Reset(m_pSet.get());
(*it)->bRefresh = false;
if (m_xExampleSet)
pTabPage->ActivatePage(*m_xExampleSet);
if (pTabPage->IsReadOnly() || m_pImpl->bHideResetBtn)
m_xResetBtn->hide(); else
m_xResetBtn->show();
}
Handler that is called by StarView before leaving a page.
[Cross-reference]
<SfxTabPage::DeactivatePage(SfxItemSet *)>
*/
{
assert(!m_pImpl->aData.empty() && "no Pages registered"); auto it = Find(m_pImpl->aData, aPage); if (it == m_pImpl->aData.end())
{
SAL_WARN("sfx.dialog", "Tab Page ID not known, this is pretty serious and needs investigation"); returnfalse;
}
SfxTabPage* pPage = (*it)->xTabPage.get(); if (!pPage) returntrue;
DeactivateRC nRet = DeactivateRC::LeavePage;
if (!m_xExampleSet && pPage->HasExchangeSupport() && m_pSet)
m_xExampleSet.reset(new SfxItemSet(*m_pSet->GetPool(), m_pSet->GetRanges()));
if (m_pSet)
{
SfxItemSet aTmp( *m_pSet->GetPool(), m_pSet->GetRanges() );
Makes the set over the range of all pages of the dialogue. Pages have the static method for querying their range in AddTabPage, ie deliver their sets onDemand.
[Return value]
Pointer to a null-terminated array of sal_uInt16. This array belongs to the dialog and is deleted when the dialogue is destroy.
Dialog's current location and current page are saved for the next time the dialog is shown.
The OutputSet is created and for each page this or the special OutputSet is set by calling the method <SfxTabPage::FillItemSet(SfxItemSet &)>, to insert the entered data by the user into the set.
[Return value]
RET_OK: if at least one page has returned from FillItemSet, otherwise RET_CANCEL.
*/
{
SavePosAndId(); //See fdo#38828 "Apply" resetting window position
if ( !m_pOutSet )
{ if ( m_xExampleSet )
m_pOutSet.reset(new SfxItemSet( *m_xExampleSet )); elseif ( m_pSet )
m_pOutSet = m_pSet->Clone( false ); // without Items
} bool bModified = false;
for (autoconst& elem : m_pImpl->aData)
{
SfxTabPage* pTabPage = elem->xTabPage.get();
if ( pTabPage )
{ if ( m_pSet && !pTabPage->HasExchangeSupport() )
{
SfxItemSet aTmp( *m_pSet->GetPool(), m_pSet->GetRanges() );
if (m_pOutSet && m_pOutSet->Count() > 0)
bModified = true;
if (m_bStandardPushed)
bModified = true;
return bModified ? RET_OK : RET_CANCEL;
}
void SfxTabDialogController::RefreshInputSet()
/* [Description]
Default implementation of the virtual Method. This is called, when <SfxTabPage::DeactivatePage(SfxItemSet *)> returns <DeactivateRC::RefreshSet>.
*/
{
SAL_INFO ( "sfx.dialog", "RefreshInputSet not implemented" );
}
void SfxTabDialogController::PageCreated
/* [Description]
Default implementation of the virtual method. This is called immediately after creating a page. Here the dialogue can call the TabPage Method directly.
*/
( const OUString&, // Id of the created page
SfxTabPage& // Reference to the created page
)
{
}
void SfxTabDialogController::SavePosAndId()
{ // save settings (screen position and current page)
SvtViewOptions aDlgOpt(EViewType::TabDialog, m_xDialog->get_help_id());
aDlgOpt.SetPageID(m_xTabCtrl->get_current_page_ident());
}
/* Adds a page to the dialog. The Name must correspond to an entry in the TabControl in the dialog .ui
*/ void SfxTabDialogController::AddTabPage(const OUString &rName /* Page ID */,
CreateTabPage pCreateFunc /* Pointer to the Factory Method */,
GetTabPageRanges pRangesFunc /* Pointer to the Method for querying Ranges onDemand */)
{
m_pImpl->aData.push_back(new Data_Impl(rName, pCreateFunc, pRangesFunc));
}
void SfxTabDialogController::AddTabPage(const OUString &rName /* Page ID */,
sal_uInt16 nPageCreateId /* Identifier of the Factory Method to create the page */)
{
SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
CreateTabPage pCreateFunc = pFact->GetTabPageCreatorFunc(nPageCreateId);
GetTabPageRanges pRangesFunc = pFact->GetTabPageRangesFunc(nPageCreateId);
AddTabPage(rName, pCreateFunc, pRangesFunc);
}
/* [Description]
Add a page to the dialog. The Rider text is passed on, the page has no counterpart in the TabControl in the resource of the dialogue.
*/
void SfxTabDialogController::AddTabPage(const OUString &rName, /* Page ID */ const OUString& rRiderText,
CreateTabPage pCreateFunc /* Pointer to the Factory Method */)
{
assert(!m_xTabCtrl->get_page(rName) && "Double Page-Ids in the Tabpage");
m_xTabCtrl->append_page(rName, rRiderText);
AddTabPage(rName, pCreateFunc, nullptr);
}
void SfxTabDialogController::AddTabPage(const OUString &rName, const OUString& rRiderText,
sal_uInt16 nPageCreateId /* Identifier of the Factory Method to create the page */)
{
assert(!m_xTabCtrl->get_page(rName) && "Double Page-Ids in the Tabpage");
m_xTabCtrl->append_page(rName, rRiderText);
AddTabPage(rName, nPageCreateId);
}
/* [Description]
Default implementation of the virtual Method. This is called when pages create their sets onDemand.
*/
SfxItemSet* SfxTabDialogController::CreateInputItemSet(const OUString&)
{
SAL_WARN( "sfx.dialog", "CreateInputItemSet not implemented" );
m_xItemSet = std::make_unique<SfxAllItemSet>(SfxGetpApp()->GetPool()); return m_xItemSet.get();
}
PageCreated(pDataObject->sId, *pDataObject->xTabPage); if (pDataObject->xTabPage->DeferResetToFirstActivation())
pDataObject->bRefresh = true; // Reset will be called in ActivatePageHdl else
pDataObject->xTabPage->Reset(m_pSet.get());
}
}
void SfxTabDialogController::setPreviewsToSamePlace()
{ //where tab pages have the same basic layout with a preview on the right, //get both of their non-preview areas to request the same size so that the //preview appears in the same place in each one so flipping between tabs //isn't distracting as it jumps around
std::vector<std::unique_ptr<weld::Widget>> aGrids; for (auto pDataObject : m_pImpl->aData)
{ if (!pDataObject->xTabPage) continue; if (!pDataObject->xTabPage->m_xBuilder) continue;
std::unique_ptr<weld::Widget> pGrid = pDataObject->xTabPage->m_xBuilder->weld_widget(u"maingrid"_ustr); if (!pGrid) continue;
aGrids.emplace_back(std::move(pGrid));
}
assert(m_pImpl->aData.size() == static_cast<size_t>(m_xTabCtrl->get_n_pages())
&& "not all pages registered");
// load old settings, when exists, setting SetCurPageId will override the settings, // something that the sort dialog in calc depends on if (m_sAppPageId.isEmpty())
{
SvtViewOptions aDlgOpt(EViewType::TabDialog, m_xDialog->get_help_id()); if (aDlgOpt.Exists())
m_xTabCtrl->set_current_page(aDlgOpt.GetPageID()); else
m_xTabCtrl->set_current_page(0);
}
The TabPage is activated with the specified Id.
*/ void SfxTabDialogController::ShowPage(const OUString& rIdent)
{
SetCurPageId(rIdent);
ActivatePage(rIdent);
}
BitmapEx SfxTabDialogController::createScreenshot() const
{ // if we haven't run Start_Impl yet, do so now to create the initial pages if (!m_pImpl->bStarted)
{ const_cast<SfxTabDialogController*>(this)->Start_Impl();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.