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