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