LCOV - code coverage report
Current view: top level - sw/source/ui/frmdlg - column.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 757 0.0 %
Date: 2014-04-14 Functions: 0 50 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 "column.hxx"
      21             : 
      22             : #include "hintids.hxx"
      23             : #include <svx/dialogs.hrc>
      24             : #include <svx/dialmgr.hxx>
      25             : #include <sfx2/htmlmode.hxx>
      26             : #include <svx/xtable.hxx>
      27             : #include <svx/drawitem.hxx>
      28             : #include <editeng/borderline.hxx>
      29             : #include <editeng/boxitem.hxx>
      30             : #include <editeng/lrspitem.hxx>
      31             : #include <editeng/sizeitem.hxx>
      32             : #include "editeng/frmdiritem.hxx"
      33             : #include <svl/ctloptions.hxx>
      34             : #include <sfx2/dispatch.hxx>
      35             : #include <vcl/msgbox.hxx>
      36             : #include <vcl/settings.hxx>
      37             : 
      38             : #include <swmodule.hxx>
      39             : #include <sal/macros.h>
      40             : 
      41             : #include <helpid.h>
      42             : #include "globals.hrc"
      43             : #include "swtypes.hxx"
      44             : #include "wrtsh.hxx"
      45             : #include "view.hxx"
      46             : #include "docsh.hxx"
      47             : #include "uitool.hxx"
      48             : #include "cmdid.h"
      49             : #include "viewopt.hxx"
      50             : #include "format.hxx"
      51             : #include "frmmgr.hxx"
      52             : #include "frmdlg.hxx"
      53             : #include "colmgr.hxx"
      54             : #include "prcntfld.hxx"
      55             : #include "paratr.hxx"
      56             : #include "frmui.hrc"
      57             : #include "poolfmt.hrc"
      58             : #include <section.hxx>
      59             : #include <docary.hxx>
      60             : #include <pagedesc.hxx>
      61             : 
      62             : #include "access.hrc"
      63             : 
      64             : //to match associated data in ColumnPage.ui
      65             : #define LISTBOX_SELECTION       0
      66             : #define LISTBOX_SECTION         1
      67             : #define LISTBOX_SECTIONS        2
      68             : #define LISTBOX_PAGE            3
      69             : #define LISTBOX_FRAME           4
      70             : 
      71             : using namespace ::com::sun::star;
      72             : 
      73             : #define FRAME_FORMAT_WIDTH 1000
      74             : 
      75             : /*--------------------------------------------------------------------
      76             :     Description:  static data
      77             :  --------------------------------------------------------------------*/
      78             : 
      79             : static const sal_uInt16 nVisCols = 3;
      80             : 
      81           0 : inline bool IsMarkInSameSection( SwWrtShell& rWrtSh, const SwSection* pSect )
      82             : {
      83           0 :     rWrtSh.SwapPam();
      84           0 :     bool bRet = pSect == rWrtSh.GetCurrSection();
      85           0 :     rWrtSh.SwapPam();
      86           0 :     return bRet;
      87             : }
      88             : 
      89           0 : SwColumnDlg::SwColumnDlg(Window* pParent, SwWrtShell& rSh)
      90             :     : SfxModalDialog(pParent, "ColumnDialog", "modules/swriter/ui/columndialog.ui")
      91             :     , rWrtShell(rSh)
      92             :     , pPageSet(0)
      93             :     , pSectionSet(0)
      94             :     , pSelectionSet(0)
      95             :     , pFrameSet(0)
      96             :     , nOldSelection(0)
      97             :     , nSelectionWidth(0)
      98             :     , bPageChanged(false)
      99             :     , bSectionChanged(false)
     100             :     , bSelSectionChanged(false)
     101           0 :     , bFrameChanged(false)
     102             : {
     103           0 :     SwRect aRect;
     104           0 :     rWrtShell.CalcBoundRect(aRect, FLY_AS_CHAR);
     105             : 
     106           0 :     nSelectionWidth = aRect.Width();
     107             : 
     108           0 :     SfxItemSet* pColPgSet = 0;
     109             :     static sal_uInt16 const aSectIds[] = { RES_COL, RES_COL,
     110             :                                                 RES_FRM_SIZE, RES_FRM_SIZE,
     111             :                                                 RES_COLUMNBALANCE, RES_FRAMEDIR,
     112             :                                                 0 };
     113             : 
     114           0 :     const SwSection* pCurrSection = rWrtShell.GetCurrSection();
     115           0 :     const sal_uInt16 nFullSectCnt = rWrtShell.GetFullSelectedSectionCount();
     116           0 :     if( pCurrSection && ( !rWrtShell.HasSelection() || 0 != nFullSectCnt ))
     117             :     {
     118           0 :         nSelectionWidth = rSh.GetSectionWidth(*pCurrSection->GetFmt());
     119           0 :         if ( !nSelectionWidth )
     120           0 :             nSelectionWidth = USHRT_MAX;
     121           0 :         pSectionSet = new SfxItemSet( rWrtShell.GetAttrPool(), aSectIds );
     122           0 :         pSectionSet->Put( pCurrSection->GetFmt()->GetAttrSet() );
     123           0 :         pColPgSet = pSectionSet;
     124             :     }
     125             : 
     126           0 :     if( rWrtShell.HasSelection() && rWrtShell.IsInsRegionAvailable() &&
     127           0 :         ( !pCurrSection || ( 1 != nFullSectCnt &&
     128           0 :             IsMarkInSameSection( rWrtShell, pCurrSection ) )))
     129             :     {
     130           0 :         pSelectionSet = new SfxItemSet( rWrtShell.GetAttrPool(), aSectIds );
     131           0 :         pColPgSet = pSelectionSet;
     132             :     }
     133             : 
     134           0 :     if( rWrtShell.GetFlyFrmFmt() )
     135             :     {
     136           0 :         const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt() ;
     137           0 :         pFrameSet = new SfxItemSet(rWrtShell.GetAttrPool(), aSectIds );
     138           0 :         pFrameSet->Put(pFmt->GetFrmSize());
     139           0 :         pFrameSet->Put(pFmt->GetCol());
     140           0 :         pColPgSet = pFrameSet;
     141             :     }
     142             : 
     143           0 :     const SwPageDesc* pPageDesc = rWrtShell.GetSelectedPageDescs();
     144           0 :     if( pPageDesc )
     145             :     {
     146           0 :         pPageSet = new SfxItemSet( rWrtShell.GetAttrPool(),
     147             :                                     RES_COL, RES_COL,
     148             :                                     RES_FRM_SIZE, RES_FRM_SIZE,
     149             :                                     RES_LR_SPACE, RES_LR_SPACE,
     150           0 :                                     0 );
     151             : 
     152           0 :         const SwFrmFmt &rFmt = pPageDesc->GetMaster();
     153           0 :         nPageWidth = rFmt.GetFrmSize().GetSize().Width();
     154             : 
     155           0 :         const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rFmt.GetLRSpace();
     156           0 :         const SvxBoxItem& rBox = (const SvxBoxItem&) rFmt.GetBox();
     157           0 :         nPageWidth -= rLRSpace.GetLeft() + rLRSpace.GetRight() + rBox.GetDistance();
     158             : 
     159           0 :         pPageSet->Put(rFmt.GetCol());
     160           0 :         pPageSet->Put(rFmt.GetLRSpace());
     161           0 :         pColPgSet = pPageSet;
     162             :     }
     163             : 
     164             :     assert(pColPgSet);
     165             : 
     166             :     // create TabPage
     167           0 :     pTabPage = (SwColumnPage*) SwColumnPage::Create(get_content_area(), *pColPgSet);
     168           0 :     pTabPage->get<Window>("applytoft")->Show();
     169           0 :     pTabPage->get(m_pApplyToLB, "applytolb");
     170           0 :     m_pApplyToLB->Show();
     171             : 
     172           0 :     if (pCurrSection && (!rWrtShell.HasSelection() || 0 != nFullSectCnt))
     173             :     {
     174             :         m_pApplyToLB->RemoveEntry( m_pApplyToLB->GetEntryPos(
     175             :                                         (void*)(sal_IntPtr)( 1 >= nFullSectCnt
     176             :                                                     ? LISTBOX_SECTIONS
     177           0 :                                                     : LISTBOX_SECTION )));
     178             :     }
     179             :     else
     180             :     {
     181           0 :         m_pApplyToLB->RemoveEntry(m_pApplyToLB->GetEntryPos( (void*)(sal_IntPtr)LISTBOX_SECTION ));
     182           0 :         m_pApplyToLB->RemoveEntry(m_pApplyToLB->GetEntryPos( (void*)(sal_IntPtr)LISTBOX_SECTIONS ));
     183             :     }
     184             : 
     185           0 :     if (!( rWrtShell.HasSelection() && rWrtShell.IsInsRegionAvailable() &&
     186           0 :         ( !pCurrSection || ( 1 != nFullSectCnt &&
     187           0 :             IsMarkInSameSection( rWrtShell, pCurrSection ) ))))
     188           0 :         m_pApplyToLB->RemoveEntry(m_pApplyToLB->GetEntryPos( (void*)(sal_IntPtr)LISTBOX_SELECTION ));
     189             : 
     190           0 :     if (!rWrtShell.GetFlyFrmFmt())
     191           0 :         m_pApplyToLB->RemoveEntry(m_pApplyToLB->GetEntryPos( (void*) LISTBOX_FRAME ));
     192             : 
     193           0 :     const sal_Int32 nPagePos = m_pApplyToLB->GetEntryPos( (void*) LISTBOX_PAGE );
     194           0 :     if (pPageSet && pPageDesc)
     195             :     {
     196           0 :         const OUString sPageStr = m_pApplyToLB->GetEntry(nPagePos) + pPageDesc->GetName();
     197           0 :         m_pApplyToLB->RemoveEntry(nPagePos);
     198           0 :         m_pApplyToLB->InsertEntry( sPageStr, nPagePos );
     199           0 :         m_pApplyToLB->SetEntryData( nPagePos, (void*) LISTBOX_PAGE);
     200             :     }
     201             :     else
     202           0 :         m_pApplyToLB->RemoveEntry( nPagePos );
     203             : 
     204           0 :     m_pApplyToLB->SelectEntryPos(0);
     205           0 :     ObjectHdl(0);
     206             : 
     207           0 :     m_pApplyToLB->SetSelectHdl(LINK(this, SwColumnDlg, ObjectHdl));
     208           0 :     OKButton *pOK = get<OKButton>("ok");
     209           0 :     pOK->SetClickHdl(LINK(this, SwColumnDlg, OkHdl));
     210             :     //#i80458# if no columns can be set then disable OK
     211           0 :     if( !m_pApplyToLB->GetEntryCount() )
     212           0 :         pOK->Enable( false );
     213             :     //#i97810# set focus to the TabPage
     214           0 :     pTabPage->ActivateColumnControl();
     215           0 :     pTabPage->Show();
     216           0 : }
     217             : 
     218           0 : SwColumnDlg::~SwColumnDlg()
     219             : {
     220           0 :     delete pTabPage;
     221           0 :     delete pPageSet;
     222           0 :     delete pSectionSet;
     223           0 :     delete pSelectionSet;
     224           0 : }
     225             : 
     226           0 : IMPL_LINK(SwColumnDlg, ObjectHdl, ListBox*, pBox)
     227             : {
     228           0 :     SfxItemSet* pSet = 0;
     229           0 :     switch(nOldSelection)
     230             :     {
     231             :         case LISTBOX_SELECTION  :
     232           0 :             pSet = pSelectionSet;
     233           0 :         break;
     234             :         case LISTBOX_SECTION    :
     235           0 :             pSet = pSectionSet;
     236           0 :             bSectionChanged = true;
     237           0 :         break;
     238             :         case LISTBOX_SECTIONS   :
     239           0 :             pSet = pSectionSet;
     240           0 :             bSelSectionChanged = true;
     241           0 :         break;
     242             :         case LISTBOX_PAGE       :
     243           0 :             pSet = pPageSet;
     244           0 :             bPageChanged = true;
     245           0 :         break;
     246             :         case LISTBOX_FRAME:
     247           0 :             pSet = pFrameSet;
     248           0 :             bFrameChanged = true;
     249           0 :         break;
     250             :     }
     251           0 :     if(pBox)
     252             :     {
     253           0 :         pTabPage->FillItemSet(*pSet);
     254             :     }
     255           0 :     nOldSelection = (sal_IntPtr)m_pApplyToLB->GetEntryData(m_pApplyToLB->GetSelectEntryPos());
     256           0 :     long nWidth = nSelectionWidth;
     257           0 :     switch(nOldSelection)
     258             :     {
     259             :         case LISTBOX_SELECTION  :
     260           0 :             pSet = pSelectionSet;
     261           0 :             if( pSelectionSet )
     262           0 :                 pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
     263           0 :         break;
     264             :         case LISTBOX_SECTION    :
     265             :         case LISTBOX_SECTIONS   :
     266           0 :             pSet = pSectionSet;
     267           0 :             pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
     268           0 :         break;
     269             :         case LISTBOX_PAGE       :
     270           0 :             nWidth = nPageWidth;
     271           0 :             pSet = pPageSet;
     272           0 :             pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
     273           0 :         break;
     274             :         case LISTBOX_FRAME:
     275           0 :             pSet = pFrameSet;
     276           0 :         break;
     277             :     }
     278             : 
     279           0 :     sal_Bool bIsSection = pSet == pSectionSet || pSet == pSelectionSet;
     280           0 :     pTabPage->ShowBalance(bIsSection);
     281           0 :     pTabPage->SetInSection(bIsSection);
     282           0 :     pTabPage->SetFrmMode(sal_True);
     283           0 :     pTabPage->SetPageWidth(nWidth);
     284           0 :     if( pSet )
     285           0 :         pTabPage->Reset(*pSet);
     286           0 :     return 0;
     287             : }
     288             : 
     289           0 : IMPL_LINK_NOARG(SwColumnDlg, OkHdl)
     290             : {
     291             :     // evaluate current selection
     292           0 :     SfxItemSet* pSet = 0;
     293           0 :     switch(nOldSelection)
     294             :     {
     295             :         case LISTBOX_SELECTION  :
     296           0 :             pSet = pSelectionSet;
     297           0 :         break;
     298             :         case LISTBOX_SECTION    :
     299           0 :             pSet = pSectionSet;
     300           0 :             bSectionChanged = true;
     301           0 :         break;
     302             :         case LISTBOX_SECTIONS   :
     303           0 :             pSet = pSectionSet;
     304           0 :             bSelSectionChanged = true;
     305           0 :         break;
     306             :         case LISTBOX_PAGE       :
     307           0 :             pSet = pPageSet;
     308           0 :             bPageChanged = true;
     309           0 :         break;
     310             :         case LISTBOX_FRAME:
     311           0 :             pSet = pFrameSet;
     312           0 :             bFrameChanged = true;
     313           0 :         break;
     314             :     }
     315           0 :     pTabPage->FillItemSet(*pSet);
     316             : 
     317           0 :     if(pSelectionSet && SFX_ITEM_SET == pSelectionSet->GetItemState(RES_COL))
     318             :     {
     319             :         //insert region with columns
     320           0 :         const SwFmtCol& rColItem = (const SwFmtCol&)pSelectionSet->Get(RES_COL);
     321             :         //only if there actually are columns!
     322           0 :         if(rColItem.GetNumCols() > 1)
     323           0 :             rWrtShell.GetView().GetViewFrame()->GetDispatcher()->Execute(
     324           0 :                 FN_INSERT_REGION, SFX_CALLMODE_ASYNCHRON, *pSelectionSet );
     325             :     }
     326             : 
     327           0 :     if(pSectionSet && pSectionSet->Count() && bSectionChanged )
     328             :     {
     329           0 :         const SwSection* pCurrSection = rWrtShell.GetCurrSection();
     330           0 :         const SwSectionFmt* pFmt = pCurrSection->GetFmt();
     331           0 :         const sal_uInt16 nNewPos = rWrtShell.GetSectionFmtPos( *pFmt );
     332           0 :         SwSectionData aData(*pCurrSection);
     333           0 :         rWrtShell.UpdateSection( nNewPos, aData, pSectionSet );
     334             :     }
     335             : 
     336           0 :     if(pSectionSet && pSectionSet->Count() && bSelSectionChanged )
     337             :     {
     338           0 :         rWrtShell.SetSectionAttr( *pSectionSet );
     339             :     }
     340             : 
     341           0 :     if(pPageSet && SFX_ITEM_SET == pPageSet->GetItemState(RES_COL) && bPageChanged)
     342             :     {
     343             :         // deterine current PageDescriptor and fill the Set with it
     344           0 :         const sal_uInt16 nCurIdx = rWrtShell.GetCurPageDesc();
     345           0 :         SwPageDesc aPageDesc(rWrtShell.GetPageDesc(nCurIdx));
     346           0 :         SwFrmFmt &rFmt = aPageDesc.GetMaster();
     347           0 :         rFmt.SetFmtAttr(pPageSet->Get(RES_COL));
     348           0 :         rWrtShell.ChgPageDesc(nCurIdx, aPageDesc);
     349             :     }
     350           0 :     if(pFrameSet && SFX_ITEM_SET == pFrameSet->GetItemState(RES_COL) && bFrameChanged)
     351             :     {
     352           0 :         SfxItemSet aTmp(*pFrameSet->GetPool(), RES_COL, RES_COL);
     353           0 :         aTmp.Put(*pFrameSet);
     354           0 :         rWrtShell.StartAction();
     355           0 :         rWrtShell.Push();
     356           0 :         rWrtShell.SetFlyFrmAttr( aTmp );
     357             :         // undo the frame selction again
     358           0 :         if(rWrtShell.IsFrmSelected())
     359             :         {
     360           0 :             rWrtShell.UnSelectFrm();
     361           0 :             rWrtShell.LeaveSelFrmMode();
     362             :         }
     363           0 :         rWrtShell.Pop();
     364           0 :         rWrtShell.EndAction();
     365             :     }
     366           0 :     EndDialog(RET_OK);
     367           0 :     return 0;
     368             : }
     369             : 
     370             : #if OSL_DEBUG_LEVEL < 2
     371             : inline
     372             : #endif
     373           0 : sal_uInt16 GetMaxWidth( SwColMgr* pColMgr, sal_uInt16 nCols )
     374             : {
     375           0 :     sal_uInt16 nMax = pColMgr->GetActualSize();
     376           0 :     if( --nCols )
     377           0 :         nMax -= pColMgr->GetGutterWidth() * nCols;
     378           0 :     return nMax;
     379             : }
     380             : 
     381             : static sal_uInt16 aPageRg[] = {
     382             :     RES_COL, RES_COL,
     383             :     0
     384             : };
     385             : 
     386           0 : void SwColumnPage::ResetColWidth()
     387             : {
     388           0 :     if( nCols )
     389             :     {
     390           0 :         const sal_uInt16 nWidth = GetMaxWidth( pColMgr, nCols ) / nCols;
     391             : 
     392           0 :         for(sal_uInt16 i = 0; i < nCols; ++i)
     393           0 :             nColWidth[i] = (long) nWidth;
     394             :     }
     395             : 
     396           0 : }
     397             : 
     398             : /*--------------------------------------------------------------------
     399             :     Description:    Now as TabPage
     400             :  --------------------------------------------------------------------*/
     401           0 : SwColumnPage::SwColumnPage(Window *pParent, const SfxItemSet &rSet)
     402             :     : SfxTabPage(pParent, "ColumnPage", "modules/swriter/ui/columnpage.ui", rSet)
     403             :     , pColMgr(0)
     404             :     , nFirstVis(0)
     405             :     , nMinWidth(MINLAY)
     406             :     , pModifiedField(0)
     407             :     , bFormat(sal_False)
     408             :     , bFrm(sal_False)
     409             :     , bHtmlMode(sal_False)
     410           0 :     , bLockUpdate(false)
     411             : {
     412           0 :     get(m_pCLNrEdt, "colsnf");
     413           0 :     get(m_pBalanceColsCB, "balance");
     414           0 :     get(m_pBtnBack, "back");
     415           0 :     get(m_pLbl1, "1");
     416           0 :     get(m_pLbl2, "2");
     417           0 :     get(m_pLbl3, "3");
     418           0 :     get(m_pBtnNext, "next");
     419           0 :     get(m_pAutoWidthBox, "autowidth");
     420           0 :     get(m_pLineTypeLbl, "linestyleft");
     421           0 :     get(m_pLineWidthLbl, "linewidthft");
     422           0 :     get(m_pLineWidthEdit, "linewidthmf");
     423           0 :     get(m_pLineColorLbl, "linecolorft");
     424           0 :     get(m_pLineHeightLbl, "lineheightft");
     425           0 :     get(m_pLineHeightEdit, "lineheightmf");
     426           0 :     get(m_pLinePosLbl, "lineposft");
     427           0 :     get(m_pLinePosDLB, "lineposlb");
     428           0 :     get(m_pTextDirectionFT, "textdirectionft");
     429           0 :     get(m_pTextDirectionLB, "textdirectionlb");
     430           0 :     get(m_pLineColorDLB, "colorlb");
     431           0 :     get(m_pLineTypeDLB, "linestylelb");
     432             : 
     433           0 :     get(m_pDefaultVS, "valueset");
     434           0 :     get(m_pPgeExampleWN, "pageexample");
     435           0 :     get(m_pFrmExampleWN, "frameexample");
     436             : 
     437           0 :     connectPercentField(aEd1, "width1mf");
     438           0 :     connectPercentField(aEd2, "width2mf");
     439           0 :     connectPercentField(aEd3, "width3mf");
     440           0 :     connectPercentField(aDistEd1, "spacing1mf");
     441           0 :     connectPercentField(aDistEd2, "spacing2mf");
     442             : 
     443           0 :     SetExchangeSupport();
     444             : 
     445           0 :     VclFrame *pSpacing = get<VclFrame>("spacing");
     446           0 :     m_pBtnNext->SetAccessibleRelationMemberOf(pSpacing->get_label_widget());
     447             : 
     448           0 :     m_pDefaultVS->SetColCount( 5 );
     449             : 
     450           0 :     for (int i = 0; i < 5; ++i)
     451             :     //Set accessible name one by one
     452             :     {
     453           0 :         OUString aItemText;
     454           0 :         switch( i )
     455             :         {
     456             :             case 0:
     457           0 :                 aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM0 ) ;
     458           0 :                 break;
     459             :             case 1:
     460           0 :                 aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM1 ) ;
     461           0 :                 break;
     462             :             case 2:
     463           0 :                 aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM2 ) ;
     464           0 :                 break;
     465             :             case 3:
     466           0 :                 aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM3 );
     467           0 :                 break;
     468             :             default:
     469           0 :                 aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM4 );
     470           0 :                 break;
     471             :         }
     472           0 :         m_pDefaultVS->InsertItem( i + 1, aItemText, i );
     473           0 :     }
     474             : 
     475           0 :     m_pDefaultVS->SetSelectHdl(LINK(this, SwColumnPage, SetDefaultsHdl));
     476             : 
     477           0 :     Link aCLNrLk = LINK(this, SwColumnPage, ColModify);
     478           0 :     m_pCLNrEdt->SetModifyHdl(aCLNrLk);
     479           0 :     Link aLk = LINK(this, SwColumnPage, GapModify);
     480           0 :     aDistEd1.SetModifyHdl(aLk);
     481           0 :     aDistEd2.SetModifyHdl(aLk);
     482             : 
     483           0 :     aLk = LINK(this, SwColumnPage, EdModify);
     484             : 
     485           0 :     aEd1.SetModifyHdl(aLk);
     486             : 
     487           0 :     aEd2.SetModifyHdl(aLk);
     488             : 
     489           0 :     aEd3.SetModifyHdl(aLk);
     490             : 
     491           0 :     m_pBtnBack->SetClickHdl(LINK(this, SwColumnPage, Up));
     492           0 :     m_pBtnNext->SetClickHdl(LINK(this, SwColumnPage, Down));
     493           0 :     m_pAutoWidthBox->SetClickHdl(LINK(this, SwColumnPage, AutoWidthHdl));
     494             : 
     495           0 :     aLk = LINK( this, SwColumnPage, UpdateColMgr );
     496           0 :     m_pLineTypeDLB->SetSelectHdl( aLk );
     497           0 :     m_pLineWidthEdit->SetModifyHdl( aLk );
     498           0 :     m_pLineColorDLB->SetSelectHdl( aLk );
     499           0 :     m_pLineHeightEdit->SetModifyHdl( aLk );
     500           0 :     m_pLinePosDLB->SetSelectHdl( aLk );
     501             : 
     502             :     // Separator line
     503           0 :     m_pLineTypeDLB->SetUnit( FUNIT_POINT );
     504           0 :     m_pLineTypeDLB->SetSourceUnit( FUNIT_TWIP );
     505             : 
     506             :     // Fill the line styles listbox
     507           0 :     m_pLineTypeDLB->SetNone( SVX_RESSTR( RID_SVXSTR_NONE ) );
     508             :     m_pLineTypeDLB->InsertEntry(
     509             :         ::editeng::SvxBorderLine::getWidthImpl(table::BorderLineStyle::SOLID),
     510           0 :         table::BorderLineStyle::SOLID );
     511             :     m_pLineTypeDLB->InsertEntry(
     512             :         ::editeng::SvxBorderLine::getWidthImpl(table::BorderLineStyle::DOTTED),
     513           0 :         table::BorderLineStyle::DOTTED );
     514             :     m_pLineTypeDLB->InsertEntry(
     515             :         ::editeng::SvxBorderLine::getWidthImpl(table::BorderLineStyle::DASHED),
     516           0 :         table::BorderLineStyle::DASHED );
     517             : 
     518             :     long nLineWidth = static_cast<long>(MetricField::ConvertDoubleValue(
     519           0 :             m_pLineWidthEdit->GetValue( ),
     520           0 :             m_pLineWidthEdit->GetDecimalDigits( ),
     521           0 :             m_pLineWidthEdit->GetUnit(), MAP_TWIP ));
     522           0 :     m_pLineTypeDLB->SetWidth( nLineWidth );
     523             : 
     524             :     // Fill the color listbox
     525           0 :     SfxObjectShell* pDocSh = SfxObjectShell::Current();
     526           0 :     const SfxPoolItem*  pItem       = NULL;
     527           0 :     XColorListRef pColorList;
     528           0 :     if ( pDocSh )
     529             :     {
     530           0 :         pItem = pDocSh->GetItem( SID_COLOR_TABLE );
     531           0 :         if ( pItem != NULL )
     532           0 :             pColorList = ( (SvxColorListItem*)pItem )->GetColorList();
     533             :     }
     534             : 
     535           0 :     if ( pColorList.is() )
     536             :     {
     537           0 :         m_pLineColorDLB->SetUpdateMode( false );
     538             : 
     539           0 :         for (long i = 0; i < pColorList->Count(); ++i )
     540             :         {
     541           0 :             XColorEntry* pEntry = pColorList->GetColor(i);
     542           0 :             m_pLineColorDLB->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
     543             :         }
     544           0 :         m_pLineColorDLB->SetUpdateMode( true );
     545             :     }
     546           0 :     m_pLineColorDLB->SelectEntryPos( 0 );
     547           0 : }
     548             : 
     549           0 : SwColumnPage::~SwColumnPage()
     550             : {
     551           0 :     delete pColMgr;
     552           0 : }
     553             : 
     554           0 : void SwColumnPage::SetPageWidth(long nPageWidth)
     555             : {
     556           0 :     long nNewMaxWidth = static_cast< long >(aEd1.NormalizePercent(nPageWidth));
     557             : 
     558           0 :     aDistEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
     559           0 :     aDistEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
     560           0 :     aEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
     561           0 :     aEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
     562           0 :     aEd3.SetMax(nNewMaxWidth, FUNIT_TWIP);
     563           0 : }
     564             : 
     565           0 : void SwColumnPage::connectPercentField(PercentField &rWrap, const OString &rName)
     566             : {
     567           0 :     MetricField *pFld = get<MetricField>(rName);
     568             :     assert(pFld);
     569           0 :     rWrap.set(pFld);
     570           0 :     m_aPercentFieldsMap[pFld] = &rWrap;
     571           0 : }
     572             : 
     573           0 : void SwColumnPage::Reset(const SfxItemSet &rSet)
     574             : {
     575             :     const sal_uInt16 nHtmlMode =
     576           0 :         ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
     577           0 :     if(nHtmlMode & HTMLMODE_ON)
     578             :     {
     579           0 :         bHtmlMode = sal_True;
     580           0 :         m_pAutoWidthBox->Enable(false);
     581             :     }
     582           0 :     FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
     583           0 :     aEd1.SetMetric(aMetric);
     584           0 :     aEd2.SetMetric(aMetric);
     585           0 :     aEd3.SetMetric(aMetric);
     586           0 :     aDistEd1.SetMetric(aMetric);
     587           0 :     aDistEd2.SetMetric(aMetric);
     588             : 
     589           0 :     delete pColMgr;
     590           0 :     pColMgr = new SwColMgr(rSet);
     591           0 :     nCols   = pColMgr->GetCount() ;
     592           0 :     m_pCLNrEdt->SetMax(std::max((sal_uInt16)m_pCLNrEdt->GetMax(), nCols));
     593           0 :     m_pCLNrEdt->SetLast(std::max(nCols,(sal_uInt16)m_pCLNrEdt->GetMax()));
     594             : 
     595           0 :     if(bFrm)
     596             :     {
     597           0 :         if(bFormat)                     // there is no size here
     598           0 :             pColMgr->SetActualWidth(FRAME_FORMAT_WIDTH);
     599             :         else
     600             :         {
     601           0 :             const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
     602           0 :             const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
     603           0 :             pColMgr->SetActualWidth((sal_uInt16)rSize.GetSize().Width() - rBox.GetDistance());
     604             :         }
     605             :     }
     606           0 :     if(m_pBalanceColsCB->IsVisible())
     607             :     {
     608             :         const SfxPoolItem* pItem;
     609           0 :         if( SFX_ITEM_SET == rSet.GetItemState( RES_COLUMNBALANCE, false, &pItem ))
     610           0 :             m_pBalanceColsCB->Check(!((const SwFmtNoBalancedColumns*)pItem)->GetValue());
     611             :         else
     612           0 :             m_pBalanceColsCB->Check( true );
     613             :     }
     614             : 
     615             :     //text direction
     616           0 :     if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( RES_FRAMEDIR ) )
     617             :     {
     618           0 :         const SvxFrameDirectionItem& rItem = (const SvxFrameDirectionItem&)rSet.Get(RES_FRAMEDIR);
     619           0 :         sal_uIntPtr nVal  = rItem.GetValue();
     620           0 :         const sal_Int32 nPos = m_pTextDirectionLB->GetEntryPos( (void*) nVal );
     621           0 :         m_pTextDirectionLB->SelectEntryPos( nPos );
     622           0 :         m_pTextDirectionLB->SaveValue();
     623             :     }
     624             : 
     625           0 :     Init();
     626           0 :     ActivatePage( rSet );
     627           0 : }
     628             : 
     629             : /*--------------------------------------------------------------------
     630             :     Description:    create TabPage
     631             :  --------------------------------------------------------------------*/
     632           0 : SfxTabPage* SwColumnPage::Create(Window *pParent, const SfxItemSet &rSet)
     633             : {
     634           0 :     return new SwColumnPage(pParent, rSet);
     635             : }
     636             : 
     637             : /*--------------------------------------------------------------------
     638             :     Description:    stuff attributes into the Set when OK
     639             :  --------------------------------------------------------------------*/
     640           0 : bool SwColumnPage::FillItemSet(SfxItemSet &rSet)
     641             : {
     642           0 :     if(m_pCLNrEdt->HasChildPathFocus())
     643           0 :         m_pCLNrEdt->GetDownHdl().Call(m_pCLNrEdt);
     644             :     // set in ItemSet setzen
     645             :     // the current settings are already present
     646             : 
     647             :     const SfxPoolItem* pOldItem;
     648           0 :     const SwFmtCol& rCol = pColMgr->GetColumns();
     649           0 :     if(0 == (pOldItem = GetOldItem( rSet, RES_COL )) ||
     650           0 :                 rCol != *pOldItem )
     651           0 :         rSet.Put(rCol);
     652             : 
     653           0 :     if(m_pBalanceColsCB->IsVisible() )
     654             :     {
     655           0 :         rSet.Put(SwFmtNoBalancedColumns(!m_pBalanceColsCB->IsChecked() ));
     656             :     }
     657           0 :     if( m_pTextDirectionLB->IsVisible())
     658             :     {
     659           0 :         const sal_Int32 nPos = m_pTextDirectionLB->GetSelectEntryPos();
     660           0 :         if ( nPos != m_pTextDirectionLB->GetSavedValue() )
     661             :         {
     662           0 :             sal_uInt32 nDirection = (sal_uInt32)(sal_IntPtr)m_pTextDirectionLB->GetEntryData( nPos );
     663           0 :             rSet.Put( SvxFrameDirectionItem( (SvxFrameDirection)nDirection, RES_FRAMEDIR));
     664             :         }
     665             :     }
     666           0 :     return true;
     667             : }
     668             : 
     669             : /*--------------------------------------------------------------------
     670             :     Description:    update ColumnManager
     671             :  --------------------------------------------------------------------*/
     672           0 : IMPL_LINK( SwColumnPage, UpdateColMgr, void *, /*pField*/ )
     673             : {
     674           0 :     long nGutterWidth = pColMgr->GetGutterWidth();
     675           0 :     if(nCols > 1)
     676             :     {
     677             :             // Determine whether the most narrow column is too narrow
     678             :             // for the adjusted column gap
     679           0 :         long nMin = nColWidth[0];
     680             : 
     681           0 :         for( sal_uInt16 i = 1; i < nCols; ++i )
     682           0 :             nMin = std::min(nMin, nColWidth[i]);
     683             : 
     684           0 :         sal_Bool bAutoWidth = m_pAutoWidthBox->IsChecked();
     685           0 :         if(!bAutoWidth)
     686             :         {
     687           0 :             pColMgr->SetAutoWidth(sal_False);
     688             :                 // when the user didn't allocate the whole width,
     689             :                 // add the missing amount to the last column.
     690           0 :             long nSum = 0;
     691           0 :             for(sal_uInt16 i = 0; i < nCols; ++i)
     692           0 :                 nSum += nColWidth[i];
     693           0 :             nGutterWidth = 0;
     694           0 :             for(sal_uInt16 i = 0; i < nCols - 1; ++i)
     695           0 :                 nGutterWidth += nColDist[i];
     696           0 :             nSum += nGutterWidth;
     697             : 
     698           0 :             long nMaxW = pColMgr->GetActualSize();
     699             : 
     700           0 :             if( nSum < nMaxW  )
     701           0 :                 nColWidth[nCols - 1] += nMaxW - nSum;
     702             : 
     703           0 :             pColMgr->SetColWidth( 0, static_cast< sal_uInt16 >(nColWidth[0] + nColDist[0]/2) );
     704           0 :             for( sal_uInt16 i = 1; i < nCols-1; ++i )
     705             :             {
     706           0 :                 long nActDist = (nColDist[i] + nColDist[i - 1]) / 2;
     707           0 :                 pColMgr->SetColWidth( i, static_cast< sal_uInt16 >(nColWidth[i] + nActDist ));
     708             :             }
     709           0 :             pColMgr->SetColWidth( nCols-1, static_cast< sal_uInt16 >(nColWidth[nCols-1] + nColDist[nCols -2]/2) );
     710             : 
     711             :         }
     712             : 
     713           0 :         bool bEnable = isLineNotNone();
     714           0 :         m_pLineHeightEdit->Enable( bEnable );
     715           0 :         m_pLineHeightLbl->Enable( bEnable );
     716           0 :         m_pLineWidthLbl->Enable( bEnable );
     717           0 :         m_pLineWidthEdit->Enable( bEnable );
     718           0 :         m_pLineColorDLB->Enable( bEnable );
     719           0 :         m_pLineColorLbl->Enable( bEnable );
     720             : 
     721             :         long nLineWidth = static_cast<long>(MetricField::ConvertDoubleValue(
     722           0 :                 m_pLineWidthEdit->GetValue( ),
     723           0 :                 m_pLineWidthEdit->GetDecimalDigits( ),
     724           0 :                 m_pLineWidthEdit->GetUnit(), MAP_TWIP ));
     725           0 :         if( !bEnable )
     726           0 :             pColMgr->SetNoLine();
     727             :         else
     728             :         {
     729             :             pColMgr->SetLineWidthAndColor(
     730           0 :                     ::editeng::SvxBorderStyle( m_pLineTypeDLB->GetSelectEntryStyle( ) ),
     731             :                     nLineWidth,
     732           0 :                     m_pLineColorDLB->GetSelectEntryColor() );
     733             :             pColMgr->SetAdjust( SwColLineAdj(
     734           0 :                                     m_pLinePosDLB->GetSelectEntryPos() + 1) );
     735           0 :             pColMgr->SetLineHeightPercent((short)m_pLineHeightEdit->GetValue());
     736           0 :             bEnable = pColMgr->GetLineHeightPercent() != 100;
     737             :         }
     738           0 :         m_pLinePosLbl->Enable( bEnable );
     739           0 :         m_pLinePosDLB->Enable( bEnable );
     740             : 
     741             :         //fdo#66815 if the values are going to be the same, don't update
     742             :         //them to avoid the listbox selection resetting
     743           0 :         if (nLineWidth != m_pLineTypeDLB->GetWidth())
     744           0 :             m_pLineTypeDLB->SetWidth(nLineWidth);
     745           0 :         Color aColor(m_pLineColorDLB->GetSelectEntryColor());
     746           0 :         if (aColor != m_pLineTypeDLB->GetColor())
     747           0 :             m_pLineTypeDLB->SetColor(aColor);
     748             :     }
     749             :     else
     750             :     {
     751           0 :         pColMgr->NoCols();
     752           0 :         nCols = 0;
     753             :     }
     754             : 
     755             :     //set maximum values
     756             :     m_pCLNrEdt->SetMax(std::max(1L,
     757           0 :         std::min(long(nMaxCols), long( pColMgr->GetActualSize() / (nGutterWidth + MINLAY)) )));
     758           0 :     m_pCLNrEdt->SetLast(m_pCLNrEdt->GetMax());
     759           0 :     m_pCLNrEdt->Reformat();
     760             : 
     761             :     //prompt example window
     762           0 :     if(!bLockUpdate)
     763             :     {
     764           0 :         if(bFrm)
     765             :         {
     766           0 :             m_pFrmExampleWN->SetColumns( pColMgr->GetColumns() );
     767           0 :             m_pFrmExampleWN->Invalidate();
     768             :         }
     769             :         else
     770           0 :             m_pPgeExampleWN->Invalidate();
     771             :     }
     772             : 
     773           0 :     return 0;
     774             : }
     775             : 
     776             : /*------------------------------------------------------------------------
     777             :  Description:   Initialisation
     778             : ------------------------------------------------------------------------*/
     779           0 : void SwColumnPage::Init()
     780             : {
     781           0 :     m_pCLNrEdt->SetValue(nCols);
     782             : 
     783           0 :     sal_Bool bAutoWidth = pColMgr->IsAutoWidth() || bHtmlMode;
     784           0 :     m_pAutoWidthBox->Check( bAutoWidth );
     785             : 
     786           0 :     sal_Int32 nColumnWidthSum = 0;
     787             :     // set the widths
     788           0 :     for(sal_uInt16 i = 0; i < nCols; ++i)
     789             :     {
     790           0 :         nColWidth[i] = pColMgr->GetColWidth(i);
     791           0 :         nColumnWidthSum += nColWidth[i];
     792           0 :         if(i < nCols - 1)
     793           0 :             nColDist[i] = pColMgr->GetGutterWidth(i);
     794             :     }
     795             : 
     796           0 :     if( 1 < nCols )
     797             :     {
     798             :         // #97495# make sure that the automatic column width's are always equal
     799           0 :         if(bAutoWidth)
     800             :         {
     801           0 :             nColumnWidthSum /= nCols;
     802           0 :             for(sal_uInt16 i = 0; i < nCols; ++i)
     803           0 :                 nColWidth[i] = nColumnWidthSum;
     804             :         }
     805           0 :         SwColLineAdj eAdj = pColMgr->GetAdjust();
     806           0 :         if( COLADJ_NONE == eAdj )       // the dialog doesn't know a NONE!
     807             :         {
     808           0 :             eAdj = COLADJ_TOP;
     809             :             //without Adjust no line type
     810           0 :             m_pLineTypeDLB->SelectEntryPos( 0 );
     811           0 :             m_pLineHeightEdit->SetValue( 100 );
     812             :         }
     813             :         else
     814             :         {
     815             :             // Need to multiply by 100 because of the 2 decimals
     816           0 :             m_pLineWidthEdit->SetValue( pColMgr->GetLineWidth() * 100, FUNIT_TWIP );
     817           0 :             m_pLineColorDLB->SelectEntry( pColMgr->GetLineColor() );
     818           0 :             m_pLineTypeDLB->SelectEntry( pColMgr->GetLineStyle() );
     819           0 :             m_pLineTypeDLB->SetWidth( pColMgr->GetLineWidth( ) );
     820           0 :             m_pLineHeightEdit->SetValue( pColMgr->GetLineHeightPercent() );
     821             : 
     822             :         }
     823           0 :         m_pLinePosDLB->SelectEntryPos( static_cast< sal_Int32 >(eAdj - 1) );
     824             :     }
     825             :     else
     826             :     {
     827           0 :         m_pLinePosDLB->SelectEntryPos( 0 );
     828           0 :         m_pLineTypeDLB->SelectEntryPos( 0 );
     829           0 :         m_pLineHeightEdit->SetValue( 100 );
     830             :     }
     831             : 
     832           0 :     UpdateCols();
     833           0 :     Update();
     834             : 
     835             :         // set maximum number of columns
     836             :         // values below 1 are not allowed
     837             :     m_pCLNrEdt->SetMax(std::max(1L,
     838           0 :         std::min(long(nMaxCols), long( pColMgr->GetActualSize() / nMinWidth) )));
     839           0 : }
     840             : 
     841           0 : bool SwColumnPage::isLineNotNone() const
     842             : {
     843             :     // nothing is turned off
     844           0 :     const sal_Int32 nPos = m_pLineTypeDLB->GetSelectEntryPos();
     845           0 :     return nPos != LISTBOX_ENTRY_NOTFOUND && nPos != 0;
     846             : }
     847             : 
     848             : /*------------------------------------------------------------------------
     849             :  Description:   The number of columns has changed -- here the controls for
     850             :                 editing of the columns are en- or disabled according to the
     851             :                 column number.
     852             :                 In case there are more than nVisCols (=3) all Edit are being
     853             :                 enabled and the buttons for scrolling too.
     854             :                 Otherwise Edits are being enabled according to the column
     855             :                 numbers; one column can not be edited.
     856             : ------------------------------------------------------------------------*/
     857           0 : void SwColumnPage::UpdateCols()
     858             : {
     859           0 :     sal_Bool bEnableBtns= sal_False;
     860           0 :     sal_Bool bEnable12  = sal_False;
     861           0 :     sal_Bool bEnable3   = sal_False;
     862           0 :     const sal_Bool bEdit = !m_pAutoWidthBox->IsChecked();
     863           0 :     if ( nCols > nVisCols )
     864             :     {
     865           0 :         bEnableBtns = true && !bHtmlMode;
     866           0 :         bEnable12 = bEnable3 = bEdit;
     867             :     }
     868           0 :     else if( bEdit )
     869             :     {
     870             :         // here are purposely hardly any breaks
     871           0 :         switch(nCols)
     872             :         {
     873           0 :             case 3: bEnable3 = sal_True;
     874           0 :             case 2: bEnable12= sal_True; break;
     875             :             default: /* do nothing */;
     876             :         }
     877             :     }
     878           0 :     aEd1.Enable( bEnable12 );
     879           0 :     bool bEnable = nCols > 1;
     880           0 :     aDistEd1.Enable(bEnable);
     881           0 :     m_pAutoWidthBox->Enable( bEnable && !bHtmlMode );
     882           0 :     aEd2.Enable( bEnable12 );
     883           0 :     aDistEd2.Enable(bEnable3);
     884           0 :     aEd3.Enable( bEnable3  );
     885           0 :     m_pLbl1->Enable(bEnable12 );
     886           0 :     m_pLbl2->Enable(bEnable12 );
     887           0 :     m_pLbl3->Enable(bEnable3  );
     888           0 :     m_pBtnBack->Enable( bEnableBtns );
     889           0 :     m_pBtnNext->Enable( bEnableBtns );
     890             : 
     891           0 :     m_pLineTypeDLB->Enable( bEnable );
     892           0 :     m_pLineTypeLbl->Enable( bEnable );
     893             : 
     894           0 :     if (bEnable)
     895             :     {
     896           0 :         bEnable = isLineNotNone();
     897             :     }
     898             : 
     899             :     //all these depend on > 1 column and line style != none
     900           0 :     m_pLineHeightEdit->Enable( bEnable );
     901           0 :     m_pLineHeightLbl->Enable( bEnable );
     902           0 :     m_pLineWidthLbl->Enable( bEnable );
     903           0 :     m_pLineWidthEdit->Enable( bEnable );
     904           0 :     m_pLineColorDLB->Enable( bEnable );
     905           0 :     m_pLineColorLbl->Enable( bEnable );
     906             : 
     907           0 :     if (bEnable)
     908           0 :         bEnable = pColMgr->GetLineHeightPercent() != 100;
     909             : 
     910             :     //and these additionally depend on line height != 100%
     911           0 :     m_pLinePosDLB->Enable( bEnable );
     912           0 :     m_pLinePosLbl->Enable( bEnable );
     913           0 : }
     914             : 
     915           0 : void SwColumnPage::SetLabels( sal_uInt16 nVis )
     916             : {
     917           0 :     const OUString sLbl( '~' );
     918             : 
     919           0 :     const OUString sLbl1(OUString::number( nVis + 1 ));
     920           0 :     m_pLbl1->SetText(sLbl1 + sLbl);
     921             : 
     922           0 :     const OUString sLbl2(OUString::number( nVis + 2 ));
     923           0 :     m_pLbl2->SetText(sLbl2 + sLbl);
     924             : 
     925           0 :     const OUString sLbl3(OUString::number( nVis + 3 ));
     926           0 :     m_pLbl3->SetText(sLbl3 + sLbl);
     927             : 
     928           0 :     const OUString sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH ) ;
     929           0 :     aEd1.SetAccessibleName(sColumnWidth.replaceFirst("%1", sLbl1));
     930           0 :     aEd2.SetAccessibleName(sColumnWidth.replaceFirst("%1", sLbl2));
     931           0 :     aEd3.SetAccessibleName(sColumnWidth.replaceFirst("%1", sLbl3));
     932             : 
     933           0 :     const OUString sDist = SW_RESSTR( STR_ACCESS_PAGESETUP_SPACING ) ;
     934             :     aDistEd1.SetAccessibleName(
     935           0 :         sDist.replaceFirst("%1", sLbl1).replaceFirst("%2", sLbl2));
     936             : 
     937             :     aDistEd2.SetAccessibleName(
     938           0 :         sDist.replaceFirst("%1", sLbl2).replaceFirst("%2", sLbl3));
     939           0 : }
     940             : 
     941             : /*------------------------------------------------------------------------
     942             :  Description:   Handler that is called at alteration of the column number.
     943             :                 An alteration of the column number overwrites potential
     944             :                 user's width settings; all columns are equally wide.
     945             : ------------------------------------------------------------------------*/
     946           0 : IMPL_LINK( SwColumnPage, ColModify, NumericField *, pNF )
     947             : {
     948           0 :     nCols = (sal_uInt16)m_pCLNrEdt->GetValue();
     949             :     //#107890# the handler is also called from LoseFocus()
     950             :     //then no change has been made and thus no action should be taken
     951             :     // #i17816# changing the displayed types within the ValueSet
     952             :     //from two columns to two columns with different settings doesn't invalidate the
     953             :     // example windows in ::ColModify()
     954           0 :     if (!pNF || pColMgr->GetCount() != nCols)
     955             :     {
     956           0 :         if(pNF)
     957           0 :             m_pDefaultVS->SetNoSelection();
     958           0 :         long nDist = static_cast< long >(aDistEd1.DenormalizePercent(aDistEd1.GetValue(FUNIT_TWIP)));
     959           0 :         pColMgr->SetCount(nCols, (sal_uInt16)nDist);
     960           0 :         for(sal_uInt16 i = 0; i < nCols; i++)
     961           0 :             nColDist[i] = nDist;
     962           0 :         nFirstVis = 0;
     963           0 :         SetLabels( nFirstVis );
     964           0 :         UpdateCols();
     965           0 :         ResetColWidth();
     966           0 :         Update();
     967             :     }
     968             : 
     969           0 :     return 0;
     970             : }
     971             : 
     972             : /*------------------------------------------------------------------------
     973             :  Description:   Modify handler for an alteration of the column width or
     974             :                 the column gap.
     975             :                 These changes take effect time-displaced. With an
     976             :                 alteration of the column width the automatic calculation
     977             :                 of the column width is overruled; only an alteration
     978             :                 of the column number leads back to that default.
     979             : ------------------------------------------------------------------------*/
     980           0 : IMPL_LINK( SwColumnPage, GapModify, MetricField*, pMetricFld )
     981             : {
     982           0 :     if (nCols < 2)
     983           0 :         return 0;
     984           0 :     PercentField *pFld = m_aPercentFieldsMap[pMetricFld];
     985             :     assert(pFld);
     986           0 :     long nActValue = static_cast< long >(pFld->DenormalizePercent(pFld->GetValue(FUNIT_TWIP)));
     987           0 :     if(m_pAutoWidthBox->IsChecked())
     988             :     {
     989             :         const long nMaxGap = static_cast< long >
     990           0 :             ((pColMgr->GetActualSize() - nCols * MINLAY)/(nCols - 1));
     991           0 :         if(nActValue > nMaxGap)
     992             :         {
     993           0 :             nActValue = nMaxGap;
     994           0 :             aDistEd1.SetPrcntValue(aDistEd1.NormalizePercent(nMaxGap), FUNIT_TWIP);
     995             :         }
     996           0 :         pColMgr->SetGutterWidth((sal_uInt16)nActValue);
     997           0 :         for(sal_uInt16 i = 0; i < nCols; i++)
     998           0 :             nColDist[i] = nActValue;
     999             : 
    1000           0 :         ResetColWidth();
    1001           0 :         UpdateCols();
    1002             :     }
    1003             :     else
    1004             :     {
    1005           0 :         const sal_uInt16 nVis = nFirstVis + ((pFld == &aDistEd2) ? 1 : 0);
    1006           0 :         long nDiff = nActValue - nColDist[nVis];
    1007           0 :         if(nDiff)
    1008             :         {
    1009           0 :             long nLeft = nColWidth[nVis];
    1010           0 :             long nRight = nColWidth[nVis + 1];
    1011           0 :             if(nLeft + nRight + 2 * MINLAY < nDiff)
    1012           0 :                 nDiff = nLeft + nRight - 2 * MINLAY;
    1013           0 :             if(nDiff < nRight - MINLAY)
    1014             :             {
    1015           0 :                 nRight -= nDiff;
    1016             :             }
    1017             :             else
    1018             :             {
    1019           0 :                 long nTemp = nDiff - nRight + MINLAY;
    1020           0 :                 nRight = MINLAY;
    1021           0 :                 if(nLeft > nTemp - MINLAY)
    1022             :                 {
    1023           0 :                     nLeft -= nTemp;
    1024           0 :                     nTemp = 0;
    1025             :                 }
    1026             :                 else
    1027             :                 {
    1028           0 :                     nTemp -= nLeft + MINLAY;
    1029           0 :                     nLeft = MINLAY;
    1030             :                 }
    1031           0 :                 nDiff = nTemp;
    1032             :             }
    1033           0 :             nColWidth[nVis] = nLeft;
    1034           0 :             nColWidth[nVis + 1] = nRight;
    1035           0 :             nColDist[nVis] += nDiff;
    1036             : 
    1037           0 :             pColMgr->SetColWidth( nVis, sal_uInt16(nLeft) );
    1038           0 :             pColMgr->SetColWidth( nVis + 1, sal_uInt16(nRight) );
    1039           0 :             pColMgr->SetGutterWidth( sal_uInt16(nColDist[nVis]), nVis );
    1040             :         }
    1041             : 
    1042             :     }
    1043           0 :     Update();
    1044           0 :     return 0;
    1045             : }
    1046             : 
    1047           0 : IMPL_LINK( SwColumnPage, EdModify, MetricField *, pMetricFld )
    1048             : {
    1049           0 :     PercentField *pField = m_aPercentFieldsMap[pMetricFld];
    1050             :     assert(pField);
    1051           0 :     pModifiedField = pField;
    1052           0 :     Timeout();
    1053           0 :     return 0;
    1054             : }
    1055             : 
    1056             : /*------------------------------------------------------------------------
    1057             :  Description:   Handler behind the Checkbox for automatic width.
    1058             :                 When the box is checked no expicit values for the column
    1059             :                 width can be entered.
    1060             : ------------------------------------------------------------------------*/
    1061           0 : IMPL_LINK( SwColumnPage, AutoWidthHdl, CheckBox *, pBox )
    1062             : {
    1063           0 :     long nDist = static_cast< long >(aDistEd1.DenormalizePercent(aDistEd1.GetValue(FUNIT_TWIP)));
    1064           0 :     pColMgr->SetCount(nCols, (sal_uInt16)nDist);
    1065           0 :     for(sal_uInt16 i = 0; i < nCols; i++)
    1066           0 :         nColDist[i] = nDist;
    1067           0 :     if(pBox->IsChecked())
    1068             :     {
    1069           0 :         pColMgr->SetGutterWidth(sal_uInt16(nDist));
    1070           0 :         ResetColWidth();
    1071             :     }
    1072           0 :     pColMgr->SetAutoWidth(pBox->IsChecked(), sal_uInt16(nDist));
    1073           0 :     UpdateCols();
    1074           0 :     Update();
    1075           0 :     return 0;
    1076             : }
    1077             : 
    1078             : /*------------------------------------------------------------------------
    1079             :  Description:   scroll up the contents of the edits
    1080             : ------------------------------------------------------------------------*/
    1081           0 : IMPL_LINK_NOARG(SwColumnPage, Up)
    1082             : {
    1083           0 :     if( nFirstVis )
    1084             :     {
    1085           0 :         --nFirstVis;
    1086           0 :         SetLabels( nFirstVis );
    1087           0 :         Update();
    1088             :     }
    1089           0 :     return 0;
    1090             : }
    1091             : 
    1092             : /*------------------------------------------------------------------------
    1093             :  Description:   scroll down the contents of the edits.
    1094             : ------------------------------------------------------------------------*/
    1095           0 : IMPL_LINK_NOARG(SwColumnPage, Down)
    1096             : {
    1097           0 :     if( nFirstVis + nVisCols < nCols )
    1098             :     {
    1099           0 :         ++nFirstVis;
    1100           0 :         SetLabels( nFirstVis );
    1101           0 :         Update();
    1102             :     }
    1103           0 :     return 0;
    1104             : }
    1105             : 
    1106             : /*------------------------------------------------------------------------
    1107             :  Description:   relict from ancient times - now directly without time
    1108             :                 handler; triggered by an alteration of the column width
    1109             :                 or the column gap.
    1110             : ------------------------------------------------------------------------*/
    1111           0 : void SwColumnPage::Timeout()
    1112             : {
    1113           0 :     if(pModifiedField)
    1114             :     {
    1115             :             // find the changed column
    1116           0 :         sal_uInt16 nChanged = nFirstVis;
    1117           0 :         if(pModifiedField == &aEd2)
    1118           0 :             ++nChanged;
    1119           0 :         else if(pModifiedField == &aEd3)
    1120           0 :             nChanged += 2;
    1121             : 
    1122             :         long nNewWidth = static_cast< long >
    1123           0 :             (pModifiedField->DenormalizePercent(pModifiedField->GetValue(FUNIT_TWIP)));
    1124           0 :         long nDiff = nNewWidth - nColWidth[nChanged];
    1125             : 
    1126             :         // when it's the last column
    1127           0 :         if(nChanged == nCols - 1)
    1128             :         {
    1129           0 :             nColWidth[0] -= nDiff;
    1130           0 :             if(nColWidth[0] < (long)nMinWidth)
    1131             :             {
    1132           0 :                 nNewWidth -= nMinWidth - nColWidth[0];
    1133           0 :                 nColWidth[0] = nMinWidth;
    1134             :             }
    1135             : 
    1136             :         }
    1137           0 :         else if(nDiff)
    1138             :         {
    1139           0 :             nColWidth[nChanged + 1] -= nDiff;
    1140           0 :             if(nColWidth[nChanged + 1] < (long) nMinWidth)
    1141             :             {
    1142           0 :                 nNewWidth -= nMinWidth - nColWidth[nChanged + 1];
    1143           0 :                 nColWidth[nChanged + 1] = nMinWidth;
    1144             :             }
    1145             :         }
    1146           0 :         nColWidth[nChanged] = nNewWidth;
    1147           0 :         pModifiedField = 0;
    1148             :     }
    1149           0 :     Update();
    1150           0 : }
    1151             : 
    1152             : /*------------------------------------------------------------------------
    1153             :  Description:   Update the view
    1154             : ------------------------------------------------------------------------*/
    1155           0 : void SwColumnPage::Update()
    1156             : {
    1157           0 :     m_pBalanceColsCB->Enable(nCols > 1);
    1158           0 :     if(nCols >= 2)
    1159             :     {
    1160           0 :         aEd1.SetPrcntValue(aEd1.NormalizePercent(nColWidth[nFirstVis]), FUNIT_TWIP);
    1161           0 :         aDistEd1.SetPrcntValue(aDistEd1.NormalizePercent(nColDist[nFirstVis]), FUNIT_TWIP);
    1162           0 :         aEd2.SetPrcntValue(aEd2.NormalizePercent(nColWidth[nFirstVis + 1]), FUNIT_TWIP);
    1163           0 :         if(nCols >= 3)
    1164             :         {
    1165           0 :             aDistEd2.SetPrcntValue(aDistEd2.NormalizePercent(nColDist[nFirstVis + 1]), FUNIT_TWIP);
    1166           0 :             aEd3.SetPrcntValue(aEd3.NormalizePercent(nColWidth[nFirstVis + 2]), FUNIT_TWIP);
    1167             :         }
    1168             :         else
    1169             :         {
    1170           0 :             aEd3.SetText(OUString());
    1171           0 :             aDistEd2.SetText(OUString());
    1172             :         }
    1173             :     }
    1174             :     else
    1175             :     {
    1176           0 :         aEd1.SetText(OUString());
    1177           0 :         aEd2.SetText(OUString());
    1178           0 :         aEd3.SetText(OUString());
    1179           0 :         aDistEd1.SetText(OUString());
    1180           0 :         aDistEd2.SetText(OUString());
    1181             :     }
    1182           0 :     UpdateColMgr(0);
    1183           0 : }
    1184             : 
    1185             : /*--------------------------------------------------------------------
    1186             :     Description:    Update Bsp
    1187             :  --------------------------------------------------------------------*/
    1188           0 : void SwColumnPage::ActivatePage(const SfxItemSet& rSet)
    1189             : {
    1190           0 :     if(!bFrm)
    1191             :     {
    1192           0 :         if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_SIZE ))
    1193             :         {
    1194             :             const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get(
    1195           0 :                                                 SID_ATTR_PAGE_SIZE);
    1196             :             const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get(
    1197           0 :                                                                 RES_LR_SPACE );
    1198           0 :             const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
    1199           0 :             const sal_uInt16 nActWidth = static_cast< sal_uInt16 >(rSize.GetSize().Width()
    1200           0 :                             - rLRSpace.GetLeft() - rLRSpace.GetRight() - rBox.GetDistance());
    1201             : 
    1202           0 :             if( pColMgr->GetActualSize() != nActWidth)
    1203             :             {
    1204           0 :                 pColMgr->SetActualWidth(nActWidth);
    1205           0 :                 ColModify( 0 );
    1206           0 :                 UpdateColMgr( 0 );
    1207             :             }
    1208             :         }
    1209           0 :         m_pFrmExampleWN->Hide();
    1210           0 :         m_pPgeExampleWN->UpdateExample( rSet, pColMgr );
    1211           0 :         m_pPgeExampleWN->Show();
    1212             : 
    1213             :     }
    1214             :     else
    1215             :     {
    1216           0 :         m_pPgeExampleWN->Hide();
    1217           0 :         m_pFrmExampleWN->Show();
    1218             : 
    1219             :         // Size
    1220           0 :         const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
    1221           0 :         const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
    1222             : 
    1223           0 :         long nDistance = rBox.GetDistance();
    1224           0 :         const sal_uInt16 nTotalWish = bFormat ? FRAME_FORMAT_WIDTH : sal_uInt16(rSize.GetWidth() - 2 * nDistance);
    1225             : 
    1226             :         // set maximum values of column width
    1227           0 :         SetPageWidth(nTotalWish);
    1228             : 
    1229           0 :         if(pColMgr->GetActualSize() != nTotalWish)
    1230             :         {
    1231           0 :             pColMgr->SetActualWidth(nTotalWish);
    1232           0 :             Init();
    1233             :         }
    1234             :         sal_Bool bPercent;
    1235             :         // only relative data in frame format
    1236           0 :         if ( bFormat || (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff) )
    1237             :         {
    1238             :             // set value for 100%
    1239           0 :             aEd1.SetRefValue(nTotalWish);
    1240           0 :             aEd2.SetRefValue(nTotalWish);
    1241           0 :             aEd3.SetRefValue(nTotalWish);
    1242           0 :             aDistEd1.SetRefValue(nTotalWish);
    1243           0 :             aDistEd2.SetRefValue(nTotalWish);
    1244             : 
    1245             :             // switch to %-view
    1246           0 :             bPercent = sal_True;
    1247             :         }
    1248             :         else
    1249           0 :             bPercent = sal_False;
    1250             : 
    1251           0 :         aEd1.ShowPercent(bPercent);
    1252           0 :         aEd2.ShowPercent(bPercent);
    1253           0 :         aEd3.ShowPercent(bPercent);
    1254           0 :         aDistEd1.ShowPercent(bPercent);
    1255           0 :         aDistEd2.ShowPercent(bPercent);
    1256           0 :         aDistEd1.SetMetricFieldMin(0);
    1257           0 :         aDistEd2.SetMetricFieldMin(0);
    1258             :     }
    1259           0 :     Update();
    1260           0 : }
    1261             : 
    1262           0 : int SwColumnPage::DeactivatePage(SfxItemSet *_pSet)
    1263             : {
    1264           0 :     if(_pSet)
    1265           0 :         FillItemSet(*_pSet);
    1266             : 
    1267           0 :     return sal_True;
    1268             : }
    1269             : 
    1270           0 : sal_uInt16* SwColumnPage::GetRanges()
    1271             : {
    1272           0 :     return aPageRg;
    1273             : }
    1274             : 
    1275           0 : IMPL_LINK( SwColumnPage, SetDefaultsHdl, ValueSet *, pVS )
    1276             : {
    1277           0 :     const sal_uInt16 nItem = pVS->GetSelectItemId();
    1278           0 :     if( nItem < 4 )
    1279             :     {
    1280           0 :         m_pCLNrEdt->SetValue( nItem );
    1281           0 :         m_pAutoWidthBox->Check();
    1282           0 :         aDistEd1.SetPrcntValue(0);
    1283           0 :         ColModify(0);
    1284             :     }
    1285             :     else
    1286             :     {
    1287           0 :         bLockUpdate = true;
    1288           0 :         m_pCLNrEdt->SetValue( 2 );
    1289           0 :         m_pAutoWidthBox->Check(false);
    1290           0 :         aDistEd1.SetPrcntValue(0);
    1291           0 :         ColModify(0);
    1292             :         // now set the width ratio to 2 : 1 or 1 : 2 respectively
    1293           0 :         const long nSmall = static_cast< long >(pColMgr->GetActualSize() / 3);
    1294           0 :         if(nItem == 4)
    1295             :         {
    1296           0 :             aEd2.SetPrcntValue(aEd2.NormalizePercent(nSmall), FUNIT_TWIP);
    1297           0 :             pModifiedField = &aEd2;
    1298             :         }
    1299             :         else
    1300             :         {
    1301           0 :             aEd1.SetPrcntValue(aEd1.NormalizePercent(nSmall), FUNIT_TWIP);
    1302           0 :             pModifiedField = &aEd1;
    1303             :         }
    1304           0 :         bLockUpdate = false;
    1305           0 :         Timeout();
    1306             : 
    1307             :     }
    1308           0 :     return 0;
    1309             : }
    1310             : 
    1311           0 : void SwColumnPage::SetFrmMode(sal_Bool bMod)
    1312             : {
    1313           0 :     bFrm = bMod;
    1314           0 : }
    1315             : 
    1316           0 : void SwColumnPage::SetInSection(sal_Bool bSet)
    1317             : {
    1318           0 :     if(!SW_MOD()->GetCTLOptions().IsCTLFontEnabled())
    1319           0 :         return;
    1320             : 
    1321           0 :     m_pTextDirectionFT->Show(bSet);
    1322           0 :     m_pTextDirectionLB->Show(bSet);
    1323             : }
    1324             : 
    1325           0 : void ColumnValueSet::UserDraw( const UserDrawEvent& rUDEvt )
    1326             : {
    1327           0 :     OutputDevice*  pDev = rUDEvt.GetDevice();
    1328           0 :     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
    1329             : 
    1330           0 :     Rectangle aRect = rUDEvt.GetRect();
    1331           0 :     const sal_uInt16 nItemId = rUDEvt.GetItemId();
    1332           0 :     long nRectWidth = aRect.GetWidth();
    1333           0 :     long nRectHeight = aRect.GetHeight();
    1334             : 
    1335           0 :     Point aBLPos = aRect.TopLeft();
    1336           0 :     Color aFillColor(pDev->GetFillColor());
    1337           0 :     Color aLineColor(pDev->GetLineColor());
    1338           0 :     pDev->SetFillColor(rStyleSettings.GetFieldColor());
    1339           0 :     pDev->SetLineColor(SwViewOption::GetFontColor());
    1340             : 
    1341           0 :     long nStep = std::abs(std::abs(nRectHeight * 95 /100) / 11);
    1342           0 :     long nTop = (nRectHeight - 11 * nStep ) / 2;
    1343           0 :     sal_uInt16 nCols = 0;
    1344             :     long nStarts[3];
    1345             :     long nEnds[3];
    1346           0 :     nStarts[0] = nRectWidth * 10 / 100;
    1347           0 :     switch( nItemId )
    1348             :     {
    1349             :         case 1:
    1350           0 :             nEnds[0] = nRectWidth * 9 / 10;
    1351           0 :             nCols = 1;
    1352           0 :         break;
    1353           0 :         case 2: nCols = 2;
    1354           0 :             nEnds[0] = nRectWidth * 45 / 100;
    1355           0 :             nStarts[1] = nEnds[0] + nStep;
    1356           0 :             nEnds[1] = nRectWidth * 9 / 10;
    1357           0 :         break;
    1358           0 :         case 3: nCols = 3;
    1359           0 :             nEnds[0]    = nRectWidth * 30 / 100;
    1360           0 :             nStarts[1]  = nEnds[0] + nStep;
    1361           0 :             nEnds[1]    = nRectWidth * 63 / 100;
    1362           0 :             nStarts[2]  = nEnds[1] + nStep;
    1363           0 :             nEnds[2]    = nRectWidth * 9 / 10;
    1364           0 :         break;
    1365           0 :         case 4: nCols = 2;
    1366           0 :             nEnds[0] = nRectWidth * 63 / 100;
    1367           0 :             nStarts[1] = nEnds[0] + nStep;
    1368           0 :             nEnds[1] = nRectWidth * 9 / 10;
    1369           0 :         break;
    1370           0 :         case 5: nCols = 2;
    1371           0 :             nEnds[0] = nRectWidth * 30 / 100;
    1372           0 :             nStarts[1] = nEnds[0] + nStep;
    1373           0 :             nEnds[1] = nRectWidth * 9 / 10;
    1374           0 :         break;
    1375             :     }
    1376           0 :     for(sal_uInt16 j = 0; j < nCols; j++ )
    1377             :     {
    1378           0 :         Point aStart(aBLPos.X() + nStarts[j], 0);
    1379           0 :         Point aEnd(aBLPos.X() + nEnds[j], 0);
    1380           0 :         for( sal_uInt16 i = 0; i < 12; i ++)
    1381             :         {
    1382           0 :             aStart.Y() = aEnd.Y() = aBLPos.Y() + nTop + i * nStep;
    1383           0 :             pDev->DrawLine(aStart, aEnd);
    1384             :         }
    1385             :     }
    1386           0 :     pDev->SetFillColor(aFillColor);
    1387           0 :     pDev->SetLineColor(aLineColor);
    1388           0 : }
    1389             : 
    1390           0 : void ColumnValueSet::DataChanged( const DataChangedEvent& rDCEvt )
    1391             : {
    1392           0 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
    1393           0 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
    1394             :     {
    1395           0 :         Format();
    1396             :     }
    1397           0 :     ValueSet::DataChanged( rDCEvt );
    1398           0 : }
    1399             : 
    1400           0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeColumnValueSet(Window *pParent, VclBuilder::stringmap &)
    1401             : {
    1402           0 :     return new ColumnValueSet(pParent);
    1403           0 : }
    1404             : 
    1405             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10