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 #include "scitems.hxx" 28 #include <editeng/eeitem.hxx> 29 30 31 #include <memory> 32 #include "AccessibleText.hxx" 33 #include "AccessibleCell.hxx" 34 #include "tabvwsh.hxx" 35 #include "editutil.hxx" 36 #include "document.hxx" 37 #include "scmod.hxx" 38 #include "prevwsh.hxx" 39 #include "docsh.hxx" 40 #include "prevloc.hxx" 41 #include "unoguard.hxx" 42 #include "patattr.hxx" 43 #include "inputwin.hxx" 44 #include <editeng/unofored.hxx> 45 #include <editeng/editview.hxx> 46 #include <editeng/unoedhlp.hxx> 47 #include <vcl/virdev.hxx> 48 #include <editeng/editobj.hxx> 49 #include <editeng/adjitem.hxx> 50 #include <svx/svdmodel.hxx> 51 #include <svx/algitem.hxx> 52 53 54 // ============================================================================ 55 56 class ScViewForwarder : public SvxViewForwarder 57 { 58 ScTabViewShell* mpViewShell; 59 ScAddress maCellPos; 60 ScSplitPos meSplitPos; 61 public: 62 ScViewForwarder(ScTabViewShell* pViewShell, ScSplitPos eSplitPos, const ScAddress& rCell); 63 virtual ~ScViewForwarder(); 64 65 virtual sal_Bool IsValid() const; 66 virtual Rectangle GetVisArea() const; 67 virtual Point LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const; 68 virtual Point PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const; 69 70 void SetInvalid(); 71 }; 72 73 ScViewForwarder::ScViewForwarder(ScTabViewShell* pViewShell, ScSplitPos eSplitPos, const ScAddress& rCell) 74 : 75 mpViewShell(pViewShell), 76 maCellPos(rCell), 77 meSplitPos(eSplitPos) 78 { 79 } 80 81 ScViewForwarder::~ScViewForwarder() 82 { 83 } 84 85 sal_Bool ScViewForwarder::IsValid() const 86 { 87 return mpViewShell != NULL; 88 } 89 90 Rectangle ScViewForwarder::GetVisArea() const 91 { 92 Rectangle aVisArea; 93 if (mpViewShell) 94 { 95 Window* pWindow = mpViewShell->GetWindowByPos(meSplitPos); 96 if (pWindow) 97 { 98 aVisArea.SetSize(pWindow->GetSizePixel()); 99 100 ScHSplitPos eWhichH = ((meSplitPos == SC_SPLIT_TOPLEFT) || (meSplitPos == SC_SPLIT_BOTTOMLEFT)) ? 101 SC_SPLIT_LEFT : SC_SPLIT_RIGHT; 102 ScVSplitPos eWhichV = ((meSplitPos == SC_SPLIT_TOPLEFT) || (meSplitPos == SC_SPLIT_TOPRIGHT)) ? 103 SC_SPLIT_TOP : SC_SPLIT_BOTTOM; 104 105 Point aBaseCellPos(mpViewShell->GetViewData()->GetScrPos(mpViewShell->GetViewData()->GetPosX(eWhichH), 106 mpViewShell->GetViewData()->GetPosY(eWhichV), meSplitPos, sal_True)); 107 Point aCellPos(mpViewShell->GetViewData()->GetScrPos(maCellPos.Col(), maCellPos.Row(), meSplitPos, sal_True)); 108 aVisArea.SetPos(aCellPos - aBaseCellPos); 109 } 110 } 111 else 112 { 113 DBG_ERROR("this ViewForwarder is not valid"); 114 } 115 return aVisArea; 116 } 117 118 Point ScViewForwarder::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const 119 { 120 if (mpViewShell) 121 { 122 Window* pWindow = mpViewShell->GetWindowByPos(meSplitPos); 123 if (pWindow) 124 return pWindow->LogicToPixel( rPoint, rMapMode ); 125 } 126 else 127 { 128 DBG_ERROR("this ViewForwarder is not valid"); 129 } 130 return Point(); 131 } 132 133 Point ScViewForwarder::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const 134 { 135 if (mpViewShell) 136 { 137 Window* pWindow = mpViewShell->GetWindowByPos(meSplitPos); 138 if (pWindow) 139 return pWindow->PixelToLogic( rPoint, rMapMode ); 140 } 141 else 142 { 143 DBG_ERROR("this ViewForwarder is not valid"); 144 } 145 return Point(); 146 } 147 148 void ScViewForwarder::SetInvalid() 149 { 150 mpViewShell = NULL; 151 } 152 153 // ============================================================================ 154 155 class ScEditObjectViewForwarder : public SvxViewForwarder 156 { 157 Window* mpWindow; 158 // --> OD 2005-12-21 #i49561# 159 // - EditView needed for access to its visible area. 160 const EditView* mpEditView; 161 // <-- 162 public: 163 // --> OD 2005-12-21 #i49561# 164 ScEditObjectViewForwarder( Window* pWindow, 165 const EditView* _pEditView); 166 // <-- 167 virtual ~ScEditObjectViewForwarder(); 168 169 virtual sal_Bool IsValid() const; 170 virtual Rectangle GetVisArea() const; 171 virtual Point LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const; 172 virtual Point PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const; 173 174 void SetInvalid(); 175 }; 176 177 // --> OD 2005-12-21 #i49561# 178 ScEditObjectViewForwarder::ScEditObjectViewForwarder( Window* pWindow, 179 const EditView* _pEditView ) 180 : 181 mpWindow(pWindow), 182 mpEditView( _pEditView ) 183 { 184 } 185 // <-- 186 187 ScEditObjectViewForwarder::~ScEditObjectViewForwarder() 188 { 189 } 190 191 sal_Bool ScEditObjectViewForwarder::IsValid() const 192 { 193 return (mpWindow != NULL); 194 } 195 196 Rectangle ScEditObjectViewForwarder::GetVisArea() const 197 { 198 Rectangle aVisArea; 199 if (mpWindow) 200 { 201 Rectangle aVisRect(mpWindow->GetWindowExtentsRelative(mpWindow->GetAccessibleParentWindow())); 202 203 aVisRect.SetPos(Point(0, 0)); 204 205 aVisArea = aVisRect; 206 } 207 else 208 { 209 DBG_ERROR("this ViewForwarder is not valid"); 210 } 211 return aVisArea; 212 } 213 214 Point ScEditObjectViewForwarder::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const 215 { 216 if (mpWindow) 217 { 218 // --> OD 2005-12-21 #i49561# - consider offset of the visible area 219 // of the EditView before converting point to pixel. 220 Point aPoint( rPoint ); 221 if ( mpEditView ) 222 { 223 Rectangle aEditViewVisArea( mpEditView->GetVisArea() ); 224 aPoint += aEditViewVisArea.TopLeft(); 225 } 226 return mpWindow->LogicToPixel( aPoint, rMapMode ); 227 // <-- 228 } 229 else 230 { 231 DBG_ERROR("this ViewForwarder is not valid"); 232 } 233 return Point(); 234 } 235 236 Point ScEditObjectViewForwarder::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const 237 { 238 if (mpWindow) 239 { 240 // --> OD 2005-12-21 #i49561# - consider offset of the visible area 241 // of the EditView after converting point to logic. 242 Point aPoint( mpWindow->PixelToLogic( rPoint, rMapMode ) ); 243 if ( mpEditView ) 244 { 245 Rectangle aEditViewVisArea( mpEditView->GetVisArea() ); 246 aPoint -= aEditViewVisArea.TopLeft(); 247 } 248 return aPoint; 249 // <-- 250 } 251 else 252 { 253 DBG_ERROR("this ViewForwarder is not valid"); 254 } 255 return Point(); 256 } 257 258 void ScEditObjectViewForwarder::SetInvalid() 259 { 260 mpWindow = NULL; 261 } 262 263 // ============================================================================ 264 265 class ScPreviewViewForwarder : public SvxViewForwarder 266 { 267 protected: 268 ScPreviewShell* mpViewShell; 269 mutable ScPreviewTableInfo* mpTableInfo; 270 public: 271 ScPreviewViewForwarder(ScPreviewShell* pViewShell); 272 virtual ~ScPreviewViewForwarder(); 273 274 virtual sal_Bool IsValid() const; 275 virtual Rectangle GetVisArea() const; 276 virtual Point LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const; 277 virtual Point PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const; 278 279 void SetInvalid(); 280 281 Rectangle GetVisRect() const; 282 283 // clips the VisArea and calculates with the negativ coordinates 284 Rectangle CorrectVisArea(const Rectangle& rVisArea) const; 285 }; 286 287 ScPreviewViewForwarder::ScPreviewViewForwarder(ScPreviewShell* pViewShell) 288 : 289 mpViewShell(pViewShell), 290 mpTableInfo(NULL) 291 { 292 } 293 294 ScPreviewViewForwarder::~ScPreviewViewForwarder() 295 { 296 delete mpTableInfo; 297 } 298 299 sal_Bool ScPreviewViewForwarder::IsValid() const 300 { 301 return mpViewShell != NULL; 302 } 303 304 Rectangle ScPreviewViewForwarder::GetVisArea() const 305 { 306 Rectangle aVisArea; 307 DBG_ERROR("should be implemented in an abrevated class"); 308 return aVisArea; 309 } 310 311 Point ScPreviewViewForwarder::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const 312 { 313 if (mpViewShell) 314 { 315 Window* pWindow = mpViewShell->GetWindow(); 316 if (pWindow) 317 { 318 MapMode aMapMode(pWindow->GetMapMode().GetMapUnit()); 319 Point aPoint2( OutputDevice::LogicToLogic( rPoint, rMapMode, aMapMode) ); 320 return pWindow->LogicToPixel(aPoint2); 321 } 322 } 323 else 324 { 325 DBG_ERROR("this ViewForwarder is not valid"); 326 } 327 return Point(); 328 } 329 330 Point ScPreviewViewForwarder::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const 331 { 332 if (mpViewShell) 333 { 334 Window* pWindow = mpViewShell->GetWindow(); 335 if (pWindow) 336 { 337 MapMode aMapMode(pWindow->GetMapMode()); 338 aMapMode.SetOrigin(Point()); 339 Point aPoint1( pWindow->PixelToLogic( rPoint ) ); 340 Point aPoint2( OutputDevice::LogicToLogic( aPoint1, 341 aMapMode.GetMapUnit(), 342 rMapMode ) ); 343 return aPoint2; 344 } 345 } 346 else 347 { 348 DBG_ERROR("this ViewForwarder is not valid"); 349 } 350 return Point(); 351 } 352 353 void ScPreviewViewForwarder::SetInvalid() 354 { 355 mpViewShell = NULL; 356 } 357 358 Rectangle ScPreviewViewForwarder::GetVisRect() const 359 { 360 if ( mpViewShell ) 361 { 362 Size aOutputSize; 363 Window* pWindow = mpViewShell->GetWindow(); 364 if ( pWindow ) 365 aOutputSize = pWindow->GetOutputSizePixel(); 366 Point aPoint; 367 Rectangle aVisRect( aPoint, aOutputSize ); 368 return aVisRect; 369 } 370 return Rectangle(); 371 } 372 373 Rectangle ScPreviewViewForwarder::CorrectVisArea(const Rectangle& rVisArea) const 374 { 375 Rectangle aVisArea(rVisArea); 376 Point aPos = aVisArea.TopLeft(); // get first the position to remember negative positions after clipping 377 378 Window* pWin = mpViewShell->GetWindow(); 379 if (pWin) 380 aVisArea = pWin->GetWindowExtentsRelative(pWin).GetIntersection(aVisArea); 381 382 sal_Int32 nX(aPos.getX()); 383 sal_Int32 nY(aPos.getY()); 384 385 if (nX > 0) 386 nX = 0; 387 else if (nX < 0) 388 nX = -nX; 389 if (nY > 0) 390 nY = 0; 391 else if (nY < 0) 392 nY = -nY; 393 aVisArea.SetPos(Point(nX, nY)); 394 395 return aVisArea; 396 } 397 398 // ============================================================================ 399 400 class ScPreviewHeaderFooterViewForwarder : public ScPreviewViewForwarder 401 { 402 sal_Bool mbHeader; 403 public: 404 ScPreviewHeaderFooterViewForwarder(ScPreviewShell* pViewShell, sal_Bool bHeader); 405 virtual ~ScPreviewHeaderFooterViewForwarder(); 406 407 virtual Rectangle GetVisArea() const; 408 }; 409 410 ScPreviewHeaderFooterViewForwarder::ScPreviewHeaderFooterViewForwarder(ScPreviewShell* pViewShell, sal_Bool bHeader) 411 : 412 ScPreviewViewForwarder(pViewShell), 413 mbHeader(bHeader) 414 { 415 } 416 417 ScPreviewHeaderFooterViewForwarder::~ScPreviewHeaderFooterViewForwarder() 418 { 419 } 420 421 Rectangle ScPreviewHeaderFooterViewForwarder::GetVisArea() const 422 { 423 Rectangle aVisArea; 424 if (mpViewShell) 425 { 426 const ScPreviewLocationData& rData = mpViewShell->GetLocationData(); 427 if ( mbHeader ) 428 rData.GetHeaderPosition( aVisArea ); 429 else 430 rData.GetFooterPosition( aVisArea ); 431 432 aVisArea = CorrectVisArea(aVisArea); 433 } 434 else 435 { 436 DBG_ERROR("this ViewForwarder is not valid"); 437 } 438 return aVisArea; 439 } 440 441 // ============================================================================ 442 443 class ScPreviewCellViewForwarder : public ScPreviewViewForwarder 444 { 445 ScAddress maCellPos; 446 public: 447 ScPreviewCellViewForwarder(ScPreviewShell* pViewShell, 448 ScAddress aCellPos); 449 virtual ~ScPreviewCellViewForwarder(); 450 451 virtual Rectangle GetVisArea() const; 452 }; 453 454 ScPreviewCellViewForwarder::ScPreviewCellViewForwarder(ScPreviewShell* pViewShell, 455 ScAddress aCellPos) 456 : 457 ScPreviewViewForwarder(pViewShell), 458 maCellPos(aCellPos) 459 { 460 } 461 462 ScPreviewCellViewForwarder::~ScPreviewCellViewForwarder() 463 { 464 } 465 466 Rectangle ScPreviewCellViewForwarder::GetVisArea() const 467 { 468 Rectangle aVisArea; 469 if (mpViewShell) 470 { 471 const ScPreviewLocationData& rData = mpViewShell->GetLocationData(); 472 aVisArea = rData.GetCellOutputRect(maCellPos); 473 474 aVisArea = CorrectVisArea(aVisArea); 475 } 476 else 477 { 478 DBG_ERROR("this ViewForwarder is not valid"); 479 } 480 return aVisArea; 481 } 482 483 // ============================================================================ 484 485 class ScPreviewHeaderCellViewForwarder : public ScPreviewViewForwarder 486 { 487 ScAddress maCellPos; 488 sal_Bool mbColHeader; 489 sal_Bool mbRowHeader; 490 public: 491 ScPreviewHeaderCellViewForwarder(ScPreviewShell* pViewShell, 492 ScAddress aCellPos, 493 sal_Bool bColHeader, sal_Bool bRowHeader); 494 virtual ~ScPreviewHeaderCellViewForwarder(); 495 496 virtual Rectangle GetVisArea() const; 497 }; 498 499 ScPreviewHeaderCellViewForwarder::ScPreviewHeaderCellViewForwarder(ScPreviewShell* pViewShell, 500 ScAddress aCellPos, 501 sal_Bool bColHeader, sal_Bool bRowHeader) 502 : 503 ScPreviewViewForwarder(pViewShell), 504 maCellPos(aCellPos), 505 mbColHeader(bColHeader), 506 mbRowHeader(bRowHeader) 507 { 508 } 509 510 ScPreviewHeaderCellViewForwarder::~ScPreviewHeaderCellViewForwarder() 511 { 512 } 513 514 Rectangle ScPreviewHeaderCellViewForwarder::GetVisArea() const 515 { 516 Rectangle aVisArea; 517 if (mpViewShell) 518 { 519 const ScPreviewLocationData& rData = mpViewShell->GetLocationData(); 520 aVisArea = rData.GetHeaderCellOutputRect(GetVisRect(), maCellPos, mbColHeader); 521 522 aVisArea = CorrectVisArea(aVisArea); 523 } 524 else 525 { 526 DBG_ERROR("this ViewForwarder is not valid"); 527 } 528 return aVisArea; 529 } 530 531 // ============================================================================ 532 533 class ScPreviewNoteViewForwarder : public ScPreviewViewForwarder 534 { 535 ScAddress maCellPos; 536 sal_Bool mbNoteMark; 537 public: 538 ScPreviewNoteViewForwarder(ScPreviewShell* pViewShell, 539 ScAddress aCellPos, 540 sal_Bool bNoteMark); 541 virtual ~ScPreviewNoteViewForwarder(); 542 543 virtual Rectangle GetVisArea() const; 544 }; 545 546 ScPreviewNoteViewForwarder::ScPreviewNoteViewForwarder(ScPreviewShell* pViewShell, 547 ScAddress aCellPos, 548 sal_Bool bNoteMark) 549 : 550 ScPreviewViewForwarder(pViewShell), 551 maCellPos(aCellPos), 552 mbNoteMark(bNoteMark) 553 { 554 } 555 556 ScPreviewNoteViewForwarder::~ScPreviewNoteViewForwarder() 557 { 558 } 559 560 Rectangle ScPreviewNoteViewForwarder::GetVisArea() const 561 { 562 Rectangle aVisArea; 563 if (mpViewShell) 564 { 565 const ScPreviewLocationData& rData = mpViewShell->GetLocationData(); 566 aVisArea = rData.GetNoteInRangeOutputRect(GetVisRect(), mbNoteMark, maCellPos); 567 568 aVisArea = CorrectVisArea(aVisArea); 569 } 570 else 571 { 572 DBG_ERROR("this ViewForwarder is not valid"); 573 } 574 return aVisArea; 575 } 576 577 // ============================================================================ 578 579 class ScEditViewForwarder : public SvxEditViewForwarder 580 { 581 EditView* mpEditView; 582 Window* mpWindow; 583 public: 584 ScEditViewForwarder(EditView* pEditView, Window* pWin); 585 virtual ~ScEditViewForwarder(); 586 587 virtual sal_Bool IsValid() const; 588 virtual Rectangle GetVisArea() const; 589 virtual Point LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const; 590 virtual Point PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const; 591 virtual sal_Bool GetSelection( ESelection& rSelection ) const; 592 virtual sal_Bool SetSelection( const ESelection& rSelection ); 593 virtual sal_Bool Copy(); 594 virtual sal_Bool Cut(); 595 virtual sal_Bool Paste(); 596 597 void GrabFocus(); 598 599 void SetInvalid(); 600 }; 601 602 ScEditViewForwarder::ScEditViewForwarder(EditView* pEditView, Window* pWin) 603 : mpEditView(pEditView), 604 mpWindow(pWin) 605 { 606 GrabFocus(); 607 } 608 609 ScEditViewForwarder::~ScEditViewForwarder() 610 { 611 } 612 613 sal_Bool ScEditViewForwarder::IsValid() const 614 { 615 sal_Bool bResult(sal_False); 616 if (mpWindow && mpEditView) 617 { 618 bResult = sal_True; 619 } 620 return bResult; 621 } 622 623 Rectangle ScEditViewForwarder::GetVisArea() const 624 { 625 Rectangle aVisArea; 626 if (IsValid() && mpEditView->GetEditEngine()) 627 { 628 MapMode aMapMode(mpEditView->GetEditEngine()->GetRefMapMode()); 629 630 aVisArea = mpWindow->LogicToPixel( mpEditView->GetVisArea(), aMapMode ); 631 } 632 else 633 { 634 DBG_ERROR("this EditViewForwarder is no longer valid"); 635 } 636 return aVisArea; 637 } 638 639 Point ScEditViewForwarder::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const 640 { 641 if (mpWindow) 642 return mpWindow->LogicToPixel( rPoint, rMapMode ); 643 else 644 { 645 DBG_ERROR("this ViewForwarder is not valid"); 646 } 647 return Point(); 648 } 649 650 Point ScEditViewForwarder::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const 651 { 652 if (mpWindow) 653 return mpWindow->PixelToLogic( rPoint, rMapMode ); 654 else 655 { 656 DBG_ERROR("this ViewForwarder is not valid"); 657 } 658 return Point(); 659 } 660 661 sal_Bool ScEditViewForwarder::GetSelection( ESelection& rSelection ) const 662 { 663 sal_Bool bResult(sal_False); 664 if (IsValid()) 665 { 666 rSelection = mpEditView->GetSelection(); 667 bResult = sal_True; 668 } 669 else 670 { 671 DBG_ERROR("this ViewForwarder is not valid"); 672 } 673 return bResult; 674 } 675 676 sal_Bool ScEditViewForwarder::SetSelection( const ESelection& rSelection ) 677 { 678 sal_Bool bResult(sal_False); 679 if (IsValid()) 680 { 681 mpEditView->SetSelection(rSelection); 682 bResult = sal_True; 683 } 684 else 685 { 686 DBG_ERROR("this ViewForwarder is not valid"); 687 } 688 return bResult; 689 } 690 691 sal_Bool ScEditViewForwarder::Copy() 692 { 693 sal_Bool bResult(sal_False); 694 if (IsValid()) 695 { 696 mpEditView->Copy(); 697 bResult = sal_True; 698 } 699 else 700 { 701 DBG_ERROR("this ViewForwarder is not valid"); 702 } 703 return bResult; 704 } 705 706 sal_Bool ScEditViewForwarder::Cut() 707 { 708 sal_Bool bResult(sal_False); 709 if (IsValid()) 710 { 711 mpEditView->Cut(); 712 bResult = sal_True; 713 } 714 else 715 { 716 DBG_ERROR("this ViewForwarder is not valid"); 717 } 718 return bResult; 719 } 720 721 sal_Bool ScEditViewForwarder::Paste() 722 { 723 sal_Bool bResult(sal_False); 724 if (IsValid()) 725 { 726 mpEditView->Paste(); 727 bResult = sal_True; 728 } 729 else 730 { 731 DBG_ERROR("this ViewForwarder is not valid"); 732 } 733 return bResult; 734 } 735 736 void ScEditViewForwarder::GrabFocus() 737 { 738 } 739 740 void ScEditViewForwarder::SetInvalid() 741 { 742 mpWindow = NULL; 743 mpEditView = NULL; 744 } 745 746 // ============================================================================ 747 748 // ScAccessibleCellTextData: shared data between sub objects of a accessible cell text object 749 750 ScAccessibleCellTextData::ScAccessibleCellTextData(ScTabViewShell* pViewShell, 751 const ScAddress& rP, ScSplitPos eSplitPos, ScAccessibleCell* pAccCell) 752 : ScAccessibleCellBaseTextData(GetDocShell(pViewShell), rP), 753 mpViewForwarder(NULL), 754 mpEditViewForwarder(NULL), 755 mpViewShell(pViewShell), 756 meSplitPos(eSplitPos), 757 mbViewEditEngine(sal_False), 758 mpAccessibleCell( pAccCell ) 759 { 760 } 761 762 ScAccessibleCellTextData::~ScAccessibleCellTextData() 763 { 764 if (pEditEngine) 765 pEditEngine->SetNotifyHdl(Link()); 766 if (mpViewForwarder) 767 delete mpViewForwarder; 768 if (mpEditViewForwarder) 769 delete mpEditViewForwarder; 770 } 771 772 void ScAccessibleCellTextData::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) 773 { 774 if ( rHint.ISA( SfxSimpleHint ) ) 775 { 776 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); 777 if ( nId == SFX_HINT_DYING ) 778 { 779 mpViewShell = NULL; // invalid now 780 if (mpViewForwarder) 781 mpViewForwarder->SetInvalid(); 782 if (mpEditViewForwarder) 783 mpEditViewForwarder->SetInvalid(); 784 } 785 } 786 ScAccessibleCellBaseTextData::Notify(rBC, rHint); 787 } 788 789 ScAccessibleTextData* ScAccessibleCellTextData::Clone() const 790 { 791 return new ScAccessibleCellTextData( mpViewShell, aCellPos, meSplitPos, mpAccessibleCell ); 792 } 793 794 void ScAccessibleCellTextData::GetCellText(const ScAddress& rCellPos, String& rText) 795 { 796 // #104893#; don't use the input string 797 // ScCellTextData::GetCellText(rCellPos, rText); 798 ScDocument* pDoc = pDocShell->GetDocument(); 799 if (pDoc) 800 { 801 // #104893#; use the displayed string 802 pDoc->GetString(rCellPos.Col(), rCellPos.Row(), rCellPos.Tab(), rText); 803 if (mpViewShell) 804 { 805 const ScViewOptions& aOptions = mpViewShell->GetViewData()->GetOptions(); 806 CellType aCellType; 807 pDoc->GetCellType(rCellPos.Col(), rCellPos.Row(), rCellPos.Tab(), aCellType); 808 if (aCellType == CELLTYPE_FORMULA && aOptions.GetOption( VOPT_FORMULAS )) 809 { 810 pDoc->GetFormula( rCellPos.Col(), rCellPos.Row(), rCellPos.Tab(), rText); 811 } 812 else if (!aOptions.GetOption( VOPT_NULLVALS )) 813 { 814 if ((aCellType == CELLTYPE_VALUE || aCellType == CELLTYPE_FORMULA) && pDoc->GetValue(rCellPos) == 0.0) 815 rText.Erase(); 816 } 817 } 818 } 819 } 820 821 SvxTextForwarder* ScAccessibleCellTextData::GetTextForwarder() 822 { 823 /* sal_Bool bHasForwarder(sal_False); 824 if (mpViewShell && mpViewShell->GetViewData() && 825 (mpViewShell->GetViewData()->GetCurPos() == aCellPos) && 826 (mpViewShell->GetViewData()->HasEditView(meSplitPos)) && 827 (mpViewShell->GetViewData()->GetEditViewCol() == aCellPos.Col()) && 828 (mpViewShell->GetViewData()->GetEditViewRow() == aCellPos.Row())) 829 { 830 if (!mbViewEditEngine) 831 { 832 if (pForwarder) 833 DELETEZ( pForwarder ); 834 if (pEditEngine) 835 DELETEZ( pEditEngine ); 836 837 SCCOL nCol; 838 SCROW nRow; 839 EditView* pEditView; 840 mpViewShell->GetViewData()->GetEditView( meSplitPos, pEditView, nCol, nRow ); 841 if (pEditView) 842 { 843 pEditEngine = (ScFieldEditEngine*)pEditView->GetEditEngine(); 844 pForwarder = new SvxEditEngineForwarder(*pEditEngine); 845 bHasForwarder = sal_True; 846 } 847 } 848 else 849 bHasForwarder = sal_True; 850 } 851 else if (mbViewEditEngine) 852 { 853 // remove Forwarder created with EditEngine from EditView 854 if (pForwarder) 855 DELETEZ( pForwarder ); 856 pEditEngine->SetNotifyHdl(Link()); 857 // don't delete, because it is the EditEngine of the EditView 858 pEditEngine = NULL; 859 mbViewEditEngine = sal_False; 860 } 861 862 if (!bHasForwarder)*/ 863 ScCellTextData::GetTextForwarder(); // creates Forwarder and EditEngine 864 865 ScDocument* pDoc = ( pDocShell ? pDocShell->GetDocument() : NULL ); 866 if ( pDoc && pEditEngine && mpViewShell ) 867 { 868 long nSizeX, nSizeY; 869 mpViewShell->GetViewData()->GetMergeSizePixel( 870 aCellPos.Col(), aCellPos.Row(), nSizeX, nSizeY); 871 872 Size aSize(nSizeX, nSizeY); 873 874 // #i92143# text getRangeExtents reports incorrect 'x' values for spreadsheet cells 875 long nIndent = 0; 876 const SvxHorJustifyItem* pHorJustifyItem = static_cast< const SvxHorJustifyItem* >( 877 pDoc->GetAttr( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab(), ATTR_HOR_JUSTIFY ) ); 878 SvxCellHorJustify eHorJust = ( pHorJustifyItem ? static_cast< SvxCellHorJustify >( pHorJustifyItem->GetValue() ) : SVX_HOR_JUSTIFY_STANDARD ); 879 if ( eHorJust == SVX_HOR_JUSTIFY_LEFT ) 880 { 881 const SfxUInt16Item* pIndentItem = static_cast< const SfxUInt16Item* >( 882 pDoc->GetAttr( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab(), ATTR_INDENT ) ); 883 if ( pIndentItem ) 884 { 885 nIndent = static_cast< long >( pIndentItem->GetValue() ); 886 } 887 } 888 889 const SvxMarginItem* pMarginItem = static_cast< const SvxMarginItem* >( 890 pDoc->GetAttr( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab(), ATTR_MARGIN ) ); 891 ScViewData* pViewData = mpViewShell->GetViewData(); 892 double nPPTX = ( pViewData ? pViewData->GetPPTX() : 0 ); 893 double nPPTY = ( pViewData ? pViewData->GetPPTY() : 0 ); 894 long nLeftM = ( pMarginItem ? static_cast< long >( ( pMarginItem->GetLeftMargin() + nIndent ) * nPPTX ) : 0 ); 895 long nTopM = ( pMarginItem ? static_cast< long >( pMarginItem->GetTopMargin() * nPPTY ) : 0 ); 896 long nRightM = ( pMarginItem ? static_cast< long >( pMarginItem->GetRightMargin() * nPPTX ) : 0 ); 897 long nBottomM = ( pMarginItem ? static_cast< long >( pMarginItem->GetBottomMargin() * nPPTY ) : 0 ); 898 long nWidth = aSize.getWidth() - nLeftM - nRightM; 899 aSize.setWidth( nWidth ); 900 aSize.setHeight( aSize.getHeight() - nTopM - nBottomM ); 901 902 Window* pWin = mpViewShell->GetWindowByPos( meSplitPos ); 903 if ( pWin ) 904 { 905 aSize = pWin->PixelToLogic( aSize, pEditEngine->GetRefMapMode() ); 906 } 907 908 /* #i19430# Gnopernicus reads text partly if it sticks out of the cell 909 boundaries. This leads to wrong results in cases where the cell text 910 is rotated, because rotation is not taken into account when calcu- 911 lating the visible part of the text. In these cases we will expand 912 the cell size passed as paper size to the edit engine. The function 913 accessibility::AccessibleStaticTextBase::GetParagraphBoundingBox() 914 (see svx/source/accessibility/AccessibleStaticTextBase.cxx) will 915 return the size of the complete text then, which is used to expand 916 the cell bounding box in ScAccessibleCell::GetBoundingBox() 917 (see sc/source/ui/Accessibility/AccessibleCell.cxx). */ 918 const SfxInt32Item* pItem = static_cast< const SfxInt32Item* >( 919 pDoc->GetAttr( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab(), ATTR_ROTATE_VALUE ) ); 920 if( pItem && (pItem->GetValue() != 0) ) 921 { 922 pEditEngine->SetPaperSize( Size( LONG_MAX, aSize.getHeight() ) ); 923 long nTxtWidth = static_cast< long >( pEditEngine->CalcTextWidth() ); 924 aSize.setWidth( std::max( aSize.getWidth(), nTxtWidth + 2 ) ); 925 } 926 else 927 { 928 // #i92143# text getRangeExtents reports incorrect 'x' values for spreadsheet cells 929 const SfxBoolItem* pLineBreakItem = static_cast< const SfxBoolItem* >( 930 pDoc->GetAttr( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab(), ATTR_LINEBREAK ) ); 931 bool bLineBreak = ( pLineBreakItem && pLineBreakItem->GetValue() ); 932 if ( !bLineBreak ) 933 { 934 long nTxtWidth = static_cast< long >( pEditEngine->CalcTextWidth() ); 935 aSize.setWidth( ::std::max( aSize.getWidth(), nTxtWidth ) ); 936 } 937 } 938 939 pEditEngine->SetPaperSize( aSize ); 940 941 // #i92143# text getRangeExtents reports incorrect 'x' values for spreadsheet cells 942 if ( eHorJust == SVX_HOR_JUSTIFY_STANDARD && pDoc->HasValueData( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab() ) ) 943 { 944 pEditEngine->SetDefaultItem( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) ); 945 } 946 947 Size aTextSize; 948 if ( pWin ) 949 { 950 aTextSize = pWin->LogicToPixel( Size( pEditEngine->CalcTextWidth(), pEditEngine->GetTextHeight() ), pEditEngine->GetRefMapMode() ); 951 } 952 long nTextWidth = aTextSize.Width(); 953 long nTextHeight = aTextSize.Height(); 954 955 long nOffsetX = nLeftM; 956 long nDiffX = nTextWidth - nWidth; 957 if ( nDiffX > 0 ) 958 { 959 switch ( eHorJust ) 960 { 961 case SVX_HOR_JUSTIFY_RIGHT: 962 { 963 nOffsetX -= nDiffX; 964 } 965 break; 966 case SVX_HOR_JUSTIFY_CENTER: 967 { 968 nOffsetX -= nDiffX / 2; 969 } 970 break; 971 default: 972 { 973 } 974 break; 975 } 976 } 977 978 long nOffsetY = 0; 979 const SvxVerJustifyItem* pVerJustifyItem = static_cast< const SvxVerJustifyItem* >( 980 pDoc->GetAttr( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab(), ATTR_VER_JUSTIFY ) ); 981 SvxCellVerJustify eVerJust = ( pVerJustifyItem ? static_cast< SvxCellVerJustify >( pVerJustifyItem->GetValue() ) : SVX_VER_JUSTIFY_STANDARD ); 982 switch ( eVerJust ) 983 { 984 case SVX_VER_JUSTIFY_STANDARD: 985 case SVX_VER_JUSTIFY_BOTTOM: 986 { 987 nOffsetY = nSizeY - nBottomM - nTextHeight; 988 } 989 break; 990 case SVX_VER_JUSTIFY_CENTER: 991 { 992 nOffsetY = ( nSizeY - nTopM - nBottomM - nTextHeight ) / 2 + nTopM; 993 } 994 break; 995 default: 996 { 997 nOffsetY = nTopM; 998 } 999 break; 1000 } 1001 1002 if ( mpAccessibleCell ) 1003 { 1004 mpAccessibleCell->SetOffset( Point( nOffsetX, nOffsetY ) ); 1005 } 1006 1007 pEditEngine->SetNotifyHdl( LINK(this, ScAccessibleCellTextData, NotifyHdl) ); 1008 } 1009 1010 return pForwarder; 1011 } 1012 1013 SvxViewForwarder* ScAccessibleCellTextData::GetViewForwarder() 1014 { 1015 if (!mpViewForwarder) 1016 mpViewForwarder = new ScViewForwarder(mpViewShell, meSplitPos, aCellPos); 1017 return mpViewForwarder; 1018 } 1019 1020 SvxEditViewForwarder* ScAccessibleCellTextData::GetEditViewForwarder( sal_Bool /* bCreate */ ) 1021 { 1022 //#102219#; there should no EditViewForwarder be, because the cell is now readonly in this interface 1023 /* if (!mpEditViewForwarder) 1024 { 1025 SCCOL nCol; 1026 SCROW nRow; 1027 EditView* pEditView; 1028 mpViewShell->GetViewData()->GetEditView( meSplitPos, pEditView, nCol, nRow ); 1029 1030 mpEditViewForwarder = new ScEditViewForwarder(pEditView, mpViewShell->GetWindowByPos(meSplitPos)); 1031 } 1032 else if (bCreate) 1033 mpEditViewForwarder->GrabFocus(); 1034 return mpEditViewForwarder;*/ 1035 return NULL; 1036 } 1037 1038 IMPL_LINK(ScAccessibleCellTextData, NotifyHdl, EENotify*, aNotify) 1039 { 1040 if( aNotify ) 1041 { 1042 ::std::auto_ptr< SfxHint > aHint = SvxEditSourceHelper::EENotification2Hint( aNotify ); 1043 1044 if( aHint.get() ) 1045 GetBroadcaster().Broadcast( *aHint.get() ); 1046 } 1047 1048 return 0; 1049 } 1050 1051 ScDocShell* ScAccessibleCellTextData::GetDocShell(ScTabViewShell* pViewShell) 1052 { 1053 ScDocShell* pDocSh = NULL; 1054 if (pViewShell) 1055 pDocSh = pViewShell->GetViewData()->GetDocShell(); 1056 return pDocSh; 1057 } 1058 1059 1060 // ============================================================================ 1061 //IAccessibility2 Implementation 2009----- 1062 //ScAccessibleEditObjectTextData::ScAccessibleEditObjectTextData(EditView* pEditView, Window* pWin) 1063 ScAccessibleEditObjectTextData::ScAccessibleEditObjectTextData(EditView* pEditView, Window* pWin, sal_Bool isClone) 1064 //-----IAccessibility2 Implementation 2009 1065 : 1066 mpViewForwarder(NULL), 1067 mpEditViewForwarder(NULL), 1068 mpEditView(pEditView), 1069 mpEditEngine(pEditView ? pEditView->GetEditEngine() : 0), 1070 mpForwarder(NULL), 1071 mpWindow(pWin) 1072 { 1073 //IAccessibility2 Implementation 2009----- 1074 // Solution: If the object is cloned, do NOT add notify hdl. 1075 mbIsCloned = isClone; 1076 //if (mpEditEngine) 1077 if (mpEditEngine && !mbIsCloned) 1078 //-----IAccessibility2 Implementation 2009 1079 mpEditEngine->SetNotifyHdl( LINK(this, ScAccessibleEditObjectTextData, NotifyHdl) ); 1080 } 1081 1082 ScAccessibleEditObjectTextData::~ScAccessibleEditObjectTextData() 1083 { 1084 //IAccessibility2 Implementation 2009----- 1085 // Solution: If the object is cloned, do NOT set notify hdl. 1086 //if (mpEditEngine) 1087 if (mpEditEngine && !mbIsCloned) 1088 //-----IAccessibility2 Implementation 2009 1089 mpEditEngine->SetNotifyHdl(Link()); 1090 if (mpViewForwarder) 1091 delete mpViewForwarder; 1092 if (mpEditViewForwarder) 1093 delete mpEditViewForwarder; 1094 if (mpForwarder) 1095 delete mpForwarder; 1096 } 1097 1098 void ScAccessibleEditObjectTextData::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) 1099 { 1100 if ( rHint.ISA( SfxSimpleHint ) ) 1101 { 1102 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); 1103 if ( nId == SFX_HINT_DYING ) 1104 { 1105 mpWindow = NULL; 1106 mpEditView = NULL; 1107 mpEditEngine = NULL; 1108 DELETEZ(mpForwarder); 1109 if (mpViewForwarder) 1110 mpViewForwarder->SetInvalid(); 1111 if (mpEditViewForwarder) 1112 mpEditViewForwarder->SetInvalid(); 1113 } 1114 } 1115 ScAccessibleTextData::Notify(rBC, rHint); 1116 } 1117 1118 ScAccessibleTextData* ScAccessibleEditObjectTextData::Clone() const 1119 { 1120 //IAccessibility2 Implementation 2009----- 1121 // Solution: Add para to indicate the object is cloned 1122 //return new ScAccessibleEditObjectTextData(mpEditView, mpWindow); 1123 return new ScAccessibleEditObjectTextData(mpEditView, mpWindow,sal_True); 1124 //-----IAccessibility2 Implementation 2009 1125 } 1126 1127 SvxTextForwarder* ScAccessibleEditObjectTextData::GetTextForwarder() 1128 { 1129 if ((!mpForwarder && mpEditView) || (mpEditEngine && !mpEditEngine->GetNotifyHdl().IsSet())) 1130 { 1131 if (!mpEditEngine) 1132 mpEditEngine = mpEditView->GetEditEngine(); 1133 //IAccessibility2 Implementation 2009----- 1134 // Solution: If the object is cloned, do NOT add notify hdl. 1135 //if (mpEditEngine && !mpEditEngine->GetNotifyHdl().IsSet()) 1136 if (mpEditEngine && !mpEditEngine->GetNotifyHdl().IsSet()&&!mbIsCloned) 1137 //-----IAccessibility2 Implementation 2009 1138 mpEditEngine->SetNotifyHdl( LINK(this, ScAccessibleEditObjectTextData, NotifyHdl) ); 1139 if(!mpForwarder) 1140 mpForwarder = new SvxEditEngineForwarder(*mpEditEngine); 1141 } 1142 return mpForwarder; 1143 } 1144 1145 SvxViewForwarder* ScAccessibleEditObjectTextData::GetViewForwarder() 1146 { 1147 if (!mpViewForwarder) 1148 { 1149 // --> OD 2005-12-21 #i49561# 1150 mpViewForwarder = new ScEditObjectViewForwarder( mpWindow, mpEditView ); 1151 // <-- 1152 } 1153 return mpViewForwarder; 1154 } 1155 1156 SvxEditViewForwarder* ScAccessibleEditObjectTextData::GetEditViewForwarder( sal_Bool bCreate ) 1157 { 1158 if (!mpEditViewForwarder && mpEditView) 1159 mpEditViewForwarder = new ScEditViewForwarder(mpEditView, mpWindow); 1160 if (bCreate) 1161 { 1162 if (!mpEditView && mpEditViewForwarder) 1163 { 1164 DELETEZ(mpEditViewForwarder); 1165 } 1166 else if (mpEditViewForwarder) 1167 mpEditViewForwarder->GrabFocus(); 1168 } 1169 return mpEditViewForwarder; 1170 } 1171 1172 IMPL_LINK(ScAccessibleEditObjectTextData, NotifyHdl, EENotify*, aNotify) 1173 { 1174 if( aNotify ) 1175 { 1176 ::std::auto_ptr< SfxHint > aHint = SvxEditSourceHelper::EENotification2Hint( aNotify ); 1177 1178 if( aHint.get() ) 1179 GetBroadcaster().Broadcast( *aHint.get() ); 1180 } 1181 1182 return 0; 1183 } 1184 1185 1186 // ============================================================================ 1187 1188 ScAccessibleEditLineTextData::ScAccessibleEditLineTextData(EditView* pEditView, Window* pWin) 1189 : 1190 ScAccessibleEditObjectTextData(pEditView, pWin), 1191 mbEditEngineCreated(sal_False) 1192 { 1193 ScTextWnd* pTxtWnd = (ScTextWnd*)pWin; 1194 1195 if (pTxtWnd) 1196 pTxtWnd->InsertAccessibleTextData( *this ); 1197 } 1198 1199 ScAccessibleEditLineTextData::~ScAccessibleEditLineTextData() 1200 { 1201 ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; 1202 1203 if (pTxtWnd) 1204 pTxtWnd->RemoveAccessibleTextData( *this ); 1205 1206 if (mbEditEngineCreated && mpEditEngine) 1207 { 1208 delete mpEditEngine; 1209 mpEditEngine = NULL; // #103346# don't access in ScAccessibleEditObjectTextData dtor! 1210 } 1211 else if (pTxtWnd && pTxtWnd->GetEditView() && pTxtWnd->GetEditView()->GetEditEngine()) 1212 { 1213 // #103346# the NotifyHdl also has to be removed from the ScTextWnd's EditEngine 1214 // (it's set in ScAccessibleEditLineTextData::GetTextForwarder, and mpEditEngine 1215 // is reset there) 1216 pTxtWnd->GetEditView()->GetEditEngine()->SetNotifyHdl(Link()); 1217 } 1218 } 1219 1220 void ScAccessibleEditLineTextData::Dispose() 1221 { 1222 ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; 1223 1224 if (pTxtWnd) 1225 pTxtWnd->RemoveAccessibleTextData( *this ); 1226 1227 ResetEditMode(); 1228 mpWindow = NULL; 1229 } 1230 1231 ScAccessibleTextData* ScAccessibleEditLineTextData::Clone() const 1232 { 1233 return new ScAccessibleEditLineTextData(mpEditView, mpWindow); 1234 } 1235 1236 SvxTextForwarder* ScAccessibleEditLineTextData::GetTextForwarder() 1237 { 1238 ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; 1239 1240 if (pTxtWnd) 1241 { 1242 mpEditView = pTxtWnd->GetEditView(); 1243 if (mpEditView) 1244 { 1245 if (mbEditEngineCreated && mpEditEngine) 1246 ResetEditMode(); 1247 mbEditEngineCreated = sal_False; 1248 1249 mpEditView = pTxtWnd->GetEditView(); 1250 ScAccessibleEditObjectTextData::GetTextForwarder(); // fill the mpForwarder 1251 mpEditEngine = NULL; 1252 } 1253 else 1254 { 1255 if (mpEditEngine && !mbEditEngineCreated) 1256 ResetEditMode(); 1257 if (!mpEditEngine) 1258 { 1259 SfxItemPool* pEnginePool = EditEngine::CreatePool(); 1260 pEnginePool->FreezeIdRanges(); 1261 mpEditEngine = new ScFieldEditEngine( pEnginePool, NULL, sal_True ); 1262 mbEditEngineCreated = sal_True; 1263 // currently, GetPortions doesn't work if UpdateMode is sal_False, 1264 // this will be fixed (in EditEngine) by src600 1265 // pEditEngine->SetUpdateMode( sal_False ); 1266 mpEditEngine->EnableUndo( sal_False ); 1267 mpEditEngine->SetRefMapMode( MAP_100TH_MM ); 1268 mpForwarder = new SvxEditEngineForwarder(*mpEditEngine); 1269 1270 mpEditEngine->SetText(pTxtWnd->GetTextString()); 1271 1272 Size aSize(pTxtWnd->GetSizePixel()); 1273 1274 aSize = pTxtWnd->PixelToLogic(aSize, mpEditEngine->GetRefMapMode()); 1275 1276 mpEditEngine->SetPaperSize(aSize); 1277 1278 mpEditEngine->SetNotifyHdl( LINK(this, ScAccessibleEditObjectTextData, NotifyHdl) ); 1279 } 1280 } 1281 } 1282 return mpForwarder; 1283 } 1284 1285 SvxEditViewForwarder* ScAccessibleEditLineTextData::GetEditViewForwarder( sal_Bool bCreate ) 1286 { 1287 ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; 1288 1289 if (pTxtWnd) 1290 { 1291 mpEditView = pTxtWnd->GetEditView(); 1292 if (!mpEditView && bCreate) 1293 { 1294 if ( !pTxtWnd->IsInputActive() ) 1295 { 1296 pTxtWnd->StartEditEngine(); 1297 pTxtWnd->GrabFocus(); 1298 // pTxtWnd->SetTextString( rText ); 1299 // pTxtWnd->GetEditView()->SetSelection( rSel ); 1300 1301 mpEditView = pTxtWnd->GetEditView(); 1302 } 1303 } 1304 } 1305 1306 return ScAccessibleEditObjectTextData::GetEditViewForwarder(bCreate); 1307 } 1308 1309 void ScAccessibleEditLineTextData::ResetEditMode() 1310 { 1311 ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; 1312 1313 if (mbEditEngineCreated && mpEditEngine) 1314 delete mpEditEngine; 1315 else if (pTxtWnd && pTxtWnd->GetEditView() && pTxtWnd->GetEditView()->GetEditEngine()) 1316 pTxtWnd->GetEditView()->GetEditEngine()->SetNotifyHdl(Link()); 1317 mpEditEngine = NULL; 1318 1319 DELETEZ(mpForwarder); 1320 DELETEZ(mpEditViewForwarder); 1321 DELETEZ(mpViewForwarder); 1322 mbEditEngineCreated = sal_False; 1323 } 1324 1325 void ScAccessibleEditLineTextData::TextChanged() 1326 { 1327 if (mbEditEngineCreated && mpEditEngine) 1328 { 1329 ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; 1330 1331 if (pTxtWnd) 1332 mpEditEngine->SetText(pTxtWnd->GetTextString()); 1333 } 1334 } 1335 1336 void ScAccessibleEditLineTextData::StartEdit() 1337 { 1338 ResetEditMode(); 1339 mpEditView = NULL; 1340 1341 // send HINT_BEGEDIT 1342 SdrHint aHint(HINT_BEGEDIT); 1343 GetBroadcaster().Broadcast( aHint ); 1344 } 1345 1346 void ScAccessibleEditLineTextData::EndEdit() 1347 { 1348 // send HINT_ENDEDIT 1349 SdrHint aHint(HINT_ENDEDIT); 1350 GetBroadcaster().Broadcast( aHint ); 1351 1352 ResetEditMode(); 1353 mpEditView = NULL; 1354 } 1355 1356 1357 // ============================================================================ 1358 1359 // ScAccessiblePreviewCellTextData: shared data between sub objects of a accessible cell text object 1360 1361 ScAccessiblePreviewCellTextData::ScAccessiblePreviewCellTextData(ScPreviewShell* pViewShell, 1362 const ScAddress& rP) 1363 : ScAccessibleCellBaseTextData(GetDocShell(pViewShell), rP), 1364 mpViewForwarder(NULL), 1365 mpViewShell(pViewShell) 1366 { 1367 } 1368 1369 ScAccessiblePreviewCellTextData::~ScAccessiblePreviewCellTextData() 1370 { 1371 if (pEditEngine) 1372 pEditEngine->SetNotifyHdl(Link()); 1373 if (mpViewForwarder) 1374 delete mpViewForwarder; 1375 } 1376 1377 void ScAccessiblePreviewCellTextData::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) 1378 { 1379 if ( rHint.ISA( SfxSimpleHint ) ) 1380 { 1381 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); 1382 if ( nId == SFX_HINT_DYING ) 1383 { 1384 mpViewShell = NULL; // invalid now 1385 if (mpViewForwarder) 1386 mpViewForwarder->SetInvalid(); 1387 } 1388 } 1389 ScAccessibleCellBaseTextData::Notify(rBC, rHint); 1390 } 1391 1392 ScAccessibleTextData* ScAccessiblePreviewCellTextData::Clone() const 1393 { 1394 return new ScAccessiblePreviewCellTextData(mpViewShell, aCellPos); 1395 } 1396 1397 SvxTextForwarder* ScAccessiblePreviewCellTextData::GetTextForwarder() 1398 { 1399 sal_Bool bEditEngineBefore(pEditEngine != NULL); 1400 1401 ScCellTextData::GetTextForwarder(); // creates Forwarder and EditEngine 1402 1403 if (!bEditEngineBefore && pEditEngine) 1404 { 1405 Size aSize(mpViewShell->GetLocationData().GetCellOutputRect(aCellPos).GetSize()); 1406 Window* pWin = mpViewShell->GetWindow(); 1407 if (pWin) 1408 aSize = pWin->PixelToLogic(aSize, pEditEngine->GetRefMapMode()); 1409 pEditEngine->SetPaperSize(aSize); 1410 } 1411 1412 if (pEditEngine) 1413 pEditEngine->SetNotifyHdl( LINK(this, ScAccessibleCellTextData, NotifyHdl) ); 1414 1415 return pForwarder; 1416 } 1417 1418 SvxViewForwarder* ScAccessiblePreviewCellTextData::GetViewForwarder() 1419 { 1420 if (!mpViewForwarder) 1421 mpViewForwarder = new ScPreviewCellViewForwarder(mpViewShell, aCellPos); 1422 return mpViewForwarder; 1423 } 1424 1425 //UNUSED2008-05 IMPL_LINK(ScAccessiblePreviewCellTextData, NotifyHdl, EENotify*, aNotify) 1426 //UNUSED2008-05 { 1427 //UNUSED2008-05 if( aNotify ) 1428 //UNUSED2008-05 { 1429 //UNUSED2008-05 ::std::auto_ptr< SfxHint > aHint = SvxEditSourceHelper::EENotification2Hint( aNotify); 1430 //UNUSED2008-05 1431 //UNUSED2008-05 if( aHint.get() ) 1432 //UNUSED2008-05 GetBroadcaster().Broadcast( *aHint.get() ); 1433 //UNUSED2008-05 } 1434 //UNUSED2008-05 1435 //UNUSED2008-05 return 0; 1436 //UNUSED2008-05 } 1437 1438 ScDocShell* ScAccessiblePreviewCellTextData::GetDocShell(ScPreviewShell* pViewShell) 1439 { 1440 ScDocShell* pDocSh = NULL; 1441 if (pViewShell && pViewShell->GetDocument()) 1442 pDocSh = (ScDocShell*) pViewShell->GetDocument()->GetDocumentShell(); 1443 return pDocSh; 1444 } 1445 1446 1447 // ============================================================================ 1448 1449 // ScAccessiblePreviewHeaderCellTextData: shared data between sub objects of a accessible cell text object 1450 1451 ScAccessiblePreviewHeaderCellTextData::ScAccessiblePreviewHeaderCellTextData(ScPreviewShell* pViewShell, 1452 const String& rText, const ScAddress& rP, sal_Bool bColHeader, sal_Bool bRowHeader) 1453 : ScAccessibleCellBaseTextData(GetDocShell(pViewShell), rP), 1454 mpViewForwarder(NULL), 1455 mpViewShell(pViewShell), 1456 maText(rText), 1457 mbColHeader(bColHeader), 1458 mbRowHeader(bRowHeader) 1459 { 1460 } 1461 1462 ScAccessiblePreviewHeaderCellTextData::~ScAccessiblePreviewHeaderCellTextData() 1463 { 1464 if (pEditEngine) 1465 pEditEngine->SetNotifyHdl(Link()); 1466 if (mpViewForwarder) 1467 delete mpViewForwarder; 1468 } 1469 1470 void ScAccessiblePreviewHeaderCellTextData::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) 1471 { 1472 if ( rHint.ISA( SfxSimpleHint ) ) 1473 { 1474 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); 1475 if ( nId == SFX_HINT_DYING ) 1476 { 1477 mpViewShell = NULL; // invalid now 1478 if (mpViewForwarder) 1479 mpViewForwarder->SetInvalid(); 1480 } 1481 } 1482 ScAccessibleCellBaseTextData::Notify(rBC, rHint); 1483 } 1484 1485 ScAccessibleTextData* ScAccessiblePreviewHeaderCellTextData::Clone() const 1486 { 1487 return new ScAccessiblePreviewHeaderCellTextData(mpViewShell, maText, aCellPos, mbColHeader, mbRowHeader); 1488 } 1489 1490 SvxTextForwarder* ScAccessiblePreviewHeaderCellTextData::GetTextForwarder() 1491 { 1492 if (!pEditEngine) 1493 { 1494 if ( pDocShell ) 1495 { 1496 ScDocument* pDoc = pDocShell->GetDocument(); 1497 pEditEngine = pDoc->CreateFieldEditEngine(); 1498 } 1499 else 1500 { 1501 SfxItemPool* pEnginePool = EditEngine::CreatePool(); 1502 pEnginePool->FreezeIdRanges(); 1503 pEditEngine = new ScFieldEditEngine( pEnginePool, NULL, sal_True ); 1504 } 1505 // currently, GetPortions doesn't work if UpdateMode is sal_False, 1506 // this will be fixed (in EditEngine) by src600 1507 // pEditEngine->SetUpdateMode( sal_False ); 1508 pEditEngine->EnableUndo( sal_False ); 1509 if (pDocShell) 1510 pEditEngine->SetRefDevice(pDocShell->GetRefDevice()); 1511 else 1512 pEditEngine->SetRefMapMode( MAP_100TH_MM ); 1513 pForwarder = new SvxEditEngineForwarder(*pEditEngine); 1514 } 1515 1516 if (bDataValid) 1517 return pForwarder; 1518 1519 if (maText.Len() && pEditEngine) 1520 { 1521 1522 if ( mpViewShell ) 1523 { 1524 Size aOutputSize; 1525 Window* pWindow = mpViewShell->GetWindow(); 1526 if ( pWindow ) 1527 aOutputSize = pWindow->GetOutputSizePixel(); 1528 Point aPoint; 1529 Rectangle aVisRect( aPoint, aOutputSize ); 1530 Size aSize(mpViewShell->GetLocationData().GetHeaderCellOutputRect(aVisRect, aCellPos, mbColHeader).GetSize()); 1531 if (pWindow) 1532 aSize = pWindow->PixelToLogic(aSize, pEditEngine->GetRefMapMode()); 1533 pEditEngine->SetPaperSize(aSize); 1534 } 1535 pEditEngine->SetText( maText ); 1536 } 1537 1538 bDataValid = sal_True; 1539 1540 if (pEditEngine) 1541 pEditEngine->SetNotifyHdl( LINK(this, ScAccessibleCellTextData, NotifyHdl) ); 1542 1543 return pForwarder; 1544 } 1545 1546 SvxViewForwarder* ScAccessiblePreviewHeaderCellTextData::GetViewForwarder() 1547 { 1548 if (!mpViewForwarder) 1549 mpViewForwarder = new ScPreviewHeaderCellViewForwarder(mpViewShell, aCellPos, mbColHeader, mbRowHeader); 1550 return mpViewForwarder; 1551 } 1552 1553 //UNUSED2008-05 IMPL_LINK(ScAccessiblePreviewHeaderCellTextData, NotifyHdl, EENotify*, aNotify) 1554 //UNUSED2008-05 { 1555 //UNUSED2008-05 if( aNotify ) 1556 //UNUSED2008-05 { 1557 //UNUSED2008-05 ::std::auto_ptr< SfxHint > aHint = SvxEditSourceHelper::EENotification2Hint( aNotify); 1558 //UNUSED2008-05 1559 //UNUSED2008-05 if( aHint.get() ) 1560 //UNUSED2008-05 GetBroadcaster().Broadcast( *aHint.get() ); 1561 //UNUSED2008-05 } 1562 //UNUSED2008-05 1563 //UNUSED2008-05 return 0; 1564 //UNUSED2008-05 } 1565 1566 ScDocShell* ScAccessiblePreviewHeaderCellTextData::GetDocShell(ScPreviewShell* pViewShell) 1567 { 1568 ScDocShell* pDocSh = NULL; 1569 if (pViewShell && pViewShell->GetDocument()) 1570 pDocSh = (ScDocShell*) pViewShell->GetDocument()->GetDocumentShell(); 1571 return pDocSh; 1572 } 1573 1574 1575 // ============================================================================ 1576 1577 ScAccessibleHeaderTextData::ScAccessibleHeaderTextData(ScPreviewShell* pViewShell, 1578 const EditTextObject* pEditObj, sal_Bool bHeader, SvxAdjust eAdjust) 1579 : 1580 mpViewForwarder(NULL), 1581 mpViewShell(pViewShell), 1582 mpEditEngine(NULL), 1583 mpForwarder(NULL), 1584 mpDocSh(NULL), 1585 mpEditObj(pEditObj), 1586 mbHeader(bHeader), 1587 mbDataValid(sal_False), 1588 meAdjust(eAdjust) 1589 { 1590 if (pViewShell && pViewShell->GetDocument()) 1591 mpDocSh = (ScDocShell*) pViewShell->GetDocument()->GetDocumentShell(); 1592 if (mpDocSh) 1593 mpDocSh->GetDocument()->AddUnoObject(*this); 1594 } 1595 1596 ScAccessibleHeaderTextData::~ScAccessibleHeaderTextData() 1597 { 1598 ScUnoGuard aGuard; // needed for EditEngine dtor 1599 1600 if (mpDocSh) 1601 mpDocSh->GetDocument()->RemoveUnoObject(*this); 1602 if (mpEditEngine) 1603 mpEditEngine->SetNotifyHdl(Link()); 1604 delete mpEditEngine; 1605 delete mpForwarder; 1606 } 1607 1608 ScAccessibleTextData* ScAccessibleHeaderTextData::Clone() const 1609 { 1610 return new ScAccessibleHeaderTextData(mpViewShell, mpEditObj, mbHeader, meAdjust); 1611 } 1612 1613 void ScAccessibleHeaderTextData::Notify( SfxBroadcaster&, const SfxHint& rHint ) 1614 { 1615 if ( rHint.ISA( SfxSimpleHint ) ) 1616 { 1617 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); 1618 if ( nId == SFX_HINT_DYING ) 1619 { 1620 mpViewShell = NULL;// invalid now 1621 mpDocSh = NULL; 1622 if (mpViewForwarder) 1623 mpViewForwarder->SetInvalid(); 1624 } 1625 } 1626 } 1627 1628 SvxTextForwarder* ScAccessibleHeaderTextData::GetTextForwarder() 1629 { 1630 if (!mpEditEngine) 1631 { 1632 SfxItemPool* pEnginePool = EditEngine::CreatePool(); 1633 pEnginePool->FreezeIdRanges(); 1634 ScHeaderEditEngine* pHdrEngine = new ScHeaderEditEngine( pEnginePool, sal_True ); 1635 1636 pHdrEngine->EnableUndo( sal_False ); 1637 pHdrEngine->SetRefMapMode( MAP_TWIP ); 1638 1639 // default font must be set, independently of document 1640 // -> use global pool from module 1641 1642 SfxItemSet aDefaults( pHdrEngine->GetEmptyItemSet() ); 1643 const ScPatternAttr& rPattern = (const ScPatternAttr&)SC_MOD()->GetPool().GetDefaultItem(ATTR_PATTERN); 1644 rPattern.FillEditItemSet( &aDefaults ); 1645 // FillEditItemSet adjusts font height to 1/100th mm, 1646 // but for header/footer twips is needed, as in the PatternAttr: 1647 aDefaults.Put( rPattern.GetItem(ATTR_FONT_HEIGHT), EE_CHAR_FONTHEIGHT ); 1648 aDefaults.Put( rPattern.GetItem(ATTR_CJK_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CJK ); 1649 aDefaults.Put( rPattern.GetItem(ATTR_CTL_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CTL ); 1650 aDefaults.Put( SvxAdjustItem( meAdjust, EE_PARA_JUST ) ); 1651 pHdrEngine->SetDefaults( aDefaults ); 1652 1653 ScHeaderFieldData aData; 1654 if (mpViewShell) 1655 mpViewShell->FillFieldData(aData); 1656 else 1657 ScHeaderFooterTextObj::FillDummyFieldData( aData ); 1658 pHdrEngine->SetData( aData ); 1659 1660 mpEditEngine = pHdrEngine; 1661 mpForwarder = new SvxEditEngineForwarder(*mpEditEngine); 1662 } 1663 1664 if (mbDataValid) 1665 return mpForwarder; 1666 1667 if ( mpViewShell ) 1668 { 1669 Rectangle aVisRect; 1670 mpViewShell->GetLocationData().GetHeaderPosition(aVisRect); 1671 Size aSize(aVisRect.GetSize()); 1672 Window* pWin = mpViewShell->GetWindow(); 1673 if (pWin) 1674 aSize = pWin->PixelToLogic(aSize, mpEditEngine->GetRefMapMode()); 1675 mpEditEngine->SetPaperSize(aSize); 1676 } 1677 if (mpEditObj) 1678 mpEditEngine->SetText(*mpEditObj); 1679 1680 mbDataValid = sal_True; 1681 return mpForwarder; 1682 } 1683 1684 SvxViewForwarder* ScAccessibleHeaderTextData::GetViewForwarder() 1685 { 1686 if (!mpViewForwarder) 1687 mpViewForwarder = new ScPreviewHeaderFooterViewForwarder(mpViewShell, mbHeader); 1688 return mpViewForwarder; 1689 } 1690 1691 1692 // ============================================================================ 1693 1694 ScAccessibleNoteTextData::ScAccessibleNoteTextData(ScPreviewShell* pViewShell, 1695 const String& sText, const ScAddress& aCellPos, sal_Bool bMarkNote) 1696 : 1697 mpViewForwarder(NULL), 1698 mpViewShell(pViewShell), 1699 mpEditEngine(NULL), 1700 mpForwarder(NULL), 1701 mpDocSh(NULL), 1702 msText(sText), 1703 maCellPos(aCellPos), 1704 mbMarkNote(bMarkNote), 1705 mbDataValid(sal_False) 1706 { 1707 if (pViewShell && pViewShell->GetDocument()) 1708 mpDocSh = (ScDocShell*) pViewShell->GetDocument()->GetDocumentShell(); 1709 if (mpDocSh) 1710 mpDocSh->GetDocument()->AddUnoObject(*this); 1711 } 1712 1713 ScAccessibleNoteTextData::~ScAccessibleNoteTextData() 1714 { 1715 ScUnoGuard aGuard; // needed for EditEngine dtor 1716 1717 if (mpDocSh) 1718 mpDocSh->GetDocument()->RemoveUnoObject(*this); 1719 if (mpEditEngine) 1720 mpEditEngine->SetNotifyHdl(Link()); 1721 delete mpEditEngine; 1722 delete mpForwarder; 1723 } 1724 1725 ScAccessibleTextData* ScAccessibleNoteTextData::Clone() const 1726 { 1727 return new ScAccessibleNoteTextData(mpViewShell, msText, maCellPos, mbMarkNote); 1728 } 1729 1730 void ScAccessibleNoteTextData::Notify( SfxBroadcaster&, const SfxHint& rHint ) 1731 { 1732 if ( rHint.ISA( SfxSimpleHint ) ) 1733 { 1734 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); 1735 if ( nId == SFX_HINT_DYING ) 1736 { 1737 mpViewShell = NULL;// invalid now 1738 mpDocSh = NULL; 1739 if (mpViewForwarder) 1740 mpViewForwarder->SetInvalid(); 1741 } 1742 } 1743 } 1744 1745 SvxTextForwarder* ScAccessibleNoteTextData::GetTextForwarder() 1746 { 1747 if (!mpEditEngine) 1748 { 1749 if ( mpDocSh ) 1750 { 1751 ScDocument* pDoc = mpDocSh->GetDocument(); 1752 mpEditEngine = pDoc->CreateFieldEditEngine(); 1753 } 1754 else 1755 { 1756 SfxItemPool* pEnginePool = EditEngine::CreatePool(); 1757 pEnginePool->FreezeIdRanges(); 1758 mpEditEngine = new ScFieldEditEngine( pEnginePool, NULL, sal_True ); 1759 } 1760 // currently, GetPortions doesn't work if UpdateMode is sal_False, 1761 // this will be fixed (in EditEngine) by src600 1762 // pEditEngine->SetUpdateMode( sal_False ); 1763 mpEditEngine->EnableUndo( sal_False ); 1764 if (mpDocSh) 1765 mpEditEngine->SetRefDevice(mpDocSh->GetRefDevice()); 1766 else 1767 mpEditEngine->SetRefMapMode( MAP_100TH_MM ); 1768 mpForwarder = new SvxEditEngineForwarder(*mpEditEngine); 1769 } 1770 1771 if (mbDataValid) 1772 return mpForwarder; 1773 1774 if (msText.Len() && mpEditEngine) 1775 { 1776 1777 if ( mpViewShell ) 1778 { 1779 Size aOutputSize; 1780 Window* pWindow = mpViewShell->GetWindow(); 1781 if ( pWindow ) 1782 aOutputSize = pWindow->GetOutputSizePixel(); 1783 Point aPoint; 1784 Rectangle aVisRect( aPoint, aOutputSize ); 1785 Size aSize(mpViewShell->GetLocationData().GetNoteInRangeOutputRect(aVisRect, mbMarkNote, maCellPos).GetSize()); 1786 if (pWindow) 1787 aSize = pWindow->PixelToLogic(aSize, mpEditEngine->GetRefMapMode()); 1788 mpEditEngine->SetPaperSize(aSize); 1789 } 1790 mpEditEngine->SetText( msText ); 1791 } 1792 1793 mbDataValid = sal_True; 1794 1795 if (mpEditEngine) 1796 mpEditEngine->SetNotifyHdl( LINK(this, ScAccessibleCellTextData, NotifyHdl) ); 1797 1798 return mpForwarder; 1799 } 1800 1801 SvxViewForwarder* ScAccessibleNoteTextData::GetViewForwarder() 1802 { 1803 if (!mpViewForwarder) 1804 mpViewForwarder = new ScPreviewNoteViewForwarder(mpViewShell, maCellPos, mbMarkNote); 1805 return mpViewForwarder; 1806 } 1807 1808 1809 // CSV import ================================================================= 1810 1811 class ScCsvViewForwarder : public SvxViewForwarder 1812 { 1813 Rectangle maBoundBox; 1814 Window* mpWindow; 1815 1816 public: 1817 explicit ScCsvViewForwarder( Window* pWindow, const Rectangle& rBoundBox ); 1818 1819 virtual sal_Bool IsValid() const; 1820 virtual Rectangle GetVisArea() const; 1821 virtual Point LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const; 1822 virtual Point PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const; 1823 1824 void SetInvalid(); 1825 }; 1826 1827 ScCsvViewForwarder::ScCsvViewForwarder( Window* pWindow, const Rectangle& rBoundBox ) : 1828 maBoundBox( rBoundBox ), 1829 mpWindow( pWindow ) 1830 { 1831 } 1832 1833 sal_Bool ScCsvViewForwarder::IsValid() const 1834 { 1835 return mpWindow != NULL; 1836 } 1837 1838 Rectangle ScCsvViewForwarder::GetVisArea() const 1839 { 1840 return maBoundBox; 1841 } 1842 1843 Point ScCsvViewForwarder::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const 1844 { 1845 if( !mpWindow ) return Point(); 1846 return mpWindow->LogicToPixel( rPoint, rMapMode ); 1847 } 1848 1849 Point ScCsvViewForwarder::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const 1850 { 1851 if( !mpWindow ) return Point(); 1852 return mpWindow->PixelToLogic( rPoint, rMapMode ); 1853 } 1854 1855 void ScCsvViewForwarder::SetInvalid() 1856 { 1857 mpWindow = NULL; 1858 } 1859 1860 // ---------------------------------------------------------------------------- 1861 1862 ScAccessibleCsvTextData::ScAccessibleCsvTextData( 1863 Window* pWindow, EditEngine* pEditEngine, 1864 const String& rCellText, const Rectangle& rBoundBox, const Size& rCellSize ) : 1865 mpWindow( pWindow ), 1866 mpEditEngine( pEditEngine ), 1867 maCellText( rCellText ), 1868 maBoundBox( rBoundBox ), 1869 maCellSize( rCellSize ) 1870 { 1871 } 1872 1873 ScAccessibleCsvTextData::~ScAccessibleCsvTextData() 1874 { 1875 } 1876 1877 void ScAccessibleCsvTextData::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) 1878 { 1879 if ( rHint.ISA( SfxSimpleHint ) ) 1880 { 1881 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); 1882 if( nId == SFX_HINT_DYING ) 1883 { 1884 mpWindow = NULL; 1885 mpEditEngine = NULL; 1886 if (mpViewForwarder.get()) 1887 mpViewForwarder->SetInvalid(); 1888 } 1889 } 1890 ScAccessibleTextData::Notify( rBC, rHint ); 1891 } 1892 1893 ScAccessibleTextData* ScAccessibleCsvTextData::Clone() const 1894 { 1895 return new ScAccessibleCsvTextData( mpWindow, mpEditEngine, maCellText, maBoundBox, maCellSize ); 1896 } 1897 1898 SvxTextForwarder* ScAccessibleCsvTextData::GetTextForwarder() 1899 { 1900 if( mpEditEngine ) 1901 { 1902 mpEditEngine->SetPaperSize( maCellSize ); 1903 mpEditEngine->SetText( maCellText ); 1904 if( !mpTextForwarder.get() ) 1905 mpTextForwarder.reset( new SvxEditEngineForwarder( *mpEditEngine ) ); 1906 } 1907 else 1908 mpTextForwarder.reset( NULL ); 1909 return mpTextForwarder.get(); 1910 } 1911 1912 SvxViewForwarder* ScAccessibleCsvTextData::GetViewForwarder() 1913 { 1914 if( !mpViewForwarder.get() ) 1915 mpViewForwarder.reset( new ScCsvViewForwarder( mpWindow, maBoundBox ) ); 1916 return mpViewForwarder.get(); 1917 } 1918 1919 SvxEditViewForwarder* ScAccessibleCsvTextData::GetEditViewForwarder( sal_Bool /* bCreate */ ) 1920 { 1921 return NULL; 1922 } 1923 1924 1925 // ============================================================================ 1926 1927