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