xref: /aoo4110/main/svx/source/unodraw/unoshtxt.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XInterface.hpp>
27*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <svx/unoshtxt.hxx>
30*b1cdbd2cSJim Jagielski #include <editeng/unoedhlp.hxx>
31*b1cdbd2cSJim Jagielski #include <svl/lstner.hxx>
32*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
33*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
34*b1cdbd2cSJim Jagielski #include <svl/hint.hxx>
35*b1cdbd2cSJim Jagielski #include <svl/style.hxx>
36*b1cdbd2cSJim Jagielski #include <svx/svdmodel.hxx>
37*b1cdbd2cSJim Jagielski #include <svx/svdoutl.hxx>
38*b1cdbd2cSJim Jagielski #include <svx/svdobj.hxx>
39*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
40*b1cdbd2cSJim Jagielski #include <svx/svdetc.hxx>
41*b1cdbd2cSJim Jagielski #include <editeng/outliner.hxx>
42*b1cdbd2cSJim Jagielski #include <editeng/unoforou.hxx>
43*b1cdbd2cSJim Jagielski #include <editeng/unoviwou.hxx>
44*b1cdbd2cSJim Jagielski #include <editeng/outlobj.hxx>
45*b1cdbd2cSJim Jagielski #include <svx/svdotext.hxx>
46*b1cdbd2cSJim Jagielski #include <svx/svdpage.hxx>
47*b1cdbd2cSJim Jagielski #include <editeng/editeng.hxx>
48*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include <editeng/unotext.hxx>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/linguistic2/XLinguServiceManager.hpp>
52*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
53*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #include <svx/svdotable.hxx>
56*b1cdbd2cSJim Jagielski #include <../table/cell.hxx>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include <svx/sdrpaintwindow.hxx>
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski using namespace ::osl;
61*b1cdbd2cSJim Jagielski using namespace ::vos;
62*b1cdbd2cSJim Jagielski using namespace ::rtl;
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::XInterface;
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
70*b1cdbd2cSJim Jagielski // SvxTextEditSourceImpl
71*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski /** @descr
74*b1cdbd2cSJim Jagielski     <p>This class essentially provides the text and view forwarders. If
75*b1cdbd2cSJim Jagielski     no SdrView is given, this class handles the UNO objects, which are
76*b1cdbd2cSJim Jagielski     currently not concerned with view issues. In this case,
77*b1cdbd2cSJim Jagielski     GetViewForwarder() always returns NULL and the underlying
78*b1cdbd2cSJim Jagielski     EditEngine of the SvxTextForwarder is a background one (i.e. not
79*b1cdbd2cSJim Jagielski     the official DrawOutliner, but one created exclusively for this
80*b1cdbd2cSJim Jagielski     object, with no relation to a view).
81*b1cdbd2cSJim Jagielski     </p>
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski     <p>If a SdrView is given at construction time, the caller is
84*b1cdbd2cSJim Jagielski     responsible for destroying this object when the view becomes
85*b1cdbd2cSJim Jagielski     invalid (the views cannot notify). If GetViewForwarder(sal_True)
86*b1cdbd2cSJim Jagielski     is called, the underlying shape is put into edit mode, the view
87*b1cdbd2cSJim Jagielski     forwarder returned encapsulates the OutlinerView and the next call
88*b1cdbd2cSJim Jagielski     to GetTextForwarder() yields a forwarder encapsulating the actual
89*b1cdbd2cSJim Jagielski     DrawOutliner. Thus, changes on that Outliner are immediately
90*b1cdbd2cSJim Jagielski     reflected on the screen. If the object leaves edit mode, the old
91*b1cdbd2cSJim Jagielski     behaviour is restored.</p>
92*b1cdbd2cSJim Jagielski  */
93*b1cdbd2cSJim Jagielski class SvxTextEditSourceImpl : public SfxListener, public SfxBroadcaster, public sdr::ObjectUser
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski private:
96*b1cdbd2cSJim Jagielski 	oslInterlockedCount	maRefCount;
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 	SdrObject*						mpObject;
99*b1cdbd2cSJim Jagielski 	SdrText*						mpText;
100*b1cdbd2cSJim Jagielski 	SdrView*						mpView;
101*b1cdbd2cSJim Jagielski     const Window*					mpWindow;
102*b1cdbd2cSJim Jagielski 	SdrModel*						mpModel;
103*b1cdbd2cSJim Jagielski 	SdrOutliner*					mpOutliner;
104*b1cdbd2cSJim Jagielski 	SvxOutlinerForwarder*			mpTextForwarder;
105*b1cdbd2cSJim Jagielski 	SvxDrawOutlinerViewForwarder*	mpViewForwarder;	// if non-NULL, use GetViewModeTextForwarder text forwarder
106*b1cdbd2cSJim Jagielski 	css::uno::Reference< css::linguistic2::XLinguServiceManager > m_xLinguServiceManager;
107*b1cdbd2cSJim Jagielski     Point							maTextOffset;
108*b1cdbd2cSJim Jagielski 	sal_Bool							mbDataValid;
109*b1cdbd2cSJim Jagielski 	sal_Bool							mbDestroyed;
110*b1cdbd2cSJim Jagielski 	sal_Bool							mbIsLocked;
111*b1cdbd2cSJim Jagielski 	sal_Bool							mbNeedsUpdate;
112*b1cdbd2cSJim Jagielski 	sal_Bool							mbOldUndoMode;
113*b1cdbd2cSJim Jagielski     sal_Bool							mbForwarderIsEditMode;		// have to reflect that, since ENDEDIT can happen more often
114*b1cdbd2cSJim Jagielski     sal_Bool							mbShapeIsEditMode;			// #104157# only true, if HINT_BEGEDIT was received
115*b1cdbd2cSJim Jagielski     sal_Bool							mbNotificationsDisabled;	// prevent EditEngine/Outliner notifications (e.g. when setting up forwarder)
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	XInterface*						mpOwner;
118*b1cdbd2cSJim Jagielski 	SvxUnoTextRangeBaseList			maTextRanges;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski     SvxTextForwarder*				GetBackgroundTextForwarder();
121*b1cdbd2cSJim Jagielski     SvxTextForwarder*				GetEditModeTextForwarder();
122*b1cdbd2cSJim Jagielski     SvxDrawOutlinerViewForwarder*	CreateViewForwarder();
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski     void 							SetupOutliner();
125*b1cdbd2cSJim Jagielski 
HasView() const126*b1cdbd2cSJim Jagielski     sal_Bool						HasView() const { return mpView ? sal_True : sal_False; }
IsEditMode() const127*b1cdbd2cSJim Jagielski     sal_Bool						IsEditMode() const
128*b1cdbd2cSJim Jagielski     								{
129*b1cdbd2cSJim Jagielski                                         SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject );
130*b1cdbd2cSJim Jagielski                                         return mbShapeIsEditMode && pTextObj && pTextObj->IsTextEditActive() ? sal_True : sal_False;
131*b1cdbd2cSJim Jagielski                                     }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 	void							dispose();
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski public:
136*b1cdbd2cSJim Jagielski 	SvxTextEditSourceImpl( SdrObject* pObject, SdrText* pText, XInterface* pOwner );
137*b1cdbd2cSJim Jagielski 	SvxTextEditSourceImpl( SdrObject& rObject, SdrText* pText, SdrView& rView, const Window& rWindow );
138*b1cdbd2cSJim Jagielski 	~SvxTextEditSourceImpl();
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 	void SAL_CALL acquire();
141*b1cdbd2cSJim Jagielski 	void SAL_CALL release();
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	virtual void			Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	SvxEditSource*			Clone() const;
146*b1cdbd2cSJim Jagielski 	SvxTextForwarder*		GetTextForwarder();
147*b1cdbd2cSJim Jagielski     SvxEditViewForwarder* 	GetEditViewForwarder( sal_Bool );
148*b1cdbd2cSJim Jagielski 	void					UpdateData();
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 	void addRange( SvxUnoTextRangeBase* pNewRange );
151*b1cdbd2cSJim Jagielski 	void removeRange( SvxUnoTextRangeBase* pOldRange );
152*b1cdbd2cSJim Jagielski 	const SvxUnoTextRangeBaseList& getRanges() const;
153*b1cdbd2cSJim Jagielski 
GetSdrObject() const154*b1cdbd2cSJim Jagielski 	SdrObject* 				GetSdrObject() const { return mpObject; }
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 	void 					lock();
157*b1cdbd2cSJim Jagielski 	void 					unlock();
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 	sal_Bool					IsValid() const;
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski     Rectangle				GetVisArea();
162*b1cdbd2cSJim Jagielski     Point					LogicToPixel( const Point&, const MapMode& rMapMode );
163*b1cdbd2cSJim Jagielski     Point 					PixelToLogic( const Point&, const MapMode& rMapMode );
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski     DECL_LINK( NotifyHdl, EENotify* );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 	virtual void ObjectInDestruction(const SdrObject& rObject);
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 	void ChangeModel( SdrModel* pNewModel );
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski     void                    UpdateOutliner();
172*b1cdbd2cSJim Jagielski };
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
175*b1cdbd2cSJim Jagielski 
SvxTextEditSourceImpl(SdrObject * pObject,SdrText * pText,XInterface * pOwner)176*b1cdbd2cSJim Jagielski SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject* pObject, SdrText* pText, XInterface* pOwner )
177*b1cdbd2cSJim Jagielski   :	maRefCount		( 0 ),
178*b1cdbd2cSJim Jagielski     mpObject		( pObject ),
179*b1cdbd2cSJim Jagielski 	mpText			( pText ),
180*b1cdbd2cSJim Jagielski 	mpView			( NULL ),
181*b1cdbd2cSJim Jagielski 	mpWindow		( NULL ),
182*b1cdbd2cSJim Jagielski 	mpModel			( pObject ? pObject->GetModel() : NULL ),
183*b1cdbd2cSJim Jagielski 	mpOutliner		( NULL ),
184*b1cdbd2cSJim Jagielski 	mpTextForwarder	( NULL ),
185*b1cdbd2cSJim Jagielski 	mpViewForwarder	( NULL ),
186*b1cdbd2cSJim Jagielski 	mbDataValid		( sal_False ),
187*b1cdbd2cSJim Jagielski 	mbDestroyed		( sal_False ),
188*b1cdbd2cSJim Jagielski 	mbIsLocked		( sal_False ),
189*b1cdbd2cSJim Jagielski 	mbNeedsUpdate	( sal_False ),
190*b1cdbd2cSJim Jagielski 	mbOldUndoMode	( sal_False ),
191*b1cdbd2cSJim Jagielski 	mbForwarderIsEditMode ( sal_False ),
192*b1cdbd2cSJim Jagielski 	mbShapeIsEditMode	  ( sal_False ),
193*b1cdbd2cSJim Jagielski 	mbNotificationsDisabled ( sal_False ),
194*b1cdbd2cSJim Jagielski 	mpOwner( pOwner )
195*b1cdbd2cSJim Jagielski {
196*b1cdbd2cSJim Jagielski 	DBG_ASSERT( mpObject, "invalid pObject!" );
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 	if( !mpText )
199*b1cdbd2cSJim Jagielski 	{
200*b1cdbd2cSJim Jagielski 		SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObject );
201*b1cdbd2cSJim Jagielski 		if( pTextObj )
202*b1cdbd2cSJim Jagielski 			mpText = pTextObj->getText( 0 );
203*b1cdbd2cSJim Jagielski 	}
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 	if( mpModel )
206*b1cdbd2cSJim Jagielski 		StartListening( *mpModel );
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 	if( mpObject )
209*b1cdbd2cSJim Jagielski 		mpObject->AddObjectUser( *this );
210*b1cdbd2cSJim Jagielski }
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
213*b1cdbd2cSJim Jagielski 
SvxTextEditSourceImpl(SdrObject & rObject,SdrText * pText,SdrView & rView,const Window & rWindow)214*b1cdbd2cSJim Jagielski SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject& rObject, SdrText* pText, SdrView& rView, const Window& rWindow )
215*b1cdbd2cSJim Jagielski   :	maRefCount		( 0 ),
216*b1cdbd2cSJim Jagielski     mpObject		( &rObject ),
217*b1cdbd2cSJim Jagielski 	mpText			( pText ),
218*b1cdbd2cSJim Jagielski     mpView			( &rView ),
219*b1cdbd2cSJim Jagielski     mpWindow		( &rWindow ),
220*b1cdbd2cSJim Jagielski 	mpModel			( rObject.GetModel() ),
221*b1cdbd2cSJim Jagielski 	mpOutliner		( NULL ),
222*b1cdbd2cSJim Jagielski 	mpTextForwarder	( NULL ),
223*b1cdbd2cSJim Jagielski 	mpViewForwarder	( NULL ),
224*b1cdbd2cSJim Jagielski 	mbDataValid		( sal_False ),
225*b1cdbd2cSJim Jagielski 	mbDestroyed		( sal_False ),
226*b1cdbd2cSJim Jagielski 	mbIsLocked		( sal_False ),
227*b1cdbd2cSJim Jagielski 	mbNeedsUpdate	( sal_False ),
228*b1cdbd2cSJim Jagielski 	mbOldUndoMode	( sal_False ),
229*b1cdbd2cSJim Jagielski 	mbForwarderIsEditMode ( sal_False ),
230*b1cdbd2cSJim Jagielski     mbShapeIsEditMode	  ( sal_True ),
231*b1cdbd2cSJim Jagielski 	mbNotificationsDisabled ( sal_False ),
232*b1cdbd2cSJim Jagielski 	mpOwner(0)
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski 	if( !mpText )
235*b1cdbd2cSJim Jagielski 	{
236*b1cdbd2cSJim Jagielski 		SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObject );
237*b1cdbd2cSJim Jagielski 		if( pTextObj )
238*b1cdbd2cSJim Jagielski 			mpText = pTextObj->getText( 0 );
239*b1cdbd2cSJim Jagielski 	}
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 	if( mpModel )
242*b1cdbd2cSJim Jagielski 		StartListening( *mpModel );
243*b1cdbd2cSJim Jagielski 	if( mpView )
244*b1cdbd2cSJim Jagielski 		StartListening( *mpView );
245*b1cdbd2cSJim Jagielski 	if( mpObject )
246*b1cdbd2cSJim Jagielski 		mpObject->AddObjectUser( *this );
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski     // #104157# Init edit mode state from shape info (IsTextEditActive())
249*b1cdbd2cSJim Jagielski     mbShapeIsEditMode = IsEditMode();
250*b1cdbd2cSJim Jagielski }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
253*b1cdbd2cSJim Jagielski 
~SvxTextEditSourceImpl()254*b1cdbd2cSJim Jagielski SvxTextEditSourceImpl::~SvxTextEditSourceImpl()
255*b1cdbd2cSJim Jagielski {
256*b1cdbd2cSJim Jagielski 	DBG_ASSERT( mbIsLocked == sal_False, "text edit source was not unlocked before dispose!" );
257*b1cdbd2cSJim Jagielski 	if( mpObject )
258*b1cdbd2cSJim Jagielski 		mpObject->RemoveObjectUser( *this );
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 	dispose();
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
264*b1cdbd2cSJim Jagielski 
addRange(SvxUnoTextRangeBase * pNewRange)265*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::addRange( SvxUnoTextRangeBase* pNewRange )
266*b1cdbd2cSJim Jagielski {
267*b1cdbd2cSJim Jagielski 	if( pNewRange )
268*b1cdbd2cSJim Jagielski 		if( std::find( maTextRanges.begin(), maTextRanges.end(), pNewRange ) == maTextRanges.end() )
269*b1cdbd2cSJim Jagielski 			maTextRanges.push_back( pNewRange );
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
273*b1cdbd2cSJim Jagielski 
removeRange(SvxUnoTextRangeBase * pOldRange)274*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::removeRange( SvxUnoTextRangeBase* pOldRange )
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski 	if( pOldRange )
277*b1cdbd2cSJim Jagielski 		maTextRanges.remove( pOldRange );
278*b1cdbd2cSJim Jagielski }
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
281*b1cdbd2cSJim Jagielski 
getRanges() const282*b1cdbd2cSJim Jagielski const SvxUnoTextRangeBaseList& SvxTextEditSourceImpl::getRanges() const
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski 	return maTextRanges;
285*b1cdbd2cSJim Jagielski }
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
288*b1cdbd2cSJim Jagielski 
acquire()289*b1cdbd2cSJim Jagielski void SAL_CALL SvxTextEditSourceImpl::acquire()
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski 	osl_incrementInterlockedCount( &maRefCount );
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
295*b1cdbd2cSJim Jagielski 
release()296*b1cdbd2cSJim Jagielski void SAL_CALL SvxTextEditSourceImpl::release()
297*b1cdbd2cSJim Jagielski {
298*b1cdbd2cSJim Jagielski 	if( ! osl_decrementInterlockedCount( &maRefCount ) )
299*b1cdbd2cSJim Jagielski 		delete this;
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski 
ChangeModel(SdrModel * pNewModel)302*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::ChangeModel( SdrModel* pNewModel )
303*b1cdbd2cSJim Jagielski {
304*b1cdbd2cSJim Jagielski 	if( mpModel != pNewModel )
305*b1cdbd2cSJim Jagielski 	{
306*b1cdbd2cSJim Jagielski 		if( mpModel )
307*b1cdbd2cSJim Jagielski 			EndListening( *mpModel );
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 		if( mpOutliner )
310*b1cdbd2cSJim Jagielski 		{
311*b1cdbd2cSJim Jagielski 			if( mpModel )
312*b1cdbd2cSJim Jagielski 				mpModel->disposeOutliner( mpOutliner );
313*b1cdbd2cSJim Jagielski 			else
314*b1cdbd2cSJim Jagielski 				delete mpOutliner;
315*b1cdbd2cSJim Jagielski 			mpOutliner = 0;
316*b1cdbd2cSJim Jagielski 		}
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski 		if( mpView )
319*b1cdbd2cSJim Jagielski 		{
320*b1cdbd2cSJim Jagielski 			EndListening( *mpView );
321*b1cdbd2cSJim Jagielski 			mpView = 0;
322*b1cdbd2cSJim Jagielski 		}
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 		mpWindow = 0;
325*b1cdbd2cSJim Jagielski 		m_xLinguServiceManager.clear();
326*b1cdbd2cSJim Jagielski 		mpOwner = 0;
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 		mpModel = pNewModel;
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski 		if( mpTextForwarder )
331*b1cdbd2cSJim Jagielski 		{
332*b1cdbd2cSJim Jagielski 	        delete mpTextForwarder;
333*b1cdbd2cSJim Jagielski 		    mpTextForwarder = 0;
334*b1cdbd2cSJim Jagielski 		}
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 		if( mpViewForwarder )
337*b1cdbd2cSJim Jagielski 		{
338*b1cdbd2cSJim Jagielski 			delete mpViewForwarder;
339*b1cdbd2cSJim Jagielski 			mpViewForwarder = 0;
340*b1cdbd2cSJim Jagielski 		}
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 		if( mpModel )
343*b1cdbd2cSJim Jagielski 			StartListening( *mpModel );
344*b1cdbd2cSJim Jagielski 	}
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
348*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster &,const SfxHint & rHint)349*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::Notify( SfxBroadcaster&, const SfxHint& rHint )
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski     // #i105988 keep reference to this object
352*b1cdbd2cSJim Jagielski     rtl::Reference< SvxTextEditSourceImpl > xThis( this );
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski 	const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint );
355*b1cdbd2cSJim Jagielski 	const SvxViewHint* pViewHint = PTR_CAST( SvxViewHint, &rHint );
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski     if( pViewHint )
358*b1cdbd2cSJim Jagielski     {
359*b1cdbd2cSJim Jagielski         switch( pViewHint->GetHintType() )
360*b1cdbd2cSJim Jagielski         {
361*b1cdbd2cSJim Jagielski             case SvxViewHint::SVX_HINT_VIEWCHANGED:
362*b1cdbd2cSJim Jagielski                 Broadcast( *pViewHint );
363*b1cdbd2cSJim Jagielski                 break;
364*b1cdbd2cSJim Jagielski         }
365*b1cdbd2cSJim Jagielski     }
366*b1cdbd2cSJim Jagielski 	else if( pSdrHint )
367*b1cdbd2cSJim Jagielski 	{
368*b1cdbd2cSJim Jagielski         switch( pSdrHint->GetKind() )
369*b1cdbd2cSJim Jagielski         {
370*b1cdbd2cSJim Jagielski             case HINT_OBJCHG:
371*b1cdbd2cSJim Jagielski             {
372*b1cdbd2cSJim Jagielski                 mbDataValid = sal_False;						// Text muss neu geholt werden
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski                 if( HasView() )
375*b1cdbd2cSJim Jagielski                 {
376*b1cdbd2cSJim Jagielski                     // #104157# Update maTextOffset, object has changed
377*b1cdbd2cSJim Jagielski 					// #105196#, #105203#: Cannot call that // here,
378*b1cdbd2cSJim Jagielski 					// since TakeTextRect() (called from there) //
379*b1cdbd2cSJim Jagielski 					// changes outliner content.
380*b1cdbd2cSJim Jagielski 					// UpdateOutliner();
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski                     // #101029# Broadcast object changes, as they might change visible attributes
383*b1cdbd2cSJim Jagielski                     SvxViewHint aHint(SvxViewHint::SVX_HINT_VIEWCHANGED);
384*b1cdbd2cSJim Jagielski                     Broadcast( aHint );
385*b1cdbd2cSJim Jagielski                 }
386*b1cdbd2cSJim Jagielski                 break;
387*b1cdbd2cSJim Jagielski             }
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski             case HINT_BEGEDIT:
390*b1cdbd2cSJim Jagielski                 if( mpObject == pSdrHint->GetObject() )
391*b1cdbd2cSJim Jagielski                 {
392*b1cdbd2cSJim Jagielski 					//IAccessibility2 Implementation 2009-----, one EditSource object is created for each AccessibleCell, and it will monitor the hint.
393*b1cdbd2cSJim Jagielski 					// Once HINT_BEGEDIT is broadcast, each EditSource of AccessibleCell will handle it here and
394*b1cdbd2cSJim Jagielski 					// call below: mpView->GetTextEditOutliner()->SetNotifyHdl(), which will replace the Notifer for current
395*b1cdbd2cSJim Jagielski 					// editable cell. It is totally wrong. So add check here to avoid the incorrect replacement of notifer.
396*b1cdbd2cSJim Jagielski 					// To be safe, add accessibility check here because currently it only happen on the editsource of AccessibleCell
397*b1cdbd2cSJim Jagielski 					if (Application::IsAccessibilityEnabled())
398*b1cdbd2cSJim Jagielski 					{
399*b1cdbd2cSJim Jagielski 						if (mpObject && mpText)
400*b1cdbd2cSJim Jagielski 						{
401*b1cdbd2cSJim Jagielski 							sdr::table::SdrTableObj* pTableObj = PTR_CAST( sdr::table::SdrTableObj, mpObject );
402*b1cdbd2cSJim Jagielski 							if(pTableObj)
403*b1cdbd2cSJim Jagielski 							{
404*b1cdbd2cSJim Jagielski 								sdr::table::CellRef xCell = pTableObj->getActiveCell();
405*b1cdbd2cSJim Jagielski 								if (xCell.is())
406*b1cdbd2cSJim Jagielski 								{
407*b1cdbd2cSJim Jagielski 									sdr::table::Cell* pCellObj = dynamic_cast< sdr::table::Cell* >( mpText );
408*b1cdbd2cSJim Jagielski 									if (pCellObj && xCell.get() != pCellObj)
409*b1cdbd2cSJim Jagielski 											break;
410*b1cdbd2cSJim Jagielski 								}
411*b1cdbd2cSJim Jagielski 							}
412*b1cdbd2cSJim Jagielski 						}
413*b1cdbd2cSJim Jagielski 					}
414*b1cdbd2cSJim Jagielski                     // invalidate old forwarder
415*b1cdbd2cSJim Jagielski                     if( !mbForwarderIsEditMode )
416*b1cdbd2cSJim Jagielski                     {
417*b1cdbd2cSJim Jagielski                         delete mpTextForwarder;
418*b1cdbd2cSJim Jagielski                         mpTextForwarder = NULL;
419*b1cdbd2cSJim Jagielski                     }
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski                     // register as listener - need to broadcast state change messages
422*b1cdbd2cSJim Jagielski                     if( mpView && mpView->GetTextEditOutliner() )
423*b1cdbd2cSJim Jagielski                         mpView->GetTextEditOutliner()->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) );
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski                     // #104157# Only now we're really in edit mode
426*b1cdbd2cSJim Jagielski                     mbShapeIsEditMode = sal_True;
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski                     Broadcast( *pSdrHint );
429*b1cdbd2cSJim Jagielski                 }
430*b1cdbd2cSJim Jagielski                 break;
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski             case HINT_ENDEDIT:
433*b1cdbd2cSJim Jagielski                 if( mpObject == pSdrHint->GetObject() )
434*b1cdbd2cSJim Jagielski                 {
435*b1cdbd2cSJim Jagielski                     Broadcast( *pSdrHint );
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski                     // #104157# We're no longer in edit mode
438*b1cdbd2cSJim Jagielski                     mbShapeIsEditMode = sal_False;
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski                     // remove as listener - outliner might outlive ourselves
441*b1cdbd2cSJim Jagielski                     if( mpView && mpView->GetTextEditOutliner() )
442*b1cdbd2cSJim Jagielski                         mpView->GetTextEditOutliner()->SetNotifyHdl( Link() );
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski                     // destroy view forwarder, OutlinerView no longer
445*b1cdbd2cSJim Jagielski                     // valid (no need for UpdateData(), it's been
446*b1cdbd2cSJim Jagielski                     // synched on SdrEndTextEdit)
447*b1cdbd2cSJim Jagielski                     delete mpViewForwarder;
448*b1cdbd2cSJim Jagielski                     mpViewForwarder = NULL;
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski                     // #100424# Invalidate text forwarder, we might
451*b1cdbd2cSJim Jagielski                     // not be called again before entering edit mode a
452*b1cdbd2cSJim Jagielski                     // second time! Then, the old outliner might be
453*b1cdbd2cSJim Jagielski                     // invalid.
454*b1cdbd2cSJim Jagielski                     if( mbForwarderIsEditMode )
455*b1cdbd2cSJim Jagielski                     {
456*b1cdbd2cSJim Jagielski                         mbForwarderIsEditMode = sal_False;
457*b1cdbd2cSJim Jagielski                         delete mpTextForwarder;
458*b1cdbd2cSJim Jagielski                         mpTextForwarder = NULL;
459*b1cdbd2cSJim Jagielski                     }
460*b1cdbd2cSJim Jagielski                 }
461*b1cdbd2cSJim Jagielski                 break;
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski 			case HINT_MODELCLEARED:
464*b1cdbd2cSJim Jagielski 				dispose();
465*b1cdbd2cSJim Jagielski 				break;
466*b1cdbd2cSJim Jagielski 			default:
467*b1cdbd2cSJim Jagielski 				break;
468*b1cdbd2cSJim Jagielski         }
469*b1cdbd2cSJim Jagielski     }
470*b1cdbd2cSJim Jagielski }
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski /* this is a callback from the attached SdrObject when it is actually deleted */
ObjectInDestruction(const SdrObject &)473*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::ObjectInDestruction(const SdrObject&)
474*b1cdbd2cSJim Jagielski {
475*b1cdbd2cSJim Jagielski 	mpObject = 0;
476*b1cdbd2cSJim Jagielski 	dispose();
477*b1cdbd2cSJim Jagielski     Broadcast( SfxSimpleHint( SFX_HINT_DYING ) );
478*b1cdbd2cSJim Jagielski }
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski /* unregister at all objects and set all references to 0 */
dispose()481*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::dispose()
482*b1cdbd2cSJim Jagielski {
483*b1cdbd2cSJim Jagielski 	if( mpTextForwarder )
484*b1cdbd2cSJim Jagielski 	{
485*b1cdbd2cSJim Jagielski 	    delete mpTextForwarder;
486*b1cdbd2cSJim Jagielski 		mpTextForwarder = 0;
487*b1cdbd2cSJim Jagielski 	}
488*b1cdbd2cSJim Jagielski 
489*b1cdbd2cSJim Jagielski 	if( mpViewForwarder )
490*b1cdbd2cSJim Jagielski 	{
491*b1cdbd2cSJim Jagielski 	    delete mpViewForwarder;
492*b1cdbd2cSJim Jagielski 		mpViewForwarder = 0;
493*b1cdbd2cSJim Jagielski 	}
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 	if( mpOutliner )
496*b1cdbd2cSJim Jagielski 	{
497*b1cdbd2cSJim Jagielski 		if( mpModel )
498*b1cdbd2cSJim Jagielski 		{
499*b1cdbd2cSJim Jagielski 			mpModel->disposeOutliner( mpOutliner );
500*b1cdbd2cSJim Jagielski 		}
501*b1cdbd2cSJim Jagielski 		else
502*b1cdbd2cSJim Jagielski 		{
503*b1cdbd2cSJim Jagielski 			delete mpOutliner;
504*b1cdbd2cSJim Jagielski 		}
505*b1cdbd2cSJim Jagielski 		mpOutliner = 0;
506*b1cdbd2cSJim Jagielski 	}
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski 	if( mpModel )
509*b1cdbd2cSJim Jagielski 	{
510*b1cdbd2cSJim Jagielski 		EndListening( *mpModel );
511*b1cdbd2cSJim Jagielski 		mpModel = 0;
512*b1cdbd2cSJim Jagielski 	}
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 	if( mpView )
515*b1cdbd2cSJim Jagielski 	{
516*b1cdbd2cSJim Jagielski 		EndListening( *mpView );
517*b1cdbd2cSJim Jagielski         mpView = 0;
518*b1cdbd2cSJim Jagielski 	}
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski 	if( mpObject )
521*b1cdbd2cSJim Jagielski 	{
522*b1cdbd2cSJim Jagielski 		mpObject->RemoveObjectUser( *this );
523*b1cdbd2cSJim Jagielski 		mpObject = 0;
524*b1cdbd2cSJim Jagielski 	}
525*b1cdbd2cSJim Jagielski 	mpWindow = 0;
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
529*b1cdbd2cSJim Jagielski 
SetupOutliner()530*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::SetupOutliner()
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski     // #101029#
533*b1cdbd2cSJim Jagielski     // only for UAA edit source: setup outliner equivalently as in
534*b1cdbd2cSJim Jagielski     // SdrTextObj::Paint(), such that formatting equals screen
535*b1cdbd2cSJim Jagielski     // layout
536*b1cdbd2cSJim Jagielski     if( mpObject && mpOutliner )
537*b1cdbd2cSJim Jagielski     {
538*b1cdbd2cSJim Jagielski         SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject );
539*b1cdbd2cSJim Jagielski         Rectangle aPaintRect;
540*b1cdbd2cSJim Jagielski         if( pTextObj )
541*b1cdbd2cSJim Jagielski         {
542*b1cdbd2cSJim Jagielski             Rectangle aBoundRect( pTextObj->GetCurrentBoundRect() );
543*b1cdbd2cSJim Jagielski             pTextObj->SetupOutlinerFormatting( *mpOutliner, aPaintRect );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski             // #101029# calc text offset from shape anchor
546*b1cdbd2cSJim Jagielski             maTextOffset = aPaintRect.TopLeft() - aBoundRect.TopLeft();
547*b1cdbd2cSJim Jagielski         }
548*b1cdbd2cSJim Jagielski     }
549*b1cdbd2cSJim Jagielski }
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
552*b1cdbd2cSJim Jagielski 
UpdateOutliner()553*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::UpdateOutliner()
554*b1cdbd2cSJim Jagielski {
555*b1cdbd2cSJim Jagielski     // #104157#
556*b1cdbd2cSJim Jagielski     // only for UAA edit source: update outliner equivalently as in
557*b1cdbd2cSJim Jagielski     // SdrTextObj::Paint(), such that formatting equals screen
558*b1cdbd2cSJim Jagielski     // layout
559*b1cdbd2cSJim Jagielski     if( mpObject && mpOutliner )
560*b1cdbd2cSJim Jagielski     {
561*b1cdbd2cSJim Jagielski         SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject );
562*b1cdbd2cSJim Jagielski         Rectangle aPaintRect;
563*b1cdbd2cSJim Jagielski         if( pTextObj )
564*b1cdbd2cSJim Jagielski         {
565*b1cdbd2cSJim Jagielski             Rectangle aBoundRect( pTextObj->GetCurrentBoundRect() );
566*b1cdbd2cSJim Jagielski             pTextObj->UpdateOutlinerFormatting( *mpOutliner, aPaintRect );
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski             // #101029# calc text offset from shape anchor
569*b1cdbd2cSJim Jagielski             maTextOffset = aPaintRect.TopLeft() - aBoundRect.TopLeft();
570*b1cdbd2cSJim Jagielski         }
571*b1cdbd2cSJim Jagielski     }
572*b1cdbd2cSJim Jagielski }
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 
GetBackgroundTextForwarder()578*b1cdbd2cSJim Jagielski SvxTextForwarder* SvxTextEditSourceImpl::GetBackgroundTextForwarder()
579*b1cdbd2cSJim Jagielski {
580*b1cdbd2cSJim Jagielski     sal_Bool bCreated = sal_False;
581*b1cdbd2cSJim Jagielski 
582*b1cdbd2cSJim Jagielski     // #99840#: prevent EE/Outliner notifications during setup
583*b1cdbd2cSJim Jagielski     mbNotificationsDisabled = sal_True;
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 	if (!mpTextForwarder)
586*b1cdbd2cSJim Jagielski 	{
587*b1cdbd2cSJim Jagielski 		if( mpOutliner == NULL )
588*b1cdbd2cSJim Jagielski 		{
589*b1cdbd2cSJim Jagielski 			SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject );
590*b1cdbd2cSJim Jagielski 			sal_uInt16 nOutlMode = OUTLINERMODE_TEXTOBJECT;
591*b1cdbd2cSJim Jagielski 			if( pTextObj && pTextObj->IsTextFrame() && pTextObj->GetTextKind() == OBJ_OUTLINETEXT )
592*b1cdbd2cSJim Jagielski 				nOutlMode = OUTLINERMODE_OUTLINEOBJECT;
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski 			mpOutliner = mpModel->createOutliner( nOutlMode );
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski             // #109151# Do the setup after outliner creation, would be useless otherwise
597*b1cdbd2cSJim Jagielski             if( HasView() )
598*b1cdbd2cSJim Jagielski             {
599*b1cdbd2cSJim Jagielski                 // #101029#, #104157# Setup outliner _before_ filling it
600*b1cdbd2cSJim Jagielski                 SetupOutliner();
601*b1cdbd2cSJim Jagielski             }
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 			mpOutliner->SetTextObjNoInit( pTextObj );
604*b1cdbd2cSJim Jagielski /*
605*b1cdbd2cSJim Jagielski 			mpOutliner = SdrMakeOutliner( nOutlMode, pModel );
606*b1cdbd2cSJim Jagielski 			Outliner& aDrawOutliner = pModel->GetDrawOutliner();
607*b1cdbd2cSJim Jagielski 			mpOutliner->SetCalcFieldValueHdl( aDrawOutliner.GetCalcFieldValueHdl() );
608*b1cdbd2cSJim Jagielski */
609*b1cdbd2cSJim Jagielski 			if( mbIsLocked )
610*b1cdbd2cSJim Jagielski 			{
611*b1cdbd2cSJim Jagielski 				((EditEngine*)&(mpOutliner->GetEditEngine()))->SetUpdateMode( sal_False );
612*b1cdbd2cSJim Jagielski 				mbOldUndoMode = ((EditEngine*)&(mpOutliner->GetEditEngine()))->IsUndoEnabled();
613*b1cdbd2cSJim Jagielski 				((EditEngine*)&(mpOutliner->GetEditEngine()))->EnableUndo( sal_False );
614*b1cdbd2cSJim Jagielski 			}
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski // -
617*b1cdbd2cSJim Jagielski 			if ( !m_xLinguServiceManager.is() )
618*b1cdbd2cSJim Jagielski 			{
619*b1cdbd2cSJim Jagielski 				css::uno::Reference< css::lang::XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
620*b1cdbd2cSJim Jagielski 				m_xLinguServiceManager = css::uno::Reference< css::linguistic2::XLinguServiceManager >(
621*b1cdbd2cSJim Jagielski 					xMgr->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.linguistic2.LinguServiceManager" ))), css::uno::UNO_QUERY );
622*b1cdbd2cSJim Jagielski 			}
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski 			if ( m_xLinguServiceManager.is() )
625*b1cdbd2cSJim Jagielski 			{
626*b1cdbd2cSJim Jagielski 				css::uno::Reference< css::linguistic2::XHyphenator > xHyphenator( m_xLinguServiceManager->getHyphenator(), css::uno::UNO_QUERY );
627*b1cdbd2cSJim Jagielski 				if( xHyphenator.is() )
628*b1cdbd2cSJim Jagielski 					mpOutliner->SetHyphenator( xHyphenator );
629*b1cdbd2cSJim Jagielski 			}
630*b1cdbd2cSJim Jagielski // -
631*b1cdbd2cSJim Jagielski 		}
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 		mpTextForwarder = new SvxOutlinerForwarder( *mpOutliner, (mpObject->GetObjInventor() == SdrInventor) && (mpObject->GetObjIdentifier() == OBJ_OUTLINETEXT) );
635*b1cdbd2cSJim Jagielski         // delay listener subscription and UAA initialization until Outliner is fully setup
636*b1cdbd2cSJim Jagielski         bCreated = sal_True;
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski         mbForwarderIsEditMode = sal_False;
639*b1cdbd2cSJim Jagielski 	}
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski 	if( mpObject && mpText && !mbDataValid && mpObject->IsInserted() && mpObject->GetPage() )
642*b1cdbd2cSJim Jagielski 	{
643*b1cdbd2cSJim Jagielski 		mpTextForwarder->flushCache();
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski 		OutlinerParaObject* pOutlinerParaObject = NULL;
646*b1cdbd2cSJim Jagielski 		SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject );
647*b1cdbd2cSJim Jagielski 		if( pTextObj && pTextObj->getActiveText() == mpText )
648*b1cdbd2cSJim Jagielski 			pOutlinerParaObject = pTextObj->GetEditOutlinerParaObject(); // Get the OutlinerParaObject if text edit is active
649*b1cdbd2cSJim Jagielski 		bool bOwnParaObj(false);
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski 		if( pOutlinerParaObject )
652*b1cdbd2cSJim Jagielski 			bOwnParaObj = true;	// text edit active
653*b1cdbd2cSJim Jagielski 		else
654*b1cdbd2cSJim Jagielski 			pOutlinerParaObject = mpText->GetOutlinerParaObject();
655*b1cdbd2cSJim Jagielski 
656*b1cdbd2cSJim Jagielski 		if( pOutlinerParaObject && ( bOwnParaObj || !mpObject->IsEmptyPresObj() || mpObject->GetPage()->IsMasterPage() ) )
657*b1cdbd2cSJim Jagielski 		{
658*b1cdbd2cSJim Jagielski 			mpOutliner->SetText( *pOutlinerParaObject );
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski 			// #91254# put text to object and set EmptyPresObj to FALSE
661*b1cdbd2cSJim Jagielski 			if( mpText && bOwnParaObj && pOutlinerParaObject && mpObject->IsEmptyPresObj() && pTextObj->IsRealyEdited() )
662*b1cdbd2cSJim Jagielski 			{
663*b1cdbd2cSJim Jagielski 				mpObject->SetEmptyPresObj( sal_False );
664*b1cdbd2cSJim Jagielski 				static_cast< SdrTextObj* >( mpObject)->NbcSetOutlinerParaObjectForText( pOutlinerParaObject, mpText );
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski                 // #i103982# Here, due to mpObject->NbcSetOutlinerParaObjectForText, we LOSE ownership of the
667*b1cdbd2cSJim Jagielski                 // OPO, so do NOT delete it when leaving this method (!)
668*b1cdbd2cSJim Jagielski                 bOwnParaObj = false;
669*b1cdbd2cSJim Jagielski 			}
670*b1cdbd2cSJim Jagielski 		}
671*b1cdbd2cSJim Jagielski 		else
672*b1cdbd2cSJim Jagielski 		{
673*b1cdbd2cSJim Jagielski 			sal_Bool bVertical = pOutlinerParaObject ? pOutlinerParaObject->IsVertical() : sal_False;
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski 			// set objects style sheet on empty outliner
676*b1cdbd2cSJim Jagielski 			SfxStyleSheetPool* pPool = (SfxStyleSheetPool*)mpObject->GetModel()->GetStyleSheetPool();
677*b1cdbd2cSJim Jagielski 			if( pPool )
678*b1cdbd2cSJim Jagielski 				mpOutliner->SetStyleSheetPool( pPool );
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski 			SfxStyleSheet* pStyleSheet = mpObject->GetPage()->GetTextStyleSheetForObject( mpObject );
681*b1cdbd2cSJim Jagielski 			if( pStyleSheet )
682*b1cdbd2cSJim Jagielski 				mpOutliner->SetStyleSheet( 0, pStyleSheet );
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 			if( bVertical )
685*b1cdbd2cSJim Jagielski 				mpOutliner->SetVertical( sal_True );
686*b1cdbd2cSJim Jagielski 		}
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski 		// evtually we have to set the border attributes
689*b1cdbd2cSJim Jagielski 		if (mpOutliner->GetParagraphCount()==1)
690*b1cdbd2cSJim Jagielski 		{
691*b1cdbd2cSJim Jagielski 			// if we only have one paragraph we check if it is empty
692*b1cdbd2cSJim Jagielski 			XubString aStr( mpOutliner->GetText( mpOutliner->GetParagraph( 0 ) ) );
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 			if(!aStr.Len())
695*b1cdbd2cSJim Jagielski 			{
696*b1cdbd2cSJim Jagielski 				// its empty, so we have to force the outliner to initialise itself
697*b1cdbd2cSJim Jagielski 				mpOutliner->SetText( String(), mpOutliner->GetParagraph( 0 ) );
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski 				if(mpObject->GetStyleSheet())
700*b1cdbd2cSJim Jagielski 					mpOutliner->SetStyleSheet( 0, mpObject->GetStyleSheet());
701*b1cdbd2cSJim Jagielski 			}
702*b1cdbd2cSJim Jagielski 		}
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski 		mbDataValid = sal_True;
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski         if( bOwnParaObj )
707*b1cdbd2cSJim Jagielski             delete pOutlinerParaObject;
708*b1cdbd2cSJim Jagielski 	}
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski     if( bCreated && mpOutliner && HasView() )
711*b1cdbd2cSJim Jagielski     {
712*b1cdbd2cSJim Jagielski         // register as listener - need to broadcast state change messages
713*b1cdbd2cSJim Jagielski         // registration delayed until outliner is completely set up
714*b1cdbd2cSJim Jagielski         mpOutliner->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) );
715*b1cdbd2cSJim Jagielski     }
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski     // #99840#: prevent EE/Outliner notifications during setup
718*b1cdbd2cSJim Jagielski     mbNotificationsDisabled = sal_False;
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 	return mpTextForwarder;
721*b1cdbd2cSJim Jagielski }
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
724*b1cdbd2cSJim Jagielski 
GetEditModeTextForwarder()725*b1cdbd2cSJim Jagielski SvxTextForwarder* SvxTextEditSourceImpl::GetEditModeTextForwarder()
726*b1cdbd2cSJim Jagielski {
727*b1cdbd2cSJim Jagielski     if( !mpTextForwarder && HasView() )
728*b1cdbd2cSJim Jagielski     {
729*b1cdbd2cSJim Jagielski         SdrOutliner* pEditOutliner = mpView->GetTextEditOutliner();
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski         if( pEditOutliner )
732*b1cdbd2cSJim Jagielski         {
733*b1cdbd2cSJim Jagielski 			mpTextForwarder = new SvxOutlinerForwarder( *pEditOutliner, (mpObject->GetObjInventor() == SdrInventor) && (mpObject->GetObjIdentifier() == OBJ_OUTLINETEXT) );
734*b1cdbd2cSJim Jagielski             mbForwarderIsEditMode = sal_True;
735*b1cdbd2cSJim Jagielski         }
736*b1cdbd2cSJim Jagielski     }
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski     return mpTextForwarder;
739*b1cdbd2cSJim Jagielski }
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
742*b1cdbd2cSJim Jagielski 
GetTextForwarder()743*b1cdbd2cSJim Jagielski SvxTextForwarder* SvxTextEditSourceImpl::GetTextForwarder()
744*b1cdbd2cSJim Jagielski {
745*b1cdbd2cSJim Jagielski 	if( mbDestroyed || mpObject == NULL )
746*b1cdbd2cSJim Jagielski 		return NULL;
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski 	if( mpModel == NULL )
749*b1cdbd2cSJim Jagielski 		mpModel = mpObject->GetModel();
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski 	if( mpModel == NULL )
752*b1cdbd2cSJim Jagielski 		return NULL;
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski     // distinguish the cases
755*b1cdbd2cSJim Jagielski     // a) connected to view, maybe edit mode is active, can work directly on the EditOutliner
756*b1cdbd2cSJim Jagielski     // b) background Outliner, reflect changes into ParaOutlinerObject (this is exactly the old UNO code)
757*b1cdbd2cSJim Jagielski     if( HasView() )
758*b1cdbd2cSJim Jagielski     {
759*b1cdbd2cSJim Jagielski         if( IsEditMode() != mbForwarderIsEditMode )
760*b1cdbd2cSJim Jagielski         {
761*b1cdbd2cSJim Jagielski             // forwarder mismatch - create new
762*b1cdbd2cSJim Jagielski             delete mpTextForwarder;
763*b1cdbd2cSJim Jagielski             mpTextForwarder = NULL;
764*b1cdbd2cSJim Jagielski         }
765*b1cdbd2cSJim Jagielski 
766*b1cdbd2cSJim Jagielski         if( IsEditMode() )
767*b1cdbd2cSJim Jagielski             return GetEditModeTextForwarder();
768*b1cdbd2cSJim Jagielski         else
769*b1cdbd2cSJim Jagielski             return GetBackgroundTextForwarder();
770*b1cdbd2cSJim Jagielski     }
771*b1cdbd2cSJim Jagielski     else
772*b1cdbd2cSJim Jagielski         return GetBackgroundTextForwarder();
773*b1cdbd2cSJim Jagielski }
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
776*b1cdbd2cSJim Jagielski 
CreateViewForwarder()777*b1cdbd2cSJim Jagielski SvxDrawOutlinerViewForwarder* SvxTextEditSourceImpl::CreateViewForwarder()
778*b1cdbd2cSJim Jagielski {
779*b1cdbd2cSJim Jagielski     if( mpView->GetTextEditOutlinerView() && mpObject )
780*b1cdbd2cSJim Jagielski     {
781*b1cdbd2cSJim Jagielski         // register as listener - need to broadcast state change messages
782*b1cdbd2cSJim Jagielski         mpView->GetTextEditOutliner()->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) );
783*b1cdbd2cSJim Jagielski 
784*b1cdbd2cSJim Jagielski 		SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject );
785*b1cdbd2cSJim Jagielski 		if( pTextObj )
786*b1cdbd2cSJim Jagielski         {
787*b1cdbd2cSJim Jagielski             Rectangle aBoundRect( pTextObj->GetCurrentBoundRect() );
788*b1cdbd2cSJim Jagielski             OutlinerView& rOutlView = *mpView->GetTextEditOutlinerView();
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski             return new SvxDrawOutlinerViewForwarder( rOutlView, aBoundRect.TopLeft() );
791*b1cdbd2cSJim Jagielski         }
792*b1cdbd2cSJim Jagielski     }
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski     return NULL;
795*b1cdbd2cSJim Jagielski }
796*b1cdbd2cSJim Jagielski 
GetEditViewForwarder(sal_Bool bCreate)797*b1cdbd2cSJim Jagielski SvxEditViewForwarder* SvxTextEditSourceImpl::GetEditViewForwarder( sal_Bool bCreate )
798*b1cdbd2cSJim Jagielski {
799*b1cdbd2cSJim Jagielski 	if( mbDestroyed || mpObject == NULL )
800*b1cdbd2cSJim Jagielski 		return NULL;
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski 	if( mpModel == NULL )
803*b1cdbd2cSJim Jagielski 		mpModel = mpObject->GetModel();
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski 	if( mpModel == NULL )
806*b1cdbd2cSJim Jagielski 		return NULL;
807*b1cdbd2cSJim Jagielski 
808*b1cdbd2cSJim Jagielski     // shall we delete?
809*b1cdbd2cSJim Jagielski     if( mpViewForwarder )
810*b1cdbd2cSJim Jagielski     {
811*b1cdbd2cSJim Jagielski         if( !IsEditMode() )
812*b1cdbd2cSJim Jagielski         {
813*b1cdbd2cSJim Jagielski             // destroy all forwarders (no need for UpdateData(),
814*b1cdbd2cSJim Jagielski             // it's been synched on SdrEndTextEdit)
815*b1cdbd2cSJim Jagielski 			delete mpViewForwarder;
816*b1cdbd2cSJim Jagielski 			mpViewForwarder = NULL;
817*b1cdbd2cSJim Jagielski         }
818*b1cdbd2cSJim Jagielski     }
819*b1cdbd2cSJim Jagielski     // which to create? Directly in edit mode, create new, or none?
820*b1cdbd2cSJim Jagielski     else if( mpView )
821*b1cdbd2cSJim Jagielski     {
822*b1cdbd2cSJim Jagielski         if( IsEditMode() )
823*b1cdbd2cSJim Jagielski         {
824*b1cdbd2cSJim Jagielski             // create new view forwarder
825*b1cdbd2cSJim Jagielski             mpViewForwarder = CreateViewForwarder();
826*b1cdbd2cSJim Jagielski         }
827*b1cdbd2cSJim Jagielski         else if( bCreate )
828*b1cdbd2cSJim Jagielski         {
829*b1cdbd2cSJim Jagielski             // dispose old text forwarder
830*b1cdbd2cSJim Jagielski             UpdateData();
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski             delete mpTextForwarder;
833*b1cdbd2cSJim Jagielski             mpTextForwarder = NULL;
834*b1cdbd2cSJim Jagielski 
835*b1cdbd2cSJim Jagielski             // enter edit mode
836*b1cdbd2cSJim Jagielski             mpView->SdrEndTextEdit();
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski 			if(mpView->SdrBeginTextEdit(mpObject, 0L, 0L, sal_False, (SdrOutliner*)0L, 0L, sal_False, sal_False))
839*b1cdbd2cSJim Jagielski             {
840*b1cdbd2cSJim Jagielski                 SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject );
841*b1cdbd2cSJim Jagielski                 if( pTextObj->IsTextEditActive() )
842*b1cdbd2cSJim Jagielski                 {
843*b1cdbd2cSJim Jagielski                     // create new view forwarder
844*b1cdbd2cSJim Jagielski                     mpViewForwarder = CreateViewForwarder();
845*b1cdbd2cSJim Jagielski                 }
846*b1cdbd2cSJim Jagielski                 else
847*b1cdbd2cSJim Jagielski                 {
848*b1cdbd2cSJim Jagielski                     // failure. Somehow, SdrBeginTextEdit did not set
849*b1cdbd2cSJim Jagielski                     // our SdrTextObj into edit mode
850*b1cdbd2cSJim Jagielski                     mpView->SdrEndTextEdit();
851*b1cdbd2cSJim Jagielski                 }
852*b1cdbd2cSJim Jagielski             }
853*b1cdbd2cSJim Jagielski         }
854*b1cdbd2cSJim Jagielski     }
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski 	return mpViewForwarder;
857*b1cdbd2cSJim Jagielski }
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
860*b1cdbd2cSJim Jagielski 
UpdateData()861*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::UpdateData()
862*b1cdbd2cSJim Jagielski {
863*b1cdbd2cSJim Jagielski     // if we have a view and in edit mode, we're working with the
864*b1cdbd2cSJim Jagielski     // DrawOutliner. Thus, all changes made on the text forwarder are
865*b1cdbd2cSJim Jagielski     // reflected on the view and committed to the model on
866*b1cdbd2cSJim Jagielski     // SdrEndTextEdit(). Thus, no need for explicit updates here.
867*b1cdbd2cSJim Jagielski     if( !HasView() || !IsEditMode() )
868*b1cdbd2cSJim Jagielski     {
869*b1cdbd2cSJim Jagielski         if( mbIsLocked  )
870*b1cdbd2cSJim Jagielski         {
871*b1cdbd2cSJim Jagielski             mbNeedsUpdate = sal_True;
872*b1cdbd2cSJim Jagielski         }
873*b1cdbd2cSJim Jagielski         else
874*b1cdbd2cSJim Jagielski         {
875*b1cdbd2cSJim Jagielski             if( mpOutliner && mpObject && mpText && !mbDestroyed )
876*b1cdbd2cSJim Jagielski             {
877*b1cdbd2cSJim Jagielski                 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObject );
878*b1cdbd2cSJim Jagielski                 if( pTextObj )
879*b1cdbd2cSJim Jagielski                 {
880*b1cdbd2cSJim Jagielski                     if( mpOutliner->GetParagraphCount() != 1 || mpOutliner->GetEditEngine().GetTextLen( 0 ) )
881*b1cdbd2cSJim Jagielski 				    {
882*b1cdbd2cSJim Jagielski 					    if( mpOutliner->GetParagraphCount() > 1 )
883*b1cdbd2cSJim Jagielski 					    {
884*b1cdbd2cSJim Jagielski 						    if( pTextObj && pTextObj->IsTextFrame() && pTextObj->GetTextKind() == OBJ_TITLETEXT )
885*b1cdbd2cSJim Jagielski 						    {
886*b1cdbd2cSJim Jagielski 							    while( mpOutliner->GetParagraphCount() > 1 )
887*b1cdbd2cSJim Jagielski 							    {
888*b1cdbd2cSJim Jagielski 								    ESelection aSel( 0,mpOutliner->GetEditEngine().GetTextLen( 0 ), 1,0 );
889*b1cdbd2cSJim Jagielski 								    mpOutliner->QuickInsertLineBreak( aSel );
890*b1cdbd2cSJim Jagielski 							    }
891*b1cdbd2cSJim Jagielski 						    }
892*b1cdbd2cSJim Jagielski 					    }
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski                         pTextObj->NbcSetOutlinerParaObjectForText( mpOutliner->CreateParaObject(), mpText );
895*b1cdbd2cSJim Jagielski 				    }
896*b1cdbd2cSJim Jagielski                     else
897*b1cdbd2cSJim Jagielski                     {
898*b1cdbd2cSJim Jagielski                         pTextObj->NbcSetOutlinerParaObjectForText( NULL,mpText );
899*b1cdbd2cSJim Jagielski                     }
900*b1cdbd2cSJim Jagielski                 }
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski                 if( mpObject->IsEmptyPresObj() )
903*b1cdbd2cSJim Jagielski                     mpObject->SetEmptyPresObj(sal_False);
904*b1cdbd2cSJim Jagielski             }
905*b1cdbd2cSJim Jagielski         }
906*b1cdbd2cSJim Jagielski     }
907*b1cdbd2cSJim Jagielski }
908*b1cdbd2cSJim Jagielski 
lock()909*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::lock()
910*b1cdbd2cSJim Jagielski {
911*b1cdbd2cSJim Jagielski 	mbIsLocked = sal_True;
912*b1cdbd2cSJim Jagielski 	if( mpOutliner )
913*b1cdbd2cSJim Jagielski 	{
914*b1cdbd2cSJim Jagielski 		((EditEngine*)&(mpOutliner->GetEditEngine()))->SetUpdateMode( sal_False );
915*b1cdbd2cSJim Jagielski 		mbOldUndoMode = ((EditEngine*)&(mpOutliner->GetEditEngine()))->IsUndoEnabled();
916*b1cdbd2cSJim Jagielski 		((EditEngine*)&(mpOutliner->GetEditEngine()))->EnableUndo( sal_False );
917*b1cdbd2cSJim Jagielski 	}
918*b1cdbd2cSJim Jagielski }
919*b1cdbd2cSJim Jagielski 
unlock()920*b1cdbd2cSJim Jagielski void SvxTextEditSourceImpl::unlock()
921*b1cdbd2cSJim Jagielski {
922*b1cdbd2cSJim Jagielski 	mbIsLocked = sal_False;
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski 	if( mbNeedsUpdate )
925*b1cdbd2cSJim Jagielski 	{
926*b1cdbd2cSJim Jagielski 		UpdateData();
927*b1cdbd2cSJim Jagielski 		mbNeedsUpdate = sal_False;
928*b1cdbd2cSJim Jagielski 	}
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski 	if( mpOutliner )
931*b1cdbd2cSJim Jagielski 	{
932*b1cdbd2cSJim Jagielski 		((EditEngine*)&(mpOutliner->GetEditEngine()))->SetUpdateMode( sal_True );
933*b1cdbd2cSJim Jagielski 		((EditEngine*)&(mpOutliner->GetEditEngine()))->EnableUndo( mbOldUndoMode );
934*b1cdbd2cSJim Jagielski 	}
935*b1cdbd2cSJim Jagielski }
936*b1cdbd2cSJim Jagielski 
IsValid() const937*b1cdbd2cSJim Jagielski sal_Bool SvxTextEditSourceImpl::IsValid() const
938*b1cdbd2cSJim Jagielski {
939*b1cdbd2cSJim Jagielski     return mpView && mpWindow ? sal_True : sal_False;
940*b1cdbd2cSJim Jagielski }
941*b1cdbd2cSJim Jagielski 
GetVisArea()942*b1cdbd2cSJim Jagielski Rectangle SvxTextEditSourceImpl::GetVisArea()
943*b1cdbd2cSJim Jagielski {
944*b1cdbd2cSJim Jagielski     if( IsValid() )
945*b1cdbd2cSJim Jagielski     {
946*b1cdbd2cSJim Jagielski 		SdrPaintWindow* pPaintWindow = mpView->FindPaintWindow(*mpWindow);
947*b1cdbd2cSJim Jagielski 		Rectangle aVisArea;
948*b1cdbd2cSJim Jagielski 
949*b1cdbd2cSJim Jagielski 		if(pPaintWindow)
950*b1cdbd2cSJim Jagielski 		{
951*b1cdbd2cSJim Jagielski 			aVisArea = pPaintWindow->GetVisibleArea();
952*b1cdbd2cSJim Jagielski 		}
953*b1cdbd2cSJim Jagielski 
954*b1cdbd2cSJim Jagielski         // offset vis area by edit engine left-top position
955*b1cdbd2cSJim Jagielski         SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject );
956*b1cdbd2cSJim Jagielski         if( pTextObj )
957*b1cdbd2cSJim Jagielski         {
958*b1cdbd2cSJim Jagielski             Rectangle aAnchorRect;
959*b1cdbd2cSJim Jagielski             pTextObj->TakeTextAnchorRect( aAnchorRect );
960*b1cdbd2cSJim Jagielski             aVisArea.Move( -aAnchorRect.Left(), -aAnchorRect.Top() );
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski             MapMode aMapMode(mpWindow->GetMapMode());
963*b1cdbd2cSJim Jagielski             aMapMode.SetOrigin(Point());
964*b1cdbd2cSJim Jagielski             return mpWindow->LogicToPixel( aVisArea, aMapMode );
965*b1cdbd2cSJim Jagielski         }
966*b1cdbd2cSJim Jagielski     }
967*b1cdbd2cSJim Jagielski 
968*b1cdbd2cSJim Jagielski     return Rectangle();
969*b1cdbd2cSJim Jagielski }
970*b1cdbd2cSJim Jagielski 
LogicToPixel(const Point & rPoint,const MapMode & rMapMode)971*b1cdbd2cSJim Jagielski Point SvxTextEditSourceImpl::LogicToPixel( const Point& rPoint, const MapMode& rMapMode )
972*b1cdbd2cSJim Jagielski {
973*b1cdbd2cSJim Jagielski     // #101029#: The responsibilities of ViewForwarder happen to be
974*b1cdbd2cSJim Jagielski     // somewhat mixed in this case. On the one hand, we need the
975*b1cdbd2cSJim Jagielski     // different interface queries on the SvxEditSource interface,
976*b1cdbd2cSJim Jagielski     // since we need both VisAreas. On the other hand, if an
977*b1cdbd2cSJim Jagielski     // EditViewForwarder exists, maTextOffset does not remain static,
978*b1cdbd2cSJim Jagielski     // but may change with every key press.
979*b1cdbd2cSJim Jagielski     if( IsEditMode() )
980*b1cdbd2cSJim Jagielski     {
981*b1cdbd2cSJim Jagielski         SvxEditViewForwarder* pForwarder = GetEditViewForwarder(sal_False);
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski         if( pForwarder )
984*b1cdbd2cSJim Jagielski             return pForwarder->LogicToPixel( rPoint, rMapMode );
985*b1cdbd2cSJim Jagielski     }
986*b1cdbd2cSJim Jagielski     else if( IsValid() && mpModel )
987*b1cdbd2cSJim Jagielski     {
988*b1cdbd2cSJim Jagielski         // #101029#
989*b1cdbd2cSJim Jagielski         Point aPoint1( rPoint );
990*b1cdbd2cSJim Jagielski         aPoint1.X() += maTextOffset.X();
991*b1cdbd2cSJim Jagielski         aPoint1.Y() += maTextOffset.Y();
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski         Point aPoint2( OutputDevice::LogicToLogic( aPoint1, rMapMode,
994*b1cdbd2cSJim Jagielski                                                    MapMode(mpModel->GetScaleUnit()) ) );
995*b1cdbd2cSJim Jagielski         MapMode aMapMode(mpWindow->GetMapMode());
996*b1cdbd2cSJim Jagielski         aMapMode.SetOrigin(Point());
997*b1cdbd2cSJim Jagielski         return mpWindow->LogicToPixel( aPoint2, aMapMode );
998*b1cdbd2cSJim Jagielski     }
999*b1cdbd2cSJim Jagielski 
1000*b1cdbd2cSJim Jagielski     return Point();
1001*b1cdbd2cSJim Jagielski }
1002*b1cdbd2cSJim Jagielski 
PixelToLogic(const Point & rPoint,const MapMode & rMapMode)1003*b1cdbd2cSJim Jagielski Point SvxTextEditSourceImpl::PixelToLogic( const Point& rPoint, const MapMode& rMapMode )
1004*b1cdbd2cSJim Jagielski {
1005*b1cdbd2cSJim Jagielski     // #101029#: The responsibilities of ViewForwarder happen to be
1006*b1cdbd2cSJim Jagielski     // somewhat mixed in this case. On the one hand, we need the
1007*b1cdbd2cSJim Jagielski     // different interface queries on the SvxEditSource interface,
1008*b1cdbd2cSJim Jagielski     // since we need both VisAreas. On the other hand, if an
1009*b1cdbd2cSJim Jagielski     // EditViewForwarder exists, maTextOffset does not remain static,
1010*b1cdbd2cSJim Jagielski     // but may change with every key press.
1011*b1cdbd2cSJim Jagielski     if( IsEditMode() )
1012*b1cdbd2cSJim Jagielski     {
1013*b1cdbd2cSJim Jagielski         SvxEditViewForwarder* pForwarder = GetEditViewForwarder(sal_False);
1014*b1cdbd2cSJim Jagielski 
1015*b1cdbd2cSJim Jagielski         if( pForwarder )
1016*b1cdbd2cSJim Jagielski             return pForwarder->PixelToLogic( rPoint, rMapMode );
1017*b1cdbd2cSJim Jagielski     }
1018*b1cdbd2cSJim Jagielski     else if( IsValid() && mpModel )
1019*b1cdbd2cSJim Jagielski     {
1020*b1cdbd2cSJim Jagielski         MapMode aMapMode(mpWindow->GetMapMode());
1021*b1cdbd2cSJim Jagielski         aMapMode.SetOrigin(Point());
1022*b1cdbd2cSJim Jagielski         Point aPoint1( mpWindow->PixelToLogic( rPoint, aMapMode ) );
1023*b1cdbd2cSJim Jagielski         Point aPoint2( OutputDevice::LogicToLogic( aPoint1,
1024*b1cdbd2cSJim Jagielski                                                    MapMode(mpModel->GetScaleUnit()),
1025*b1cdbd2cSJim Jagielski                                                    rMapMode ) );
1026*b1cdbd2cSJim Jagielski         // #101029#
1027*b1cdbd2cSJim Jagielski         aPoint2.X() -= maTextOffset.X();
1028*b1cdbd2cSJim Jagielski         aPoint2.Y() -= maTextOffset.Y();
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski         return aPoint2;
1031*b1cdbd2cSJim Jagielski     }
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski     return Point();
1034*b1cdbd2cSJim Jagielski }
1035*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvxTextEditSourceImpl,NotifyHdl,EENotify *,aNotify)1036*b1cdbd2cSJim Jagielski IMPL_LINK(SvxTextEditSourceImpl, NotifyHdl, EENotify*, aNotify)
1037*b1cdbd2cSJim Jagielski {
1038*b1cdbd2cSJim Jagielski     if( aNotify && !mbNotificationsDisabled )
1039*b1cdbd2cSJim Jagielski     {
1040*b1cdbd2cSJim Jagielski         ::std::auto_ptr< SfxHint > aHint( SvxEditSourceHelper::EENotification2Hint( aNotify) );
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski         if( aHint.get() )
1043*b1cdbd2cSJim Jagielski             Broadcast( *aHint.get() );
1044*b1cdbd2cSJim Jagielski     }
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski     return 0;
1047*b1cdbd2cSJim Jagielski }
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1050*b1cdbd2cSJim Jagielski 
1051*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1052*b1cdbd2cSJim Jagielski // SvxTextEditSource
1053*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1054*b1cdbd2cSJim Jagielski 
SvxTextEditSource(SdrObject * pObject,SdrText * pText,XInterface * pOwner)1055*b1cdbd2cSJim Jagielski SvxTextEditSource::SvxTextEditSource( SdrObject* pObject, SdrText* pText, XInterface* pOwner )
1056*b1cdbd2cSJim Jagielski {
1057*b1cdbd2cSJim Jagielski 	mpImpl = new SvxTextEditSourceImpl( pObject, pText, pOwner );
1058*b1cdbd2cSJim Jagielski 	mpImpl->acquire();
1059*b1cdbd2cSJim Jagielski }
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
SvxTextEditSource(SdrObject & rObj,SdrText * pText,SdrView & rView,const Window & rWindow)1062*b1cdbd2cSJim Jagielski SvxTextEditSource::SvxTextEditSource( SdrObject& rObj, SdrText* pText, SdrView& rView, const Window& rWindow )
1063*b1cdbd2cSJim Jagielski {
1064*b1cdbd2cSJim Jagielski 	mpImpl = new SvxTextEditSourceImpl( rObj, pText, rView, rWindow );
1065*b1cdbd2cSJim Jagielski 	mpImpl->acquire();
1066*b1cdbd2cSJim Jagielski }
1067*b1cdbd2cSJim Jagielski 
1068*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
1069*b1cdbd2cSJim Jagielski 
SvxTextEditSource(SvxTextEditSourceImpl * pImpl)1070*b1cdbd2cSJim Jagielski SvxTextEditSource::SvxTextEditSource( SvxTextEditSourceImpl* pImpl )
1071*b1cdbd2cSJim Jagielski {
1072*b1cdbd2cSJim Jagielski 	mpImpl = pImpl;
1073*b1cdbd2cSJim Jagielski 	mpImpl->acquire();
1074*b1cdbd2cSJim Jagielski }
1075*b1cdbd2cSJim Jagielski 
1076*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
~SvxTextEditSource()1077*b1cdbd2cSJim Jagielski SvxTextEditSource::~SvxTextEditSource()
1078*b1cdbd2cSJim Jagielski {
1079*b1cdbd2cSJim Jagielski 	OGuard aGuard( Application::GetSolarMutex() );
1080*b1cdbd2cSJim Jagielski 
1081*b1cdbd2cSJim Jagielski 	mpImpl->release();
1082*b1cdbd2cSJim Jagielski }
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
Clone() const1085*b1cdbd2cSJim Jagielski SvxEditSource* SvxTextEditSource::Clone() const
1086*b1cdbd2cSJim Jagielski {
1087*b1cdbd2cSJim Jagielski 	return new SvxTextEditSource( mpImpl );
1088*b1cdbd2cSJim Jagielski }
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
GetTextForwarder()1091*b1cdbd2cSJim Jagielski SvxTextForwarder* SvxTextEditSource::GetTextForwarder()
1092*b1cdbd2cSJim Jagielski {
1093*b1cdbd2cSJim Jagielski     return mpImpl->GetTextForwarder();
1094*b1cdbd2cSJim Jagielski }
1095*b1cdbd2cSJim Jagielski 
1096*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
GetEditViewForwarder(sal_Bool bCreate)1097*b1cdbd2cSJim Jagielski SvxEditViewForwarder* SvxTextEditSource::GetEditViewForwarder( sal_Bool bCreate )
1098*b1cdbd2cSJim Jagielski {
1099*b1cdbd2cSJim Jagielski     return mpImpl->GetEditViewForwarder( bCreate );
1100*b1cdbd2cSJim Jagielski }
1101*b1cdbd2cSJim Jagielski 
1102*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
GetViewForwarder()1103*b1cdbd2cSJim Jagielski SvxViewForwarder* SvxTextEditSource::GetViewForwarder()
1104*b1cdbd2cSJim Jagielski {
1105*b1cdbd2cSJim Jagielski     return this;
1106*b1cdbd2cSJim Jagielski }
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
UpdateData()1109*b1cdbd2cSJim Jagielski void SvxTextEditSource::UpdateData()
1110*b1cdbd2cSJim Jagielski {
1111*b1cdbd2cSJim Jagielski     mpImpl->UpdateData();
1112*b1cdbd2cSJim Jagielski }
1113*b1cdbd2cSJim Jagielski 
GetBroadcaster() const1114*b1cdbd2cSJim Jagielski SfxBroadcaster& SvxTextEditSource::GetBroadcaster() const
1115*b1cdbd2cSJim Jagielski {
1116*b1cdbd2cSJim Jagielski     return *mpImpl;
1117*b1cdbd2cSJim Jagielski }
1118*b1cdbd2cSJim Jagielski 
GetSdrObject() const1119*b1cdbd2cSJim Jagielski SdrObject* SvxTextEditSource::GetSdrObject() const
1120*b1cdbd2cSJim Jagielski {
1121*b1cdbd2cSJim Jagielski     return mpImpl->GetSdrObject();
1122*b1cdbd2cSJim Jagielski }
1123*b1cdbd2cSJim Jagielski 
lock()1124*b1cdbd2cSJim Jagielski void SvxTextEditSource::lock()
1125*b1cdbd2cSJim Jagielski {
1126*b1cdbd2cSJim Jagielski     mpImpl->lock();
1127*b1cdbd2cSJim Jagielski }
1128*b1cdbd2cSJim Jagielski 
unlock()1129*b1cdbd2cSJim Jagielski void SvxTextEditSource::unlock()
1130*b1cdbd2cSJim Jagielski {
1131*b1cdbd2cSJim Jagielski     mpImpl->unlock();
1132*b1cdbd2cSJim Jagielski }
1133*b1cdbd2cSJim Jagielski 
IsValid() const1134*b1cdbd2cSJim Jagielski sal_Bool SvxTextEditSource::IsValid() const
1135*b1cdbd2cSJim Jagielski {
1136*b1cdbd2cSJim Jagielski     return mpImpl->IsValid();
1137*b1cdbd2cSJim Jagielski }
1138*b1cdbd2cSJim Jagielski 
GetVisArea() const1139*b1cdbd2cSJim Jagielski Rectangle SvxTextEditSource::GetVisArea() const
1140*b1cdbd2cSJim Jagielski {
1141*b1cdbd2cSJim Jagielski     return mpImpl->GetVisArea();
1142*b1cdbd2cSJim Jagielski }
1143*b1cdbd2cSJim Jagielski 
LogicToPixel(const Point & rPoint,const MapMode & rMapMode) const1144*b1cdbd2cSJim Jagielski Point SvxTextEditSource::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const
1145*b1cdbd2cSJim Jagielski {
1146*b1cdbd2cSJim Jagielski     return mpImpl->LogicToPixel( rPoint, rMapMode );
1147*b1cdbd2cSJim Jagielski }
1148*b1cdbd2cSJim Jagielski 
PixelToLogic(const Point & rPoint,const MapMode & rMapMode) const1149*b1cdbd2cSJim Jagielski Point SvxTextEditSource::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const
1150*b1cdbd2cSJim Jagielski {
1151*b1cdbd2cSJim Jagielski     return mpImpl->PixelToLogic( rPoint, rMapMode );
1152*b1cdbd2cSJim Jagielski }
1153*b1cdbd2cSJim Jagielski 
addRange(SvxUnoTextRangeBase * pNewRange)1154*b1cdbd2cSJim Jagielski void SvxTextEditSource::addRange( SvxUnoTextRangeBase* pNewRange )
1155*b1cdbd2cSJim Jagielski {
1156*b1cdbd2cSJim Jagielski 	mpImpl->addRange( pNewRange );
1157*b1cdbd2cSJim Jagielski }
1158*b1cdbd2cSJim Jagielski 
removeRange(SvxUnoTextRangeBase * pOldRange)1159*b1cdbd2cSJim Jagielski void SvxTextEditSource::removeRange( SvxUnoTextRangeBase* pOldRange )
1160*b1cdbd2cSJim Jagielski {
1161*b1cdbd2cSJim Jagielski 	mpImpl->removeRange( pOldRange );
1162*b1cdbd2cSJim Jagielski }
1163*b1cdbd2cSJim Jagielski 
getRanges() const1164*b1cdbd2cSJim Jagielski const SvxUnoTextRangeBaseList& SvxTextEditSource::getRanges() const
1165*b1cdbd2cSJim Jagielski {
1166*b1cdbd2cSJim Jagielski 	return mpImpl->getRanges();
1167*b1cdbd2cSJim Jagielski }
1168*b1cdbd2cSJim Jagielski 
ChangeModel(SdrModel * pNewModel)1169*b1cdbd2cSJim Jagielski void SvxTextEditSource::ChangeModel( SdrModel* pNewModel )
1170*b1cdbd2cSJim Jagielski {
1171*b1cdbd2cSJim Jagielski 	mpImpl->ChangeModel( pNewModel );
1172*b1cdbd2cSJim Jagielski }
1173*b1cdbd2cSJim Jagielski 
UpdateOutliner()1174*b1cdbd2cSJim Jagielski void SvxTextEditSource::UpdateOutliner()
1175*b1cdbd2cSJim Jagielski {
1176*b1cdbd2cSJim Jagielski     mpImpl->UpdateOutliner();
1177*b1cdbd2cSJim Jagielski }
1178