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

Generated by: LCOV version 1.10