xref: /AOO41X/main/sw/source/ui/chrdlg/drpcps.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #ifdef SW_DLLIMPLEMENTATION
27 #undef SW_DLLIMPLEMENTATION
28 #endif
29 
30 
31 
32 #include <hintids.hxx>
33 #define _SVSTDARR_STRINGSDTOR
34 #define _SVSTDARR_STRINGSISORTDTOR
35 #include <svl/svstdarr.hxx>
36 
37 #include "cmdid.h"
38 #include "swmodule.hxx"
39 #include "view.hxx"
40 #include "wrtsh.hxx"
41 #include "globals.hrc"
42 
43 
44 #ifndef _METRIC_HXX //autogen
45 #include <vcl/metric.hxx>
46 #endif
47 #include <svl/stritem.hxx>
48 #include <editeng/fontitem.hxx>
49 #include <svx/htmlmode.hxx>
50 #include <sfx2/objsh.hxx>
51 #include <editeng/svxfont.hxx>
52 #include <vcl/print.hxx>
53 #include <sfx2/printer.hxx>
54 #ifndef _COM_SUN_STAR_I18N_SCRIPTTYPE_HDL_
55 #include <com/sun/star/i18n/ScriptType.hdl>
56 #endif
57 #include <editeng/scripttypeitem.hxx>
58 #include <com/sun/star/i18n/XBreakIterator.hpp>
59 #include <comphelper/processfactory.hxx>
60 
61 #define _SVSTDARR_XUB_STRLEN
62 #define _SVSTDARR_USHORTS
63 #define _SVSTDARR_ULONGS
64 #include <svl/svstdarr.hxx>
65 
66 #include "charatr.hxx"
67 #include "viewopt.hxx"
68 #include "drpcps.hxx"
69 #include "paratr.hxx"
70 #include "uitool.hxx"
71 #include "charfmt.hxx"
72 
73 #include "chrdlg.hrc"
74 #include "drpcps.hrc"
75 
76 
77 using namespace ::com::sun::star;
78 using namespace ::com::sun::star::uno;
79 using namespace ::com::sun::star::lang;
80 //using namespace i18n; !using this namespace leads to mysterious conflicts with ScriptType::...!
81 //                                              so don't use this instead of the following defines!
82 
83 #define I18N                ::com::sun::star::i18n
84 #define I18N_SCRIPTTYPE     ::com::sun::star::i18n::ScriptType
85 
86 // Globals ******************************************************************
87 
88 static sal_uInt16 __FAR_DATA aPageRg[] = {
89     RES_PARATR_DROP, RES_PARATR_DROP,
90     0
91 };
92 
93 
94 
95 // class SwDropCapsPict *****************************************************
96 
97 class SwDropCapsPict : public Control
98 {
99     String          maText;
100     String          maScriptText;
101     Color           maBackColor;
102     Color           maTextLineColor;
103     sal_uInt8           mnLines;
104     long            mnTotLineH;
105     long            mnLineH;
106     long            mnTextH;
107     sal_uInt16          mnDistance;
108     sal_Int32       mnLeading;
109     Printer*        mpPrinter;
110     sal_Bool            mbDelPrinter;
111     SvULongs        maTextWidth;
112     SvXub_StrLens   maScriptChg;
113     SvUShorts       maScriptType;
114     SvxFont         maFont;
115     SvxFont         maCJKFont;
116     SvxFont         maCTLFont;
117     Size            maTextSize;
118     Reference< I18N::XBreakIterator >   xBreak;
119 
120     virtual void    Paint(const Rectangle &rRect);
121     void            CheckScript( void );
122     Size            CalcTextSize( void );
123     inline void     InitPrinter( void );
124     void            _InitPrinter( void );
125     void            GetFontSettings( const SwDropCapsPage& _rPage, Font& _rFont, sal_uInt16 _nWhich );
126 public:
127 
SwDropCapsPict(Window * pParent,const ResId & rResId)128      SwDropCapsPict(Window *pParent, const ResId &rResId) :
129             Control(pParent, rResId), mpPrinter( NULL ), mbDelPrinter( sal_False ) {}
130     ~SwDropCapsPict();
131 
132     void UpdatePaintSettings( void );       // also invalidates control!
133 
134     inline void SetText( const String& rT );
135     inline void SetLines( sal_uInt8 nL );
136     inline void SetDistance( sal_uInt16 nD );
137     inline void SetValues( const String& rText, sal_uInt8 nLines, sal_uInt16 nDistance );
138 
139     void        DrawPrev( const Point& rPt );
140 };
141 
SetText(const String & rT)142 inline void SwDropCapsPict::SetText( const String& rT )
143 {
144     maText = rT;
145     UpdatePaintSettings();
146 }
147 
SetLines(sal_uInt8 nL)148 inline void SwDropCapsPict::SetLines( sal_uInt8 nL )
149 {
150     mnLines = nL;
151     UpdatePaintSettings();
152 }
153 
SetDistance(sal_uInt16 nD)154 inline void SwDropCapsPict::SetDistance( sal_uInt16 nD )
155 {
156     mnDistance = nD;
157     UpdatePaintSettings();
158 }
159 
SetValues(const String & rText,sal_uInt8 nLines,sal_uInt16 nDistance)160 inline void SwDropCapsPict::SetValues( const String& rText, sal_uInt8 nLines, sal_uInt16 nDistance )
161 {
162     maText = rText;
163     mnLines = nLines;
164     mnDistance = nDistance;
165 
166     UpdatePaintSettings();
167 }
168 
InitPrinter(void)169 inline void SwDropCapsPict::InitPrinter( void )
170 {
171     if( !mpPrinter )
172         _InitPrinter();
173 }
174 
175 /****************************************************************************
176 Default-String aus Zeichenanzahl erzeugen (A, AB, ABC, ...)
177 ****************************************************************************/
178 
179 
GetDefaultString(sal_uInt16 nChars)180 String GetDefaultString(sal_uInt16 nChars)
181 {
182     String aStr;
183     for (sal_uInt16 i = 0; i < nChars; i++)
184         aStr += String((char) (i + 65));
185     return aStr;
186 }
187 
calcFontHeightAnyAscent(OutputDevice * _pWin,Font & _rFont,long & _nHeight,long & _nAscent)188 static void calcFontHeightAnyAscent( OutputDevice* _pWin, Font& _rFont, long& _nHeight, long& _nAscent )
189 {
190     if ( !_nHeight )
191     {
192         _pWin->SetFont( _rFont );
193         FontMetric aMetric( _pWin->GetFontMetric() );
194         _nHeight = aMetric.GetLineHeight();
195         _nAscent = aMetric.GetAscent();
196     }
197 }
198 
199 /****************************************************************************
200 Pict: Dtor
201 ****************************************************************************/
202 
203 
~SwDropCapsPict()204  SwDropCapsPict::~SwDropCapsPict()
205 {
206      if( mbDelPrinter )
207          delete mpPrinter;
208 }
209 
210 /****************************************************************************
211 Pict: Update Font
212 ****************************************************************************/
213 
214 #define LINES  10
215 #define BORDER  2
216 
GetFontSettings(const SwDropCapsPage & _rPage,Font & _rFont,sal_uInt16 _nWhich)217 void SwDropCapsPict::GetFontSettings( const SwDropCapsPage& _rPage, Font& _rFont, sal_uInt16 _nWhich )
218 {
219     SfxItemSet aSet( _rPage.rSh.GetAttrPool(), _nWhich, _nWhich);
220     _rPage.rSh.GetCurAttr(aSet);
221     SvxFontItem aFmtFont((SvxFontItem &) aSet.Get(_nWhich));
222 
223     _rFont.SetFamily (aFmtFont.GetFamily());
224     _rFont.SetName   (aFmtFont.GetFamilyName());
225     _rFont.SetPitch  (aFmtFont.GetPitch());
226     _rFont.SetCharSet(aFmtFont.GetCharSet());
227 }
228 
UpdatePaintSettings(void)229 void SwDropCapsPict::UpdatePaintSettings( void )
230 {
231     maBackColor = GetSettings().GetStyleSettings().GetWindowColor();
232     maTextLineColor = Color( COL_LIGHTGRAY );
233 
234     // gray lines
235     mnTotLineH = (GetOutputSizePixel().Height() - 2 * BORDER) / LINES;
236     mnLineH = mnTotLineH - 2;
237     mnLeading = GetFontMetric().GetIntLeading();
238 
239     Font aFont;
240     {
241         SwDropCapsPage* pPage = ( SwDropCapsPage* ) GetParent();
242         if (!pPage->aTemplateBox.GetSelectEntryPos())
243         {
244             // Font an Absatzanfang erfragen
245             pPage->rSh.SttCrsrMove();
246             pPage->rSh.Push();
247             pPage->rSh.ClearMark();
248             SwWhichPara pSwuifnParaCurr = GetfnParaCurr();
249             SwPosPara pSwuifnParaStart = GetfnParaStart();
250             pPage->rSh.MovePara(pSwuifnParaCurr,pSwuifnParaStart);
251             // normal
252             GetFontSettings( *pPage, aFont, RES_CHRATR_FONT );
253 
254             // CJK
255             GetFontSettings( *pPage, maCJKFont, RES_CHRATR_CJK_FONT );
256 
257             // CTL
258             GetFontSettings( *pPage, maCTLFont, RES_CHRATR_CTL_FONT );
259 
260             pPage->rSh.Pop(sal_False);
261             pPage->rSh.EndCrsrMove();
262         }
263         else
264         {
265             // Font an Zeichenvorlage erfragen
266             SwCharFmt *pFmt = pPage->rSh.GetCharStyle(
267                                     pPage->aTemplateBox.GetSelectEntry(),
268                                     SwWrtShell::GETSTYLE_CREATEANY );
269             ASSERT(pFmt, "Zeichenvorlage existiert nicht!");
270             const SvxFontItem &rFmtFont = pFmt->GetFont();
271 
272             aFont.SetFamily (rFmtFont.GetFamily());
273             aFont.SetName   (rFmtFont.GetFamilyName());
274             aFont.SetPitch  (rFmtFont.GetPitch());
275             aFont.SetCharSet(rFmtFont.GetCharSet());
276         }
277     }
278 
279     mnTextH = mnLines * mnTotLineH;
280     aFont.SetSize(Size(0, mnTextH));
281     maCJKFont.SetSize(Size(0, mnTextH));
282     maCTLFont.SetSize(Size(0, mnTextH));
283 
284     aFont.SetTransparent(sal_True);
285     maCJKFont.SetTransparent(sal_True);
286     maCTLFont.SetTransparent(sal_True);
287 
288     aFont.SetColor( SwViewOption::GetFontColor() );
289     maCJKFont.SetColor( SwViewOption::GetFontColor() );
290     maCTLFont.SetColor( SwViewOption::GetFontColor() );
291 
292     aFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
293     maCJKFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
294     maCTLFont.SetFillColor(GetSettings().GetStyleSettings().GetWindowColor());
295 
296     maCJKFont.SetSize(Size(0, maCJKFont.GetSize().Height() + mnLeading));
297     maCTLFont.SetSize(Size(0, maCTLFont.GetSize().Height() + mnLeading));
298 
299     SetFont(aFont);
300     aFont.SetSize(Size(0, aFont.GetSize().Height() + mnLeading));
301     SetFont(aFont);
302     maFont = aFont;
303 
304     CheckScript();
305 
306     maTextSize = CalcTextSize();
307 
308     Invalidate();
309 }
310 
311 /****************************************************************************
312 Pict: Paint-Overload
313 ****************************************************************************/
314 
Paint(const Rectangle &)315 void  SwDropCapsPict::Paint(const Rectangle &/*rRect*/)
316 {
317     if (!IsVisible())
318         return;
319 
320     SetMapMode(MapMode(MAP_PIXEL));
321     SetLineColor();
322 
323     SetFillColor( maBackColor );
324 
325     Size aOutputSizePixel( GetOutputSizePixel() );
326 
327     DrawRect(Rectangle(Point(0, 0), aOutputSizePixel ));
328     SetClipRegion(Region(Rectangle(
329         Point(BORDER, BORDER),
330         Size (aOutputSizePixel.Width () - 2 * BORDER,
331               aOutputSizePixel.Height() - 2 * BORDER))));
332 
333     ASSERT(mnLineH > 0, "So klein lassen wir uns nicht machen");
334     long nY0 = (aOutputSizePixel.Height() - (LINES * mnTotLineH)) / 2;
335     SetFillColor( maTextLineColor );
336     for (sal_uInt16 i = 0; i < LINES; ++i)
337         DrawRect(Rectangle(Point(BORDER, nY0 + i * mnTotLineH), Size(aOutputSizePixel.Width() - 2 * BORDER, mnLineH)));
338 
339     // Texthintergrund mit Abstand (240 twips ~ 1 Zeilenhoehe)
340     sal_uLong lDistance = mnDistance;
341     sal_uInt16 nDistW = (sal_uInt16) (sal_uLong) (((lDistance * 100) / 240) * mnTotLineH) / 100;
342     SetFillColor( maBackColor );
343     if(((SwDropCapsPage*)GetParent())->aDropCapsBox.IsChecked())
344     {
345         Size    aTextSize( maTextSize );
346         aTextSize.Width() += nDistW;
347         DrawRect( Rectangle( Point( BORDER, nY0 ), aTextSize ) );
348 
349         // Text zeichnen
350         DrawPrev( Point( BORDER, nY0 - mnLeading ) );
351     }
352 
353     SetClipRegion();
354 }
355 
DrawPrev(const Point & rPt)356 void SwDropCapsPict::DrawPrev( const Point& rPt )
357 {
358     Point aPt(rPt);
359     InitPrinter();
360 
361     Font        aOldFont = mpPrinter->GetFont();
362     sal_uInt16      nScript;
363     size_t      nIdx = 0;
364     xub_StrLen  nStart = 0;
365     xub_StrLen  nEnd;
366     size_t      nCnt = maScriptChg.size();
367 
368     if( nCnt )
369     {
370         nEnd = maScriptChg[ nIdx ];
371         nScript = maScriptType[ nIdx ];
372     }
373     else
374     {
375         nEnd = maText.Len();
376         nScript = I18N_SCRIPTTYPE::LATIN;
377     }
378     do
379     {
380         SvxFont&    rFnt = (nScript==I18N_SCRIPTTYPE::ASIAN) ? maCJKFont : ((nScript==I18N_SCRIPTTYPE::COMPLEX) ? maCTLFont : maFont);
381         mpPrinter->SetFont( rFnt );
382 
383         rFnt.DrawPrev( this, mpPrinter, aPt, maText, nStart, nEnd - nStart );
384 
385         aPt.X() += maTextWidth[ nIdx++ ];
386         if( nEnd < maText.Len() && nIdx < nCnt )
387         {
388             nStart = nEnd;
389             nEnd = maScriptChg[ nIdx ];
390             nScript = maScriptType[ nIdx ];
391         }
392         else
393             break;
394     }
395     while( sal_True );
396     mpPrinter->SetFont( aOldFont );
397 }
398 
CheckScript(void)399 void SwDropCapsPict::CheckScript( void )
400 {
401     if( maScriptText == maText )
402         return;
403 
404     maScriptText = maText;
405     size_t nCnt = maScriptChg.size();
406     if( nCnt )
407     {
408         maScriptChg.clear();
409         maScriptType.Remove( 0, nCnt );
410         maTextWidth.Remove( 0, nCnt );
411         nCnt = 0;
412     }
413     if( !xBreak.is() )
414     {
415         Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
416         xBreak = Reference< I18N::XBreakIterator >(xMSF->createInstance(
417                 ::rtl::OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) ),UNO_QUERY);
418     }
419     if( xBreak.is() )
420     {
421         sal_uInt16 nScript = xBreak->getScriptType( maText, 0 );
422         sal_uInt16 nChg = 0;
423         if( I18N_SCRIPTTYPE::WEAK == nScript )
424         {
425             nChg = (xub_StrLen)xBreak->endOfScript( maText, nChg, nScript );
426             if( nChg < maText.Len() )
427                 nScript = xBreak->getScriptType( maText, nChg );
428             else
429                 nScript = I18N_SCRIPTTYPE::LATIN;
430         }
431 
432         do
433         {
434             nChg = (xub_StrLen)xBreak->endOfScript( maText, nChg, nScript );
435             maScriptChg.push_back( nChg );
436             maScriptType.Insert( nScript, nCnt );
437             maTextWidth.Insert( sal_uLong(0), nCnt++ );
438 
439             if( nChg < maText.Len() )
440                 nScript = xBreak->getScriptType( maText, nChg );
441             else
442                 break;
443         } while( sal_True );
444     }
445 }
446 
CalcTextSize(void)447 Size SwDropCapsPict::CalcTextSize( void )
448 {
449     InitPrinter();
450 
451     sal_uInt16      nScript;
452     size_t      nIdx = 0;
453     xub_StrLen  nStart = 0;
454     xub_StrLen  nEnd;
455     size_t      nCnt = maScriptChg.size();
456     if( nCnt )
457     {
458         nEnd = maScriptChg[ nIdx ];
459         nScript = maScriptType[ nIdx ];
460     }
461     else
462     {
463         nEnd = maText.Len();
464         nScript = I18N_SCRIPTTYPE::LATIN;
465     }
466     long        nTxtWidth = 0;
467     long        nCJKHeight = 0;
468     long        nCTLHeight = 0;
469     long        nHeight = 0;
470     long        nAscent = 0;
471     long        nCJKAscent = 0;
472     long        nCTLAscent = 0;
473     do
474     {
475         SvxFont&    rFnt = ( nScript == I18N_SCRIPTTYPE::ASIAN )? maCJKFont :
476                                 ( ( nScript == I18N_SCRIPTTYPE::COMPLEX )? maCTLFont : maFont );
477         sal_uLong       nWidth = rFnt.GetTxtSize( mpPrinter, maText, nStart, nEnd-nStart ).Width();
478 
479         if( nIdx < maTextWidth.Count() )
480             maTextWidth[ nIdx++ ] = nWidth;
481         nTxtWidth += nWidth;
482         switch(nScript)
483         {
484             case I18N_SCRIPTTYPE::ASIAN:
485                 calcFontHeightAnyAscent( this, maCJKFont, nCJKHeight, nCJKAscent );
486                 break;
487             case I18N_SCRIPTTYPE::COMPLEX:
488                 calcFontHeightAnyAscent( this, maCTLFont, nCTLHeight, nCTLAscent );
489                 break;
490             default:
491                 calcFontHeightAnyAscent( this, maFont, nHeight, nAscent );
492         }
493 
494         if( nEnd < maText.Len() && nIdx < nCnt )
495         {
496             nStart = nEnd;
497             nEnd = maScriptChg[ nIdx ];
498             nScript = maScriptType[ nIdx ];
499         }
500         else
501             break;
502     }
503     while( sal_True );
504     nHeight -= nAscent;
505     nCJKHeight -= nCJKAscent;
506     nCTLHeight -= nCTLAscent;
507     if( nHeight < nCJKHeight )
508         nHeight = nCJKHeight;
509     if( nAscent < nCJKAscent )
510         nAscent = nCJKAscent;
511     if( nHeight < nCTLHeight )
512         nHeight = nCTLHeight;
513     if( nAscent < nCTLAscent )
514         nAscent = nCTLAscent;
515     nHeight += nAscent;
516 
517     Size aTxtSize( nTxtWidth, nHeight );
518     return aTxtSize;
519 }
520 
_InitPrinter()521 void SwDropCapsPict::_InitPrinter()
522 {
523     SfxViewShell*   pSh = SfxViewShell::Current();
524 
525     if ( pSh )
526         mpPrinter = pSh->GetPrinter();
527 
528     if ( !mpPrinter )
529     {
530         mpPrinter = new Printer;
531         mbDelPrinter = sal_True;
532     }
533 }
534 
535 /****************************************************************************
536 Dlg: Ctor
537 ****************************************************************************/
538 
539 
SwDropCapsDlg(Window * pParent,const SfxItemSet & rSet)540 SwDropCapsDlg::SwDropCapsDlg(Window *pParent, const SfxItemSet &rSet ) :
541 
542     SfxSingleTabDialog(pParent, rSet, 0)
543 
544 {
545     SwDropCapsPage* pNewPage = (SwDropCapsPage*) SwDropCapsPage::Create(this, rSet);
546     pNewPage->SetFormat(sal_False);
547     SetTabPage(pNewPage);
548 }
549 
550 /****************************************************************************
551 Dlg: Dtor
552 ****************************************************************************/
553 
554 
~SwDropCapsDlg()555  SwDropCapsDlg::~SwDropCapsDlg()
556 {
557 }
558 
559 /****************************************************************************
560 Page: Ctor
561 ****************************************************************************/
562 
563 
SwDropCapsPage(Window * pParent,const SfxItemSet & rSet)564 SwDropCapsPage::SwDropCapsPage(Window *pParent, const SfxItemSet &rSet) :
565 
566     SfxTabPage(pParent, SW_RES(TP_DROPCAPS), rSet),
567 
568     aSettingsFL   (this, SW_RES(FL_SETTINGS)),
569     aDropCapsBox  (this, SW_RES(CB_SWITCH   )),
570     aWholeWordCB  (this, SW_RES(CB_WORD     )),
571     aSwitchText   (this, SW_RES(FT_DROPCAPS )),
572     aDropCapsField(this, SW_RES(FLD_DROPCAPS)),
573     aLinesText    (this, SW_RES(TXT_LINES   )),
574     aLinesField   (this, SW_RES(FLD_LINES   )),
575     aDistanceText (this, SW_RES(TXT_DISTANCE)),
576     aDistanceField(this, SW_RES(FLD_DISTANCE)),
577 
578     aContentFL    (this, SW_RES(FL_CONTENT )),
579     aTextText     (this, SW_RES(TXT_TEXT    )),
580     aTextEdit     (this, SW_RES(EDT_TEXT    )),
581     aTemplateText (this, SW_RES(TXT_TEMPLATE)),
582     aTemplateBox  (this, SW_RES(BOX_TEMPLATE)),
583 
584     pPict         (new SwDropCapsPict(this, SW_RES(CNT_PICT))),
585 
586     bModified(sal_False),
587     bFormat(sal_True),
588     rSh(::GetActiveView()->GetWrtShell())
589 {
590     FreeResource();
591     SetExchangeSupport();
592 
593     sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
594     bHtmlMode = nHtmlMode & HTMLMODE_ON ? sal_True : sal_False;
595 
596     //Im Vorlagendialog kann der Text nicht beeinflusst werden
597     aTextText.Enable( !bFormat );
598     aTextEdit.Enable( !bFormat );
599 
600     // Metriken
601     SetMetric( aDistanceField, GetDfltMetric(bHtmlMode) );
602 
603     pPict->SetBorderStyle( WINDOW_BORDER_MONO );
604 
605     // Handler installieren
606     Link aLk = LINK(this, SwDropCapsPage, ModifyHdl);
607     aDropCapsField.SetModifyHdl( aLk );
608     aLinesField   .SetModifyHdl( aLk );
609     aDistanceField.SetModifyHdl( aLk );
610     aTextEdit     .SetModifyHdl( aLk );
611     aDropCapsBox  .SetClickHdl (LINK(this, SwDropCapsPage, ClickHdl ));
612     aTemplateBox  .SetSelectHdl(LINK(this, SwDropCapsPage, SelectHdl));
613     aWholeWordCB  .SetClickHdl (LINK(this, SwDropCapsPage, WholeWordHdl ));
614 }
615 
616 /****************************************************************************
617 Page: Dtor
618 ****************************************************************************/
619 
620 
~SwDropCapsPage()621  SwDropCapsPage::~SwDropCapsPage()
622 {
623     delete pPict;
624 }
625 
626 
DeactivatePage(SfxItemSet * _pSet)627 int  SwDropCapsPage::DeactivatePage(SfxItemSet * _pSet)
628 {
629     if ( _pSet )
630         FillSet( *_pSet );
631 
632     return LEAVE_PAGE;
633 }
634 
635 /****************************************************************************
636 Page: Factory
637 ****************************************************************************/
638 
639 
Create(Window * pParent,const SfxItemSet & rSet)640 SfxTabPage*  SwDropCapsPage::Create(Window *pParent,
641     const SfxItemSet &rSet)
642 {
643     return new SwDropCapsPage(pParent, rSet);
644 }
645 
646 /****************************************************************************
647 Page: FillItemSet-Overload
648 ****************************************************************************/
649 
650 
FillItemSet(SfxItemSet & rSet)651 sal_Bool  SwDropCapsPage::FillItemSet(SfxItemSet &rSet)
652 {
653     if(bModified)
654         FillSet(rSet);
655     return bModified;
656 }
657 
658 /****************************************************************************
659 Page: Reset-Overload
660 ****************************************************************************/
661 
662 
Reset(const SfxItemSet & rSet)663 void  SwDropCapsPage::Reset(const SfxItemSet &rSet)
664 {
665     // Zeichen, Zeilen, Abstand und Text
666     SwFmtDrop aFmtDrop((SwFmtDrop &) rSet.Get(RES_PARATR_DROP));
667     if (aFmtDrop.GetLines() > 1)
668     {
669         aDropCapsField.SetValue(aFmtDrop.GetChars());
670         aLinesField   .SetValue(aFmtDrop.GetLines());
671         aDistanceField.SetValue(aDistanceField.Normalize(aFmtDrop.GetDistance()), FUNIT_TWIP);
672         aWholeWordCB  .Check   (aFmtDrop.GetWholeWord());
673     }
674     else
675     {
676         aDropCapsField.SetValue(1);
677         aLinesField   .SetValue(3);
678         aDistanceField.SetValue(0);
679     }
680 
681     ::FillCharStyleListBox(aTemplateBox, rSh.GetView().GetDocShell(), sal_True);
682 
683     aTemplateBox.InsertEntry(SW_RESSTR(SW_STR_NONE), 0);
684     // Vorlage defaulten
685     aTemplateBox.SelectEntryPos(0);
686     if (aFmtDrop.GetCharFmt())
687         aTemplateBox.SelectEntry(aFmtDrop.GetCharFmt()->GetName());
688 
689     // Controls enablen
690     aDropCapsBox.Check(aFmtDrop.GetLines() > 1);
691     const sal_uInt16 nVal = sal_uInt16(aDropCapsField.GetValue());
692     if (bFormat)
693         aTextEdit.SetText(GetDefaultString(nVal));
694     else
695     {
696         aTextEdit.SetText(rSh.GetDropTxt(nVal));
697         aTextEdit.Enable();
698         aTextText.Enable();
699     }
700 
701     // Preview
702     pPict->SetValues(   aTextEdit.GetText(),
703                         sal_uInt8( aLinesField.GetValue() ),
704                         sal_uInt16( aDistanceField.Denormalize( aDistanceField.GetValue( FUNIT_TWIP ) ) ) );
705 
706     ClickHdl(&aDropCapsBox);
707     bModified = sal_False;
708 }
709 
710 /****************************************************************************
711 Page: Click-Handler der CheckBox
712 ****************************************************************************/
713 
714 
IMPL_LINK(SwDropCapsPage,ClickHdl,Button *,EMPTYARG)715 IMPL_LINK( SwDropCapsPage, ClickHdl, Button *, EMPTYARG )
716 {
717     sal_Bool bChecked = aDropCapsBox.IsChecked();
718 
719     aWholeWordCB  .Enable( bChecked && !bHtmlMode );
720 
721     aSwitchText.Enable( bChecked && !aWholeWordCB.IsChecked() );
722     aDropCapsField.Enable( bChecked && !aWholeWordCB.IsChecked() );
723     aLinesText   .Enable( bChecked );
724     aLinesField   .Enable( bChecked );
725     aDistanceText.Enable( bChecked );
726     aDistanceField.Enable( bChecked );
727     aTemplateText .Enable( bChecked );
728     aTemplateBox  .Enable( bChecked );
729     aTextEdit     .Enable( bChecked && !bFormat );
730     aTextText     .Enable( bChecked && !bFormat );
731 
732     if ( bChecked )
733     {
734         ModifyHdl(&aDropCapsField);
735         aDropCapsField.GrabFocus();
736     }
737     else
738         pPict->SetText(aEmptyStr);
739 
740     bModified = sal_True;
741 
742     return 0;
743 }
744 
745 /****************************************************************************
746 Page: Click-Handler der CheckBox
747 ****************************************************************************/
748 
749 
IMPL_LINK(SwDropCapsPage,WholeWordHdl,CheckBox *,EMPTYARG)750 IMPL_LINK( SwDropCapsPage, WholeWordHdl, CheckBox *, EMPTYARG )
751 {
752     aDropCapsField.Enable( !aWholeWordCB.IsChecked() );
753 
754     ModifyHdl(&aDropCapsField);
755 
756     bModified = sal_True;
757 
758     return 0;
759 }
760 
761 /****************************************************************************
762 Page: Modify-Handler der SpinFields
763 ****************************************************************************/
764 
765 
IMPL_LINK(SwDropCapsPage,ModifyHdl,Edit *,pEdit)766 IMPL_LINK( SwDropCapsPage, ModifyHdl, Edit *, pEdit )
767 {
768     String sPreview;
769 
770     // Ggf. Text setzen
771     if (pEdit == &aDropCapsField)
772     {
773         sal_uInt16 nVal;
774         sal_Bool bSetText = sal_False;
775 
776         if (!aWholeWordCB.IsChecked())
777             nVal = (sal_uInt16)aDropCapsField.GetValue();
778         else
779             nVal = 0;
780 
781         if (bFormat || !rSh.GetDropTxt(1).Len())
782             sPreview = GetDefaultString(nVal);
783         else
784         {
785             bSetText = sal_True;
786             sPreview = rSh.GetDropTxt(nVal);
787         }
788 
789         String sEdit(aTextEdit.GetText());
790 
791         if (sEdit.Len() && sPreview.CompareTo(sEdit, sEdit.Len()) != COMPARE_EQUAL)
792         {
793             sPreview = sEdit.Copy(0, sPreview.Len());
794             bSetText = sal_False;
795         }
796 
797         if (bSetText)
798             aTextEdit.SetText(sPreview);
799     }
800     else if (pEdit == &aTextEdit)   // Ggf. Anzahl setzen
801     {
802         sal_uInt16 nTmp = aTextEdit.GetText().Len();
803         aDropCapsField.SetValue(Max((sal_uInt16)1, nTmp));
804 
805         sPreview = aTextEdit.GetText().Copy(0, nTmp);
806     }
807 
808     // Bild anpassen
809     if (pEdit == &aDropCapsField || pEdit == &aTextEdit)
810         pPict->SetText (sPreview);
811     else if (pEdit == &aLinesField)
812         pPict->SetLines((sal_uInt8)aLinesField.GetValue());
813     else
814         pPict->SetDistance((sal_uInt16)aDistanceField.Denormalize(aDistanceField.GetValue(FUNIT_TWIP)));
815 
816     bModified = sal_True;
817 
818     return 0;
819 }
820 
821 /****************************************************************************
822 Page: Select-Handler der Template-Box.
823 *****************************************************************************/
824 
825 
IMPL_LINK_INLINE_START(SwDropCapsPage,SelectHdl,ListBox *,EMPTYARG)826 IMPL_LINK_INLINE_START( SwDropCapsPage, SelectHdl, ListBox *, EMPTYARG )
827 {
828     pPict->UpdatePaintSettings();
829     bModified = sal_True;
830     return 0;
831 }
IMPL_LINK_INLINE_END(SwDropCapsPage,SelectHdl,ListBox *,EMPTYARG)832 IMPL_LINK_INLINE_END( SwDropCapsPage, SelectHdl, ListBox *, EMPTYARG )
833 
834 
835 sal_uInt16*  SwDropCapsPage::GetRanges()
836 {
837     return aPageRg;
838 }
839 
840 
FillSet(SfxItemSet & rSet)841 void SwDropCapsPage::FillSet( SfxItemSet &rSet )
842 {
843     if(bModified)
844     {
845         SwFmtDrop aFmt;
846 
847         sal_Bool bOn = aDropCapsBox.IsChecked();
848         if(bOn)
849         {
850             // Anzahl, Zeilen, Abstand
851             aFmt.GetChars()     = (sal_uInt8) aDropCapsField.GetValue();
852             aFmt.GetLines()     = (sal_uInt8) aLinesField.GetValue();
853             aFmt.GetDistance()  = (sal_uInt16) aDistanceField.Denormalize(aDistanceField.GetValue(FUNIT_TWIP));
854             aFmt.GetWholeWord() = aWholeWordCB.IsChecked();
855 
856             // Vorlage
857             if (aTemplateBox.GetSelectEntryPos())
858                 aFmt.SetCharFmt(rSh.GetCharStyle(aTemplateBox.GetSelectEntry()));
859         }
860         else
861         {
862             aFmt.GetChars()    = 1;
863             aFmt.GetLines()    = 1;
864             aFmt.GetDistance() = 0;
865         }
866 
867         // Attribute setzen
868         const SfxPoolItem* pOldItem;
869         if(0 == (pOldItem = GetOldItem( rSet, FN_FORMAT_DROPCAPS )) ||
870                     aFmt != *pOldItem )
871             rSet.Put(aFmt);
872 
873         // Harte Textformatierung
874         // Bug 24974: In Gestalter/Vorlagenkatoplog macht das keinen Sinn!!
875         if( !bFormat && aDropCapsBox.IsChecked() )
876         {
877             String sText(aTextEdit.GetText());
878 
879             if (!aWholeWordCB.IsChecked())
880                 sText.Erase( static_cast< xub_StrLen >(aDropCapsField.GetValue()));
881 
882             SfxStringItem aStr(FN_PARAM_1, sText);
883             rSet.Put( aStr );
884         }
885     }
886 }
887 
888 
889 
890 
891