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_sc.hxx" 30 31 // System - Includes --------------------------------------------------------- 32 33 34 35 // INCLUDE ------------------------------------------------------------------- 36 37 #include "global.hxx" 38 #include "reffact.hxx" 39 #include "document.hxx" 40 #include "docfunc.hxx" 41 #include "scresid.hxx" 42 #include "globstr.hrc" 43 #include "namedlg.hrc" 44 45 #define _NAMEDLG_CXX 46 #include "namedlg.hxx" 47 #undef _NAMEDLG_CXX 48 #include <vcl/msgbox.hxx> 49 50 51 52 // defines ------------------------------------------------------------------- 53 54 #define ABS_SREF SCA_VALID \ 55 | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE 56 #define ABS_DREF ABS_SREF \ 57 | SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE 58 #define ABS_SREF3D ABS_SREF | SCA_TAB_3D 59 #define ABS_DREF3D ABS_DREF | SCA_TAB_3D 60 61 62 //============================================================================ 63 // Hilfsklasse: Merken der aktuellen Bereichsoptionen, 64 // wenn ein Name in der ComboBox gefunden wird. 65 66 struct SaveData 67 { 68 SaveData() 69 : bCriteria(sal_False),bPrintArea(sal_False), 70 bColHeader(sal_False),bRowHeader(sal_False), 71 bDirty(sal_False) {} 72 73 void Clear() 74 { 75 aStrSymbol.Erase(); 76 bCriteria = bPrintArea = 77 bColHeader = bRowHeader = sal_False; 78 bDirty = sal_True; 79 } 80 81 String aStrSymbol; 82 sal_Bool bCriteria:1; 83 sal_Bool bPrintArea:1; 84 sal_Bool bColHeader:1; 85 sal_Bool bRowHeader:1; 86 sal_Bool bDirty:1; 87 }; 88 89 static SaveData* pSaveObj = NULL; 90 91 #define SAVE_DATA() \ 92 pSaveObj->aStrSymbol = aEdAssign.GetText(); \ 93 pSaveObj->bCriteria = aBtnCriteria.IsChecked(); \ 94 pSaveObj->bPrintArea = aBtnPrintArea.IsChecked(); \ 95 pSaveObj->bColHeader = aBtnColHeader.IsChecked(); \ 96 pSaveObj->bRowHeader = aBtnRowHeader.IsChecked(); \ 97 pSaveObj->bDirty = sal_True; 98 99 #define RESTORE_DATA() \ 100 if ( pSaveObj->bDirty ) \ 101 { \ 102 aEdAssign.SetText( pSaveObj->aStrSymbol ); \ 103 aBtnCriteria.Check( pSaveObj->bCriteria ); \ 104 aBtnPrintArea.Check( pSaveObj->bPrintArea ); \ 105 aBtnColHeader.Check( pSaveObj->bColHeader ); \ 106 aBtnRowHeader.Check( pSaveObj->bRowHeader ); \ 107 pSaveObj->bDirty = sal_False; \ 108 } 109 110 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute(); 111 112 113 //============================================================================ 114 // class ScNameDlg 115 116 //---------------------------------------------------------------------------- 117 118 ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, 119 ScViewData* ptrViewData, 120 const ScAddress& aCursorPos ) 121 122 : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_NAMES ), 123 // 124 aFlName ( this, ScResId( FL_NAME ) ), 125 aEdName ( this, ScResId( ED_NAME ) ), 126 // 127 aFlAssign ( this, ScResId( FL_ASSIGN ) ), 128 aEdAssign ( this, this, ScResId( ED_ASSIGN ) ), 129 aRbAssign ( this, ScResId( RB_ASSIGN ), &aEdAssign, this ), 130 // 131 aFlType ( this, ScResId( FL_TYPE ) ), 132 aBtnPrintArea ( this, ScResId( BTN_PRINTAREA ) ), 133 aBtnColHeader ( this, ScResId( BTN_COLHEADER ) ), 134 aBtnCriteria ( this, ScResId( BTN_CRITERIA ) ), 135 aBtnRowHeader ( this, ScResId( BTN_ROWHEADER ) ), 136 // 137 aBtnOk ( this, ScResId( BTN_OK ) ), 138 aBtnCancel ( this, ScResId( BTN_CANCEL ) ), 139 aBtnHelp ( this, ScResId( BTN_HELP ) ), 140 aBtnAdd ( this, ScResId( BTN_ADD ) ), 141 aBtnRemove ( this, ScResId( BTN_REMOVE ) ), 142 aBtnMore ( this, ScResId( BTN_MORE ) ), 143 // 144 bSaved (sal_False), 145 aStrAdd ( ScResId( STR_ADD ) ), 146 aStrModify ( ScResId( STR_MODIFY ) ), 147 errMsgInvalidSym( ScResId( STR_INVALIDSYMBOL ) ), 148 // 149 pViewData ( ptrViewData ), 150 pDoc ( ptrViewData->GetDocument() ), 151 aLocalRangeName ( *(pDoc->GetRangeName()) ), 152 theCursorPos ( aCursorPos ) // zum Berechnen der Referenzen 153 { 154 pSaveObj = new SaveData; 155 Init(); 156 FreeResource(); 157 158 aRbAssign.SetAccessibleRelationMemberOf(&aFlAssign); 159 } 160 161 162 //---------------------------------------------------------------------------- 163 164 __EXPORT ScNameDlg::~ScNameDlg() 165 { 166 DELETEZ( pSaveObj ); 167 } 168 169 170 //---------------------------------------------------------------------------- 171 172 void __EXPORT ScNameDlg::Init() 173 { 174 String aAreaStr; 175 ScRange aRange; 176 177 DBG_ASSERT( pViewData && pDoc, "ViewData oder Document nicht gefunden!" ); 178 179 aBtnOk.SetClickHdl ( LINK( this, ScNameDlg, OkBtnHdl ) ); 180 aBtnCancel.SetClickHdl ( LINK( this, ScNameDlg, CancelBtnHdl ) ); 181 aBtnAdd.SetClickHdl ( LINK( this, ScNameDlg, AddBtnHdl ) ); 182 aBtnRemove.SetClickHdl ( LINK( this, ScNameDlg, RemoveBtnHdl ) ); 183 aEdAssign.SetGetFocusHdl( LINK( this, ScNameDlg, AssignGetFocusHdl ) ); 184 aEdAssign.SetModifyHdl ( LINK( this, ScNameDlg, EdModifyHdl ) ); 185 aEdName.SetModifyHdl ( LINK( this, ScNameDlg, EdModifyHdl ) ); 186 aEdName.SetSelectHdl ( LINK( this, ScNameDlg, NameSelectHdl ) ); 187 188 aBtnCriteria .Hide(); 189 aBtnPrintArea.Hide(); 190 aBtnColHeader.Hide(); 191 aBtnRowHeader.Hide(); 192 193 aBtnMore.AddWindow( &aFlType ); 194 aBtnMore.AddWindow( &aBtnCriteria ); 195 aBtnMore.AddWindow( &aBtnPrintArea ); 196 aBtnMore.AddWindow( &aBtnColHeader ); 197 aBtnMore.AddWindow( &aBtnRowHeader ); 198 199 UpdateNames(); 200 201 pViewData->GetSimpleArea( aRange ); 202 aRange.Format( aAreaStr, ABS_DREF3D, pDoc, 203 ScAddress::Details(pDoc->GetAddressConvention(), 0, 0) ); 204 205 theCurSel = Selection( 0, SELECTION_MAX ); 206 aEdAssign.GrabFocus(); 207 aEdAssign.SetText( aAreaStr ); 208 aEdAssign.SetSelection( theCurSel ); 209 aEdName.GrabFocus(); 210 211 aBtnAdd.Disable(); 212 aBtnRemove.Disable(); 213 if ( aEdName.GetEntryCount() > 0 ) 214 aBtnAdd.SetText( aStrAdd ); 215 UpdateChecks(); 216 EdModifyHdl( 0 ); 217 218 bSaved=sal_True; 219 SAVE_DATA() 220 221 //@BugID 54702 222 //SFX_APPWINDOW->Disable(sal_False); //! allgemeine Methode im ScAnyRefDlg 223 } 224 225 //---------------------------------------------------------------------------- 226 sal_Bool ScNameDlg::IsRefInputMode() const 227 { 228 return aEdAssign.IsEnabled(); 229 } 230 231 void ScNameDlg::RefInputDone( sal_Bool bForced) 232 { 233 ScAnyRefDlg::RefInputDone(bForced); 234 EdModifyHdl(&aEdAssign); 235 } 236 //---------------------------------------------------------------------------- 237 // Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als 238 // neue Selektion im Referenz-Edit angezeigt wird. 239 240 241 void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) 242 { 243 if ( aEdAssign.IsEnabled() ) 244 { 245 if ( rRef.aStart != rRef.aEnd ) 246 RefInputStart(&aEdAssign); 247 String aRefStr; 248 rRef.Format( aRefStr, ABS_DREF3D, pDocP, 249 ScAddress::Details(pDocP->GetAddressConvention(), 0, 0) ); 250 aEdAssign.SetRefString( aRefStr ); 251 } 252 } 253 254 255 //---------------------------------------------------------------------------- 256 sal_Bool __EXPORT ScNameDlg::Close() 257 { 258 return DoClose( ScNameDlgWrapper::GetChildWindowId() ); 259 } 260 261 262 //---------------------------------------------------------------------------- 263 264 void ScNameDlg::SetActive() 265 { 266 aEdAssign.GrabFocus(); 267 RefInputDone(); 268 } 269 270 271 //---------------------------------------------------------------------------- 272 273 void __EXPORT ScNameDlg::UpdateChecks() 274 { 275 sal_uInt16 nCurPos=0; 276 277 if(aLocalRangeName.SearchName( aEdName.GetText(), nCurPos)) 278 { 279 ScRangeData* pData=(ScRangeData*)(aLocalRangeName.At( nCurPos )); 280 aBtnCriteria .Check( pData->HasType( RT_CRITERIA ) ); 281 aBtnPrintArea.Check( pData->HasType( RT_PRINTAREA ) ); 282 aBtnColHeader.Check( pData->HasType( RT_COLHEADER ) ); 283 aBtnRowHeader.Check( pData->HasType( RT_ROWHEADER ) ); 284 } 285 286 // Falls Edit-Feld leer ist: Typ-CheckBoxen deaktivieren: 287 288 if ( aEdName.GetText().Len() != 0 ) 289 { 290 if ( !aFlType.IsEnabled() ) 291 { 292 aFlType .Enable(); 293 aBtnCriteria .Enable(); 294 aBtnPrintArea.Enable(); 295 aBtnColHeader.Enable(); 296 aBtnRowHeader.Enable(); 297 aFlAssign .Enable(); 298 aEdAssign .Enable(); 299 aRbAssign .Enable(); 300 } 301 } 302 else if ( aFlType.IsEnabled() ) 303 { 304 aFlType .Disable(); 305 aBtnCriteria .Disable(); 306 aBtnPrintArea.Disable(); 307 aBtnColHeader.Disable(); 308 aBtnRowHeader.Disable(); 309 aFlAssign .Disable(); 310 aEdAssign .Disable(); 311 aRbAssign .Disable(); 312 } 313 } 314 315 316 //---------------------------------------------------------------------------- 317 318 void __EXPORT ScNameDlg::UpdateNames() 319 { 320 sal_uInt16 nRangeCount = aLocalRangeName.GetCount(); 321 322 aEdName.SetUpdateMode( sal_False ); 323 //----------------------------------------------------------- 324 sal_uInt16 nNamePos = aEdName.GetTopEntry(); 325 aEdName.Clear(); 326 327 aEdAssign.SetText( EMPTY_STRING ); 328 329 if ( nRangeCount > 0 ) 330 { 331 ScRangeData* pRangeData = NULL; 332 String aString; 333 334 for ( sal_uInt16 i=0; i<nRangeCount; i++ ) 335 { 336 pRangeData = (ScRangeData*)(aLocalRangeName.At( i )); 337 if ( pRangeData ) 338 { 339 if ( !pRangeData->HasType( RT_DATABASE ) 340 && !pRangeData->HasType( RT_SHARED ) ) 341 { 342 pRangeData->GetName( aString ); 343 aEdName.InsertEntry( aString ); 344 } 345 } 346 } 347 } 348 else 349 { 350 aBtnAdd.SetText( aStrAdd ); 351 aBtnAdd.Disable(); 352 aBtnRemove.Disable(); 353 } 354 //----------------------------------------------------------- 355 aEdName.SetUpdateMode( sal_True ); 356 aEdName.SetTopEntry(nNamePos); 357 aEdName.Invalidate(); 358 } 359 360 361 //---------------------------------------------------------------------------- 362 363 void __EXPORT ScNameDlg::CalcCurTableAssign( String& aAssign, sal_uInt16 nCurPos ) 364 { 365 ScRangeData* pRangeData = (ScRangeData*)(aLocalRangeName.At( nCurPos )); 366 367 if ( pRangeData ) 368 { 369 rtl::OUStringBuffer sBuffer; 370 pRangeData->UpdateSymbol( sBuffer, theCursorPos ); 371 aAssign = sBuffer; 372 } 373 else 374 { 375 aAssign.Erase(); 376 } 377 } 378 379 380 //---------------------------------------------------------------------------- 381 // Handler: 382 // ======== 383 384 IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG ) 385 { 386 if ( aBtnAdd.IsEnabled() ) 387 AddBtnHdl( 0 ); 388 389 if ( !aBtnAdd.IsEnabled() && !aBtnRemove.IsEnabled() ) 390 { 391 ScDocShell* pDocSh = pViewData->GetDocShell(); 392 ScDocFunc aFunc(*pDocSh); 393 aFunc.ModifyRangeNames( aLocalRangeName, sal_False ); 394 Close(); 395 } 396 return 0; 397 } 398 399 400 //---------------------------------------------------------------------------- 401 402 IMPL_LINK_INLINE_START( ScNameDlg, CancelBtnHdl, void *, EMPTYARG ) 403 { 404 Close(); 405 return 0; 406 } 407 IMPL_LINK_INLINE_END( ScNameDlg, CancelBtnHdl, void *, EMPTYARG ) 408 409 410 //---------------------------------------------------------------------------- 411 412 IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG ) 413 { 414 sal_Bool bAdded = sal_False; 415 String aNewEntry = aEdName.GetText(); 416 sal_uInt16 nNamePos = aEdName.GetTopEntry(); 417 aNewEntry.EraseLeadingChars( ' ' ); 418 aNewEntry.EraseTrailingChars( ' ' ); 419 420 if ( aNewEntry.Len() > 0 ) 421 { 422 if ( ScRangeData::IsNameValid( aNewEntry, pDoc ) ) 423 { 424 if ( pDoc ) 425 { 426 ScRangeData* pNewEntry = NULL; 427 RangeType nType = RT_NAME; 428 sal_uInt16 nFoundAt = 0; 429 String theSymbol = aEdAssign.GetText(); 430 String aStrPos; 431 String aStrArea; 432 433 pNewEntry = new ScRangeData( pDoc, 434 aNewEntry, 435 theSymbol, 436 theCursorPos, 437 nType ); 438 if (pNewEntry) 439 { 440 nType = nType 441 | (aBtnRowHeader .IsChecked() ? RT_ROWHEADER : RangeType(0)) 442 | (aBtnColHeader .IsChecked() ? RT_COLHEADER : RangeType(0)) 443 | (aBtnPrintArea .IsChecked() ? RT_PRINTAREA : RangeType(0)) 444 | (aBtnCriteria .IsChecked() ? RT_CRITERIA : RangeType(0)); 445 pNewEntry->AddType(nType); 446 } 447 448 // theSymbol gueltig? 449 // (= konnte theSymbol im ScRangeData-Ctor 450 // in ein Token-Array uebersetzt werden?) 451 if ( 0 == pNewEntry->GetErrCode() ) 452 { 453 // Eintrag bereits vorhanden? Dann vorher entfernen (=Aendern) 454 if ( aLocalRangeName.SearchName( aNewEntry, nFoundAt ) ) 455 { // alten Index uebernehmen 456 pNewEntry->SetIndex( 457 ((ScRangeData*)(aLocalRangeName.At(nFoundAt)))->GetIndex() ); 458 aLocalRangeName.AtFree( nFoundAt ); 459 } 460 else 461 pSaveObj->Clear(); 462 463 if ( !aLocalRangeName.Insert( pNewEntry ) ) 464 delete pNewEntry; 465 466 UpdateNames(); 467 bSaved=sal_False; 468 RESTORE_DATA() 469 aEdName.SetText(EMPTY_STRING); 470 aEdName.GrabFocus(); 471 UpdateChecks(); 472 aBtnAdd.SetText( aStrAdd ); 473 aBtnAdd.Disable(); 474 aBtnRemove.Disable(); 475 476 //@BugID 54702 raus mit dem Sch. 477 //SFX_APPWINDOW->Disable(sal_False); //! allgemeine Methode im ScAnyRefDlg 478 479 bAdded = sal_True; 480 } 481 else // theSymbol ungueltig 482 { 483 delete pNewEntry; 484 ERRORBOX( errMsgInvalidSym ); 485 theCurSel = Selection( 0, SELECTION_MAX ); 486 aEdAssign.GrabFocus(); 487 } 488 } 489 } 490 else 491 { 492 ERRORBOX( ScGlobal::GetRscString(STR_INVALIDNAME) ); 493 aEdName.SetSelection( Selection( 0, SELECTION_MAX ) ); 494 aEdName.GrabFocus(); 495 } 496 } 497 498 aEdName.SetTopEntry(nNamePos); 499 return bAdded; 500 } 501 502 503 //---------------------------------------------------------------------------- 504 505 IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG ) 506 { 507 sal_uInt16 nRemoveAt = 0; 508 const String aStrEntry = aEdName.GetText(); 509 510 if ( aLocalRangeName.SearchName( aStrEntry, nRemoveAt ) ) 511 { 512 String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY ); 513 String aMsg = aStrDelMsg.GetToken( 0, '#' ); 514 515 aMsg += aStrEntry; 516 aMsg += aStrDelMsg.GetToken( 1, '#' ); 517 518 if ( RET_YES == 519 QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() ) 520 { 521 aLocalRangeName.AtFree( nRemoveAt ); 522 UpdateNames(); 523 UpdateChecks(); 524 bSaved=sal_False; 525 RESTORE_DATA() 526 theCurSel = Selection( 0, SELECTION_MAX ); 527 aBtnAdd.SetText( aStrAdd ); 528 aBtnAdd.Disable(); 529 aBtnRemove.Disable(); 530 } 531 } 532 return 0; 533 } 534 535 536 //---------------------------------------------------------------------------- 537 538 IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG ) 539 { 540 sal_uInt16 nAtPos; 541 542 if ( aLocalRangeName.SearchName( aEdName.GetText(), nAtPos ) ) 543 { 544 String aSymbol; 545 ScRangeData* pData = (ScRangeData*)(aLocalRangeName.At( nAtPos )); 546 547 if ( pData ) 548 { 549 pData->GetSymbol( aSymbol ); 550 CalcCurTableAssign( aSymbol, nAtPos ); 551 aEdAssign.SetText( aSymbol ); 552 aBtnAdd.SetText( aStrModify ); 553 theCurSel = Selection( 0, SELECTION_MAX ); 554 } 555 } 556 UpdateChecks(); 557 return 0; 558 } 559 560 561 //---------------------------------------------------------------------------- 562 563 IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd ) 564 { 565 String theName = aEdName.GetText(); 566 String theSymbol = aEdAssign.GetText(); 567 sal_Bool bNameFound = (COMBOBOX_ENTRY_NOTFOUND 568 != aEdName.GetEntryPos( theName )); 569 570 if ( pEd == &aEdName ) 571 { 572 if ( theName.Len() == 0 ) 573 { 574 if ( aBtnAdd.GetText() != aStrAdd ) 575 aBtnAdd.SetText( aStrAdd ); 576 aBtnAdd.Disable(); 577 aBtnRemove.Disable(); 578 aFlAssign.Disable(); 579 aEdAssign.Disable(); 580 aRbAssign.Disable(); 581 //@BugID 54702 raus mit dem Sch. 582 //SFX_APPWINDOW->Disable(sal_False); //! allgemeine Methode im ScAnyRefDlg 583 } 584 else 585 { 586 if ( bNameFound ) 587 { 588 if ( aBtnAdd.GetText() != aStrModify ) 589 aBtnAdd.SetText( aStrModify ); 590 591 aBtnRemove.Enable(); 592 593 if(!bSaved) 594 { 595 bSaved=sal_True; 596 SAVE_DATA() 597 } 598 NameSelectHdl( 0 ); 599 } 600 else 601 { 602 if ( aBtnAdd.GetText() != aStrAdd ) 603 aBtnAdd.SetText( aStrAdd ); 604 aBtnRemove.Disable(); 605 606 bSaved=sal_False; 607 RESTORE_DATA() 608 } 609 theSymbol = aEdAssign.GetText(); 610 611 if ( theSymbol.Len() > 0 ) 612 aBtnAdd.Enable(); 613 else 614 aBtnAdd.Disable(); 615 616 aFlAssign.Enable(); 617 aEdAssign.Enable(); 618 aRbAssign.Enable(); 619 //@BugID 54702 raus mit dem Sch. 620 //SFX_APPWINDOW->Enable(); 621 } 622 UpdateChecks(); 623 theCurSel = Selection( 0, SELECTION_MAX ); 624 } 625 else if ( pEd == &aEdAssign ) 626 { 627 if ( (theName.Len()>0) && (theSymbol.Len()>0) ) 628 { 629 aBtnAdd.Enable(); 630 if ( bNameFound ) 631 aBtnRemove.Enable(); 632 } 633 else 634 { 635 aBtnAdd.Disable(); 636 aBtnRemove.Disable(); 637 } 638 } 639 return 0; 640 } 641 642 //------------------------------------------------------------------------ 643 644 IMPL_LINK_INLINE_START( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG ) 645 { 646 EdModifyHdl( &aEdAssign ); 647 return 0; 648 } 649 IMPL_LINK_INLINE_END( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG ) 650 651 652