xref: /trunk/main/sc/source/ui/Accessibility/AccessibleText.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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