LCOV - code coverage report
Current view: top level - sw/source/ui/table - tabledlg.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 1020 0.0 %
Date: 2014-04-14 Functions: 0 64 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <hintids.hxx>
      21             : #include <comphelper/string.hxx>
      22             : #include <vcl/msgbox.hxx>
      23             : #include <svl/stritem.hxx>
      24             : #include <svl/intitem.hxx>
      25             : #include <editeng/keepitem.hxx>
      26             : #include <editeng/formatbreakitem.hxx>
      27             : #include <editeng/ulspitem.hxx>
      28             : #include <editeng/frmdiritem.hxx>
      29             : #include <svl/ctloptions.hxx>
      30             : #include <swmodule.hxx>
      31             : #include <fmtornt.hxx>
      32             : #include <fmtpdsc.hxx>
      33             : #include <fmtlsplt.hxx>
      34             : 
      35             : #include <svtools/htmlcfg.hxx>
      36             : #include <fmtrowsplt.hxx>
      37             : #include <sfx2/htmlmode.hxx>
      38             : 
      39             : #include "access.hrc"
      40             : 
      41             : #include <docsh.hxx>
      42             : #include <wrtsh.hxx>
      43             : #include <view.hxx>
      44             : #include <viewopt.hxx>
      45             : #include <uitool.hxx>
      46             : #include <frmatr.hxx>
      47             : #include <tabledlg.hxx>
      48             : #include <../../core/uibase/table/tablepg.hxx>
      49             : #include <tablemgr.hxx>
      50             : #include <pagedesc.hxx>
      51             : #include <uiitems.hxx>
      52             : #include <poolfmt.hxx>
      53             : #include <SwStyleNameMapper.hxx>
      54             : 
      55             : #include <cmdid.h>
      56             : #include <table.hrc>
      57             : #include <svx/svxids.hrc>
      58             : #include <svx/dialogs.hrc>
      59             : #include <svx/flagsdef.hxx>
      60             : #include <svx/svxdlg.hxx>
      61             : 
      62             : using namespace ::com::sun::star;
      63             : 
      64           0 : SwFormatTablePage::SwFormatTablePage(Window* pParent, const SfxItemSet& rSet)
      65             :     : SfxTabPage(pParent, "FormatTablePage", "modules/swriter/ui/formattablepage.ui", rSet)
      66             :     , pTblData(0)
      67             :     , nSaveWidth(0)
      68             :     , nMinTableWidth(MINLAY)
      69             :     , bModified(sal_False)
      70             :     , bFull(0)
      71           0 :     , bHtmlMode(sal_False)
      72             : {
      73           0 :     get(m_pNameED, "name");
      74           0 :     get(m_pWidthFT, "widthft");
      75           0 :     m_aWidthMF.set(get<MetricField>("widthmf"));
      76           0 :     m_aLeftMF.set(get<MetricField>("leftmf"));
      77           0 :     m_aRightMF.set(get<MetricField>("rightmf"));
      78           0 :     get(m_pRelWidthCB, "relwidth");
      79           0 :     get(m_pFullBtn, "full");
      80           0 :     get(m_pLeftBtn, "left");
      81           0 :     get(m_pFromLeftBtn, "fromleft");
      82           0 :     get(m_pRightBtn, "right");
      83           0 :     get(m_pCenterBtn, "center");
      84           0 :     get(m_pFreeBtn, "free");
      85           0 :     get(m_pLeftFT, "leftft");
      86           0 :     get(m_pRightFT, "rightft");
      87           0 :     get(m_pTopFT, "aboveft");
      88           0 :     get(m_pTopMF, "abovemf");
      89           0 :     get(m_pBottomFT, "belowft");
      90           0 :     get(m_pBottomMF, "belowmf");
      91           0 :     get(m_pTextDirectionLB, "textdirection");
      92             : 
      93           0 :     SetExchangeSupport();
      94             : 
      95             :     const SfxPoolItem* pItem;
      96           0 :     if(SFX_ITEM_SET == rSet.GetItemState(SID_HTML_MODE, false, &pItem))
      97           0 :         bHtmlMode = 0 != (((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON);
      98             : 
      99           0 :     bool bCTL = SW_MOD()->GetCTLOptions().IsCTLFontEnabled();
     100           0 :     get<VclContainer>("properties")->Show(!bHtmlMode && bCTL);
     101             : 
     102           0 :     Init();
     103           0 : }
     104             : 
     105           0 : void  SwFormatTablePage::Init()
     106             : {
     107           0 :     m_aLeftMF.SetMetricFieldMin(-999999);
     108           0 :     m_aRightMF.SetMetricFieldMin(-999999);
     109             : 
     110             :     //handler
     111           0 :     Link aLk = LINK( this, SwFormatTablePage, AutoClickHdl );
     112           0 :     m_pFullBtn->SetClickHdl( aLk );
     113           0 :     m_pFreeBtn->SetClickHdl( aLk );
     114           0 :     m_pLeftBtn->SetClickHdl( aLk );
     115           0 :     m_pFromLeftBtn->SetClickHdl( aLk );
     116           0 :     m_pRightBtn->SetClickHdl( aLk );
     117           0 :     m_pCenterBtn->SetClickHdl( aLk );
     118             : 
     119           0 :     aLk = LINK( this, SwFormatTablePage, UpDownLoseFocusHdl );
     120           0 :     m_pTopMF->SetUpHdl( aLk );
     121           0 :     m_pBottomMF->SetUpHdl( aLk );
     122           0 :     m_aRightMF.SetUpHdl( aLk );
     123           0 :     m_aLeftMF.SetUpHdl( aLk );
     124           0 :     m_aWidthMF.SetUpHdl( aLk );
     125             : 
     126           0 :     m_pTopMF->SetDownHdl( aLk );
     127           0 :     m_pBottomMF->SetDownHdl( aLk );
     128           0 :     m_aRightMF.SetDownHdl( aLk );
     129           0 :     m_aLeftMF.SetDownHdl( aLk );
     130           0 :     m_aWidthMF.SetDownHdl( aLk );
     131             : 
     132           0 :     m_pTopMF->SetLoseFocusHdl( aLk );
     133           0 :     m_pBottomMF->SetLoseFocusHdl( aLk );
     134           0 :     m_aRightMF.SetLoseFocusHdl( aLk );
     135           0 :     m_aLeftMF.SetLoseFocusHdl( aLk );
     136           0 :     m_aWidthMF.SetLoseFocusHdl( aLk );
     137             : 
     138           0 :     m_pRelWidthCB->SetClickHdl(LINK( this, SwFormatTablePage, RelWidthClickHdl ));
     139           0 : }
     140             : 
     141           0 : IMPL_LINK( SwFormatTablePage, RelWidthClickHdl, CheckBox *, pBtn )
     142             : {
     143             :     OSL_ENSURE(pTblData, "table data not available?");
     144           0 :     sal_Bool bIsChecked = pBtn->IsChecked();
     145           0 :     sal_Int64 nLeft  = m_aLeftMF.DenormalizePercent(m_aLeftMF.GetValue(FUNIT_TWIP ));
     146           0 :     sal_Int64 nRight = m_aRightMF.DenormalizePercent(m_aRightMF.GetValue(FUNIT_TWIP ));
     147           0 :     m_aWidthMF.ShowPercent(bIsChecked);
     148           0 :     m_aLeftMF.ShowPercent(bIsChecked);
     149           0 :     m_aRightMF.ShowPercent(bIsChecked);
     150             : 
     151           0 :     if (bIsChecked)
     152             :     {
     153           0 :         m_aWidthMF.SetRefValue(pTblData->GetSpace());
     154           0 :         m_aLeftMF.SetRefValue(pTblData->GetSpace());
     155           0 :         m_aRightMF.SetRefValue(pTblData->GetSpace());
     156           0 :         m_aLeftMF.SetMetricFieldMin(0); //will be overwritten by the Percentfield
     157           0 :         m_aRightMF.SetMetricFieldMin(0); //dito
     158           0 :         m_aLeftMF.SetMetricFieldMax(99);
     159           0 :         m_aRightMF.SetMetricFieldMax(99);
     160           0 :         m_aLeftMF.SetPrcntValue(m_aLeftMF.NormalizePercent(nLeft ), FUNIT_TWIP );
     161           0 :         m_aRightMF.SetPrcntValue(m_aRightMF.NormalizePercent(nRight ), FUNIT_TWIP );
     162             :     }
     163             :     else
     164           0 :         ModifyHdl(m_aLeftMF.get());    //correct values again
     165             : 
     166           0 :     if(m_pFreeBtn->IsChecked())
     167             :     {
     168           0 :         sal_Bool bEnable = !pBtn->IsChecked();
     169           0 :         m_aRightMF.Enable(bEnable);
     170           0 :         m_pRightFT->Enable(bEnable);
     171             :     }
     172           0 :     bModified = sal_True;
     173             : 
     174           0 :     return 0;
     175             : }
     176             : 
     177           0 : IMPL_LINK( SwFormatTablePage, AutoClickHdl, CheckBox *, pBox )
     178             : {
     179           0 :     sal_Bool bRestore = sal_True,
     180           0 :          bLeftEnable = sal_False,
     181           0 :          bRightEnable= sal_False,
     182           0 :          bWidthEnable= sal_False,
     183           0 :          bOthers = sal_True;
     184           0 :     if ((RadioButton *)pBox == m_pFullBtn)
     185             :     {
     186           0 :         m_aLeftMF.SetPrcntValue(0);
     187           0 :         m_aRightMF.SetPrcntValue(0);
     188           0 :         nSaveWidth = static_cast< SwTwips >(m_aWidthMF.DenormalizePercent(m_aWidthMF.GetValue(FUNIT_TWIP )));
     189           0 :         m_aWidthMF.SetPrcntValue(m_aWidthMF.NormalizePercent(pTblData->GetSpace() ), FUNIT_TWIP );
     190           0 :         bFull = sal_True;
     191           0 :         bRestore = sal_False;
     192             :     }
     193           0 :     else if ((RadioButton *)pBox == m_pLeftBtn)
     194             :     {
     195           0 :         bRightEnable = bWidthEnable = sal_True;
     196           0 :         m_aLeftMF.SetPrcntValue(0);
     197             :     }
     198           0 :     else if ((RadioButton *) pBox == m_pFromLeftBtn)
     199             :     {
     200           0 :         bLeftEnable = bWidthEnable = sal_True;
     201           0 :         m_aRightMF.SetPrcntValue(0);
     202             :     }
     203           0 :     else if ((RadioButton *) pBox == m_pRightBtn)
     204             :     {
     205           0 :         bLeftEnable = bWidthEnable = sal_True;
     206           0 :         m_aRightMF.SetPrcntValue(0);
     207             :     }
     208           0 :     else if ((RadioButton *) pBox == m_pCenterBtn)
     209             :     {
     210           0 :         bLeftEnable = bWidthEnable = sal_True;
     211             :     }
     212           0 :     else if ((RadioButton *) pBox == m_pFreeBtn)
     213             :     {
     214           0 :         RightModify();
     215           0 :         bLeftEnable = sal_True;
     216           0 :         bWidthEnable = sal_True;
     217           0 :         bOthers = sal_False;
     218             :     }
     219           0 :     m_aLeftMF.Enable(bLeftEnable);
     220           0 :     m_pLeftFT->Enable(bLeftEnable);
     221           0 :     m_aWidthMF.Enable(bWidthEnable);
     222           0 :     m_pWidthFT->Enable(bWidthEnable);
     223           0 :     if ( bOthers )
     224             :     {
     225           0 :         m_aRightMF.Enable(bRightEnable);
     226           0 :         m_pRightFT->Enable(bRightEnable);
     227           0 :         m_pRelWidthCB->Enable(bWidthEnable);
     228             :     }
     229             : 
     230           0 :     if(bFull && bRestore)
     231             :     {
     232             :         //After being switched on automatic, the width was pinned
     233             :         //in order to restore the width while switching back to.
     234           0 :         bFull = sal_False;
     235           0 :         m_aWidthMF.SetPrcntValue(m_aWidthMF.NormalizePercent(nSaveWidth ), FUNIT_TWIP );
     236             :     }
     237           0 :     ModifyHdl(m_aWidthMF.get());
     238           0 :     bModified = sal_True;
     239           0 :     return 0;
     240             : }
     241             : 
     242           0 : void SwFormatTablePage::RightModify()
     243             : {
     244           0 :     if(m_pFreeBtn->IsChecked())
     245             :     {
     246           0 :         sal_Bool bEnable = m_aRightMF.GetValue() == 0;
     247           0 :         m_pRelWidthCB->Enable(bEnable);
     248           0 :         if ( !bEnable )
     249             :         {
     250           0 :             m_pRelWidthCB->Check(false);
     251           0 :             RelWidthClickHdl(m_pRelWidthCB);
     252             :         }
     253           0 :         bEnable = m_pRelWidthCB->IsChecked();
     254           0 :         m_aRightMF.Enable(!bEnable);
     255           0 :         m_pRightFT->Enable(!bEnable);
     256             :     }
     257           0 : }
     258             : 
     259           0 : IMPL_LINK_INLINE_START( SwFormatTablePage, UpDownLoseFocusHdl, MetricField *, pEdit )
     260             : {
     261           0 :     if( m_aRightMF.get() == pEdit)
     262           0 :         RightModify();
     263           0 :     ModifyHdl( pEdit );
     264           0 :     return 0;
     265             : }
     266           0 : IMPL_LINK_INLINE_END( SwFormatTablePage, UpDownLoseFocusHdl, MetricField *, pEdit )
     267             : 
     268           0 : void  SwFormatTablePage::ModifyHdl(const Edit * pEdit)
     269             : {
     270             : 
     271           0 :     SwTwips nCurWidth  = static_cast< SwTwips >(m_aWidthMF.DenormalizePercent(m_aWidthMF.GetValue( FUNIT_TWIP )));
     272           0 :     SwTwips nPrevWidth = nCurWidth;
     273           0 :     SwTwips nRight = static_cast< SwTwips >(m_aRightMF.DenormalizePercent(m_aRightMF.GetValue( FUNIT_TWIP )));
     274           0 :     SwTwips nLeft  = static_cast< SwTwips >(m_aLeftMF.DenormalizePercent(m_aLeftMF.GetValue( FUNIT_TWIP )));
     275             :     SwTwips nDiff;
     276             : 
     277           0 :     if (pEdit == m_aWidthMF.get())
     278             :     {
     279           0 :         if( nCurWidth < MINLAY )
     280           0 :             nCurWidth = MINLAY;
     281           0 :         nDiff = nRight + nLeft + nCurWidth - pTblData->GetSpace() ;
     282             :         //right aligned: only change the left margin
     283           0 :         if(m_pRightBtn->IsChecked())
     284           0 :             nLeft -= nDiff;
     285             :         //left aligned: only change the right margin
     286           0 :         else if(m_pLeftBtn->IsChecked())
     287           0 :             nRight -= nDiff;
     288             :         //left margin and width allowed - first right - then left
     289           0 :         else if(m_pFromLeftBtn->IsChecked())
     290             :         {
     291           0 :             if( nRight >= nDiff )
     292           0 :                 nRight -= nDiff;
     293             :             else
     294             :             {
     295           0 :                 nDiff -= nRight;
     296           0 :                 nRight = 0;
     297           0 :                 if(nLeft >= nDiff)
     298           0 :                     nLeft -= nDiff;
     299             :                 else
     300             :                 {
     301           0 :                     nRight += nLeft - nDiff;
     302           0 :                     nLeft = 0;
     303           0 :                     nCurWidth = pTblData->GetSpace();
     304             :                 }
     305             : 
     306             :             }
     307             :         }
     308             :         //centered: change both sides equally
     309           0 :         else if(m_pCenterBtn->IsChecked())
     310             :         {
     311           0 :             if((nLeft != nRight))
     312             :             {
     313           0 :                 nDiff += nLeft + nRight;
     314           0 :                 nLeft = nDiff/2;
     315           0 :                 nRight = nDiff/2;
     316             :             }
     317             :             else
     318             :             {
     319           0 :                     nLeft -= nDiff/2;
     320           0 :                     nRight -= nDiff/2;
     321             :             }
     322             :         }
     323             :         //free alignment: decrease both margins
     324           0 :         else if(m_pFreeBtn->IsChecked())
     325             :         {
     326           0 :             nLeft -= nDiff/2;
     327           0 :             nRight -= nDiff/2;
     328             :         }
     329             :     }
     330           0 :     if (pEdit == m_aRightMF.get())
     331             :     {
     332             : 
     333           0 :         if( nRight + nLeft > pTblData->GetSpace() - MINLAY )
     334           0 :             nRight = pTblData->GetSpace() -nLeft - MINLAY;
     335             : 
     336           0 :         nCurWidth = pTblData->GetSpace() - nLeft - nRight;
     337             :     }
     338           0 :     if (pEdit == m_aLeftMF.get())
     339             :     {
     340           0 :         if(!m_pFromLeftBtn->IsChecked())
     341             :         {
     342           0 :             sal_Bool bCenter = m_pCenterBtn->IsChecked();
     343           0 :             if( bCenter )
     344           0 :                 nRight = nLeft;
     345           0 :             if(nRight + nLeft > pTblData->GetSpace() - MINLAY )
     346             :             {
     347           0 :                 nLeft  = bCenter ?  (pTblData->GetSpace() - MINLAY) /2 :
     348           0 :                                     (pTblData->GetSpace() - MINLAY) - nRight;
     349           0 :                 nRight = bCenter ?  (pTblData->GetSpace() - MINLAY) /2 : nRight;
     350             :             }
     351           0 :             nCurWidth = pTblData->GetSpace() - nLeft - nRight;
     352             :         }
     353             :         else
     354             :         {
     355             :             //Upon changes on the left side the right margin will be changed at first,
     356             :             //thereafter the width.
     357           0 :             nDiff = nRight + nLeft + nCurWidth - pTblData->GetSpace() ;
     358             : 
     359           0 :             nRight -= nDiff;
     360           0 :             nCurWidth = pTblData->GetSpace() - nLeft - nRight;
     361             :         }
     362             :     }
     363           0 :     if (nCurWidth != nPrevWidth )
     364           0 :         m_aWidthMF.SetPrcntValue( m_aWidthMF.NormalizePercent( nCurWidth ), FUNIT_TWIP );
     365           0 :     m_aRightMF.SetPrcntValue( m_aRightMF.NormalizePercent( nRight ), FUNIT_TWIP );
     366           0 :     m_aLeftMF.SetPrcntValue( m_aLeftMF.NormalizePercent( nLeft ), FUNIT_TWIP );
     367           0 :     bModified = sal_True;
     368           0 : }
     369             : 
     370           0 : SfxTabPage*  SwFormatTablePage::Create( Window* pParent,
     371             :                                    const SfxItemSet& rAttrSet)
     372             : {
     373           0 :     return new SwFormatTablePage( pParent, rAttrSet );
     374             : }
     375             : 
     376           0 : bool  SwFormatTablePage::FillItemSet( SfxItemSet& rCoreSet )
     377             : {
     378             :     //Test if one of the controls still has the focus
     379           0 :     if (m_aWidthMF.HasFocus())
     380           0 :         ModifyHdl(m_aWidthMF.get());
     381           0 :     else if (m_aLeftMF.HasFocus())
     382           0 :         ModifyHdl(m_aLeftMF.get());
     383           0 :     else if(m_aRightMF.HasFocus())
     384           0 :         ModifyHdl(m_aRightMF.get());
     385           0 :     else if(m_pTopMF->HasFocus())
     386           0 :         ModifyHdl(m_pTopMF);
     387           0 :     else if(m_pBottomMF->HasFocus())
     388           0 :         ModifyHdl(m_pBottomMF);
     389             : 
     390           0 :     if(bModified)
     391             :     {
     392           0 :         if( m_pBottomMF->GetText() != m_pBottomMF->GetSavedValue() ||
     393           0 :             m_pTopMF->GetText() != m_pTopMF->GetSavedValue() )
     394             :         {
     395           0 :             SvxULSpaceItem aULSpace(RES_UL_SPACE);
     396           0 :             aULSpace.SetUpper( m_pTopMF->Denormalize(m_pTopMF->GetValue( FUNIT_TWIP )));
     397           0 :             aULSpace.SetLower( m_pBottomMF->Denormalize(m_pBottomMF->GetValue( FUNIT_TWIP )));
     398           0 :             rCoreSet.Put(aULSpace);
     399             :         }
     400             : 
     401             :     }
     402           0 :     if(m_pNameED->GetText() != m_pNameED->GetSavedValue())
     403             :     {
     404           0 :         rCoreSet.Put(SfxStringItem( FN_PARAM_TABLE_NAME, m_pNameED->GetText()));
     405           0 :         bModified = sal_True;
     406             :     }
     407             : 
     408           0 :     if( m_pTextDirectionLB->IsVisible() )
     409             :     {
     410           0 :         const sal_Int32 nPos = m_pTextDirectionLB->GetSelectEntryPos();
     411           0 :         if ( nPos != m_pTextDirectionLB->GetSavedValue() )
     412             :         {
     413             :             const sal_uInt32 nDirection =
     414           0 :                              (sal_uInt32)(sal_uIntPtr)m_pTextDirectionLB->GetEntryData( nPos );
     415           0 :             rCoreSet.Put( SvxFrameDirectionItem( (SvxFrameDirection)nDirection, RES_FRAMEDIR));
     416           0 :             bModified = sal_True;
     417             :         }
     418             :     }
     419             : 
     420           0 :     return bModified;
     421             : }
     422             : 
     423           0 : void  SwFormatTablePage::Reset( const SfxItemSet& )
     424             : {
     425           0 :     const SfxItemSet& rSet = GetItemSet();
     426             :     const SfxPoolItem*  pItem;
     427             : 
     428           0 :     if(bHtmlMode)
     429             :     {
     430           0 :         m_pNameED->Disable();
     431           0 :         m_pTopFT->Hide();
     432           0 :         m_pTopMF->Hide();
     433           0 :         m_pBottomFT->Hide();
     434           0 :         m_pBottomMF->Hide();
     435           0 :         m_pFreeBtn->Enable(false);
     436             :     }
     437           0 :     FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
     438           0 :     m_aWidthMF.SetMetric(aMetric);
     439           0 :     m_aRightMF.SetMetric(aMetric);
     440           0 :     m_aLeftMF.SetMetric(aMetric);
     441           0 :     SetMetric(*m_pTopMF, aMetric);
     442           0 :     SetMetric(*m_pBottomMF, aMetric);
     443             : 
     444             :     //Name
     445           0 :     if(SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_NAME, false, &pItem ))
     446             :     {
     447           0 :         m_pNameED->SetText(((const SfxStringItem*)pItem)->GetValue());
     448           0 :         m_pNameED->SaveValue();
     449             :     }
     450             : 
     451           0 :     if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, false, &pItem ))
     452             :     {
     453           0 :         pTblData = (SwTableRep*)((const SwPtrItem*) pItem)->GetValue();
     454           0 :         nMinTableWidth = pTblData->GetColCount() * MINLAY;
     455             : 
     456           0 :         if(pTblData->GetWidthPercent())
     457             :         {
     458           0 :             m_pRelWidthCB->Check(true);
     459           0 :             RelWidthClickHdl(m_pRelWidthCB);
     460           0 :             m_aWidthMF.SetPrcntValue(pTblData->GetWidthPercent(), FUNIT_CUSTOM);
     461             : 
     462           0 :             m_aWidthMF.SaveValue();
     463           0 :             nSaveWidth = static_cast< SwTwips >(m_aWidthMF.GetValue(FUNIT_CUSTOM));
     464             :         }
     465             :         else
     466             :         {
     467             :             m_aWidthMF.SetPrcntValue(m_aWidthMF.NormalizePercent(
     468           0 :                     pTblData->GetWidth()), FUNIT_TWIP);
     469           0 :             m_aWidthMF.SaveValue();
     470           0 :             nSaveWidth = pTblData->GetWidth();
     471           0 :             nMinTableWidth = std::min( nSaveWidth, nMinTableWidth );
     472             :         }
     473             : 
     474           0 :         m_aWidthMF.SetRefValue(pTblData->GetSpace());
     475           0 :         m_aWidthMF.SetLast(m_aWidthMF.NormalizePercent( pTblData->GetSpace() ));
     476           0 :         m_aLeftMF.SetLast(m_aLeftMF.NormalizePercent( pTblData->GetSpace() ));
     477           0 :         m_aRightMF.SetLast(m_aRightMF.NormalizePercent( pTblData->GetSpace() ));
     478             : 
     479             :         m_aLeftMF.SetPrcntValue(m_aLeftMF.NormalizePercent(
     480           0 :                     pTblData->GetLeftSpace()), FUNIT_TWIP);
     481             :         m_aRightMF.SetPrcntValue(m_aRightMF.NormalizePercent(
     482           0 :                     pTblData->GetRightSpace()), FUNIT_TWIP);
     483           0 :         m_aLeftMF.SaveValue();
     484           0 :         m_aRightMF.SaveValue();
     485             : 
     486           0 :         nOldAlign = pTblData->GetAlign();
     487             : 
     488           0 :         bool bSetRight = false, bSetLeft = false;
     489           0 :         switch( nOldAlign )
     490             :         {
     491             :             case text::HoriOrientation::NONE:
     492           0 :                 m_pFreeBtn->Check();
     493           0 :                 if(m_pRelWidthCB->IsChecked())
     494           0 :                     bSetRight = true;
     495           0 :             break;
     496             :             case text::HoriOrientation::FULL:
     497             :             {
     498           0 :                 bSetRight = bSetLeft = true;
     499           0 :                 m_pFullBtn->Check();
     500           0 :                 m_aWidthMF.Enable(false);
     501           0 :                 m_pRelWidthCB->Enable(false);
     502           0 :                 m_pWidthFT->Enable(false);
     503             :             }
     504           0 :             break;
     505             :             case text::HoriOrientation::LEFT:
     506             :             {
     507           0 :                 bSetLeft = true;
     508           0 :                 m_pLeftBtn->Check();
     509             :             }
     510           0 :             break;
     511             :             case text::HoriOrientation::LEFT_AND_WIDTH :
     512             :             {
     513           0 :                 bSetRight = true;
     514           0 :                 m_pFromLeftBtn->Check();
     515             :             }
     516           0 :             break;
     517             :             case text::HoriOrientation::RIGHT:
     518             :             {
     519           0 :                 bSetRight = true;
     520           0 :                 m_pRightBtn->Check();
     521             :             }
     522           0 :             break;
     523             :             case text::HoriOrientation::CENTER:
     524             :             {
     525           0 :                 bSetRight = true;
     526           0 :                 m_pCenterBtn->Check();
     527             :             }
     528           0 :             break;
     529             :         }
     530           0 :         if ( bSetRight )
     531             :         {
     532           0 :             m_aRightMF.Enable(false);
     533           0 :             m_pRightFT->Enable(false);
     534             :         }
     535           0 :         if ( bSetLeft )
     536             :         {
     537           0 :             m_aLeftMF.Enable(false);
     538           0 :             m_pLeftFT->Enable(false);
     539             :         }
     540             : 
     541             :     }
     542             : 
     543             :     //Margins
     544           0 :     if(SFX_ITEM_SET == rSet.GetItemState( RES_UL_SPACE, false,&pItem ))
     545             :     {
     546             :         m_pTopMF->SetValue(m_pTopMF->Normalize(
     547           0 :                         ((const SvxULSpaceItem*)pItem)->GetUpper()), FUNIT_TWIP);
     548             :         m_pBottomMF->SetValue(m_pBottomMF->Normalize(
     549           0 :                         ((const SvxULSpaceItem*)pItem)->GetLower()), FUNIT_TWIP);
     550           0 :         m_pTopMF->SaveValue();
     551           0 :         m_pBottomMF->SaveValue();
     552             :     }
     553             : 
     554             :     //Text direction
     555           0 :     if( SFX_ITEM_SET == rSet.GetItemState( RES_FRAMEDIR, true, &pItem ) )
     556             :     {
     557           0 :         sal_uIntPtr nVal  = ((SvxFrameDirectionItem*)pItem)->GetValue();
     558           0 :         const sal_Int32 nPos = m_pTextDirectionLB->GetEntryPos( (void*) nVal );
     559           0 :         m_pTextDirectionLB->SelectEntryPos( nPos );
     560           0 :         m_pTextDirectionLB->SaveValue();
     561             :     }
     562             : 
     563           0 :     m_aWidthMF.SetMax( 2*m_aWidthMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
     564           0 :     m_aRightMF.SetMax( m_aRightMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
     565           0 :     m_aLeftMF.SetMax( m_aLeftMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
     566           0 :     m_aWidthMF.SetMin( m_aWidthMF.NormalizePercent( nMinTableWidth ), FUNIT_TWIP );
     567             : 
     568           0 : }
     569             : 
     570           0 : void    SwFormatTablePage::ActivatePage( const SfxItemSet& rSet )
     571             : {
     572             :     OSL_ENSURE(pTblData, "table data not available?");
     573           0 :     if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP ))
     574             :     {
     575           0 :         SwTwips nCurWidth = text::HoriOrientation::FULL != pTblData->GetAlign() ?
     576           0 :                                         pTblData->GetWidth() :
     577           0 :                                             pTblData->GetSpace();
     578           0 :         if(pTblData->GetWidthPercent() == 0 &&
     579           0 :                 nCurWidth != m_aWidthMF.DenormalizePercent(m_aWidthMF.GetValue(FUNIT_TWIP )))
     580             :         {
     581             :             m_aWidthMF.SetPrcntValue(m_aWidthMF.NormalizePercent(
     582           0 :                             nCurWidth), FUNIT_TWIP);
     583           0 :             m_aWidthMF.SaveValue();
     584           0 :             nSaveWidth = nCurWidth;
     585             :             m_aLeftMF.SetPrcntValue(m_aLeftMF.NormalizePercent(
     586           0 :                             pTblData->GetLeftSpace()), FUNIT_TWIP);
     587           0 :             m_aLeftMF.SaveValue();
     588             :             m_aRightMF.SetPrcntValue(m_aRightMF.NormalizePercent(
     589           0 :                             pTblData->GetRightSpace()), FUNIT_TWIP);
     590           0 :             m_aRightMF.SaveValue();
     591             :         }
     592             :     }
     593             : 
     594           0 : }
     595             : 
     596           0 : int  SwFormatTablePage::DeactivatePage( SfxItemSet* _pSet )
     597             : {
     598             :     //os: VCL doesn't take care of making the active widget
     599             :     //in the dialog lose the focus
     600           0 :     m_pNameED->GrabFocus();
     601             :     //test the table name for spaces
     602           0 :     OUString sTblName = m_pNameED->GetText();
     603           0 :     if(sTblName.indexOf(' ') != -1)
     604             :     {
     605           0 :         InfoBox(this, SW_RES(MSG_WRONG_TABLENAME)).Execute();
     606           0 :         m_pNameED->GrabFocus();
     607           0 :         return KEEP_PAGE;
     608             :     }
     609           0 :     if(_pSet)
     610             :     {
     611           0 :         FillItemSet(*_pSet);
     612           0 :         if(bModified)
     613             :         {
     614           0 :             SwTwips lLeft  = static_cast< SwTwips >(m_aLeftMF.DenormalizePercent(m_aLeftMF.GetValue( FUNIT_TWIP )));
     615           0 :             SwTwips lRight = static_cast< SwTwips >(m_aRightMF.DenormalizePercent(m_aRightMF.GetValue( FUNIT_TWIP )));
     616             : 
     617           0 :             if( m_aLeftMF.GetText() != m_aLeftMF.GetSavedValue() ||
     618           0 :                                     m_aRightMF.GetText() != m_aRightMF.GetSavedValue() )
     619             :             {
     620           0 :                 pTblData->SetWidthChanged();
     621           0 :                 pTblData->SetLeftSpace( lLeft);
     622           0 :                 pTblData->SetRightSpace( lRight);
     623             :             }
     624             : 
     625             :             SwTwips lWidth;
     626           0 :             if (m_pRelWidthCB->IsChecked() && m_pRelWidthCB->IsEnabled())
     627             :             {
     628           0 :                 lWidth = pTblData->GetSpace() - lRight - lLeft;
     629           0 :                 const sal_uInt16 nPercentWidth = m_aWidthMF.GetValue(FUNIT_CUSTOM);
     630           0 :                 if(pTblData->GetWidthPercent() != nPercentWidth)
     631             :                 {
     632           0 :                     pTblData->SetWidthPercent(nPercentWidth);
     633           0 :                     pTblData->SetWidthChanged();
     634             :                 }
     635             :             }
     636             :             else
     637             :             {
     638           0 :                 pTblData->SetWidthPercent(0);
     639           0 :                 lWidth = static_cast< SwTwips >(m_aWidthMF.DenormalizePercent(m_aWidthMF.GetValue( FUNIT_TWIP )));
     640             :             }
     641           0 :             pTblData->SetWidth(lWidth);
     642             : 
     643           0 :             SwTwips nColSum = 0;
     644             : 
     645           0 :             for( sal_uInt16 i = 0; i < pTblData->GetColCount(); i++)
     646             :             {
     647           0 :                 nColSum += pTblData->GetColumns()[i].nWidth;
     648             :             }
     649           0 :             if(nColSum != pTblData->GetWidth())
     650             :             {
     651             :                 SwTwips nMinWidth = std::min( (long)MINLAY,
     652           0 :                                     (long) (pTblData->GetWidth() /
     653           0 :                                             pTblData->GetColCount() - 1));
     654           0 :                 SwTwips nDiff = nColSum - pTblData->GetWidth();
     655           0 :                 while ( std::abs(nDiff) > pTblData->GetColCount() + 1 )
     656             :                 {
     657           0 :                     SwTwips nSub = nDiff / pTblData->GetColCount();
     658           0 :                     for( sal_uInt16 i = 0; i < pTblData->GetColCount(); i++)
     659             :                     {
     660           0 :                         if(pTblData->GetColumns()[i].nWidth - nMinWidth > nSub)
     661             :                         {
     662           0 :                             pTblData->GetColumns()[i].nWidth -= nSub;
     663           0 :                             nDiff -= nSub;
     664             :                         }
     665             :                         else
     666             :                         {
     667           0 :                             nDiff -= pTblData->GetColumns()[i].nWidth - nMinWidth;
     668           0 :                             pTblData->GetColumns()[i].nWidth = nMinWidth;
     669             :                         }
     670             : 
     671             :                     }
     672             :                 }
     673             :             }
     674             : 
     675           0 :             sal_Int16 nAlign = 0;
     676           0 :             if(m_pRightBtn->IsChecked())
     677           0 :                 nAlign = text::HoriOrientation::RIGHT;
     678           0 :             else if(m_pLeftBtn->IsChecked())
     679           0 :                 nAlign = text::HoriOrientation::LEFT;
     680           0 :             else if(m_pFromLeftBtn->IsChecked())
     681           0 :                 nAlign = text::HoriOrientation::LEFT_AND_WIDTH;
     682           0 :             else if(m_pCenterBtn->IsChecked())
     683           0 :                 nAlign = text::HoriOrientation::CENTER;
     684           0 :             else if(m_pFreeBtn->IsChecked())
     685           0 :                 nAlign = text::HoriOrientation::NONE;
     686           0 :             else if(m_pFullBtn->IsChecked())
     687             :             {
     688           0 :                 nAlign = text::HoriOrientation::FULL;
     689           0 :                 lWidth = lAutoWidth;
     690             :             }
     691           0 :             if(nAlign != pTblData->GetAlign())
     692             :             {
     693           0 :                 pTblData->SetWidthChanged();
     694           0 :                 pTblData->SetAlign(nAlign);
     695             :             }
     696             : 
     697           0 :             if(pTblData->GetWidth() != lWidth )
     698             :             {
     699           0 :                 pTblData->SetWidthChanged();
     700             :                 pTblData->SetWidth(
     701           0 :                     nAlign == text::HoriOrientation::FULL ? pTblData->GetSpace() : lWidth );
     702             :             }
     703           0 :             if(pTblData->HasWidthChanged())
     704           0 :                 _pSet->Put(SwPtrItem(FN_TABLE_REP, pTblData));
     705             :         }
     706             :     }
     707           0 :     return sal_True;
     708             : }
     709             : 
     710             : //Description: Page column configuration
     711           0 : SwTableColumnPage::SwTableColumnPage(Window* pParent, const SfxItemSet& rSet)
     712             :     : SfxTabPage(pParent, "TableColumnPage",
     713             :         "modules/swriter/ui/tablecolumnpage.ui", rSet)
     714             :     , nTableWidth(0)
     715             :     , nMinWidth(MINLAY)
     716             :     , nNoOfCols(0)
     717             :     , nNoOfVisibleCols(0)
     718             :     , bModified(false)
     719             :     , bModifyTbl(false)
     720           0 :     , bPercentMode(false)
     721             : {
     722           0 :     get(m_pModifyTableCB, "adaptwidth");
     723           0 :     get(m_pProportionalCB, "adaptcolumns");
     724           0 :     get(m_pSpaceFT, "spaceft");
     725           0 :     get(m_pSpaceED, "space-nospin");
     726           0 :     get(m_pUpBtn, "next");
     727           0 :     get(m_pDownBtn, "back");
     728             : 
     729           0 :     m_aFieldArr[0].set(get<MetricField>("width1"));
     730           0 :     m_aFieldArr[1].set(get<MetricField>("width2"));
     731           0 :     m_aFieldArr[2].set(get<MetricField>("width3"));
     732           0 :     m_aFieldArr[3].set(get<MetricField>("width4"));
     733           0 :     m_aFieldArr[4].set(get<MetricField>("width5"));
     734           0 :     m_aFieldArr[5].set(get<MetricField>("width6"));
     735             : 
     736           0 :     m_pTextArr[0] = get<FixedText>("1");
     737           0 :     m_pTextArr[1] = get<FixedText>("2");
     738           0 :     m_pTextArr[2] = get<FixedText>("3");
     739           0 :     m_pTextArr[3] = get<FixedText>("4");
     740           0 :     m_pTextArr[4] = get<FixedText>("5");
     741           0 :     m_pTextArr[5] = get<FixedText>("6");
     742             : 
     743           0 :     SetExchangeSupport();
     744             : 
     745             :     const SfxPoolItem* pItem;
     746           0 :     Init((SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, false,&pItem )
     747           0 :         && ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON));
     748             : 
     749           0 : };
     750             : //Description: Page column configuration
     751           0 :  SwTableColumnPage::~SwTableColumnPage()
     752             : {
     753           0 : };
     754             : 
     755           0 : SfxTabPage*   SwTableColumnPage::Create( Window* pParent,
     756             :                                 const SfxItemSet& rAttrSet)
     757             : {
     758           0 :     return new SwTableColumnPage( pParent, rAttrSet );
     759             : };
     760             : 
     761           0 : void  SwTableColumnPage::Reset( const SfxItemSet& )
     762             : {
     763           0 :     const SfxItemSet& rSet = GetItemSet();
     764             : 
     765             :     const SfxPoolItem* pItem;
     766           0 :     if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, false, &pItem ))
     767             :     {
     768           0 :         pTblData = (SwTableRep*)((const SwPtrItem*) pItem)->GetValue();
     769           0 :         nNoOfVisibleCols = pTblData->GetColCount();
     770           0 :         nNoOfCols = pTblData->GetAllColCount();
     771           0 :         nTableWidth = pTblData->GetAlign() != text::HoriOrientation::FULL &&
     772           0 :                             pTblData->GetAlign() != text::HoriOrientation::LEFT_AND_WIDTH?
     773           0 :                         pTblData->GetWidth() : pTblData->GetSpace();
     774             : 
     775           0 :         for( sal_uInt16 i = 0; i < nNoOfCols; i++ )
     776             :         {
     777           0 :             if( pTblData->GetColumns()[i].nWidth  < nMinWidth )
     778           0 :                     nMinWidth = pTblData->GetColumns()[i].nWidth;
     779             :         }
     780           0 :         sal_Int64 nMinTwips = m_aFieldArr[0].NormalizePercent( nMinWidth );
     781           0 :         sal_Int64 nMaxTwips = m_aFieldArr[0].NormalizePercent( nTableWidth );
     782           0 :         for( sal_uInt16 i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
     783             :         {
     784           0 :             m_aFieldArr[i].SetPrcntValue( m_aFieldArr[i].NormalizePercent(
     785           0 :                                                 GetVisibleWidth(i) ), FUNIT_TWIP );
     786           0 :             m_aFieldArr[i].SetMin( nMinTwips , FUNIT_TWIP );
     787           0 :             m_aFieldArr[i].SetMax( nMaxTwips , FUNIT_TWIP );
     788           0 :             m_aFieldArr[i].Enable();
     789           0 :             m_pTextArr[i]->Enable();
     790             :         }
     791             : 
     792           0 :         if( nNoOfVisibleCols > MET_FIELDS )
     793           0 :             m_pUpBtn->Enable();
     794             : 
     795           0 :         for( sal_uInt16 i = nNoOfVisibleCols; i < MET_FIELDS; ++i )
     796             :         {
     797           0 :             m_aFieldArr[i].SetText( OUString() );
     798           0 :             m_pTextArr[i]->Disable();
     799             :         }
     800             :     }
     801           0 :     ActivatePage(rSet);
     802             : 
     803           0 : };
     804             : 
     805           0 : void  SwTableColumnPage::Init(sal_Bool bWeb)
     806             : {
     807           0 :     FieldUnit aMetric = ::GetDfltMetric(bWeb);
     808           0 :     Link aLkUp = LINK( this, SwTableColumnPage, UpHdl );
     809           0 :     Link aLkDown = LINK( this, SwTableColumnPage, DownHdl );
     810           0 :     Link aLkLF = LINK( this, SwTableColumnPage, LoseFocusHdl );
     811           0 :     for( sal_uInt16 i = 0; i < MET_FIELDS; i++ )
     812             :     {
     813           0 :         aValueTbl[i] = i;
     814           0 :         m_aFieldArr[i].SetMetric(aMetric);
     815           0 :         m_aFieldArr[i].SetUpHdl( aLkUp );
     816           0 :         m_aFieldArr[i].SetDownHdl( aLkDown );
     817           0 :         m_aFieldArr[i].SetLoseFocusHdl( aLkLF );
     818             :     }
     819           0 :     SetMetric(*m_pSpaceED, aMetric);
     820             : 
     821           0 :     Link aLk = LINK( this, SwTableColumnPage, AutoClickHdl );
     822           0 :     m_pUpBtn->SetClickHdl( aLk );
     823           0 :     m_pDownBtn->SetClickHdl( aLk );
     824             : 
     825           0 :     aLk = LINK( this, SwTableColumnPage, ModeHdl );
     826           0 :     m_pModifyTableCB->SetClickHdl( aLk );
     827           0 :     m_pProportionalCB->SetClickHdl( aLk );
     828           0 : };
     829             : 
     830           0 : IMPL_LINK( SwTableColumnPage, AutoClickHdl, CheckBox *, pBox )
     831             : {
     832             :     //move display window
     833           0 :     if(pBox == (CheckBox *)m_pDownBtn)
     834             :     {
     835           0 :         if(aValueTbl[0] > 0)
     836             :         {
     837           0 :             for( sal_uInt16 i=0; i < MET_FIELDS; i++ )
     838           0 :                 aValueTbl[i] -= 1;
     839             :         }
     840             :     }
     841           0 :     if (pBox == (CheckBox *)m_pUpBtn)
     842             :     {
     843           0 :         if( aValueTbl[ MET_FIELDS -1 ] < nNoOfVisibleCols -1  )
     844             :         {
     845           0 :             for(sal_uInt16 i=0;i < MET_FIELDS;i++)
     846           0 :                 aValueTbl[i] += 1;
     847             :         }
     848             :     }
     849           0 :     for( sal_uInt16 i = 0; (i < nNoOfVisibleCols ) && ( i < MET_FIELDS); i++ )
     850             :     {
     851           0 :         OUString sEntry('~');
     852           0 :         OUString sIndex = OUString::number( aValueTbl[i] + 1 );
     853           0 :         sEntry += sIndex;
     854           0 :         m_pTextArr[i]->SetText( sEntry );
     855             : 
     856             :         //added by menghu for SODC_5143,12/12/2006
     857           0 :         OUString sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH);
     858           0 :         sColumnWidth = sColumnWidth.replaceFirst( "%1", sIndex );
     859           0 :         m_aFieldArr[i].SetAccessibleName( sColumnWidth );
     860           0 :     }
     861             : 
     862           0 :     m_pDownBtn->Enable(aValueTbl[0] > 0);
     863           0 :     m_pUpBtn->Enable(aValueTbl[ MET_FIELDS -1 ] < nNoOfVisibleCols -1 );
     864           0 :     UpdateCols(0);
     865           0 :     return 0;
     866             : };
     867             : 
     868           0 : IMPL_LINK_INLINE_START( SwTableColumnPage, UpHdl, MetricField*, pEdit )
     869             : {
     870           0 :     bModified = sal_True;
     871           0 :     ModifyHdl( pEdit );
     872           0 :     return 0;
     873             : };
     874           0 : IMPL_LINK_INLINE_END( SwTableColumnPage, UpHdl, MetricField*, pEdit )
     875             : 
     876           0 : IMPL_LINK_INLINE_START( SwTableColumnPage, DownHdl, MetricField*, pEdit )
     877             : {
     878           0 :     bModified = sal_True;
     879           0 :     ModifyHdl( pEdit );
     880           0 :     return 0;
     881             : };
     882           0 : IMPL_LINK_INLINE_END( SwTableColumnPage, DownHdl, MetricField*, pEdit )
     883             : 
     884           0 : IMPL_LINK_INLINE_START( SwTableColumnPage, LoseFocusHdl, MetricField*, pEdit )
     885             : {
     886           0 :     if (pEdit->IsModified())
     887             :     {
     888           0 :         bModified = sal_True;
     889           0 :         ModifyHdl( pEdit );
     890             :     }
     891           0 :     return 0;
     892             : };
     893           0 : IMPL_LINK_INLINE_END( SwTableColumnPage, LoseFocusHdl, MetricField*, pEdit )
     894             : 
     895           0 : IMPL_LINK( SwTableColumnPage, ModeHdl, CheckBox*, pBox )
     896             : {
     897           0 :     sal_Bool bCheck = pBox->IsChecked();
     898           0 :     if (pBox == m_pProportionalCB)
     899             :     {
     900           0 :         if(bCheck)
     901           0 :             m_pModifyTableCB->Check();
     902           0 :         m_pModifyTableCB->Enable(!bCheck && bModifyTbl);
     903             :     }
     904           0 :     return 0;
     905             : };
     906             : 
     907           0 : bool  SwTableColumnPage::FillItemSet( SfxItemSet& )
     908             : {
     909           0 :     for( sal_uInt16 i = 0; i < MET_FIELDS; i++ )
     910             :     {
     911           0 :         if (m_aFieldArr[i].HasFocus())
     912             :         {
     913           0 :             LoseFocusHdl(m_aFieldArr[i].get());
     914           0 :             break;
     915             :         }
     916             :     }
     917             : 
     918           0 :     if(bModified)
     919             :     {
     920           0 :         pTblData->SetColsChanged();
     921             :     }
     922           0 :     return bModified;
     923             : };
     924             : 
     925           0 : void   SwTableColumnPage::ModifyHdl( MetricField* pField )
     926             : {
     927           0 :         PercentField *pEdit = NULL;
     928             :         sal_uInt16 i;
     929             : 
     930           0 :         for( i = 0; i < MET_FIELDS; i++)
     931             :         {
     932           0 :             if (pField == m_aFieldArr[i].get())
     933             :             {
     934           0 :                 pEdit = &m_aFieldArr[i];
     935           0 :                 break;
     936             :             }
     937             :         }
     938             : 
     939           0 :         if (MET_FIELDS <= i || !pEdit)
     940             :         {
     941             :             OSL_ENSURE(false, "cannot happen.");
     942           0 :             return;
     943             :         }
     944             : 
     945           0 :         SetVisibleWidth(aValueTbl[i], static_cast< SwTwips >(pEdit->DenormalizePercent(pEdit->GetValue( FUNIT_TWIP ))) );
     946             : 
     947           0 :         UpdateCols( aValueTbl[i] );
     948             : };
     949             : 
     950           0 : void   SwTableColumnPage::UpdateCols( sal_uInt16 nAktPos )
     951             : {
     952           0 :     SwTwips nSum = 0;
     953             : 
     954           0 :     for( sal_uInt16 i = 0; i < nNoOfCols; i++ )
     955             :     {
     956           0 :         nSum += (pTblData->GetColumns())[i].nWidth;
     957             :     }
     958           0 :     SwTwips nDiff = nSum - nTableWidth;
     959             : 
     960           0 :     sal_Bool bModifyTable = m_pModifyTableCB->IsChecked();
     961           0 :     sal_Bool bProp =    m_pProportionalCB->IsChecked();
     962             : 
     963           0 :     if(!bModifyTable && !bProp )
     964             :     {
     965             :         //The table width is constant, the difference is balanced with the other columns
     966           0 :         sal_uInt16 nLoopCount = 0;
     967           0 :         while( nDiff )
     968             :         {
     969           0 :             if( ++nAktPos == nNoOfVisibleCols)
     970             :             {
     971           0 :                 nAktPos = 0;
     972           0 :                 ++nLoopCount;
     973             :                 //#i101353# in small tables it might not be possible to balance column width
     974           0 :                 if( nLoopCount > 1 )
     975           0 :                     break;
     976             :             }
     977           0 :             if( nDiff < 0 )
     978             :             {
     979           0 :                 SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
     980           0 :                 nDiff = 0;
     981             :             }
     982           0 :             else if( GetVisibleWidth(nAktPos) >= nDiff + nMinWidth )
     983             :             {
     984           0 :                 SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
     985           0 :                 nDiff = 0;
     986             :             }
     987           0 :             if( nDiff > 0 && GetVisibleWidth(nAktPos) > nMinWidth )
     988             :             {
     989           0 :                 if( nDiff >= (GetVisibleWidth(nAktPos) - nMinWidth) )
     990             :                 {
     991           0 :                     nDiff -= (GetVisibleWidth(nAktPos) - nMinWidth);
     992           0 :                     SetVisibleWidth(nAktPos, nMinWidth);
     993             :                 }
     994             :                 else
     995             :                 {
     996           0 :                     nDiff = 0;
     997           0 :                     SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
     998             :                 }
     999             :                 OSL_ENSURE(nDiff >= 0, "nDiff < 0 cannot be here!");
    1000             :             }
    1001           0 :         }
    1002             :     }
    1003           0 :     else if(bModifyTable && !bProp)
    1004             :     {
    1005             :         //Difference is balanced by the width of the table,
    1006             :         //other columns remain unchanged.
    1007             :         OSL_ENSURE(nDiff <= pTblData->GetSpace() - nTableWidth, "wrong maximum" );
    1008           0 :         SwTwips nActSpace = pTblData->GetSpace() - nTableWidth;
    1009           0 :         if(nDiff > nActSpace)
    1010             :         {
    1011           0 :             nTableWidth = pTblData->GetSpace();
    1012           0 :             SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nActSpace );
    1013             :         }
    1014             :         else
    1015             :         {
    1016           0 :             nTableWidth += nDiff;
    1017           0 :         }
    1018             :     }
    1019           0 :     else if(bModifyTable & bProp)
    1020             :     {
    1021             :         //All columns will be changed proportionally with,
    1022             :         //the table width is adjusted accordingly.
    1023             :         OSL_ENSURE(nDiff * nNoOfVisibleCols <= pTblData->GetSpace() - nTableWidth, "wrong maximum" );
    1024           0 :         long nAdd = nDiff;
    1025           0 :         if(nDiff * nNoOfVisibleCols > pTblData->GetSpace() - nTableWidth)
    1026             :         {
    1027           0 :             nAdd = (pTblData->GetSpace() - nTableWidth) / nNoOfVisibleCols;
    1028           0 :             SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nAdd );
    1029           0 :             nDiff = nAdd;
    1030             :         }
    1031           0 :         if(nAdd)
    1032           0 :             for( sal_uInt16 i = 0; i < nNoOfVisibleCols; i++ )
    1033             :             {
    1034           0 :                 if(i == nAktPos)
    1035           0 :                     continue;
    1036             :                 SwTwips nVisWidth;
    1037           0 :                 if((nVisWidth = GetVisibleWidth(i)) + nDiff < MINLAY)
    1038             :                 {
    1039           0 :                     nAdd += nVisWidth - MINLAY;
    1040           0 :                     SetVisibleWidth(i, MINLAY);
    1041             :                 }
    1042             :                 else
    1043             :                 {
    1044           0 :                     SetVisibleWidth(i, nVisWidth + nDiff);
    1045           0 :                     nAdd += nDiff;
    1046             :                 }
    1047             : 
    1048             :             }
    1049           0 :         nTableWidth += nAdd;
    1050             :     }
    1051             : 
    1052           0 :     if(!bPercentMode)
    1053           0 :         m_pSpaceED->SetValue(m_pSpaceED->Normalize( pTblData->GetSpace() - nTableWidth) , FUNIT_TWIP);
    1054             : 
    1055           0 :     for( sal_uInt16 i = 0; ( i < nNoOfVisibleCols ) && ( i < MET_FIELDS ); i++)
    1056             :     {
    1057           0 :         m_aFieldArr[i].SetPrcntValue(m_aFieldArr[i].NormalizePercent(
    1058           0 :                         GetVisibleWidth(aValueTbl[i]) ), FUNIT_TWIP);
    1059           0 :         m_aFieldArr[i].ClearModifyFlag();
    1060             :     }
    1061           0 : }
    1062             : 
    1063           0 : void    SwTableColumnPage::ActivatePage( const SfxItemSet& )
    1064             : {
    1065           0 :     bPercentMode = pTblData->GetWidthPercent() != 0;
    1066           0 :     for( sal_uInt16 i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
    1067             :     {
    1068           0 :         m_aFieldArr[i].SetRefValue(pTblData->GetWidth());
    1069           0 :         m_aFieldArr[i].ShowPercent( bPercentMode );
    1070             :     }
    1071             : 
    1072           0 :     const sal_uInt16 nTblAlign = pTblData->GetAlign();
    1073           0 :     if((text::HoriOrientation::FULL != nTblAlign && nTableWidth != pTblData->GetWidth()) ||
    1074           0 :     (text::HoriOrientation::FULL == nTblAlign && nTableWidth != pTblData->GetSpace()))
    1075             :     {
    1076             :         nTableWidth = text::HoriOrientation::FULL == nTblAlign ?
    1077           0 :                                     pTblData->GetSpace() :
    1078           0 :                                         pTblData->GetWidth();
    1079           0 :         UpdateCols(0);
    1080             :     }
    1081           0 :     bModifyTbl = sal_True;
    1082           0 :     if(pTblData->GetWidthPercent() ||
    1083           0 :                 text::HoriOrientation::FULL == nTblAlign ||
    1084           0 :                         pTblData->IsLineSelected()  )
    1085           0 :         bModifyTbl = sal_False;
    1086           0 :     if(bPercentMode)
    1087             :     {
    1088           0 :         m_pModifyTableCB->Check(false);
    1089           0 :         m_pProportionalCB->Check(false);
    1090             :     }
    1091           0 :     else if( !bModifyTbl )
    1092             :     {
    1093           0 :         m_pProportionalCB->Check(false);
    1094           0 :         m_pModifyTableCB->Check(false);
    1095             :     }
    1096           0 :     m_pSpaceFT->Enable(!bPercentMode);
    1097           0 :     m_pSpaceED->Enable(!bPercentMode);
    1098           0 :     m_pModifyTableCB->Enable( !bPercentMode && bModifyTbl );
    1099           0 :     m_pProportionalCB->Enable(!bPercentMode && bModifyTbl );
    1100             : 
    1101             :     m_pSpaceED->SetValue(m_pSpaceED->Normalize(
    1102           0 :                 pTblData->GetSpace() - nTableWidth) , FUNIT_TWIP);
    1103             : 
    1104           0 : }
    1105             : 
    1106           0 : int  SwTableColumnPage::DeactivatePage( SfxItemSet* _pSet )
    1107             : {
    1108           0 :     if(_pSet)
    1109             :     {
    1110           0 :         FillItemSet(*_pSet);
    1111           0 :         if(text::HoriOrientation::FULL != pTblData->GetAlign() && pTblData->GetWidth() != nTableWidth)
    1112             :         {
    1113           0 :             pTblData->SetWidth(nTableWidth);
    1114           0 :             SwTwips nDiff = pTblData->GetSpace() - pTblData->GetWidth() -
    1115           0 :                             pTblData->GetLeftSpace() - pTblData->GetRightSpace();
    1116           0 :             switch( pTblData->GetAlign()  )
    1117             :             {
    1118             :                 case text::HoriOrientation::RIGHT:
    1119           0 :                     pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff);
    1120           0 :                 break;
    1121             :                 case text::HoriOrientation::LEFT:
    1122           0 :                     pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff);
    1123           0 :                 break;
    1124             :                 case text::HoriOrientation::NONE:
    1125             :                 {
    1126           0 :                     SwTwips nDiff2 = nDiff/2;
    1127           0 :                     if( nDiff > 0 ||
    1128           0 :                         (-nDiff2 < pTblData->GetRightSpace() && - nDiff2 < pTblData->GetLeftSpace()))
    1129             :                     {
    1130           0 :                         pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff2);
    1131           0 :                         pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff2);
    1132             :                     }
    1133             :                     else
    1134             :                     {
    1135           0 :                         if(pTblData->GetRightSpace() > pTblData->GetLeftSpace())
    1136             :                         {
    1137           0 :                             pTblData->SetLeftSpace(0);
    1138           0 :                             pTblData->SetRightSpace(pTblData->GetSpace() - pTblData->GetWidth());
    1139             :                         }
    1140             :                         else
    1141             :                         {
    1142           0 :                             pTblData->SetRightSpace(0);
    1143           0 :                             pTblData->SetLeftSpace(pTblData->GetSpace() - pTblData->GetWidth());
    1144             :                         }
    1145             :                     }
    1146             :                 }
    1147           0 :                 break;
    1148             :                 case text::HoriOrientation::CENTER:
    1149           0 :                     pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff/2);
    1150           0 :                     pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff/2);
    1151           0 :                 break;
    1152             :                 case text::HoriOrientation::LEFT_AND_WIDTH :
    1153           0 :                     if(nDiff > pTblData->GetRightSpace())
    1154             :                     {
    1155           0 :                         pTblData->SetLeftSpace(pTblData->GetSpace() - pTblData->GetWidth());
    1156             :                     }
    1157             :                     pTblData->SetRightSpace(
    1158           0 :                         pTblData->GetSpace() - pTblData->GetWidth() - pTblData->GetLeftSpace());
    1159           0 :                 break;
    1160             :             }
    1161           0 :             pTblData->SetWidthChanged();
    1162             :         }
    1163           0 :         _pSet->Put(SwPtrItem( FN_TABLE_REP, pTblData ));
    1164             :     }
    1165           0 :     return sal_True;
    1166             : }
    1167             : 
    1168           0 : SwTwips  SwTableColumnPage::GetVisibleWidth(sal_uInt16 nPos)
    1169             : {
    1170           0 :     sal_uInt16 i=0;
    1171             : 
    1172           0 :     while( nPos )
    1173             :     {
    1174           0 :         if(pTblData->GetColumns()[i].bVisible && nPos)
    1175           0 :             nPos--;
    1176           0 :         i++;
    1177             :     }
    1178           0 :     SwTwips nReturn = pTblData->GetColumns()[i].nWidth;
    1179             :     OSL_ENSURE(i < nNoOfCols, "Array index out of range");
    1180           0 :     while(!pTblData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
    1181           0 :         nReturn += pTblData->GetColumns()[++i].nWidth;
    1182             : 
    1183           0 :     return nReturn;
    1184             : }
    1185             : 
    1186           0 : void SwTableColumnPage::SetVisibleWidth(sal_uInt16 nPos, SwTwips nNewWidth)
    1187             : {
    1188           0 :     sal_uInt16 i=0;
    1189           0 :     while( nPos )
    1190             :     {
    1191           0 :         if(pTblData->GetColumns()[i].bVisible && nPos)
    1192           0 :             nPos--;
    1193           0 :         i++;
    1194             :     }
    1195             :     OSL_ENSURE(i < nNoOfCols, "Array index out of range");
    1196           0 :     pTblData->GetColumns()[i].nWidth = nNewWidth;
    1197           0 :     while(!pTblData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
    1198           0 :         pTblData->GetColumns()[++i].nWidth = 0;
    1199             : 
    1200           0 : }
    1201             : 
    1202           0 : SwTableTabDlg::SwTableTabDlg(Window* pParent, SfxItemPool&,
    1203             :     const SfxItemSet* pItemSet, SwWrtShell* pSh)
    1204             :     : SfxTabDialog(0, pParent, "TablePropertiesDialog",
    1205             :         "modules/swriter/ui/tableproperties.ui", pItemSet)
    1206             :     , pShell(pSh)
    1207           0 :     , m_nHtmlMode(::GetHtmlMode(pSh->GetView().GetDocShell()))
    1208             : {
    1209           0 :     SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
    1210             :     OSL_ENSURE(pFact, "Dialogdiet fail!");
    1211           0 :     AddTabPage("table", &SwFormatTablePage::Create, 0);
    1212           0 :     m_nTextFlowId = AddTabPage("textflow", &SwTextFlowPage::Create, 0);
    1213           0 :     AddTabPage("columns", &SwTableColumnPage::Create, 0);
    1214           0 :     m_nBackgroundId = AddTabPage("background", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_BACKGROUND), 0);
    1215           0 :     m_nBorderId = AddTabPage("borders", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_BORDER), 0);
    1216           0 : }
    1217             : 
    1218           0 : void  SwTableTabDlg::PageCreated(sal_uInt16 nId, SfxTabPage& rPage)
    1219             : {
    1220           0 :     SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
    1221           0 :     if (nId == m_nBackgroundId)
    1222             :     {
    1223           0 :         sal_Int32 nFlagType = SVX_SHOW_TBLCTL;
    1224           0 :         if(!( m_nHtmlMode & HTMLMODE_ON ) ||
    1225           0 :             m_nHtmlMode & HTMLMODE_SOME_STYLES)
    1226           0 :             nFlagType |= SVX_SHOW_SELECTOR;
    1227           0 :         aSet.Put (SfxUInt32Item(SID_FLAG_TYPE, nFlagType));
    1228           0 :         rPage.PageCreated(aSet);
    1229             :     }
    1230           0 :     else if (nId == m_nBorderId)
    1231             :     {
    1232           0 :         aSet.Put (SfxUInt16Item(SID_SWMODE_TYPE,SW_BORDER_MODE_TABLE));
    1233           0 :         rPage.PageCreated(aSet);
    1234             :     }
    1235           0 :     else if (nId == m_nTextFlowId)
    1236             :     {
    1237           0 :         ((SwTextFlowPage&)rPage).SetShell(pShell);
    1238           0 :         const sal_uInt16 eType = pShell->GetFrmType(0,sal_True);
    1239           0 :         if( !(FRMTYPE_BODY & eType) )
    1240           0 :             ((SwTextFlowPage&)rPage).DisablePageBreak();
    1241           0 :     }
    1242           0 : }
    1243             : 
    1244           0 : SwTextFlowPage::SwTextFlowPage(Window* pParent, const SfxItemSet& rSet)
    1245             :     : SfxTabPage(pParent, "TableTextFlowPage",
    1246             :         "modules/swriter/ui/tabletextflowpage.ui", rSet)
    1247             :     , pShell(0)
    1248             :     , bPageBreak(true)
    1249           0 :     , bHtmlMode(false)
    1250             : {
    1251           0 :     get(m_pPgBrkCB, "break");
    1252             : 
    1253           0 :     get(m_pPgBrkRB, "page");
    1254           0 :     get(m_pColBrkRB, "column");
    1255             : 
    1256           0 :     get(m_pPgBrkBeforeRB, "before");
    1257           0 :     get(m_pPgBrkAfterRB, "after");
    1258             : 
    1259           0 :     get(m_pPageCollCB, "pagestyle");
    1260           0 :     get(m_pPageCollLB, "pagestylelb");
    1261           0 :     get(m_pPageNoFT, "pagenoft");
    1262           0 :     get(m_pPageNoNF, "pagenonf");
    1263             : 
    1264           0 :     get(m_pSplitCB, "split");
    1265           0 :     get(m_pSplitRowCB, "splitrow");
    1266           0 :     get(m_pKeepCB, "keep");
    1267           0 :     get(m_pHeadLineCB, "headline");
    1268             : 
    1269           0 :     get(m_pRepeatHeaderCombo, "repeatheader");
    1270           0 :     get(m_pRepeatHeaderNF, "repeatheadernf");
    1271             : 
    1272           0 :     get(m_pTextDirectionLB, "textdirection");
    1273           0 :     get(m_pVertOrientLB, "vertorient");
    1274             : 
    1275           0 :     m_pPgBrkRB->SetAccessibleRelationMemberOf(m_pPgBrkCB);
    1276           0 :     m_pColBrkRB->SetAccessibleRelationMemberOf(m_pPgBrkCB);
    1277           0 :     m_pPgBrkBeforeRB->SetAccessibleRelationMemberOf(m_pPgBrkCB);
    1278           0 :     m_pPgBrkAfterRB->SetAccessibleRelationMemberOf(m_pPgBrkCB);
    1279           0 :     m_pPageCollLB->SetAccessibleName(m_pPageCollCB->GetText());
    1280             : 
    1281           0 :     m_pPgBrkCB->SetClickHdl(LINK(this, SwTextFlowPage, PageBreakHdl_Impl));
    1282             :     m_pPgBrkBeforeRB->SetClickHdl(
    1283           0 :         LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
    1284             :     m_pPgBrkAfterRB->SetClickHdl(
    1285           0 :         LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
    1286             :     m_pPageCollCB->SetClickHdl(
    1287           0 :         LINK( this, SwTextFlowPage, ApplyCollClickHdl_Impl ) );
    1288             :     m_pColBrkRB->SetClickHdl(
    1289           0 :         LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
    1290             :     m_pPgBrkRB->SetClickHdl(
    1291           0 :         LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
    1292             :     m_pSplitCB->SetClickHdl(
    1293           0 :         LINK( this, SwTextFlowPage, SplitHdl_Impl));
    1294             :     m_pSplitRowCB->SetClickHdl(
    1295           0 :         LINK( this, SwTextFlowPage, SplitRowHdl_Impl));
    1296           0 :     m_pHeadLineCB->SetClickHdl( LINK( this, SwTextFlowPage, HeadLineCBClickHdl ) );
    1297             : 
    1298             : #ifndef SW_FILEFORMAT_40
    1299             :     const SfxPoolItem *pItem;
    1300           0 :     if(SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, false,&pItem )
    1301           0 :         && ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON)
    1302             : #endif
    1303             :     {
    1304           0 :         m_pKeepCB->Hide();
    1305           0 :         m_pSplitCB->Hide();
    1306           0 :         m_pSplitRowCB->Hide();
    1307             :     }
    1308             : 
    1309           0 :     HeadLineCBClickHdl();
    1310           0 : }
    1311             : 
    1312           0 :  SwTextFlowPage::~SwTextFlowPage()
    1313             : {
    1314           0 : }
    1315             : 
    1316           0 : SfxTabPage*   SwTextFlowPage::Create( Window* pParent,
    1317             :                                 const SfxItemSet& rAttrSet)
    1318             : {
    1319           0 :     return new SwTextFlowPage(pParent, rAttrSet);
    1320             : }
    1321             : 
    1322           0 : bool  SwTextFlowPage::FillItemSet( SfxItemSet& rSet )
    1323             : {
    1324           0 :     bool bModified = false;
    1325             : 
    1326             :     //Repeat Heading
    1327           0 :     if(TriState(m_pHeadLineCB->IsChecked()) != m_pHeadLineCB->GetSavedValue() ||
    1328           0 :         OUString::number( static_cast< sal_Int32 >(m_pRepeatHeaderNF->GetValue()) ) != m_pRepeatHeaderNF->GetSavedValue() )
    1329             :     {
    1330             :         bModified |= 0 != rSet.Put(
    1331           0 :             SfxUInt16Item(FN_PARAM_TABLE_HEADLINE, m_pHeadLineCB->IsChecked()? sal_uInt16(m_pRepeatHeaderNF->GetValue()) : 0 ));
    1332             :     }
    1333           0 :     if(TriState(m_pKeepCB->IsChecked()) != m_pKeepCB->GetSavedValue())
    1334           0 :         bModified |= 0 != rSet.Put( SvxFmtKeepItem( m_pKeepCB->IsChecked(), RES_KEEP));
    1335             : 
    1336           0 :     if(TriState(m_pSplitCB->IsChecked()) != m_pSplitCB->GetSavedValue())
    1337           0 :         bModified |= 0 != rSet.Put( SwFmtLayoutSplit( m_pSplitCB->IsChecked()));
    1338             : 
    1339           0 :     if(TriState(m_pSplitRowCB->IsChecked()) != m_pSplitRowCB->GetSavedValue())
    1340           0 :         bModified |= 0 != rSet.Put( SwFmtRowSplit( m_pSplitRowCB->IsChecked()));
    1341             : 
    1342           0 :     const SvxFmtBreakItem* pBreak = (const SvxFmtBreakItem*)GetOldItem( rSet, RES_BREAK );
    1343           0 :     const SwFmtPageDesc* pDesc = (const SwFmtPageDesc*) GetOldItem( rSet, RES_PAGEDESC );
    1344             : 
    1345           0 :     sal_Bool bState = m_pPageCollCB->IsChecked();
    1346             : 
    1347             :     //If we have a page style, then there's no break
    1348           0 :     sal_Bool bPageItemPut = sal_False;
    1349           0 :     if ( bState != m_pPageCollCB->GetSavedValue() ||
    1350           0 :          ( bState &&
    1351           0 :            m_pPageCollLB->GetSelectEntryPos() != m_pPageCollLB->GetSavedValue() )
    1352           0 :            || (m_pPageNoNF->IsEnabled() && m_pPageNoNF->IsValueModified()) )
    1353             :     {
    1354           0 :         OUString sPage;
    1355             : 
    1356           0 :         if ( bState )
    1357             :         {
    1358           0 :             sPage = m_pPageCollLB->GetSelectEntry();
    1359             :         }
    1360           0 :         sal_uInt16 nPgNum = static_cast< sal_uInt16 >(m_pPageNoNF->GetValue());
    1361           0 :         if ( !pDesc || !pDesc->GetPageDesc() ||
    1362           0 :             ( pDesc->GetPageDesc() && ((pDesc->GetPageDesc()->GetName() != sPage) ||
    1363           0 :                     !comphelper::string::equals(m_pPageNoNF->GetSavedValue(), nPgNum))))
    1364             :         {
    1365           0 :             SwFmtPageDesc aFmt( pShell->FindPageDescByName( sPage, sal_True ) );
    1366           0 :             aFmt.SetNumOffset(bState ? nPgNum : 0);
    1367           0 :             bModified |= 0 != rSet.Put( aFmt );
    1368           0 :             bPageItemPut = bState;
    1369           0 :         }
    1370             :     }
    1371           0 :     sal_Bool bIsChecked = m_pPgBrkCB->IsChecked();
    1372           0 :     if ( !bPageItemPut &&
    1373           0 :         (   bState != m_pPageCollCB->GetSavedValue() ||
    1374           0 :             bIsChecked != m_pPgBrkCB->GetSavedValue()              ||
    1375           0 :             m_pPgBrkBeforeRB->IsChecked() != m_pPgBrkBeforeRB->GetSavedValue()    ||
    1376           0 :             m_pPgBrkRB->IsChecked() != m_pPgBrkRB->GetSavedValue() ))
    1377             :     {
    1378             :         SvxFmtBreakItem aBreak(
    1379           0 :             (const SvxFmtBreakItem&)GetItemSet().Get( RES_BREAK ) );
    1380             : 
    1381           0 :         if(bIsChecked)
    1382             :         {
    1383           0 :             sal_Bool bBefore = m_pPgBrkBeforeRB->IsChecked();
    1384             : 
    1385           0 :             if ( m_pPgBrkRB->IsChecked() )
    1386             :             {
    1387           0 :                 if ( bBefore )
    1388           0 :                     aBreak.SetValue( SVX_BREAK_PAGE_BEFORE );
    1389             :                 else
    1390           0 :                     aBreak.SetValue( SVX_BREAK_PAGE_AFTER );
    1391             :             }
    1392             :             else
    1393             :             {
    1394           0 :                 if ( bBefore )
    1395           0 :                     aBreak.SetValue( SVX_BREAK_COLUMN_BEFORE );
    1396             :                 else
    1397           0 :                     aBreak.SetValue( SVX_BREAK_COLUMN_AFTER );
    1398             :             }
    1399             :         }
    1400             :         else
    1401             :         {
    1402           0 :                 aBreak.SetValue( SVX_BREAK_NONE );
    1403             :         }
    1404             : 
    1405           0 :         if ( !pBreak || !( *(const SvxFmtBreakItem*)pBreak == aBreak ) )
    1406             :         {
    1407           0 :             bModified |= 0 != rSet.Put( aBreak );
    1408           0 :         }
    1409             :     }
    1410             : 
    1411           0 :     if(m_pTextDirectionLB->GetSelectEntryPos() != m_pTextDirectionLB->GetSavedValue())
    1412             :     {
    1413             :           bModified |= 0 != rSet.Put(
    1414             :                     SvxFrameDirectionItem(
    1415           0 :                         (SvxFrameDirection)(sal_uLong)m_pTextDirectionLB->GetEntryData(m_pTextDirectionLB->GetSelectEntryPos())
    1416           0 :                         , FN_TABLE_BOX_TEXTORIENTATION));
    1417             :     }
    1418             : 
    1419           0 :     if(m_pVertOrientLB->GetSelectEntryPos() != m_pVertOrientLB->GetSavedValue())
    1420             :     {
    1421           0 :         sal_uInt16 nOrient = USHRT_MAX;
    1422           0 :         switch(m_pVertOrientLB->GetSelectEntryPos())
    1423             :         {
    1424           0 :             case 0 : nOrient = text::VertOrientation::NONE; break;
    1425           0 :             case 1 : nOrient = text::VertOrientation::CENTER; break;
    1426           0 :             case 2 : nOrient = text::VertOrientation::BOTTOM; break;
    1427             :         }
    1428           0 :         if(nOrient != USHRT_MAX)
    1429           0 :             bModified |= 0 != rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, nOrient));
    1430             :     }
    1431             : 
    1432           0 :     return bModified;
    1433             : 
    1434             : }
    1435             : 
    1436           0 : void   SwTextFlowPage::Reset( const SfxItemSet& rSet )
    1437             : {
    1438             :     const SfxPoolItem* pItem;
    1439           0 :     SvxHtmlOptions& rHtmlOpt = SvxHtmlOptions::Get();
    1440           0 :     bool bFlowAllowed = !bHtmlMode || rHtmlOpt.IsPrintLayoutExtension();
    1441           0 :     if(bFlowAllowed)
    1442             :     {
    1443             :         //Inserting of the existing page templates in the list box
    1444           0 :         const sal_uInt16 nCount = pShell->GetPageDescCnt();
    1445             : 
    1446           0 :         for( sal_uInt16 i = 0; i < nCount; ++i)
    1447             :         {
    1448           0 :             const SwPageDesc &rPageDesc = pShell->GetPageDesc(i);
    1449           0 :             m_pPageCollLB->InsertEntry(rPageDesc.GetName());
    1450             :         }
    1451             : 
    1452           0 :         OUString aFmtName;
    1453           0 :         for(sal_uInt16 i = RES_POOLPAGE_BEGIN; i < RES_POOLPAGE_END; ++i)
    1454           0 :             if( LISTBOX_ENTRY_NOTFOUND == m_pPageCollLB->GetEntryPos(
    1455           0 :                     aFmtName = SwStyleNameMapper::GetUIName( i, aFmtName ) ))
    1456           0 :                 m_pPageCollLB->InsertEntry( aFmtName );
    1457             : 
    1458           0 :         if(SFX_ITEM_SET == rSet.GetItemState( RES_KEEP, false, &pItem ))
    1459             :         {
    1460           0 :             m_pKeepCB->Check( ((const SvxFmtKeepItem*)pItem)->GetValue() );
    1461           0 :             m_pKeepCB->SaveValue();
    1462             :         }
    1463           0 :         if(SFX_ITEM_SET == rSet.GetItemState( RES_LAYOUT_SPLIT, false, &pItem ))
    1464             :         {
    1465           0 :             m_pSplitCB->Check( ((const SwFmtLayoutSplit*)pItem)->GetValue() );
    1466             :         }
    1467             :         else
    1468           0 :             m_pSplitCB->Check();
    1469             : 
    1470           0 :         m_pSplitCB->SaveValue();
    1471           0 :         SplitHdl_Impl(m_pSplitCB);
    1472             : 
    1473           0 :         if(SFX_ITEM_SET == rSet.GetItemState( RES_ROW_SPLIT, false, &pItem ))
    1474             :         {
    1475           0 :             m_pSplitRowCB->Check( ((const SwFmtRowSplit*)pItem)->GetValue() );
    1476             :         }
    1477             :         else
    1478           0 :             m_pSplitRowCB->SetState(TRISTATE_INDET);
    1479           0 :         m_pSplitRowCB->SaveValue();
    1480             : 
    1481           0 :         if(bPageBreak)
    1482             :         {
    1483           0 :             if(SFX_ITEM_SET == rSet.GetItemState( RES_PAGEDESC, false, &pItem ))
    1484             :             {
    1485           0 :                 OUString sPageDesc;
    1486           0 :                 const SwPageDesc* pDesc = ((const SwFmtPageDesc*)pItem)->GetPageDesc();
    1487             : 
    1488             :                 //m_pPageNoNF->SetValue(((const SwFmtPageDesc*)pItem)->GetNumOffset());
    1489           0 :                 ::boost::optional<sal_uInt16> oNumOffset = ((const SwFmtPageDesc*)pItem)->GetNumOffset();
    1490           0 :                 if (oNumOffset)
    1491           0 :                     m_pPageNoNF->SetValue(oNumOffset.get());
    1492             :                 else
    1493           0 :                     m_pPageNoNF->Enable(false);
    1494             : 
    1495           0 :                 if(pDesc)
    1496           0 :                     sPageDesc = pDesc->GetName();
    1497           0 :                 if ( !sPageDesc.isEmpty() &&
    1498           0 :                         m_pPageCollLB->GetEntryPos( sPageDesc ) != LISTBOX_ENTRY_NOTFOUND )
    1499             :                 {
    1500           0 :                     m_pPageCollLB->SelectEntry( sPageDesc );
    1501           0 :                     m_pPageCollCB->Check();
    1502             : 
    1503           0 :                     m_pPgBrkCB->Enable();
    1504           0 :                     m_pPgBrkRB->Enable();
    1505           0 :                     m_pColBrkRB->Enable();
    1506           0 :                     m_pPgBrkBeforeRB->Enable();
    1507           0 :                     m_pPgBrkAfterRB->Enable();
    1508           0 :                     m_pPageCollCB->Enable();
    1509           0 :                     m_pPgBrkCB->Check();
    1510             : 
    1511           0 :                     m_pPgBrkCB->Check( true );
    1512           0 :                     m_pColBrkRB->Check( false );
    1513           0 :                     m_pPgBrkBeforeRB->Check( true );
    1514           0 :                     m_pPgBrkAfterRB->Check( false );
    1515             :                 }
    1516             :                 else
    1517             :                 {
    1518           0 :                     m_pPageCollLB->SetNoSelection();
    1519           0 :                     m_pPageCollCB->Check(false);
    1520           0 :                 }
    1521             :             }
    1522             : 
    1523           0 :             if(SFX_ITEM_SET == rSet.GetItemState( RES_BREAK, false, &pItem ))
    1524             :             {
    1525           0 :                 const SvxFmtBreakItem* pPageBreak = (const SvxFmtBreakItem*)pItem;
    1526           0 :                 SvxBreak eBreak = (SvxBreak)pPageBreak->GetValue();
    1527             : 
    1528           0 :                 if ( eBreak != SVX_BREAK_NONE )
    1529             :                 {
    1530           0 :                     m_pPgBrkCB->Check();
    1531           0 :                     m_pPageCollCB->Enable(false);
    1532           0 :                     m_pPageCollLB->Enable(false);
    1533           0 :                     m_pPageNoFT->Enable(false);
    1534           0 :                     m_pPageNoNF->Enable(false);
    1535             :                 }
    1536           0 :                 switch ( eBreak )
    1537             :                 {
    1538             :                     case SVX_BREAK_PAGE_BEFORE:
    1539           0 :                         m_pPgBrkRB->Check( true );
    1540           0 :                         m_pColBrkRB->Check( false );
    1541           0 :                         m_pPgBrkBeforeRB->Check( true );
    1542           0 :                         m_pPgBrkAfterRB->Check( false );
    1543           0 :                         break;
    1544             :                     case SVX_BREAK_PAGE_AFTER:
    1545           0 :                         m_pPgBrkRB->Check( true );
    1546           0 :                         m_pColBrkRB->Check( false );
    1547           0 :                         m_pPgBrkBeforeRB->Check( false );
    1548           0 :                         m_pPgBrkAfterRB->Check( true );
    1549           0 :                         break;
    1550             :                     case SVX_BREAK_COLUMN_BEFORE:
    1551           0 :                         m_pPgBrkRB->Check( false );
    1552           0 :                         m_pColBrkRB->Check( true );
    1553           0 :                         m_pPgBrkBeforeRB->Check( true );
    1554           0 :                         m_pPgBrkAfterRB->Check( false );
    1555           0 :                         break;
    1556             :                     case SVX_BREAK_COLUMN_AFTER:
    1557           0 :                         m_pPgBrkRB->Check( false );
    1558           0 :                         m_pColBrkRB->Check( true );
    1559           0 :                         m_pPgBrkBeforeRB->Check( false );
    1560           0 :                         m_pPgBrkAfterRB->Check( true );
    1561           0 :                         break;
    1562             :                     default:; //prevent warning
    1563             :                 }
    1564             : 
    1565             :             }
    1566           0 :             if ( m_pPgBrkBeforeRB->IsChecked() )
    1567           0 :                 PageBreakPosHdl_Impl(m_pPgBrkBeforeRB);
    1568           0 :             else if ( m_pPgBrkAfterRB->IsChecked() )
    1569           0 :                 PageBreakPosHdl_Impl(m_pPgBrkAfterRB);
    1570           0 :             PageBreakHdl_Impl( m_pPgBrkCB );
    1571           0 :         }
    1572             :     }
    1573             :     else
    1574             :     {
    1575           0 :         m_pPgBrkRB->Enable(false);
    1576           0 :         m_pColBrkRB->Enable(false);
    1577           0 :         m_pPgBrkBeforeRB->Enable(false);
    1578           0 :         m_pPgBrkAfterRB->Enable(false);
    1579           0 :         m_pKeepCB->Enable(false);
    1580           0 :         m_pSplitCB->Enable(false);
    1581           0 :         m_pPgBrkCB->Enable(false);
    1582           0 :         m_pPageCollCB->Enable(false);
    1583           0 :         m_pPageCollLB->Enable(false);
    1584             :     }
    1585             : 
    1586           0 :     if(SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, false, &pItem ))
    1587             :     {
    1588           0 :         sal_uInt16 nRep = ((const SfxUInt16Item*)pItem)->GetValue();
    1589           0 :         m_pHeadLineCB->Check( nRep > 0 );
    1590           0 :         m_pHeadLineCB->SaveValue();
    1591           0 :         m_pRepeatHeaderNF->SetValue( nRep );
    1592           0 :         m_pRepeatHeaderNF->SaveValue();
    1593             :     }
    1594           0 :     if ( rSet.GetItemState(FN_TABLE_BOX_TEXTORIENTATION) > SFX_ITEM_AVAILABLE )
    1595             :     {
    1596           0 :         sal_uLong nDirection = ((const SvxFrameDirectionItem&)rSet.Get(FN_TABLE_BOX_TEXTORIENTATION)).GetValue();
    1597           0 :         m_pTextDirectionLB->SelectEntryPos(m_pTextDirectionLB->GetEntryPos( (const void*)nDirection ));
    1598             :     }
    1599             : 
    1600           0 :     if ( rSet.GetItemState(FN_TABLE_SET_VERT_ALIGN) > SFX_ITEM_AVAILABLE )
    1601             :     {
    1602           0 :         sal_uInt16 nVert = ((const SfxUInt16Item&)rSet.Get(FN_TABLE_SET_VERT_ALIGN)).GetValue();
    1603           0 :         sal_uInt16 nPos = 0;
    1604           0 :         switch(nVert)
    1605             :         {
    1606           0 :             case text::VertOrientation::NONE:     nPos = 0;   break;
    1607           0 :             case text::VertOrientation::CENTER:   nPos = 1;   break;
    1608           0 :             case text::VertOrientation::BOTTOM:   nPos = 2;   break;
    1609             :         }
    1610           0 :         m_pVertOrientLB->SelectEntryPos(nPos);
    1611             :     }
    1612             : 
    1613           0 :     m_pPageCollCB->SaveValue();
    1614           0 :     m_pPageCollLB->SaveValue();
    1615           0 :     m_pPgBrkCB->SaveValue();
    1616           0 :     m_pPgBrkRB->SaveValue();
    1617           0 :     m_pColBrkRB->SaveValue();
    1618           0 :     m_pPgBrkBeforeRB->SaveValue();
    1619           0 :     m_pPgBrkAfterRB->SaveValue();
    1620           0 :     m_pPageNoNF->SaveValue();
    1621           0 :     m_pTextDirectionLB->SaveValue();
    1622           0 :     m_pVertOrientLB->SaveValue();
    1623             : 
    1624           0 :     HeadLineCBClickHdl();
    1625           0 : }
    1626             : 
    1627           0 : void SwTextFlowPage::SetShell(SwWrtShell* pSh)
    1628             : {
    1629           0 :     pShell = pSh;
    1630           0 :     bHtmlMode = 0 != (::GetHtmlMode(pShell->GetView().GetDocShell()) & HTMLMODE_ON);
    1631           0 :     if(bHtmlMode)
    1632             :     {
    1633           0 :         m_pPageNoNF->Enable(false);
    1634           0 :         m_pPageNoFT->Enable(false);
    1635             :     }
    1636           0 : }
    1637             : 
    1638           0 : IMPL_LINK_NOARG(SwTextFlowPage, PageBreakHdl_Impl)
    1639             : {
    1640           0 :     if( m_pPgBrkCB->IsChecked() )
    1641             :     {
    1642           0 :             m_pPgBrkRB->       Enable();
    1643           0 :             m_pColBrkRB->      Enable();
    1644           0 :             m_pPgBrkBeforeRB-> Enable();
    1645           0 :             m_pPgBrkAfterRB->  Enable();
    1646             : 
    1647           0 :             if ( m_pPgBrkRB->IsChecked() && m_pPgBrkBeforeRB->IsChecked() )
    1648             :             {
    1649           0 :                 m_pPageCollCB->Enable();
    1650             : 
    1651           0 :                 sal_Bool bEnable = m_pPageCollCB->IsChecked() &&
    1652           0 :                                             m_pPageCollLB->GetEntryCount();
    1653           0 :                 m_pPageCollLB->Enable(bEnable);
    1654           0 :                 if(!bHtmlMode)
    1655             :                 {
    1656           0 :                     m_pPageNoFT->Enable(bEnable);
    1657           0 :                     m_pPageNoNF->Enable(bEnable);
    1658             :                 }
    1659             :             }
    1660             :     }
    1661             :     else
    1662             :     {
    1663           0 :             m_pPageCollCB->Check( false );
    1664           0 :             m_pPageCollCB->Enable(false);
    1665           0 :             m_pPageCollLB->Enable(false);
    1666           0 :             m_pPageNoFT->Enable(false);
    1667           0 :             m_pPageNoNF->Enable(false);
    1668           0 :             m_pPgBrkRB->       Enable(false);
    1669           0 :             m_pColBrkRB->      Enable(false);
    1670           0 :             m_pPgBrkBeforeRB-> Enable(false);
    1671           0 :             m_pPgBrkAfterRB->  Enable(false);
    1672             :     }
    1673           0 :     return 0;
    1674             : }
    1675             : 
    1676           0 : IMPL_LINK_NOARG(SwTextFlowPage, ApplyCollClickHdl_Impl)
    1677             : {
    1678           0 :     sal_Bool bEnable = sal_False;
    1679           0 :     if ( m_pPageCollCB->IsChecked() &&
    1680           0 :          m_pPageCollLB->GetEntryCount() )
    1681             :     {
    1682           0 :         bEnable = sal_True;
    1683           0 :         m_pPageCollLB->SelectEntryPos( 0 );
    1684             :     }
    1685             :     else
    1686             :     {
    1687           0 :         m_pPageCollLB->SetNoSelection();
    1688             :     }
    1689           0 :     m_pPageCollLB->Enable(bEnable);
    1690           0 :     if(!bHtmlMode)
    1691             :     {
    1692           0 :         m_pPageNoFT->Enable(bEnable);
    1693           0 :         m_pPageNoNF->Enable(bEnable);
    1694             :     }
    1695           0 :     return 0;
    1696             : }
    1697             : 
    1698           0 : IMPL_LINK( SwTextFlowPage, PageBreakPosHdl_Impl, RadioButton*, pBtn )
    1699             : {
    1700           0 :     if ( m_pPgBrkCB->IsChecked() )
    1701             :     {
    1702           0 :         if ( pBtn == m_pPgBrkBeforeRB && m_pPgBrkRB->IsChecked() )
    1703             :         {
    1704           0 :             m_pPageCollCB->Enable();
    1705             : 
    1706           0 :             sal_Bool bEnable = m_pPageCollCB->IsChecked()  &&
    1707           0 :                                         m_pPageCollLB->GetEntryCount();
    1708             : 
    1709           0 :             m_pPageCollLB->Enable(bEnable);
    1710           0 :             if(!bHtmlMode)
    1711             :             {
    1712           0 :                 m_pPageNoFT->Enable(bEnable);
    1713           0 :                 m_pPageNoNF->Enable(bEnable);
    1714             :             }
    1715             :         }
    1716           0 :         else if (pBtn == m_pPgBrkAfterRB)
    1717             :         {
    1718           0 :             m_pPageCollCB->Check( false );
    1719           0 :             m_pPageCollCB->Enable(false);
    1720           0 :             m_pPageCollLB->Enable(false);
    1721           0 :             m_pPageNoFT->Enable(false);
    1722           0 :             m_pPageNoNF->Enable(false);
    1723             :         }
    1724             :     }
    1725           0 :     return 0;
    1726             : }
    1727             : 
    1728           0 : IMPL_LINK( SwTextFlowPage, PageBreakTypeHdl_Impl, RadioButton*, pBtn )
    1729             : {
    1730           0 :     if ( pBtn == m_pColBrkRB || m_pPgBrkAfterRB->IsChecked() )
    1731             :     {
    1732           0 :         m_pPageCollCB->Check(false);
    1733           0 :         m_pPageCollCB->Enable(false);
    1734           0 :         m_pPageCollLB->Enable(false);
    1735           0 :         m_pPageNoFT->Enable(false);
    1736           0 :         m_pPageNoNF->Enable(false);
    1737             :     }
    1738           0 :     else if ( m_pPgBrkBeforeRB->IsChecked() )
    1739           0 :         PageBreakPosHdl_Impl(m_pPgBrkBeforeRB);
    1740           0 :     return 0;
    1741             : }
    1742             : 
    1743           0 : IMPL_LINK( SwTextFlowPage, SplitHdl_Impl, CheckBox*, pBox )
    1744             : {
    1745           0 :     m_pSplitRowCB->Enable(pBox->IsChecked());
    1746           0 :     return 0;
    1747             : }
    1748             : 
    1749           0 : IMPL_LINK( SwTextFlowPage, SplitRowHdl_Impl, TriStateBox*, pBox )
    1750             : {
    1751           0 :     pBox->EnableTriState(false);
    1752           0 :     return 0;
    1753             : }
    1754             : 
    1755           0 : IMPL_LINK_NOARG(SwTextFlowPage, HeadLineCBClickHdl)
    1756             : {
    1757           0 :     m_pRepeatHeaderCombo->Enable(m_pHeadLineCB->IsChecked());
    1758             : 
    1759           0 :     return 0;
    1760             : }
    1761             : 
    1762           0 : void SwTextFlowPage::DisablePageBreak()
    1763             : {
    1764           0 :     bPageBreak = sal_False;
    1765           0 :     m_pPgBrkCB->Disable();
    1766           0 :     m_pPgBrkRB->Disable();
    1767           0 :     m_pColBrkRB->Disable();
    1768           0 :     m_pPgBrkBeforeRB->Disable();
    1769           0 :     m_pPgBrkAfterRB->Disable();
    1770           0 :     m_pPageCollCB->Disable();
    1771           0 :     m_pPageCollLB->Disable();
    1772           0 :     m_pPageNoFT->Disable();
    1773           0 :     m_pPageNoNF->Disable();
    1774           0 : }
    1775             : 
    1776             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10