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_sc.hxx" 26 27 // System - Includes --------------------------------------------------------- 28 29 30 31 // INCLUDE ------------------------------------------------------------------- 32 33 #include "reffact.hxx" 34 #include "document.hxx" 35 #include "scresid.hxx" 36 #include "globstr.hrc" 37 #include "crnrdlg.hrc" 38 #include "docsh.hxx" 39 40 #define _CRNRDLG_CXX 41 #include "crnrdlg.hxx" 42 #undef _CRNRDLG_CXX 43 #include <vcl/msgbox.hxx> 44 45 46 //============================================================================ 47 48 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute() 49 #define QUERYBOX(m) QueryBox(this,WinBits(WB_YES_NO|WB_DEF_YES),m).Execute() 50 51 const sal_uLong nEntryDataCol = 0; 52 const sal_uLong nEntryDataRow = 1; 53 const sal_uLong nEntryDataDelim = 2; 54 55 56 //============================================================================ 57 // class ScColRowNameRangesDlg 58 59 60 /************************************************************************* 61 #* Member: ScColRowNameRangesDlg Datum:04.09.97 62 #*------------------------------------------------------------------------ 63 #* 64 #* Klasse: ScColRowNameRangesDlg 65 #* 66 #* Funktion: Konstruktor der Klasse ScColRowNameRangesDlg. 67 #* Initialisieren der Klassen- Mitglieder, 68 #* Uebernahme der Range- Angaben und Aufruf 69 #* der eigentlichen Initialisierungsroutine 70 #* 71 #* Input: Sfx- Verknuepfungen 72 #* Parent- Window 73 #* SCViewData 74 #* 75 #* Output: --- 76 #* 77 #************************************************************************/ 78 79 ScColRowNameRangesDlg::ScColRowNameRangesDlg( SfxBindings* pB, 80 SfxChildWindow* pCW, 81 Window* pParent, 82 ScViewData* ptrViewData ) 83 84 : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_COLROWNAMERANGES ), 85 // 86 aFlAssign ( this, ScResId( FL_ASSIGN ) ), 87 aLbRange ( this, ScResId( LB_RANGE ) ), 88 89 aEdAssign ( this, this, ScResId( ED_AREA ) ), 90 aRbAssign ( this, ScResId( RB_AREA ), &aEdAssign, this ), 91 aBtnColHead ( this, ScResId( BTN_COLHEAD ) ), 92 aBtnRowHead ( this, ScResId( BTN_ROWHEAD ) ), 93 aFtAssign2 ( this, ScResId( FT_DATA_LABEL ) ), 94 aEdAssign2 ( this, this, ScResId( ED_DATA ) ), 95 aRbAssign2 ( this, ScResId( RB_DATA ), &aEdAssign2, this ), 96 97 aBtnOk ( this, ScResId( BTN_OK ) ), 98 aBtnCancel ( this, ScResId( BTN_CANCEL ) ), 99 aBtnHelp ( this, ScResId( BTN_HELP ) ), 100 aBtnAdd ( this, ScResId( BTN_ADD ) ), 101 aBtnRemove ( this, ScResId( BTN_REMOVE ) ), 102 103 pViewData ( ptrViewData ), 104 pDoc ( ptrViewData->GetDocument() ), 105 106 pEdActive ( NULL ), 107 bDlgLostFocus ( sal_False ) 108 { 109 xColNameRanges = pDoc->GetColNameRanges()->Clone(); 110 xRowNameRanges = pDoc->GetRowNameRanges()->Clone(); 111 Init(); 112 FreeResource(); 113 114 aRbAssign.SetAccessibleRelationMemberOf(&aEdAssign); 115 aRbAssign2.SetAccessibleRelationMemberOf(&aEdAssign); 116 } 117 118 119 /************************************************************************* 120 #* Member: ~ScColRowNameRangesDlg Datum:04.09.97 121 #*------------------------------------------------------------------------ 122 #* 123 #* Klasse: ScColRowNameRangesDlg 124 #* 125 #* Funktion: Destruktor der Klasse 126 #* 127 #* Input: --- 128 #* 129 #* Output: --- 130 #* 131 #************************************************************************/ 132 133 __EXPORT ScColRowNameRangesDlg::~ScColRowNameRangesDlg() 134 { 135 } 136 137 138 /************************************************************************* 139 #* Member: Init Datum:04.09.97 140 #*------------------------------------------------------------------------ 141 #* 142 #* Klasse: ScColRowNameRangesDlg 143 #* 144 #* Funktion: Initialisierungs- Routine: 145 #* Umlenken der Event- Handler und einstellen der 146 #* Startparameter. 147 #* 148 #* Input: --- 149 #* 150 #* Output: --- 151 #* 152 #************************************************************************/ 153 154 void ScColRowNameRangesDlg::Init() 155 { 156 SCCOL nStartCol = 0; 157 SCROW nStartRow = 0; 158 SCTAB nStartTab = 0; 159 SCCOL nEndCol = 0; 160 SCROW nEndRow = 0; 161 SCTAB nEndTab = 0; 162 163 aBtnOk.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, OkBtnHdl ) ); 164 aBtnCancel.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, CancelBtnHdl ) ); 165 aBtnAdd.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, AddBtnHdl ) ); 166 aBtnRemove.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RemoveBtnHdl ) ); 167 aLbRange.SetSelectHdl ( LINK( this, ScColRowNameRangesDlg, Range1SelectHdl ) ); 168 aEdAssign.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range1DataModifyHdl ) ); 169 aBtnColHead.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, ColClickHdl ) ); 170 aBtnRowHead.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RowClickHdl ) ); 171 aEdAssign2.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range2DataModifyHdl ) ); 172 173 Link aLink = LINK( this, ScColRowNameRangesDlg, GetFocusHdl ); 174 aEdAssign.SetGetFocusHdl( aLink ); 175 aRbAssign.SetGetFocusHdl( aLink ); 176 aEdAssign2.SetGetFocusHdl( aLink ); 177 aRbAssign2.SetGetFocusHdl( aLink ); 178 179 aLink = LINK( this, ScColRowNameRangesDlg, LoseFocusHdl ); 180 aEdAssign.SetLoseFocusHdl( aLink ); 181 aRbAssign.SetLoseFocusHdl( aLink ); 182 aEdAssign2.SetLoseFocusHdl( aLink ); 183 aRbAssign2.SetLoseFocusHdl( aLink ); 184 185 pEdActive = &aEdAssign; 186 187 UpdateNames(); 188 189 if ( pViewData && pDoc ) 190 { 191 pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab, 192 nEndCol, nEndRow, nEndTab ); 193 SetColRowData( ScRange( ScAddress( nStartCol, nStartRow, nStartTab ), 194 ScAddress( nEndCol, nEndRow, nEndTab ) ) ); 195 } 196 else 197 { 198 aBtnColHead.Check( sal_True ); 199 aBtnRowHead.Check( sal_False ); 200 aEdAssign.SetText( EMPTY_STRING ); 201 aEdAssign2.SetText( EMPTY_STRING ); 202 } 203 204 aLbRange.SetBorderStyle( WINDOW_BORDER_MONO ); 205 aBtnColHead.Enable(); 206 aBtnRowHead.Enable(); 207 aEdAssign.Enable(); 208 aEdAssign.GrabFocus(); 209 aRbAssign.Enable(); 210 //@BugID 54702 Enablen/Disablen nur noch in Basisklasse 211 //SFX_APPWINDOW->Enable(); // Ref-Feld hat Focus 212 213 Range1SelectHdl( 0 ); 214 } 215 216 217 /************************************************************************* 218 #* Member: SetColRowData Datum:04.09.97 219 #*------------------------------------------------------------------------ 220 #* 221 #* Klasse: ScColRowNameRangesDlg 222 #* 223 #* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches 224 #* auf default Werte setzen und beide Referenz-Edit-Felder 225 #* fuellen. 226 #* 227 #* Input: Einstellbereich fuer Labels 228 #* 229 #* Output: --- 230 #* 231 #************************************************************************/ 232 233 void ScColRowNameRangesDlg::SetColRowData( const ScRange& rLabelRange,sal_Bool bRef) 234 { 235 theCurData = theCurArea = rLabelRange; 236 sal_Bool bValid = sal_True; 237 SCCOL nCol1 = theCurArea.aStart.Col(); 238 SCCOL nCol2 = theCurArea.aEnd.Col(); 239 SCROW nRow1 = theCurArea.aStart.Row(); 240 SCROW nRow2 = theCurArea.aEnd.Row(); 241 if ( (static_cast<SCCOLROW>(nCol2 - nCol1) >= nRow2 - nRow1) || (nCol1 == 0 && nCol2 == MAXCOL) ) 242 { // Spaltenkoepfe und Grenzfall gesamte Tabelle 243 aBtnColHead.Check( sal_True ); 244 aBtnRowHead.Check( sal_False ); 245 if ( nRow2 == MAXROW ) 246 { 247 if ( nRow1 == 0 ) 248 bValid = sal_False; // Grenzfall gesamte Tabelle 249 else 250 { // Head unten, Data oben 251 theCurData.aStart.SetRow( 0 ); 252 theCurData.aEnd.SetRow( nRow1 - 1 ); 253 } 254 } 255 else 256 { // Head oben, Data unten 257 theCurData.aStart.SetRow( nRow2 + 1 ); 258 theCurData.aEnd.SetRow( MAXROW ); 259 } 260 } 261 else 262 { // Zeilenkoepfe 263 aBtnRowHead.Check( sal_True ); 264 aBtnColHead.Check( sal_False ); 265 if ( nCol2 == MAXCOL ) 266 { // Head rechts, Data links 267 theCurData.aStart.SetCol( 0 ); 268 theCurData.aEnd.SetCol( nCol2 - 1 ); 269 } 270 else 271 { // Head links, Data rechts 272 theCurData.aStart.SetCol( nCol2 + 1 ); 273 theCurData.aEnd.SetCol( MAXCOL ); 274 } 275 } 276 if ( bValid ) 277 { 278 const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); 279 String aStr; 280 theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv ); 281 282 if(bRef) 283 aEdAssign.SetRefString( aStr ); 284 else 285 aEdAssign.SetText( aStr ); 286 287 aEdAssign.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) ); 288 theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv ); 289 290 if(bRef) 291 aEdAssign2.SetRefString( aStr ); 292 else 293 aEdAssign2.SetText( aStr ); 294 } 295 else 296 { 297 theCurData = theCurArea = ScRange(); 298 299 if(bRef) 300 { 301 aEdAssign.SetRefString( EMPTY_STRING ); 302 aEdAssign2.SetRefString( EMPTY_STRING ); 303 } 304 else 305 { 306 aEdAssign.SetText( EMPTY_STRING ); 307 aEdAssign2.SetText( EMPTY_STRING ); 308 } 309 310 aBtnColHead.Disable(); 311 aBtnRowHead.Disable(); 312 aEdAssign2.Disable(); 313 aRbAssign2.Disable(); 314 } 315 } 316 317 318 /************************************************************************* 319 #* Member: AdjustColRowData Datum:04.09.97 320 #*------------------------------------------------------------------------ 321 #* 322 #* Klasse: ScColRowNameRangesDlg 323 #* 324 #* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches 325 #* anpassen und Data-Referenz-Edit-Feld fuellen. 326 #* 327 #* Input: Bereich fuer Labels 328 #* 329 #* Output: --- 330 #* 331 #************************************************************************/ 332 333 void ScColRowNameRangesDlg::AdjustColRowData( const ScRange& rDataRange,sal_Bool bRef) 334 { 335 theCurData = rDataRange; 336 if ( aBtnColHead.IsChecked() ) 337 { // Datenbereich gleiche Spalten wie Koepfe 338 theCurData.aStart.SetCol( theCurArea.aStart.Col() ); 339 theCurData.aEnd.SetCol( theCurArea.aEnd.Col() ); 340 if ( theCurData.Intersects( theCurArea ) ) 341 { 342 SCROW nRow1 = theCurArea.aStart.Row(); 343 SCROW nRow2 = theCurArea.aEnd.Row(); 344 if ( nRow1 > 0 345 && (theCurData.aEnd.Row() < nRow2 || nRow2 == MAXROW) ) 346 { // Data oben 347 theCurData.aEnd.SetRow( nRow1 - 1 ); 348 if ( theCurData.aStart.Row() > theCurData.aEnd.Row() ) 349 theCurData.aStart.SetRow( theCurData.aEnd.Row() ); 350 } 351 else 352 { // Data unten 353 theCurData.aStart.SetRow( nRow2 + 1 ); 354 if ( theCurData.aStart.Row() > theCurData.aEnd.Row() ) 355 theCurData.aEnd.SetRow( theCurData.aStart.Row() ); 356 } 357 } 358 } 359 else 360 { // Datenbereich gleiche Zeilen wie Koepfe 361 theCurData.aStart.SetRow( theCurArea.aStart.Row() ); 362 theCurData.aEnd.SetRow( theCurArea.aEnd.Row() ); 363 if ( theCurData.Intersects( theCurArea ) ) 364 { 365 SCCOL nCol1 = theCurArea.aStart.Col(); 366 SCCOL nCol2 = theCurArea.aEnd.Col(); 367 if ( nCol1 > 0 368 && (theCurData.aEnd.Col() < nCol2 || nCol2 == MAXCOL) ) 369 { // Data links 370 theCurData.aEnd.SetCol( nCol1 - 1 ); 371 if ( theCurData.aStart.Col() > theCurData.aEnd.Col() ) 372 theCurData.aStart.SetCol( theCurData.aEnd.Col() ); 373 } 374 else 375 { // Data rechts 376 theCurData.aStart.SetCol( nCol2 + 1 ); 377 if ( theCurData.aStart.Col() > theCurData.aEnd.Col() ) 378 theCurData.aEnd.SetCol( theCurData.aStart.Col() ); 379 } 380 } 381 } 382 String aStr; 383 theCurData.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); 384 385 if(bRef) 386 aEdAssign2.SetRefString( aStr ); 387 else 388 aEdAssign2.SetText( aStr ); 389 390 aEdAssign2.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) ); 391 } 392 393 394 /************************************************************************* 395 #* Member: SetReference Datum:04.09.97 396 #*------------------------------------------------------------------------ 397 #* 398 #* Klasse: ScColRowNameRangesDlg 399 #* 400 #* Funktion: Uebergabe eines mit der Maus selektierten Tabellen- 401 #* bereiches, der dann als neue Selektion im Referenz- 402 #* Fenster angezeigt wird. 403 #* 404 #* Input: Bereich fuer Labels 405 #* Dokumentklasse 406 #* 407 #* Output: --- 408 #* 409 #************************************************************************/ 410 411 void ScColRowNameRangesDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ ) 412 { 413 if ( pEdActive ) 414 { 415 if ( rRef.aStart != rRef.aEnd ) 416 RefInputStart( pEdActive ); 417 418 String aRefStr; 419 if ( pEdActive == &aEdAssign ) 420 SetColRowData( rRef, sal_True ); 421 else 422 AdjustColRowData( rRef, sal_True ); 423 aBtnColHead.Enable(); 424 aBtnRowHead.Enable(); 425 aBtnAdd.Enable(); 426 aBtnRemove.Disable(); 427 } 428 } 429 430 431 /************************************************************************* 432 #* Member: Close Datum:04.09.97 433 #*------------------------------------------------------------------------ 434 #* 435 #* Klasse: ScColRowNameRangesDlg 436 #* 437 #* Funktion: Schliessen des Fensters 438 #* 439 #* Input: --- 440 #* 441 #* Output: --- 442 #* 443 #************************************************************************/ 444 445 sal_Bool __EXPORT ScColRowNameRangesDlg::Close() 446 { 447 return DoClose( ScColRowNameRangesDlgWrapper::GetChildWindowId() ); 448 } 449 450 451 /************************************************************************* 452 #* Member: SetActive Datum:04.09.97 453 #*------------------------------------------------------------------------ 454 #* 455 #* Klasse: ScColRowNameRangesDlg 456 #* 457 #* Funktion: Aktivieren des Fensters 458 #* 459 #* Input: --- 460 #* 461 #* Output: --- 462 #* 463 #************************************************************************/ 464 465 void ScColRowNameRangesDlg::SetActive() 466 { 467 if ( bDlgLostFocus ) 468 { 469 bDlgLostFocus = sal_False; 470 if( pEdActive ) 471 pEdActive->GrabFocus(); 472 } 473 else 474 GrabFocus(); 475 476 if( pEdActive == &aEdAssign ) 477 Range1DataModifyHdl( 0 ); 478 else if( pEdActive == &aEdAssign2 ) 479 Range2DataModifyHdl( 0 ); 480 481 RefInputDone(); 482 } 483 484 485 /************************************************************************* 486 #* Member: UpdateNames Datum:04.09.97 487 #*------------------------------------------------------------------------ 488 #* 489 #* Klasse: ScColRowNameRangesDlg 490 #* 491 #* Funktion: Aktualisieren der Namen 492 #* 493 #* Input: --- 494 #* 495 #* Output: --- 496 #* 497 #************************************************************************/ 498 499 void ScColRowNameRangesDlg::UpdateNames() 500 { 501 aLbRange.SetUpdateMode( sal_False ); 502 //----------------------------------------------------------- 503 aLbRange.Clear(); 504 aRangeMap.clear(); 505 aEdAssign.SetText( EMPTY_STRING ); 506 507 sal_uLong nCount, j; 508 sal_uInt16 nPos; //@008 Hilfsvariable q eingefuegt 509 510 SCCOL nCol1; //@008 04.09.97 511 SCROW nRow1; //Erweiterung fuer Bereichsnamen 512 SCTAB nTab1; 513 SCCOL nCol2; 514 SCROW nRow2; 515 SCTAB nTab2; 516 String rString; 517 String strShow; 518 const ScAddress::Details aDetails(pDoc->GetAddressConvention()); 519 520 String aString; 521 String strDelim = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " --- " )); 522 aString = strDelim; 523 aString += ScGlobal::GetRscString( STR_COLUMN ); 524 aString += strDelim; 525 nPos = aLbRange.InsertEntry( aString ); 526 aLbRange.SetEntryData( nPos, (void*)nEntryDataDelim ); 527 if ( (nCount = xColNameRanges->Count()) > 0 ) 528 { 529 ScRangePair** ppSortArray = xColNameRanges->CreateNameSortedArray( 530 nCount, pDoc ); 531 for ( j=0; j < nCount; j++ ) 532 { 533 const ScRange aRange(ppSortArray[j]->GetRange(0)); 534 aRange.Format( aString, SCR_ABS_3D, pDoc, aDetails ); 535 536 //@008 Hole Bereichsparameter aus Dok 537 ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, 538 nCol2, nRow2, nTab2 ); 539 SCCOL q=nCol1+3; 540 if(q>nCol2) q=nCol2; 541 //@008 Baue String zusammen 542 strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" [")); 543 if(pDoc!=NULL) 544 { 545 pDoc->GetString(nCol1, nRow1, nTab1,rString); 546 strShow +=rString; 547 for(SCCOL i=nCol1+1;i<=q;i++) 548 { 549 strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); 550 pDoc->GetString(i, nRow1, nTab1,rString); 551 strShow += rString; 552 } 553 } 554 if(q<nCol2) // Zu lang? Ergaenzen um ",..." 555 { 556 strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ...")); 557 } 558 strShow += ']'; 559 560 //@008 String einfuegen in Listbox 561 String aInsStr = aString; 562 aInsStr += strShow; 563 nPos = aLbRange.InsertEntry( aInsStr ); 564 aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) ); 565 aLbRange.SetEntryData( nPos, (void*)nEntryDataCol ); 566 } 567 delete [] ppSortArray; 568 } 569 aString = strDelim; 570 aString += ScGlobal::GetRscString( STR_ROW ); 571 aString += strDelim; 572 nPos = aLbRange.InsertEntry( aString ); 573 aLbRange.SetEntryData( nPos, (void*)nEntryDataDelim ); 574 if ( (nCount = xRowNameRanges->Count()) > 0 ) 575 { 576 ScRangePair** ppSortArray = xRowNameRanges->CreateNameSortedArray( 577 nCount, pDoc ); 578 for ( j=0; j < nCount; j++ ) 579 { 580 const ScRange aRange(ppSortArray[j]->GetRange(0)); 581 aRange.Format( aString, SCR_ABS_3D, pDoc, aDetails ); 582 583 //@008 Ab hier baue String fuer Zeilen 584 ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, 585 nCol2, nRow2, nTab2 ); 586 SCROW q=nRow1+3; 587 if(q>nRow2) q=nRow2; 588 strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" [")); 589 if(pDoc!=NULL) 590 { 591 pDoc->GetString(nCol1, nRow1, nTab1,rString); 592 strShow += rString; 593 for(SCROW i=nRow1+1;i<=q;i++) 594 { 595 strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); 596 pDoc->GetString(nCol1, i, nTab1,rString); 597 strShow += rString; 598 } 599 } 600 if(q<nRow2) 601 { 602 strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ...")); 603 } 604 strShow += ']'; 605 606 String aInsStr = aString; 607 aInsStr += strShow; 608 nPos = aLbRange.InsertEntry( aInsStr ); 609 aRangeMap.insert( NameRangeMap::value_type(aInsStr, aRange) ); 610 aLbRange.SetEntryData( nPos, (void*)nEntryDataRow ); 611 } 612 delete [] ppSortArray; 613 } 614 //----------------------------------------------------------- 615 aLbRange.SetUpdateMode( sal_True ); 616 aLbRange.Invalidate(); 617 } 618 619 620 /************************************************************************* 621 #* Member: UpdateRangeData Datum:04.09.97 622 #*------------------------------------------------------------------------ 623 #* 624 #* Klasse: ScColRowNameRangesDlg 625 #* 626 #* Funktion: Aktualisieren der Bereichsdaten 627 #* 628 #* Input: Bereichs-String 629 #* Flag fuer Spalten 630 #* 631 #* Output: --- 632 #* 633 #************************************************************************/ 634 635 void ScColRowNameRangesDlg::UpdateRangeData( const ScRange& rRange, sal_Bool bColName ) 636 { 637 ScRangePair* pPair = NULL; 638 sal_Bool bFound = sal_False; 639 if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL ) 640 bFound = sal_True; 641 else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL ) 642 bFound = sal_True; 643 644 if ( bFound ) 645 { 646 const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); 647 String aStr; 648 theCurArea = rRange; 649 theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv ); 650 aEdAssign.SetText( aStr ); 651 aBtnAdd.Disable(); 652 aBtnRemove.Enable(); 653 aBtnColHead.Check( bColName ); 654 aBtnRowHead.Check( !bColName ); 655 theCurData = pPair->GetRange(1); 656 theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv ); 657 aEdAssign2.SetText( aStr ); 658 } 659 else 660 { 661 aBtnAdd.Enable(); 662 aBtnRemove.Disable(); 663 } 664 aBtnColHead.Enable(); 665 aBtnRowHead.Enable(); 666 aEdAssign2.Enable(); 667 aRbAssign2.Enable(); 668 } 669 670 671 /************************************************************************* 672 #* Member: IsRefInputMode Datum:04.09.97 673 #*------------------------------------------------------------------------ 674 #* 675 #* Klasse: ScColRowNameRangesDlg 676 #* 677 #* Funktion: Abfragefunktion fuer Referenz- Input- Mode. 678 #* 679 #* Input: Bereichs-String 680 #* Flag fuer Spalten 681 #* 682 #* Output: true, wenn Referenz- Input- Mode 683 #* 684 #************************************************************************/ 685 686 sal_Bool ScColRowNameRangesDlg::IsRefInputMode() const 687 { 688 return (pEdActive != NULL); 689 } 690 691 //------------------------------------------------------------------------ 692 // Handler: 693 // ======== 694 695 /************************************************************************* 696 #* Handler: OkBtnHdl Datum:04.09.97 697 #*------------------------------------------------------------------------ 698 #* 699 #* Klasse: ScColRowNameRangesDlg 700 #* 701 #* Funktion: Wird ausgeloest, wenn der OK- Button gedrueckt wurde. 702 #* Hinzufuegen- Button ausloesen, und die neu einge- 703 #* stellten Bereiche ans Dokument uebergeben. 704 #* Fensterschliessen- Anweisung ausloesen. 705 #* Input: --- 706 #* 707 #* Output: --- 708 #* 709 #************************************************************************/ 710 711 IMPL_LINK( ScColRowNameRangesDlg, OkBtnHdl, void *, EMPTYARG ) 712 { 713 AddBtnHdl( 0 ); 714 715 // die RangeLists den Refs am Doc zuweisen 716 pDoc->GetColNameRangesRef() = xColNameRanges; 717 pDoc->GetRowNameRangesRef() = xRowNameRanges; 718 // geaenderte Datenbereiche muessen sich auswirken 719 pDoc->CompileColRowNameFormula(); 720 ScDocShell* pDocShell = pViewData->GetDocShell(); 721 pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID ); 722 pDocShell->SetDocumentModified(); 723 724 Close(); 725 return 0; 726 } 727 728 729 /************************************************************************* 730 #* Handler: CancelBtnHdl Datum:04.09.97 731 #*------------------------------------------------------------------------ 732 #* 733 #* Klasse: ScColRowNameRangesDlg 734 #* 735 #* Funktion: Fensterschliessen- Anweisung ausloesen. 736 #* 737 #* Input: --- 738 #* 739 #* Output: --- 740 #* 741 #************************************************************************/ 742 743 IMPL_LINK_INLINE_START( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG ) 744 { 745 Close(); 746 return 0; 747 } 748 IMPL_LINK_INLINE_END( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG ) 749 750 751 /************************************************************************* 752 #* Handler: AddBtnHdl Datum:04.09.97 753 #*------------------------------------------------------------------------ 754 #* 755 #* Klasse: ScColRowNameRangesDlg 756 #* 757 #* Funktion: Nach betaetigen des Hinzufuegen- Buttons, werden 758 #* die Bereichsangaben eingestellt und in der 759 #* Listbox dargestellt. 760 #* 761 #* Input: --- 762 #* 763 #* Output: --- 764 #* 765 #************************************************************************/ 766 767 IMPL_LINK( ScColRowNameRangesDlg, AddBtnHdl, void *, EMPTYARG ) 768 { 769 String aNewArea( aEdAssign.GetText() ); 770 String aNewData( aEdAssign2.GetText() ); 771 772 if ( aNewArea.Len() > 0 && aNewData.Len() > 0 ) 773 { 774 const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); 775 ScRange aRange1, aRange2; 776 sal_Bool bOk1; 777 if ( (bOk1 = ((aRange1.ParseAny( aNewArea, pDoc, eConv ) & SCA_VALID) == SCA_VALID)) != sal_False 778 && ((aRange2.ParseAny( aNewData, pDoc, eConv ) & SCA_VALID) == SCA_VALID) ) 779 { 780 theCurArea = aRange1; 781 AdjustColRowData( aRange2 ); 782 ScRangePair* pPair; 783 if ( ( pPair = xColNameRanges->Find( theCurArea ) ) != NULL ) 784 { 785 xColNameRanges->Remove( pPair ); 786 delete pPair; 787 } 788 if ( ( pPair = xRowNameRanges->Find( theCurArea ) ) != NULL ) 789 { 790 xRowNameRanges->Remove( pPair ); 791 delete pPair; 792 } 793 if ( aBtnColHead.IsChecked() ) 794 xColNameRanges->Join( ScRangePair( theCurArea, theCurData ) ); 795 else 796 xRowNameRanges->Join( ScRangePair( theCurArea, theCurData ) ); 797 798 UpdateNames(); 799 800 aEdAssign.GrabFocus(); 801 aBtnAdd.Disable(); 802 aBtnRemove.Disable(); 803 aEdAssign.SetText( EMPTY_STRING ); 804 aBtnColHead.Check( sal_True ); 805 aBtnRowHead.Check( sal_False ); 806 aEdAssign2.SetText( EMPTY_STRING ); 807 theCurArea = ScRange(); 808 theCurData = theCurArea; 809 Range1SelectHdl( 0 ); 810 } 811 else 812 { 813 ERRORBOX( ScGlobal::GetRscString(STR_INVALIDTABNAME) ); 814 if ( !bOk1 ) 815 aEdAssign.GrabFocus(); 816 else 817 aEdAssign2.GrabFocus(); 818 } 819 } 820 return 0; 821 } 822 823 824 /************************************************************************* 825 #* Handler: RemoveBtnHdl Datum:04.09.97 826 #*------------------------------------------------------------------------ 827 #* 828 #* Klasse: ScColRowNameRangesDlg 829 #* 830 #* Funktion: Nach betaetigen des Loeschen- Buttons, wird 831 #* die markierte Bereichsangabe geloescht. 832 #* 833 #* Input: --- 834 #* 835 #* Output: --- 836 #* 837 #************************************************************************/ 838 839 IMPL_LINK( ScColRowNameRangesDlg, RemoveBtnHdl, void *, EMPTYARG ) 840 { 841 String aRangeStr = aLbRange.GetSelectEntry(); 842 sal_uInt16 nSelectPos = aLbRange.GetSelectEntryPos(); 843 sal_Bool bColName = 844 ((sal_uLong)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol); 845 NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr); 846 if (itr == aRangeMap.end()) 847 return 0; 848 const ScRange& rRange = itr->second; 849 850 ScRangePair* pPair = NULL; 851 sal_Bool bFound = sal_False; 852 if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL ) 853 bFound = sal_True; 854 else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL ) 855 bFound = sal_True; 856 if ( bFound ) 857 { 858 String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY ); 859 String aMsg = aStrDelMsg.GetToken( 0, '#' ); 860 861 aMsg += aRangeStr; 862 aMsg += aStrDelMsg.GetToken( 1, '#' ); 863 864 if ( RET_YES == QUERYBOX(aMsg) ) 865 { 866 if ( bColName ) 867 xColNameRanges->Remove( pPair ); 868 else 869 xRowNameRanges->Remove( pPair ); 870 delete pPair; 871 872 UpdateNames(); 873 sal_uInt16 nCnt = aLbRange.GetEntryCount(); 874 if ( nSelectPos >= nCnt ) 875 { 876 if ( nCnt ) 877 nSelectPos = nCnt - 1; 878 else 879 nSelectPos = 0; 880 } 881 aLbRange.SelectEntryPos( nSelectPos ); 882 if ( nSelectPos && 883 (sal_uLong)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim ) 884 aLbRange.SelectEntryPos( --nSelectPos ); // ---Zeile--- 885 886 aLbRange.GrabFocus(); 887 aBtnAdd.Disable(); 888 aBtnRemove.Disable(); 889 aEdAssign.SetText( EMPTY_STRING ); 890 theCurArea = theCurData = ScRange(); 891 aBtnColHead.Check( sal_True ); 892 aBtnRowHead.Check( sal_False ); 893 aEdAssign2.SetText( EMPTY_STRING ); 894 Range1SelectHdl( 0 ); 895 } 896 } 897 return 0; 898 } 899 900 901 /************************************************************************* 902 #* Handler: Range1SelectHdl Datum:04.09.97 903 #*------------------------------------------------------------------------ 904 #* 905 #* Klasse: ScColRowNameRangesDlg 906 #* 907 #* Funktion: Wenn Zeile in Listbox ausgewaehlt wird, 908 #* werden die Eingabefelder entsprechend 909 #* eingestellt. 910 #* 911 #* Input: --- 912 #* 913 #* Output: --- 914 #* 915 #************************************************************************/ 916 917 IMPL_LINK( ScColRowNameRangesDlg, Range1SelectHdl, void *, EMPTYARG ) 918 { 919 sal_uInt16 nSelectPos = aLbRange.GetSelectEntryPos(); 920 sal_uInt16 nCnt = aLbRange.GetEntryCount(); 921 sal_uInt16 nMoves = 0; 922 while ( nSelectPos < nCnt 923 && (sal_uLong)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim ) 924 { // skip Delimiter 925 ++nMoves; 926 aLbRange.SelectEntryPos( ++nSelectPos ); 927 } 928 String aRangeStr = aLbRange.GetSelectEntry(); 929 if ( nMoves ) 930 { 931 if ( nSelectPos > 1 && nSelectPos >= nCnt ) 932 { // am Ende nicht auf dem " --- Zeile --- " Delimiter stehenbleiben 933 // wenn davor Eintraege existieren 934 nSelectPos = nCnt - 2; 935 aLbRange.SelectEntryPos( nSelectPos ); 936 aRangeStr = aLbRange.GetSelectEntry(); 937 } 938 else if ( nSelectPos > 2 && nSelectPos < nCnt && aRangeStr.Len() 939 && aRangeStr == aEdAssign.GetText() ) 940 { // nach oben wandern statt nach unten auf die vorherige Position 941 nSelectPos -= 2; 942 aLbRange.SelectEntryPos( nSelectPos ); 943 aRangeStr = aLbRange.GetSelectEntry(); 944 } 945 } 946 NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr); 947 if ( itr != aRangeMap.end() ) 948 { 949 sal_Bool bColName = 950 ((sal_uLong)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol); 951 UpdateRangeData( itr->second, bColName ); 952 aBtnAdd.Disable(); 953 aBtnRemove.Enable(); 954 } 955 else 956 { 957 if ( aEdAssign.GetText().Len() > 0 ) 958 { 959 if ( aEdAssign2.GetText().Len() > 0 ) 960 aBtnAdd.Enable(); 961 else 962 aBtnAdd.Disable(); 963 aBtnColHead.Enable(); 964 aBtnRowHead.Enable(); 965 aEdAssign2.Enable(); 966 aRbAssign2.Enable(); 967 } 968 else 969 { 970 aBtnAdd.Disable(); 971 aBtnColHead.Disable(); 972 aBtnRowHead.Disable(); 973 aEdAssign2.Disable(); 974 aRbAssign2.Disable(); 975 } 976 aBtnRemove.Disable(); 977 aEdAssign.GrabFocus(); 978 } 979 980 aEdAssign.Enable(); 981 aRbAssign.Enable(); 982 983 //@BugID 54702 Enablen/Disablen nur noch in Basisklasse 984 //SFX_APPWINDOW->Enable(); 985 return 0; 986 } 987 988 989 /************************************************************************* 990 #* Handler: Range1DataModifyHdl Datum:04.09.97 991 #*------------------------------------------------------------------------ 992 #* 993 #* Klasse: ScColRowNameRangesDlg 994 #* 995 #* Funktion: Wird ausgeloest, wenn in der Tabelle, der Label- 996 #* Bereich geaendert wurde. 997 #* 998 #* Input: --- 999 #* 1000 #* Output: --- 1001 #* 1002 #************************************************************************/ 1003 1004 IMPL_LINK( ScColRowNameRangesDlg, Range1DataModifyHdl, void *, EMPTYARG ) 1005 { 1006 String aNewArea( aEdAssign.GetText() ); 1007 sal_Bool bValid = sal_False; 1008 if ( aNewArea.Len() > 0 ) 1009 { 1010 ScRange aRange; 1011 if ( (aRange.ParseAny( aNewArea, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID ) 1012 { 1013 SetColRowData( aRange ); 1014 bValid = sal_True; 1015 } 1016 } 1017 if ( bValid ) 1018 { 1019 aBtnAdd.Enable(); 1020 aBtnColHead.Enable(); 1021 aBtnRowHead.Enable(); 1022 aEdAssign2.Enable(); 1023 aRbAssign2.Enable(); 1024 } 1025 else 1026 { 1027 aBtnAdd.Disable(); 1028 aBtnColHead.Disable(); 1029 aBtnRowHead.Disable(); 1030 aEdAssign2.Disable(); 1031 aRbAssign2.Disable(); 1032 } 1033 aBtnRemove.Disable(); 1034 return 0; 1035 } 1036 1037 1038 /************************************************************************* 1039 #* Handler: Range2DataModifyHdl Datum:04.09.97 1040 #*------------------------------------------------------------------------ 1041 #* 1042 #* Klasse: ScColRowNameRangesDlg 1043 #* 1044 #* Funktion: Wird ausgeloest, wenn in der Tabelle, der Daten- 1045 #* Bereich geaendert wurde 1046 #* 1047 #* Input: --- 1048 #* 1049 #* Output: --- 1050 #* 1051 #************************************************************************/ 1052 1053 IMPL_LINK( ScColRowNameRangesDlg, Range2DataModifyHdl, void *, EMPTYARG ) 1054 { 1055 String aNewData( aEdAssign2.GetText() ); 1056 if ( aNewData.Len() > 0 ) 1057 { 1058 ScRange aRange; 1059 if ( (aRange.ParseAny( aNewData, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID ) 1060 { 1061 AdjustColRowData( aRange ); 1062 aBtnAdd.Enable(); 1063 } 1064 else 1065 aBtnAdd.Disable(); 1066 } 1067 else 1068 { 1069 aBtnAdd.Disable(); 1070 } 1071 return 0; 1072 } 1073 1074 1075 /************************************************************************* 1076 #* Handler: ColClickHdl Datum:04.09.97 1077 #*------------------------------------------------------------------------ 1078 #* 1079 #* Klasse: ScColRowNameRangesDlg 1080 #* 1081 #* Funktion: Radiobutton fuer Spalten wurde betaetigt, 1082 #* die entsprechenden Einstellungen werden 1083 #* vorgenommen 1084 #* 1085 #* Input: --- 1086 #* 1087 #* Output: --- 1088 #* 1089 #************************************************************************/ 1090 1091 IMPL_LINK( ScColRowNameRangesDlg, ColClickHdl, void *, EMPTYARG ) 1092 { 1093 if ( !aBtnColHead.GetSavedValue() ) 1094 { 1095 aBtnColHead.Check( sal_True ); 1096 aBtnRowHead.Check( sal_False ); 1097 if ( theCurArea.aStart.Row() == 0 && theCurArea.aEnd.Row() == MAXROW ) 1098 { 1099 theCurArea.aEnd.SetRow( MAXROW - 1 ); 1100 String aStr; 1101 theCurArea.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); 1102 aEdAssign.SetText( aStr ); 1103 } 1104 ScRange aRange( theCurData ); 1105 aRange.aStart.SetRow( Min( (long)(theCurArea.aEnd.Row() + 1), (long)MAXROW ) ); 1106 aRange.aEnd.SetRow( MAXROW ); 1107 AdjustColRowData( aRange ); 1108 } 1109 return 0; 1110 } 1111 1112 1113 /************************************************************************* 1114 #* Handler: RowClickHdl Datum:04.09.97 1115 #*------------------------------------------------------------------------ 1116 #* 1117 #* Klasse: ScColRowNameRangesDlg 1118 #* 1119 #* Funktion: Radiobutton fuer Zeilen wurde betaetigt, 1120 #* die entsprechenden Einstellungen werden 1121 #* vorgenommen 1122 #* 1123 #* Input: --- 1124 #* 1125 #* Output: --- 1126 #* 1127 #************************************************************************/ 1128 1129 IMPL_LINK( ScColRowNameRangesDlg, RowClickHdl, void *, EMPTYARG ) 1130 { 1131 if ( !aBtnRowHead.GetSavedValue() ) 1132 { 1133 aBtnRowHead.Check( sal_True ); 1134 aBtnColHead.Check( sal_False ); 1135 if ( theCurArea.aStart.Col() == 0 && theCurArea.aEnd.Col() == MAXCOL ) 1136 { 1137 theCurArea.aEnd.SetCol( MAXCOL - 1 ); 1138 String aStr; 1139 theCurArea.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); 1140 aEdAssign.SetText( aStr ); 1141 } 1142 ScRange aRange( theCurData ); 1143 aRange.aStart.SetCol( static_cast<SCCOL>(Min( (long)(theCurArea.aEnd.Col() + 1), (long)MAXCOL )) ); 1144 aRange.aEnd.SetCol( MAXCOL ); 1145 AdjustColRowData( aRange ); 1146 } 1147 return 0; 1148 } 1149 1150 1151 IMPL_LINK( ScColRowNameRangesDlg, GetFocusHdl, Control*, pCtrl ) 1152 { 1153 if( (pCtrl == (Control*)&aEdAssign) || (pCtrl == (Control*)&aRbAssign) ) 1154 pEdActive = &aEdAssign; 1155 else if( (pCtrl == (Control*)&aEdAssign2) || (pCtrl == (Control*)&aRbAssign2) ) 1156 pEdActive = &aEdAssign2; 1157 else 1158 pEdActive = NULL; 1159 1160 if( pEdActive ) 1161 pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); 1162 1163 return 0; 1164 } 1165 1166 1167 IMPL_LINK( ScColRowNameRangesDlg, LoseFocusHdl, Control*, EMPTYARG ) 1168 { 1169 bDlgLostFocus = !IsActive(); 1170 return 0; 1171 } 1172