LCOV - code coverage report
Current view: top level - sw/source/ui/misc - outline.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 625 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 63 0.0 %
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             : #include <hintids.hxx>
      21             : #include <vcl/menu.hxx>
      22             : #include <vcl/msgbox.hxx>
      23             : #include <vcl/settings.hxx>
      24             : #include <vcl/builderfactory.hxx>
      25             : 
      26             : #include <sfx2/tabdlg.hxx>
      27             : #include <editeng/brushitem.hxx>
      28             : #include <unotools/configmgr.hxx>
      29             : #include <SwStyleNameMapper.hxx>
      30             : #include <num.hxx>
      31             : #include <view.hxx>
      32             : #include <docsh.hxx>
      33             : #include <uitool.hxx>
      34             : #include <wrtsh.hxx>
      35             : #include <swmodule.hxx>
      36             : #include <fmtcol.hxx>
      37             : #include <outline.hxx>
      38             : #include <uinums.hxx>
      39             : #include <poolfmt.hxx>
      40             : #include <shellres.hxx>
      41             : #include <svl/style.hxx>
      42             : #include <charfmt.hxx>
      43             : #include <docstyle.hxx>
      44             : #include <viewopt.hxx>
      45             : #include <svtools/ctrlbox.hxx>
      46             : #include <helpid.h>
      47             : #include <globals.hrc>
      48             : #include <misc.hrc>
      49             : #include <paratr.hxx>
      50             : 
      51             : #include <unomid.h>
      52             : 
      53             : #include <IDocumentOutlineNodes.hxx>
      54             : #include <app.hrc>
      55             : 
      56             : #include <com/sun/star/accessibility/AccessibleRole.hpp>
      57             : 
      58             : #include <boost/scoped_ptr.hpp>
      59             : 
      60             : using namespace ::com::sun::star;
      61             : 
      62             : class SwNumNamesDlg : public ModalDialog
      63             : {
      64             :     VclPtr<Edit>     m_pFormEdit;
      65             :     VclPtr<ListBox>  m_pFormBox;
      66             :     VclPtr<OKButton> m_pOKBtn;
      67             : 
      68             :     DECL_LINK( ModifyHdl, Edit * );
      69             :     DECL_LINK( SelectHdl, ListBox * );
      70             :     DECL_LINK(DoubleClickHdl, void *);
      71             : 
      72             : public:
      73             :     explicit SwNumNamesDlg(vcl::Window *pParent);
      74             :     virtual ~SwNumNamesDlg();
      75             :     virtual void dispose() SAL_OVERRIDE;
      76             :     void SetUserNames(const OUString *pList[]);
      77           0 :     OUString GetName() const { return m_pFormEdit->GetText(); }
      78           0 :     sal_Int32 GetCurEntryPos() const { return m_pFormBox->GetSelectEntryPos(); }
      79             : };
      80             : 
      81           0 : SwNumNamesDlg::~SwNumNamesDlg()
      82             : {
      83           0 :     disposeOnce();
      84           0 : }
      85             : 
      86           0 : void SwNumNamesDlg::dispose()
      87             : {
      88           0 :     m_pFormEdit.clear();
      89           0 :     m_pFormBox.clear();
      90           0 :     m_pOKBtn.clear();
      91           0 :     ModalDialog::dispose();
      92           0 : }
      93             : 
      94             : 
      95             : // remember selected entry
      96           0 : IMPL_LINK( SwNumNamesDlg, SelectHdl, ListBox *, pBox )
      97             : {
      98           0 :     m_pFormEdit->SetText(pBox->GetSelectEntry());
      99           0 :     m_pFormEdit->SetSelection(Selection(0, SELECTION_MAX));
     100           0 :     return 0;
     101             : }
     102             : 
     103             : /** set user defined names
     104             :  *
     105             :  * @param pList list of user defined names; unknown positions for the user are 0.
     106             :  */
     107           0 : void SwNumNamesDlg::SetUserNames(const OUString *pList[])
     108             : {
     109           0 :     sal_uInt16 nSelect = 0;
     110           0 :     for (sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i)
     111             :     {
     112           0 :         if(pList[i])
     113             :         {
     114           0 :             m_pFormBox->RemoveEntry(i);
     115           0 :             m_pFormBox->InsertEntry(*pList[i], i);
     116           0 :             if (i == nSelect && nSelect < SwChapterNumRules::nMaxRules)
     117           0 :                 nSelect++;
     118             :         }
     119             :     }
     120           0 :     m_pFormBox->SelectEntryPos(nSelect);
     121           0 :     SelectHdl(m_pFormBox);
     122           0 : }
     123             : 
     124             : // unlock OK-Button when text is in Edit
     125           0 : IMPL_LINK( SwNumNamesDlg, ModifyHdl, Edit *, pBox )
     126             : {
     127           0 :     m_pOKBtn->Enable(!pBox->GetText().isEmpty());
     128           0 :     return 0;
     129             : }
     130             : 
     131             : // DoubleClickHdl
     132           0 : IMPL_LINK_NOARG(SwNumNamesDlg, DoubleClickHdl)
     133             : {
     134           0 :     EndDialog(RET_OK);
     135           0 :     return 0;
     136             : }
     137             : 
     138           0 : SwNumNamesDlg::SwNumNamesDlg(vcl::Window *pParent)
     139             :     : ModalDialog(pParent, "NumberingNameDialog",
     140           0 :         "modules/swriter/ui/numberingnamedialog.ui")
     141             : {
     142           0 :     get(m_pFormEdit, "entry");
     143           0 :     get(m_pFormBox, "form");
     144           0 :     m_pFormBox->SetDropDownLineCount(5);
     145           0 :     get(m_pOKBtn, "ok");
     146           0 :     m_pFormEdit->SetModifyHdl(LINK(this, SwNumNamesDlg, ModifyHdl));
     147           0 :     m_pFormBox->SetSelectHdl(LINK(this, SwNumNamesDlg, SelectHdl));
     148           0 :     m_pFormBox->SetDoubleClickHdl(LINK(this, SwNumNamesDlg, DoubleClickHdl));
     149           0 :     SelectHdl(m_pFormBox);
     150           0 : }
     151             : 
     152           0 : static sal_uInt16 lcl_BitToLevel(sal_uInt16 nActLevel)
     153             : {
     154           0 :     sal_uInt16 nTmp = nActLevel;
     155           0 :     sal_uInt16 nTmpLevel = 0;
     156           0 :     while( 0 != (nTmp >>= 1) )
     157           0 :         nTmpLevel++;
     158           0 :     return nTmpLevel;
     159             : }
     160             : 
     161             : sal_uInt16 SwOutlineTabDialog::nNumLevel = 1;
     162           0 : SwOutlineTabDialog::SwOutlineTabDialog(vcl::Window* pParent, const SfxItemSet* pSwItemSet,
     163             :     SwWrtShell &rSh)
     164             :     : SfxTabDialog(pParent, "OutlineNumberingDialog",
     165             :         "modules/swriter/ui/outlinenumbering.ui", pSwItemSet)
     166             :     , rWrtSh(rSh)
     167           0 :     , pChapterNumRules(SW_MOD()->GetChapterNumRules())
     168           0 :     , bModified(rWrtSh.IsModified())
     169             : {
     170           0 :     PushButton* pUserButton = GetUserButton();
     171           0 :     pUserButton->SetClickHdl(LINK(this, SwOutlineTabDialog, FormHdl));
     172           0 :     pUserButton->SetAccessibleRole( com::sun::star::accessibility::AccessibleRole::BUTTON_MENU );
     173             : 
     174           0 :     pNumRule = new SwNumRule( *rSh.GetOutlineNumRule() );
     175           0 :     GetCancelButton().SetClickHdl(LINK(this, SwOutlineTabDialog, CancelHdl));
     176             : 
     177           0 :     m_nNumPosId = AddTabPage("position", &SwNumPositionTabPage::Create, 0);
     178           0 :     m_nOutlineId = AddTabPage("numbering", &SwOutlineSettingsTabPage::Create, 0);
     179             : 
     180           0 :     OUString sHeadline;
     181             :     sal_uInt16 i;
     182             : 
     183           0 :     for( i = 0; i < MAXLEVEL; ++i )
     184             :     {
     185             :         // if the style wasn't created yet, it's still at this position
     186           0 :         if( !rWrtSh.GetParaStyle( sHeadline =
     187             :             SwStyleNameMapper::GetUIName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i),
     188           0 :                                           sHeadline )) )
     189           0 :             aCollNames[i] = sHeadline;
     190             :     }
     191             : 
     192             :     // query the text templates' outlining levels
     193           0 :     const sal_uInt16 nCount = rWrtSh.GetTextFormatCollCount();
     194           0 :     for(i = 0; i < nCount; ++i )
     195             :     {
     196           0 :         SwTextFormatColl &rTextColl = rWrtSh.GetTextFormatColl(i);
     197           0 :         if(!rTextColl.IsDefault())
     198             :         {
     199           0 :             if(rTextColl.IsAssignedToListLevelOfOutlineStyle())
     200             :             {
     201           0 :                 int nOutLevel = rTextColl.GetAssignedOutlineStyleLevel();
     202           0 :                 aCollNames[ nOutLevel ] = rTextColl.GetName();
     203             :             }
     204             :         }
     205           0 :     }
     206           0 : }
     207             : 
     208           0 : SwOutlineTabDialog::~SwOutlineTabDialog()
     209             : {
     210           0 :     disposeOnce();
     211           0 : }
     212             : 
     213           0 : void SwOutlineTabDialog::dispose()
     214             : {
     215           0 :     delete pNumRule;
     216           0 :     SfxTabDialog::dispose();
     217           0 : }
     218             : 
     219           0 : void SwOutlineTabDialog::PageCreated(sal_uInt16 nPageId, SfxTabPage& rPage)
     220             : {
     221           0 :     if (nPageId == m_nNumPosId)
     222             :     {
     223           0 :         static_cast<SwNumPositionTabPage&>(rPage).SetWrtShell(&rWrtSh);
     224           0 :         static_cast<SwNumPositionTabPage&>(rPage).SetOutlineTabDialog(this);
     225             :     }
     226           0 :     else if (nPageId == m_nOutlineId)
     227             :     {
     228           0 :         static_cast<SwOutlineSettingsTabPage&>(rPage).SetWrtShell(&rWrtSh);
     229             :     }
     230           0 : }
     231             : 
     232           0 : IMPL_LINK_NOARG(SwOutlineTabDialog, CancelHdl)
     233             : {
     234           0 :     if (!bModified)
     235           0 :         rWrtSh.ResetModified();
     236           0 :     EndDialog(RET_CANCEL);
     237           0 :     return 0;
     238             : }
     239             : 
     240           0 : IMPL_LINK( SwOutlineTabDialog, FormHdl, Button *, pBtn )
     241             : {
     242           0 :     PopupMenu *pFormMenu = get_menu("form");
     243             :     // fill PopupMenu
     244           0 :     for( sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i )
     245             :     {
     246           0 :         const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i);
     247           0 :         if( pRules )
     248           0 :             pFormMenu->SetItemText(pFormMenu->GetItemId(i), pRules->GetName());
     249             :     }
     250             : 
     251           0 :     OString sHelpId(pFormMenu->GetHelpId(pFormMenu->GetItemId("form1")));
     252           0 :     for (sal_Int32 i = 2; i <= 9; ++i)
     253             :     {
     254           0 :         OString sForm("form");
     255           0 :         pFormMenu->SetHelpId(pFormMenu->GetItemId(sForm + OString::number(i)), sHelpId);
     256           0 :     }
     257             : 
     258           0 :     pFormMenu->SetSelectHdl(LINK(this, SwOutlineTabDialog, MenuSelectHdl));
     259           0 :     pFormMenu->Execute(pBtn, Rectangle(Point(0,0), pBtn->GetSizePixel()), PopupMenuFlags::ExecuteDown);
     260           0 :     return 0;
     261             : }
     262             : 
     263           0 : IMPL_LINK( SwOutlineTabDialog, MenuSelectHdl, Menu *, pMenu )
     264             : {
     265           0 :     sal_uInt8 nLevelNo = 0;
     266           0 :     OString sIdent = pMenu->GetCurItemIdent();
     267             : 
     268           0 :     if (sIdent == "form1")
     269           0 :         nLevelNo = 1;
     270           0 :     else if (sIdent == "form2")
     271           0 :         nLevelNo = 2;
     272           0 :     else if (sIdent == "form3")
     273           0 :         nLevelNo = 3;
     274           0 :     else if (sIdent == "form4")
     275           0 :         nLevelNo = 4;
     276           0 :     else if (sIdent == "form5")
     277           0 :         nLevelNo = 5;
     278           0 :     else if (sIdent == "form6")
     279           0 :         nLevelNo = 6;
     280           0 :     else if (sIdent == "form7")
     281           0 :         nLevelNo = 7;
     282           0 :     else if (sIdent == "form8")
     283           0 :         nLevelNo = 8;
     284           0 :     else if (sIdent == "form9")
     285           0 :         nLevelNo = 9;
     286           0 :     else if (sIdent == "saveas")
     287             :     {
     288           0 :         VclPtrInstance< SwNumNamesDlg > pDlg(this);
     289             :         const OUString *aStrArr[SwChapterNumRules::nMaxRules];
     290           0 :         for(sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i)
     291             :         {
     292           0 :             const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i);
     293           0 :             if(pRules)
     294           0 :                 aStrArr[i] = &pRules->GetName();
     295             :             else
     296           0 :                 aStrArr[i] = 0;
     297             :         }
     298           0 :         pDlg->SetUserNames(aStrArr);
     299           0 :         if(RET_OK == pDlg->Execute())
     300             :         {
     301           0 :             const OUString aName(pDlg->GetName());
     302             :             pChapterNumRules->ApplyNumRules( SwNumRulesWithName(
     303           0 :                     *pNumRule, aName ), pDlg->GetCurEntryPos() );
     304           0 :             pMenu->SetItemText(pMenu->GetItemId(pDlg->GetCurEntryPos()), aName);
     305             :         }
     306           0 :         return 0;
     307             :     }
     308             : 
     309           0 :     if( nLevelNo-- )
     310             :     {
     311           0 :         const SwNumRulesWithName *pRules = pChapterNumRules->GetRules( nLevelNo );
     312           0 :         if( pRules )
     313             :         {
     314           0 :             pRules->MakeNumRule( rWrtSh, *pNumRule );
     315           0 :             pNumRule->SetRuleType( OUTLINE_RULE );
     316             :         }
     317             :         else
     318           0 :             *pNumRule = *rWrtSh.GetOutlineNumRule();
     319             :     }
     320             : 
     321           0 :     sal_uInt16  nPageId = GetCurPageId();
     322           0 :     SfxTabPage* pPage = GetTabPage( nPageId );
     323           0 :     pPage->Reset(GetOutputItemSet());
     324             : 
     325           0 :     return 0;
     326             : }
     327             : 
     328           0 : sal_uInt16  SwOutlineTabDialog::GetLevel(const OUString &rFormatName) const
     329             : {
     330           0 :     for(sal_uInt16 i = 0; i < MAXLEVEL; ++i)
     331             :     {
     332           0 :         if(aCollNames[i] == rFormatName)
     333           0 :             return i;
     334             :     }
     335           0 :     return MAXLEVEL;
     336             : }
     337             : 
     338           0 : short SwOutlineTabDialog::Ok()
     339             : {
     340           0 :     SfxTabDialog::Ok();
     341             :     // set levels for all created templates; has to be done in order to
     342             :     // delete possibly cancelled assignments again.
     343             : 
     344             :     // #130443#
     345             :     // encapsulate changes into a action to avoid effects on the current cursor
     346             :     // position during the changes.
     347           0 :     rWrtSh.StartAction();
     348             : 
     349           0 :     const SwNumRule * pOutlineRule = rWrtSh.GetOutlineNumRule();
     350             : 
     351           0 :     sal_uInt16 i, nCount = rWrtSh.GetTextFormatCollCount();
     352           0 :     for( i = 0; i < nCount; ++i )
     353             :     {
     354           0 :         SwTextFormatColl &rTextColl = rWrtSh.GetTextFormatColl(i);
     355           0 :         if( !rTextColl.IsDefault() )
     356             :         {
     357             :             const SfxPoolItem & rItem =
     358           0 :                 rTextColl.GetFormatAttr(RES_PARATR_NUMRULE, false);
     359             : 
     360           0 :            if ((sal_uInt8)GetLevel(rTextColl.GetName()) == MAXLEVEL)
     361             :             {
     362           0 :                 if(rTextColl.IsAssignedToListLevelOfOutlineStyle())
     363             :                 {
     364           0 :                     rTextColl.DeleteAssignmentToListLevelOfOutlineStyle();
     365             :                 }
     366           0 :                 if (static_cast<const SwNumRuleItem &>(rItem).GetValue() ==
     367             :                     pOutlineRule->GetName())
     368             :                 {
     369           0 :                     rTextColl.ResetFormatAttr(RES_PARATR_NUMRULE);
     370             :                 }
     371             :             }
     372             :             else
     373             :             {
     374           0 :                 rTextColl.AssignToListLevelOfOutlineStyle(GetLevel(rTextColl.GetName()));
     375             : 
     376           0 :                 if (static_cast<const SwNumRuleItem &>(rItem).GetValue() !=
     377             :                     pOutlineRule->GetName())
     378             :                 {
     379           0 :                     SwNumRuleItem aItem(pOutlineRule->GetName());
     380           0 :                     rTextColl.SetFormatAttr(aItem);
     381             :                 }
     382             :             }
     383             :         }
     384             :     }
     385             : 
     386           0 :     for(i = 0; i < MAXLEVEL; ++i )
     387             :     {
     388           0 :         OUString sHeadline;
     389             :         ::SwStyleNameMapper::FillUIName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i),
     390           0 :                                          sHeadline );
     391           0 :         SwTextFormatColl* pColl = rWrtSh.FindTextFormatCollByName( sHeadline );
     392           0 :         if( !pColl )
     393             :         {
     394           0 :             if(aCollNames[i] != sHeadline)
     395             :             {
     396             :                 SwTextFormatColl* pTextColl = rWrtSh.GetTextCollFromPool(
     397           0 :                     static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i) );
     398           0 :                 pTextColl->DeleteAssignmentToListLevelOfOutlineStyle();
     399           0 :                 pTextColl->ResetFormatAttr(RES_PARATR_NUMRULE);
     400             : 
     401           0 :                 if( !aCollNames[i].isEmpty() )
     402             :                 {
     403             :                     pTextColl = rWrtSh.GetParaStyle(
     404           0 :                                 aCollNames[i], SwWrtShell::GETSTYLE_CREATESOME);
     405           0 :                     if(pTextColl)
     406             :                     {
     407           0 :                         pTextColl->AssignToListLevelOfOutlineStyle(i);
     408           0 :                         SwNumRuleItem aItem(pOutlineRule->GetName());
     409           0 :                         pTextColl->SetFormatAttr(aItem);
     410             :                     }
     411             :                 }
     412             :             }
     413             :         }
     414           0 :     }
     415             : 
     416           0 :     rWrtSh.SetOutlineNumRule( *pNumRule);
     417             : 
     418             :     // #i30443#
     419           0 :     rWrtSh.EndAction();
     420             : 
     421           0 :     return RET_OK;
     422             : }
     423             : 
     424           0 : SwOutlineSettingsTabPage::SwOutlineSettingsTabPage(vcl::Window* pParent,
     425             :     const SfxItemSet& rSet)
     426             :     : SfxTabPage(pParent, "OutlineNumberingPage",
     427             :         "modules/swriter/ui/outlinenumberingpage.ui", &rSet)
     428             :     , aNoFormatName(SW_RESSTR(SW_STR_NONE))
     429             :     , pSh(NULL)
     430             :     , pNumRule(NULL)
     431             :     , pCollNames(NULL)
     432           0 :     , nActLevel(1)
     433             : {
     434           0 :     get(m_pLevelLB, "level");
     435           0 :     get(m_pCollBox, "style");
     436           0 :     m_pCollBox->SetStyle(m_pCollBox->GetStyle()|WB_SORT);
     437           0 :     get(m_pNumberBox, "numbering");
     438           0 :     get(m_pCharFormatLB, "charstyle");
     439           0 :     get(m_pAllLevelFT, "sublevelsft");
     440           0 :     get(m_pAllLevelNF, "sublevelsnf");
     441           0 :     get(m_pPrefixED, "prefix");
     442           0 :     get(m_pSuffixED, "suffix");
     443           0 :     get(m_pStartEdit, "startat");
     444           0 :     get(m_pPreviewWIN, "preview");
     445             : 
     446           0 :     SetExchangeSupport();
     447             : 
     448           0 :     m_pCollBox->InsertEntry(aNoFormatName);
     449           0 :     m_pLevelLB->SetSelectHdl(LINK(this,    SwOutlineSettingsTabPage, LevelHdl));
     450           0 :     m_pAllLevelNF->SetModifyHdl(LINK(this, SwOutlineSettingsTabPage, ToggleComplete));
     451           0 :     m_pCollBox->SetSelectHdl(LINK(this,    SwOutlineSettingsTabPage, CollSelect));
     452           0 :     m_pCollBox->SetGetFocusHdl(LINK(this,  SwOutlineSettingsTabPage, CollSelectGetFocus));
     453           0 :     m_pNumberBox->SetSelectHdl(LINK(this,  SwOutlineSettingsTabPage, NumberSelect));
     454           0 :     m_pPrefixED->SetModifyHdl(LINK(this,   SwOutlineSettingsTabPage, DelimModify));
     455           0 :     m_pSuffixED->SetModifyHdl(LINK(this,   SwOutlineSettingsTabPage, DelimModify));
     456           0 :     m_pStartEdit->SetModifyHdl(LINK(this,  SwOutlineSettingsTabPage, StartModified));
     457           0 :     m_pCharFormatLB->SetSelectHdl(LINK(this,  SwOutlineSettingsTabPage, CharFormatHdl));
     458           0 : }
     459             : 
     460           0 : void    SwOutlineSettingsTabPage::Update()
     461             : {
     462             :         // if a template was already selected for this level, select it in the ListBox
     463           0 :     m_pCollBox->Enable(USHRT_MAX != nActLevel);
     464           0 :     if(USHRT_MAX == nActLevel)
     465             :     {
     466           0 :         bool bSamePrefix = true;
     467           0 :         bool bSameSuffix = true;
     468           0 :         bool bSameType = true;
     469           0 :         bool bSameComplete = true;
     470           0 :         bool bSameStart = true;
     471           0 :         bool bSameCharFormat = true;
     472             : 
     473             :         const SwNumFormat* aNumFormatArr[MAXLEVEL];
     474           0 :         const SwCharFormat* pFirstFormat = 0;
     475             : 
     476           0 :         for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
     477             :         {
     478             : 
     479           0 :             aNumFormatArr[ i ] = &pNumRule->Get(i);
     480           0 :             if(i == 0)
     481           0 :                 pFirstFormat = aNumFormatArr[i]->GetCharFormat();
     482             :             else
     483             :             {
     484           0 :                 bSameType   &= aNumFormatArr[i]->GetNumberingType() == aNumFormatArr[0]->GetNumberingType();
     485           0 :                 bSameStart  &= aNumFormatArr[i]->GetStart() == aNumFormatArr[0]->GetStart();
     486           0 :                 bSamePrefix &= aNumFormatArr[i]->GetPrefix() == aNumFormatArr[0]->GetPrefix();
     487           0 :                 bSameSuffix &= aNumFormatArr[i]->GetSuffix() == aNumFormatArr[0]->GetSuffix();
     488           0 :                 bSameComplete &= aNumFormatArr[i]->GetIncludeUpperLevels() == aNumFormatArr[0]->GetIncludeUpperLevels();
     489           0 :                 const SwCharFormat* pFormat = aNumFormatArr[i]->GetCharFormat();
     490           0 :                 bSameCharFormat &=     (!pFirstFormat && !pFormat)
     491           0 :                                     || (pFirstFormat && pFormat && pFormat->GetName() == pFirstFormat->GetName());
     492             :             }
     493             :         }
     494           0 :         CheckForStartValue_Impl(aNumFormatArr[0]->GetNumberingType());
     495           0 :         if(bSameType)
     496           0 :             m_pNumberBox->SelectNumberingType( aNumFormatArr[0]->GetNumberingType() );
     497             :         else
     498           0 :             m_pNumberBox->SetNoSelection();
     499           0 :         if(bSameStart)
     500           0 :             m_pStartEdit->SetValue(aNumFormatArr[0]->GetStart());
     501             :         else
     502           0 :             m_pStartEdit->SetText(OUString());
     503           0 :         if(bSamePrefix)
     504           0 :             m_pPrefixED->SetText(aNumFormatArr[0]->GetPrefix());
     505             :         else
     506           0 :             m_pPrefixED->SetText(OUString());
     507           0 :         if(bSameSuffix)
     508           0 :             m_pSuffixED->SetText(aNumFormatArr[0]->GetSuffix());
     509             :         else
     510           0 :             m_pSuffixED->SetText(OUString());
     511             : 
     512           0 :         if(bSameCharFormat)
     513             :         {
     514           0 :             if(pFirstFormat)
     515           0 :                 m_pCharFormatLB->SelectEntry(pFirstFormat->GetName());
     516             :             else
     517           0 :                 m_pCharFormatLB->SelectEntry( SwViewShell::GetShellRes()->aStrNone );
     518             :         }
     519             :         else
     520           0 :             m_pCharFormatLB->SetNoSelection();
     521             : 
     522           0 :         m_pAllLevelFT->Enable(true);
     523           0 :         m_pAllLevelNF->Enable(true);
     524           0 :         m_pAllLevelNF->SetMax(MAXLEVEL);
     525           0 :         if(bSameComplete)
     526             :         {
     527           0 :             m_pAllLevelNF->SetValue(aNumFormatArr[0]->GetIncludeUpperLevels());
     528             :         }
     529             :         else
     530             :         {
     531           0 :             m_pAllLevelNF->SetText(OUString());
     532             :         }
     533             :     }
     534             :     else
     535             :     {
     536           0 :         sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
     537           0 :         OUString aColl(pCollNames[nTmpLevel]);
     538           0 :         if(!aColl.isEmpty())
     539           0 :             m_pCollBox->SelectEntry(aColl);
     540             :         else
     541           0 :             m_pCollBox->SelectEntry(aNoFormatName);
     542           0 :         const SwNumFormat &rFormat = pNumRule->Get(nTmpLevel);
     543             : 
     544           0 :         m_pNumberBox->SelectNumberingType( rFormat.GetNumberingType() );
     545           0 :         m_pPrefixED->SetText(rFormat.GetPrefix());
     546           0 :         m_pSuffixED->SetText(rFormat.GetSuffix());
     547           0 :         const SwCharFormat* pFormat = rFormat.GetCharFormat();
     548           0 :         if(pFormat)
     549           0 :             m_pCharFormatLB->SelectEntry(pFormat->GetName());
     550             :         else
     551           0 :             m_pCharFormatLB->SelectEntry( SwViewShell::GetShellRes()->aStrNone );
     552             : 
     553           0 :         if(nTmpLevel)
     554             :         {
     555           0 :             m_pAllLevelFT->Enable(true);
     556           0 :             m_pAllLevelNF->Enable(true);
     557           0 :             m_pAllLevelNF->SetMax(nTmpLevel + 1);
     558           0 :             m_pAllLevelNF->SetValue(rFormat.GetIncludeUpperLevels());
     559             :         }
     560             :         else
     561             :         {
     562           0 :             m_pAllLevelNF->SetText(OUString());
     563           0 :             m_pAllLevelNF->Enable(false);
     564           0 :             m_pAllLevelFT->Enable(false);
     565             :         }
     566           0 :         CheckForStartValue_Impl(rFormat.GetNumberingType());
     567           0 :         m_pStartEdit->SetValue( rFormat.GetStart() );
     568             :     }
     569           0 :     SetModified();
     570           0 : }
     571             : 
     572           0 : IMPL_LINK( SwOutlineSettingsTabPage, LevelHdl, ListBox *, pBox )
     573             : {
     574           0 :     nActLevel = 0;
     575           0 :     if(pBox->IsEntryPosSelected( MAXLEVEL ))
     576             :     {
     577           0 :         nActLevel = 0xFFFF;
     578             :     }
     579             :     else
     580             :     {
     581           0 :         sal_uInt16 nMask = 1;
     582           0 :         for( sal_uInt16 i = 0; i < MAXLEVEL; i++ )
     583             :         {
     584           0 :             if(pBox->IsEntryPosSelected( i ))
     585           0 :                 nActLevel |= nMask;
     586           0 :             nMask <<= 1;
     587             :         }
     588             :     }
     589           0 :     Update();
     590           0 :     return 0;
     591             : }
     592             : 
     593           0 : IMPL_LINK( SwOutlineSettingsTabPage, ToggleComplete, NumericField *, pField )
     594             : {
     595           0 :     sal_uInt16 nMask = 1;
     596           0 :     for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
     597             :     {
     598           0 :         if(nActLevel & nMask)
     599             :         {
     600           0 :             SwNumFormat aNumFormat(pNumRule->Get(i));
     601           0 :             aNumFormat.SetIncludeUpperLevels( std::min( (sal_uInt8)pField->GetValue(),
     602           0 :                                                 (sal_uInt8)(i + 1)) );
     603           0 :             pNumRule->Set(i, aNumFormat);
     604             :         }
     605           0 :         nMask <<= 1;
     606             :     }
     607           0 :     SetModified();
     608           0 :     return 0;
     609             : }
     610             : 
     611           0 : IMPL_LINK( SwOutlineSettingsTabPage, CollSelect, ListBox *, pBox )
     612             : {
     613             :     sal_uInt8 i;
     614             : 
     615           0 :     const OUString aCollName(pBox->GetSelectEntry());
     616             :     //0xFFFF not allowed here (disable)
     617           0 :     sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
     618           0 :     OUString sOldName( pCollNames[nTmpLevel] );
     619             : 
     620           0 :     for( i = 0; i < MAXLEVEL; ++i)
     621           0 :         pCollNames[i] = aSaveCollNames[i];
     622             : 
     623           0 :     if(aCollName == aNoFormatName)
     624           0 :         pCollNames[nTmpLevel].clear();
     625             :     else
     626             :     {
     627           0 :         pCollNames[nTmpLevel] = aCollName;
     628             :                 // template already in use?
     629           0 :         for( i = 0; i < MAXLEVEL; ++i)
     630           0 :             if(i != nTmpLevel && pCollNames[i] == aCollName )
     631           0 :                 pCollNames[i].clear();
     632             :     }
     633             : 
     634             :     // search the oldname and put it into the current entries
     635           0 :     if( !sOldName.isEmpty() )
     636           0 :         for( i = 0; i < MAXLEVEL; ++i)
     637           0 :             if( aSaveCollNames[ i ] == sOldName && i != nTmpLevel &&
     638           0 :                 pCollNames[ i ].isEmpty() )
     639             :             {
     640             :                 sal_uInt8 n;
     641           0 :                 for( n = 0; n < MAXLEVEL; ++n )
     642           0 :                     if( pCollNames[ n ] == sOldName )
     643           0 :                         break;
     644             : 
     645           0 :                 if( MAXLEVEL == n )
     646             :                     // it was a outline leveld name and the current entries is zero.
     647           0 :                     pCollNames[ i ] = sOldName;
     648             :             }
     649             : 
     650           0 :     SetModified();
     651           0 :     return 0;
     652             : }
     653             : 
     654           0 : IMPL_LINK_NOARG(SwOutlineSettingsTabPage, CollSelectGetFocus)
     655             : {
     656           0 :     for( sal_uInt8 i = 0; i < MAXLEVEL; ++i)
     657           0 :         aSaveCollNames[i] =  pCollNames[i];
     658           0 :     return 0;
     659             : }
     660             : 
     661           0 : IMPL_LINK( SwOutlineSettingsTabPage, NumberSelect, SwNumberingTypeListBox *, pBox )
     662             : {
     663           0 :     sal_uInt16 nMask = 1;
     664           0 :     sal_Int16 nNumberType = pBox->GetSelectedNumberingType();
     665           0 :     for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
     666             :     {
     667           0 :         if(nActLevel & nMask)
     668             :         {
     669           0 :             SwNumFormat aNumFormat(pNumRule->Get(i));
     670           0 :             aNumFormat.SetNumberingType(nNumberType);
     671           0 :             pNumRule->Set(i, aNumFormat);
     672           0 :             CheckForStartValue_Impl(nNumberType);
     673             :         }
     674           0 :         nMask <<= 1;
     675             :     }
     676           0 :     SetModified();
     677           0 :     return 0;
     678             : }
     679             : 
     680           0 : IMPL_LINK_NOARG(SwOutlineSettingsTabPage, DelimModify)
     681             : {
     682           0 :     sal_uInt16 nMask = 1;
     683           0 :     for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
     684             :     {
     685           0 :         if(nActLevel & nMask)
     686             :         {
     687           0 :             SwNumFormat aNumFormat(pNumRule->Get(i));
     688           0 :             aNumFormat.SetPrefix( m_pPrefixED->GetText() );
     689           0 :             aNumFormat.SetSuffix( m_pSuffixED->GetText() );
     690           0 :             pNumRule->Set(i, aNumFormat);
     691             :         }
     692           0 :         nMask <<= 1;
     693             :     }
     694           0 :     SetModified();
     695           0 :     return 0;
     696             : }
     697             : 
     698           0 : IMPL_LINK( SwOutlineSettingsTabPage, StartModified, NumericField *, pField )
     699             : {
     700           0 :     sal_uInt16 nMask = 1;
     701           0 :     for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
     702             :     {
     703           0 :         if(nActLevel & nMask)
     704             :         {
     705           0 :             SwNumFormat aNumFormat(pNumRule->Get(i));
     706           0 :             aNumFormat.SetStart( (sal_uInt16)pField->GetValue() );
     707           0 :             pNumRule->Set(i, aNumFormat);
     708             :         }
     709           0 :         nMask <<= 1;
     710             :     }
     711           0 :     SetModified();
     712           0 :     return 0;
     713             : }
     714             : 
     715           0 : IMPL_LINK_NOARG(SwOutlineSettingsTabPage, CharFormatHdl)
     716             : {
     717           0 :     OUString sEntry = m_pCharFormatLB->GetSelectEntry();
     718           0 :     sal_uInt16 nMask = 1;
     719           0 :     bool bFormatNone = sEntry == SwViewShell::GetShellRes()->aStrNone;
     720           0 :     SwCharFormat* pFormat = 0;
     721           0 :     if(!bFormatNone)
     722             :     {
     723           0 :         sal_uInt16 nChCount = pSh->GetCharFormatCount();
     724           0 :         for(sal_uInt16 i = 0; i < nChCount; i++)
     725             :         {
     726           0 :             SwCharFormat& rChFormat = pSh->GetCharFormat(i);
     727           0 :             if(rChFormat.GetName() == sEntry)
     728             :             {
     729           0 :                 pFormat = &rChFormat;
     730           0 :                 break;
     731             :             }
     732             :         }
     733           0 :         if(!pFormat)
     734             :         {
     735           0 :             SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool();
     736             :             SfxStyleSheetBase* pBase;
     737           0 :             pBase = pPool->Find(sEntry, SFX_STYLE_FAMILY_CHAR);
     738           0 :             if(!pBase)
     739           0 :                 pBase = &pPool->Make(sEntry, SFX_STYLE_FAMILY_PAGE);
     740           0 :             pFormat = static_cast<SwDocStyleSheet*>(pBase)->GetCharFormat();
     741             : 
     742             :         }
     743             :     }
     744             : 
     745           0 :     for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
     746             :     {
     747           0 :         if(nActLevel & nMask)
     748             :         {
     749           0 :             SwNumFormat aNumFormat(pNumRule->Get(i));
     750           0 :             if(bFormatNone)
     751           0 :                 aNumFormat.SetCharFormat(0);
     752             :             else
     753           0 :                 aNumFormat.SetCharFormat(pFormat);
     754           0 :             pNumRule->Set(i, aNumFormat);
     755             :         }
     756           0 :         nMask <<= 1;
     757             :     }
     758           0 :     return RET_OK;
     759             : }
     760             : 
     761           0 : SwOutlineSettingsTabPage::~SwOutlineSettingsTabPage()
     762             : {
     763           0 :     disposeOnce();
     764           0 : }
     765             : 
     766           0 : void SwOutlineSettingsTabPage::dispose()
     767             : {
     768           0 :     m_pLevelLB.clear();
     769           0 :     m_pCollBox.clear();
     770           0 :     m_pNumberBox.clear();
     771           0 :     m_pCharFormatLB.clear();
     772           0 :     m_pAllLevelFT.clear();
     773           0 :     m_pAllLevelNF.clear();
     774           0 :     m_pPrefixED.clear();
     775           0 :     m_pSuffixED.clear();
     776           0 :     m_pStartEdit.clear();
     777           0 :     m_pPreviewWIN.clear();
     778           0 :     SfxTabPage::dispose();
     779           0 : }
     780             : 
     781             : 
     782           0 : void SwOutlineSettingsTabPage::SetWrtShell(SwWrtShell* pShell)
     783             : {
     784           0 :     pSh = pShell;
     785             :     // query this document's NumRules
     786           0 :     pNumRule = static_cast<SwOutlineTabDialog*>(GetTabDialog())->GetNumRule();
     787           0 :     pCollNames = static_cast<SwOutlineTabDialog*>(GetTabDialog())->GetCollNames();
     788             : 
     789           0 :     m_pPreviewWIN->SetNumRule(pNumRule);
     790           0 :     m_pPreviewWIN->SetOutlineNames(pCollNames);
     791             :     // set start value - nActLevel must be 1 here
     792           0 :     sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
     793           0 :     const SwNumFormat& rNumFormat = pNumRule->Get( nTmpLevel );
     794           0 :     m_pStartEdit->SetValue( rNumFormat.GetStart() );
     795             : 
     796             :     // create pool formats for headlines
     797             :     sal_uInt16 i;
     798           0 :     for( i = 0; i < MAXLEVEL; ++i )
     799             :     {
     800             :         m_pCollBox->InsertEntry( SwStyleNameMapper::GetUIName(
     801           0 :                                     static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i), OUString()));
     802           0 :         m_pLevelLB->InsertEntry( OUString::number(i + 1) );
     803             :     }
     804           0 :     OUString sStr("1 - ");
     805           0 :     sStr += OUString::number(MAXLEVEL);
     806           0 :     m_pLevelLB->InsertEntry( sStr );
     807             : 
     808             :     // query the texttemplates' outlining levels
     809           0 :     const sal_uInt16 nCount = pSh->GetTextFormatCollCount();
     810           0 :     for( i = 0; i < nCount; ++i )
     811             :     {
     812           0 :         SwTextFormatColl &rTextColl = pSh->GetTextFormatColl(i);
     813           0 :         if(!rTextColl.IsDefault())
     814             :         {
     815           0 :             sStr = rTextColl.GetName();
     816           0 :             if(LISTBOX_ENTRY_NOTFOUND == m_pCollBox->GetEntryPos( sStr ))
     817           0 :                 m_pCollBox->InsertEntry( sStr );
     818             :         }
     819             :     }
     820             : 
     821           0 :     m_pNumberBox->SelectNumberingType(rNumFormat.GetNumberingType());
     822           0 :     sal_uInt16 nOutlinePos = pSh->GetOutlinePos(MAXLEVEL);
     823           0 :     sal_uInt16 nTmp = 0;
     824           0 :     if(nOutlinePos != USHRT_MAX)
     825             :     {
     826           0 :         nTmp = static_cast<sal_uInt16>(pSh->getIDocumentOutlineNodesAccess()->getOutlineLevel(nOutlinePos));
     827             :     }
     828           0 :     m_pLevelLB->SelectEntryPos(nTmp-1);
     829             : 
     830             :     // collect char styles
     831           0 :     m_pCharFormatLB->Clear();
     832           0 :     m_pCharFormatLB->InsertEntry( SwViewShell::GetShellRes()->aStrNone );
     833             : 
     834             :     // char styles
     835           0 :     ::FillCharStyleListBox(*m_pCharFormatLB,
     836           0 :                         pSh->GetView().GetDocShell());
     837           0 :     Update();
     838           0 : }
     839             : 
     840           0 : void SwOutlineSettingsTabPage::ActivatePage(const SfxItemSet& )
     841             : {
     842           0 :     nActLevel = SwOutlineTabDialog::GetActNumLevel();
     843           0 :     if(nActLevel != USHRT_MAX)
     844           0 :         m_pLevelLB->SelectEntryPos(lcl_BitToLevel(nActLevel));
     845             :     else
     846           0 :         m_pLevelLB->SelectEntryPos(MAXLEVEL);
     847           0 :     LevelHdl(m_pLevelLB);
     848           0 : }
     849             : 
     850           0 : SfxTabPage::sfxpg SwOutlineSettingsTabPage::DeactivatePage(SfxItemSet*)
     851             : {
     852           0 :     SwOutlineTabDialog::SetActNumLevel(nActLevel);
     853           0 :     return LEAVE_PAGE;
     854             : }
     855             : 
     856           0 : bool SwOutlineSettingsTabPage::FillItemSet( SfxItemSet*  )
     857             : {
     858           0 :     return true;
     859             : }
     860             : 
     861           0 : void SwOutlineSettingsTabPage::Reset( const SfxItemSet* rSet )
     862             : {
     863           0 :     ActivatePage(*rSet);
     864           0 : }
     865             : 
     866           0 : VclPtr<SfxTabPage> SwOutlineSettingsTabPage::Create( vcl::Window* pParent,
     867             :                                                      const SfxItemSet* rAttrSet)
     868             : {
     869           0 :     return VclPtr<SwOutlineSettingsTabPage>::Create(pParent, *rAttrSet);
     870             : }
     871             : 
     872           0 : void SwOutlineSettingsTabPage::CheckForStartValue_Impl(sal_uInt16 nNumberingType)
     873             : {
     874           0 :     bool bIsNull = m_pStartEdit->GetValue() == 0;
     875           0 :     bool bNoZeroAllowed = nNumberingType < SVX_NUM_ARABIC ||
     876           0 :                         SVX_NUM_CHARS_UPPER_LETTER_N == nNumberingType ||
     877           0 :                         SVX_NUM_CHARS_LOWER_LETTER_N == nNumberingType;
     878           0 :     m_pStartEdit->SetMin(bNoZeroAllowed ? 1 : 0);
     879           0 :     if(bIsNull && bNoZeroAllowed)
     880           0 :         m_pStartEdit->GetModifyHdl().Call(m_pStartEdit);
     881           0 : }
     882             : 
     883           0 : static long lcl_DrawBullet(vcl::RenderContext* pVDev, const SwNumFormat& rFormat, long nXStart, long nYStart, const Size& rSize)
     884             : {
     885           0 :     vcl::Font aTmpFont(pVDev->GetFont());
     886             : 
     887           0 :     vcl::Font aFont(*rFormat.GetBulletFont());
     888           0 :     aFont.SetSize(rSize);
     889           0 :     aFont.SetTransparent(true);
     890           0 :     pVDev->SetFont(aFont);
     891           0 :     OUString aText(rFormat.GetBulletChar());
     892           0 :     pVDev->DrawText(Point(nXStart, nYStart), aText);
     893           0 :     const long nRet = pVDev->GetTextWidth(aText);
     894             : 
     895           0 :     pVDev->SetFont(aTmpFont);
     896           0 :     return nRet;
     897             : }
     898             : 
     899           0 : static long lcl_DrawGraphic(vcl::RenderContext* pVDev, const SwNumFormat &rFormat, long nXStart, long nYStart, long nDivision)
     900             : {
     901           0 :     const SvxBrushItem* pBrushItem = rFormat.GetBrush();
     902           0 :     long nRet = 0;
     903           0 :     if (pBrushItem)
     904             :     {
     905           0 :         const Graphic* pGraphic = pBrushItem->GetGraphic();
     906           0 :         if (pGraphic)
     907             :         {
     908           0 :             Size aGSize( rFormat.GetGraphicSize());
     909           0 :             aGSize.Width() /= nDivision;
     910           0 :             nRet = aGSize.Width();
     911           0 :             aGSize.Height() /= nDivision;
     912           0 :             pGraphic->Draw(pVDev, Point(nXStart, nYStart), pVDev->PixelToLogic(aGSize));
     913             :         }
     914             :     }
     915           0 :     return nRet;
     916             : }
     917             : 
     918           0 : VCL_BUILDER_FACTORY(NumberingPreview)
     919             : 
     920             : // paint numbering's preview
     921           0 : void NumberingPreview::Paint(vcl::RenderContext& rRenderContext, const Rectangle& /*rRect*/)
     922             : {
     923           0 :     const Size aSize(rRenderContext.PixelToLogic(rRenderContext.GetOutputSizePixel()));
     924             : 
     925           0 :     ScopedVclPtrInstance<VirtualDevice> pVDev(rRenderContext);
     926           0 :     pVDev->SetMapMode(rRenderContext.GetMapMode());
     927           0 :     pVDev->SetOutputSize(aSize);
     928             : 
     929             :     // #101524# OJ
     930           0 :     pVDev->SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetWindowColor());
     931           0 :     pVDev->SetLineColor(rRenderContext.GetSettings().GetStyleSettings().GetButtonTextColor());
     932           0 :     pVDev->DrawRect(Rectangle(Point(0,0), aSize));
     933             : 
     934           0 :     if (pActNum)
     935             :     {
     936           0 :         long nWidthRelation = 30; // chapter dialog
     937           0 :         if(nPageWidth)
     938             :         {
     939           0 :             nWidthRelation = nPageWidth / aSize.Width();
     940           0 :             if(bPosition)
     941           0 :                 nWidthRelation = nWidthRelation * 2 / 3;
     942             :             else
     943           0 :                 nWidthRelation = nWidthRelation / 4;
     944             :         }
     945             : 
     946             :         // height per level
     947           0 :         const long nXStep = aSize.Width() / (3 * MAXLEVEL * ((MAXLEVEL < 10) ? 2 : 1));
     948           0 :         const long nYStep = (aSize.Height() - 6)/ MAXLEVEL;
     949           0 :         long nYStart = 4;
     950           0 :         aStdFont = OutputDevice::GetDefaultFont(DefaultFontType::UI_SANS, GetAppLanguage(),
     951           0 :                                                 GetDefaultFontFlags::OnlyOne, &rRenderContext);
     952             :         // #101524# OJ
     953           0 :         aStdFont.SetColor(SwViewOption::GetFontColor());
     954             : 
     955           0 :         const long nFontHeight = nYStep * ( bPosition ? 15 : 6 ) / 10;
     956           0 :         aStdFont.SetSize(Size( 0, nFontHeight ));
     957             : 
     958           0 :         long nPreNum = pActNum->Get(0).GetStart();
     959             : 
     960           0 :         if (bPosition)
     961             :         {
     962           0 :             const long nLineHeight = nFontHeight * 8 / 7;
     963           0 :             sal_uInt8 nStart = 0;
     964           0 :             while (!(nActLevel & (1 << nStart)))
     965             :             {
     966           0 :                 nStart++;
     967             :             }
     968           0 :             if(nStart) // so that possible predecessors and successors are showed
     969           0 :                 nStart--;
     970             : 
     971           0 :             SwNumberTree::tNumberVector aNumVector;
     972           0 :             sal_uInt8 nEnd = std::min(sal_uInt8(nStart + 3), MAXLEVEL);
     973           0 :             for (sal_uInt8 nLevel = nStart; nLevel < nEnd; ++nLevel)
     974             :             {
     975           0 :                 const SwNumFormat &rFormat = pActNum->Get(nLevel);
     976           0 :                 aNumVector.push_back(rFormat.GetStart());
     977             : 
     978           0 :                 long nXStart( 0 );
     979           0 :                 long nTextOffset( 0 );
     980           0 :                 long nNumberXPos( 0 );
     981           0 :                 if (rFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION)
     982             :                 {
     983           0 :                     nXStart = rFormat.GetAbsLSpace() / nWidthRelation;
     984           0 :                     nTextOffset = rFormat.GetCharTextDistance() / nWidthRelation;
     985           0 :                     nNumberXPos = nXStart;
     986           0 :                     const long nFirstLineOffset = (-rFormat.GetFirstLineOffset()) / nWidthRelation;
     987             : 
     988           0 :                     if(nFirstLineOffset <= nNumberXPos)
     989           0 :                         nNumberXPos -= nFirstLineOffset;
     990             :                     else
     991           0 :                         nNumberXPos = 0;
     992             :                 }
     993           0 :                 else if (rFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT)
     994             :                 {
     995           0 :                     const long nTmpNumberXPos((rFormat.GetIndentAt() + rFormat.GetFirstLineIndent()) / nWidthRelation);
     996           0 :                     nNumberXPos = (nTmpNumberXPos < 0) ? 0 : nTmpNumberXPos;
     997             :                 }
     998             : 
     999           0 :                 long nBulletWidth = 0;
    1000           0 :                 if (SVX_NUM_BITMAP == rFormat.GetNumberingType())
    1001             :                 {
    1002           0 :                     nBulletWidth = lcl_DrawGraphic(pVDev.get(), rFormat, nNumberXPos,
    1003           0 :                                                    nYStart, nWidthRelation);
    1004             :                 }
    1005           0 :                 else if (SVX_NUM_CHAR_SPECIAL == rFormat.GetNumberingType())
    1006             :                 {
    1007           0 :                     nBulletWidth = lcl_DrawBullet(pVDev.get(), rFormat, nNumberXPos,
    1008           0 :                                                   nYStart, aStdFont.GetSize());
    1009             :                 }
    1010             :                 else
    1011             :                 {
    1012           0 :                     pVDev->SetFont(aStdFont);
    1013           0 :                     if(pActNum->IsContinusNum())
    1014           0 :                         aNumVector[nLevel] = nPreNum;
    1015             :                     // #128041#
    1016           0 :                     OUString aText(pActNum->MakeNumString( aNumVector ));
    1017           0 :                     pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
    1018           0 :                     nBulletWidth = pVDev->GetTextWidth(aText);
    1019           0 :                     nPreNum++;
    1020             :                 }
    1021           0 :                 if ( rFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT &&
    1022           0 :                      rFormat.GetLabelFollowedBy() == SvxNumberFormat::SPACE )
    1023             :                 {
    1024           0 :                     pVDev->SetFont(aStdFont);
    1025           0 :                     OUString aText(' ');
    1026           0 :                     pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
    1027           0 :                     nBulletWidth += pVDev->GetTextWidth(aText);
    1028             :                 }
    1029             : 
    1030           0 :                 long nTextXPos(0);
    1031           0 :                 if (rFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION)
    1032             :                 {
    1033           0 :                     nTextXPos = nXStart;
    1034           0 :                     if (nTextOffset < 0)
    1035           0 :                          nTextXPos = nTextXPos + nTextOffset;
    1036           0 :                     if (nNumberXPos + nBulletWidth + nTextOffset > nTextXPos)
    1037           0 :                         nTextXPos = nNumberXPos + nBulletWidth + nTextOffset;
    1038             :                 }
    1039           0 :                 else if (rFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT)
    1040             :                 {
    1041           0 :                     switch (rFormat.GetLabelFollowedBy())
    1042             :                     {
    1043             :                         case SvxNumberFormat::LISTTAB:
    1044             :                         {
    1045           0 :                             nTextXPos = rFormat.GetListtabPos() / nWidthRelation;
    1046           0 :                             if (nTextXPos < nNumberXPos + nBulletWidth)
    1047             :                             {
    1048           0 :                                 nTextXPos = nNumberXPos + nBulletWidth;
    1049             :                             }
    1050             :                         }
    1051           0 :                         break;
    1052             :                         case SvxNumberFormat::SPACE:
    1053             :                         case SvxNumberFormat::NOTHING:
    1054             :                         {
    1055           0 :                             nTextXPos = nNumberXPos + nBulletWidth;
    1056             :                         }
    1057           0 :                         break;
    1058             :                     }
    1059             : 
    1060           0 :                     nXStart = rFormat.GetIndentAt() / nWidthRelation;
    1061             :                 }
    1062             : 
    1063           0 :                 Rectangle aRect1(Point(nTextXPos, nYStart + nFontHeight / 2), Size(aSize.Width() / 2, 2));
    1064           0 :                 pVDev->SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetWindowColor()); // Color( COL_BLACK ) );
    1065           0 :                 pVDev->DrawRect(aRect1);
    1066             : 
    1067           0 :                 Rectangle aRect2(Point(nXStart, nYStart + nLineHeight + nFontHeight / 2), Size(aSize.Width() / 2, 2));
    1068           0 :                 pVDev->DrawRect(aRect2);
    1069           0 :                 nYStart += 2 * nLineHeight;
    1070           0 :             }
    1071             :         }
    1072             :         else
    1073             :         {
    1074           0 :             SwNumberTree::tNumberVector aNumVector;
    1075           0 :             const long nLineHeight = nFontHeight * 3 / 2;
    1076           0 :             for (sal_uInt8 nLevel = 0; nLevel < MAXLEVEL; ++nLevel, nYStart = nYStart + nYStep)
    1077             :             {
    1078           0 :                 const SwNumFormat &rFormat = pActNum->Get(nLevel);
    1079           0 :                 aNumVector.push_back(rFormat.GetStart());
    1080           0 :                 long nXStart(0);
    1081           0 :                 if (rFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION)
    1082             :                 {
    1083           0 :                     nXStart = rFormat.GetAbsLSpace() / nWidthRelation;
    1084             :                 }
    1085           0 :                 else if (rFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT)
    1086             :                 {
    1087           0 :                     const long nTmpXStart((rFormat.GetIndentAt() + rFormat.GetFirstLineIndent() ) / nWidthRelation);
    1088           0 :                     nXStart = (nTmpXStart < 0) ? 0 : nTmpXStart;
    1089             :                 }
    1090           0 :                 nXStart /= 2;
    1091           0 :                 nXStart += 2;
    1092             :                 long nTextOffset;
    1093           0 :                 if (SVX_NUM_BITMAP == rFormat.GetNumberingType())
    1094             :                 {
    1095           0 :                     lcl_DrawGraphic(pVDev.get(), rFormat, nXStart, nYStart, nWidthRelation);
    1096           0 :                     nTextOffset = nLineHeight + nXStep;
    1097             :                 }
    1098           0 :                 else if (SVX_NUM_CHAR_SPECIAL == rFormat.GetNumberingType())
    1099             :                 {
    1100           0 :                     nTextOffset =  lcl_DrawBullet(pVDev.get(), rFormat, nXStart, nYStart, aStdFont.GetSize());
    1101           0 :                     nTextOffset += nXStep;
    1102             :                 }
    1103             :                 else
    1104             :                 {
    1105           0 :                     pVDev->SetFont(aStdFont);
    1106           0 :                     if (pActNum->IsContinusNum())
    1107           0 :                         aNumVector[nLevel] = nPreNum;
    1108             :                     // #128041#
    1109           0 :                     OUString aText(pActNum->MakeNumString( aNumVector ));
    1110           0 :                     pVDev->DrawText( Point(nXStart, nYStart), aText );
    1111           0 :                     nTextOffset = pVDev->GetTextWidth(aText) + nXStep;
    1112           0 :                     nPreNum++;
    1113             :                 }
    1114           0 :                 pVDev->SetFont(aStdFont);
    1115           0 :                 pVDev->DrawText(
    1116             :                     Point(nXStart + nTextOffset, nYStart),
    1117           0 :                     (pOutlineNames == 0
    1118             :                      ? utl::ConfigManager::getProductName()
    1119           0 :                      : pOutlineNames[nLevel]));
    1120           0 :             }
    1121             :         }
    1122             :     }
    1123           0 :     rRenderContext.DrawOutDev(Point(0,0), aSize, Point(0,0), aSize, *pVDev);
    1124           0 : }
    1125             : 
    1126           0 : NumberingPreview::~NumberingPreview()
    1127             : {
    1128           0 : }
    1129             : 
    1130             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11