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_cui.hxx" 30 31 // include --------------------------------------------------------------- 32 #include <vcl/wrkwin.hxx> 33 #include <tools/shl.hxx> 34 #include <tools/urlobj.hxx> 35 #include <vcl/msgbox.hxx> 36 #include <unotools/pathoptions.hxx> 37 #include <sfx2/app.hxx> 38 #include <sfx2/filedlghelper.hxx> 39 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp" 40 41 #define _SVX_TPGRADNT_CXX 42 43 #include <cuires.hrc> 44 #include "helpid.hrc" 45 #include "svx/xattr.hxx" 46 #include <svx/xtable.hxx> 47 #include <svx/xpool.hxx> 48 #include "svx/drawitem.hxx" 49 #include "cuitabarea.hxx" 50 #include "tabarea.hrc" 51 #include "defdlgname.hxx" //CHINA001 #include "dlgname.hxx" 52 //#include "dlgname.hrc" 53 #include <svx/svxdlg.hxx> //CHINA001 54 #include <dialmgr.hxx> 55 #include <svx/dialmgr.hxx> 56 #include <svx/dialogs.hrc> 57 #include "paragrph.hrc" 58 59 #define DLGWIN this->GetParent()->GetParent() 60 61 #define BITMAP_WIDTH 32 62 #define BITMAP_HEIGHT 12 63 64 /************************************************************************* 65 |* 66 |* Dialog zum Aendern und Definieren der Farbverlaeufe 67 |* 68 \************************************************************************/ 69 70 SvxGradientTabPage::SvxGradientTabPage 71 ( 72 Window* pParent, 73 const SfxItemSet& rInAttrs 74 ) : 75 SfxTabPage ( pParent, CUI_RES( RID_SVXPAGE_GRADIENT ), rInAttrs ), 76 77 aFlProp ( this, CUI_RES( FL_PROP ) ), 78 aFtType ( this, CUI_RES( FT_TYPE ) ), 79 aLbGradientType ( this, CUI_RES( LB_GRADIENT_TYPES ) ), 80 aFtCenterX ( this, CUI_RES( FT_CENTER_X ) ), 81 aMtrCenterX ( this, CUI_RES( MTR_CENTER_X ) ), 82 aFtCenterY ( this, CUI_RES( FT_CENTER_Y ) ), 83 aMtrCenterY ( this, CUI_RES( MTR_CENTER_Y ) ), 84 aFtAngle ( this, CUI_RES( FT_ANGLE ) ), 85 aMtrAngle ( this, CUI_RES( MTR_ANGLE ) ), 86 aFtBorder ( this, CUI_RES( FT_BORDER ) ), 87 aMtrBorder ( this, CUI_RES( MTR_BORDER ) ), 88 aFtColorFrom ( this, CUI_RES( FT_COLOR_FROM ) ), 89 aLbColorFrom ( this, CUI_RES( LB_COLOR_FROM ) ), 90 aMtrColorFrom ( this, CUI_RES( MTR_COLOR_FROM ) ), 91 aFtColorTo ( this, CUI_RES( FT_COLOR_TO ) ), 92 aLbColorTo ( this, CUI_RES( LB_COLOR_TO ) ), 93 aMtrColorTo ( this, CUI_RES( MTR_COLOR_TO ) ), 94 aLbGradients ( this, CUI_RES( LB_GRADIENTS ) ), 95 aCtlPreview ( this, CUI_RES( CTL_PREVIEW ) ), 96 aBtnAdd ( this, CUI_RES( BTN_ADD ) ), 97 aBtnModify ( this, CUI_RES( BTN_MODIFY ) ), 98 aBtnDelete ( this, CUI_RES( BTN_DELETE ) ), 99 aBtnLoad ( this, CUI_RES( BTN_LOAD ) ), 100 aBtnSave ( this, CUI_RES( BTN_SAVE ) ), 101 102 rOutAttrs ( rInAttrs ), 103 104 pColorTab( NULL ), 105 pGradientList( NULL ), 106 107 pXPool ( (XOutdevItemPool*) rInAttrs.GetPool() ), 108 aXFStyleItem ( XFILL_GRADIENT ), 109 aXGradientItem ( String(), XGradient( COL_BLACK, COL_WHITE ) ), 110 aXFillAttr ( pXPool ), 111 rXFSet ( aXFillAttr.GetItemSet() ) 112 { 113 aBtnLoad.SetModeImage( Image( CUI_RES( RID_SVXIMG_LOAD_H ) ), BMP_COLOR_HIGHCONTRAST ); 114 aBtnSave.SetModeImage( Image( CUI_RES( RID_SVXIMG_SAVE_H ) ), BMP_COLOR_HIGHCONTRAST ); 115 116 FreeResource(); 117 118 aCtlPreview.SetAccessibleName(String(CUI_RES(STR_EXAMPLE))); 119 aLbGradients.SetAccessibleName( GetText()); 120 121 122 // diese Page braucht ExchangeSupport 123 SetExchangeSupport(); 124 125 // Solange NICHT vom Item unterstuetzt 126 127 //aMtrColorTo.Disable(); 128 aMtrColorTo.SetValue( 100 ); 129 //aMtrColorFrom.Disable(); 130 aMtrColorFrom.SetValue( 100 ); 131 132 // Setzen des Output-Devices 133 rXFSet.Put( aXFStyleItem ); 134 rXFSet.Put( aXGradientItem ); 135 aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() ); 136 137 // Handler ueberladen 138 aLbGradients.SetSelectHdl( 139 LINK( this, SvxGradientTabPage, ChangeGradientHdl_Impl ) ); 140 aBtnAdd.SetClickHdl( LINK( this, SvxGradientTabPage, ClickAddHdl_Impl ) ); 141 aBtnModify.SetClickHdl( 142 LINK( this, SvxGradientTabPage, ClickModifyHdl_Impl ) ); 143 aBtnDelete.SetClickHdl( 144 LINK( this, SvxGradientTabPage, ClickDeleteHdl_Impl ) ); 145 146 Link aLink = LINK( this, SvxGradientTabPage, ModifiedHdl_Impl ); 147 aLbGradientType.SetSelectHdl( aLink ); 148 aMtrCenterX.SetModifyHdl( aLink ); 149 aMtrCenterY.SetModifyHdl( aLink ); 150 aMtrAngle.SetModifyHdl( aLink ); 151 aMtrBorder.SetModifyHdl( aLink ); 152 aMtrColorFrom.SetModifyHdl( aLink ); 153 aLbColorFrom.SetSelectHdl( aLink ); 154 aMtrColorTo.SetModifyHdl( aLink ); 155 aLbColorTo.SetSelectHdl( aLink ); 156 157 aBtnLoad.SetClickHdl( 158 LINK( this, SvxGradientTabPage, ClickLoadHdl_Impl ) ); 159 aBtnSave.SetClickHdl( 160 LINK( this, SvxGradientTabPage, ClickSaveHdl_Impl ) ); 161 162 aBtnAdd.SetAccessibleRelationMemberOf( &aFlProp ); 163 aBtnModify.SetAccessibleRelationMemberOf( &aFlProp ); 164 aBtnDelete.SetAccessibleRelationMemberOf( &aFlProp ); 165 aLbGradients.SetAccessibleRelationLabeledBy(&aLbGradients); 166 167 // #i76307# always paint the preview in LTR, because this is what the document does 168 aCtlPreview.EnableRTL( sal_False ); 169 } 170 171 // ----------------------------------------------------------------------- 172 173 void SvxGradientTabPage::Construct() 174 { 175 // Farbtabelle 176 aLbColorFrom.Fill( pColorTab ); 177 aLbColorTo.CopyEntries( aLbColorFrom ); 178 179 // Farbverlauftabelle 180 aLbGradients.Fill( pGradientList ); 181 } 182 183 // ----------------------------------------------------------------------- 184 185 void SvxGradientTabPage::ActivatePage( const SfxItemSet& ) 186 { 187 sal_uInt16 nPos; 188 sal_uInt16 nCount; 189 190 if( *pDlgType == 0 ) // Flaechen-Dialog 191 { 192 *pbAreaTP = sal_False; 193 194 if( pColorTab ) 195 { 196 // ColorTable 197 if( *pnColorTableState & CT_CHANGED || 198 *pnColorTableState & CT_MODIFIED ) 199 { 200 if( *pnColorTableState & CT_CHANGED ) 201 pColorTab = ( (SvxAreaTabDialog*) DLGWIN )->GetNewColorTable(); 202 203 // LbColorFrom 204 nPos = aLbColorFrom.GetSelectEntryPos(); 205 aLbColorFrom.Clear(); 206 aLbColorFrom.Fill( pColorTab ); 207 nCount = aLbColorFrom.GetEntryCount(); 208 if( nCount == 0 ) 209 ; // Dieser Fall sollte nicht auftreten 210 else if( nCount <= nPos ) 211 aLbColorFrom.SelectEntryPos( 0 ); 212 else 213 aLbColorFrom.SelectEntryPos( nPos ); 214 215 // LbColorTo 216 nPos = aLbColorTo.GetSelectEntryPos(); 217 aLbColorTo.Clear(); 218 aLbColorTo.CopyEntries( aLbColorFrom ); 219 nCount = aLbColorTo.GetEntryCount(); 220 if( nCount == 0 ) 221 ; // Dieser Fall sollte nicht auftreten 222 else if( nCount <= nPos ) 223 aLbColorTo.SelectEntryPos( 0 ); 224 else 225 aLbColorTo.SelectEntryPos( nPos ); 226 227 ModifiedHdl_Impl( this ); 228 } 229 230 // Ermitteln (evtl. abschneiden) des Namens und in 231 // der GroupBox darstellen 232 String aString( CUI_RES( RID_SVXSTR_TABLE ) ); aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) ); 233 INetURLObject aURL( pGradientList->GetPath() ); 234 235 aURL.Append( pGradientList->GetName() ); 236 DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 237 238 if ( aURL.getBase().getLength() > 18 ) 239 { 240 aString += String(aURL.getBase()).Copy( 0, 15 ); 241 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) ); 242 } 243 else 244 aString += String(aURL.getBase()); 245 246 if ( *pPageType == PT_GRADIENT && *pPos != LISTBOX_ENTRY_NOTFOUND ) 247 { 248 aLbGradients.SelectEntryPos( *pPos ); 249 } 250 // Farben koennten geloescht worden sein 251 ChangeGradientHdl_Impl( this ); 252 253 *pPageType = PT_GRADIENT; 254 *pPos = LISTBOX_ENTRY_NOTFOUND; 255 } 256 } 257 } 258 259 // ----------------------------------------------------------------------- 260 261 int SvxGradientTabPage::DeactivatePage( SfxItemSet* _pSet ) 262 { 263 if( CheckChanges_Impl() == -1L ) 264 return KEEP_PAGE; 265 266 if( _pSet ) 267 FillItemSet( *_pSet ); 268 269 return LEAVE_PAGE; 270 } 271 272 // ----------------------------------------------------------------------- 273 274 long SvxGradientTabPage::CheckChanges_Impl() 275 { 276 // wird hier benutzt, um Aenderungen NICHT zu verlieren 277 XGradient aTmpGradient( aLbColorFrom.GetSelectEntryColor(), 278 aLbColorTo.GetSelectEntryColor(), 279 (XGradientStyle) aLbGradientType.GetSelectEntryPos(), 280 static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden 281 (sal_uInt16) aMtrCenterX.GetValue(), 282 (sal_uInt16) aMtrCenterY.GetValue(), 283 (sal_uInt16) aMtrBorder.GetValue(), 284 (sal_uInt16) aMtrColorFrom.GetValue(), 285 (sal_uInt16) aMtrColorTo.GetValue() ); 286 287 sal_uInt16 nPos = aLbGradients.GetSelectEntryPos(); 288 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 289 { 290 XGradient aGradient = pGradientList->GetGradient( nPos )->GetGradient(); 291 String aString = aLbGradients.GetSelectEntry(); 292 293 if( !( aTmpGradient == aGradient ) ) 294 { 295 ResMgr& rMgr = CUI_MGR(); 296 Image aWarningBoxImage = WarningBox::GetStandardImage(); 297 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 298 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001 299 AbstractSvxMessDialog* aMessDlg = pFact->CreateSvxMessDialog( DLGWIN, RID_SVXDLG_MESSBOX, 300 SVX_RESSTR( RID_SVXSTR_GRADIENT ), 301 CUI_RESSTR( RID_SVXSTR_ASK_CHANGE_GRADIENT ), 302 &aWarningBoxImage ); 303 DBG_ASSERT(aMessDlg, "Dialogdiet fail!");//CHINA001 304 aMessDlg->SetButtonText( MESS_BTN_1, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_1, 305 String( ResId( RID_SVXSTR_CHANGE, rMgr ) ) ); 306 aMessDlg->SetButtonText( MESS_BTN_2, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_2, 307 String( ResId( RID_SVXSTR_ADD, rMgr ) ) ); 308 309 short nRet = aMessDlg->Execute(); //CHINA001 short nRet = aMessDlg.Execute(); 310 311 switch( nRet ) 312 { 313 case RET_BTN_1: // Aendern 314 { 315 ClickModifyHdl_Impl( this ); 316 aGradient = pGradientList->GetGradient( nPos )->GetGradient(); 317 } 318 break; 319 320 case RET_BTN_2: // Hinzufuegen 321 { 322 ClickAddHdl_Impl( this ); 323 nPos = aLbGradients.GetSelectEntryPos(); 324 aGradient = pGradientList->GetGradient( nPos )->GetGradient(); 325 } 326 break; 327 328 case RET_CANCEL: 329 // return( -1L ); <-- wuerde die Seite nicht verlassen 330 break; 331 // return( sal_True ); // Abbruch 332 } 333 delete aMessDlg; //add by CHINA001 334 } 335 } 336 nPos = aLbGradients.GetSelectEntryPos(); 337 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 338 { 339 *pPos = nPos; 340 } 341 return 0L; 342 } 343 344 // ----------------------------------------------------------------------- 345 346 sal_Bool SvxGradientTabPage::FillItemSet( SfxItemSet& rSet ) 347 { 348 if( *pDlgType == 0 && *pPageType == PT_GRADIENT && *pbAreaTP == sal_False ) 349 { 350 // CheckChanges(); <-- doppelte Abfrage ? 351 352 XGradient* pXGradient = NULL; 353 String aString; 354 sal_uInt16 nPos = aLbGradients.GetSelectEntryPos(); 355 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 356 { 357 pXGradient = new XGradient( pGradientList->GetGradient( nPos )->GetGradient() ); 358 aString = aLbGradients.GetSelectEntry(); 359 360 } 361 else 362 // Farbverlauf wurde (unbekannt) uebergeben 363 { 364 pXGradient = new XGradient( aLbColorFrom.GetSelectEntryColor(), 365 aLbColorTo.GetSelectEntryColor(), 366 (XGradientStyle) aLbGradientType.GetSelectEntryPos(), 367 static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden 368 (sal_uInt16) aMtrCenterX.GetValue(), 369 (sal_uInt16) aMtrCenterY.GetValue(), 370 (sal_uInt16) aMtrBorder.GetValue(), 371 (sal_uInt16) aMtrColorFrom.GetValue(), 372 (sal_uInt16) aMtrColorTo.GetValue() ); 373 } 374 DBG_ASSERT( pXGradient, "XGradient konnte nicht erzeugt werden" ); 375 rSet.Put( XFillStyleItem( XFILL_GRADIENT ) ); 376 rSet.Put( XFillGradientItem( aString, *pXGradient ) ); 377 378 delete pXGradient; 379 } 380 return sal_True; 381 } 382 383 // ----------------------------------------------------------------------- 384 385 void SvxGradientTabPage::Reset( const SfxItemSet& ) 386 { 387 // aLbGradients.SelectEntryPos( 0 ); 388 ChangeGradientHdl_Impl( this ); 389 390 // Status der Buttons ermitteln 391 if( pGradientList->Count() ) 392 { 393 aBtnModify.Enable(); 394 aBtnDelete.Enable(); 395 aBtnSave.Enable(); 396 } 397 else 398 { 399 aBtnModify.Disable(); 400 aBtnDelete.Disable(); 401 aBtnSave.Disable(); 402 } 403 } 404 405 // ----------------------------------------------------------------------- 406 407 SfxTabPage* SvxGradientTabPage::Create( Window* pWindow, 408 const SfxItemSet& rOutAttrs ) 409 { 410 return new SvxGradientTabPage( pWindow, rOutAttrs ); 411 } 412 413 //------------------------------------------------------------------------ 414 415 IMPL_LINK( SvxGradientTabPage, ModifiedHdl_Impl, void *, pControl ) 416 { 417 XGradientStyle eXGS = (XGradientStyle) aLbGradientType.GetSelectEntryPos(); 418 419 XGradient aXGradient( aLbColorFrom.GetSelectEntryColor(), 420 aLbColorTo.GetSelectEntryColor(), 421 eXGS, 422 static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden 423 (sal_uInt16) aMtrCenterX.GetValue(), 424 (sal_uInt16) aMtrCenterY.GetValue(), 425 (sal_uInt16) aMtrBorder.GetValue(), 426 (sal_uInt16) aMtrColorFrom.GetValue(), 427 (sal_uInt16) aMtrColorTo.GetValue() ); 428 429 // Enablen/Disablen von Controls 430 if( pControl == &aLbGradientType || pControl == this ) 431 SetControlState_Impl( eXGS ); 432 433 // Anzeigen im XOutDev 434 rXFSet.Put( XFillGradientItem( String(), aXGradient ) ); 435 aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() ); 436 437 aCtlPreview.Invalidate(); 438 439 return 0L; 440 } 441 442 //------------------------------------------------------------------------ 443 444 IMPL_LINK( SvxGradientTabPage, ClickAddHdl_Impl, void *, EMPTYARG ) 445 { 446 ResMgr& rMgr = CUI_MGR(); 447 String aNewName( SVX_RES( RID_SVXSTR_GRADIENT ) ); 448 String aDesc( CUI_RES( RID_SVXSTR_DESC_GRADIENT ) ); 449 String aName; 450 451 long nCount = pGradientList->Count(); 452 long j = 1; 453 sal_Bool bDifferent = sal_False; 454 455 while( !bDifferent ) 456 { 457 aName = aNewName; 458 aName += sal_Unicode(' '); 459 aName += UniString::CreateFromInt32( j++ ); 460 bDifferent = sal_True; 461 462 for( long i = 0; i < nCount && bDifferent; i++ ) 463 if( aName == pGradientList->GetGradient( i )->GetName() ) 464 bDifferent = sal_False; 465 } 466 467 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 468 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001 469 AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc ); 470 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 471 WarningBox* pWarnBox = NULL; 472 sal_uInt16 nError = RID_SVXSTR_WARN_NAME_DUPLICATE; 473 474 while( pDlg->Execute() == RET_OK ) 475 { 476 pDlg->GetName( aName ); 477 478 bDifferent = sal_True; 479 480 for( long i = 0; i < nCount && bDifferent; i++ ) 481 if( aName == pGradientList->GetGradient( i )->GetName() ) 482 bDifferent = sal_False; 483 484 if( bDifferent ) 485 { 486 nError = 0; 487 break; 488 } 489 490 if( !pWarnBox ) 491 { 492 pWarnBox = new WarningBox( DLGWIN, 493 WinBits( WB_OK_CANCEL ), 494 String( ResId( nError, rMgr ) ) ); 495 pWarnBox->SetHelpId( HID_WARN_NAME_DUPLICATE ); 496 } 497 498 if( pWarnBox->Execute() != RET_OK ) 499 break; 500 } 501 //Rectangle aDlgRect( pDlg->GetPosPixel(), pDlg->GetSizePixel() ); 502 delete pDlg; 503 delete pWarnBox; 504 505 if( !nError ) 506 { 507 XGradient aXGradient( aLbColorFrom.GetSelectEntryColor(), 508 aLbColorTo.GetSelectEntryColor(), 509 (XGradientStyle) aLbGradientType.GetSelectEntryPos(), 510 static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden 511 (sal_uInt16) aMtrCenterX.GetValue(), 512 (sal_uInt16) aMtrCenterY.GetValue(), 513 (sal_uInt16) aMtrBorder.GetValue(), 514 (sal_uInt16) aMtrColorFrom.GetValue(), 515 (sal_uInt16) aMtrColorTo.GetValue() ); 516 XGradientEntry* pEntry = new XGradientEntry( aXGradient, aName ); 517 518 pGradientList->Insert( pEntry, nCount ); 519 520 aLbGradients.Append( pEntry ); 521 522 aLbGradients.SelectEntryPos( aLbGradients.GetEntryCount() - 1 ); 523 524 #ifdef WNT 525 // hack: #31355# W.P. 526 Rectangle aRect( aLbGradients.GetPosPixel(), aLbGradients.GetSizePixel() ); 527 if( sal_True ) { // ??? overlapped with pDlg 528 // and srolling 529 Invalidate( aRect ); 530 //aLbGradients.Invalidate(); 531 } 532 #endif 533 534 // Flag fuer modifiziert setzen 535 *pnGradientListState |= CT_MODIFIED; 536 537 ChangeGradientHdl_Impl( this ); 538 } 539 540 // Status der Buttons ermitteln 541 if( pGradientList->Count() ) 542 { 543 aBtnModify.Enable(); 544 aBtnDelete.Enable(); 545 aBtnSave.Enable(); 546 } 547 return 0L; 548 } 549 550 //------------------------------------------------------------------------ 551 552 IMPL_LINK( SvxGradientTabPage, ClickModifyHdl_Impl, void *, EMPTYARG ) 553 { 554 sal_uInt16 nPos = aLbGradients.GetSelectEntryPos(); 555 556 if ( nPos != LISTBOX_ENTRY_NOTFOUND ) 557 { 558 ResMgr& rMgr = CUI_MGR(); 559 String aNewName( SVX_RES( RID_SVXSTR_GRADIENT ) ); 560 String aDesc( CUI_RES( RID_SVXSTR_DESC_GRADIENT ) ); 561 String aName( pGradientList->GetGradient( nPos )->GetName() ); 562 String aOldName = aName; 563 564 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 565 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001 566 AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc ); 567 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 568 569 long nCount = pGradientList->Count(); 570 sal_Bool bDifferent = sal_False; 571 sal_Bool bLoop = sal_True; 572 573 while( bLoop && pDlg->Execute() == RET_OK ) 574 { 575 pDlg->GetName( aName ); 576 bDifferent = sal_True; 577 578 for( long i = 0; i < nCount && bDifferent; i++ ) 579 { 580 if( aName == pGradientList->GetGradient( i )->GetName() && 581 aName != aOldName ) 582 bDifferent = sal_False; 583 } 584 585 if( bDifferent ) 586 { 587 bLoop = sal_False; 588 XGradient aXGradient( aLbColorFrom.GetSelectEntryColor(), 589 aLbColorTo.GetSelectEntryColor(), 590 (XGradientStyle) aLbGradientType.GetSelectEntryPos(), 591 static_cast<long>(aMtrAngle.GetValue() * 10), // sollte in Resource geaendert werden 592 (sal_uInt16) aMtrCenterX.GetValue(), 593 (sal_uInt16) aMtrCenterY.GetValue(), 594 (sal_uInt16) aMtrBorder.GetValue(), 595 (sal_uInt16) aMtrColorFrom.GetValue(), 596 (sal_uInt16) aMtrColorTo.GetValue() ); 597 598 XGradientEntry* pEntry = new XGradientEntry( aXGradient, aName ); 599 600 delete pGradientList->Replace( pEntry, nPos ); 601 602 aLbGradients.Modify( pEntry, nPos ); 603 604 aLbGradients.SelectEntryPos( nPos ); 605 606 // Flag fuer modifiziert setzen 607 *pnGradientListState |= CT_MODIFIED; 608 } 609 else 610 { 611 WarningBox aBox( DLGWIN, WinBits( WB_OK ),String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) ); 612 aBox.SetHelpId( HID_WARN_NAME_DUPLICATE ); 613 aBox.Execute(); 614 } 615 616 } 617 delete pDlg; 618 } 619 return 0L; 620 } 621 622 //------------------------------------------------------------------------ 623 624 IMPL_LINK( SvxGradientTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG ) 625 { 626 sal_uInt16 nPos = aLbGradients.GetSelectEntryPos(); 627 628 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 629 { 630 QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ), 631 String( CUI_RES( RID_SVXSTR_ASK_DEL_GRADIENT ) ) ); 632 633 if ( aQueryBox.Execute() == RET_YES ) 634 { 635 delete pGradientList->Remove( nPos ); 636 aLbGradients.RemoveEntry( nPos ); 637 aLbGradients.SelectEntryPos( 0 ); 638 639 aCtlPreview.Invalidate(); 640 641 ChangeGradientHdl_Impl( this ); 642 643 // Flag fuer modifiziert setzen 644 *pnGradientListState |= CT_MODIFIED; 645 } 646 } 647 // Status der Buttons ermitteln 648 if( !pGradientList->Count() ) 649 { 650 aBtnModify.Disable(); 651 aBtnDelete.Disable(); 652 aBtnSave.Disable(); 653 } 654 return 0L; 655 } 656 657 // ----------------------------------------------------------------------- 658 659 IMPL_LINK( SvxGradientTabPage, ClickLoadHdl_Impl, void *, EMPTYARG ) 660 { 661 ResMgr& rMgr = CUI_MGR(); 662 sal_uInt16 nReturn = RET_YES; 663 664 if ( *pnGradientListState & CT_MODIFIED ) 665 { 666 nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ), 667 String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute(); 668 669 if ( nReturn == RET_YES ) 670 pGradientList->Save(); 671 } 672 673 if ( nReturn != RET_CANCEL ) 674 { 675 ::sfx2::FileDialogHelper aDlg( 676 com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 677 0 ); 678 String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sog" ) ); 679 aDlg.AddFilter( aStrFilterType, aStrFilterType ); 680 INetURLObject aFile( SvtPathOptions().GetPalettePath() ); 681 aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) ); 682 683 if( aDlg.Execute() == ERRCODE_NONE ) 684 { 685 EnterWait(); 686 687 INetURLObject aURL( aDlg.GetPath() ); 688 INetURLObject aPathURL( aURL ); 689 690 aPathURL.removeSegment(); 691 aPathURL.removeFinalSlash(); 692 693 // Liste speichern 694 XGradientList* pGrdList = new XGradientList( aPathURL.GetMainURL( INetURLObject::NO_DECODE ), pXPool ); 695 pGrdList->SetName( aURL.getName() ); 696 697 if ( pGrdList->Load() ) 698 { 699 if ( pGrdList ) 700 { 701 // Pruefen, ob Tabelle geloescht werden darf: 702 if ( pGradientList != 703 ( (SvxAreaTabDialog*) DLGWIN )->GetGradientList() ) 704 delete pGradientList; 705 706 pGradientList = pGrdList; 707 ( (SvxAreaTabDialog*) DLGWIN )-> 708 SetNewGradientList( pGradientList ); 709 710 aLbGradients.Clear(); 711 aLbGradients.Fill( pGradientList ); 712 Reset( rOutAttrs ); 713 714 pGradientList->SetName( aURL.getName() ); 715 716 // Ermitteln (evtl. abschneiden) des Namens und in 717 // der GroupBox darstellen 718 String aString( ResId( RID_SVXSTR_TABLE, rMgr ) ); 719 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) ); 720 721 if ( aURL.getBase().getLength() > 18 ) 722 { 723 aString += String(aURL.getBase()).Copy( 0, 15 ); 724 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) ); 725 } 726 else 727 aString += String(aURL.getBase()); 728 729 // Flag fuer gewechselt setzen 730 *pnGradientListState |= CT_CHANGED; 731 // Flag fuer modifiziert entfernen 732 *pnGradientListState &= ~CT_MODIFIED; 733 } 734 LeaveWait(); 735 } 736 else 737 { 738 LeaveWait(); 739 //aIStream.Close(); 740 ErrorBox( DLGWIN, WinBits( WB_OK ), 741 String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute(); 742 } 743 } 744 } 745 746 // Status der Buttons ermitteln 747 if( pGradientList->Count() ) 748 { 749 aBtnModify.Enable(); 750 aBtnDelete.Enable(); 751 aBtnSave.Enable(); 752 } 753 else 754 { 755 aBtnModify.Disable(); 756 aBtnDelete.Disable(); 757 aBtnSave.Disable(); 758 } 759 return 0L; 760 } 761 762 // ----------------------------------------------------------------------- 763 764 IMPL_LINK( SvxGradientTabPage, ClickSaveHdl_Impl, void *, EMPTYARG ) 765 { 766 ::sfx2::FileDialogHelper aDlg( 767 com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 ); 768 String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sog" ) ); 769 aDlg.AddFilter( aStrFilterType, aStrFilterType ); 770 771 INetURLObject aFile( SvtPathOptions().GetPalettePath() ); 772 DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 773 774 if( pGradientList->GetName().Len() ) 775 { 776 aFile.Append( pGradientList->GetName() ); 777 778 if( !aFile.getExtension().getLength() ) 779 aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "sog" ) ) ); 780 } 781 782 aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) ); 783 if ( aDlg.Execute() == ERRCODE_NONE ) 784 { 785 INetURLObject aURL( aDlg.GetPath() ); 786 INetURLObject aPathURL( aURL ); 787 788 aPathURL.removeSegment(); 789 aPathURL.removeFinalSlash(); 790 791 pGradientList->SetName( aURL.getName() ); 792 pGradientList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) ); 793 794 if( pGradientList->Save() ) 795 { 796 // Ermitteln (evtl. abschneiden) des Namens und in 797 // der GroupBox darstellen 798 String aString( CUI_RES( RID_SVXSTR_TABLE ) ); 799 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) ); 800 801 if ( aURL.getBase().getLength() > 18 ) 802 { 803 aString += String(aURL.getBase()).Copy( 0, 15 ); 804 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) ); 805 } 806 else 807 aString += String(aURL.getBase()); 808 809 // Flag fuer gespeichert setzen 810 *pnGradientListState |= CT_SAVED; 811 // Flag fuer modifiziert entfernen 812 *pnGradientListState &= ~CT_MODIFIED; 813 } 814 else 815 { 816 ErrorBox( DLGWIN, WinBits( WB_OK ), 817 String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) ).Execute(); 818 } 819 } 820 821 return 0L; 822 } 823 824 //------------------------------------------------------------------------ 825 826 IMPL_LINK( SvxGradientTabPage, ChangeGradientHdl_Impl, void *, EMPTYARG ) 827 { 828 XGradient* pGradient = NULL; 829 int nPos = aLbGradients.GetSelectEntryPos(); 830 831 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 832 pGradient = new XGradient( ( (XGradientEntry*) pGradientList->GetGradient( nPos ) )->GetGradient() ); 833 else 834 { 835 const SfxPoolItem* pPoolItem = NULL; 836 if( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLSTYLE ), sal_True, &pPoolItem ) ) 837 { 838 if( ( XFILL_GRADIENT == (XFillStyle) ( ( const XFillStyleItem* ) pPoolItem )->GetValue() ) && 839 ( SFX_ITEM_SET == rOutAttrs.GetItemState( GetWhich( XATTR_FILLGRADIENT ), sal_True, &pPoolItem ) ) ) 840 { 841 pGradient = new XGradient( ( ( const XFillGradientItem* ) pPoolItem )->GetGradientValue() ); 842 } 843 } 844 if( !pGradient ) 845 { 846 aLbGradients.SelectEntryPos( 0 ); 847 nPos = aLbGradients.GetSelectEntryPos(); 848 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 849 pGradient = new XGradient( ( (XGradientEntry*) pGradientList->GetGradient( nPos ) )->GetGradient() ); 850 } 851 } 852 853 if( pGradient ) 854 { 855 XGradientStyle eXGS = pGradient->GetGradientStyle(); 856 857 aLbGradientType.SelectEntryPos( 858 sal::static_int_cast< sal_uInt16 >( eXGS ) ); 859 // Wenn der EIntrag nicht in der Listbox ist, werden die Farben 860 // temporaer hinzugenommen 861 aLbColorFrom.SetNoSelection(); 862 aLbColorFrom.SelectEntry( pGradient->GetStartColor() ); 863 864 if ( aLbColorFrom.GetSelectEntryCount() == 0 ) 865 { 866 aLbColorFrom.InsertEntry( pGradient->GetStartColor(), 867 String() ); 868 aLbColorFrom.SelectEntry( pGradient->GetStartColor() ); 869 } 870 aLbColorTo.SetNoSelection(); 871 aLbColorTo.SelectEntry( pGradient->GetEndColor() ); 872 873 if ( aLbColorTo.GetSelectEntryCount() == 0 ) 874 { 875 aLbColorTo.InsertEntry( pGradient->GetEndColor(), String() ); 876 aLbColorTo.SelectEntry( pGradient->GetEndColor() ); 877 } 878 879 aMtrAngle.SetValue( pGradient->GetAngle() / 10 ); // sollte in Resource geaendert werden 880 aMtrBorder.SetValue( pGradient->GetBorder() ); 881 aMtrCenterX.SetValue( pGradient->GetXOffset() ); 882 aMtrCenterY.SetValue( pGradient->GetYOffset() ); 883 aMtrColorFrom.SetValue( pGradient->GetStartIntens() ); 884 aMtrColorTo.SetValue( pGradient->GetEndIntens() ); 885 886 // Controls Disablen/Enablen 887 SetControlState_Impl( eXGS ); 888 889 // ItemSet fuellen und an aCtlPreview weiterleiten 890 rXFSet.Put( XFillGradientItem( String(), *pGradient ) ); 891 aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() ); 892 893 aCtlPreview.Invalidate(); 894 delete pGradient; 895 } 896 return 0L; 897 } 898 899 //------------------------------------------------------------------------ 900 901 void SvxGradientTabPage::SetControlState_Impl( XGradientStyle eXGS ) 902 { 903 switch( eXGS ) 904 { 905 case XGRAD_LINEAR: 906 case XGRAD_AXIAL: 907 aFtCenterX.Disable(); 908 aMtrCenterX.Disable(); 909 aFtCenterY.Disable(); 910 aMtrCenterY.Disable(); 911 aFtAngle.Enable(); 912 aMtrAngle.Enable(); 913 break; 914 915 case XGRAD_RADIAL: 916 aFtCenterX.Enable(); 917 aMtrCenterX.Enable(); 918 aFtCenterY.Enable(); 919 aMtrCenterY.Enable(); 920 aFtAngle.Disable(); 921 aMtrAngle.Disable(); 922 break; 923 924 case XGRAD_ELLIPTICAL: 925 aFtCenterX.Enable(); 926 aMtrCenterX.Enable(); 927 aFtCenterY.Enable(); 928 aMtrCenterY.Enable(); 929 aFtAngle.Enable(); 930 aMtrAngle.Enable(); 931 break; 932 933 case XGRAD_SQUARE: 934 case XGRAD_RECT: 935 aFtCenterX.Enable(); 936 aMtrCenterX.Enable(); 937 aFtCenterY.Enable(); 938 aMtrCenterY.Enable(); 939 aFtAngle.Enable(); 940 aMtrAngle.Enable(); 941 break; 942 } 943 } 944 945 946