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_sfx2.hxx" 26 27 // include --------------------------------------------------------------- 28 29 #ifndef _MSGBOX_HXX //autogen 30 #include <vcl/msgbox.hxx> 31 #endif 32 #include <vcl/field.hxx> 33 #include <svl/eitem.hxx> 34 #include <svl/intitem.hxx> 35 #include <svl/style.hxx> 36 #ifndef GCC 37 #endif 38 39 #include <sfx2/styfitem.hxx> 40 #include <sfx2/styledlg.hxx> 41 #include <sfx2/app.hxx> 42 #include <sfx2/mgetempl.hxx> 43 #include <sfx2/objsh.hxx> 44 #include "sfxtypes.hxx" 45 #include "sfx2/sfxresid.hxx" 46 #include <sfx2/module.hxx> 47 48 #include <sfx2/sfx.hrc> 49 #include "dialog.hrc" 50 #include "mgetempl.hrc" 51 52 #ifndef _SFX_STYLE_HRC 53 #include <svl/style.hrc> 54 #endif 55 56 // SfxManageStyleSheetPage ----------------------------------------------- 57 58 SfxManageStyleSheetPage::SfxManageStyleSheetPage( Window* pParent, const SfxItemSet& rAttrSet ) : 59 60 SfxTabPage( pParent, SfxResId( TP_MANAGE_STYLES ), rAttrSet ), 61 62 aNameFt ( this, SfxResId( FT_NAME ) ), 63 aNameEd ( this, SfxResId( ED_NAME ) ), 64 aNameMLE ( this, SfxResId( MLE_NAME ) ), 65 aAutoCB ( this, SfxResId( CB_AUTO ) ), 66 67 aFollowFt ( this, SfxResId( FT_NEXT ) ), 68 aFollowLb ( this, SfxResId( LB_NEXT ) ), 69 70 aBaseFt ( this, SfxResId( FT_BASE ) ), 71 aBaseLb ( this, SfxResId( LB_BASE ) ), 72 73 aFilterFt ( this, SfxResId( FT_REGION ) ), 74 aFilterLb ( this, SfxResId( LB_REGION ) ), 75 76 aDescGb ( this, SfxResId( GB_DESC ) ), 77 aDescFt ( this, SfxResId( FT_DESC ) ), 78 aDescED ( this, SfxResId( ED_DESC ) ), 79 80 pStyle( &( (SfxStyleDialog*)pParent->GetParent() )->GetStyleSheet() ), 81 82 pItem ( 0 ), 83 bModified ( sal_False ), 84 aName ( pStyle->GetName() ), 85 aFollow ( pStyle->GetFollow() ), 86 aParent ( pStyle->GetParent() ), 87 nFlags ( pStyle->GetMask() ) 88 89 /* [Beschreibung] 90 91 Konstruktor; initialisiert die ListBoxen mit den Vorlagen 92 93 */ 94 95 { 96 FreeResource(); 97 98 if ( IsBackground() ) 99 aDescED.SetBackground( GetBackground() ); 100 FixedInfo* pInfo = new FixedInfo( this ); 101 aDescED.SetFont( pInfo->GetFont() ); 102 delete pInfo; 103 104 aDescED.Hide(); 105 aDescFt.Show(); 106 107 // diese Page braucht ExchangeSupport 108 SetExchangeSupport(); 109 110 ResMgr* pResMgr = SFX_APP()->GetModule_Impl()->GetResMgr(); 111 DBG_ASSERT( pResMgr, "kein ResMgr am Modul" ); 112 pFamilies = new SfxStyleFamilies( ResId( DLG_STYLE_DESIGNER, *pResMgr ) ); 113 114 SfxStyleSheetBasePool* pPool = 0; 115 SfxObjectShell* pDocShell = SfxObjectShell::Current(); 116 117 if ( pDocShell ) 118 pPool = pDocShell->GetStyleSheetPool(); 119 DBG_ASSERT( pPool, "kein Pool oder keine DocShell" ); 120 121 if ( pPool ) 122 { 123 pPool->SetSearchMask( pStyle->GetFamily() ); 124 pPool->First(); // fuer SW - interne Liste updaten 125 } 126 127 if ( !pStyle->GetName().Len() && pPool ) 128 { 129 // NullString als Name -> Name generieren 130 String aNoName( SfxResId( STR_NONAME ) ); 131 sal_uInt16 nNo = 1; 132 String aNo( aNoName ); 133 aNoName += String::CreateFromInt32( nNo ); 134 while ( pPool->Find( aNoName ) ) 135 { 136 ++nNo; 137 aNoName = aNo; 138 aNoName += String::CreateFromInt32( nNo ); 139 } 140 pStyle->SetName( aNoName ); 141 aName = aNoName; 142 aFollow = pStyle->GetFollow(); 143 aParent = pStyle->GetParent(); 144 } 145 aNameEd.SetText(pStyle->GetName()); 146 147 // Set the field read-only if it is NOT an user-defined style 148 // but allow selecting and copying 149 if ( !pStyle->IsUserDefined() ) { 150 aNameEd.SetReadOnly(); 151 aNameEd.Hide(); 152 153 aNameMLE.SetControlBackground( GetSettings().GetStyleSettings().GetDialogColor() ); 154 aNameMLE.SetText( pStyle->GetName() ); 155 aNameMLE.EnableCursor( sal_False ); 156 aNameMLE.Show(); 157 } 158 159 if ( pStyle->HasFollowSupport() && pPool ) 160 { 161 SfxStyleSheetBase* pPoolStyle = pPool->First(); 162 163 while ( pPoolStyle ) 164 { 165 aFollowLb.InsertEntry( pPoolStyle->GetName() ); 166 pPoolStyle = pPool->Next(); 167 } 168 169 // eine neue Vorlage ist noch nicht im Pool 170 if ( LISTBOX_ENTRY_NOTFOUND == aFollowLb.GetEntryPos( pStyle->GetName() ) ) 171 aFollowLb.InsertEntry( pStyle->GetName() ); 172 } 173 else 174 { 175 aFollowFt.Hide(); 176 aFollowLb.Hide(); 177 178 aFilterFt.SetPosPixel( aBaseFt.GetPosPixel() ); 179 aFilterLb.SetPosPixel( aBaseLb.GetPosPixel() ); 180 181 aBaseFt.SetPosPixel( aFollowFt.GetPosPixel() ); 182 aBaseLb.SetPosPixel( aFollowLb.GetPosPixel() ); 183 } 184 185 if ( pStyle->HasParentSupport() && pPool ) 186 { 187 if ( pStyle->HasClearParentSupport() ) 188 // die Basisvorlage darf auf NULL gesetzt werden 189 aBaseLb.InsertEntry( String( SfxResId( STR_NONE ) ) ); 190 191 SfxStyleSheetBase* pPoolStyle = pPool->First(); 192 193 while ( pPoolStyle ) 194 { 195 const String aStr( pPoolStyle->GetName() ); 196 // eigener Namen nicht als Basisvorlage 197 if ( aStr != aName ) 198 aBaseLb.InsertEntry( aStr ); 199 pPoolStyle = pPool->Next(); 200 } 201 } 202 else 203 { 204 aBaseFt.Disable(); 205 aBaseLb.Disable(); 206 } 207 sal_uInt16 nCount = pFamilies->Count(); 208 209 sal_uInt16 i; 210 for ( i = 0; i < nCount; ++i ) 211 { 212 pItem = pFamilies->GetObject(i); 213 214 if ( pItem->GetFamily() == pStyle->GetFamily() ) 215 break; 216 } 217 218 sal_uInt16 nStyleFilterIdx = 0xffff; 219 220 if ( i < nCount ) 221 { 222 // Filterflags 223 const SfxStyleFilter& rList = pItem->GetFilterList(); 224 nCount = (sal_uInt16)rList.Count(); 225 sal_uInt16 nIdx = 0; 226 sal_uInt16 nMask = pStyle->GetMask() & ~SFXSTYLEBIT_USERDEF; 227 228 if ( !nMask ) // Benutzervorlage? 229 nMask = pStyle->GetMask(); 230 231 for ( i = 0; i < nCount; ++i ) 232 { 233 SfxFilterTupel* pTupel = rList.GetObject(i); 234 235 if ( pTupel->nFlags != SFXSTYLEBIT_AUTO && 236 pTupel->nFlags != SFXSTYLEBIT_USED && 237 // pTupel->nFlags != SFXSTYLEBIT_USERDEF && 238 pTupel->nFlags != SFXSTYLEBIT_ALL ) 239 { 240 aFilterLb.InsertEntry( pTupel->aName, nIdx ); 241 aFilterLb.SetEntryData(nIdx, (void*)(long)i); 242 243 if ( ( pTupel->nFlags & nMask ) == nMask ) 244 nStyleFilterIdx = nIdx; 245 ++nIdx; 246 } 247 } 248 249 if ( nStyleFilterIdx != 0xFFFF ) 250 aFilterLb.SelectEntryPos( nStyleFilterIdx ); 251 } 252 253 if ( !aFilterLb.GetEntryCount() || !pStyle->IsUserDefined() ) 254 { 255 pItem = 0; 256 aFilterFt.Disable(); 257 aFilterLb.Disable(); 258 } 259 else 260 aFilterLb.SaveValue(); 261 SetDescriptionText_Impl(); 262 263 if ( aFollowLb.IsEnabled() || aBaseLb.IsEnabled() ) 264 { 265 aNameEd.SetGetFocusHdl( 266 LINK( this, SfxManageStyleSheetPage, GetFocusHdl ) ); 267 aNameEd.SetLoseFocusHdl( 268 LINK( this, SfxManageStyleSheetPage, LoseFocusHdl ) ); 269 } 270 // ist es ein Style mit automatischem Update? (nur SW) 271 if(SFX_ITEM_SET == rAttrSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE)) 272 { 273 Size aSize = aNameEd.GetSizePixel(); 274 aSize.Width() /= 2; 275 aNameEd.SetSizePixel(aSize); 276 aAutoCB.Show(); 277 } 278 } 279 280 //------------------------------------------------------------------------- 281 282 SfxManageStyleSheetPage::~SfxManageStyleSheetPage() 283 284 /* [Beschreibung] 285 286 Destruktor; Freigabe der Daten 287 288 */ 289 290 { 291 aNameEd.SetGetFocusHdl( Link() ); 292 aNameEd.SetLoseFocusHdl( Link() ); 293 delete pFamilies; 294 pItem = 0; 295 pStyle = 0; 296 297 } 298 299 //------------------------------------------------------------------------- 300 301 void SfxManageStyleSheetPage::UpdateName_Impl( ListBox* pBox, 302 const String& rNew ) 303 304 /* [Beschreibung] 305 306 Nach der "Anderung eines Vorlagennamens die ListBox pBox 307 aktualisieren 308 309 [Parameter] 310 311 ListBox* pBox ListBox, deren Eintr"age aktualisiert 312 werden sollen 313 const String& rNew der neue Name 314 315 */ 316 317 { 318 if ( pBox->IsEnabled() ) 319 { 320 // ist der aktuelle Eintrag, dessen Namen modifizieren wurde 321 const sal_Bool bSelect = pBox->GetSelectEntry() == aBuf; 322 pBox->RemoveEntry( aBuf ); 323 pBox->InsertEntry( rNew ); 324 325 if ( bSelect ) 326 pBox->SelectEntry( rNew ); 327 } 328 } 329 330 //------------------------------------------------------------------------- 331 332 void SfxManageStyleSheetPage::SetDescriptionText_Impl() 333 334 /* [Beschreibung] 335 336 Attributbeschreibung setzen. daf"ur die eingestellte Metrik besorgen. 337 */ 338 339 { 340 SfxMapUnit eUnit = SFX_MAPUNIT_CM; 341 // FieldUnit eFieldUnit = pSfxApp->GetOptions().GetMetric(); 342 FieldUnit eFieldUnit( FUNIT_CM ); 343 SfxModule* pModule = SfxModule::GetActiveModule(); 344 if ( pModule ) 345 { 346 const SfxPoolItem* pPoolItem = pModule->GetItem( SID_ATTR_METRIC ); 347 if ( pPoolItem ) 348 eFieldUnit = (FieldUnit)( (SfxUInt16Item*)pPoolItem )->GetValue(); 349 } 350 351 switch ( eFieldUnit ) 352 { 353 case FUNIT_MM: eUnit = SFX_MAPUNIT_MM; break; 354 355 case FUNIT_CM: 356 case FUNIT_M: 357 case FUNIT_KM: eUnit = SFX_MAPUNIT_CM; break; 358 359 case FUNIT_POINT: 360 case FUNIT_PICA: eUnit = SFX_MAPUNIT_POINT; break; 361 362 case FUNIT_INCH: 363 case FUNIT_FOOT: 364 case FUNIT_MILE: eUnit = SFX_MAPUNIT_INCH; break; 365 366 default: 367 DBG_ERRORFILE( "not supported fieldunit" ); 368 } 369 aDescFt.SetText( pStyle->GetDescription( eUnit ) ); 370 } 371 372 //------------------------------------------------------------------------- 373 374 IMPL_LINK_INLINE_START( SfxManageStyleSheetPage, GetFocusHdl, Edit *, pEdit ) 375 376 /* [Beschreibung] 377 378 StarView Handler; GetFocus-Handler des Edits mit dem Vorlagennamen. 379 380 */ 381 382 { 383 aBuf = pEdit->GetText().EraseLeadingChars(); 384 return 0; 385 } 386 IMPL_LINK_INLINE_END( SfxManageStyleSheetPage, GetFocusHdl, Edit *, pEdit ) 387 388 //------------------------------------------------------------------------- 389 390 IMPL_LINK_INLINE_START( SfxManageStyleSheetPage, LoseFocusHdl, Edit *, pEdit ) 391 392 /* [Beschreibung] 393 394 StarView Handler; LoseFocus-Handler des Edits mit dem Vorlagennamen. 395 Dieser aktualisiert ggf. die Listbox mit den Folgevorlagen. 396 In der Listbox mit den Basisvorlagen ist die aktuelle Vorlage 397 selbst nicht enthalten. 398 399 */ 400 401 { 402 const String aStr( pEdit->GetText().EraseLeadingChars() ); 403 pEdit->SetText( aStr ); 404 // ggf. Listbox der Basisvorlagen aktualisieren 405 if ( aStr != aBuf ) 406 UpdateName_Impl( &aFollowLb, aStr ); 407 return 0; 408 } 409 IMPL_LINK_INLINE_END( SfxManageStyleSheetPage, LoseFocusHdl, Edit *, pEdit ) 410 411 //------------------------------------------------------------------------- 412 413 sal_Bool SfxManageStyleSheetPage::FillItemSet( SfxItemSet& rSet ) 414 415 /* [Beschreibung] 416 417 418 Handler f"ur das Setzen der (modifizierten) Daten. Wird aus 419 dem Ok des SfxTabDialog gerufen. 420 421 [Parameter] 422 423 SfxItemSet &rAttrSet das Set, das die Daten entgegennimmt. 424 425 426 [R"uckgabewert] 427 428 sal_Bool sal_True: es hat eine "Anderung der Daten 429 stattgefunden 430 sal_False: es hat keine "Anderung der Daten 431 stattgefunden 432 433 [Querverweise] 434 435 <class SfxTabDialog> 436 437 */ 438 439 { 440 const sal_uInt16 nFilterIdx = aFilterLb.GetSelectEntryPos(); 441 442 // Filter setzen 443 444 if ( LISTBOX_ENTRY_NOTFOUND != nFilterIdx && 445 nFilterIdx != aFilterLb.GetSavedValue() && 446 aFilterLb.IsEnabled() ) 447 { 448 bModified = sal_True; 449 DBG_ASSERT( pItem, "kein Item" ); 450 // geht nur bei Benutzervorlagen 451 #if OSL_DEBUG_LEVEL > 1 452 sal_uInt16 nIdx = (sal_uInt16)(long)aFilterLb.GetEntryData( nFilterIdx ); 453 SfxFilterTupel* p; 454 p = pItem->GetFilterList().GetObject( nIdx ); 455 #endif 456 sal_uInt16 nMask = pItem->GetFilterList().GetObject( 457 (sal_uInt16)(long)aFilterLb.GetEntryData( nFilterIdx ) )->nFlags | 458 SFXSTYLEBIT_USERDEF; 459 pStyle->SetMask( nMask ); 460 } 461 if(aAutoCB.IsVisible() && 462 aAutoCB.IsChecked() != aAutoCB.GetSavedValue()) 463 { 464 rSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, aAutoCB.IsChecked())); 465 } 466 467 return bModified; 468 } 469 470 //------------------------------------------------------------------------- 471 472 void SfxManageStyleSheetPage::Reset( const SfxItemSet& /*rAttrSet*/ ) 473 474 /* [Beschreibung] 475 476 477 Handler f"ur das Initialisieren der Seite mit den initialen Daten. 478 479 [Parameter] 480 481 const SfxItemSet &rAttrSet das Set mit den Daten 482 483 484 [Querverweise] 485 486 <class SfxTabDialog> 487 488 */ 489 490 { 491 bModified = sal_False; 492 String sCmp( pStyle->GetName() ); 493 494 if ( sCmp != aName ) 495 pStyle->SetName( aName ); 496 aNameEd.SetText( aName ); 497 aNameEd.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) ); 498 499 if ( aFollowLb.IsEnabled() ) 500 { 501 sCmp = pStyle->GetFollow(); 502 503 if ( sCmp != aFollow ) 504 pStyle->SetFollow( aFollow ); 505 506 if ( !aFollow.Len() ) 507 aFollowLb.SelectEntry( aName ); 508 else 509 aFollowLb.SelectEntry( aFollow ); 510 } 511 512 if ( aBaseLb.IsEnabled() ) 513 { 514 sCmp = pStyle->GetParent(); 515 516 if ( sCmp != aParent ) 517 pStyle->SetParent( aParent ); 518 519 if ( !aParent.Len() ) 520 aBaseLb.SelectEntry( String( SfxResId( STR_NONE ) ) ); 521 else 522 aBaseLb.SelectEntry( aParent ); 523 524 if ( String( SfxResId( STR_STANDARD ) ) == aName ) 525 { 526 // die Standardvorlage kann nicht verkn"upft werden 527 aBaseFt.Disable(); 528 aBaseLb.Disable(); 529 } 530 } 531 532 if ( aFilterLb.IsEnabled() ) 533 { 534 sal_uInt16 nCmp = pStyle->GetMask(); 535 536 if ( nCmp != nFlags ) 537 pStyle->SetMask( nFlags ); 538 aFilterLb.SelectEntryPos( aFilterLb.GetSavedValue() ); 539 } 540 } 541 542 //------------------------------------------------------------------------- 543 544 SfxTabPage* SfxManageStyleSheetPage::Create( Window* pParent, 545 const SfxItemSet &rAttrSet ) 546 547 /* [Beschreibung] 548 549 550 Factory f"ur das Erzeugen der Seite 551 552 [Querverweise] 553 554 <class SfxTabDialog> 555 556 */ 557 558 { 559 return new SfxManageStyleSheetPage( pParent, rAttrSet ); 560 } 561 562 //------------------------------------------------------------------------- 563 564 void SfxManageStyleSheetPage::ActivatePage( const SfxItemSet& rSet) 565 566 /* [Beschreibung] 567 568 ActivatePage- Handler des SfxTabDialog; wird f"ur die Aktualisierung 569 des beschreibenden Textes verwendet, da sich dieser durch "Anderungen 570 der Daten anderer Seiten ge"andert haben kann. 571 572 [Parameter] 573 574 const SfxItemSet& das Set f"ur den Datenaustausch; wird 575 hier nicht verwendet. 576 577 [Querverweise] 578 579 <SfxTabDialog::ActivatePage(const SfxItemSet &)> 580 581 */ 582 583 { 584 SetDescriptionText_Impl(); 585 586 // ist es ein Style mit automatischem Update? (nur SW) 587 const SfxPoolItem* pPoolItem; 588 589 if ( SFX_ITEM_SET == 590 rSet.GetItemState( SID_ATTR_AUTO_STYLE_UPDATE, sal_False, &pPoolItem ) ) 591 aAutoCB.Check( ( (const SfxBoolItem*)pPoolItem )->GetValue() ); 592 aAutoCB.SaveValue(); 593 } 594 595 //------------------------------------------------------------------------- 596 597 int SfxManageStyleSheetPage::DeactivatePage( SfxItemSet* pItemSet ) 598 599 /* [Beschreibung] 600 601 DeactivatePage- Handler des SfxTabDialog; die Daten werden 602 an der Vorlage eingestellt, damit die richtige Vererbung 603 f"ur die anderen Seiten des Dialoges vorliegt. 604 Im Fehlerfall wird das Verlassen der Seite unterbunden. 605 606 [Parameter] 607 608 SfxItemSet* das Set f"ur den Datenaustausch; wird hier nicht verwendet. 609 610 [Querverweise] 611 612 <SfxTabDialog::DeactivatePage(SfxItemSet*)> 613 614 */ 615 616 { 617 int nRet = SfxTabPage::LEAVE_PAGE; 618 619 if ( aNameEd.IsModified() ) 620 { 621 // bei <Enter> wird kein LoseFocus() durch StarView ausgel"ost 622 if ( aNameEd.HasFocus() ) 623 LoseFocusHdl( &aNameEd ); 624 625 if ( !pStyle->SetName( aNameEd.GetText().EraseLeadingChars() ) ) 626 { 627 InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDNAME ) ); 628 aBox.Execute(); 629 aNameEd.GrabFocus(); 630 aNameEd.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) ); 631 return SfxTabPage::KEEP_PAGE; 632 } 633 bModified = sal_True; 634 } 635 636 if ( pStyle->HasFollowSupport() && aFollowLb.IsEnabled() ) 637 { 638 const String aFollowEntry( aFollowLb.GetSelectEntry() ); 639 640 if ( pStyle->GetFollow() != aFollowEntry ) 641 { 642 if ( !pStyle->SetFollow( aFollowEntry ) ) 643 { 644 InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDSTYLE ) ); 645 aBox.Execute(); 646 aFollowLb.GrabFocus(); 647 return SfxTabPage::KEEP_PAGE; 648 } 649 bModified = sal_True; 650 } 651 } 652 653 if ( aBaseLb.IsEnabled() ) 654 { 655 String aParentEntry( aBaseLb.GetSelectEntry() ); 656 657 if ( String( SfxResId( STR_NONE ) ) == aParentEntry || aParentEntry == pStyle->GetName() ) 658 aParentEntry.Erase(); 659 660 if ( pStyle->GetParent() != aParentEntry ) 661 { 662 if ( !pStyle->SetParent( aParentEntry ) ) 663 { 664 InfoBox aBox( this, SfxResId( MSG_TABPAGE_INVALIDPARENT ) ); 665 aBox.Execute(); 666 aBaseLb.GrabFocus(); 667 return SfxTabPage::KEEP_PAGE; 668 } 669 bModified = sal_True; 670 nRet |= (int)SfxTabPage::REFRESH_SET; 671 } 672 } 673 674 if ( pItemSet ) 675 FillItemSet( *pItemSet ); 676 677 return nRet; 678 } 679 680