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

Generated by: LCOV version 1.10