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

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <hintids.hxx>
      21             : 
      22             : #include "cmdid.h"
      23             : #include "swmodule.hxx"
      24             : #include "view.hxx"
      25             : #include "wrtsh.hxx"
      26             : #include "globals.hrc"
      27             : 
      28             : #include <vcl/metric.hxx>
      29             : #include <vcl/settings.hxx>
      30             : 
      31             : #include <svl/stritem.hxx>
      32             : #include <editeng/fontitem.hxx>
      33             : #include <sfx2/dialoghelper.hxx>
      34             : #include <sfx2/htmlmode.hxx>
      35             : #include <sfx2/objsh.hxx>
      36             : #include <editeng/svxfont.hxx>
      37             : #include <vcl/print.hxx>
      38             : #include <sfx2/printer.hxx>
      39             : #include <com/sun/star/i18n/ScriptType.hpp>
      40             : #include <editeng/scripttypeitem.hxx>
      41             : #include <com/sun/star/i18n/BreakIterator.hpp>
      42             : #include <comphelper/processfactory.hxx>
      43             : 
      44             : #include "charatr.hxx"
      45             : #include "viewopt.hxx"
      46             : #include "drpcps.hxx"
      47             : #include "paratr.hxx"
      48             : #include "uitool.hxx"
      49             : #include "charfmt.hxx"
      50             : 
      51             : #include "chrdlg.hrc"
      52             : 
      53             : using namespace css;
      54             : using namespace css::uno;
      55             : using namespace css::lang;
      56             : 
      57             : // Globals ******************************************************************
      58             : 
      59             : static sal_uInt16 aPageRg[] = {
      60             :     RES_PARATR_DROP, RES_PARATR_DROP,
      61             :     0
      62             : };
      63             : 
      64             : class SwDropCapsPict : public Control
      65             : {
      66             :     SwDropCapsPage* mpPage;
      67             :     OUString        maText;
      68             :     OUString        maScriptText;
      69             :     Color           maBackColor;
      70             :     Color           maTextLineColor;
      71             :     sal_uInt8       mnLines;
      72             :     long            mnTotLineH;
      73             :     long            mnLineH;
      74             :     long            mnTextH;
      75             :     sal_uInt16      mnDistance;
      76             :     Printer*        mpPrinter;
      77             :     bool            mbDelPrinter;
      78             :     /// The _ScriptInfo structure holds information on where we change from one
      79             :     /// script to another.
      80             :     struct _ScriptInfo
      81             :     {
      82             :         sal_uLong  textWidth;   ///< Physical width of this segment.
      83             :         sal_uInt16 scriptType;  ///< Script type (e.g. Latin, Asian, Complex)
      84             :         sal_Int32 changePos;   ///< Character position where the script changes.
      85           0 :         _ScriptInfo(sal_uLong txtWidth, sal_uInt16 scrptType, sal_Int32 position)
      86           0 :             : textWidth(txtWidth), scriptType(scrptType), changePos(position) {}
      87             :         bool operator<(_ScriptInfo other) { return changePos < other.changePos; }
      88             :     };
      89             :     std::vector<_ScriptInfo> maScriptChanges;
      90             :     SvxFont         maFont;
      91             :     SvxFont         maCJKFont;
      92             :     SvxFont         maCTLFont;
      93             :     Size            maTextSize;
      94             :     Reference< css::i18n::XBreakIterator >   xBreak;
      95             : 
      96             :     virtual void    Paint(const Rectangle &rRect) SAL_OVERRIDE;
      97             :     void            CheckScript( void );
      98             :     Size            CalcTextSize( void );
      99             :     inline void     InitPrinter( void );
     100             :     void            _InitPrinter( void );
     101             :     void            GetFontSettings( const SwDropCapsPage& _rPage, Font& _rFont, sal_uInt16 _nWhich );
     102             :     void            GetFirstScriptSegment(sal_Int32 &start, sal_Int32 &end, sal_uInt16 &scriptType);
     103             :     bool            GetNextScriptSegment(size_t &nIdx, sal_Int32 &start, sal_Int32 &end, sal_uInt16 &scriptType);
     104             : 
     105             : public:
     106             : 
     107           0 :     SwDropCapsPict(Window *pParent, WinBits nBits)
     108             :         : Control(pParent, nBits)
     109             :         , mpPage(NULL)
     110             :         , mnLines(0)
     111             :         , mnTotLineH(0)
     112             :         , mnLineH(0)
     113             :         , mnTextH(0)
     114             :         , mnDistance(0)
     115             :         , mpPrinter(NULL)
     116           0 :         , mbDelPrinter(false)
     117           0 :     {}
     118             : 
     119           0 :     void SetDropCapsPage(SwDropCapsPage* pPage) { mpPage = pPage; }
     120             : 
     121             :     virtual ~SwDropCapsPict();
     122             : 
     123             :     void UpdatePaintSettings( void );       // also invalidates control!
     124             : 
     125             :     virtual void Resize() SAL_OVERRIDE;
     126             :     virtual Size GetOptimalSize() const SAL_OVERRIDE;
     127             : 
     128             :     void SetText( const OUString& rT ) SAL_OVERRIDE;
     129             :     void SetLines( sal_uInt8 nL );
     130             :     void SetDistance( sal_uInt16 nD );
     131             :     void SetValues( const OUString& rText, sal_uInt8 nLines, sal_uInt16 nDistance );
     132             : 
     133             :     void        DrawPrev( const Point& rPt );
     134             : };
     135             : 
     136           0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeSwDropCapsPict(Window *pParent, VclBuilder::stringmap &)
     137             : {
     138           0 :     return new SwDropCapsPict(pParent, WB_BORDER);
     139             : }
     140             : 
     141           0 : void SwDropCapsPict::SetText( const OUString& rT )
     142             : {
     143           0 :     maText = rT;
     144           0 :     UpdatePaintSettings();
     145           0 : }
     146             : 
     147           0 : Size SwDropCapsPict::GetOptimalSize() const
     148             : {
     149           0 :     return getParagraphPreviewOptimalSize(this);
     150             : }
     151             : 
     152           0 : void SwDropCapsPict::Resize()
     153             : {
     154           0 :     Control::Resize();
     155           0 :     UpdatePaintSettings();
     156           0 : }
     157             : 
     158           0 : void SwDropCapsPict::SetLines( sal_uInt8 nL )
     159             : {
     160           0 :     mnLines = nL;
     161           0 :     UpdatePaintSettings();
     162           0 : }
     163             : 
     164           0 : void SwDropCapsPict::SetDistance( sal_uInt16 nD )
     165             : {
     166           0 :     mnDistance = nD;
     167           0 :     UpdatePaintSettings();
     168           0 : }
     169             : 
     170           0 : void SwDropCapsPict::SetValues( const OUString& rText, sal_uInt8 nLines, sal_uInt16 nDistance )
     171             : {
     172           0 :     maText = rText;
     173           0 :     mnLines = nLines;
     174           0 :     mnDistance = nDistance;
     175             : 
     176           0 :     UpdatePaintSettings();
     177           0 : }
     178             : 
     179           0 : void SwDropCapsPict::InitPrinter( void )
     180             : {
     181           0 :     if( !mpPrinter )
     182           0 :         _InitPrinter();
     183           0 : }
     184             : 
     185             : /****************************************************************************
     186             :  Create Default-String from character-count (A, AB, ABC, ...)
     187             : ****************************************************************************/
     188             : 
     189           0 : OUString GetDefaultString(sal_uInt16 nChars)
     190             : {
     191           0 :     OUString aStr;
     192           0 :     for (sal_uInt16 i = 0; i < nChars; i++)
     193           0 :         aStr += OUString((char) (i + 65));
     194           0 :     return aStr;
     195             : }
     196             : 
     197           0 : static void calcFontHeightAnyAscent( OutputDevice* _pWin, Font& _rFont, long& _nHeight, long& _nAscent )
     198             : {
     199           0 :     if ( !_nHeight )
     200             :     {
     201           0 :         _pWin->SetFont( _rFont );
     202           0 :         FontMetric aMetric( _pWin->GetFontMetric() );
     203           0 :         _nHeight = aMetric.GetLineHeight();
     204           0 :         _nAscent = aMetric.GetAscent();
     205             :     }
     206           0 : }
     207             : 
     208           0 : SwDropCapsPict::~SwDropCapsPict()
     209             : {
     210           0 :      if( mbDelPrinter )
     211           0 :          delete mpPrinter;
     212           0 : }
     213             : 
     214             : /// Get the details of the first script change.
     215             : /// @param[out] start      The character position of the start of the segment.
     216             : /// @param[out] end        The character position of the end of the segment.
     217             : /// @param[out] scriptType The script type (Latin, Asian, Complex etc.)
     218           0 : void SwDropCapsPict::GetFirstScriptSegment(sal_Int32 &start, sal_Int32 &end, sal_uInt16 &scriptType)
     219             : {
     220           0 :     start = 0;
     221           0 :     if( maScriptChanges.empty() )
     222             :     {
     223           0 :         end = maText.getLength();
     224           0 :         scriptType = css::i18n::ScriptType::LATIN;
     225             :     }
     226             :     else
     227             :     {
     228           0 :         end = maScriptChanges[ 0 ].changePos;
     229           0 :         scriptType = maScriptChanges[ 0 ].scriptType;
     230             :     }
     231           0 : }
     232             : 
     233             : /// Get the details of the first script change.
     234             : /// @param[in,out] nIdx       Index of the current script change.
     235             : /// @param[out]    start      The character position of the start of the segment.
     236             : /// @param[in,out] end        The character position of the end of the segment.
     237             : /// @param[out]    scriptType The script type (Latin, Asian, Complex etc.)
     238             : /// @returns True if there was a next segment, false if not.
     239           0 : bool SwDropCapsPict::GetNextScriptSegment(size_t &nIdx, sal_Int32 &start, sal_Int32 &end, sal_uInt16 &scriptType)
     240             : {
     241           0 :     if (maScriptChanges.empty() || nIdx >= maScriptChanges.size() - 1 || end >= maText.getLength())
     242           0 :         return false;
     243           0 :     start = maScriptChanges[nIdx++].changePos;
     244           0 :     end = maScriptChanges[ nIdx ].changePos;
     245           0 :     scriptType = maScriptChanges[ nIdx ].scriptType;
     246           0 :     return true;
     247             : }
     248             : 
     249             : #define LINES  10
     250             : #define BORDER  2
     251             : 
     252           0 : void SwDropCapsPict::GetFontSettings( const SwDropCapsPage& _rPage, Font& _rFont, sal_uInt16 _nWhich )
     253             : {
     254           0 :     SfxItemSet aSet( _rPage.rSh.GetAttrPool(), _nWhich, _nWhich);
     255           0 :     _rPage.rSh.GetCurAttr(aSet);
     256           0 :     SvxFontItem aFmtFont((SvxFontItem &) aSet.Get(_nWhich));
     257             : 
     258           0 :     _rFont.SetFamily (aFmtFont.GetFamily());
     259           0 :     _rFont.SetName   (aFmtFont.GetFamilyName());
     260           0 :     _rFont.SetPitch  (aFmtFont.GetPitch());
     261           0 :     _rFont.SetCharSet(aFmtFont.GetCharSet());
     262           0 : }
     263             : 
     264           0 : void SwDropCapsPict::UpdatePaintSettings( void )
     265             : {
     266           0 :     maBackColor = GetSettings().GetStyleSettings().GetWindowColor();
     267           0 :     maTextLineColor = Color( COL_LIGHTGRAY );
     268             : 
     269             :     // gray lines
     270           0 :     mnTotLineH = (GetOutputSizePixel().Height() - 2 * BORDER) / LINES;
     271           0 :     mnLineH = mnTotLineH - 2;
     272             : 
     273           0 :     Font aFont;
     274           0 :     if (mpPage)
     275             :     {
     276           0 :         if (!mpPage->m_pTemplateBox->GetSelectEntryPos())
     277             :         {
     278             :             // query the Font at paragraph's beginning
     279           0 :             mpPage->rSh.SttCrsrMove();
     280           0 :             mpPage->rSh.Push();
     281           0 :             mpPage->rSh.ClearMark();
     282           0 :             SwWhichPara pSwuifnParaCurr = GetfnParaCurr();
     283           0 :             SwPosPara pSwuifnParaStart = GetfnParaStart();
     284           0 :             mpPage->rSh.MovePara(pSwuifnParaCurr,pSwuifnParaStart);
     285             :             // normal
     286           0 :             GetFontSettings( *mpPage, aFont, RES_CHRATR_FONT );
     287             : 
     288             :             // CJK
     289           0 :             GetFontSettings( *mpPage, maCJKFont, RES_CHRATR_CJK_FONT );
     290             : 
     291             :             // CTL
     292           0 :             GetFontSettings( *mpPage, maCTLFont, RES_CHRATR_CTL_FONT );
     293             : 
     294           0 :             mpPage->rSh.Pop(sal_False);
     295           0 :             mpPage->rSh.EndCrsrMove();
     296             :         }
     297             :         else
     298             :         {
     299             :             // query Font at character template
     300             :             SwCharFmt *pFmt = mpPage->rSh.GetCharStyle(
     301             :                                     mpPage->m_pTemplateBox->GetSelectEntry(),
     302           0 :                                     SwWrtShell::GETSTYLE_CREATEANY );
     303             :             OSL_ENSURE(pFmt, "character style doesn't exist!");
     304           0 :             const SvxFontItem &rFmtFont = pFmt->GetFont();
     305             : 
     306           0 :             aFont.SetFamily (rFmtFont.GetFamily());
     307           0 :             aFont.SetName   (rFmtFont.GetFamilyName());
     308           0 :             aFont.SetPitch  (rFmtFont.GetPitch());
     309           0 :             aFont.SetCharSet(rFmtFont.GetCharSet());
     310             :         }
     311             :     }
     312             : 
     313           0 :     mnTextH = mnLines * mnTotLineH;
     314           0 :     aFont.SetSize(Size(0, mnTextH));
     315           0 :     maCJKFont.SetSize(Size(0, mnTextH));
     316           0 :     maCTLFont.SetSize(Size(0, mnTextH));
     317             : 
     318           0 :     aFont.SetTransparent(true);
     319           0 :     maCJKFont.SetTransparent(true);
     320           0 :     maCTLFont.SetTransparent(true);
     321             : 
     322           0 :     aFont.SetColor( SwViewOption::GetFontColor() );
     323           0 :     maCJKFont.SetColor( SwViewOption::GetFontColor() );
     324           0 :     maCTLFont.SetColor( SwViewOption::GetFontColor() );
     325             : 
     326           0 :     aFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
     327           0 :     maCJKFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
     328           0 :     maCTLFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
     329             : 
     330           0 :     maCJKFont.SetSize(Size(0, maCJKFont.GetSize().Height()));
     331           0 :     maCTLFont.SetSize(Size(0, maCTLFont.GetSize().Height()));
     332             : 
     333           0 :     SetFont(aFont);
     334           0 :     aFont.SetSize(Size(0, aFont.GetSize().Height()));
     335           0 :     SetFont(aFont);
     336           0 :     maFont = aFont;
     337             : 
     338           0 :     CheckScript();
     339             : 
     340           0 :     maTextSize = CalcTextSize();
     341             : 
     342           0 :     Invalidate();
     343           0 : }
     344             : 
     345             : /****************************************************************************
     346             : Pict: Paint-Overload
     347             : ****************************************************************************/
     348             : 
     349           0 : void  SwDropCapsPict::Paint(const Rectangle &/*rRect*/)
     350             : {
     351           0 :     if (!IsVisible())
     352           0 :         return;
     353             : 
     354           0 :     SetMapMode(MapMode(MAP_PIXEL));
     355           0 :     SetLineColor();
     356             : 
     357           0 :     SetFillColor( maBackColor );
     358             : 
     359           0 :     Size aOutputSizePixel( GetOutputSizePixel() );
     360             : 
     361           0 :     DrawRect(Rectangle(Point(0, 0), aOutputSizePixel ));
     362             :     SetClipRegion(Region(Rectangle(
     363             :         Point(BORDER, BORDER),
     364           0 :         Size (aOutputSizePixel.Width () - 2 * BORDER,
     365           0 :               aOutputSizePixel.Height() - 2 * BORDER))));
     366             : 
     367             :     OSL_ENSURE(mnLineH > 0, "We cannot make it that small");
     368           0 :     long nY0 = (aOutputSizePixel.Height() - (LINES * mnTotLineH)) / 2;
     369           0 :     SetFillColor( maTextLineColor );
     370           0 :     for (sal_uInt16 i = 0; i < LINES; ++i)
     371           0 :         DrawRect(Rectangle(Point(BORDER, nY0 + i * mnTotLineH), Size(aOutputSizePixel.Width() - 2 * BORDER, mnLineH)));
     372             : 
     373             :     // Text background with gap (240 twips ~ 1 line height)
     374           0 :     sal_uLong lDistance = mnDistance;
     375           0 :     sal_uInt16 nDistW = (sal_uInt16) (sal_uLong) (((lDistance * 100) / 240) * mnTotLineH) / 100;
     376           0 :     SetFillColor( maBackColor );
     377           0 :     if (mpPage && mpPage->m_pDropCapsBox->IsChecked())
     378             :     {
     379           0 :         Size    aTextSize( maTextSize );
     380           0 :         aTextSize.Width() += nDistW;
     381           0 :         DrawRect( Rectangle( Point( BORDER, nY0 ), aTextSize ) );
     382             : 
     383             :         // draw Text
     384           0 :         DrawPrev( Point( BORDER, nY0 ) );
     385             :     }
     386             : 
     387           0 :     SetClipRegion();
     388             : }
     389             : 
     390           0 : void SwDropCapsPict::DrawPrev( const Point& rPt )
     391             : {
     392           0 :     Point aPt(rPt);
     393           0 :     InitPrinter();
     394             : 
     395           0 :     Font        aOldFont = mpPrinter->GetFont();
     396             :     sal_uInt16      nScript;
     397           0 :     size_t      nIdx = 0;
     398             :     sal_Int32  nStart;
     399             :     sal_Int32  nEnd;
     400           0 :     GetFirstScriptSegment(nStart, nEnd, nScript);
     401             :     do
     402             :     {
     403           0 :         SvxFont&    rFnt = (nScript==css::i18n::ScriptType::ASIAN) ? maCJKFont : ((nScript==css::i18n::ScriptType::COMPLEX) ? maCTLFont : maFont);
     404           0 :         mpPrinter->SetFont( rFnt );
     405             : 
     406           0 :         rFnt.DrawPrev( this, mpPrinter, aPt, maText, nStart, nEnd - nStart );
     407             : 
     408           0 :         aPt.X() += maScriptChanges[ nIdx ].textWidth;
     409           0 :         if ( !GetNextScriptSegment(nIdx, nStart, nEnd, nScript) )
     410           0 :             break;
     411             :     }
     412             :     while( true );
     413           0 :     mpPrinter->SetFont( aOldFont );
     414           0 : }
     415             : 
     416           0 : void SwDropCapsPict::CheckScript( void )
     417             : {
     418           0 :     if( maScriptText == maText )
     419           0 :         return;
     420             : 
     421           0 :     maScriptText = maText;
     422           0 :     maScriptChanges.clear();
     423           0 :     if( !xBreak.is() )
     424             :     {
     425           0 :         Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
     426           0 :         xBreak = css::i18n::BreakIterator::create(xContext);
     427             :     }
     428           0 :     sal_uInt16 nScript = xBreak->getScriptType( maText, 0 );
     429           0 :     sal_uInt16 nChg = 0;
     430           0 :     if( css::i18n::ScriptType::WEAK == nScript )
     431             :     {
     432           0 :         nChg = (sal_Int32)xBreak->endOfScript( maText, nChg, nScript );
     433           0 :         if( nChg < maText.getLength() )
     434           0 :             nScript = xBreak->getScriptType( maText, nChg );
     435             :         else
     436           0 :             nScript = css::i18n::ScriptType::LATIN;
     437             :     }
     438             : 
     439             :     do
     440             :     {
     441           0 :         nChg = (sal_Int32)xBreak->endOfScript( maText, nChg, nScript );
     442           0 :         maScriptChanges.push_back( _ScriptInfo(0, nScript, nChg) );
     443             : 
     444           0 :         if( nChg < maText.getLength() )
     445           0 :             nScript = xBreak->getScriptType( maText, nChg );
     446             :         else
     447           0 :             break;
     448           0 :     } while( true );
     449             : }
     450             : 
     451           0 : Size SwDropCapsPict::CalcTextSize( void )
     452             : {
     453           0 :     InitPrinter();
     454             : 
     455             :     sal_uInt16      nScript;
     456           0 :     size_t      nIdx = 0;
     457             :     sal_Int32  nStart;
     458             :     sal_Int32  nEnd;
     459           0 :     GetFirstScriptSegment(nStart, nEnd, nScript);
     460           0 :     long        nTxtWidth = 0;
     461           0 :     long        nCJKHeight = 0;
     462           0 :     long        nCTLHeight = 0;
     463           0 :     long        nHeight = 0;
     464           0 :     long        nAscent = 0;
     465           0 :     long        nCJKAscent = 0;
     466           0 :     long        nCTLAscent = 0;
     467             :     do
     468             :     {
     469           0 :         SvxFont&    rFnt = ( nScript == css::i18n::ScriptType::ASIAN )? maCJKFont :
     470           0 :                                 ( ( nScript == css::i18n::ScriptType::COMPLEX )? maCTLFont : maFont );
     471           0 :         sal_uLong       nWidth = rFnt.GetTxtSize( mpPrinter, maText, nStart, nEnd-nStart ).Width();
     472             : 
     473           0 :         if( nIdx < maScriptChanges.size() )
     474           0 :             maScriptChanges[ nIdx ].textWidth = nWidth;
     475           0 :         nTxtWidth += nWidth;
     476           0 :         switch(nScript)
     477             :         {
     478             :             case css::i18n::ScriptType::ASIAN:
     479           0 :                 calcFontHeightAnyAscent( this, maCJKFont, nCJKHeight, nCJKAscent );
     480           0 :                 break;
     481             :             case css::i18n::ScriptType::COMPLEX:
     482           0 :                 calcFontHeightAnyAscent( this, maCTLFont, nCTLHeight, nCTLAscent );
     483           0 :                 break;
     484             :             default:
     485           0 :                 calcFontHeightAnyAscent( this, maFont, nHeight, nAscent );
     486             :         }
     487             : 
     488           0 :         if ( !GetNextScriptSegment(nIdx, nStart, nEnd, nScript) )
     489           0 :             break;
     490             :     }
     491             :     while( true );
     492           0 :     nHeight -= nAscent;
     493           0 :     nCJKHeight -= nCJKAscent;
     494           0 :     nCTLHeight -= nCTLAscent;
     495           0 :     if( nHeight < nCJKHeight )
     496           0 :         nHeight = nCJKHeight;
     497           0 :     if( nAscent < nCJKAscent )
     498           0 :         nAscent = nCJKAscent;
     499           0 :     if( nHeight < nCTLHeight )
     500           0 :         nHeight = nCTLHeight;
     501           0 :     if( nAscent < nCTLAscent )
     502           0 :         nAscent = nCTLAscent;
     503           0 :     nHeight += nAscent;
     504             : 
     505           0 :     Size aTxtSize( nTxtWidth, nHeight );
     506           0 :     return aTxtSize;
     507             : }
     508             : 
     509           0 : void SwDropCapsPict::_InitPrinter()
     510             : {
     511           0 :     SfxViewShell*   pSh = SfxViewShell::Current();
     512             : 
     513           0 :     if ( pSh )
     514           0 :         mpPrinter = pSh->GetPrinter();
     515             : 
     516           0 :     if ( !mpPrinter )
     517             :     {
     518           0 :         mpPrinter = new Printer;
     519           0 :         mbDelPrinter = true;
     520             :     }
     521           0 : }
     522             : 
     523           0 : SwDropCapsDlg::SwDropCapsDlg(Window *pParent, const SfxItemSet &rSet )
     524           0 :     : SfxSingleTabDialog(pParent, rSet)
     525             : {
     526           0 :     SwDropCapsPage* pNewPage = (SwDropCapsPage*) SwDropCapsPage::Create(get_content_area(), rSet);
     527           0 :     pNewPage->SetFormat(false);
     528           0 :     SetTabPage(pNewPage);
     529           0 : }
     530             : 
     531           0 : SwDropCapsPage::SwDropCapsPage(Window *pParent, const SfxItemSet &rSet)
     532             :     : SfxTabPage(pParent, "DropCapPage","modules/swriter/ui/dropcapspage.ui", rSet)
     533             :     , bModified(false)
     534             :     , bFormat(true)
     535           0 :     , rSh(::GetActiveView()->GetWrtShell())
     536             : {
     537           0 :     get(m_pDropCapsBox,"checkCB_SWITCH");
     538           0 :     get(m_pWholeWordCB,"checkCB_WORD");
     539           0 :     get(m_pDropCapsField,"spinFLD_DROPCAPS");
     540           0 :     get(m_pLinesField,"spinFLD_LINES");
     541           0 :     get(m_pDistanceField,"spinFLD_DISTANCE");
     542           0 :     get(m_pSwitchText,"labelFT_DROPCAPS");
     543           0 :     get(m_pLinesText,"labelTXT_LINES");
     544           0 :     get(m_pDistanceText,"labelTXT_DISTANCE");
     545           0 :     get(m_pTemplateText,"labelTXT_TEMPLATE");
     546           0 :     get(m_pTextText,"labelTXT_TEXT");
     547           0 :     get(m_pTextEdit,"entryEDT_TEXT");
     548           0 :     get(m_pTemplateBox,"comboBOX_TEMPLATE");
     549           0 :     get(m_pPict,"drawingareaWN_EXAMPLE");
     550             : 
     551           0 :     m_pPict->SetDropCapsPage(this);
     552             : 
     553           0 :     SetExchangeSupport();
     554             : 
     555           0 :     sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
     556           0 :     bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;
     557             : 
     558             :     // In the template dialog the text is not influenceable
     559           0 :     m_pTextText->Enable( !bFormat );
     560           0 :     m_pTextEdit->Enable( !bFormat );
     561             : 
     562             :     // Metrics
     563           0 :     SetMetric( *m_pDistanceField, GetDfltMetric(bHtmlMode) );
     564             : 
     565           0 :     m_pPict->SetBorderStyle( WINDOW_BORDER_MONO );
     566             : 
     567             :     // Install handler
     568           0 :     Link aLk = LINK(this, SwDropCapsPage, ModifyHdl);
     569           0 :     m_pDropCapsField->SetModifyHdl( aLk );
     570           0 :     m_pLinesField->SetModifyHdl( aLk );
     571           0 :     m_pDistanceField->SetModifyHdl( aLk );
     572           0 :     m_pTextEdit->SetModifyHdl( aLk );
     573           0 :     m_pDropCapsBox->SetClickHdl (LINK(this, SwDropCapsPage, ClickHdl ));
     574           0 :     m_pTemplateBox->SetSelectHdl(LINK(this, SwDropCapsPage, SelectHdl));
     575           0 :     m_pWholeWordCB->SetClickHdl (LINK(this, SwDropCapsPage, WholeWordHdl ));
     576             : 
     577           0 :     setPreviewsToSamePlace(pParent, this);
     578           0 : }
     579             : 
     580           0 : SwDropCapsPage::~SwDropCapsPage()
     581             : {
     582           0 : }
     583             : 
     584           0 : int  SwDropCapsPage::DeactivatePage(SfxItemSet * _pSet)
     585             : {
     586           0 :     if ( _pSet )
     587           0 :         FillSet( *_pSet );
     588             : 
     589           0 :     return LEAVE_PAGE;
     590             : }
     591             : 
     592             : /****************************************************************************
     593             : Page: Factory
     594             : ****************************************************************************/
     595             : 
     596           0 : SfxTabPage*  SwDropCapsPage::Create(Window *pParent,
     597             :     const SfxItemSet &rSet)
     598             : {
     599           0 :     return new SwDropCapsPage(pParent, rSet);
     600             : }
     601             : 
     602             : /****************************************************************************
     603             : Page: FillItemSet-Overload
     604             : ****************************************************************************/
     605             : 
     606           0 : bool  SwDropCapsPage::FillItemSet(SfxItemSet &rSet)
     607             : {
     608           0 :     if(bModified)
     609           0 :         FillSet(rSet);
     610           0 :     return bModified;
     611             : }
     612             : 
     613             : /****************************************************************************
     614             : Page: Reset-Overload
     615             : ****************************************************************************/
     616             : 
     617           0 : void  SwDropCapsPage::Reset(const SfxItemSet &rSet)
     618             : {
     619             :     // Characters, lines, gap and text
     620           0 :     SwFmtDrop aFmtDrop((SwFmtDrop &) rSet.Get(RES_PARATR_DROP));
     621           0 :     if (aFmtDrop.GetLines() > 1)
     622             :     {
     623           0 :         m_pDropCapsField->SetValue(aFmtDrop.GetChars());
     624           0 :         m_pLinesField->SetValue(aFmtDrop.GetLines());
     625           0 :         m_pDistanceField->SetValue(m_pDistanceField->Normalize(aFmtDrop.GetDistance()), FUNIT_TWIP);
     626           0 :         m_pWholeWordCB->Check(aFmtDrop.GetWholeWord());
     627             :     }
     628             :     else
     629             :     {
     630           0 :         m_pDropCapsField->SetValue(1);
     631           0 :         m_pLinesField->SetValue(3);
     632           0 :         m_pDistanceField->SetValue(0);
     633             :     }
     634             : 
     635           0 :     ::FillCharStyleListBox(*m_pTemplateBox, rSh.GetView().GetDocShell(), true);
     636             : 
     637           0 :     m_pTemplateBox->InsertEntry(SW_RESSTR(SW_STR_NONE), 0);
     638             : 
     639             :     // Reset format
     640           0 :     m_pTemplateBox->SelectEntryPos(0);
     641           0 :     if (aFmtDrop.GetCharFmt())
     642           0 :         m_pTemplateBox->SelectEntry(aFmtDrop.GetCharFmt()->GetName());
     643             : 
     644             :     // Enable controls
     645           0 :     m_pDropCapsBox->Check(aFmtDrop.GetLines() > 1);
     646           0 :     const sal_uInt16 nVal = sal_uInt16(m_pDropCapsField->GetValue());
     647           0 :     if (bFormat)
     648           0 :         m_pTextEdit->SetText(GetDefaultString(nVal));
     649             :     else
     650             :     {
     651           0 :         m_pTextEdit->SetText(rSh.GetDropTxt(nVal));
     652           0 :         m_pTextEdit->Enable();
     653           0 :         m_pTextText->Enable();
     654             :     }
     655             : 
     656             :     // Preview
     657           0 :     m_pPict->SetValues( m_pTextEdit->GetText(),
     658           0 :                         sal_uInt8( m_pLinesField->GetValue() ),
     659           0 :                         sal_uInt16( m_pDistanceField->Denormalize( m_pDistanceField->GetValue( FUNIT_TWIP ) ) ) );
     660             : 
     661           0 :     ClickHdl(m_pDropCapsBox);
     662           0 :     bModified = sal_False;
     663           0 : }
     664             : 
     665             : /****************************************************************************
     666             : Page: CheckBox's Click-Handler
     667             : ****************************************************************************/
     668             : 
     669           0 : IMPL_LINK_NOARG(SwDropCapsPage, ClickHdl)
     670             : {
     671           0 :     sal_Bool bChecked = m_pDropCapsBox->IsChecked();
     672             : 
     673           0 :     m_pWholeWordCB->Enable( bChecked && !bHtmlMode );
     674             : 
     675           0 :     m_pSwitchText->Enable( bChecked && !m_pWholeWordCB->IsChecked() );
     676           0 :     m_pDropCapsField->Enable( bChecked && !m_pWholeWordCB->IsChecked() );
     677           0 :     m_pLinesText->Enable( bChecked );
     678           0 :     m_pLinesField->Enable( bChecked );
     679           0 :     m_pDistanceText->Enable( bChecked );
     680           0 :     m_pDistanceField->Enable( bChecked );
     681           0 :     m_pTemplateText->Enable( bChecked );
     682           0 :     m_pTemplateBox->Enable( bChecked );
     683           0 :     m_pTextEdit->Enable( bChecked && !bFormat );
     684           0 :     m_pTextText->Enable( bChecked && !bFormat );
     685             : 
     686           0 :     if ( bChecked )
     687             :     {
     688           0 :         ModifyHdl(m_pDropCapsField);
     689           0 :         m_pDropCapsField->GrabFocus();
     690             :     }
     691             :     else
     692           0 :         m_pPict->SetText("");
     693             : 
     694           0 :     bModified = sal_True;
     695             : 
     696           0 :     return 0;
     697             : }
     698             : 
     699             : /****************************************************************************
     700             : Page: CheckBox's Click-Handler
     701             : ****************************************************************************/
     702             : 
     703           0 : IMPL_LINK_NOARG(SwDropCapsPage, WholeWordHdl)
     704             : {
     705           0 :     m_pDropCapsField->Enable( !m_pWholeWordCB->IsChecked() );
     706           0 :     m_pSwitchText->Enable(!m_pWholeWordCB->IsChecked());
     707             : 
     708           0 :     ModifyHdl(m_pDropCapsField);
     709             : 
     710           0 :     bModified = sal_True;
     711             : 
     712           0 :     return 0;
     713             : }
     714             : 
     715             : /****************************************************************************
     716             : Page: SpinFields' Modify-Handler
     717             : ****************************************************************************/
     718             : 
     719           0 : IMPL_LINK( SwDropCapsPage, ModifyHdl, Edit *, pEdit )
     720             : {
     721           0 :     OUString sPreview;
     722             : 
     723             :     // set text if applicable
     724           0 :     if (pEdit == m_pDropCapsField)
     725             :     {
     726             :         sal_uInt16 nVal;
     727           0 :         bool bSetText = false;
     728             : 
     729           0 :         if (!m_pWholeWordCB->IsChecked())
     730           0 :             nVal = (sal_uInt16)m_pDropCapsField->GetValue();
     731             :         else
     732           0 :             nVal = 0;
     733             : 
     734           0 :         if (bFormat || rSh.GetDropTxt(1).isEmpty())
     735           0 :             sPreview = GetDefaultString(nVal);
     736             :         else
     737             :         {
     738           0 :             bSetText = true;
     739           0 :             sPreview = rSh.GetDropTxt(nVal);
     740             :         }
     741             : 
     742           0 :         OUString sEdit(m_pTextEdit->GetText());
     743             : 
     744           0 :         if (!sEdit.isEmpty() && !sPreview.startsWith(sEdit))
     745             :         {
     746           0 :             sPreview = sEdit.copy(0, sPreview.getLength());
     747           0 :             bSetText = false;
     748             :         }
     749             : 
     750           0 :         if (bSetText)
     751           0 :             m_pTextEdit->SetText(sPreview);
     752             :     }
     753           0 :     else if (pEdit == m_pTextEdit)   // set quantity if applicable
     754             :     {
     755           0 :         sal_Int32 nTmp = m_pTextEdit->GetText().getLength();
     756           0 :         m_pDropCapsField->SetValue(std::max((sal_uInt16)1, (sal_uInt16)nTmp));
     757             : 
     758           0 :         sPreview = m_pTextEdit->GetText().copy(0, nTmp);
     759             :     }
     760             : 
     761             :     // adjust image
     762           0 :     if (pEdit == m_pDropCapsField || pEdit == m_pTextEdit)
     763           0 :         m_pPict->SetText (sPreview);
     764           0 :     else if (pEdit == m_pLinesField)
     765           0 :         m_pPict->SetLines((sal_uInt8)m_pLinesField->GetValue());
     766             :     else
     767           0 :         m_pPict->SetDistance((sal_uInt16)m_pDistanceField->Denormalize(m_pDistanceField->GetValue(FUNIT_TWIP)));
     768             : 
     769           0 :     bModified = sal_True;
     770             : 
     771           0 :     return 0;
     772             : }
     773             : 
     774             : /****************************************************************************
     775             : Page: Template-Box' Select-Handler.
     776             : *****************************************************************************/
     777             : 
     778           0 : IMPL_LINK_NOARG_INLINE_START(SwDropCapsPage, SelectHdl)
     779             : {
     780           0 :     m_pPict->UpdatePaintSettings();
     781           0 :     bModified = sal_True;
     782           0 :     return 0;
     783             : }
     784           0 : IMPL_LINK_NOARG_INLINE_END(SwDropCapsPage, SelectHdl)
     785             : 
     786           0 : sal_uInt16*  SwDropCapsPage::GetRanges()
     787             : {
     788           0 :     return aPageRg;
     789             : }
     790             : 
     791           0 : void SwDropCapsPage::FillSet( SfxItemSet &rSet )
     792             : {
     793           0 :     if(bModified)
     794             :     {
     795           0 :         SwFmtDrop aFmt;
     796             : 
     797           0 :         sal_Bool bOn = m_pDropCapsBox->IsChecked();
     798           0 :         if(bOn)
     799             :         {
     800             :             // quantity, lines, gap
     801           0 :             aFmt.GetChars()     = (sal_uInt8) m_pDropCapsField->GetValue();
     802           0 :             aFmt.GetLines()     = (sal_uInt8) m_pLinesField->GetValue();
     803           0 :             aFmt.GetDistance()  = (sal_uInt16) m_pDistanceField->Denormalize(m_pDistanceField->GetValue(FUNIT_TWIP));
     804           0 :             aFmt.GetWholeWord() = m_pWholeWordCB->IsChecked();
     805             : 
     806             :             // template
     807           0 :             if (m_pTemplateBox->GetSelectEntryPos())
     808           0 :                 aFmt.SetCharFmt(rSh.GetCharStyle(m_pTemplateBox->GetSelectEntry()));
     809             :         }
     810             :         else
     811             :         {
     812           0 :             aFmt.GetChars()    = 1;
     813           0 :             aFmt.GetLines()    = 1;
     814           0 :             aFmt.GetDistance() = 0;
     815             :         }
     816             : 
     817             :         // set attributes
     818             :         const SfxPoolItem* pOldItem;
     819           0 :         if(0 == (pOldItem = GetOldItem( rSet, FN_FORMAT_DROPCAPS )) ||
     820           0 :                     aFmt != *pOldItem )
     821           0 :             rSet.Put(aFmt);
     822             : 
     823             :         // hard text formatting
     824             :         // Bug 24974: in designer/template catalog this doesn't make sense!!
     825           0 :         if( !bFormat && m_pDropCapsBox->IsChecked() )
     826             :         {
     827           0 :             OUString sText(m_pTextEdit->GetText());
     828             : 
     829           0 :             if (!m_pWholeWordCB->IsChecked())
     830           0 :                 sText = sText.copy( 0, m_pDropCapsField->GetValue());
     831             : 
     832           0 :             SfxStringItem aStr(FN_PARAM_1, sText);
     833           0 :             rSet.Put( aStr );
     834           0 :         }
     835             :     }
     836           0 : }
     837             : 
     838             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10