LCOV - code coverage report
Current view: top level - sw/source/ui/table - tautofmt.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 442 0.0 %
Date: 2014-04-14 Functions: 0 45 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 <vcl/edit.hxx>
      21             : #include <vcl/layout.hxx>
      22             : #include <vcl/msgbox.hxx>
      23             : #include <vcl/svapp.hxx>
      24             : #include <vcl/settings.hxx>
      25             : 
      26             : #include <svl/zforlist.hxx>
      27             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      28             : #include <com/sun/star/i18n/BreakIterator.hpp>
      29             : #include <comphelper/processfactory.hxx>
      30             : #include <svtools/scriptedtext.hxx>
      31             : #include <svtools/accessibilityoptions.hxx>
      32             : #include <svx/framelinkarray.hxx>
      33             : #include "app.hrc"
      34             : #include "swmodule.hxx"
      35             : #include "swtypes.hxx"
      36             : #include "view.hxx"
      37             : #include "wrtsh.hxx"
      38             : #include "tblafmt.hxx"
      39             : #include "tautofmt.hxx"
      40             : #include "shellres.hxx"
      41             : 
      42             : using namespace com::sun::star;
      43             : 
      44             : #define FRAME_OFFSET 4
      45             : 
      46             : class AutoFmtPreview : public Window
      47             : {
      48             : public:
      49             :     AutoFmtPreview(Window* pParent);
      50             :     virtual ~AutoFmtPreview();
      51             : 
      52             :     void NotifyChange( const SwTableAutoFmt& rNewData );
      53             : 
      54             :     void DetectRTL(SwWrtShell* pWrtShell);
      55             : 
      56             :     virtual void Resize() SAL_OVERRIDE;
      57             : protected:
      58             :     virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE;
      59             : 
      60             : private:
      61             :     SwTableAutoFmt          aCurData;
      62             :     VirtualDevice           aVD;
      63             :     SvtScriptedTextHelper   aScriptedText;
      64             :     svx::frame::Array       maArray;            /// Implementation to draw the frame borders.
      65             :     sal_Bool                    bFitWidth;
      66             :     bool                    mbRTL;
      67             :     Size                    aPrvSize;
      68             :     long                    nLabelColWidth;
      69             :     long                    nDataColWidth1;
      70             :     long                    nDataColWidth2;
      71             :     long                    nRowHeight;
      72             :     const OUString          aStrJan;
      73             :     const OUString          aStrFeb;
      74             :     const OUString          aStrMar;
      75             :     const OUString          aStrNorth;
      76             :     const OUString          aStrMid;
      77             :     const OUString          aStrSouth;
      78             :     const OUString          aStrSum;
      79             :     SvNumberFormatter*      pNumFmt;
      80             : 
      81             :     uno::Reference< i18n::XBreakIterator >       m_xBreak;
      82             : 
      83             :     void    Init            ();
      84             :     void    DoPaint         ( const Rectangle& rRect );
      85             :     void    CalcCellArray   ( sal_Bool bFitWidth );
      86             :     void    CalcLineMap     ();
      87             :     void    PaintCells      ();
      88             : 
      89             :     sal_uInt8                GetFormatIndex( size_t nCol, size_t nRow ) const;
      90             :     const SvxBoxItem&   GetBoxItem( size_t nCol, size_t nRow ) const;
      91             : 
      92             :     void                DrawString( size_t nCol, size_t nRow );
      93             :     void                DrawStrings();
      94             :     void                DrawBackground();
      95             : 
      96             :     void    MakeFonts       ( sal_uInt8 nIndex, Font& rFont, Font& rCJKFont, Font& rCTLFont );
      97             :     OUString  MakeNumberString( const OUString& cellString, sal_Bool bAddDec );
      98             : };
      99             : 
     100             : class SwStringInputDlg : public ModalDialog
     101             : {
     102             : public:
     103             :             SwStringInputDlg(     Window* pParent,
     104             :                             const OUString& rTitle,
     105             :                             const OUString& rEditTitle,
     106             :                             const OUString& rDefault );
     107             :             virtual ~SwStringInputDlg();
     108             : 
     109             :     OUString GetInputString() const;
     110             : 
     111             : private:
     112             :     Edit*           m_pEdInput;   // Edit obtains the focus.
     113             : };
     114             : 
     115           0 : SwStringInputDlg::SwStringInputDlg(Window* pParent, const OUString& rTitle,
     116             :     const OUString& rEditTitle, const OUString& rDefault)
     117           0 :     : ModalDialog(pParent, "StringInputDialog", "modules/swriter/ui/stringinput.ui")
     118             : {
     119           0 :     get<FixedText>("name")->SetText(rEditTitle);
     120           0 :     get(m_pEdInput, "edit");
     121             : 
     122           0 :     SetText(rTitle);
     123           0 :     m_pEdInput->SetText(rDefault);
     124           0 : }
     125             : 
     126           0 : OUString SwStringInputDlg::GetInputString() const
     127             : {
     128           0 :     return m_pEdInput->GetText();
     129             : }
     130             : 
     131           0 : SwStringInputDlg::~SwStringInputDlg()
     132             : {
     133           0 : }
     134             : 
     135             : // AutoFormat-Dialogue:
     136             : 
     137           0 : SwAutoFormatDlg::SwAutoFormatDlg( Window* pParent, SwWrtShell* pWrtShell,
     138             :                     sal_Bool bSetAutoFormat, const SwTableAutoFmt* pSelFmt )
     139             :     : SfxModalDialog(pParent, "AutoFormatTableDialog", "modules/swriter/ui/autoformattable.ui")
     140             :     , aStrTitle(SW_RES(STR_ADD_AUTOFORMAT_TITLE))
     141             :     , aStrLabel(SW_RES(STR_ADD_AUTOFORMAT_LABEL))
     142             :     , aStrClose(SW_RES(STR_BTN_AUTOFORMAT_CLOSE))
     143             :     , aStrDelTitle(SW_RES(STR_DEL_AUTOFORMAT_TITLE))
     144             :     , aStrDelMsg(SW_RES(STR_DEL_AUTOFORMAT_MSG))
     145             :     , aStrRenameTitle(SW_RES(STR_RENAME_AUTOFORMAT_TITLE))
     146             :     , aStrInvalidFmt(SW_RES(STR_INVALID_AUTOFORMAT_NAME))
     147             :     , pShell(pWrtShell)
     148             :     , nIndex(0)
     149             :     , nDfltStylePos(0)
     150             :     , bCoreDataChanged(sal_False)
     151           0 :     , bSetAutoFmt(bSetAutoFormat)
     152             : {
     153           0 :     get(m_pLbFormat, "formatlb");
     154           0 :     get(m_pFormatting, "formatting");
     155           0 :     get(m_pBtnNumFormat, "numformatcb");
     156           0 :     get(m_pBtnBorder, "bordercb");
     157           0 :     get(m_pBtnFont, "fontcb");
     158           0 :     get(m_pBtnPattern, "patterncb");
     159           0 :     get(m_pBtnAlignment, "alignmentcb");
     160           0 :     get(m_pBtnOk, "ok");
     161           0 :     get(m_pBtnCancel, "cancel");
     162           0 :     get(m_pBtnAdd, "add");
     163           0 :     get(m_pBtnRemove, "remove");
     164           0 :     get(m_pBtnRename, "rename");
     165           0 :     get(m_pWndPreview, "preview");
     166             : 
     167           0 :     m_pWndPreview->DetectRTL(pWrtShell);
     168             : 
     169           0 :     pTableTbl = new SwTableAutoFmtTbl;
     170           0 :     pTableTbl->Load();
     171             : 
     172           0 :     Init(pSelFmt);
     173           0 : }
     174             : 
     175           0 : SwAutoFormatDlg::~SwAutoFormatDlg()
     176             : {
     177           0 :     if (bCoreDataChanged)
     178           0 :         pTableTbl->Save();
     179           0 :     delete pTableTbl;
     180           0 : }
     181             : 
     182           0 : void SwAutoFormatDlg::Init( const SwTableAutoFmt* pSelFmt )
     183             : {
     184           0 :     Link aLk( LINK( this, SwAutoFormatDlg, CheckHdl ) );
     185           0 :     m_pBtnBorder->SetClickHdl( aLk );
     186           0 :     m_pBtnFont->SetClickHdl( aLk );
     187           0 :     m_pBtnPattern->SetClickHdl( aLk );
     188           0 :     m_pBtnAlignment->SetClickHdl( aLk );
     189           0 :     m_pBtnNumFormat->SetClickHdl( aLk );
     190             : 
     191           0 :     m_pBtnAdd->SetClickHdl ( LINK( this, SwAutoFormatDlg, AddHdl ) );
     192           0 :     m_pBtnRemove->SetClickHdl ( LINK( this, SwAutoFormatDlg, RemoveHdl ) );
     193           0 :     m_pBtnRename->SetClickHdl ( LINK( this, SwAutoFormatDlg, RenameHdl ) );
     194           0 :     m_pBtnOk->SetClickHdl ( LINK( this, SwAutoFormatDlg, OkHdl ) );
     195           0 :     m_pLbFormat->SetSelectHdl( LINK( this, SwAutoFormatDlg, SelFmtHdl ) );
     196             : 
     197           0 :     m_pBtnAdd->Enable( bSetAutoFmt );
     198             : 
     199           0 :     nIndex = 0;
     200           0 :     if( !bSetAutoFmt )
     201             :     {
     202             :         // Then the list to be expanded by the entry "- none -".
     203           0 :         m_pLbFormat->InsertEntry( SwViewShell::GetShellRes()->aStrNone );
     204           0 :         nDfltStylePos = 1;
     205           0 :         nIndex = 255;
     206             :     }
     207             : 
     208           0 :     for (sal_uInt8 i = 0, nCount = static_cast<sal_uInt8>(pTableTbl->size());
     209             :             i < nCount; i++)
     210             :     {
     211           0 :         SwTableAutoFmt const& rFmt = (*pTableTbl)[ i ];
     212           0 :         m_pLbFormat->InsertEntry(rFmt.GetName());
     213           0 :         if (pSelFmt && rFmt.GetName() == pSelFmt->GetName())
     214           0 :             nIndex = i;
     215             :     }
     216             : 
     217           0 :     m_pLbFormat->SelectEntryPos( 255 != nIndex ? (nDfltStylePos + nIndex) : 0 );
     218           0 :     SelFmtHdl( 0 );
     219           0 : }
     220             : 
     221           0 : void SwAutoFormatDlg::UpdateChecks( const SwTableAutoFmt& rFmt, sal_Bool bEnable )
     222             : {
     223           0 :     m_pBtnNumFormat->Enable( bEnable );
     224           0 :     m_pBtnNumFormat->Check( rFmt.IsValueFormat() );
     225             : 
     226           0 :     m_pBtnBorder->Enable( bEnable );
     227           0 :     m_pBtnBorder->Check( rFmt.IsFrame() );
     228             : 
     229           0 :     m_pBtnFont->Enable( bEnable );
     230           0 :     m_pBtnFont->Check( rFmt.IsFont() );
     231             : 
     232           0 :     m_pBtnPattern->Enable( bEnable );
     233           0 :     m_pBtnPattern->Check( rFmt.IsBackground() );
     234             : 
     235           0 :     m_pBtnAlignment->Enable( bEnable );
     236           0 :     m_pBtnAlignment->Check( rFmt.IsJustify() );
     237           0 : }
     238             : 
     239           0 : void SwAutoFormatDlg::FillAutoFmtOfIndex( SwTableAutoFmt*& rToFill ) const
     240             : {
     241           0 :     if( 255 != nIndex )
     242             :     {
     243           0 :         if( rToFill )
     244           0 :             *rToFill = (*pTableTbl)[ nIndex ];
     245             :         else
     246           0 :             rToFill = new SwTableAutoFmt( (*pTableTbl)[ nIndex ] );
     247             :     }
     248             :     else
     249           0 :         delete rToFill, rToFill = 0;
     250           0 : }
     251             : 
     252             : // Handler:
     253             : 
     254           0 : IMPL_LINK( SwAutoFormatDlg, CheckHdl, Button *, pBtn )
     255             : {
     256           0 :     SwTableAutoFmt* pData  = &(*pTableTbl)[nIndex];
     257           0 :     sal_Bool bCheck = ((CheckBox*)pBtn)->IsChecked(), bDataChgd = sal_True;
     258             : 
     259           0 :     if( pBtn == m_pBtnNumFormat )
     260           0 :         pData->SetValueFormat( bCheck );
     261           0 :     else if ( pBtn == m_pBtnBorder )
     262           0 :         pData->SetFrame( bCheck );
     263           0 :     else if ( pBtn == m_pBtnFont )
     264           0 :         pData->SetFont( bCheck );
     265           0 :     else if ( pBtn == m_pBtnPattern )
     266           0 :         pData->SetBackground( bCheck );
     267           0 :     else if ( pBtn == m_pBtnAlignment )
     268           0 :         pData->SetJustify( bCheck );
     269             :     else
     270           0 :         bDataChgd = sal_False;
     271             : 
     272           0 :     if( bDataChgd )
     273             :     {
     274           0 :         if( !bCoreDataChanged )
     275             :         {
     276           0 :             m_pBtnCancel->SetText( aStrClose );
     277           0 :             bCoreDataChanged = sal_True;
     278             :         }
     279             : 
     280           0 :         m_pWndPreview->NotifyChange( *pData );
     281             :     }
     282           0 :     return 0;
     283             : }
     284             : 
     285           0 : IMPL_LINK_NOARG(SwAutoFormatDlg, AddHdl)
     286             : {
     287           0 :     bool bOk = false, bFmtInserted = false;
     288           0 :     while( !bOk )
     289             :     {
     290             :         SwStringInputDlg* pDlg = new SwStringInputDlg( this,
     291             :                                                        aStrTitle,
     292             :                                                        aStrLabel,
     293           0 :                                                        OUString() );
     294           0 :         if( RET_OK == pDlg->Execute() )
     295             :         {
     296           0 :             const OUString aFormatName( pDlg->GetInputString() );
     297             : 
     298           0 :             if ( !aFormatName.isEmpty() )
     299             :             {
     300             :                 size_t n;
     301           0 :                 for( n = 0; n < pTableTbl->size(); ++n )
     302           0 :                     if( (*pTableTbl)[n].GetName() == aFormatName )
     303           0 :                         break;
     304             : 
     305           0 :                 if( n >= pTableTbl->size() )
     306             :                 {
     307             :                     // Format with the name does not already exist, so take up.
     308             :                     SwTableAutoFmt* pNewData = new
     309           0 :                                         SwTableAutoFmt( aFormatName );
     310           0 :                     pShell->GetTableAutoFmt( *pNewData );
     311             : 
     312             :                     // Insert sorted!!
     313           0 :                     for( n = 1; n < pTableTbl->size(); ++n )
     314           0 :                         if( (*pTableTbl)[ n ].GetName() > aFormatName )
     315           0 :                             break;
     316             : 
     317           0 :                     pTableTbl->InsertAutoFmt(n, pNewData);
     318           0 :                     m_pLbFormat->InsertEntry( aFormatName, nDfltStylePos + n );
     319           0 :                     m_pLbFormat->SelectEntryPos( nDfltStylePos + n );
     320           0 :                     bFmtInserted = true;
     321           0 :                     m_pBtnAdd->Enable( false );
     322           0 :                     if ( !bCoreDataChanged )
     323             :                     {
     324           0 :                         m_pBtnCancel->SetText( aStrClose );
     325           0 :                         bCoreDataChanged = sal_True;
     326             :                     }
     327             : 
     328           0 :                     SelFmtHdl( 0 );
     329           0 :                     bOk = true;
     330             :                 }
     331             :             }
     332             : 
     333           0 :             if( !bFmtInserted )
     334             :             {
     335             :                 bOk = RET_CANCEL == MessageDialog(this, aStrInvalidFmt, VCL_MESSAGE_ERROR, VCL_BUTTONS_OK_CANCEL)
     336           0 :                                     .Execute();
     337           0 :             }
     338             :         }
     339             :         else
     340           0 :             bOk = true;
     341           0 :         delete pDlg;
     342             :     }
     343           0 :     return 0;
     344             : }
     345             : 
     346           0 : IMPL_LINK_NOARG(SwAutoFormatDlg, RemoveHdl)
     347             : {
     348           0 :     OUString aMessage = aStrDelMsg;
     349           0 :     aMessage += "\n\n";
     350           0 :     aMessage += m_pLbFormat->GetSelectEntry();
     351           0 :     aMessage += "\n";
     352             : 
     353             :     MessBox* pBox = new MessBox( this, WinBits( WB_OK_CANCEL ),
     354           0 :                                     aStrDelTitle, aMessage);
     355             : 
     356           0 :     if ( pBox->Execute() == RET_OK )
     357             :     {
     358           0 :         m_pLbFormat->RemoveEntry( nDfltStylePos + nIndex );
     359           0 :         m_pLbFormat->SelectEntryPos( nDfltStylePos + nIndex-1 );
     360             : 
     361           0 :         pTableTbl->EraseAutoFmt(nIndex);
     362           0 :         nIndex--;
     363             : 
     364           0 :         if( !nIndex )
     365             :         {
     366           0 :             m_pBtnRemove->Enable(false);
     367           0 :             m_pBtnRename->Enable(false);
     368             :         }
     369             : 
     370           0 :         if( !bCoreDataChanged )
     371             :         {
     372           0 :             m_pBtnCancel->SetText( aStrClose );
     373           0 :             bCoreDataChanged = sal_True;
     374             :         }
     375             :     }
     376           0 :     delete pBox;
     377             : 
     378           0 :     SelFmtHdl( 0 );
     379             : 
     380           0 :     return 0;
     381             : }
     382             : 
     383           0 : IMPL_LINK_NOARG(SwAutoFormatDlg, RenameHdl)
     384             : {
     385           0 :     bool bOk = false;
     386           0 :     while( !bOk )
     387             :     {
     388             :         SwStringInputDlg* pDlg = new SwStringInputDlg( this,
     389             :                                                        aStrRenameTitle,
     390             :                                                        m_pLbFormat->GetSelectEntry(),
     391           0 :                                                        OUString() );
     392           0 :         if( pDlg->Execute() == RET_OK )
     393             :         {
     394           0 :             bool bFmtRenamed = false;
     395           0 :             const OUString aFormatName( pDlg->GetInputString() );
     396             : 
     397           0 :             if ( !aFormatName.isEmpty() )
     398             :             {
     399             :                 size_t n;
     400           0 :                 for( n = 0; n < pTableTbl->size(); ++n )
     401           0 :                     if ((*pTableTbl)[n].GetName() == aFormatName)
     402           0 :                         break;
     403             : 
     404           0 :                 if( n >= pTableTbl->size() )
     405             :                 {
     406             :                     // no format with this name exists, so rename it
     407           0 :                     m_pLbFormat->RemoveEntry( nDfltStylePos + nIndex );
     408           0 :                     SwTableAutoFmt* p = pTableTbl->ReleaseAutoFmt( nIndex );
     409             : 
     410           0 :                     p->SetName( aFormatName );
     411             : 
     412             :                     // keep all arrays sorted!
     413           0 :                     for( n = 1; n < pTableTbl->size(); ++n )
     414           0 :                         if ((*pTableTbl)[n].GetName() > aFormatName)
     415             :                         {
     416           0 :                             break;
     417             :                         }
     418             : 
     419           0 :                     pTableTbl->InsertAutoFmt( n, p );
     420           0 :                     m_pLbFormat->InsertEntry( aFormatName, nDfltStylePos + n );
     421           0 :                     m_pLbFormat->SelectEntryPos( nDfltStylePos + n );
     422             : 
     423           0 :                     if ( !bCoreDataChanged )
     424             :                     {
     425           0 :                         m_pBtnCancel->SetText( aStrClose );
     426           0 :                         bCoreDataChanged = sal_True;
     427             :                     }
     428             : 
     429           0 :                     SelFmtHdl( 0 );
     430           0 :                     bOk = true;
     431           0 :                     bFmtRenamed = true;
     432             :                 }
     433             :             }
     434             : 
     435           0 :             if( !bFmtRenamed )
     436             :             {
     437             :                 bOk = RET_CANCEL == MessageDialog(this, aStrInvalidFmt, VCL_MESSAGE_ERROR, VCL_BUTTONS_OK_CANCEL)
     438           0 :                                     .Execute();
     439           0 :             }
     440             :         }
     441             :         else
     442           0 :             bOk = true;
     443           0 :         delete pDlg;
     444             :     }
     445           0 :     return 0;
     446             : }
     447             : 
     448           0 : IMPL_LINK_NOARG(SwAutoFormatDlg, SelFmtHdl)
     449             : {
     450           0 :     sal_Bool bBtnEnable = sal_False;
     451           0 :     sal_uInt8 nSelPos = (sal_uInt8) m_pLbFormat->GetSelectEntryPos(), nOldIdx = nIndex;
     452           0 :     if( nSelPos >= nDfltStylePos )
     453             :     {
     454           0 :         nIndex = nSelPos - nDfltStylePos;
     455           0 :         m_pWndPreview->NotifyChange( (*pTableTbl)[nIndex] );
     456           0 :         bBtnEnable = 0 != nIndex;
     457           0 :         UpdateChecks( (*pTableTbl)[nIndex], sal_True );
     458             :     }
     459             :     else
     460             :     {
     461           0 :         nIndex = 255;
     462             : 
     463           0 :         SwTableAutoFmt aTmp( SwViewShell::GetShellRes()->aStrNone );
     464           0 :         aTmp.SetFont( sal_False );
     465           0 :         aTmp.SetJustify( sal_False );
     466           0 :         aTmp.SetFrame( sal_False );
     467           0 :         aTmp.SetBackground( sal_False );
     468           0 :         aTmp.SetValueFormat( sal_False );
     469           0 :         aTmp.SetWidthHeight( sal_False );
     470             : 
     471           0 :         if( nOldIdx != nIndex )
     472           0 :             m_pWndPreview->NotifyChange( aTmp );
     473           0 :         UpdateChecks( aTmp, sal_False );
     474             :     }
     475             : 
     476           0 :     m_pBtnRemove->Enable( bBtnEnable );
     477           0 :     m_pBtnRename->Enable( bBtnEnable );
     478             : 
     479           0 :     return 0;
     480             : }
     481             : 
     482           0 : IMPL_LINK_NOARG_INLINE_START(SwAutoFormatDlg, OkHdl)
     483             : {
     484           0 :     if( bSetAutoFmt )
     485           0 :         pShell->SetTableAutoFmt( (*pTableTbl)[ nIndex ] );
     486           0 :     EndDialog( RET_OK );
     487           0 :     return sal_True;
     488             : }
     489           0 : IMPL_LINK_NOARG_INLINE_END(SwAutoFormatDlg, OkHdl)
     490             : 
     491             : // AutoFmtPreview
     492             : 
     493           0 : AutoFmtPreview::AutoFmtPreview(Window* pParent) :
     494             :         Window          ( pParent ),
     495             :         aCurData        ( OUString() ),
     496             :         aVD             ( *this ),
     497             :         aScriptedText   ( aVD ),
     498             :         bFitWidth       ( sal_False ),
     499             :         mbRTL           ( false ),
     500             :         aStrJan         ( SW_RES( STR_JAN ) ),
     501             :         aStrFeb         ( SW_RES( STR_FEB ) ),
     502             :         aStrMar         ( SW_RES( STR_MAR ) ),
     503             :         aStrNorth       ( SW_RES( STR_NORTH ) ),
     504             :         aStrMid         ( SW_RES( STR_MID ) ),
     505             :         aStrSouth       ( SW_RES( STR_SOUTH ) ),
     506           0 :         aStrSum         ( SW_RES( STR_SUM ) )
     507             : {
     508           0 :     uno::Reference< uno::XComponentContext > xContext = comphelper::getProcessComponentContext();
     509           0 :     m_xBreak = i18n::BreakIterator::create(xContext);
     510           0 :     pNumFmt = new SvNumberFormatter( xContext, LANGUAGE_SYSTEM );
     511             : 
     512           0 :     Init();
     513           0 : }
     514             : 
     515           0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeAutoFmtPreview(Window *pParent, VclBuilder::stringmap &)
     516             : {
     517           0 :     return new AutoFmtPreview(pParent);
     518             : }
     519             : 
     520           0 : void AutoFmtPreview::Resize()
     521             : {
     522           0 :     aPrvSize = Size(GetSizePixel().Width() - 6, GetSizePixel().Height() - 30);
     523           0 :     nLabelColWidth = (aPrvSize.Width() - 4) / 4 - 12;
     524           0 :     nDataColWidth1 = (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 3;
     525           0 :     nDataColWidth2 = (aPrvSize.Width() - 4 - 2 * nLabelColWidth) / 4;
     526           0 :     nRowHeight = (aPrvSize.Height() - 4) / 5;
     527           0 :     NotifyChange(aCurData);
     528           0 : }
     529             : 
     530           0 : void AutoFmtPreview::DetectRTL(SwWrtShell* pWrtShell)
     531             : {
     532           0 :     if (!pWrtShell->IsCrsrInTbl()) // We haven't created the table yet
     533           0 :         mbRTL = Application::GetSettings().GetLayoutRTL();
     534             :     else
     535           0 :         mbRTL = pWrtShell->IsTableRightToLeft();
     536           0 : }
     537             : 
     538           0 : AutoFmtPreview::~AutoFmtPreview()
     539             : {
     540           0 :     delete pNumFmt;
     541           0 : }
     542             : 
     543           0 : static void lcl_SetFontProperties(
     544             :         Font& rFont,
     545             :         const SvxFontItem& rFontItem,
     546             :         const SvxWeightItem& rWeightItem,
     547             :         const SvxPostureItem& rPostureItem )
     548             : {
     549           0 :     rFont.SetFamily     ( rFontItem.GetFamily() );
     550           0 :     rFont.SetName       ( rFontItem.GetFamilyName() );
     551           0 :     rFont.SetStyleName  ( rFontItem.GetStyleName() );
     552           0 :     rFont.SetCharSet    ( rFontItem.GetCharSet() );
     553           0 :     rFont.SetPitch      ( rFontItem.GetPitch() );
     554           0 :     rFont.SetWeight     ( (FontWeight)rWeightItem.GetValue() );
     555           0 :     rFont.SetItalic     ( (FontItalic)rPostureItem.GetValue() );
     556           0 : }
     557             : 
     558             : #define SETONALLFONTS( MethodName, Value )                  \
     559             : rFont.MethodName( Value );                                  \
     560             : rCJKFont.MethodName( Value );                               \
     561             : rCTLFont.MethodName( Value );
     562             : 
     563           0 : void AutoFmtPreview::MakeFonts( sal_uInt8 nIndex, Font& rFont, Font& rCJKFont, Font& rCTLFont )
     564             : {
     565           0 :     const SwBoxAutoFmt& rBoxFmt = aCurData.GetBoxFmt( nIndex );
     566             : 
     567           0 :     rFont = rCJKFont = rCTLFont = GetFont();
     568           0 :     Size aFontSize( rFont.GetSize().Width(), 10 * GetDPIScaleFactor() );
     569             : 
     570           0 :     lcl_SetFontProperties( rFont, rBoxFmt.GetFont(), rBoxFmt.GetWeight(), rBoxFmt.GetPosture() );
     571           0 :     lcl_SetFontProperties( rCJKFont, rBoxFmt.GetCJKFont(), rBoxFmt.GetCJKWeight(), rBoxFmt.GetCJKPosture() );
     572           0 :     lcl_SetFontProperties( rCTLFont, rBoxFmt.GetCTLFont(), rBoxFmt.GetCTLWeight(), rBoxFmt.GetCTLPosture() );
     573             : 
     574           0 :     SETONALLFONTS( SetUnderline,    (FontUnderline)rBoxFmt.GetUnderline().GetValue() );
     575           0 :     SETONALLFONTS( SetOverline,     (FontUnderline)rBoxFmt.GetOverline().GetValue() );
     576           0 :     SETONALLFONTS( SetStrikeout,    (FontStrikeout)rBoxFmt.GetCrossedOut().GetValue() );
     577           0 :     SETONALLFONTS( SetOutline,      rBoxFmt.GetContour().GetValue() );
     578           0 :     SETONALLFONTS( SetShadow,       rBoxFmt.GetShadowed().GetValue() );
     579           0 :     SETONALLFONTS( SetColor,        rBoxFmt.GetColor().GetValue() );
     580           0 :     SETONALLFONTS( SetSize,         aFontSize );
     581           0 :     SETONALLFONTS( SetTransparent,  true );
     582           0 : }
     583             : 
     584           0 : sal_uInt8 AutoFmtPreview::GetFormatIndex( size_t nCol, size_t nRow ) const
     585             : {
     586             :     static const sal_uInt8 pnFmtMap[] =
     587             :     {
     588             :         0,  1,  2,  1,  3,
     589             :         4,  5,  6,  5,  7,
     590             :         8,  9,  10, 9,  11,
     591             :         4,  5,  6,  5,  7,
     592             :         12, 13, 14, 13, 15
     593             :     };
     594           0 :     return pnFmtMap[ maArray.GetCellIndex( nCol, nRow, mbRTL ) ];
     595             : }
     596             : 
     597           0 : const SvxBoxItem& AutoFmtPreview::GetBoxItem( size_t nCol, size_t nRow ) const
     598             : {
     599           0 :     return aCurData.GetBoxFmt( GetFormatIndex( nCol, nRow ) ).GetBox();
     600             : }
     601             : 
     602           0 : void AutoFmtPreview::DrawString( size_t nCol, size_t nRow )
     603             : {
     604             :     // Output of the cell text:
     605             :     sal_uLong   nNum;
     606             :     double  nVal;
     607           0 :     OUString cellString;
     608           0 :     sal_uInt8    nIndex = static_cast< sal_uInt8 >( maArray.GetCellIndex( nCol, nRow, mbRTL ) );
     609             : 
     610           0 :     switch( nIndex )
     611             :     {
     612           0 :     case  1: cellString = aStrJan;          break;
     613           0 :     case  2: cellString = aStrFeb;          break;
     614           0 :     case  3: cellString = aStrMar;          break;
     615           0 :     case  5: cellString = aStrNorth;        break;
     616           0 :     case 10: cellString = aStrMid;          break;
     617           0 :     case 15: cellString = aStrSouth;        break;
     618             :     case  4:
     619           0 :     case 20: cellString = aStrSum;          break;
     620             : 
     621             :     case  6:
     622             :     case  8:
     623             :     case 16:
     624           0 :     case 18:    nVal = nIndex;
     625           0 :         nNum = 5;
     626           0 :         goto MAKENUMSTR;
     627             :     case 17:
     628           0 :     case  7:    nVal = nIndex;
     629           0 :         nNum = 6;
     630           0 :         goto MAKENUMSTR;
     631             :     case 11:
     632             :     case 12:
     633           0 :     case 13:    nVal = nIndex;
     634           0 :         nNum = 12 == nIndex ? 10 : 9;
     635           0 :         goto MAKENUMSTR;
     636             : 
     637           0 :     case  9:    nVal = 21; nNum = 7;    goto MAKENUMSTR;
     638           0 :     case 14:    nVal = 36; nNum = 11;   goto MAKENUMSTR;
     639           0 :     case 19:    nVal = 51; nNum = 7;    goto MAKENUMSTR;
     640           0 :     case 21:    nVal = 33; nNum = 13;   goto MAKENUMSTR;
     641           0 :     case 22:    nVal = 36; nNum = 14;   goto MAKENUMSTR;
     642           0 :     case 23:    nVal = 39; nNum = 13;   goto MAKENUMSTR;
     643           0 :     case 24:    nVal = 108; nNum = 15;  goto MAKENUMSTR;
     644             : MAKENUMSTR:
     645           0 :         if( aCurData.IsValueFormat() )
     646             :         {
     647           0 :             OUString sFmt;
     648             :             LanguageType eLng, eSys;
     649           0 :             aCurData.GetBoxFmt( (sal_uInt8)nNum ).GetValueFormat( sFmt, eLng, eSys );
     650             : 
     651             :             short nType;
     652             :             bool bNew;
     653             :             sal_Int32 nCheckPos;
     654             :             sal_uInt32 nKey = pNumFmt->GetIndexPuttingAndConverting( sFmt, eLng,
     655           0 :                                                                      eSys, nType, bNew, nCheckPos);
     656             :             Color* pDummy;
     657           0 :             pNumFmt->GetOutputString( nVal, nKey, cellString, &pDummy );
     658             :         }
     659             :         else
     660           0 :             cellString = OUString::number((sal_Int32)nVal);
     661           0 :         break;
     662             : 
     663             :     }
     664             : 
     665           0 :     if( !cellString.isEmpty() )
     666             :     {
     667           0 :         Size                aStrSize;
     668           0 :         sal_uInt8           nFmtIndex       = GetFormatIndex( nCol, nRow );
     669           0 :         Rectangle           cellRect        = maArray.GetCellRect( nCol, nRow );
     670           0 :         Point               aPos            = cellRect.TopLeft();
     671           0 :         long                nRightX         = 0;
     672             : 
     673           0 :         Size theMaxStrSize( cellRect.GetWidth() - FRAME_OFFSET,
     674           0 :                             cellRect.GetHeight() - FRAME_OFFSET );
     675           0 :         if( aCurData.IsFont() )
     676             :         {
     677           0 :             Font aFont, aCJKFont, aCTLFont;
     678           0 :             MakeFonts( nFmtIndex, aFont, aCJKFont, aCTLFont );
     679           0 :             aScriptedText.SetFonts( &aFont, &aCJKFont, &aCTLFont );
     680             :         }
     681             :         else
     682           0 :             aScriptedText.SetDefaultFont();
     683             : 
     684           0 :         aScriptedText.SetText( cellString, m_xBreak );
     685           0 :         aStrSize = aScriptedText.GetTextSize();
     686             : 
     687           0 :         if( aCurData.IsFont() &&
     688           0 :             theMaxStrSize.Height() < aStrSize.Height() )
     689             :         {
     690             :                 // If the string in this font does not
     691             :                 // fit into the cell, the standard font
     692             :                 // is taken again:
     693           0 :                 aScriptedText.SetDefaultFont();
     694           0 :                 aStrSize = aScriptedText.GetTextSize();
     695             :         }
     696             : 
     697           0 :         while( theMaxStrSize.Width() <= aStrSize.Width() &&
     698           0 :                 cellString.getLength() > 1 )
     699             :         {
     700           0 :             cellString = cellString.copy(0, cellString.getLength() - 1 );
     701           0 :             aScriptedText.SetText( cellString, m_xBreak );
     702           0 :             aStrSize = aScriptedText.GetTextSize();
     703             :         }
     704             : 
     705           0 :         nRightX = cellRect.GetWidth() - aStrSize.Width() - FRAME_OFFSET;
     706             : 
     707             :         // vertical (always centering):
     708           0 :         aPos.Y() += (nRowHeight - aStrSize.Height()) / 2;
     709             : 
     710             :         // horizontal
     711           0 :         if( mbRTL )
     712           0 :             aPos.X() += nRightX;
     713           0 :         else if (aCurData.IsJustify())
     714             :         {
     715           0 :             const SvxAdjustItem& rAdj = aCurData.GetBoxFmt(nFmtIndex).GetAdjust();
     716           0 :             switch ( rAdj.GetAdjust() )
     717             :             {
     718             :                 case SVX_ADJUST_LEFT:
     719           0 :                     aPos.X() += FRAME_OFFSET;
     720           0 :                     break;
     721             :                 case SVX_ADJUST_RIGHT:
     722           0 :                     aPos.X() += nRightX;
     723           0 :                     break;
     724             :                 default:
     725           0 :                     aPos.X() += (cellRect.GetWidth() - aStrSize.Width())/2;
     726           0 :                     break;
     727             :             }
     728             :         }
     729             :         else
     730             :         {
     731             :             // Standard align:
     732           0 :             if ( (nCol == 0) || (nIndex == 4) )
     733             :             {
     734             :                 // Text-Label left or sum left aligned
     735           0 :                 aPos.X() += FRAME_OFFSET;
     736             :             }
     737             :             else
     738             :             {
     739             :                     // numbers/dates right aligned
     740           0 :                 aPos.X() += nRightX;
     741             :             }
     742             :         }
     743             : 
     744           0 :         aScriptedText.DrawText( aPos );
     745           0 :     }
     746           0 : }
     747             : 
     748             : #undef FRAME_OFFSET
     749             : 
     750           0 : void AutoFmtPreview::DrawStrings()
     751             : {
     752           0 :     for( size_t nRow = 0; nRow < 5; ++nRow )
     753           0 :         for( size_t nCol = 0; nCol < 5; ++nCol )
     754           0 :             DrawString( nCol, nRow );
     755           0 : }
     756             : 
     757           0 : void AutoFmtPreview::DrawBackground()
     758             : {
     759           0 :     for( size_t nRow = 0; nRow < 5; ++nRow )
     760             :     {
     761           0 :         for( size_t nCol = 0; nCol < 5; ++nCol )
     762             :         {
     763           0 :             SvxBrushItem aBrushItem( aCurData.GetBoxFmt( GetFormatIndex( nCol, nRow ) ).GetBackground() );
     764             : 
     765           0 :             aVD.Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
     766           0 :             aVD.SetLineColor();
     767           0 :             aVD.SetFillColor( aBrushItem.GetColor() );
     768           0 :             aVD.DrawRect( maArray.GetCellRect( nCol, nRow ) );
     769           0 :             aVD.Pop();
     770           0 :         }
     771             :     }
     772           0 : }
     773             : 
     774           0 : void AutoFmtPreview::PaintCells()
     775             : {
     776             :     // 1) background
     777           0 :     if ( aCurData.IsBackground() )
     778           0 :         DrawBackground();
     779             : 
     780             :     // 2) values
     781           0 :     DrawStrings();
     782             : 
     783             :     // 3) border
     784           0 :     if ( aCurData.IsFrame() )
     785           0 :         maArray.DrawArray( aVD );
     786           0 : }
     787             : 
     788           0 : void AutoFmtPreview::Init()
     789             : {
     790           0 :     SetBorderStyle( GetBorderStyle() | WINDOW_BORDER_MONO );
     791           0 :     maArray.Initialize( 5, 5 );
     792           0 :     maArray.SetUseDiagDoubleClipping( false );
     793           0 :     CalcCellArray( sal_False );
     794           0 :     CalcLineMap();
     795           0 : }
     796             : 
     797           0 : void AutoFmtPreview::CalcCellArray( sal_Bool _bFitWidth )
     798             : {
     799           0 :     maArray.SetXOffset( 2 );
     800           0 :     maArray.SetAllColWidths( _bFitWidth ? nDataColWidth2 : nDataColWidth1 );
     801           0 :     maArray.SetColWidth( 0, nLabelColWidth );
     802           0 :     maArray.SetColWidth( 4, nLabelColWidth );
     803             : 
     804           0 :     maArray.SetYOffset( 2 );
     805           0 :     maArray.SetAllRowHeights( nRowHeight );
     806             : 
     807           0 :     aPrvSize.Width() = maArray.GetWidth() + 4;
     808           0 :     aPrvSize.Height() = maArray.GetHeight() + 4;
     809           0 : }
     810             : 
     811           0 : inline void lclSetStyleFromBorder( svx::frame::Style& rStyle, const ::editeng::SvxBorderLine* pBorder )
     812             : {
     813           0 :     rStyle.Set( pBorder, 0.05, 5 );
     814           0 : }
     815             : 
     816           0 : void AutoFmtPreview::CalcLineMap()
     817             : {
     818           0 :     for( size_t nRow = 0; nRow < 5; ++nRow )
     819             :     {
     820           0 :         for( size_t nCol = 0; nCol < 5; ++nCol )
     821             :         {
     822           0 :             svx::frame::Style aStyle;
     823             : 
     824           0 :             const SvxBoxItem& rItem = GetBoxItem( nCol, nRow );
     825           0 :             lclSetStyleFromBorder( aStyle, rItem.GetLeft() );
     826           0 :             maArray.SetCellStyleLeft( nCol, nRow, aStyle );
     827           0 :             lclSetStyleFromBorder( aStyle, rItem.GetRight() );
     828           0 :             maArray.SetCellStyleRight( nCol, nRow, aStyle );
     829           0 :             lclSetStyleFromBorder( aStyle, rItem.GetTop() );
     830           0 :             maArray.SetCellStyleTop( nCol, nRow, aStyle );
     831           0 :             lclSetStyleFromBorder( aStyle, rItem.GetBottom() );
     832           0 :             maArray.SetCellStyleBottom( nCol, nRow, aStyle );
     833             : 
     834             : // FIXME - uncomment to draw diagonal borders
     835             : //            lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, true ).GetLine() );
     836             : //            maArray.SetCellStyleTLBR( nCol, nRow, aStyle );
     837             : //            lclSetStyleFromBorder( aStyle, GetDiagItem( nCol, nRow, false ).GetLine() );
     838             : //            maArray.SetCellStyleBLTR( nCol, nRow, aStyle );
     839             :         }
     840             :     }
     841           0 : }
     842             : 
     843           0 : void AutoFmtPreview::NotifyChange( const SwTableAutoFmt& rNewData )
     844             : {
     845           0 :     aCurData  = rNewData;
     846           0 :     bFitWidth = aCurData.IsJustify();//sal_True;  //???
     847           0 :     CalcCellArray( bFitWidth );
     848           0 :     CalcLineMap();
     849           0 :     DoPaint( Rectangle( Point(0,0), GetSizePixel() ) );
     850           0 : }
     851             : 
     852           0 : void AutoFmtPreview::DoPaint( const Rectangle& /*rRect*/ )
     853             : {
     854           0 :     sal_uInt32 nOldDrawMode = aVD.GetDrawMode();
     855           0 :     if( GetSettings().GetStyleSettings().GetHighContrastMode() )
     856           0 :         aVD.SetDrawMode( DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT );
     857             : 
     858           0 :     Bitmap  thePreview;
     859           0 :     Point   aCenterPos;
     860           0 :     Size    theWndSize = GetSizePixel();
     861           0 :     Color   oldColor;
     862           0 :     Font    aFont;
     863             : 
     864           0 :     aFont = aVD.GetFont();
     865           0 :     aFont.SetTransparent( true );
     866             : 
     867           0 :     aVD.SetFont          ( aFont );
     868           0 :     aVD.SetLineColor     ();
     869           0 :     const Color& rWinColor = GetSettings().GetStyleSettings().GetWindowColor();
     870           0 :     aVD.SetBackground    ( Wallpaper(rWinColor) );
     871           0 :     aVD.SetFillColor     ( rWinColor );
     872           0 :     aVD.SetOutputSizePixel  ( aPrvSize );
     873             : 
     874             :     // Draw cells on virtual device
     875             :     // and save the result
     876           0 :     PaintCells();
     877           0 :     thePreview = aVD.GetBitmap( Point(0,0), aPrvSize );
     878             : 
     879             :     // Draw the Frame and center the preview:
     880             :     // (virtual Device for window output)
     881           0 :     aVD.SetOutputSizePixel( theWndSize );
     882           0 :     oldColor = aVD.GetLineColor();
     883           0 :     aVD.SetLineColor();
     884           0 :     aVD.DrawRect( Rectangle( Point(0,0), theWndSize ) );
     885           0 :     SetLineColor( oldColor );
     886           0 :     aCenterPos  = Point( (theWndSize.Width()  - aPrvSize.Width() ) / 2,
     887           0 :                          (theWndSize.Height() - aPrvSize.Height()) / 2 );
     888           0 :     aVD.DrawBitmap( aCenterPos, thePreview );
     889             : 
     890             :     // Output in the preview window:
     891           0 :     DrawBitmap( Point(0,0), aVD.GetBitmap( Point(0,0), theWndSize ) );
     892             : 
     893           0 :     aVD.SetDrawMode( nOldDrawMode );
     894           0 : }
     895             : 
     896           0 : void AutoFmtPreview::Paint( const Rectangle& rRect )
     897             : {
     898           0 :     DoPaint( rRect );
     899           0 : }
     900             : 
     901             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10