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