LCOV - code coverage report
Current view: top level - sfx2/source/dialog - tabdlg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 554 0.2 %
Date: 2015-06-13 12:38:46 Functions: 2 80 2.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include <limits.h>
      22             : #include <stdlib.h>
      23             : #include <algorithm>
      24             : #include <vcl/builder.hxx>
      25             : #include <vcl/msgbox.hxx>
      26             : #include <unotools/viewoptions.hxx>
      27             : 
      28             : #include "appdata.hxx"
      29             : #include "sfxtypes.hxx"
      30             : #include <sfx2/tabdlg.hxx>
      31             : #include <sfx2/viewfrm.hxx>
      32             : #include <sfx2/app.hxx>
      33             : #include <sfx2/sfxresid.hxx>
      34             : #include <sfx2/sfxhelp.hxx>
      35             : #include <sfx2/ctrlitem.hxx>
      36             : #include <sfx2/bindings.hxx>
      37             : #include <sfx2/sfxdlg.hxx>
      38             : #include <sfx2/itemconnect.hxx>
      39             : 
      40             : #include "dialog.hrc"
      41             : #include "helpid.hrc"
      42             : 
      43             : using namespace ::com::sun::star::uno;
      44             : 
      45             : #define USERITEM_NAME           OUString("UserItem")
      46             : 
      47           0 : TYPEINIT1(SfxTabDialogItem,SfxSetItem);
      48             : 
      49           0 : struct TabPageImpl
      50             : {
      51             :     bool                        mbStandard;
      52             :     sfx::ItemConnectionArray    maItemConn;
      53             :     ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > mxFrame;
      54             : 
      55           0 :     TabPageImpl() : mbStandard( false ) {}
      56             : };
      57             : 
      58           0 : struct Data_Impl
      59             : {
      60             :     sal_uInt16 nId;                   // The ID
      61             :     CreateTabPage fnCreatePage;   // Pointer to Factory
      62             :     GetTabPageRanges fnGetRanges; // Pointer to Ranges-Function
      63             :     VclPtr<SfxTabPage> pTabPage;         // The TabPage itself
      64             :     bool bOnDemand;              // Flag: ItemSet onDemand
      65             :     bool bRefresh;                // Flag: Page must be re-initialized
      66             : 
      67             :     // Constructor
      68           0 :     Data_Impl( sal_uInt16 Id, CreateTabPage fnPage,
      69             :                GetTabPageRanges fnRanges, bool bDemand ) :
      70             : 
      71             :         nId         ( Id ),
      72             :         fnCreatePage( fnPage ),
      73             :         fnGetRanges ( fnRanges ),
      74             :         pTabPage    ( 0 ),
      75             :         bOnDemand   ( bDemand ),
      76           0 :         bRefresh    ( false )
      77             :     {
      78           0 :         if ( !fnCreatePage  )
      79             :         {
      80           0 :             SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
      81           0 :             if ( pFact )
      82             :             {
      83           0 :                 fnCreatePage = pFact->GetTabPageCreatorFunc( nId );
      84           0 :                 fnGetRanges = pFact->GetTabPageRangesFunc( nId );
      85             :             }
      86             :         }
      87           0 :     }
      88             : };
      89             : 
      90           0 : SfxTabDialogItem::SfxTabDialogItem( const SfxTabDialogItem& rAttr, SfxItemPool* pItemPool )
      91           0 :     : SfxSetItem( rAttr, pItemPool )
      92             : {
      93           0 : }
      94             : 
      95           0 : SfxTabDialogItem::SfxTabDialogItem( sal_uInt16 nId, const SfxItemSet& rItemSet )
      96           0 :     : SfxSetItem( nId, rItemSet )
      97             : {
      98           0 : }
      99             : 
     100           0 : SfxPoolItem* SfxTabDialogItem::Clone(SfxItemPool* pToPool) const
     101             : {
     102           0 :     return new SfxTabDialogItem( *this, pToPool );
     103             : }
     104             : 
     105           0 : SfxPoolItem* SfxTabDialogItem::Create(SvStream& /*rStream*/, sal_uInt16 /*nVersion*/) const
     106             : {
     107             :     OSL_FAIL( "Use it only in UI!" );
     108           0 :     return NULL;
     109             : }
     110             : 
     111             : typedef std::vector<Data_Impl*> SfxTabDlgData_Impl;
     112             : 
     113             : struct TabDlg_Impl
     114             : {
     115             :     bool                bModified       : 1,
     116             :                         bModal          : 1,
     117             :                         bHideResetBtn   : 1;
     118             :     SfxTabDlgData_Impl  aData;
     119             : 
     120           0 :     TabDlg_Impl( sal_uInt8 nCnt ) :
     121             : 
     122             :         bModified       ( false ),
     123             :         bModal          ( true ),
     124           0 :         bHideResetBtn   ( false )
     125             :     {
     126           0 :         aData.reserve( nCnt );
     127           0 :     }
     128           0 :     ~TabDlg_Impl()
     129           0 :     {
     130           0 :     }
     131             : };
     132             : 
     133             : 
     134           0 : static Data_Impl* Find( const SfxTabDlgData_Impl& rArr, sal_uInt16 nId, sal_uInt16* pPos = 0)
     135             : {
     136           0 :     const sal_uInt16 nCount = rArr.size();
     137             : 
     138           0 :     for ( sal_uInt16 i = 0; i < nCount; ++i )
     139             :     {
     140           0 :         Data_Impl* pObj = rArr[i];
     141             : 
     142           0 :         if ( pObj->nId == nId )
     143             :         {
     144           0 :             if ( pPos )
     145           0 :                 *pPos = i;
     146           0 :             return pObj;
     147             :         }
     148             :     }
     149           0 :     return 0;
     150             : }
     151             : 
     152           0 : void SfxTabPage::SetFrame(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& xFrame)
     153             : {
     154           0 :     if (pImpl)
     155           0 :         pImpl->mxFrame = xFrame;
     156           0 : }
     157             : 
     158           0 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > SfxTabPage::GetFrame()
     159             : {
     160           0 :     if (pImpl)
     161           0 :         return pImpl->mxFrame;
     162           0 :     return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >();
     163             : }
     164             : 
     165           0 : SfxTabPage::SfxTabPage(vcl::Window *pParent, const OString& rID, const OUString& rUIXMLDescription, const SfxItemSet *rAttrSet)
     166             :     : TabPage(pParent, rID, rUIXMLDescription)
     167             :     , pSet                ( rAttrSet )
     168             :     , bHasExchangeSupport ( false )
     169           0 :     , pImpl               ( new TabPageImpl )
     170             : {
     171           0 : }
     172             : 
     173           0 : SfxTabPage::~SfxTabPage()
     174             : {
     175           0 :     disposeOnce();
     176           0 : }
     177             : 
     178           0 : void SfxTabPage::dispose()
     179             : {
     180           0 :     delete pImpl;
     181           0 :     pImpl = NULL;
     182           0 :     TabPage::dispose();
     183           0 : }
     184             : 
     185           0 : bool SfxTabPage::FillItemSet( SfxItemSet* rSet )
     186             : {
     187           0 :     return pImpl->maItemConn.DoFillItemSet( *rSet, GetItemSet() );
     188             : }
     189             : 
     190           0 : void SfxTabPage::Reset( const SfxItemSet* rSet )
     191             : {
     192           0 :     pImpl->maItemConn.DoApplyFlags( *rSet );
     193           0 :     pImpl->maItemConn.DoReset( *rSet );
     194           0 : }
     195             : 
     196           0 : void SfxTabPage::ActivatePage( const SfxItemSet& )
     197             : /*  [Description]
     198             : 
     199             :     Default implementation of the virtual ActivatePage method. This method is
     200             :     called when a page of dialogue supports the exchange of data between pages.
     201             :     <SfxTabPage::DeactivatePage(SfxItemSet *)>
     202             : */
     203             : {
     204           0 : }
     205             : 
     206           0 : SfxTabPage::sfxpg SfxTabPage::DeactivatePage( SfxItemSet* )
     207             : 
     208             : /*  [Description]
     209             : 
     210             :     Default implementation of the virtual DeactivatePage method. This method is
     211             :     called by Sfx when leaving a page; the application can, through the return
     212             :     value, control whether to leave the page. If the page is displayed through
     213             :     bHasExchangeSupport which supports data exchange between pages, then a
     214             :     pointer to the exchange set is passed as parameter. This takes on data for
     215             :     the exchange, then the set is available as a parameter in
     216             :     <SfxTabPage::ActivatePage(const SfxItemSet &)>.
     217             : 
     218             :     [Return value]
     219             : 
     220             :     LEAVE_PAGE; Allow leaving the page
     221             : */
     222             : 
     223             : {
     224           0 :     return LEAVE_PAGE;
     225             : }
     226             : 
     227             : 
     228             : 
     229           0 : void SfxTabPage::FillUserData()
     230             : 
     231             : /*  [Description]
     232             : 
     233             :     Virtual method is called by the base class in the destructor to save
     234             :     specific information of the TabPage in the ini-file. When overriding a
     235             :     string must be compiled, which is then flushed with the <SetUserData()>.
     236             : */
     237             : 
     238             : {
     239           0 : }
     240             : 
     241             : 
     242             : 
     243           0 : bool SfxTabPage::IsReadOnly() const
     244             : {
     245           0 :     return false;
     246             : }
     247             : 
     248             : 
     249             : 
     250           0 : const SfxPoolItem* SfxTabPage::GetItem( const SfxItemSet& rSet, sal_uInt16 nSlot, bool bDeep )
     251             : 
     252             : /*  [Description]
     253             : 
     254             :     static Method: hereby are the implementations of the TabPage code
     255             :     being simplified.
     256             : */
     257             : 
     258             : {
     259           0 :     const SfxItemPool* pPool = rSet.GetPool();
     260           0 :     sal_uInt16 nWh = pPool->GetWhich( nSlot, bDeep );
     261           0 :     const SfxPoolItem* pItem = 0;
     262           0 :     rSet.GetItemState( nWh, true, &pItem );
     263             : 
     264           0 :     if ( !pItem && nWh != nSlot )
     265           0 :         pItem = &pPool->GetDefaultItem( nWh );
     266           0 :     return pItem;
     267             : }
     268             : 
     269             : 
     270             : 
     271           0 : const SfxPoolItem* SfxTabPage::GetOldItem( const SfxItemSet& rSet,
     272             :                                            sal_uInt16 nSlot, bool bDeep )
     273             : 
     274             : /*  [Description]
     275             : 
     276             :     This method returns an attribute for comparison of the old value.
     277             : */
     278             : 
     279             : {
     280           0 :     const SfxItemSet& rOldSet = GetItemSet();
     281           0 :     sal_uInt16 nWh = GetWhich( nSlot, bDeep );
     282           0 :     const SfxPoolItem* pItem = 0;
     283             : 
     284           0 :     if ( pImpl->mbStandard && rOldSet.GetParent() )
     285           0 :         pItem = GetItem( *rOldSet.GetParent(), nSlot );
     286           0 :     else if ( rSet.GetParent() &&
     287           0 :               SfxItemState::DONTCARE == rSet.GetItemState( nWh ) )
     288           0 :         pItem = GetItem( *rSet.GetParent(), nSlot );
     289             :     else
     290           0 :         pItem = GetItem( rOldSet, nSlot );
     291           0 :     return pItem;
     292             : }
     293             : 
     294           0 : void SfxTabPage::PageCreated( const SfxAllItemSet& /*aSet*/ )
     295             : {
     296             :     DBG_ASSERT(false, "SfxTabPage::PageCreated should not be called");
     297           0 : }
     298             : 
     299             : 
     300             : 
     301           0 : void SfxTabPage::AddItemConnection( sfx::ItemConnectionBase* pConnection )
     302             : {
     303           0 :     pImpl->maItemConn.AddConnection( pConnection );
     304           0 : }
     305             : 
     306           0 : SfxTabDialog* SfxTabPage::GetTabDialog() const
     307             : {
     308           0 :     return dynamic_cast<SfxTabDialog*>(GetParentDialog());
     309             : }
     310             : 
     311             : 
     312             : 
     313           0 : SfxTabDialog::SfxTabDialog
     314             : (
     315             :     SfxViewFrame* pViewFrame,     // Frame, to which the Dialog belongs
     316             :     vcl::Window* pParent,              // Parent Window
     317             :     const OUString& rID, const OUString& rUIXMLDescription, //Dialog Name, Dialog .ui path
     318             :     const SfxItemSet* pItemSet,   // Itemset with the data;
     319             :                                   // can be NULL, when Pages are onDemand
     320             :     bool bEditFmt                 // when yes -> additional Button for standard
     321             : )
     322             :     : TabDialog(pParent, rID, rUIXMLDescription)
     323             :     , pFrame(pViewFrame)
     324           0 :     , pSet(pItemSet ? new SfxItemSet(*pItemSet) : 0)
     325             :     , pOutSet(0)
     326             :     , pRanges(0)
     327             :     , nAppPageId(USHRT_MAX)
     328             :     , bItemsReset(false)
     329             :     , bStandardPushed(false)
     330           0 :     , pExampleSet(0)
     331             : {
     332           0 :     Init_Impl(bEditFmt);
     333           0 : }
     334             : 
     335             : 
     336             : 
     337           0 : SfxTabDialog::SfxTabDialog
     338             : 
     339             : /*  [Description]
     340             : 
     341             :     Constructor, temporary without Frame
     342             : */
     343             : 
     344             : (
     345             :     vcl::Window* pParent,              // Parent Window
     346             :     const OUString& rID, const OUString& rUIXMLDescription, //Dialog Name, Dialog .ui path
     347             :     const SfxItemSet* pItemSet,   // Itemset with the data;
     348             :                                   // can be NULL, when Pages are onDemand
     349             :     bool bEditFmt                 // when yes -> additional Button for standard
     350             : )
     351             :     : TabDialog(pParent, rID, rUIXMLDescription)
     352             :     , pFrame(0)
     353           0 :     , pSet(pItemSet ? new SfxItemSet(*pItemSet) : 0)
     354             :     , pOutSet(0)
     355             :     , pRanges(0)
     356             :     , nAppPageId(USHRT_MAX)
     357             :     , bItemsReset(false)
     358             :     , bStandardPushed(false)
     359           0 :     , pExampleSet(0)
     360             : {
     361           0 :     Init_Impl(bEditFmt);
     362             :     DBG_WARNING( "Please use the Construtor with the ViewFrame" );
     363           0 : }
     364             : 
     365             : 
     366             : 
     367           0 : SfxTabDialog::~SfxTabDialog()
     368             : {
     369           0 :     disposeOnce();
     370           0 : }
     371             : 
     372           0 : void SfxTabDialog::dispose()
     373             : {
     374           0 :     SavePosAndId();
     375             : 
     376           0 :     for ( SfxTabDlgData_Impl::const_iterator it = pImpl->aData.begin(); it != pImpl->aData.end(); ++it )
     377             :     {
     378           0 :         Data_Impl* pDataObject = *it;
     379             : 
     380           0 :         if ( pDataObject->pTabPage )
     381             :         {
     382             :             // save settings of all pages (user data)
     383           0 :             pDataObject->pTabPage->FillUserData();
     384           0 :             OUString aPageData( pDataObject->pTabPage->GetUserData() );
     385           0 :             if ( !aPageData.isEmpty() )
     386             :             {
     387             :                 // save settings of all pages (user data)
     388           0 :                 OUString sConfigId = OStringToOUString(pDataObject->pTabPage->GetConfigId(),
     389           0 :                     RTL_TEXTENCODING_UTF8);
     390           0 :                 if (sConfigId.isEmpty())
     391             :                 {
     392             :                     SAL_WARN("sfx.config", "Tabpage needs to be converted to .ui format");
     393           0 :                     sConfigId = OUString::number(pDataObject->nId);
     394             :                 }
     395             : 
     396           0 :                 SvtViewOptions aPageOpt(E_TABPAGE, sConfigId);
     397           0 :                 aPageOpt.SetUserItem( USERITEM_NAME, makeAny( OUString( aPageData ) ) );
     398             :             }
     399             : 
     400           0 :             if ( pDataObject->bOnDemand )
     401           0 :                 delete &pDataObject->pTabPage->GetItemSet();
     402           0 :             pDataObject->pTabPage.disposeAndClear();
     403             :         }
     404           0 :         delete pDataObject;
     405           0 :         pDataObject = NULL;
     406             :     }
     407             : 
     408           0 :     delete pImpl;
     409           0 :     pImpl = NULL;
     410           0 :     delete pSet;
     411           0 :     pSet = NULL;
     412           0 :     delete pOutSet;
     413           0 :     pOutSet = NULL;
     414           0 :     delete pExampleSet;
     415           0 :     pExampleSet = NULL;
     416           0 :     delete [] pRanges;
     417           0 :     pRanges = NULL;
     418             : 
     419           0 :     if (m_bOwnsBaseFmtBtn)
     420           0 :         m_pBaseFmtBtn.disposeAndClear();
     421           0 :     if (m_bOwnsResetBtn)
     422           0 :         m_pResetBtn.disposeAndClear();
     423           0 :     if (m_bOwnsHelpBtn)
     424           0 :         m_pHelpBtn.disposeAndClear();
     425           0 :     if (m_bOwnsCancelBtn)
     426           0 :         m_pCancelBtn.disposeAndClear();
     427           0 :     if (m_bOwnsOKBtn)
     428           0 :         m_pOKBtn.disposeAndClear();
     429           0 :     m_pBox.clear();
     430           0 :     m_pTabCtrl.clear();
     431           0 :     m_pOKBtn.clear();
     432           0 :     m_pApplyBtn.clear();
     433           0 :     m_pUserBtn.clear();
     434           0 :     m_pCancelBtn.clear();
     435           0 :     m_pHelpBtn.clear();
     436           0 :     m_pResetBtn.clear();
     437           0 :     m_pBaseFmtBtn.clear();
     438           0 :     m_pActionArea.clear();
     439             : 
     440           0 :     TabDialog::dispose();
     441           0 : }
     442             : 
     443           0 : void SfxTabDialog::Init_Impl(bool bFmtFlag)
     444             : /*  [Description]
     445             : 
     446             :     internal initialization of the dialogue
     447             : */
     448             : {
     449           0 :     m_pBox = get_content_area();
     450             :     assert(m_pBox);
     451           0 :     m_pUIBuilder->get(m_pTabCtrl, "tabcontrol");
     452             : 
     453           0 :     pImpl = new TabDlg_Impl(m_pTabCtrl->GetPageCount());
     454             : 
     455           0 :     m_pActionArea = get_action_area();
     456             :     assert(m_pActionArea);
     457             : 
     458           0 :     m_pOKBtn = m_pUIBuilder->get<PushButton>("ok");
     459           0 :     m_bOwnsOKBtn = m_pOKBtn == nullptr;
     460           0 :     if (m_bOwnsOKBtn)
     461           0 :         m_pOKBtn = VclPtr<OKButton>::Create(m_pActionArea);
     462             : 
     463           0 :     m_pApplyBtn = m_pUIBuilder->get<PushButton>("apply");
     464           0 :     m_pUserBtn = m_pUIBuilder->get<PushButton>("user");
     465           0 :     m_pCancelBtn = m_pUIBuilder->get<CancelButton>("cancel");
     466           0 :     m_bOwnsCancelBtn = m_pCancelBtn == nullptr;
     467           0 :     if (m_bOwnsCancelBtn)
     468           0 :         m_pCancelBtn = VclPtr<CancelButton>::Create(m_pActionArea);
     469             : 
     470           0 :     m_pHelpBtn = m_pUIBuilder->get<HelpButton>("help");
     471           0 :     m_bOwnsHelpBtn = m_pHelpBtn == nullptr;
     472           0 :     if (m_bOwnsHelpBtn)
     473           0 :         m_pHelpBtn = VclPtr<HelpButton>::Create(m_pActionArea);
     474             : 
     475           0 :     m_pResetBtn = m_pUIBuilder->get<PushButton>("reset");
     476           0 :     m_bOwnsResetBtn = m_pResetBtn == nullptr;
     477           0 :     if (m_bOwnsResetBtn)
     478           0 :         m_pResetBtn = VclPtr<PushButton>::Create(m_pActionArea.get());
     479             :     else
     480           0 :         pImpl->bHideResetBtn = !m_pResetBtn->IsVisible();
     481             : 
     482           0 :     m_pBaseFmtBtn = m_pUIBuilder->get<PushButton>("standard");
     483           0 :     m_bOwnsBaseFmtBtn = m_pBaseFmtBtn == nullptr;
     484           0 :     if (m_bOwnsBaseFmtBtn)
     485           0 :         m_pBaseFmtBtn = VclPtr<PushButton>::Create(m_pActionArea.get());
     486             : 
     487           0 :     m_pOKBtn->SetClickHdl( LINK( this, SfxTabDialog, OkHdl ) );
     488           0 :     m_pCancelBtn->SetClickHdl( LINK( this, SfxTabDialog, CancelHdl ) );
     489           0 :     m_pResetBtn->SetClickHdl( LINK( this, SfxTabDialog, ResetHdl ) );
     490           0 :     m_pResetBtn->SetText( SfxResId( STR_RESET ).toString() );
     491             :     m_pTabCtrl->SetActivatePageHdl(
     492           0 :             LINK( this, SfxTabDialog, ActivatePageHdl ) );
     493             :     m_pTabCtrl->SetDeactivatePageHdl(
     494           0 :             LINK( this, SfxTabDialog, DeactivatePageHdl ) );
     495           0 :     m_pActionArea->Show();
     496           0 :     m_pBox->Show();
     497           0 :     m_pTabCtrl->Show();
     498           0 :     m_pOKBtn->Show();
     499           0 :     m_pCancelBtn->Show();
     500           0 :     m_pHelpBtn->Show();
     501           0 :     m_pResetBtn->Show();
     502           0 :     m_pResetBtn->SetHelpId( HID_TABDLG_RESET_BTN );
     503             : 
     504           0 :     if ( m_pUserBtn )
     505             :     {
     506           0 :         m_pUserBtn->SetClickHdl( LINK( this, SfxTabDialog, UserHdl ) );
     507           0 :         m_pUserBtn->Show();
     508             :     }
     509             : 
     510           0 :     if ( bFmtFlag )
     511             :     {
     512           0 :         m_pBaseFmtBtn->SetText( SfxResId( STR_STANDARD_SHORTCUT ).toString() );
     513           0 :         m_pBaseFmtBtn->SetClickHdl( LINK( this, SfxTabDialog, BaseFmtHdl ) );
     514           0 :         m_pBaseFmtBtn->SetHelpId( HID_TABDLG_STANDARD_BTN );
     515           0 :         m_pBaseFmtBtn->Show();
     516             :     }
     517             : 
     518           0 :     if ( pSet )
     519             :     {
     520           0 :         pExampleSet = new SfxItemSet( *pSet );
     521           0 :         pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
     522             :     }
     523           0 : }
     524             : 
     525           0 : void SfxTabDialog::RemoveResetButton()
     526             : {
     527           0 :     m_pResetBtn->Hide();
     528           0 :     pImpl->bHideResetBtn = true;
     529           0 : }
     530             : 
     531           0 : void SfxTabDialog::RemoveStandardButton()
     532             : {
     533           0 :     m_pBaseFmtBtn->Hide();
     534           0 : }
     535             : 
     536           0 : short SfxTabDialog::Execute()
     537             : {
     538           0 :     if ( !m_pTabCtrl->GetPageCount() )
     539           0 :         return RET_CANCEL;
     540           0 :     Start_Impl();
     541           0 :     return TabDialog::Execute();
     542             : }
     543             : 
     544             : 
     545             : 
     546           0 : void SfxTabDialog::StartExecuteModal( const Link<>& rEndDialogHdl )
     547             : {
     548           0 :     if ( !m_pTabCtrl->GetPageCount() )
     549           0 :         return;
     550           0 :     Start_Impl();
     551           0 :     TabDialog::StartExecuteModal( rEndDialogHdl );
     552             : }
     553             : 
     554             : 
     555             : 
     556           0 : void SfxTabDialog::Start( bool bShow )
     557             : {
     558           0 :     pImpl->bModal = false;
     559           0 :     Start_Impl();
     560             : 
     561           0 :     if ( bShow )
     562           0 :         Show();
     563             : 
     564           0 :     if ( IsVisible() && ( !HasChildPathFocus() || HasFocus() ) )
     565           0 :         GrabFocusToFirstControl();
     566           0 : }
     567             : 
     568             : 
     569             : 
     570           0 : void SfxTabDialog::SetApplyHandler(const Link<>& _rHdl)
     571             : {
     572             :     DBG_ASSERT( m_pApplyBtn, "SfxTabDialog::GetApplyHandler: no apply button enabled!" );
     573           0 :     if ( m_pApplyBtn )
     574           0 :         m_pApplyBtn->SetClickHdl( _rHdl );
     575           0 : }
     576             : 
     577             : 
     578             : 
     579           0 : void SfxTabDialog::Start_Impl()
     580             : {
     581             :     assert(pImpl->aData.size() == m_pTabCtrl->GetPageCount()
     582             :             && "not all pages registered");
     583           0 :     sal_uInt16 nActPage = m_pTabCtrl->GetPageId( 0 );
     584             : 
     585             :     // load old settings, when exists
     586           0 :     SvtViewOptions aDlgOpt(E_TABDIALOG, OStringToOUString(GetHelpId(),RTL_TEXTENCODING_UTF8));
     587           0 :     if ( aDlgOpt.Exists() )
     588             :     {
     589           0 :         SetWindowState(OUStringToOString(aDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US));
     590             : 
     591             :         // initial TabPage from Program/Help/config
     592           0 :         nActPage = (sal_uInt16)aDlgOpt.GetPageID();
     593             : 
     594           0 :         if ( USHRT_MAX != nAppPageId )
     595           0 :             nActPage = nAppPageId;
     596             :         else
     597             :         {
     598           0 :             sal_uInt16 nAutoTabPageId = SfxGetpApp()->Get_Impl()->nAutoTabPageId;
     599           0 :             if ( nAutoTabPageId )
     600           0 :                 nActPage = nAutoTabPageId;
     601             :         }
     602             : 
     603           0 :         if ( TAB_PAGE_NOTFOUND == m_pTabCtrl->GetPagePos( nActPage ) )
     604           0 :             nActPage = m_pTabCtrl->GetPageId( 0 );
     605             :     }
     606           0 :     else if ( USHRT_MAX != nAppPageId && TAB_PAGE_NOTFOUND != m_pTabCtrl->GetPagePos( nAppPageId ) )
     607           0 :         nActPage = nAppPageId;
     608             : 
     609           0 :     m_pTabCtrl->SetCurPageId( nActPage );
     610           0 :     ActivatePageHdl( m_pTabCtrl );
     611           0 : }
     612             : 
     613           0 : void SfxTabDialog::AddTabPage( sal_uInt16 nId, const OUString &rRiderText, bool bItemsOnDemand, sal_uInt16 nPos )
     614             : {
     615           0 :     AddTabPage( nId, rRiderText, 0, 0, bItemsOnDemand, nPos );
     616           0 : }
     617             : 
     618             : /*
     619             :     Adds a page to the dialog. The Name must correspond to a entry in the
     620             :     TabControl in the dialog .ui
     621             : */
     622           0 : sal_uInt16 SfxTabDialog::AddTabPage
     623             : (
     624             :     const OString &rName,          // Page ID
     625             :     CreateTabPage pCreateFunc,     // Pointer to the Factory Method
     626             :     GetTabPageRanges pRangesFunc,  // Pointer to the Method for quering
     627             :                                    // Ranges onDemand
     628             :     bool bItemsOnDemand            // indicates whether the set of this page is
     629             :                                    // requested when created
     630             : )
     631             : {
     632           0 :     sal_uInt16 nId = m_pTabCtrl->GetPageId(rName);
     633             :     pImpl->aData.push_back(
     634           0 :         new Data_Impl( nId, pCreateFunc, pRangesFunc, bItemsOnDemand ) );
     635           0 :     return nId;
     636             : }
     637             : 
     638             : /*
     639             :     Adds a page to the dialog. The Name must correspond to a entry in the
     640             :     TabControl in the dialog .ui
     641             :  */
     642           0 : sal_uInt16 SfxTabDialog::AddTabPage
     643             : (
     644             :     const OString &rName,          // Page ID
     645             :     sal_uInt16 nPageCreateId       // Identifier of the Factory Method to create the page
     646             : )
     647             : {
     648           0 :     SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
     649             :     assert(pFact);
     650           0 :     CreateTabPage pCreateFunc = pFact->GetTabPageCreatorFunc(nPageCreateId);
     651             :     assert(pCreateFunc);
     652           0 :     GetTabPageRanges pRangesFunc = pFact->GetTabPageRangesFunc(nPageCreateId);
     653           0 :     sal_uInt16 nPageId = m_pTabCtrl->GetPageId(rName);
     654           0 :     pImpl->aData.push_back(new Data_Impl(nPageId, pCreateFunc, pRangesFunc, false));
     655           0 :     return nPageId;
     656             : }
     657             : 
     658             : 
     659             : 
     660           0 : void SfxTabDialog::AddTabPage
     661             : 
     662             : /*  [Description]
     663             : 
     664             :     Add a page to the dialog. The Rider text is passed on, the page has no
     665             :     counterpart in the TabControl in the resource of the dialogue.
     666             : */
     667             : 
     668             : (
     669             :     sal_uInt16 nId,
     670             :     const OUString& rRiderText,
     671             :     CreateTabPage pCreateFunc,
     672             :     GetTabPageRanges pRangesFunc,
     673             :     bool bItemsOnDemand,
     674             :     sal_uInt16 nPos
     675             : )
     676             : {
     677             :     DBG_ASSERT( TAB_PAGE_NOTFOUND == m_pTabCtrl->GetPagePos( nId ),
     678             :                 "Double Page-Ids in the Tabpage" );
     679           0 :     m_pTabCtrl->InsertPage( nId, rRiderText, nPos );
     680             :     pImpl->aData.push_back(
     681           0 :         new Data_Impl( nId, pCreateFunc, pRangesFunc, bItemsOnDemand ) );
     682           0 : }
     683             : 
     684           0 : void SfxTabDialog::RemoveTabPage( sal_uInt16 nId )
     685             : 
     686             : /*  [Description]
     687             : 
     688             :     Delete the TabPage with ID nId
     689             : */
     690             : 
     691             : {
     692           0 :     sal_uInt16 nPos = 0;
     693           0 :     m_pTabCtrl->RemovePage( nId );
     694           0 :     Data_Impl* pDataObject = Find( pImpl->aData, nId, &nPos );
     695             : 
     696           0 :     if ( pDataObject )
     697             :     {
     698           0 :         if ( pDataObject->pTabPage )
     699             :         {
     700           0 :             pDataObject->pTabPage->FillUserData();
     701           0 :             OUString aPageData( pDataObject->pTabPage->GetUserData() );
     702           0 :             if ( !aPageData.isEmpty() )
     703             :             {
     704             :                 // save settings of this page (user data)
     705           0 :                 OUString sConfigId = OStringToOUString(pDataObject->pTabPage->GetConfigId(),
     706           0 :                     RTL_TEXTENCODING_UTF8);
     707           0 :                 if (sConfigId.isEmpty())
     708             :                 {
     709             :                     SAL_WARN("sfx.config", "Tabpage needs to be converted to .ui format");
     710           0 :                     sConfigId = OUString::number(pDataObject->nId);
     711             :                 }
     712             : 
     713           0 :                 SvtViewOptions aPageOpt(E_TABPAGE, sConfigId);
     714           0 :                 aPageOpt.SetUserItem( USERITEM_NAME, makeAny( OUString( aPageData ) ) );
     715             :             }
     716             : 
     717           0 :             if ( pDataObject->bOnDemand )
     718           0 :                 delete &pDataObject->pTabPage->GetItemSet();
     719           0 :             pDataObject->pTabPage.disposeAndClear();
     720             :         }
     721             : 
     722           0 :         delete pDataObject;
     723           0 :         pImpl->aData.erase( pImpl->aData.begin() + nPos );
     724             :     }
     725             :     else
     726             :     {
     727             :         SAL_INFO( "sfx.dialog", "TabPage-Id not known" );
     728             :     }
     729           0 : }
     730             : 
     731           0 : void SfxTabDialog::RemoveTabPage(const OString &rName)
     732             : {
     733           0 :     RemoveTabPage(m_pTabCtrl->GetPageId(rName));
     734           0 : }
     735             : 
     736             : 
     737             : 
     738           0 : void SfxTabDialog::PageCreated
     739             : 
     740             : /*  [Description]
     741             : 
     742             :     Default implementation of the virtual method. This is called immediately
     743             :     after creating a page. Here the dialogue can call the TabPage Method
     744             :     directly.
     745             : */
     746             : 
     747             : (
     748             :     sal_uInt16,      // Id of the created page
     749             :     SfxTabPage&  // Reference to the created page
     750             : )
     751             : {
     752           0 : }
     753             : 
     754             : 
     755             : 
     756           0 : SfxItemSet* SfxTabDialog::GetInputSetImpl()
     757             : 
     758             : /*  [Description]
     759             : 
     760             :     Derived classes may create new storage for the InputSet. This has to be
     761             :     released in the Destructor. To do this, this method must be called.
     762             : */
     763             : 
     764             : {
     765           0 :     return pSet;
     766             : }
     767             : 
     768             : 
     769             : 
     770           0 : SfxTabPage* SfxTabDialog::GetTabPage( sal_uInt16 nPageId ) const
     771             : 
     772             : /*  [Description]
     773             : 
     774             :     Return TabPage with the specified Id.
     775             : */
     776             : 
     777             : {
     778           0 :     sal_uInt16 nPos = 0;
     779           0 :     Data_Impl* pDataObject = Find( pImpl->aData, nPageId, &nPos );
     780             : 
     781           0 :     if ( pDataObject )
     782           0 :         return pDataObject->pTabPage;
     783           0 :     return NULL;
     784             : }
     785             : 
     786           0 : void SfxTabDialog::SavePosAndId()
     787             : {
     788             :     // save settings (screen position and current page)
     789           0 :     SvtViewOptions aDlgOpt(E_TABDIALOG, OStringToOUString(GetHelpId(),RTL_TEXTENCODING_UTF8));
     790           0 :     aDlgOpt.SetWindowState(OStringToOUString(GetWindowState(WINDOWSTATE_MASK_POS),RTL_TEXTENCODING_ASCII_US));
     791             :     // to-do replace with name of page when all pages are converted to .ui
     792           0 :     aDlgOpt.SetPageID( m_pTabCtrl->GetCurPageId() );
     793           0 : }
     794             : 
     795             : 
     796             : 
     797           0 : short SfxTabDialog::Ok()
     798             : 
     799             : /*  [Description]
     800             : 
     801             :     Ok handler for the Dialogue.
     802             : 
     803             :     Dialog's current location and current page are saved for the next time
     804             :     the dialog is shown.
     805             : 
     806             :     The OutputSet is created and for each page this or the special OutputSet
     807             :     is set by calling the method <SfxTabPage::FillItemSet(SfxItemSet &)>, to
     808             :     insert the entered data by the user into the set.
     809             : 
     810             :     [Return value]
     811             : 
     812             :     RET_OK:       if at least one page has returned from FillItemSet,
     813             :                   otherwise RET_CANCEL.
     814             : */
     815             : {
     816           0 :     SavePosAndId(); //See fdo#38828 "Apply" resetting window position
     817             : 
     818           0 :     if ( !pOutSet )
     819             :     {
     820           0 :         if ( !pExampleSet && pSet )
     821           0 :             pOutSet = pSet->Clone( false );  // without Items
     822           0 :         else if ( pExampleSet )
     823           0 :             pOutSet = new SfxItemSet( *pExampleSet );
     824             :     }
     825           0 :     bool bModified = false;
     826             : 
     827           0 :     for ( SfxTabDlgData_Impl::const_iterator it = pImpl->aData.begin(); it != pImpl->aData.end(); ++it )
     828             :     {
     829           0 :         Data_Impl* pDataObject = *it;
     830           0 :         SfxTabPage* pTabPage = pDataObject->pTabPage;
     831             : 
     832           0 :         if ( pTabPage )
     833             :         {
     834           0 :             if ( pDataObject->bOnDemand )
     835             :             {
     836           0 :                 SfxItemSet& rSet = (SfxItemSet&)pTabPage->GetItemSet();
     837           0 :                 rSet.ClearItem();
     838           0 :                 bModified |= pTabPage->FillItemSet( &rSet );
     839             :             }
     840           0 :             else if ( pSet && !pTabPage->HasExchangeSupport() )
     841             :             {
     842           0 :                 SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
     843             : 
     844           0 :                 if ( pTabPage->FillItemSet( &aTmp ) )
     845             :                 {
     846           0 :                     bModified |= true;
     847           0 :                     if (pExampleSet)
     848           0 :                         pExampleSet->Put( aTmp );
     849           0 :                     pOutSet->Put( aTmp );
     850           0 :                 }
     851             :             }
     852             :         }
     853             :     }
     854             : 
     855           0 :     if ( pImpl->bModified || ( pOutSet && pOutSet->Count() > 0 ) )
     856           0 :         bModified |= true;
     857             : 
     858           0 :     if (bStandardPushed)
     859           0 :         bModified |= true;
     860           0 :     return bModified ? RET_OK : RET_CANCEL;
     861             : }
     862             : 
     863           0 : IMPL_LINK_NOARG(SfxTabDialog, CancelHdl)
     864             : {
     865           0 :     EndDialog( RET_USER_CANCEL );
     866           0 :     return 0;
     867             : }
     868             : 
     869             : 
     870             : 
     871           0 : SfxItemSet* SfxTabDialog::CreateInputItemSet( sal_uInt16 )
     872             : 
     873             : /*  [Description]
     874             : 
     875             :     Default implementation of the virtual Method.
     876             :     This is called when pages create their sets onDemand.
     877             : */
     878             : 
     879             : {
     880             :     SAL_WARN( "sfx.dialog", "CreateInputItemSet not implemented" );
     881           0 :     return new SfxAllItemSet( SfxGetpApp()->GetPool() );
     882             : }
     883             : 
     884             : 
     885             : 
     886           0 : void SfxTabDialog::RefreshInputSet()
     887             : 
     888             : /*  [Description]
     889             : 
     890             :     Default implementation of the virtual Method.
     891             :     This is called, when <SfxTabPage::DeactivatePage(SfxItemSet *)>
     892             :     returns <SfxTabPage::REFRESH_SET>.
     893             : */
     894             : 
     895             : {
     896             :     SAL_INFO ( "sfx.dialog", "RefreshInputSet not implemented" );
     897           0 : }
     898             : 
     899             : 
     900             : 
     901           0 : IMPL_LINK_NOARG(SfxTabDialog, OkHdl)
     902             : 
     903             : /*  [Description]
     904             : 
     905             :     Handler of the Ok-Buttons
     906             :     This calls the current page <SfxTabPage::DeactivatePage(SfxItemSet *)>.
     907             :     Returns <SfxTabPage::LEAVE_PAGE>, <SfxTabDialog::Ok()> is called
     908             :     and the Dialog is ended.
     909             : */
     910             : 
     911             : {
     912           0 :     if (PrepareLeaveCurrentPage())
     913             :     {
     914           0 :         if ( pImpl->bModal )
     915           0 :             EndDialog( Ok() );
     916             :         else
     917             :         {
     918           0 :             Ok();
     919           0 :             Close();
     920             :         }
     921             :     }
     922           0 :     return 0;
     923             : }
     924             : 
     925           0 : bool SfxTabDialog::Apply()
     926             : {
     927           0 :     bool bApplied = false;
     928           0 :     if (PrepareLeaveCurrentPage())
     929           0 :          bApplied = (Ok() == RET_OK);
     930           0 :     return bApplied;
     931             : }
     932             : 
     933             : 
     934             : 
     935           0 : bool SfxTabDialog::PrepareLeaveCurrentPage()
     936             : {
     937           0 :     sal_uInt16 const nId = m_pTabCtrl->GetCurPageId();
     938           0 :     SfxTabPage* pPage = dynamic_cast<SfxTabPage*> (m_pTabCtrl->GetTabPage( nId ));
     939           0 :     bool bEnd = !pPage;
     940             : 
     941           0 :     if ( pPage )
     942             :     {
     943           0 :         int nRet = SfxTabPage::LEAVE_PAGE;
     944           0 :         if ( pSet )
     945             :         {
     946           0 :             SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
     947             : 
     948           0 :             if ( pPage->HasExchangeSupport() )
     949           0 :                 nRet = pPage->DeactivatePage( &aTmp );
     950             :             else
     951           0 :                 nRet = pPage->DeactivatePage( NULL );
     952             : 
     953           0 :             if ( ( SfxTabPage::LEAVE_PAGE & nRet ) == SfxTabPage::LEAVE_PAGE
     954           0 :                  && aTmp.Count() )
     955             :             {
     956           0 :                 pExampleSet->Put( aTmp );
     957           0 :                 pOutSet->Put( aTmp );
     958           0 :             }
     959             :         }
     960             :         else
     961           0 :             nRet = pPage->DeactivatePage( NULL );
     962           0 :         bEnd = nRet;
     963             :     }
     964             : 
     965           0 :     return bEnd;
     966             : }
     967             : 
     968             : 
     969             : 
     970             : 
     971           0 : IMPL_LINK_NOARG(SfxTabDialog, UserHdl)
     972             : 
     973             : /*  [Description]
     974             : 
     975             :     Handler of the User-Buttons
     976             :     This calls the current page <SfxTabPage::DeactivatePage(SfxItemSet *)>.
     977             :     returns this <SfxTabPage::LEAVE_PAGE> and  <SfxTabDialog::Ok()> is called.
     978             :     Then the Dialog is ended with the Return value <SfxTabDialog::Ok()>
     979             : */
     980             : 
     981             : {
     982           0 :     if ( PrepareLeaveCurrentPage () )
     983             :     {
     984           0 :         short nRet = Ok();
     985             : 
     986           0 :         if ( RET_OK == nRet )
     987           0 :             nRet = RET_USER;
     988             :         else
     989           0 :             nRet = RET_USER_CANCEL;
     990           0 :         EndDialog( nRet );
     991             :     }
     992           0 :     return 0;
     993             : }
     994             : 
     995             : 
     996             : 
     997           0 : IMPL_LINK_NOARG(SfxTabDialog, ResetHdl)
     998             : 
     999             : /*  [Description]
    1000             : 
    1001             :     Handler behind the reset button.
    1002             :     The Current Page is new initialized with their initial data, all the
    1003             :     settings that the user has made on this page are repealed.
    1004             : */
    1005             : 
    1006             : {
    1007           0 :     const sal_uInt16 nId = m_pTabCtrl->GetCurPageId();
    1008           0 :     Data_Impl* pDataObject = Find( pImpl->aData, nId );
    1009             :     DBG_ASSERT( pDataObject, "Id not known" );
    1010             : 
    1011           0 :     if ( pDataObject->bOnDemand )
    1012             :     {
    1013             :         // CSet on AIS has problems here, thus separated
    1014           0 :         const SfxItemSet* pItemSet = &pDataObject->pTabPage->GetItemSet();
    1015           0 :         pDataObject->pTabPage->Reset( pItemSet );
    1016             :     }
    1017             :     else
    1018           0 :         pDataObject->pTabPage->Reset( pSet );
    1019           0 :     return 0;
    1020             : }
    1021             : 
    1022             : 
    1023             : 
    1024           0 : IMPL_LINK_NOARG(SfxTabDialog, BaseFmtHdl)
    1025             : 
    1026             : /*  [Description]
    1027             : 
    1028             :     Handler behind the Standard-Button.
    1029             :     This button is available when editing style sheets. All the set attributes
    1030             :     in the edited stylesheet are deleted.
    1031             : */
    1032             : 
    1033             : {
    1034           0 :     bStandardPushed = true;
    1035             : 
    1036           0 :     const sal_uInt16 nId = m_pTabCtrl->GetCurPageId();
    1037           0 :     Data_Impl* pDataObject = Find( pImpl->aData, nId );
    1038             :     DBG_ASSERT( pDataObject, "Id not known" );
    1039             : 
    1040           0 :     if ( pDataObject->fnGetRanges )
    1041             :     {
    1042           0 :         if ( !pExampleSet )
    1043           0 :             pExampleSet = new SfxItemSet( *pSet );
    1044             : 
    1045           0 :         const SfxItemPool* pPool = pSet->GetPool();
    1046           0 :         const sal_uInt16* pTmpRanges = (pDataObject->fnGetRanges)();
    1047           0 :         SfxItemSet aTmpSet( *pExampleSet );
    1048             : 
    1049           0 :         while ( *pTmpRanges )
    1050             :         {
    1051           0 :             const sal_uInt16* pU = pTmpRanges + 1;
    1052             : 
    1053           0 :             if ( *pTmpRanges == *pU )
    1054             :             {
    1055             :                 // Range which two identical values -> only set one Item
    1056           0 :                 sal_uInt16 nWh = pPool->GetWhich( *pTmpRanges );
    1057           0 :                 pExampleSet->ClearItem( nWh );
    1058           0 :                 aTmpSet.ClearItem( nWh );
    1059             :                 // At the Outset of InvalidateItem,
    1060             :                 // so that the change takes effect
    1061           0 :                 pOutSet->InvalidateItem( nWh );
    1062             :             }
    1063             :             else
    1064             :             {
    1065             :                 // Correct Range with multiple values
    1066           0 :                 sal_uInt16 nTmp = *pTmpRanges, nTmpEnd = *pU;
    1067             :                 DBG_ASSERT( nTmp <= nTmpEnd, "Range is sorted the wrong way" );
    1068             : 
    1069           0 :                 if ( nTmp > nTmpEnd )
    1070             :                 {
    1071             :                     // If really sorted wrongly, then set new
    1072           0 :                     sal_uInt16 nTmp1 = nTmp;
    1073           0 :                     nTmp = nTmpEnd;
    1074           0 :                     nTmpEnd = nTmp1;
    1075             :                 }
    1076             : 
    1077           0 :                 while ( nTmp <= nTmpEnd )
    1078             :                 {
    1079             :                     // Iterate over the Range and set the Items
    1080           0 :                     sal_uInt16 nWh = pPool->GetWhich( nTmp );
    1081           0 :                     pExampleSet->ClearItem( nWh );
    1082           0 :                     aTmpSet.ClearItem( nWh );
    1083             :                     // At the Outset of InvalidateItem,
    1084             :                     // so that the change takes effect
    1085           0 :                     pOutSet->InvalidateItem( nWh );
    1086           0 :                     nTmp++;
    1087             :                 }
    1088             :             }
    1089             :             // Go to the next pair
    1090           0 :             pTmpRanges += 2;
    1091             :         }
    1092             :         // Set all Items as new  -> the call the current Page Reset()
    1093             :         DBG_ASSERT( pDataObject->pTabPage, "the Page is gone" );
    1094           0 :         pDataObject->pTabPage->Reset( &aTmpSet );
    1095           0 :         pDataObject->pTabPage->pImpl->mbStandard = true;
    1096             :     }
    1097           0 :     return 1;
    1098             : }
    1099             : 
    1100             : 
    1101             : 
    1102           0 : IMPL_LINK( SfxTabDialog, ActivatePageHdl, TabControl *, pTabCtrl )
    1103             : 
    1104             : /*  [Description]
    1105             : 
    1106             :     Handler that is called by StarView for switching to a different page.
    1107             :     If the page not exist yet then it is created and the virtual Method
    1108             :     <SfxTabDialog::PageCreated( sal_uInt16, SfxTabPage &)> is called. If the page
    1109             :     exist, then the if possible the <SfxTabPage::Reset(const SfxItemSet &)> or
    1110             :     <SfxTabPage::ActivatePage(const SfxItemSet &)> is called.
    1111             : */
    1112             : 
    1113             : {
    1114           0 :     sal_uInt16 nId = pTabCtrl->GetCurPageId();
    1115             : 
    1116             :     DBG_ASSERT( pImpl->aData.size(), "no Pages registered" );
    1117           0 :     SfxGetpApp();
    1118             : 
    1119             :     // Tab Page schon da?
    1120           0 :     VclPtr<SfxTabPage> pTabPage = dynamic_cast<SfxTabPage*> (pTabCtrl->GetTabPage( nId ));
    1121           0 :     Data_Impl* pDataObject = Find( pImpl->aData, nId );
    1122             : 
    1123             :     //UUUU fallback to 1st page when requested one does not exist
    1124           0 :     if(!pDataObject && pTabCtrl->GetPageCount())
    1125             :     {
    1126           0 :         pTabCtrl->SetCurPageId(pTabCtrl->GetPageId(0));
    1127           0 :         nId = pTabCtrl->GetCurPageId();
    1128           0 :         pTabPage = dynamic_cast< SfxTabPage* >(pTabCtrl->GetTabPage(nId));
    1129           0 :         pDataObject = Find(pImpl->aData, nId);
    1130             :     }
    1131             : 
    1132           0 :     if (!pDataObject)
    1133             :     {
    1134             :         SAL_WARN("sfx.config", "Tab Page ID not known, this is pretty serious and needs investigation");
    1135           0 :         return 0;
    1136             :     }
    1137             : 
    1138             :     // Create TabPage if possible:
    1139           0 :     if ( !pTabPage )
    1140             :     {
    1141           0 :         const SfxItemSet* pTmpSet = 0;
    1142             : 
    1143           0 :         if ( pSet )
    1144             :         {
    1145           0 :             if ( bItemsReset && pSet->GetParent() )
    1146           0 :                 pTmpSet = pSet->GetParent();
    1147             :             else
    1148           0 :                 pTmpSet = pSet;
    1149             :         }
    1150             : 
    1151           0 :         if ( pTmpSet && !pDataObject->bOnDemand )
    1152           0 :             pTabPage = (pDataObject->fnCreatePage)( pTabCtrl, pTmpSet );
    1153             :         else
    1154           0 :             pTabPage = (pDataObject->fnCreatePage)
    1155           0 :                             ( pTabCtrl, CreateInputItemSet( nId ) );
    1156             :         DBG_ASSERT( nullptr == pDataObject->pTabPage, "create TabPage more than once" );
    1157           0 :         pDataObject->pTabPage = pTabPage;
    1158             : 
    1159           0 :         OUString sConfigId = OStringToOUString(pTabPage->GetConfigId(), RTL_TEXTENCODING_UTF8);
    1160           0 :         if (sConfigId.isEmpty())
    1161             :         {
    1162             :             SAL_WARN("sfx.config", "Tabpage needs to be converted to .ui format");
    1163           0 :             sConfigId = OUString::number(pDataObject->nId);
    1164             :         }
    1165           0 :         SvtViewOptions aPageOpt(E_TABPAGE, sConfigId);
    1166           0 :         OUString sUserData;
    1167           0 :         Any aUserItem = aPageOpt.GetUserItem( USERITEM_NAME );
    1168           0 :         OUString aTemp;
    1169           0 :         if ( aUserItem >>= aTemp )
    1170           0 :             sUserData = aTemp;
    1171           0 :         pTabPage->SetUserData( sUserData );
    1172           0 :         Size aSiz = pTabPage->GetSizePixel();
    1173             : 
    1174           0 :         Size aCtrlSiz = pTabCtrl->GetTabPageSizePixel();
    1175             :         // Only set Size on TabControl when < as TabPage
    1176           0 :         if ( aCtrlSiz.Width() < aSiz.Width() ||
    1177           0 :              aCtrlSiz.Height() < aSiz.Height() )
    1178             :         {
    1179           0 :             pTabCtrl->SetTabPageSizePixel( aSiz );
    1180             :         }
    1181             : 
    1182           0 :         PageCreated( nId, *pTabPage );
    1183             : 
    1184           0 :         if ( pDataObject->bOnDemand )
    1185           0 :             pTabPage->Reset( &pTabPage->GetItemSet() );
    1186             :         else
    1187           0 :             pTabPage->Reset( pSet );
    1188             : 
    1189           0 :         pTabCtrl->SetTabPage( nId, pTabPage );
    1190             :     }
    1191           0 :     else if ( pDataObject->bRefresh )
    1192           0 :         pTabPage->Reset( pSet );
    1193           0 :     pDataObject->bRefresh = false;
    1194             : 
    1195           0 :     if ( pExampleSet )
    1196           0 :         pTabPage->ActivatePage( *pExampleSet );
    1197           0 :     bool bReadOnly = pTabPage->IsReadOnly();
    1198           0 :     ( bReadOnly || pImpl->bHideResetBtn ) ? m_pResetBtn->Hide() : m_pResetBtn->Show();
    1199           0 :     return 0;
    1200             : }
    1201             : 
    1202             : 
    1203             : 
    1204           0 : IMPL_LINK_TYPED( SfxTabDialog, DeactivatePageHdl, TabControl *, pTabCtrl, bool )
    1205             : 
    1206             : /*  [Description]
    1207             : 
    1208             :     Handler that is called by StarView before leaving a page.
    1209             : 
    1210             :     [Cross-reference]
    1211             : 
    1212             :     <SfxTabPage::DeactivatePage(SfxItemSet *)>
    1213             : */
    1214             : 
    1215             : {
    1216           0 :     sal_uInt16 nId = pTabCtrl->GetCurPageId();
    1217           0 :     SfxGetpApp();
    1218           0 :     SfxTabPage *pPage = dynamic_cast<SfxTabPage*> (pTabCtrl->GetTabPage( nId ));
    1219             :     DBG_ASSERT( pPage, "no active Page" );
    1220           0 :     if (!pPage)
    1221           0 :         return false;
    1222             : #ifdef DBG_UTIL
    1223             :     Data_Impl* pDataObject = Find( pImpl->aData, pTabCtrl->GetCurPageId() );
    1224             :     DBG_ASSERT( pDataObject, "no Data structure for current page" );
    1225             :     if ( pPage->HasExchangeSupport() && pDataObject->bOnDemand )
    1226             :     {
    1227             :         DBG_WARNING( "Data exchange in ItemsOnDemand is not desired!" );
    1228             :     }
    1229             : #endif
    1230             : 
    1231           0 :     int nRet = SfxTabPage::LEAVE_PAGE;
    1232             : 
    1233           0 :     if ( !pExampleSet && pPage->HasExchangeSupport() && pSet )
    1234           0 :         pExampleSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
    1235             : 
    1236           0 :     if ( pSet )
    1237             :     {
    1238           0 :         SfxItemSet aTmp( *pSet->GetPool(), pSet->GetRanges() );
    1239             : 
    1240           0 :         if ( pPage->HasExchangeSupport() )
    1241           0 :             nRet = pPage->DeactivatePage( &aTmp );
    1242             :         else
    1243           0 :             nRet = pPage->DeactivatePage( NULL );
    1244           0 :         if ( ( SfxTabPage::LEAVE_PAGE & nRet ) == SfxTabPage::LEAVE_PAGE &&
    1245           0 :              aTmp.Count() )
    1246             :         {
    1247           0 :             pExampleSet->Put( aTmp );
    1248           0 :             pOutSet->Put( aTmp );
    1249           0 :         }
    1250             :     }
    1251             :     else
    1252             :     {
    1253           0 :         if ( pPage->HasExchangeSupport() ) //!!!
    1254             :         {
    1255           0 :             if ( !pExampleSet )
    1256             :             {
    1257           0 :                 SfxItemPool* pPool = pPage->GetItemSet().GetPool();
    1258             :                 pExampleSet =
    1259           0 :                     new SfxItemSet( *pPool, GetInputRanges( *pPool ) );
    1260             :             }
    1261           0 :             nRet = pPage->DeactivatePage( pExampleSet );
    1262             :         }
    1263             :         else
    1264           0 :             nRet = pPage->DeactivatePage( NULL );
    1265             :     }
    1266             : 
    1267           0 :     if ( nRet & SfxTabPage::REFRESH_SET )
    1268             :     {
    1269           0 :         RefreshInputSet();
    1270             :         // Flag all Pages as to be initialized as new
    1271             : 
    1272           0 :         for ( SfxTabDlgData_Impl::const_iterator it = pImpl->aData.begin(); it != pImpl->aData.end(); ++it )
    1273             :         {
    1274           0 :             Data_Impl* pObj = *it;
    1275             : 
    1276           0 :             if ( pObj->pTabPage.get() != pPage ) // Do not refresh own Page anymore
    1277           0 :                 pObj->bRefresh = true;
    1278             :             else
    1279           0 :                 pObj->bRefresh = false;
    1280             :         }
    1281             :     }
    1282           0 :     if ( nRet & SfxTabPage::LEAVE_PAGE )
    1283           0 :         return true;
    1284             :     else
    1285           0 :         return false;
    1286             : }
    1287             : 
    1288             : 
    1289             : 
    1290           0 : void SfxTabDialog::ShowPage( sal_uInt16 nId )
    1291             : 
    1292             : /*  [Description]
    1293             : 
    1294             :     The TabPage is activated with the specified Id.
    1295             : */
    1296             : 
    1297             : {
    1298           0 :     m_pTabCtrl->SetCurPageId( nId );
    1299           0 :     ActivatePageHdl( m_pTabCtrl );
    1300           0 : }
    1301             : 
    1302             : 
    1303             : 
    1304           0 : const sal_uInt16* SfxTabDialog::GetInputRanges( const SfxItemPool& rPool )
    1305             : 
    1306             : /*  [Description]
    1307             : 
    1308             :     Makes the set over the range of all pages of the dialogue. Pages have the
    1309             :     static method for querying their range in AddTabPage, ie deliver their
    1310             :     sets onDemand.
    1311             : 
    1312             :     [Return value]
    1313             : 
    1314             :     Pointer to a null-terminated array of sal_uInt16. This array belongs to the
    1315             :     dialog and is deleted when the dialogue is destroy.
    1316             : 
    1317             :     [Cross-reference]
    1318             : 
    1319             :     <SfxTabDialog::AddTabPage(sal_uInt16, CreateTabPage, GetTabPageRanges, bool)>
    1320             :     <SfxTabDialog::AddTabPage(sal_uInt16, const String &, CreateTabPage, GetTabPageRanges, bool, sal_uInt16)>
    1321             :     <SfxTabDialog::AddTabPage(sal_uInt16, const Bitmap &, CreateTabPage, GetTabPageRanges, bool, sal_uInt16)>
    1322             : */
    1323             : 
    1324             : {
    1325           0 :     if ( pSet )
    1326             :     {
    1327             :         SAL_WARN( "sfx.dialog", "Set already exists!" );
    1328           0 :         return pSet->GetRanges();
    1329             :     }
    1330             : 
    1331           0 :     if ( pRanges )
    1332           0 :         return pRanges;
    1333           0 :     std::vector<sal_uInt16> aUS;
    1334             : 
    1335           0 :     for ( SfxTabDlgData_Impl::const_iterator it = pImpl->aData.begin(); it != pImpl->aData.end(); ++it )
    1336             :     {
    1337           0 :         Data_Impl* pDataObject = *it;
    1338             : 
    1339           0 :         if ( pDataObject->fnGetRanges )
    1340             :         {
    1341           0 :             const sal_uInt16* pTmpRanges = (pDataObject->fnGetRanges)();
    1342           0 :             const sal_uInt16* pIter = pTmpRanges;
    1343             : 
    1344             :             sal_uInt16 nLen;
    1345           0 :             for( nLen = 0; *pIter; ++nLen, ++pIter )
    1346             :                 ;
    1347           0 :             aUS.insert( aUS.end(), pTmpRanges, pTmpRanges + nLen );
    1348             :         }
    1349             :     }
    1350             : 
    1351             :     //! Remove duplicated Ids?
    1352             :     {
    1353           0 :         sal_uInt16 nCount = aUS.size();
    1354           0 :         for ( sal_uInt16 i = 0; i < nCount; ++i )
    1355           0 :             aUS[i] = rPool.GetWhich( aUS[i] );
    1356             :     }
    1357             : 
    1358             :     // sort
    1359           0 :     if ( aUS.size() > 1 )
    1360             :     {
    1361           0 :         std::sort( aUS.begin(), aUS.end() );
    1362             :     }
    1363             : 
    1364           0 :     pRanges = new sal_uInt16[aUS.size() + 1];
    1365           0 :     std::copy( aUS.begin(), aUS.end(), pRanges );
    1366           0 :     pRanges[aUS.size()] = 0;
    1367           0 :     return pRanges;
    1368             : }
    1369             : 
    1370             : 
    1371             : 
    1372           0 : void SfxTabDialog::SetInputSet( const SfxItemSet* pInSet )
    1373             : 
    1374             : /*  [Description]
    1375             : 
    1376             :     With this method the Input-Set can subsequently be set initially or re-set.
    1377             : */
    1378             : 
    1379             : {
    1380           0 :     bool bSet = ( pSet != NULL );
    1381           0 :     delete pSet;
    1382           0 :     pSet = pInSet ? new SfxItemSet(*pInSet) : 0;
    1383             : 
    1384           0 :     if (!bSet && !pExampleSet && !pOutSet && pSet)
    1385             :     {
    1386           0 :         pExampleSet = new SfxItemSet( *pSet );
    1387           0 :         pOutSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
    1388             :     }
    1389         648 : }
    1390             : 
    1391             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11