xref: /aoo41x/main/svtools/source/edit/textview.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svtools.hxx"
30*cdf0e10cSrcweir #include <svtools/textview.hxx>
31*cdf0e10cSrcweir #include <svtools/texteng.hxx>
32*cdf0e10cSrcweir #include <textdoc.hxx>
33*cdf0e10cSrcweir #include <svtools/textdata.hxx>
34*cdf0e10cSrcweir #include <textdat2.hxx>
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #include <svl/undo.hxx>
37*cdf0e10cSrcweir #include <vcl/cursor.hxx>
38*cdf0e10cSrcweir #include <vcl/window.hxx>
39*cdf0e10cSrcweir #include <vcl/svapp.hxx>
40*cdf0e10cSrcweir #include <vcl/sound.hxx>
41*cdf0e10cSrcweir #include <tools/stream.hxx>
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir #include <sot/formats.hxx>
44*cdf0e10cSrcweir #include <svl/urlbmk.hxx>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_TEXT_XBREAKITERATOR_HPP_
47*cdf0e10cSrcweir #include <com/sun/star/i18n/XBreakIterator.hpp>
48*cdf0e10cSrcweir #endif
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_TEXT_CHARACTERITERATORMODE_HPP_
51*cdf0e10cSrcweir #include <com/sun/star/i18n/CharacterIteratorMode.hpp>
52*cdf0e10cSrcweir #endif
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_TEXT_WORDTYPE_HPP_
55*cdf0e10cSrcweir #include <com/sun/star/i18n/WordType.hpp>
56*cdf0e10cSrcweir #endif
57*cdf0e10cSrcweir #include <cppuhelper/weak.hxx>
58*cdf0e10cSrcweir #include <vcl/unohelp.hxx>
59*cdf0e10cSrcweir #include <com/sun/star/datatransfer/XTransferable.hpp>
60*cdf0e10cSrcweir #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
61*cdf0e10cSrcweir #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp>
62*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_DATATRANSFER_DND_DNDCONSTANS_HPP_
65*cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
66*cdf0e10cSrcweir #endif
67*cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/XDragGestureRecognizer.hpp>
68*cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir #include <vcl/edit.hxx>
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir #include <sot/exchange.hxx>
74*cdf0e10cSrcweir #include <sot/formats.hxx>
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir #include <vos/mutex.hxx>
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir using namespace ::com::sun::star;
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir class TETextDataObject :	public ::com::sun::star::datatransfer::XTransferable,
82*cdf0e10cSrcweir 						public ::cppu::OWeakObject
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir {
85*cdf0e10cSrcweir private:
86*cdf0e10cSrcweir 	String			maText;
87*cdf0e10cSrcweir 	SvMemoryStream	maHTMLStream;
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir public:
90*cdf0e10cSrcweir 					TETextDataObject( const String& rText );
91*cdf0e10cSrcweir 					~TETextDataObject();
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir 	String&			GetText() { return maText; }
94*cdf0e10cSrcweir 	SvMemoryStream&	GetHTMLStream() { return maHTMLStream; }
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir 	// ::com::sun::star::uno::XInterface
97*cdf0e10cSrcweir     ::com::sun::star::uno::Any					SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException);
98*cdf0e10cSrcweir 	void										SAL_CALL acquire() throw()	{ OWeakObject::acquire(); }
99*cdf0e10cSrcweir 	void										SAL_CALL release() throw()	{ OWeakObject::release(); }
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir 	// ::com::sun::star::datatransfer::XTransferable
102*cdf0e10cSrcweir     ::com::sun::star::uno::Any SAL_CALL getTransferData( const ::com::sun::star::datatransfer::DataFlavor& aFlavor ) throw(::com::sun::star::datatransfer::UnsupportedFlavorException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
103*cdf0e10cSrcweir     ::com::sun::star::uno::Sequence< ::com::sun::star::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors(  ) throw(::com::sun::star::uno::RuntimeException);
104*cdf0e10cSrcweir     sal_Bool SAL_CALL isDataFlavorSupported( const ::com::sun::star::datatransfer::DataFlavor& aFlavor ) throw(::com::sun::star::uno::RuntimeException);
105*cdf0e10cSrcweir };
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir TETextDataObject::TETextDataObject( const String& rText ) : maText( rText )
108*cdf0e10cSrcweir {
109*cdf0e10cSrcweir }
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir TETextDataObject::~TETextDataObject()
112*cdf0e10cSrcweir {
113*cdf0e10cSrcweir }
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir // uno::XInterface
116*cdf0e10cSrcweir uno::Any TETextDataObject::queryInterface( const uno::Type & rType ) throw(uno::RuntimeException)
117*cdf0e10cSrcweir {
118*cdf0e10cSrcweir 	uno::Any aRet = ::cppu::queryInterface( rType, SAL_STATIC_CAST( datatransfer::XTransferable*, this ) );
119*cdf0e10cSrcweir 	return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
120*cdf0e10cSrcweir }
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir // datatransfer::XTransferable
123*cdf0e10cSrcweir uno::Any TETextDataObject::getTransferData( const datatransfer::DataFlavor& rFlavor ) throw(datatransfer::UnsupportedFlavorException, io::IOException, uno::RuntimeException)
124*cdf0e10cSrcweir {
125*cdf0e10cSrcweir 	uno::Any aAny;
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir 	sal_uLong nT = SotExchange::GetFormat( rFlavor );
128*cdf0e10cSrcweir 	if ( nT == SOT_FORMAT_STRING )
129*cdf0e10cSrcweir 	{
130*cdf0e10cSrcweir 		aAny <<= (::rtl::OUString)GetText();
131*cdf0e10cSrcweir 	}
132*cdf0e10cSrcweir 	else if ( nT == SOT_FORMATSTR_ID_HTML )
133*cdf0e10cSrcweir 	{
134*cdf0e10cSrcweir 		GetHTMLStream().Seek( STREAM_SEEK_TO_END );
135*cdf0e10cSrcweir 		sal_uLong nLen = GetHTMLStream().Tell();
136*cdf0e10cSrcweir 		GetHTMLStream().Seek(0);
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 		uno::Sequence< sal_Int8 > aSeq( nLen );
139*cdf0e10cSrcweir 		memcpy( aSeq.getArray(), GetHTMLStream().GetData(), nLen );
140*cdf0e10cSrcweir 		aAny <<= aSeq;
141*cdf0e10cSrcweir 	}
142*cdf0e10cSrcweir     else
143*cdf0e10cSrcweir     {
144*cdf0e10cSrcweir         throw datatransfer::UnsupportedFlavorException();
145*cdf0e10cSrcweir     }
146*cdf0e10cSrcweir 	return aAny;
147*cdf0e10cSrcweir }
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir uno::Sequence< datatransfer::DataFlavor > TETextDataObject::getTransferDataFlavors(  ) throw(uno::RuntimeException)
150*cdf0e10cSrcweir {
151*cdf0e10cSrcweir 	GetHTMLStream().Seek( STREAM_SEEK_TO_END );
152*cdf0e10cSrcweir 	sal_Bool bHTML = GetHTMLStream().Tell() > 0;
153*cdf0e10cSrcweir 	uno::Sequence< datatransfer::DataFlavor > aDataFlavors( bHTML ? 2 : 1 );
154*cdf0e10cSrcweir 	SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aDataFlavors.getArray()[0] );
155*cdf0e10cSrcweir 	if ( bHTML )
156*cdf0e10cSrcweir 		SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_HTML, aDataFlavors.getArray()[1] );
157*cdf0e10cSrcweir 	return aDataFlavors;
158*cdf0e10cSrcweir }
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir sal_Bool TETextDataObject::isDataFlavorSupported( const datatransfer::DataFlavor& rFlavor ) throw(uno::RuntimeException)
161*cdf0e10cSrcweir {
162*cdf0e10cSrcweir 	sal_uLong nT = SotExchange::GetFormat( rFlavor );
163*cdf0e10cSrcweir 	return ( nT == SOT_FORMAT_STRING );
164*cdf0e10cSrcweir }
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir /*-- 24.06.2004 13:54:36---------------------------------------------------
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
169*cdf0e10cSrcweir struct ImpTextView
170*cdf0e10cSrcweir {
171*cdf0e10cSrcweir     TextEngine*         mpTextEngine;
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir     Window*             mpWindow;
174*cdf0e10cSrcweir     TextSelection       maSelection;
175*cdf0e10cSrcweir     Point               maStartDocPos;
176*cdf0e10cSrcweir //    TextPaM             maMBDownPaM;
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir     Cursor*             mpCursor;
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir     TextDDInfo*         mpDDInfo;
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir     VirtualDevice*      mpVirtDev;
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir     SelectionEngine*    mpSelEngine;
185*cdf0e10cSrcweir     TextSelFunctionSet* mpSelFuncSet;
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir     ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSourceListener > mxDnDListener;
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir     sal_uInt16              mnTravelXPos;
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir     sal_Bool                mbAutoScroll            : 1;
192*cdf0e10cSrcweir     sal_Bool                mbInsertMode            : 1;
193*cdf0e10cSrcweir     sal_Bool                mbReadOnly              : 1;
194*cdf0e10cSrcweir     sal_Bool                mbPaintSelection        : 1;
195*cdf0e10cSrcweir     sal_Bool                mbAutoIndent            : 1;
196*cdf0e10cSrcweir     sal_Bool                mbHighlightSelection    : 1;
197*cdf0e10cSrcweir     sal_Bool                mbCursorEnabled         : 1;
198*cdf0e10cSrcweir     sal_Bool                mbClickedInSelection    : 1;
199*cdf0e10cSrcweir     sal_Bool                mbSupportProtectAttribute : 1;
200*cdf0e10cSrcweir     bool                mbCursorAtEndOfLine;
201*cdf0e10cSrcweir };
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir // -------------------------------------------------------------------------
204*cdf0e10cSrcweir // (+) class TextView
205*cdf0e10cSrcweir // -------------------------------------------------------------------------
206*cdf0e10cSrcweir TextView::TextView( TextEngine* pEng, Window* pWindow ) :
207*cdf0e10cSrcweir     mpImpl(new ImpTextView)
208*cdf0e10cSrcweir {
209*cdf0e10cSrcweir     pWindow->EnableRTL( sal_False );
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir     mpImpl->mpWindow = pWindow;
212*cdf0e10cSrcweir     mpImpl->mpTextEngine = pEng;
213*cdf0e10cSrcweir     mpImpl->mpVirtDev = NULL;
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir     mpImpl->mbPaintSelection = sal_True;
216*cdf0e10cSrcweir     mpImpl->mbAutoScroll = sal_True;
217*cdf0e10cSrcweir     mpImpl->mbInsertMode = sal_True;
218*cdf0e10cSrcweir     mpImpl->mbReadOnly = sal_False;
219*cdf0e10cSrcweir     mpImpl->mbHighlightSelection = sal_False;
220*cdf0e10cSrcweir     mpImpl->mbAutoIndent = sal_False;
221*cdf0e10cSrcweir     mpImpl->mbCursorEnabled = sal_True;
222*cdf0e10cSrcweir     mpImpl->mbClickedInSelection = sal_False;
223*cdf0e10cSrcweir     mpImpl->mbSupportProtectAttribute = sal_False;
224*cdf0e10cSrcweir     mpImpl->mbCursorAtEndOfLine = false;
225*cdf0e10cSrcweir //	mbInSelection = sal_False;
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir     mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW;
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir     mpImpl->mpSelFuncSet = new TextSelFunctionSet( this );
230*cdf0e10cSrcweir     mpImpl->mpSelEngine = new SelectionEngine( mpImpl->mpWindow, mpImpl->mpSelFuncSet );
231*cdf0e10cSrcweir     mpImpl->mpSelEngine->SetSelectionMode( RANGE_SELECTION );
232*cdf0e10cSrcweir     mpImpl->mpSelEngine->EnableDrag( sal_True );
233*cdf0e10cSrcweir 
234*cdf0e10cSrcweir     mpImpl->mpCursor = new Cursor;
235*cdf0e10cSrcweir     mpImpl->mpCursor->Show();
236*cdf0e10cSrcweir     pWindow->SetCursor( mpImpl->mpCursor );
237*cdf0e10cSrcweir     pWindow->SetInputContext( InputContext( pEng->GetFont(), INPUTCONTEXT_TEXT|INPUTCONTEXT_EXTTEXTINPUT ) );
238*cdf0e10cSrcweir 
239*cdf0e10cSrcweir 	if ( pWindow->GetSettings().GetStyleSettings().GetSelectionOptions() & SELECTION_OPTION_INVERT )
240*cdf0e10cSrcweir         mpImpl->mbHighlightSelection = sal_True;
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir 	pWindow->SetLineColor();
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir     mpImpl->mpDDInfo = NULL;
245*cdf0e10cSrcweir 
246*cdf0e10cSrcweir     if ( pWindow->GetDragGestureRecognizer().is() )
247*cdf0e10cSrcweir     {
248*cdf0e10cSrcweir         vcl::unohelper::DragAndDropWrapper* pDnDWrapper = new vcl::unohelper::DragAndDropWrapper( this );
249*cdf0e10cSrcweir         mpImpl->mxDnDListener = pDnDWrapper;
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir         uno::Reference< datatransfer::dnd::XDragGestureListener> xDGL( mpImpl->mxDnDListener, uno::UNO_QUERY );
252*cdf0e10cSrcweir         pWindow->GetDragGestureRecognizer()->addDragGestureListener( xDGL );
253*cdf0e10cSrcweir         uno::Reference< datatransfer::dnd::XDropTargetListener> xDTL( xDGL, uno::UNO_QUERY );
254*cdf0e10cSrcweir         pWindow->GetDropTarget()->addDropTargetListener( xDTL );
255*cdf0e10cSrcweir         pWindow->GetDropTarget()->setActive( sal_True );
256*cdf0e10cSrcweir         pWindow->GetDropTarget()->setDefaultActions( datatransfer::dnd::DNDConstants::ACTION_COPY_OR_MOVE );
257*cdf0e10cSrcweir     }
258*cdf0e10cSrcweir }
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir TextView::~TextView()
261*cdf0e10cSrcweir {
262*cdf0e10cSrcweir     delete mpImpl->mpSelEngine;
263*cdf0e10cSrcweir     delete mpImpl->mpSelFuncSet;
264*cdf0e10cSrcweir     delete mpImpl->mpVirtDev;
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir     if ( mpImpl->mpWindow->GetCursor() == mpImpl->mpCursor )
267*cdf0e10cSrcweir         mpImpl->mpWindow->SetCursor( 0 );
268*cdf0e10cSrcweir     delete mpImpl->mpCursor;
269*cdf0e10cSrcweir     delete mpImpl->mpDDInfo;
270*cdf0e10cSrcweir     delete mpImpl;
271*cdf0e10cSrcweir }
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir void TextView::Invalidate()
274*cdf0e10cSrcweir {
275*cdf0e10cSrcweir     mpImpl->mpWindow->Invalidate();
276*cdf0e10cSrcweir }
277*cdf0e10cSrcweir 
278*cdf0e10cSrcweir void TextView::SetSelection( const TextSelection& rTextSel, sal_Bool bGotoCursor )
279*cdf0e10cSrcweir {
280*cdf0e10cSrcweir 	// Falls jemand gerade ein leeres Attribut hinterlassen hat,
281*cdf0e10cSrcweir 	// und dann der Outliner die Selektion manipulitert:
282*cdf0e10cSrcweir     if ( !mpImpl->maSelection.HasRange() )
283*cdf0e10cSrcweir         mpImpl->mpTextEngine->CursorMoved( mpImpl->maSelection.GetStart().GetPara() );
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir 	// Wenn nach einem KeyInput die Selection manipuliert wird:
286*cdf0e10cSrcweir     mpImpl->mpTextEngine->CheckIdleFormatter();
287*cdf0e10cSrcweir 
288*cdf0e10cSrcweir 	HideSelection();
289*cdf0e10cSrcweir     TextSelection aNewSel( rTextSel );
290*cdf0e10cSrcweir     mpImpl->mpTextEngine->ValidateSelection( aNewSel );
291*cdf0e10cSrcweir 	ImpSetSelection( aNewSel );
292*cdf0e10cSrcweir 	ShowSelection();
293*cdf0e10cSrcweir 	ShowCursor( bGotoCursor );
294*cdf0e10cSrcweir }
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir void TextView::SetSelection( const TextSelection& rTextSel )
297*cdf0e10cSrcweir {
298*cdf0e10cSrcweir     SetSelection( rTextSel, mpImpl->mbAutoScroll );
299*cdf0e10cSrcweir }
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir const TextSelection& TextView::GetSelection() const
302*cdf0e10cSrcweir {
303*cdf0e10cSrcweir     return mpImpl->maSelection;
304*cdf0e10cSrcweir }
305*cdf0e10cSrcweir TextSelection&      TextView::GetSelection()
306*cdf0e10cSrcweir {
307*cdf0e10cSrcweir     return mpImpl->maSelection;
308*cdf0e10cSrcweir }
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir void TextView::DeleteSelected()
311*cdf0e10cSrcweir {
312*cdf0e10cSrcweir //	HideSelection();
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir     mpImpl->mpTextEngine->UndoActionStart();
315*cdf0e10cSrcweir     TextPaM aPaM = mpImpl->mpTextEngine->ImpDeleteText( mpImpl->maSelection );
316*cdf0e10cSrcweir     mpImpl->mpTextEngine->UndoActionEnd();
317*cdf0e10cSrcweir 
318*cdf0e10cSrcweir 	ImpSetSelection( aPaM );
319*cdf0e10cSrcweir     mpImpl->mpTextEngine->FormatAndUpdate( this );
320*cdf0e10cSrcweir 	ShowCursor();
321*cdf0e10cSrcweir }
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir void TextView::ImpPaint( OutputDevice* pOut, const Point& rStartPos, Rectangle const* pPaintArea, TextSelection const* pPaintRange, TextSelection const* pSelection )
324*cdf0e10cSrcweir {
325*cdf0e10cSrcweir     if ( !mpImpl->mbPaintSelection )
326*cdf0e10cSrcweir 		pSelection = NULL;
327*cdf0e10cSrcweir 	else
328*cdf0e10cSrcweir 	{
329*cdf0e10cSrcweir 		// Richtige Hintergrundfarbe einstellen.
330*cdf0e10cSrcweir 		// Ich bekomme leider nicht mit, ob sich diese inzwischen geaendert hat.
331*cdf0e10cSrcweir         Font aFont = mpImpl->mpTextEngine->GetFont();
332*cdf0e10cSrcweir 		Color aColor = pOut->GetBackground().GetColor();
333*cdf0e10cSrcweir 		aColor.SetTransparency( 0 );
334*cdf0e10cSrcweir 		if ( aColor != aFont.GetFillColor() )
335*cdf0e10cSrcweir 		{
336*cdf0e10cSrcweir             if( aFont.IsTransparent() )
337*cdf0e10cSrcweir                 aColor = Color( COL_TRANSPARENT );
338*cdf0e10cSrcweir 			aFont.SetFillColor( aColor );
339*cdf0e10cSrcweir             mpImpl->mpTextEngine->maFont = aFont;
340*cdf0e10cSrcweir 		}
341*cdf0e10cSrcweir 	}
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir     mpImpl->mpTextEngine->ImpPaint( pOut, rStartPos, pPaintArea, pPaintRange, pSelection );
344*cdf0e10cSrcweir }
345*cdf0e10cSrcweir 
346*cdf0e10cSrcweir void TextView::Paint( const Rectangle& rRect )
347*cdf0e10cSrcweir {
348*cdf0e10cSrcweir 	ImpPaint( rRect, sal_False );
349*cdf0e10cSrcweir }
350*cdf0e10cSrcweir 
351*cdf0e10cSrcweir void TextView::ImpPaint( const Rectangle& rRect, sal_Bool bUseVirtDev )
352*cdf0e10cSrcweir {
353*cdf0e10cSrcweir     if ( !mpImpl->mpTextEngine->GetUpdateMode() || mpImpl->mpTextEngine->IsInUndo() )
354*cdf0e10cSrcweir 		return;
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir 	TextSelection *pDrawSelection = NULL;
357*cdf0e10cSrcweir     if ( !mpImpl->mbHighlightSelection && mpImpl->maSelection.HasRange() )
358*cdf0e10cSrcweir         pDrawSelection = &mpImpl->maSelection;
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir 	if ( bUseVirtDev )
361*cdf0e10cSrcweir 	{
362*cdf0e10cSrcweir 		VirtualDevice* pVDev = GetVirtualDevice();
363*cdf0e10cSrcweir 
364*cdf0e10cSrcweir         const Color& rBackgroundColor = mpImpl->mpWindow->GetBackground().GetColor();
365*cdf0e10cSrcweir 		if ( pVDev->GetFillColor() != rBackgroundColor )
366*cdf0e10cSrcweir 			pVDev->SetFillColor( rBackgroundColor );
367*cdf0e10cSrcweir 		if ( pVDev->GetBackground().GetColor() != rBackgroundColor )
368*cdf0e10cSrcweir 			pVDev->SetBackground( rBackgroundColor );
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir 		sal_Bool bVDevValid = sal_True;
371*cdf0e10cSrcweir 		Size aOutSz( pVDev->GetOutputSizePixel() );
372*cdf0e10cSrcweir 		if ( (	aOutSz.Width() < rRect.GetWidth() ) ||
373*cdf0e10cSrcweir 			 (	aOutSz.Height() < rRect.GetHeight() ) )
374*cdf0e10cSrcweir 		{
375*cdf0e10cSrcweir 			bVDevValid = pVDev->SetOutputSizePixel( rRect.GetSize() );
376*cdf0e10cSrcweir 		}
377*cdf0e10cSrcweir 		else
378*cdf0e10cSrcweir 		{
379*cdf0e10cSrcweir 			// Das VirtDev kann bei einem Resize sehr gross werden =>
380*cdf0e10cSrcweir 			// irgendwann mal kleiner machen!
381*cdf0e10cSrcweir 			if ( ( aOutSz.Height() > ( rRect.GetHeight() + 20 ) ) ||
382*cdf0e10cSrcweir 				 ( aOutSz.Width() > ( rRect.GetWidth() + 20 ) ) )
383*cdf0e10cSrcweir 			{
384*cdf0e10cSrcweir 				bVDevValid = pVDev->SetOutputSizePixel( rRect.GetSize() );
385*cdf0e10cSrcweir 			}
386*cdf0e10cSrcweir 			else
387*cdf0e10cSrcweir 			{
388*cdf0e10cSrcweir 				pVDev->Erase();
389*cdf0e10cSrcweir 			}
390*cdf0e10cSrcweir 		}
391*cdf0e10cSrcweir 		if ( !bVDevValid )
392*cdf0e10cSrcweir 		{
393*cdf0e10cSrcweir 			ImpPaint( rRect, sal_False /* ohne VDev */ );
394*cdf0e10cSrcweir 			return;
395*cdf0e10cSrcweir 		}
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir 		Rectangle aTmpRec( Point( 0, 0 ), rRect.GetSize() );
398*cdf0e10cSrcweir 
399*cdf0e10cSrcweir         Point aDocPos( mpImpl->maStartDocPos.X(), mpImpl->maStartDocPos.Y() + rRect.Top() );
400*cdf0e10cSrcweir         Point aStartPos = ImpGetOutputStartPos( aDocPos );
401*cdf0e10cSrcweir 		ImpPaint( pVDev, aStartPos, &aTmpRec, NULL, pDrawSelection );
402*cdf0e10cSrcweir         mpImpl->mpWindow->DrawOutDev( rRect.TopLeft(), rRect.GetSize(),
403*cdf0e10cSrcweir 								Point(0,0), rRect.GetSize(), *pVDev );
404*cdf0e10cSrcweir //		ShowSelection();
405*cdf0e10cSrcweir         if ( mpImpl->mbHighlightSelection )
406*cdf0e10cSrcweir             ImpHighlight( mpImpl->maSelection );
407*cdf0e10cSrcweir 	}
408*cdf0e10cSrcweir 	else
409*cdf0e10cSrcweir 	{
410*cdf0e10cSrcweir         Point aStartPos = ImpGetOutputStartPos( mpImpl->maStartDocPos );
411*cdf0e10cSrcweir         ImpPaint( mpImpl->mpWindow, aStartPos, &rRect, NULL, pDrawSelection );
412*cdf0e10cSrcweir 
413*cdf0e10cSrcweir //		ShowSelection();
414*cdf0e10cSrcweir         if ( mpImpl->mbHighlightSelection )
415*cdf0e10cSrcweir             ImpHighlight( mpImpl->maSelection );
416*cdf0e10cSrcweir 	}
417*cdf0e10cSrcweir }
418*cdf0e10cSrcweir 
419*cdf0e10cSrcweir void TextView::ImpHighlight( const TextSelection& rSel )
420*cdf0e10cSrcweir {
421*cdf0e10cSrcweir 	TextSelection aSel( rSel );
422*cdf0e10cSrcweir 	aSel.Justify();
423*cdf0e10cSrcweir     if ( aSel.HasRange() && !mpImpl->mpTextEngine->IsInUndo() && mpImpl->mpTextEngine->GetUpdateMode() )
424*cdf0e10cSrcweir 	{
425*cdf0e10cSrcweir         mpImpl->mpCursor->Hide();
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir         DBG_ASSERT( !mpImpl->mpTextEngine->mpIdleFormatter->IsActive(), "ImpHighlight: Not formatted!" );
428*cdf0e10cSrcweir 
429*cdf0e10cSrcweir         Rectangle aVisArea( mpImpl->maStartDocPos, mpImpl->mpWindow->GetOutputSizePixel() );
430*cdf0e10cSrcweir 		long nY = 0;
431*cdf0e10cSrcweir 		sal_uLong nStartPara = aSel.GetStart().GetPara();
432*cdf0e10cSrcweir 		sal_uLong nEndPara = aSel.GetEnd().GetPara();
433*cdf0e10cSrcweir 		for ( sal_uLong nPara = 0; nPara <= nEndPara; nPara++ )
434*cdf0e10cSrcweir 		{
435*cdf0e10cSrcweir             long nParaHeight = (long)mpImpl->mpTextEngine->CalcParaHeight( nPara );
436*cdf0e10cSrcweir 			if ( ( nPara >= nStartPara ) && ( ( nY + nParaHeight ) > aVisArea.Top() ) )
437*cdf0e10cSrcweir 			{
438*cdf0e10cSrcweir                 TEParaPortion* pTEParaPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( nPara );
439*cdf0e10cSrcweir 				sal_uInt16 nStartLine = 0;
440*cdf0e10cSrcweir 				sal_uInt16 nEndLine = pTEParaPortion->GetLines().Count() -1;
441*cdf0e10cSrcweir 				if ( nPara == nStartPara )
442*cdf0e10cSrcweir 					nStartLine = pTEParaPortion->GetLineNumber( aSel.GetStart().GetIndex(), sal_False );
443*cdf0e10cSrcweir 				if ( nPara == nEndPara )
444*cdf0e10cSrcweir 					nEndLine = pTEParaPortion->GetLineNumber( aSel.GetEnd().GetIndex(), sal_True );
445*cdf0e10cSrcweir 
446*cdf0e10cSrcweir 				// ueber die Zeilen iterieren....
447*cdf0e10cSrcweir 				for ( sal_uInt16 nLine = nStartLine; nLine <= nEndLine; nLine++ )
448*cdf0e10cSrcweir 				{
449*cdf0e10cSrcweir 					TextLine* pLine = pTEParaPortion->GetLines().GetObject( nLine );
450*cdf0e10cSrcweir 					sal_uInt16 nStartIndex = pLine->GetStart();
451*cdf0e10cSrcweir 					sal_uInt16 nEndIndex = pLine->GetEnd();
452*cdf0e10cSrcweir 					if ( ( nPara == nStartPara ) && ( nLine == nStartLine ) )
453*cdf0e10cSrcweir 						nStartIndex = aSel.GetStart().GetIndex();
454*cdf0e10cSrcweir 					if ( ( nPara == nEndPara ) && ( nLine == nEndLine ) )
455*cdf0e10cSrcweir 						nEndIndex = aSel.GetEnd().GetIndex();
456*cdf0e10cSrcweir 
457*cdf0e10cSrcweir 					// Kann passieren, wenn am Anfang einer umgebrochenen Zeile.
458*cdf0e10cSrcweir 					if ( nEndIndex < nStartIndex )
459*cdf0e10cSrcweir 						nEndIndex = nStartIndex;
460*cdf0e10cSrcweir 
461*cdf0e10cSrcweir                     Rectangle aTmpRec( mpImpl->mpTextEngine->GetEditCursor( TextPaM( nPara, nStartIndex ), sal_False ) );
462*cdf0e10cSrcweir 					aTmpRec.Top() += nY;
463*cdf0e10cSrcweir 					aTmpRec.Bottom() += nY;
464*cdf0e10cSrcweir 					Point aTopLeft( aTmpRec.TopLeft() );
465*cdf0e10cSrcweir 
466*cdf0e10cSrcweir                     aTmpRec = mpImpl->mpTextEngine->GetEditCursor( TextPaM( nPara, nEndIndex ), sal_True );
467*cdf0e10cSrcweir 					aTmpRec.Top() += nY;
468*cdf0e10cSrcweir 					aTmpRec.Bottom() += nY;
469*cdf0e10cSrcweir 					Point aBottomRight( aTmpRec.BottomRight() );
470*cdf0e10cSrcweir 					aBottomRight.X()--;
471*cdf0e10cSrcweir 
472*cdf0e10cSrcweir 					// Nur Painten, wenn im sichtbaren Bereich...
473*cdf0e10cSrcweir 					if ( ( aTopLeft.X() < aBottomRight.X() ) && ( aBottomRight.Y() >= aVisArea.Top() ) )
474*cdf0e10cSrcweir 					{
475*cdf0e10cSrcweir 						Point aPnt1( GetWindowPos( aTopLeft ) );
476*cdf0e10cSrcweir 						Point aPnt2( GetWindowPos( aBottomRight ) );
477*cdf0e10cSrcweir 
478*cdf0e10cSrcweir 						Rectangle aRect( aPnt1, aPnt2 );
479*cdf0e10cSrcweir                         mpImpl->mpWindow->Invert( aRect );
480*cdf0e10cSrcweir 					}
481*cdf0e10cSrcweir 				}
482*cdf0e10cSrcweir 			}
483*cdf0e10cSrcweir 			nY += nParaHeight;
484*cdf0e10cSrcweir 
485*cdf0e10cSrcweir 			if ( nY >= aVisArea.Bottom() )
486*cdf0e10cSrcweir 				break;
487*cdf0e10cSrcweir 		}
488*cdf0e10cSrcweir 	}
489*cdf0e10cSrcweir }
490*cdf0e10cSrcweir 
491*cdf0e10cSrcweir void TextView::ImpSetSelection( const TextSelection& rSelection )
492*cdf0e10cSrcweir {
493*cdf0e10cSrcweir     if ( rSelection != mpImpl->maSelection )
494*cdf0e10cSrcweir     {
495*cdf0e10cSrcweir         mpImpl->maSelection = rSelection;
496*cdf0e10cSrcweir         mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_VIEWSELECTIONCHANGED ) );
497*cdf0e10cSrcweir     }
498*cdf0e10cSrcweir }
499*cdf0e10cSrcweir 
500*cdf0e10cSrcweir void TextView::ShowSelection()
501*cdf0e10cSrcweir {
502*cdf0e10cSrcweir     ImpShowHideSelection( sal_True );
503*cdf0e10cSrcweir }
504*cdf0e10cSrcweir 
505*cdf0e10cSrcweir void TextView::HideSelection()
506*cdf0e10cSrcweir {
507*cdf0e10cSrcweir     ImpShowHideSelection( sal_False );
508*cdf0e10cSrcweir }
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir void TextView::ShowSelection( const TextSelection& rRange )
511*cdf0e10cSrcweir {
512*cdf0e10cSrcweir     ImpShowHideSelection( sal_True, &rRange );
513*cdf0e10cSrcweir }
514*cdf0e10cSrcweir 
515*cdf0e10cSrcweir void TextView::ImpShowHideSelection( sal_Bool bShow, const TextSelection* pRange )
516*cdf0e10cSrcweir {
517*cdf0e10cSrcweir     const TextSelection* pRangeOrSelection = pRange ? pRange : &mpImpl->maSelection;
518*cdf0e10cSrcweir 
519*cdf0e10cSrcweir 	if ( pRangeOrSelection->HasRange() )
520*cdf0e10cSrcweir 	{
521*cdf0e10cSrcweir         if ( mpImpl->mbHighlightSelection )
522*cdf0e10cSrcweir         {
523*cdf0e10cSrcweir 			ImpHighlight( *pRangeOrSelection );
524*cdf0e10cSrcweir         }
525*cdf0e10cSrcweir 		else
526*cdf0e10cSrcweir 		{
527*cdf0e10cSrcweir             if( mpImpl->mpWindow->IsPaintTransparent() )
528*cdf0e10cSrcweir                 mpImpl->mpWindow->Invalidate();
529*cdf0e10cSrcweir             else
530*cdf0e10cSrcweir             {
531*cdf0e10cSrcweir                 Rectangle aOutArea( Point( 0, 0 ), mpImpl->mpWindow->GetOutputSizePixel() );
532*cdf0e10cSrcweir                 Point aStartPos( ImpGetOutputStartPos( mpImpl->maStartDocPos ) );
533*cdf0e10cSrcweir                 TextSelection aRange( *pRangeOrSelection );
534*cdf0e10cSrcweir                 aRange.Justify();
535*cdf0e10cSrcweir                 sal_Bool bVisCursor = mpImpl->mpCursor->IsVisible();
536*cdf0e10cSrcweir                 mpImpl->mpCursor->Hide();
537*cdf0e10cSrcweir                 ImpPaint( mpImpl->mpWindow, aStartPos, &aOutArea, &aRange, bShow ? &mpImpl->maSelection : NULL );
538*cdf0e10cSrcweir                 if ( bVisCursor )
539*cdf0e10cSrcweir                     mpImpl->mpCursor->Show();
540*cdf0e10cSrcweir             }
541*cdf0e10cSrcweir 		}
542*cdf0e10cSrcweir 	}
543*cdf0e10cSrcweir }
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir VirtualDevice* TextView::GetVirtualDevice()
546*cdf0e10cSrcweir {
547*cdf0e10cSrcweir     if ( !mpImpl->mpVirtDev )
548*cdf0e10cSrcweir 	{
549*cdf0e10cSrcweir         mpImpl->mpVirtDev = new VirtualDevice;
550*cdf0e10cSrcweir         mpImpl->mpVirtDev->SetLineColor();
551*cdf0e10cSrcweir 	}
552*cdf0e10cSrcweir     return mpImpl->mpVirtDev;
553*cdf0e10cSrcweir }
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir void TextView::EraseVirtualDevice()
556*cdf0e10cSrcweir {
557*cdf0e10cSrcweir     delete mpImpl->mpVirtDev;
558*cdf0e10cSrcweir     mpImpl->mpVirtDev = 0;
559*cdf0e10cSrcweir }
560*cdf0e10cSrcweir 
561*cdf0e10cSrcweir sal_Bool TextView::KeyInput( const KeyEvent& rKeyEvent )
562*cdf0e10cSrcweir {
563*cdf0e10cSrcweir 	sal_Bool bDone 		= sal_True;
564*cdf0e10cSrcweir 	sal_Bool bModified	= sal_False;
565*cdf0e10cSrcweir 	sal_Bool bMoved		= sal_False;
566*cdf0e10cSrcweir 	sal_Bool bEndKey	= sal_False;	// spezielle CursorPosition
567*cdf0e10cSrcweir 	sal_Bool bAllowIdle = sal_True;
568*cdf0e10cSrcweir 
569*cdf0e10cSrcweir 	// Um zu pruefen ob durch irgendeine Aktion mModified, das lokale
570*cdf0e10cSrcweir 	// bModified wird z.B. bei Cut/Paste nicht gesetzt, weil dort an anderen
571*cdf0e10cSrcweir 	// Stellen das updaten erfolgt.
572*cdf0e10cSrcweir     sal_Bool bWasModified = mpImpl->mpTextEngine->IsModified();
573*cdf0e10cSrcweir     mpImpl->mpTextEngine->SetModified( sal_False );
574*cdf0e10cSrcweir 
575*cdf0e10cSrcweir     TextSelection aCurSel( mpImpl->maSelection );
576*cdf0e10cSrcweir 	TextSelection aOldSel( aCurSel );
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir 	sal_uInt16 nCode = rKeyEvent.GetKeyCode().GetCode();
579*cdf0e10cSrcweir 	KeyFuncType eFunc = rKeyEvent.GetKeyCode().GetFunction();
580*cdf0e10cSrcweir 	if ( eFunc != KEYFUNC_DONTKNOW )
581*cdf0e10cSrcweir 	{
582*cdf0e10cSrcweir 		switch ( eFunc )
583*cdf0e10cSrcweir 		{
584*cdf0e10cSrcweir 			case KEYFUNC_CUT:
585*cdf0e10cSrcweir 			{
586*cdf0e10cSrcweir                 if ( !mpImpl->mbReadOnly )
587*cdf0e10cSrcweir 					Cut();
588*cdf0e10cSrcweir 			}
589*cdf0e10cSrcweir 			break;
590*cdf0e10cSrcweir 			case KEYFUNC_COPY:
591*cdf0e10cSrcweir 			{
592*cdf0e10cSrcweir 				Copy();
593*cdf0e10cSrcweir 			}
594*cdf0e10cSrcweir 			break;
595*cdf0e10cSrcweir 			case KEYFUNC_PASTE:
596*cdf0e10cSrcweir 			{
597*cdf0e10cSrcweir                 if ( !mpImpl->mbReadOnly )
598*cdf0e10cSrcweir 					Paste();
599*cdf0e10cSrcweir 			}
600*cdf0e10cSrcweir 			break;
601*cdf0e10cSrcweir 			case KEYFUNC_UNDO:
602*cdf0e10cSrcweir 			{
603*cdf0e10cSrcweir                 if ( !mpImpl->mbReadOnly )
604*cdf0e10cSrcweir 					Undo();
605*cdf0e10cSrcweir 			}
606*cdf0e10cSrcweir 			break;
607*cdf0e10cSrcweir 			case KEYFUNC_REDO:
608*cdf0e10cSrcweir 			{
609*cdf0e10cSrcweir                 if ( !mpImpl->mbReadOnly )
610*cdf0e10cSrcweir 					Redo();
611*cdf0e10cSrcweir 			}
612*cdf0e10cSrcweir 			break;
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir 			default:	// wird dann evtl. unten bearbeitet.
615*cdf0e10cSrcweir 						eFunc = KEYFUNC_DONTKNOW;
616*cdf0e10cSrcweir 		}
617*cdf0e10cSrcweir 	}
618*cdf0e10cSrcweir 	if ( eFunc == KEYFUNC_DONTKNOW )
619*cdf0e10cSrcweir 	{
620*cdf0e10cSrcweir 		switch ( nCode )
621*cdf0e10cSrcweir 		{
622*cdf0e10cSrcweir 			case KEY_UP:
623*cdf0e10cSrcweir 			case KEY_DOWN:
624*cdf0e10cSrcweir 			case KEY_LEFT:
625*cdf0e10cSrcweir 			case KEY_RIGHT:
626*cdf0e10cSrcweir 			case KEY_HOME:
627*cdf0e10cSrcweir 			case KEY_END:
628*cdf0e10cSrcweir 			case KEY_PAGEUP:
629*cdf0e10cSrcweir 			case KEY_PAGEDOWN:
630*cdf0e10cSrcweir             case com::sun::star::awt::Key::MOVE_WORD_FORWARD:
631*cdf0e10cSrcweir             case com::sun::star::awt::Key::SELECT_WORD_FORWARD:
632*cdf0e10cSrcweir             case com::sun::star::awt::Key::MOVE_WORD_BACKWARD:
633*cdf0e10cSrcweir             case com::sun::star::awt::Key::SELECT_WORD_BACKWARD:
634*cdf0e10cSrcweir             case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE:
635*cdf0e10cSrcweir             case com::sun::star::awt::Key::MOVE_TO_END_OF_LINE:
636*cdf0e10cSrcweir             case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE:
637*cdf0e10cSrcweir             case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE:
638*cdf0e10cSrcweir             case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
639*cdf0e10cSrcweir             case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
640*cdf0e10cSrcweir             case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
641*cdf0e10cSrcweir             case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
642*cdf0e10cSrcweir             case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
643*cdf0e10cSrcweir             case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT:
644*cdf0e10cSrcweir             case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
645*cdf0e10cSrcweir             case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT:
646*cdf0e10cSrcweir 			{
647*cdf0e10cSrcweir 				if ( ( !rKeyEvent.GetKeyCode().IsMod2() || ( nCode == KEY_LEFT ) || ( nCode == KEY_RIGHT ) )
648*cdf0e10cSrcweir                       && !( rKeyEvent.GetKeyCode().IsMod1() && ( nCode == KEY_PAGEUP || nCode == KEY_PAGEDOWN ) ) )
649*cdf0e10cSrcweir 				{
650*cdf0e10cSrcweir 					aCurSel = ImpMoveCursor( rKeyEvent );
651*cdf0e10cSrcweir                     if ( aCurSel.HasRange() ) {
652*cdf0e10cSrcweir                         uno::Reference<datatransfer::clipboard::XClipboard> aSelection(GetWindow()->GetPrimarySelection());
653*cdf0e10cSrcweir                         Copy( aSelection );
654*cdf0e10cSrcweir                     }
655*cdf0e10cSrcweir 					bMoved = sal_True;
656*cdf0e10cSrcweir 					if ( nCode == KEY_END )
657*cdf0e10cSrcweir 						bEndKey = sal_True;
658*cdf0e10cSrcweir 				}
659*cdf0e10cSrcweir 				else
660*cdf0e10cSrcweir 					bDone = sal_False;
661*cdf0e10cSrcweir 			}
662*cdf0e10cSrcweir 			break;
663*cdf0e10cSrcweir 			case KEY_BACKSPACE:
664*cdf0e10cSrcweir 			case KEY_DELETE:
665*cdf0e10cSrcweir             case com::sun::star::awt::Key::DELETE_WORD_BACKWARD:
666*cdf0e10cSrcweir             case com::sun::star::awt::Key::DELETE_WORD_FORWARD:
667*cdf0e10cSrcweir             case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_LINE:
668*cdf0e10cSrcweir             case com::sun::star::awt::Key::DELETE_TO_END_OF_LINE:
669*cdf0e10cSrcweir 			{
670*cdf0e10cSrcweir                 if ( !mpImpl->mbReadOnly && !rKeyEvent.GetKeyCode().IsMod2() )
671*cdf0e10cSrcweir 				{
672*cdf0e10cSrcweir 					sal_uInt8 nDel = ( nCode == KEY_DELETE ) ? DEL_RIGHT : DEL_LEFT;
673*cdf0e10cSrcweir 					sal_uInt8 nMode = rKeyEvent.GetKeyCode().IsMod1() ? DELMODE_RESTOFWORD : DELMODE_SIMPLE;
674*cdf0e10cSrcweir 					if ( ( nMode == DELMODE_RESTOFWORD ) && rKeyEvent.GetKeyCode().IsShift() )
675*cdf0e10cSrcweir 						nMode = DELMODE_RESTOFCONTENT;
676*cdf0e10cSrcweir 
677*cdf0e10cSrcweir                     switch( nCode )
678*cdf0e10cSrcweir                     {
679*cdf0e10cSrcweir                     case com::sun::star::awt::Key::DELETE_WORD_BACKWARD:
680*cdf0e10cSrcweir                         nDel = DEL_LEFT;
681*cdf0e10cSrcweir                         nMode = DELMODE_RESTOFWORD;
682*cdf0e10cSrcweir                         break;
683*cdf0e10cSrcweir                     case com::sun::star::awt::Key::DELETE_WORD_FORWARD:
684*cdf0e10cSrcweir                         nDel = DEL_RIGHT;
685*cdf0e10cSrcweir                         nMode = DELMODE_RESTOFWORD;
686*cdf0e10cSrcweir                         break;
687*cdf0e10cSrcweir                     case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_LINE:
688*cdf0e10cSrcweir                         nDel = DEL_LEFT;
689*cdf0e10cSrcweir                         nMode = DELMODE_RESTOFCONTENT;
690*cdf0e10cSrcweir                         break;
691*cdf0e10cSrcweir                     case com::sun::star::awt::Key::DELETE_TO_END_OF_LINE:
692*cdf0e10cSrcweir                         nDel = DEL_RIGHT;
693*cdf0e10cSrcweir                         nMode = DELMODE_RESTOFCONTENT;
694*cdf0e10cSrcweir                         break;
695*cdf0e10cSrcweir                     default: break;
696*cdf0e10cSrcweir                     }
697*cdf0e10cSrcweir 
698*cdf0e10cSrcweir                     mpImpl->mpTextEngine->UndoActionStart();
699*cdf0e10cSrcweir                     if(mpImpl->mbSupportProtectAttribute)
700*cdf0e10cSrcweir                     {
701*cdf0e10cSrcweir                         //expand selection to include all protected content - if there is any
702*cdf0e10cSrcweir                         const TextCharAttrib* pStartAttr = mpImpl->mpTextEngine->FindCharAttrib(
703*cdf0e10cSrcweir                                     TextPaM(mpImpl->maSelection.GetStart().GetPara(),
704*cdf0e10cSrcweir                                     mpImpl->maSelection.GetStart().GetIndex()),
705*cdf0e10cSrcweir                                     TEXTATTR_PROTECTED );
706*cdf0e10cSrcweir                         const TextCharAttrib* pEndAttr = mpImpl->mpTextEngine->FindCharAttrib(
707*cdf0e10cSrcweir                                     TextPaM(mpImpl->maSelection.GetEnd().GetPara(),
708*cdf0e10cSrcweir                                     mpImpl->maSelection.GetEnd().GetIndex()),
709*cdf0e10cSrcweir                                     TEXTATTR_PROTECTED );
710*cdf0e10cSrcweir                         if(pStartAttr && pStartAttr->GetStart() < mpImpl->maSelection.GetStart().GetIndex())
711*cdf0e10cSrcweir                         {
712*cdf0e10cSrcweir                             mpImpl->maSelection.GetStart().GetIndex() = pStartAttr->GetStart();
713*cdf0e10cSrcweir                         }
714*cdf0e10cSrcweir                         if(pEndAttr && pEndAttr->GetEnd() > mpImpl->maSelection.GetEnd().GetIndex())
715*cdf0e10cSrcweir                         {
716*cdf0e10cSrcweir                             mpImpl->maSelection.GetEnd().GetIndex() = pEndAttr->GetEnd();
717*cdf0e10cSrcweir                         }
718*cdf0e10cSrcweir                     }
719*cdf0e10cSrcweir                     aCurSel = ImpDelete( nDel, nMode );
720*cdf0e10cSrcweir                     mpImpl->mpTextEngine->UndoActionEnd();
721*cdf0e10cSrcweir 					bModified = sal_True;
722*cdf0e10cSrcweir 					bAllowIdle = sal_False;
723*cdf0e10cSrcweir 				}
724*cdf0e10cSrcweir 				else
725*cdf0e10cSrcweir 					bDone = sal_False;
726*cdf0e10cSrcweir 			}
727*cdf0e10cSrcweir 			break;
728*cdf0e10cSrcweir 			case KEY_TAB:
729*cdf0e10cSrcweir 			{
730*cdf0e10cSrcweir                 if ( !mpImpl->mbReadOnly && !rKeyEvent.GetKeyCode().IsShift() &&
731*cdf0e10cSrcweir 						!rKeyEvent.GetKeyCode().IsMod1() && !rKeyEvent.GetKeyCode().IsMod2() &&
732*cdf0e10cSrcweir 						ImplCheckTextLen( 'x' ) )
733*cdf0e10cSrcweir 				{
734*cdf0e10cSrcweir                     aCurSel = mpImpl->mpTextEngine->ImpInsertText( aCurSel, '\t', !IsInsertMode() );
735*cdf0e10cSrcweir 					bModified = sal_True;
736*cdf0e10cSrcweir 				}
737*cdf0e10cSrcweir 				else
738*cdf0e10cSrcweir 					bDone = sal_False;
739*cdf0e10cSrcweir 			}
740*cdf0e10cSrcweir 			break;
741*cdf0e10cSrcweir 			case KEY_RETURN:
742*cdf0e10cSrcweir 			{
743*cdf0e10cSrcweir 				// Shift-RETURN darf nicht geschluckt werden, weil dann keine
744*cdf0e10cSrcweir 				// mehrzeilige Eingabe in Dialogen/Property-Editor moeglich.
745*cdf0e10cSrcweir                 if ( !mpImpl->mbReadOnly && !rKeyEvent.GetKeyCode().IsMod1() &&
746*cdf0e10cSrcweir 						!rKeyEvent.GetKeyCode().IsMod2() && ImplCheckTextLen( 'x' ) )
747*cdf0e10cSrcweir 				{
748*cdf0e10cSrcweir                     mpImpl->mpTextEngine->UndoActionStart();
749*cdf0e10cSrcweir                     aCurSel = mpImpl->mpTextEngine->ImpInsertParaBreak( aCurSel );
750*cdf0e10cSrcweir                     if ( mpImpl->mbAutoIndent )
751*cdf0e10cSrcweir 					{
752*cdf0e10cSrcweir                         TextNode* pPrev = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aCurSel.GetEnd().GetPara() - 1 );
753*cdf0e10cSrcweir 						sal_uInt16 n = 0;
754*cdf0e10cSrcweir 						while ( ( n < pPrev->GetText().Len() ) && (
755*cdf0e10cSrcweir 									( pPrev->GetText().GetChar( n ) == ' ' ) ||
756*cdf0e10cSrcweir 									( pPrev->GetText().GetChar( n ) == '\t' ) ) )
757*cdf0e10cSrcweir 						{
758*cdf0e10cSrcweir 							n++;
759*cdf0e10cSrcweir 						}
760*cdf0e10cSrcweir 						if ( n )
761*cdf0e10cSrcweir                             aCurSel = mpImpl->mpTextEngine->ImpInsertText( aCurSel, pPrev->GetText().Copy( 0, n ) );
762*cdf0e10cSrcweir 					}
763*cdf0e10cSrcweir                     mpImpl->mpTextEngine->UndoActionEnd();
764*cdf0e10cSrcweir 					bModified = sal_True;
765*cdf0e10cSrcweir 				}
766*cdf0e10cSrcweir 				else
767*cdf0e10cSrcweir 					bDone = sal_False;
768*cdf0e10cSrcweir 			}
769*cdf0e10cSrcweir 			break;
770*cdf0e10cSrcweir 			case KEY_INSERT:
771*cdf0e10cSrcweir 			{
772*cdf0e10cSrcweir                 if ( !mpImpl->mbReadOnly )
773*cdf0e10cSrcweir 					SetInsertMode( !IsInsertMode() );
774*cdf0e10cSrcweir 			}
775*cdf0e10cSrcweir 			break;
776*cdf0e10cSrcweir 			default:
777*cdf0e10cSrcweir 			{
778*cdf0e10cSrcweir 				if ( TextEngine::IsSimpleCharInput( rKeyEvent ) )
779*cdf0e10cSrcweir 				{
780*cdf0e10cSrcweir 					xub_Unicode nCharCode = rKeyEvent.GetCharCode();
781*cdf0e10cSrcweir                     if ( !mpImpl->mbReadOnly && ImplCheckTextLen( nCharCode ) )    // sonst trotzdem das Zeichen schlucken...
782*cdf0e10cSrcweir 					{
783*cdf0e10cSrcweir                         aCurSel = mpImpl->mpTextEngine->ImpInsertText( nCharCode, aCurSel, !IsInsertMode(), sal_True );
784*cdf0e10cSrcweir 						bModified = sal_True;
785*cdf0e10cSrcweir 					}
786*cdf0e10cSrcweir 				}
787*cdf0e10cSrcweir 				else
788*cdf0e10cSrcweir 					bDone = sal_False;
789*cdf0e10cSrcweir 			}
790*cdf0e10cSrcweir 		}
791*cdf0e10cSrcweir 	}
792*cdf0e10cSrcweir 
793*cdf0e10cSrcweir     if ( aCurSel != aOldSel )   // Check if changed, maybe other method already changed mpImpl->maSelection, don't overwrite that!
794*cdf0e10cSrcweir         ImpSetSelection( aCurSel );
795*cdf0e10cSrcweir 
796*cdf0e10cSrcweir     mpImpl->mpTextEngine->UpdateSelections();
797*cdf0e10cSrcweir 
798*cdf0e10cSrcweir 	if ( ( nCode != KEY_UP ) && ( nCode != KEY_DOWN ) )
799*cdf0e10cSrcweir         mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW;
800*cdf0e10cSrcweir 
801*cdf0e10cSrcweir 	if ( bModified )
802*cdf0e10cSrcweir 	{
803*cdf0e10cSrcweir 		// Idle-Formatter nur, wenn AnyInput.
804*cdf0e10cSrcweir 		if ( bAllowIdle && Application::AnyInput( INPUT_KEYBOARD) )
805*cdf0e10cSrcweir             mpImpl->mpTextEngine->IdleFormatAndUpdate( this );
806*cdf0e10cSrcweir 		else
807*cdf0e10cSrcweir             mpImpl->mpTextEngine->FormatAndUpdate( this);
808*cdf0e10cSrcweir 	}
809*cdf0e10cSrcweir 	else if ( bMoved )
810*cdf0e10cSrcweir 	{
811*cdf0e10cSrcweir 		// Selection wird jetzt gezielt in ImpMoveCursor gemalt.
812*cdf0e10cSrcweir         ImpShowCursor( mpImpl->mbAutoScroll, sal_True, bEndKey );
813*cdf0e10cSrcweir 	}
814*cdf0e10cSrcweir 
815*cdf0e10cSrcweir     if ( mpImpl->mpTextEngine->IsModified() )
816*cdf0e10cSrcweir         mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) );
817*cdf0e10cSrcweir 	else if ( bWasModified )
818*cdf0e10cSrcweir         mpImpl->mpTextEngine->SetModified( sal_True );
819*cdf0e10cSrcweir 
820*cdf0e10cSrcweir 	return bDone;
821*cdf0e10cSrcweir }
822*cdf0e10cSrcweir 
823*cdf0e10cSrcweir void TextView::MouseButtonUp( const MouseEvent& rMouseEvent )
824*cdf0e10cSrcweir {
825*cdf0e10cSrcweir     mpImpl->mbClickedInSelection = sal_False;
826*cdf0e10cSrcweir     mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW;
827*cdf0e10cSrcweir     mpImpl->mpSelEngine->SelMouseButtonUp( rMouseEvent );
828*cdf0e10cSrcweir     if ( rMouseEvent.IsMiddle() && !IsReadOnly() &&
829*cdf0e10cSrcweir          ( GetWindow()->GetSettings().GetMouseSettings().GetMiddleButtonAction() == MOUSE_MIDDLE_PASTESELECTION ) )
830*cdf0e10cSrcweir     {
831*cdf0e10cSrcweir         uno::Reference<datatransfer::clipboard::XClipboard> aSelection(GetWindow()->GetPrimarySelection());
832*cdf0e10cSrcweir         Paste( aSelection );
833*cdf0e10cSrcweir         if ( mpImpl->mpTextEngine->IsModified() )
834*cdf0e10cSrcweir             mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) );
835*cdf0e10cSrcweir     }
836*cdf0e10cSrcweir     else if ( rMouseEvent.IsLeft() && GetSelection().HasRange() )
837*cdf0e10cSrcweir     {
838*cdf0e10cSrcweir         uno::Reference<datatransfer::clipboard::XClipboard> aSelection(GetWindow()->GetPrimarySelection());
839*cdf0e10cSrcweir         Copy( aSelection );
840*cdf0e10cSrcweir     }
841*cdf0e10cSrcweir }
842*cdf0e10cSrcweir 
843*cdf0e10cSrcweir void TextView::MouseButtonDown( const MouseEvent& rMouseEvent )
844*cdf0e10cSrcweir {
845*cdf0e10cSrcweir     mpImpl->mpTextEngine->CheckIdleFormatter();    // Falls schnelles Tippen und MouseButtonDown
846*cdf0e10cSrcweir     mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW;
847*cdf0e10cSrcweir     mpImpl->mbClickedInSelection = IsSelectionAtPoint( rMouseEvent.GetPosPixel() );
848*cdf0e10cSrcweir 
849*cdf0e10cSrcweir     mpImpl->mpTextEngine->SetActiveView( this );
850*cdf0e10cSrcweir 
851*cdf0e10cSrcweir     mpImpl->mpSelEngine->SelMouseButtonDown( rMouseEvent );
852*cdf0e10cSrcweir 
853*cdf0e10cSrcweir 	// mbu 20.01.2005 - SelMouseButtonDown() possibly triggers a 'selection changed'
854*cdf0e10cSrcweir 	// notification. The appropriate handler could change the current selection,
855*cdf0e10cSrcweir 	// which is the case in the MailMerge address block control. To enable select'n'drag
856*cdf0e10cSrcweir 	// we need to reevaluate the selection after the notification has been fired.
857*cdf0e10cSrcweir     mpImpl->mbClickedInSelection = IsSelectionAtPoint( rMouseEvent.GetPosPixel() );
858*cdf0e10cSrcweir 
859*cdf0e10cSrcweir 	// Sonderbehandlungen
860*cdf0e10cSrcweir 	if ( !rMouseEvent.IsShift() && ( rMouseEvent.GetClicks() >= 2 ) )
861*cdf0e10cSrcweir 	{
862*cdf0e10cSrcweir 		if ( rMouseEvent.IsMod2() )
863*cdf0e10cSrcweir 		{
864*cdf0e10cSrcweir 			HideSelection();
865*cdf0e10cSrcweir             ImpSetSelection( mpImpl->maSelection.GetEnd() );
866*cdf0e10cSrcweir 			SetCursorAtPoint( rMouseEvent.GetPosPixel() );	// Wird von SelectionEngine bei MOD2 nicht gesetzt
867*cdf0e10cSrcweir 		}
868*cdf0e10cSrcweir 
869*cdf0e10cSrcweir 		if ( rMouseEvent.GetClicks() == 2 )
870*cdf0e10cSrcweir 		{
871*cdf0e10cSrcweir 			// Wort selektieren
872*cdf0e10cSrcweir             if ( mpImpl->maSelection.GetEnd().GetIndex() < mpImpl->mpTextEngine->GetTextLen( mpImpl->maSelection.GetEnd().GetPara() ) )
873*cdf0e10cSrcweir 			{
874*cdf0e10cSrcweir 				HideSelection();
875*cdf0e10cSrcweir                 TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject(  mpImpl->maSelection.GetEnd().GetPara() );
876*cdf0e10cSrcweir                 uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator();
877*cdf0e10cSrcweir                 i18n::Boundary aBoundary = xBI->getWordBoundary( pNode->GetText(), mpImpl->maSelection.GetEnd().GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True );
878*cdf0e10cSrcweir                 TextSelection aNewSel( mpImpl->maSelection );
879*cdf0e10cSrcweir 				aNewSel.GetStart().GetIndex() = (sal_uInt16)aBoundary.startPos;
880*cdf0e10cSrcweir 				aNewSel.GetEnd().GetIndex() = (sal_uInt16)aBoundary.endPos;
881*cdf0e10cSrcweir                 if(mpImpl->mbSupportProtectAttribute)
882*cdf0e10cSrcweir                 {
883*cdf0e10cSrcweir                     //expand selection to include all protected content - if there is any
884*cdf0e10cSrcweir                     const TextCharAttrib* pStartAttr = mpImpl->mpTextEngine->FindCharAttrib(
885*cdf0e10cSrcweir                                 TextPaM(aNewSel.GetStart().GetPara(),
886*cdf0e10cSrcweir                                 (sal_uInt16)aBoundary.startPos),
887*cdf0e10cSrcweir                                 TEXTATTR_PROTECTED );
888*cdf0e10cSrcweir                     const TextCharAttrib* pEndAttr = mpImpl->mpTextEngine->FindCharAttrib(
889*cdf0e10cSrcweir                                 TextPaM(aNewSel.GetEnd().GetPara(),
890*cdf0e10cSrcweir                                 (sal_uInt16)aBoundary.endPos),
891*cdf0e10cSrcweir                                 TEXTATTR_PROTECTED );
892*cdf0e10cSrcweir                     if(pStartAttr && pStartAttr->GetStart() < aNewSel.GetStart().GetIndex())
893*cdf0e10cSrcweir                     {
894*cdf0e10cSrcweir                         aNewSel.GetStart().GetIndex() = pStartAttr->GetStart();
895*cdf0e10cSrcweir                     }
896*cdf0e10cSrcweir                     if(pEndAttr && pEndAttr->GetEnd() > aNewSel.GetEnd().GetIndex())
897*cdf0e10cSrcweir                     {
898*cdf0e10cSrcweir                         aNewSel.GetEnd().GetIndex() = pEndAttr->GetEnd();
899*cdf0e10cSrcweir                     }
900*cdf0e10cSrcweir                 }
901*cdf0e10cSrcweir                 ImpSetSelection( aNewSel );
902*cdf0e10cSrcweir 				ShowSelection();
903*cdf0e10cSrcweir 				ShowCursor( sal_True, sal_True );
904*cdf0e10cSrcweir 			}
905*cdf0e10cSrcweir 		}
906*cdf0e10cSrcweir 		else if ( rMouseEvent.GetClicks() == 3 )
907*cdf0e10cSrcweir 		{
908*cdf0e10cSrcweir 			// Absatz selektieren
909*cdf0e10cSrcweir             if ( mpImpl->maSelection.GetStart().GetIndex() || ( mpImpl->maSelection.GetEnd().GetIndex() < mpImpl->mpTextEngine->GetTextLen( mpImpl->maSelection.GetEnd().GetPara() ) ) )
910*cdf0e10cSrcweir 			{
911*cdf0e10cSrcweir 				HideSelection();
912*cdf0e10cSrcweir                 TextSelection aNewSel( mpImpl->maSelection );
913*cdf0e10cSrcweir 				aNewSel.GetStart().GetIndex() = 0;
914*cdf0e10cSrcweir                 aNewSel.GetEnd().GetIndex() = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( mpImpl->maSelection.GetEnd().GetPara() )->GetText().Len();
915*cdf0e10cSrcweir                 ImpSetSelection( aNewSel );
916*cdf0e10cSrcweir 				ShowSelection();
917*cdf0e10cSrcweir 				ShowCursor( sal_True, sal_True );
918*cdf0e10cSrcweir 			}
919*cdf0e10cSrcweir 		}
920*cdf0e10cSrcweir 	}
921*cdf0e10cSrcweir }
922*cdf0e10cSrcweir 
923*cdf0e10cSrcweir 
924*cdf0e10cSrcweir void TextView::MouseMove( const MouseEvent& rMouseEvent )
925*cdf0e10cSrcweir {
926*cdf0e10cSrcweir     mpImpl->mnTravelXPos = TRAVEL_X_DONTKNOW;
927*cdf0e10cSrcweir     mpImpl->mpSelEngine->SelMouseMove( rMouseEvent );
928*cdf0e10cSrcweir }
929*cdf0e10cSrcweir 
930*cdf0e10cSrcweir void TextView::Command( const CommandEvent& rCEvt )
931*cdf0e10cSrcweir {
932*cdf0e10cSrcweir     mpImpl->mpTextEngine->CheckIdleFormatter();    // Falls schnelles Tippen und MouseButtonDown
933*cdf0e10cSrcweir     mpImpl->mpTextEngine->SetActiveView( this );
934*cdf0e10cSrcweir 
935*cdf0e10cSrcweir 	if ( rCEvt.GetCommand() == COMMAND_STARTEXTTEXTINPUT )
936*cdf0e10cSrcweir 	{
937*cdf0e10cSrcweir 		DeleteSelected();
938*cdf0e10cSrcweir         delete mpImpl->mpTextEngine->mpIMEInfos;
939*cdf0e10cSrcweir         TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( GetSelection().GetEnd().GetPara() );
940*cdf0e10cSrcweir         mpImpl->mpTextEngine->mpIMEInfos = new TEIMEInfos( GetSelection().GetEnd(), pNode->GetText().Copy( GetSelection().GetEnd().GetIndex() ) );
941*cdf0e10cSrcweir         mpImpl->mpTextEngine->mpIMEInfos->bWasCursorOverwrite = !IsInsertMode();
942*cdf0e10cSrcweir 	}
943*cdf0e10cSrcweir 	else if ( rCEvt.GetCommand() == COMMAND_ENDEXTTEXTINPUT )
944*cdf0e10cSrcweir 	{
945*cdf0e10cSrcweir         DBG_ASSERT( mpImpl->mpTextEngine->mpIMEInfos, "COMMAND_ENDEXTTEXTINPUT => Kein Start ?" );
946*cdf0e10cSrcweir         if( mpImpl->mpTextEngine->mpIMEInfos )
947*cdf0e10cSrcweir 		{
948*cdf0e10cSrcweir             TEParaPortion* pPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetPara() );
949*cdf0e10cSrcweir             pPortion->MarkSelectionInvalid( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex(), 0 );
950*cdf0e10cSrcweir 
951*cdf0e10cSrcweir             sal_Bool bInsertMode = !mpImpl->mpTextEngine->mpIMEInfos->bWasCursorOverwrite;
952*cdf0e10cSrcweir 
953*cdf0e10cSrcweir             delete mpImpl->mpTextEngine->mpIMEInfos;
954*cdf0e10cSrcweir             mpImpl->mpTextEngine->mpIMEInfos = NULL;
955*cdf0e10cSrcweir 
956*cdf0e10cSrcweir             mpImpl->mpTextEngine->FormatAndUpdate( this );
957*cdf0e10cSrcweir 
958*cdf0e10cSrcweir 			SetInsertMode( bInsertMode );
959*cdf0e10cSrcweir 
960*cdf0e10cSrcweir             if ( mpImpl->mpTextEngine->IsModified() )
961*cdf0e10cSrcweir                 mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) );
962*cdf0e10cSrcweir 		}
963*cdf0e10cSrcweir 	}
964*cdf0e10cSrcweir 	else if ( rCEvt.GetCommand() == COMMAND_EXTTEXTINPUT )
965*cdf0e10cSrcweir 	{
966*cdf0e10cSrcweir         DBG_ASSERT( mpImpl->mpTextEngine->mpIMEInfos, "COMMAND_EXTTEXTINPUT => Kein Start ?" );
967*cdf0e10cSrcweir         if( mpImpl->mpTextEngine->mpIMEInfos )
968*cdf0e10cSrcweir 		{
969*cdf0e10cSrcweir 			const CommandExtTextInputData* pData = rCEvt.GetExtTextInputData();
970*cdf0e10cSrcweir 
971*cdf0e10cSrcweir 			if ( !pData->IsOnlyCursorChanged() )
972*cdf0e10cSrcweir 			{
973*cdf0e10cSrcweir                 TextSelection aSelect( mpImpl->mpTextEngine->mpIMEInfos->aPos );
974*cdf0e10cSrcweir                 aSelect.GetEnd().GetIndex() = aSelect.GetEnd().GetIndex() + mpImpl->mpTextEngine->mpIMEInfos->nLen;
975*cdf0e10cSrcweir                 aSelect = mpImpl->mpTextEngine->ImpDeleteText( aSelect );
976*cdf0e10cSrcweir                 aSelect = mpImpl->mpTextEngine->ImpInsertText( aSelect, pData->GetText() );
977*cdf0e10cSrcweir 
978*cdf0e10cSrcweir                 if ( mpImpl->mpTextEngine->mpIMEInfos->bWasCursorOverwrite )
979*cdf0e10cSrcweir                 {
980*cdf0e10cSrcweir                     sal_uInt16 nOldIMETextLen = mpImpl->mpTextEngine->mpIMEInfos->nLen;
981*cdf0e10cSrcweir                     sal_uInt16 nNewIMETextLen = pData->GetText().Len();
982*cdf0e10cSrcweir 
983*cdf0e10cSrcweir                     if ( ( nOldIMETextLen > nNewIMETextLen ) &&
984*cdf0e10cSrcweir                          ( nNewIMETextLen < mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Len() ) )
985*cdf0e10cSrcweir                     {
986*cdf0e10cSrcweir                         // restore old characters
987*cdf0e10cSrcweir                         sal_uInt16 nRestore = nOldIMETextLen - nNewIMETextLen;
988*cdf0e10cSrcweir                         TextPaM aPaM( mpImpl->mpTextEngine->mpIMEInfos->aPos );
989*cdf0e10cSrcweir                         aPaM.GetIndex() = aPaM.GetIndex() + nNewIMETextLen;
990*cdf0e10cSrcweir                         mpImpl->mpTextEngine->ImpInsertText( aPaM, mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Copy( nNewIMETextLen, nRestore ) );
991*cdf0e10cSrcweir                     }
992*cdf0e10cSrcweir                     else if ( ( nOldIMETextLen < nNewIMETextLen ) &&
993*cdf0e10cSrcweir                               ( nOldIMETextLen < mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Len() ) )
994*cdf0e10cSrcweir                     {
995*cdf0e10cSrcweir                         // overwrite
996*cdf0e10cSrcweir                         sal_uInt16 nOverwrite = nNewIMETextLen - nOldIMETextLen;
997*cdf0e10cSrcweir                         if ( ( nOldIMETextLen + nOverwrite ) > mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Len() )
998*cdf0e10cSrcweir                             nOverwrite = mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.Len() - nOldIMETextLen;
999*cdf0e10cSrcweir                         DBG_ASSERT( nOverwrite && (nOverwrite < 0xFF00), "IME Overwrite?!" );
1000*cdf0e10cSrcweir                         TextPaM aPaM( mpImpl->mpTextEngine->mpIMEInfos->aPos );
1001*cdf0e10cSrcweir                         aPaM.GetIndex() = aPaM.GetIndex() + nNewIMETextLen;
1002*cdf0e10cSrcweir                         TextSelection aSel( aPaM );
1003*cdf0e10cSrcweir                         aSel.GetEnd().GetIndex() =
1004*cdf0e10cSrcweir                             aSel.GetEnd().GetIndex() + nOverwrite;
1005*cdf0e10cSrcweir                         mpImpl->mpTextEngine->ImpDeleteText( aSel );
1006*cdf0e10cSrcweir                     }
1007*cdf0e10cSrcweir                 }
1008*cdf0e10cSrcweir 
1009*cdf0e10cSrcweir 			    if ( pData->GetTextAttr() )
1010*cdf0e10cSrcweir 			    {
1011*cdf0e10cSrcweir                     mpImpl->mpTextEngine->mpIMEInfos->CopyAttribs( pData->GetTextAttr(), pData->GetText().Len() );
1012*cdf0e10cSrcweir                     mpImpl->mpTextEngine->mpIMEInfos->bCursor = pData->IsCursorVisible();
1013*cdf0e10cSrcweir 			    }
1014*cdf0e10cSrcweir 			    else
1015*cdf0e10cSrcweir 			    {
1016*cdf0e10cSrcweir                     mpImpl->mpTextEngine->mpIMEInfos->DestroyAttribs();
1017*cdf0e10cSrcweir 			    }
1018*cdf0e10cSrcweir 
1019*cdf0e10cSrcweir                 TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetPara() );
1020*cdf0e10cSrcweir                 pPPortion->MarkSelectionInvalid( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex(), 0 );
1021*cdf0e10cSrcweir                 mpImpl->mpTextEngine->FormatAndUpdate( this );
1022*cdf0e10cSrcweir             }
1023*cdf0e10cSrcweir 
1024*cdf0e10cSrcweir             TextSelection aNewSel = TextPaM( mpImpl->mpTextEngine->mpIMEInfos->aPos.GetPara(), mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex()+pData->GetCursorPos() );
1025*cdf0e10cSrcweir 			SetSelection( aNewSel );
1026*cdf0e10cSrcweir 			SetInsertMode( !pData->IsCursorOverwrite() );
1027*cdf0e10cSrcweir 
1028*cdf0e10cSrcweir 			if ( pData->IsCursorVisible() )
1029*cdf0e10cSrcweir 				ShowCursor();
1030*cdf0e10cSrcweir 			else
1031*cdf0e10cSrcweir 				HideCursor();
1032*cdf0e10cSrcweir 		}
1033*cdf0e10cSrcweir 	}
1034*cdf0e10cSrcweir 	else if ( rCEvt.GetCommand() == COMMAND_CURSORPOS )
1035*cdf0e10cSrcweir 	{
1036*cdf0e10cSrcweir         if ( mpImpl->mpTextEngine->mpIMEInfos && mpImpl->mpTextEngine->mpIMEInfos->nLen )
1037*cdf0e10cSrcweir 		{
1038*cdf0e10cSrcweir 			TextPaM aPaM( GetSelection().GetEnd() );
1039*cdf0e10cSrcweir             Rectangle aR1 = mpImpl->mpTextEngine->PaMtoEditCursor( aPaM );
1040*cdf0e10cSrcweir 
1041*cdf0e10cSrcweir             sal_uInt16 nInputEnd = mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex() + mpImpl->mpTextEngine->mpIMEInfos->nLen;
1042*cdf0e10cSrcweir 
1043*cdf0e10cSrcweir             if ( !mpImpl->mpTextEngine->IsFormatted() )
1044*cdf0e10cSrcweir                 mpImpl->mpTextEngine->FormatDoc();
1045*cdf0e10cSrcweir 
1046*cdf0e10cSrcweir             TEParaPortion* pParaPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() );
1047*cdf0e10cSrcweir 			sal_uInt16 nLine = pParaPortion->GetLineNumber( aPaM.GetIndex(), sal_True );
1048*cdf0e10cSrcweir 			TextLine* pLine = pParaPortion->GetLines().GetObject( nLine );
1049*cdf0e10cSrcweir 			if ( pLine && ( nInputEnd > pLine->GetEnd() ) )
1050*cdf0e10cSrcweir 				nInputEnd = pLine->GetEnd();
1051*cdf0e10cSrcweir             Rectangle aR2 = mpImpl->mpTextEngine->PaMtoEditCursor( TextPaM( aPaM.GetPara(), nInputEnd ) );
1052*cdf0e10cSrcweir 
1053*cdf0e10cSrcweir 			long nWidth = aR2.Left()-aR1.Right();
1054*cdf0e10cSrcweir 			aR1.Move( -GetStartDocPos().X(), -GetStartDocPos().Y() );
1055*cdf0e10cSrcweir 			GetWindow()->SetCursorRect( &aR1, nWidth );
1056*cdf0e10cSrcweir 		}
1057*cdf0e10cSrcweir 		else
1058*cdf0e10cSrcweir 		{
1059*cdf0e10cSrcweir 			GetWindow()->SetCursorRect();
1060*cdf0e10cSrcweir 		}
1061*cdf0e10cSrcweir 	}
1062*cdf0e10cSrcweir 	else
1063*cdf0e10cSrcweir 	{
1064*cdf0e10cSrcweir         mpImpl->mpSelEngine->Command( rCEvt );
1065*cdf0e10cSrcweir 	}
1066*cdf0e10cSrcweir }
1067*cdf0e10cSrcweir 
1068*cdf0e10cSrcweir void TextView::ShowCursor( sal_Bool bGotoCursor, sal_Bool bForceVisCursor )
1069*cdf0e10cSrcweir {
1070*cdf0e10cSrcweir 	// Die Einstellung hat mehr Gewicht:
1071*cdf0e10cSrcweir     if ( !mpImpl->mbAutoScroll )
1072*cdf0e10cSrcweir 		bGotoCursor = sal_False;
1073*cdf0e10cSrcweir 	ImpShowCursor( bGotoCursor, bForceVisCursor, sal_False );
1074*cdf0e10cSrcweir }
1075*cdf0e10cSrcweir 
1076*cdf0e10cSrcweir void TextView::HideCursor()
1077*cdf0e10cSrcweir {
1078*cdf0e10cSrcweir     mpImpl->mpCursor->Hide();
1079*cdf0e10cSrcweir }
1080*cdf0e10cSrcweir 
1081*cdf0e10cSrcweir void TextView::Scroll( long ndX, long ndY )
1082*cdf0e10cSrcweir {
1083*cdf0e10cSrcweir     DBG_ASSERT( mpImpl->mpTextEngine->IsFormatted(), "Scroll: Nicht formatiert!" );
1084*cdf0e10cSrcweir 
1085*cdf0e10cSrcweir 	if ( !ndX && !ndY )
1086*cdf0e10cSrcweir 		return;
1087*cdf0e10cSrcweir 
1088*cdf0e10cSrcweir     Point aNewStartPos( mpImpl->maStartDocPos );
1089*cdf0e10cSrcweir 
1090*cdf0e10cSrcweir 	// Vertical:
1091*cdf0e10cSrcweir 	aNewStartPos.Y() -= ndY;
1092*cdf0e10cSrcweir 	if ( aNewStartPos.Y() < 0 )
1093*cdf0e10cSrcweir 		aNewStartPos.Y() = 0;
1094*cdf0e10cSrcweir 
1095*cdf0e10cSrcweir 	// Horizontal:
1096*cdf0e10cSrcweir 	aNewStartPos.X() -= ndX;
1097*cdf0e10cSrcweir 	if ( aNewStartPos.X() < 0 )
1098*cdf0e10cSrcweir 		aNewStartPos.X() = 0;
1099*cdf0e10cSrcweir 
1100*cdf0e10cSrcweir     long nDiffX = mpImpl->maStartDocPos.X() - aNewStartPos.X();
1101*cdf0e10cSrcweir     long nDiffY = mpImpl->maStartDocPos.Y() - aNewStartPos.Y();
1102*cdf0e10cSrcweir 
1103*cdf0e10cSrcweir 	if ( nDiffX || nDiffY )
1104*cdf0e10cSrcweir 	{
1105*cdf0e10cSrcweir         sal_Bool bVisCursor = mpImpl->mpCursor->IsVisible();
1106*cdf0e10cSrcweir         mpImpl->mpCursor->Hide();
1107*cdf0e10cSrcweir         mpImpl->mpWindow->Update();
1108*cdf0e10cSrcweir         mpImpl->maStartDocPos = aNewStartPos;
1109*cdf0e10cSrcweir 
1110*cdf0e10cSrcweir         if ( mpImpl->mpTextEngine->IsRightToLeft() )
1111*cdf0e10cSrcweir             nDiffX = -nDiffX;
1112*cdf0e10cSrcweir         mpImpl->mpWindow->Scroll( nDiffX, nDiffY );
1113*cdf0e10cSrcweir         mpImpl->mpWindow->Update();
1114*cdf0e10cSrcweir         mpImpl->mpCursor->SetPos( mpImpl->mpCursor->GetPos() + Point( nDiffX, nDiffY ) );
1115*cdf0e10cSrcweir         if ( bVisCursor && !mpImpl->mbReadOnly )
1116*cdf0e10cSrcweir             mpImpl->mpCursor->Show();
1117*cdf0e10cSrcweir 	}
1118*cdf0e10cSrcweir 
1119*cdf0e10cSrcweir     mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_VIEWSCROLLED ) );
1120*cdf0e10cSrcweir }
1121*cdf0e10cSrcweir 
1122*cdf0e10cSrcweir void TextView::Undo()
1123*cdf0e10cSrcweir {
1124*cdf0e10cSrcweir     mpImpl->mpTextEngine->SetActiveView( this );
1125*cdf0e10cSrcweir     mpImpl->mpTextEngine->GetUndoManager().Undo();
1126*cdf0e10cSrcweir }
1127*cdf0e10cSrcweir 
1128*cdf0e10cSrcweir void TextView::Redo()
1129*cdf0e10cSrcweir {
1130*cdf0e10cSrcweir     mpImpl->mpTextEngine->SetActiveView( this );
1131*cdf0e10cSrcweir     mpImpl->mpTextEngine->GetUndoManager().Redo();
1132*cdf0e10cSrcweir }
1133*cdf0e10cSrcweir 
1134*cdf0e10cSrcweir void TextView::Cut()
1135*cdf0e10cSrcweir {
1136*cdf0e10cSrcweir     mpImpl->mpTextEngine->UndoActionStart();
1137*cdf0e10cSrcweir 	Copy();
1138*cdf0e10cSrcweir 	DeleteSelected();
1139*cdf0e10cSrcweir     mpImpl->mpTextEngine->UndoActionEnd();
1140*cdf0e10cSrcweir }
1141*cdf0e10cSrcweir 
1142*cdf0e10cSrcweir void TextView::Copy( uno::Reference< datatransfer::clipboard::XClipboard >& rxClipboard )
1143*cdf0e10cSrcweir {
1144*cdf0e10cSrcweir 	if ( rxClipboard.is() )
1145*cdf0e10cSrcweir 	{
1146*cdf0e10cSrcweir 		TETextDataObject* pDataObj = new TETextDataObject( GetSelected() );
1147*cdf0e10cSrcweir 
1148*cdf0e10cSrcweir         if ( mpImpl->mpTextEngine->HasAttrib( TEXTATTR_HYPERLINK ) )  // Dann auch als HTML
1149*cdf0e10cSrcweir             mpImpl->mpTextEngine->Write( pDataObj->GetHTMLStream(), &mpImpl->maSelection, sal_True );
1150*cdf0e10cSrcweir 
1151*cdf0e10cSrcweir 		const sal_uInt32 nRef = Application::ReleaseSolarMutex();
1152*cdf0e10cSrcweir 
1153*cdf0e10cSrcweir         try
1154*cdf0e10cSrcweir 		{
1155*cdf0e10cSrcweir 		    rxClipboard->setContents( pDataObj, NULL );
1156*cdf0e10cSrcweir 
1157*cdf0e10cSrcweir             uno::Reference< datatransfer::clipboard::XFlushableClipboard > xFlushableClipboard( rxClipboard, uno::UNO_QUERY );
1158*cdf0e10cSrcweir 		    if( xFlushableClipboard.is() )
1159*cdf0e10cSrcweir 			    xFlushableClipboard->flushClipboard();
1160*cdf0e10cSrcweir 		}
1161*cdf0e10cSrcweir 		catch( const ::com::sun::star::uno::Exception& )
1162*cdf0e10cSrcweir 		{
1163*cdf0e10cSrcweir 		}
1164*cdf0e10cSrcweir 
1165*cdf0e10cSrcweir 		Application::AcquireSolarMutex( nRef );
1166*cdf0e10cSrcweir 	}
1167*cdf0e10cSrcweir }
1168*cdf0e10cSrcweir 
1169*cdf0e10cSrcweir void TextView::Copy()
1170*cdf0e10cSrcweir {
1171*cdf0e10cSrcweir     uno::Reference<datatransfer::clipboard::XClipboard> aClipboard(GetWindow()->GetClipboard());
1172*cdf0e10cSrcweir     Copy( aClipboard );
1173*cdf0e10cSrcweir }
1174*cdf0e10cSrcweir 
1175*cdf0e10cSrcweir void TextView::Paste( uno::Reference< datatransfer::clipboard::XClipboard >& rxClipboard )
1176*cdf0e10cSrcweir {
1177*cdf0e10cSrcweir 	if ( rxClipboard.is() )
1178*cdf0e10cSrcweir 	{
1179*cdf0e10cSrcweir         uno::Reference< datatransfer::XTransferable > xDataObj;
1180*cdf0e10cSrcweir 
1181*cdf0e10cSrcweir         const sal_uInt32 nRef = Application::ReleaseSolarMutex();
1182*cdf0e10cSrcweir 
1183*cdf0e10cSrcweir         try
1184*cdf0e10cSrcweir 		{
1185*cdf0e10cSrcweir 		    xDataObj = rxClipboard->getContents();
1186*cdf0e10cSrcweir 		}
1187*cdf0e10cSrcweir 		catch( const ::com::sun::star::uno::Exception& )
1188*cdf0e10cSrcweir 		{
1189*cdf0e10cSrcweir 		}
1190*cdf0e10cSrcweir 
1191*cdf0e10cSrcweir         Application::AcquireSolarMutex( nRef );
1192*cdf0e10cSrcweir 
1193*cdf0e10cSrcweir         if ( xDataObj.is() )
1194*cdf0e10cSrcweir 		{
1195*cdf0e10cSrcweir 			datatransfer::DataFlavor aFlavor;
1196*cdf0e10cSrcweir 			SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
1197*cdf0e10cSrcweir 			if ( xDataObj->isDataFlavorSupported( aFlavor ) )
1198*cdf0e10cSrcweir 			{
1199*cdf0e10cSrcweir                 try
1200*cdf0e10cSrcweir                 {
1201*cdf0e10cSrcweir                     uno::Any aData = xDataObj->getTransferData( aFlavor );
1202*cdf0e10cSrcweir                     ::rtl::OUString aText;
1203*cdf0e10cSrcweir                     aData >>= aText;
1204*cdf0e10cSrcweir                     bool bWasTruncated = false;
1205*cdf0e10cSrcweir                     if( mpImpl->mpTextEngine->GetMaxTextLen() != 0 )
1206*cdf0e10cSrcweir                         bWasTruncated = ImplTruncateNewText( aText );
1207*cdf0e10cSrcweir                     InsertNewText( aText, sal_False );
1208*cdf0e10cSrcweir                     mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) );
1209*cdf0e10cSrcweir 
1210*cdf0e10cSrcweir                     if( bWasTruncated )
1211*cdf0e10cSrcweir                         Edit::ShowTruncationWarning( mpImpl->mpWindow );
1212*cdf0e10cSrcweir                 }
1213*cdf0e10cSrcweir                 catch( const ::com::sun::star::datatransfer::UnsupportedFlavorException& )
1214*cdf0e10cSrcweir                 {
1215*cdf0e10cSrcweir                 }
1216*cdf0e10cSrcweir 			}
1217*cdf0e10cSrcweir 		}
1218*cdf0e10cSrcweir 	}
1219*cdf0e10cSrcweir }
1220*cdf0e10cSrcweir 
1221*cdf0e10cSrcweir void TextView::Paste()
1222*cdf0e10cSrcweir {
1223*cdf0e10cSrcweir     uno::Reference<datatransfer::clipboard::XClipboard> aClipboard(GetWindow()->GetClipboard());
1224*cdf0e10cSrcweir     Paste( aClipboard );
1225*cdf0e10cSrcweir }
1226*cdf0e10cSrcweir 
1227*cdf0e10cSrcweir String TextView::GetSelected()
1228*cdf0e10cSrcweir {
1229*cdf0e10cSrcweir     return GetSelected( GetSystemLineEnd() );
1230*cdf0e10cSrcweir }
1231*cdf0e10cSrcweir 
1232*cdf0e10cSrcweir String TextView::GetSelected( LineEnd aSeparator )
1233*cdf0e10cSrcweir {
1234*cdf0e10cSrcweir     return mpImpl->mpTextEngine->GetText( mpImpl->maSelection, aSeparator );
1235*cdf0e10cSrcweir }
1236*cdf0e10cSrcweir 
1237*cdf0e10cSrcweir void TextView::SetInsertMode( sal_Bool bInsert )
1238*cdf0e10cSrcweir {
1239*cdf0e10cSrcweir     if ( mpImpl->mbInsertMode != bInsert )
1240*cdf0e10cSrcweir 	{
1241*cdf0e10cSrcweir         mpImpl->mbInsertMode = bInsert;
1242*cdf0e10cSrcweir         ShowCursor( mpImpl->mbAutoScroll, sal_False );
1243*cdf0e10cSrcweir 	}
1244*cdf0e10cSrcweir }
1245*cdf0e10cSrcweir 
1246*cdf0e10cSrcweir void TextView::SetReadOnly( sal_Bool bReadOnly )
1247*cdf0e10cSrcweir {
1248*cdf0e10cSrcweir     if ( mpImpl->mbReadOnly != bReadOnly )
1249*cdf0e10cSrcweir 	{
1250*cdf0e10cSrcweir         mpImpl->mbReadOnly = bReadOnly;
1251*cdf0e10cSrcweir         if ( !mpImpl->mbReadOnly )
1252*cdf0e10cSrcweir             ShowCursor( mpImpl->mbAutoScroll, sal_False );
1253*cdf0e10cSrcweir 		else
1254*cdf0e10cSrcweir 			HideCursor();
1255*cdf0e10cSrcweir 
1256*cdf0e10cSrcweir         GetWindow()->SetInputContext( InputContext( mpImpl->mpTextEngine->GetFont(), bReadOnly ? INPUTCONTEXT_TEXT|INPUTCONTEXT_EXTTEXTINPUT : 0 ) );
1257*cdf0e10cSrcweir 	}
1258*cdf0e10cSrcweir }
1259*cdf0e10cSrcweir 
1260*cdf0e10cSrcweir TextSelection TextView::ImpMoveCursor( const KeyEvent& rKeyEvent )
1261*cdf0e10cSrcweir {
1262*cdf0e10cSrcweir 	// Eigentlich nur bei Up/Down noetig, aber was solls.
1263*cdf0e10cSrcweir     mpImpl->mpTextEngine->CheckIdleFormatter();
1264*cdf0e10cSrcweir 
1265*cdf0e10cSrcweir     TextPaM aPaM( mpImpl->maSelection.GetEnd() );
1266*cdf0e10cSrcweir 	TextPaM aOldEnd( aPaM );
1267*cdf0e10cSrcweir 
1268*cdf0e10cSrcweir     TextDirectionality eTextDirection = TextDirectionality_LeftToRight_TopToBottom;
1269*cdf0e10cSrcweir     if ( mpImpl->mpTextEngine->IsRightToLeft() )
1270*cdf0e10cSrcweir         eTextDirection = TextDirectionality_RightToLeft_TopToBottom;
1271*cdf0e10cSrcweir 
1272*cdf0e10cSrcweir     KeyEvent aTranslatedKeyEvent = rKeyEvent.LogicalTextDirectionality( eTextDirection );
1273*cdf0e10cSrcweir 
1274*cdf0e10cSrcweir     sal_Bool bCtrl = aTranslatedKeyEvent.GetKeyCode().IsMod1() ? sal_True : sal_False;
1275*cdf0e10cSrcweir 	sal_uInt16 nCode = aTranslatedKeyEvent.GetKeyCode().GetCode();
1276*cdf0e10cSrcweir 
1277*cdf0e10cSrcweir     bool bSelect = aTranslatedKeyEvent.GetKeyCode().IsShift();
1278*cdf0e10cSrcweir 	switch ( nCode )
1279*cdf0e10cSrcweir 	{
1280*cdf0e10cSrcweir 		case KEY_UP:		aPaM = CursorUp( aPaM );
1281*cdf0e10cSrcweir 							break;
1282*cdf0e10cSrcweir 		case KEY_DOWN:		aPaM = CursorDown( aPaM );
1283*cdf0e10cSrcweir 							break;
1284*cdf0e10cSrcweir 		case KEY_HOME:		aPaM = bCtrl ? CursorStartOfDoc() : CursorStartOfLine( aPaM );
1285*cdf0e10cSrcweir 							break;
1286*cdf0e10cSrcweir 		case KEY_END:		aPaM = bCtrl ? CursorEndOfDoc() : CursorEndOfLine( aPaM );
1287*cdf0e10cSrcweir 							break;
1288*cdf0e10cSrcweir 		case KEY_PAGEUP:	aPaM = bCtrl ? CursorStartOfDoc() : PageUp( aPaM );
1289*cdf0e10cSrcweir 							break;
1290*cdf0e10cSrcweir 		case KEY_PAGEDOWN:	aPaM = bCtrl ? CursorEndOfDoc() : PageDown( aPaM );
1291*cdf0e10cSrcweir 							break;
1292*cdf0e10cSrcweir 		case KEY_LEFT:		aPaM = bCtrl ? CursorWordLeft( aPaM ) : CursorLeft( aPaM, aTranslatedKeyEvent.GetKeyCode().IsMod2() ? (sal_uInt16)i18n::CharacterIteratorMode::SKIPCHARACTER : (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL );
1293*cdf0e10cSrcweir 							break;
1294*cdf0e10cSrcweir 		case KEY_RIGHT: 	aPaM = bCtrl ? CursorWordRight( aPaM ) : CursorRight( aPaM, aTranslatedKeyEvent.GetKeyCode().IsMod2() ? (sal_uInt16)i18n::CharacterIteratorMode::SKIPCHARACTER : (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL );
1295*cdf0e10cSrcweir 							break;
1296*cdf0e10cSrcweir         case com::sun::star::awt::Key::SELECT_WORD_FORWARD:
1297*cdf0e10cSrcweir                             bSelect = true; // fallthrough intentional
1298*cdf0e10cSrcweir         case com::sun::star::awt::Key::MOVE_WORD_FORWARD:
1299*cdf0e10cSrcweir                             aPaM = CursorWordRight( aPaM );
1300*cdf0e10cSrcweir                             break;
1301*cdf0e10cSrcweir         case com::sun::star::awt::Key::SELECT_WORD_BACKWARD:
1302*cdf0e10cSrcweir                             bSelect = true; // fallthrough intentional
1303*cdf0e10cSrcweir         case com::sun::star::awt::Key::MOVE_WORD_BACKWARD:
1304*cdf0e10cSrcweir                             aPaM = CursorWordLeft( aPaM );
1305*cdf0e10cSrcweir                             break;
1306*cdf0e10cSrcweir         case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE:
1307*cdf0e10cSrcweir                             bSelect = true; // fallthrough intentional
1308*cdf0e10cSrcweir         case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE:
1309*cdf0e10cSrcweir                             aPaM = CursorStartOfLine( aPaM );
1310*cdf0e10cSrcweir                             break;
1311*cdf0e10cSrcweir         case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE:
1312*cdf0e10cSrcweir                             bSelect = true; // fallthrough intentional
1313*cdf0e10cSrcweir         case com::sun::star::awt::Key::MOVE_TO_END_OF_LINE:
1314*cdf0e10cSrcweir                             aPaM = CursorEndOfLine( aPaM );
1315*cdf0e10cSrcweir                             break;
1316*cdf0e10cSrcweir         case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
1317*cdf0e10cSrcweir                             bSelect = true; // falltthrough intentional
1318*cdf0e10cSrcweir         case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
1319*cdf0e10cSrcweir                             aPaM = CursorStartOfParagraph( aPaM );
1320*cdf0e10cSrcweir                             break;
1321*cdf0e10cSrcweir         case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
1322*cdf0e10cSrcweir                             bSelect = true; // falltthrough intentional
1323*cdf0e10cSrcweir         case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
1324*cdf0e10cSrcweir                             aPaM = CursorEndOfParagraph( aPaM );
1325*cdf0e10cSrcweir                             break;
1326*cdf0e10cSrcweir         case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
1327*cdf0e10cSrcweir                             bSelect = true; // falltthrough intentional
1328*cdf0e10cSrcweir         case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
1329*cdf0e10cSrcweir                             aPaM = CursorStartOfDoc();
1330*cdf0e10cSrcweir                             break;
1331*cdf0e10cSrcweir         case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT:
1332*cdf0e10cSrcweir                             bSelect = true; // falltthrough intentional
1333*cdf0e10cSrcweir         case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT:
1334*cdf0e10cSrcweir                             aPaM = CursorEndOfDoc();
1335*cdf0e10cSrcweir                             break;
1336*cdf0e10cSrcweir 	}
1337*cdf0e10cSrcweir 
1338*cdf0e10cSrcweir 	// Bewirkt evtl. ein CreateAnchor oder Deselection all
1339*cdf0e10cSrcweir     mpImpl->mpSelEngine->CursorPosChanging( bSelect, aTranslatedKeyEvent.GetKeyCode().IsMod1() );
1340*cdf0e10cSrcweir 
1341*cdf0e10cSrcweir 	if ( aOldEnd != aPaM )
1342*cdf0e10cSrcweir 	{
1343*cdf0e10cSrcweir         mpImpl->mpTextEngine->CursorMoved( aOldEnd.GetPara() );
1344*cdf0e10cSrcweir 
1345*cdf0e10cSrcweir 
1346*cdf0e10cSrcweir         TextSelection aOldSelection( mpImpl->maSelection );
1347*cdf0e10cSrcweir         TextSelection aNewSelection( mpImpl->maSelection );
1348*cdf0e10cSrcweir 		aNewSelection.GetEnd() = aPaM;
1349*cdf0e10cSrcweir 		if ( bSelect )
1350*cdf0e10cSrcweir 		{
1351*cdf0e10cSrcweir 			// Dann wird die Selektion erweitert...
1352*cdf0e10cSrcweir             ImpSetSelection( aNewSelection );
1353*cdf0e10cSrcweir 			ShowSelection( TextSelection( aOldEnd, aPaM ) );
1354*cdf0e10cSrcweir 		}
1355*cdf0e10cSrcweir 		else
1356*cdf0e10cSrcweir 		{
1357*cdf0e10cSrcweir 			aNewSelection.GetStart() = aPaM;
1358*cdf0e10cSrcweir             ImpSetSelection( aNewSelection );
1359*cdf0e10cSrcweir 		}
1360*cdf0e10cSrcweir 	}
1361*cdf0e10cSrcweir 
1362*cdf0e10cSrcweir     return mpImpl->maSelection;
1363*cdf0e10cSrcweir }
1364*cdf0e10cSrcweir 
1365*cdf0e10cSrcweir void TextView::InsertText( const XubString& rStr, sal_Bool bSelect )
1366*cdf0e10cSrcweir {
1367*cdf0e10cSrcweir     InsertNewText( rStr, bSelect );
1368*cdf0e10cSrcweir }
1369*cdf0e10cSrcweir 
1370*cdf0e10cSrcweir void TextView::InsertNewText( const rtl::OUString& rStr, sal_Bool bSelect )
1371*cdf0e10cSrcweir {
1372*cdf0e10cSrcweir //	HideSelection();
1373*cdf0e10cSrcweir     mpImpl->mpTextEngine->UndoActionStart();
1374*cdf0e10cSrcweir 
1375*cdf0e10cSrcweir     /* #i87633#
1376*cdf0e10cSrcweir     break inserted text into chunks that fit into the underlying String
1377*cdf0e10cSrcweir     based API (which has a maximum length of 65534 elements
1378*cdf0e10cSrcweir 
1379*cdf0e10cSrcweir     note: this will of course still cause problems for lines longer than those
1380*cdf0e10cSrcweir     65534 elements, but those cases will hopefully be few.
1381*cdf0e10cSrcweir     In the long run someone should switch the TextEngine to OUString instead of String
1382*cdf0e10cSrcweir     */
1383*cdf0e10cSrcweir     sal_Int32 nLen = rStr.getLength();
1384*cdf0e10cSrcweir     sal_Int32 nPos = 0;
1385*cdf0e10cSrcweir     while( nLen )
1386*cdf0e10cSrcweir     {
1387*cdf0e10cSrcweir         sal_Int32 nChunkLen = nLen > 65534 ? 65534 : nLen;
1388*cdf0e10cSrcweir         String aChunk( rStr.copy( nPos, nChunkLen ) );
1389*cdf0e10cSrcweir 
1390*cdf0e10cSrcweir         TextSelection aNewSel( mpImpl->maSelection );
1391*cdf0e10cSrcweir 
1392*cdf0e10cSrcweir         TextPaM aPaM = mpImpl->mpTextEngine->ImpInsertText( mpImpl->maSelection, aChunk );
1393*cdf0e10cSrcweir 
1394*cdf0e10cSrcweir         if ( bSelect )
1395*cdf0e10cSrcweir         {
1396*cdf0e10cSrcweir             aNewSel.Justify();
1397*cdf0e10cSrcweir             aNewSel.GetEnd() = aPaM;
1398*cdf0e10cSrcweir         }
1399*cdf0e10cSrcweir         else
1400*cdf0e10cSrcweir         {
1401*cdf0e10cSrcweir             aNewSel = aPaM;
1402*cdf0e10cSrcweir         }
1403*cdf0e10cSrcweir 
1404*cdf0e10cSrcweir         ImpSetSelection( aNewSel );
1405*cdf0e10cSrcweir         nLen -= nChunkLen;
1406*cdf0e10cSrcweir         nPos += nChunkLen;
1407*cdf0e10cSrcweir     }
1408*cdf0e10cSrcweir     mpImpl->mpTextEngine->UndoActionEnd();
1409*cdf0e10cSrcweir 
1410*cdf0e10cSrcweir     mpImpl->mpTextEngine->FormatAndUpdate( this );
1411*cdf0e10cSrcweir }
1412*cdf0e10cSrcweir 
1413*cdf0e10cSrcweir /*
1414*cdf0e10cSrcweir void TextView::InsertText( const XubString& rStr, sal_Bool bSelect )
1415*cdf0e10cSrcweir {
1416*cdf0e10cSrcweir //	HideSelection();
1417*cdf0e10cSrcweir 
1418*cdf0e10cSrcweir     TextSelection aNewSel( mpImpl->maSelection );
1419*cdf0e10cSrcweir 
1420*cdf0e10cSrcweir     mpImpl->mpTextEngine->UndoActionStart();
1421*cdf0e10cSrcweir     TextPaM aPaM = mpImpl->mpTextEngine->ImpInsertText( mpImpl->maSelection, rStr );
1422*cdf0e10cSrcweir     mpImpl->mpTextEngine->UndoActionEnd();
1423*cdf0e10cSrcweir 
1424*cdf0e10cSrcweir 	if ( bSelect )
1425*cdf0e10cSrcweir 	{
1426*cdf0e10cSrcweir 		aNewSel.Justify();
1427*cdf0e10cSrcweir 		aNewSel.GetEnd() = aPaM;
1428*cdf0e10cSrcweir 	}
1429*cdf0e10cSrcweir 	else
1430*cdf0e10cSrcweir     {
1431*cdf0e10cSrcweir 		aNewSel = aPaM;
1432*cdf0e10cSrcweir     }
1433*cdf0e10cSrcweir 
1434*cdf0e10cSrcweir     ImpSetSelection( aNewSel );
1435*cdf0e10cSrcweir 
1436*cdf0e10cSrcweir     mpImpl->mpTextEngine->FormatAndUpdate( this );
1437*cdf0e10cSrcweir }
1438*cdf0e10cSrcweir */
1439*cdf0e10cSrcweir 
1440*cdf0e10cSrcweir // OLD
1441*cdf0e10cSrcweir TextPaM TextView::CursorLeft( const TextPaM& rPaM, sal_Bool bWordMode )
1442*cdf0e10cSrcweir {
1443*cdf0e10cSrcweir     return bWordMode ? CursorWordLeft( rPaM ) : CursorLeft( rPaM, (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL );
1444*cdf0e10cSrcweir 
1445*cdf0e10cSrcweir     // Remove (sal_uInt16) typecasts in this file when removing this method!
1446*cdf0e10cSrcweir }
1447*cdf0e10cSrcweir 
1448*cdf0e10cSrcweir // OLD
1449*cdf0e10cSrcweir TextPaM TextView::CursorRight( const TextPaM& rPaM, sal_Bool bWordMode )
1450*cdf0e10cSrcweir {
1451*cdf0e10cSrcweir     return bWordMode ? CursorWordRight( rPaM ) : CursorRight( rPaM, (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL );
1452*cdf0e10cSrcweir 
1453*cdf0e10cSrcweir     // Remove (sal_uInt16) typecasts in this file when removing this method!
1454*cdf0e10cSrcweir }
1455*cdf0e10cSrcweir 
1456*cdf0e10cSrcweir TextPaM TextView::CursorLeft( const TextPaM& rPaM, sal_uInt16 nCharacterIteratorMode )
1457*cdf0e10cSrcweir {
1458*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1459*cdf0e10cSrcweir 
1460*cdf0e10cSrcweir 	if ( aPaM.GetIndex() )
1461*cdf0e10cSrcweir 	{
1462*cdf0e10cSrcweir         TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() );
1463*cdf0e10cSrcweir         uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator();
1464*cdf0e10cSrcweir 		sal_Int32 nCount = 1;
1465*cdf0e10cSrcweir         aPaM.GetIndex() = (sal_uInt16)xBI->previousCharacters( pNode->GetText(), aPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), nCharacterIteratorMode, nCount, nCount );
1466*cdf0e10cSrcweir 	}
1467*cdf0e10cSrcweir 	else if ( aPaM.GetPara() )
1468*cdf0e10cSrcweir 	{
1469*cdf0e10cSrcweir 		aPaM.GetPara()--;
1470*cdf0e10cSrcweir         TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() );
1471*cdf0e10cSrcweir 		aPaM.GetIndex() = pNode->GetText().Len();
1472*cdf0e10cSrcweir 	}
1473*cdf0e10cSrcweir 	return aPaM;
1474*cdf0e10cSrcweir }
1475*cdf0e10cSrcweir 
1476*cdf0e10cSrcweir TextPaM TextView::CursorRight( const TextPaM& rPaM, sal_uInt16 nCharacterIteratorMode )
1477*cdf0e10cSrcweir {
1478*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1479*cdf0e10cSrcweir 
1480*cdf0e10cSrcweir     TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() );
1481*cdf0e10cSrcweir 	if ( aPaM.GetIndex() < pNode->GetText().Len() )
1482*cdf0e10cSrcweir 	{
1483*cdf0e10cSrcweir         uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator();
1484*cdf0e10cSrcweir 		sal_Int32 nCount = 1;
1485*cdf0e10cSrcweir         aPaM.GetIndex() = (sal_uInt16)xBI->nextCharacters( pNode->GetText(), aPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), nCharacterIteratorMode, nCount, nCount );
1486*cdf0e10cSrcweir 	}
1487*cdf0e10cSrcweir     else if ( aPaM.GetPara() < ( mpImpl->mpTextEngine->mpDoc->GetNodes().Count()-1) )
1488*cdf0e10cSrcweir 	{
1489*cdf0e10cSrcweir 		aPaM.GetPara()++;
1490*cdf0e10cSrcweir 		aPaM.GetIndex() = 0;
1491*cdf0e10cSrcweir 	}
1492*cdf0e10cSrcweir 
1493*cdf0e10cSrcweir 	return aPaM;
1494*cdf0e10cSrcweir }
1495*cdf0e10cSrcweir 
1496*cdf0e10cSrcweir 
1497*cdf0e10cSrcweir TextPaM TextView::CursorWordLeft( const TextPaM& rPaM )
1498*cdf0e10cSrcweir {
1499*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1500*cdf0e10cSrcweir 
1501*cdf0e10cSrcweir 	if ( aPaM.GetIndex() )
1502*cdf0e10cSrcweir 	{
1503*cdf0e10cSrcweir         TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() );
1504*cdf0e10cSrcweir         uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator();
1505*cdf0e10cSrcweir         i18n::Boundary aBoundary = xBI->getWordBoundary( pNode->GetText(), rPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True );
1506*cdf0e10cSrcweir 		if ( aBoundary.startPos >= rPaM.GetIndex() )
1507*cdf0e10cSrcweir             aBoundary = xBI->previousWord( pNode->GetText(), rPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES );
1508*cdf0e10cSrcweir 		aPaM.GetIndex() = ( aBoundary.startPos != -1 ) ? (sal_uInt16)aBoundary.startPos : 0;
1509*cdf0e10cSrcweir 	}
1510*cdf0e10cSrcweir 	else if ( aPaM.GetPara() )
1511*cdf0e10cSrcweir 	{
1512*cdf0e10cSrcweir 		aPaM.GetPara()--;
1513*cdf0e10cSrcweir         TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() );
1514*cdf0e10cSrcweir 		aPaM.GetIndex() = pNode->GetText().Len();
1515*cdf0e10cSrcweir 	}
1516*cdf0e10cSrcweir 	return aPaM;
1517*cdf0e10cSrcweir }
1518*cdf0e10cSrcweir 
1519*cdf0e10cSrcweir 
1520*cdf0e10cSrcweir TextPaM TextView::CursorWordRight( const TextPaM& rPaM )
1521*cdf0e10cSrcweir {
1522*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1523*cdf0e10cSrcweir 
1524*cdf0e10cSrcweir     TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() );
1525*cdf0e10cSrcweir 	if ( aPaM.GetIndex() < pNode->GetText().Len() )
1526*cdf0e10cSrcweir 	{
1527*cdf0e10cSrcweir         uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator();
1528*cdf0e10cSrcweir         i18n::Boundary aBoundary = xBI->nextWord(  pNode->GetText(), aPaM.GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES );
1529*cdf0e10cSrcweir 		aPaM.GetIndex() = (sal_uInt16)aBoundary.startPos;
1530*cdf0e10cSrcweir 	}
1531*cdf0e10cSrcweir     else if ( aPaM.GetPara() < ( mpImpl->mpTextEngine->mpDoc->GetNodes().Count()-1) )
1532*cdf0e10cSrcweir 	{
1533*cdf0e10cSrcweir 		aPaM.GetPara()++;
1534*cdf0e10cSrcweir 		aPaM.GetIndex() = 0;
1535*cdf0e10cSrcweir 	}
1536*cdf0e10cSrcweir 
1537*cdf0e10cSrcweir 	return aPaM;
1538*cdf0e10cSrcweir }
1539*cdf0e10cSrcweir 
1540*cdf0e10cSrcweir TextPaM TextView::ImpDelete( sal_uInt8 nMode, sal_uInt8 nDelMode )
1541*cdf0e10cSrcweir {
1542*cdf0e10cSrcweir     if ( mpImpl->maSelection.HasRange() )  // dann nur Sel. loeschen
1543*cdf0e10cSrcweir         return mpImpl->mpTextEngine->ImpDeleteText( mpImpl->maSelection );
1544*cdf0e10cSrcweir 
1545*cdf0e10cSrcweir     TextPaM aStartPaM = mpImpl->maSelection.GetStart();
1546*cdf0e10cSrcweir 	TextPaM aEndPaM = aStartPaM;
1547*cdf0e10cSrcweir 	if ( nMode == DEL_LEFT )
1548*cdf0e10cSrcweir 	{
1549*cdf0e10cSrcweir 		if ( nDelMode == DELMODE_SIMPLE )
1550*cdf0e10cSrcweir 		{
1551*cdf0e10cSrcweir 			aEndPaM = CursorLeft( aEndPaM, (sal_uInt16)i18n::CharacterIteratorMode::SKIPCHARACTER );
1552*cdf0e10cSrcweir 		}
1553*cdf0e10cSrcweir 		else if ( nDelMode == DELMODE_RESTOFWORD )
1554*cdf0e10cSrcweir 		{
1555*cdf0e10cSrcweir             TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject(  aEndPaM.GetPara() );
1556*cdf0e10cSrcweir             uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator();
1557*cdf0e10cSrcweir             i18n::Boundary aBoundary = xBI->getWordBoundary( pNode->GetText(), mpImpl->maSelection.GetEnd().GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True );
1558*cdf0e10cSrcweir             if ( aBoundary.startPos == mpImpl->maSelection.GetEnd().GetIndex() )
1559*cdf0e10cSrcweir                 aBoundary = xBI->previousWord( pNode->GetText(), mpImpl->maSelection.GetEnd().GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES );
1560*cdf0e10cSrcweir 			// #i63506# startPos is -1 when the paragraph starts with a tab
1561*cdf0e10cSrcweir 			aEndPaM.GetIndex() = (aBoundary.startPos >= 0) ? (sal_uInt16)aBoundary.startPos : 0;
1562*cdf0e10cSrcweir 		}
1563*cdf0e10cSrcweir 		else	// DELMODE_RESTOFCONTENT
1564*cdf0e10cSrcweir 		{
1565*cdf0e10cSrcweir 			if ( aEndPaM.GetIndex() != 0 )
1566*cdf0e10cSrcweir 				aEndPaM.GetIndex() = 0;
1567*cdf0e10cSrcweir 			else if ( aEndPaM.GetPara() )
1568*cdf0e10cSrcweir 			{
1569*cdf0e10cSrcweir 				// Absatz davor
1570*cdf0e10cSrcweir 				aEndPaM.GetPara()--;
1571*cdf0e10cSrcweir 				aEndPaM.GetIndex() = 0;
1572*cdf0e10cSrcweir 			}
1573*cdf0e10cSrcweir 		}
1574*cdf0e10cSrcweir 	}
1575*cdf0e10cSrcweir 	else
1576*cdf0e10cSrcweir 	{
1577*cdf0e10cSrcweir 		if ( nDelMode == DELMODE_SIMPLE )
1578*cdf0e10cSrcweir 		{
1579*cdf0e10cSrcweir 			aEndPaM = CursorRight( aEndPaM, (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL );
1580*cdf0e10cSrcweir 		}
1581*cdf0e10cSrcweir 		else if ( nDelMode == DELMODE_RESTOFWORD )
1582*cdf0e10cSrcweir 		{
1583*cdf0e10cSrcweir             TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject(  aEndPaM.GetPara() );
1584*cdf0e10cSrcweir             uno::Reference < i18n::XBreakIterator > xBI = mpImpl->mpTextEngine->GetBreakIterator();
1585*cdf0e10cSrcweir             i18n::Boundary aBoundary = xBI->nextWord( pNode->GetText(), mpImpl->maSelection.GetEnd().GetIndex(), mpImpl->mpTextEngine->GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES );
1586*cdf0e10cSrcweir 			aEndPaM.GetIndex() = (sal_uInt16)aBoundary.startPos;
1587*cdf0e10cSrcweir 		}
1588*cdf0e10cSrcweir 		else	// DELMODE_RESTOFCONTENT
1589*cdf0e10cSrcweir 		{
1590*cdf0e10cSrcweir             TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aEndPaM.GetPara() );
1591*cdf0e10cSrcweir 			if ( aEndPaM.GetIndex() < pNode->GetText().Len() )
1592*cdf0e10cSrcweir 				aEndPaM.GetIndex() = pNode->GetText().Len();
1593*cdf0e10cSrcweir             else if ( aEndPaM.GetPara() < ( mpImpl->mpTextEngine->mpDoc->GetNodes().Count() - 1 ) )
1594*cdf0e10cSrcweir 			{
1595*cdf0e10cSrcweir 				// Absatz danach
1596*cdf0e10cSrcweir 				aEndPaM.GetPara()++;
1597*cdf0e10cSrcweir                 TextNode* pNextNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aEndPaM.GetPara() );
1598*cdf0e10cSrcweir 				aEndPaM.GetIndex() = pNextNode->GetText().Len();
1599*cdf0e10cSrcweir 			}
1600*cdf0e10cSrcweir 		}
1601*cdf0e10cSrcweir 	}
1602*cdf0e10cSrcweir 
1603*cdf0e10cSrcweir     return mpImpl->mpTextEngine->ImpDeleteText( TextSelection( aStartPaM, aEndPaM ) );
1604*cdf0e10cSrcweir }
1605*cdf0e10cSrcweir 
1606*cdf0e10cSrcweir 
1607*cdf0e10cSrcweir 
1608*cdf0e10cSrcweir TextPaM TextView::CursorUp( const TextPaM& rPaM )
1609*cdf0e10cSrcweir {
1610*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1611*cdf0e10cSrcweir 
1612*cdf0e10cSrcweir 	long nX;
1613*cdf0e10cSrcweir     if ( mpImpl->mnTravelXPos == TRAVEL_X_DONTKNOW )
1614*cdf0e10cSrcweir 	{
1615*cdf0e10cSrcweir         nX = mpImpl->mpTextEngine->GetEditCursor( rPaM, sal_False ).Left();
1616*cdf0e10cSrcweir         mpImpl->mnTravelXPos = (sal_uInt16)nX+1;
1617*cdf0e10cSrcweir 	}
1618*cdf0e10cSrcweir 	else
1619*cdf0e10cSrcweir         nX = mpImpl->mnTravelXPos;
1620*cdf0e10cSrcweir 
1621*cdf0e10cSrcweir     TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( rPaM.GetPara() );
1622*cdf0e10cSrcweir 	sal_uInt16 nLine = pPPortion->GetLineNumber( rPaM.GetIndex(), sal_False );
1623*cdf0e10cSrcweir 	if ( nLine )	// gleicher Absatz
1624*cdf0e10cSrcweir 	{
1625*cdf0e10cSrcweir         sal_uInt16 nCharPos = mpImpl->mpTextEngine->GetCharPos( rPaM.GetPara(), nLine-1, nX );
1626*cdf0e10cSrcweir 		aPaM.GetIndex() = nCharPos;
1627*cdf0e10cSrcweir 		// Wenn davor eine autom.Umgebrochene Zeile, und ich muss genau an das
1628*cdf0e10cSrcweir 		// Ende dieser Zeile, landet der Cursor in der aktuellen Zeile am Anfang
1629*cdf0e10cSrcweir 		// Siehe Problem: Letztes Zeichen einer autom.umgebr. Zeile = Cursor
1630*cdf0e10cSrcweir 		TextLine* pLine = pPPortion->GetLines().GetObject( nLine - 1 );
1631*cdf0e10cSrcweir 		if ( aPaM.GetIndex() && ( aPaM.GetIndex() == pLine->GetEnd() ) )
1632*cdf0e10cSrcweir 			aPaM.GetIndex()--;
1633*cdf0e10cSrcweir 	}
1634*cdf0e10cSrcweir 	else if ( rPaM.GetPara() )	// vorheriger Absatz
1635*cdf0e10cSrcweir 	{
1636*cdf0e10cSrcweir 		aPaM.GetPara()--;
1637*cdf0e10cSrcweir         pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() );
1638*cdf0e10cSrcweir 		sal_uInt16 nL = pPPortion->GetLines().Count() - 1;
1639*cdf0e10cSrcweir         sal_uInt16 nCharPos = mpImpl->mpTextEngine->GetCharPos( aPaM.GetPara(), nL, nX+1 );
1640*cdf0e10cSrcweir 		aPaM.GetIndex() = nCharPos;
1641*cdf0e10cSrcweir 	}
1642*cdf0e10cSrcweir 
1643*cdf0e10cSrcweir 	return aPaM;
1644*cdf0e10cSrcweir }
1645*cdf0e10cSrcweir 
1646*cdf0e10cSrcweir TextPaM TextView::CursorDown( const TextPaM& rPaM )
1647*cdf0e10cSrcweir {
1648*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1649*cdf0e10cSrcweir 
1650*cdf0e10cSrcweir 	long nX;
1651*cdf0e10cSrcweir     if ( mpImpl->mnTravelXPos == TRAVEL_X_DONTKNOW )
1652*cdf0e10cSrcweir 	{
1653*cdf0e10cSrcweir         nX = mpImpl->mpTextEngine->GetEditCursor( rPaM, sal_False ).Left();
1654*cdf0e10cSrcweir         mpImpl->mnTravelXPos = (sal_uInt16)nX+1;
1655*cdf0e10cSrcweir 	}
1656*cdf0e10cSrcweir 	else
1657*cdf0e10cSrcweir         nX = mpImpl->mnTravelXPos;
1658*cdf0e10cSrcweir 
1659*cdf0e10cSrcweir     TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( rPaM.GetPara() );
1660*cdf0e10cSrcweir 	sal_uInt16 nLine = pPPortion->GetLineNumber( rPaM.GetIndex(), sal_False );
1661*cdf0e10cSrcweir 	if ( nLine < ( pPPortion->GetLines().Count() - 1 ) )
1662*cdf0e10cSrcweir 	{
1663*cdf0e10cSrcweir         sal_uInt16 nCharPos = mpImpl->mpTextEngine->GetCharPos( rPaM.GetPara(), nLine+1, nX );
1664*cdf0e10cSrcweir 		aPaM.GetIndex() = nCharPos;
1665*cdf0e10cSrcweir 
1666*cdf0e10cSrcweir 		// Sonderbehandlung siehe CursorUp...
1667*cdf0e10cSrcweir 		TextLine* pLine = pPPortion->GetLines().GetObject( nLine + 1 );
1668*cdf0e10cSrcweir 		if ( ( aPaM.GetIndex() == pLine->GetEnd() ) && ( aPaM.GetIndex() > pLine->GetStart() ) && aPaM.GetIndex() < pPPortion->GetNode()->GetText().Len() )
1669*cdf0e10cSrcweir 			aPaM.GetIndex()--;
1670*cdf0e10cSrcweir 	}
1671*cdf0e10cSrcweir     else if ( rPaM.GetPara() < ( mpImpl->mpTextEngine->mpDoc->GetNodes().Count() - 1 ) )   // naechster Absatz
1672*cdf0e10cSrcweir 	{
1673*cdf0e10cSrcweir 		aPaM.GetPara()++;
1674*cdf0e10cSrcweir         pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() );
1675*cdf0e10cSrcweir         sal_uInt16 nCharPos = mpImpl->mpTextEngine->GetCharPos( aPaM.GetPara(), 0, nX+1 );
1676*cdf0e10cSrcweir 		aPaM.GetIndex() = nCharPos;
1677*cdf0e10cSrcweir 		TextLine* pLine = pPPortion->GetLines().GetObject( 0 );
1678*cdf0e10cSrcweir 		if ( ( aPaM.GetIndex() == pLine->GetEnd() ) && ( aPaM.GetIndex() > pLine->GetStart() ) && ( pPPortion->GetLines().Count() > 1 ) )
1679*cdf0e10cSrcweir 			aPaM.GetIndex()--;
1680*cdf0e10cSrcweir 	}
1681*cdf0e10cSrcweir 
1682*cdf0e10cSrcweir 	return aPaM;
1683*cdf0e10cSrcweir }
1684*cdf0e10cSrcweir 
1685*cdf0e10cSrcweir TextPaM TextView::CursorStartOfLine( const TextPaM& rPaM )
1686*cdf0e10cSrcweir {
1687*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1688*cdf0e10cSrcweir 
1689*cdf0e10cSrcweir     TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( rPaM.GetPara() );
1690*cdf0e10cSrcweir 	sal_uInt16 nLine = pPPortion->GetLineNumber( aPaM.GetIndex(), sal_False );
1691*cdf0e10cSrcweir 	TextLine* pLine = pPPortion->GetLines().GetObject( nLine );
1692*cdf0e10cSrcweir 	aPaM.GetIndex() = pLine->GetStart();
1693*cdf0e10cSrcweir 
1694*cdf0e10cSrcweir 	return aPaM;
1695*cdf0e10cSrcweir }
1696*cdf0e10cSrcweir 
1697*cdf0e10cSrcweir TextPaM TextView::CursorEndOfLine( const TextPaM& rPaM )
1698*cdf0e10cSrcweir {
1699*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1700*cdf0e10cSrcweir 
1701*cdf0e10cSrcweir     TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( rPaM.GetPara() );
1702*cdf0e10cSrcweir 	sal_uInt16 nLine = pPPortion->GetLineNumber( aPaM.GetIndex(), sal_False );
1703*cdf0e10cSrcweir 	TextLine* pLine = pPPortion->GetLines().GetObject( nLine );
1704*cdf0e10cSrcweir 	aPaM.GetIndex() = pLine->GetEnd();
1705*cdf0e10cSrcweir 
1706*cdf0e10cSrcweir 	if ( pLine->GetEnd() > pLine->GetStart() )	// Leerzeile
1707*cdf0e10cSrcweir 	{
1708*cdf0e10cSrcweir 		xub_Unicode cLastChar = pPPortion->GetNode()->GetText().GetChar((sal_uInt16)(aPaM.GetIndex()-1) );
1709*cdf0e10cSrcweir 		if ( ( cLastChar == ' ' ) && ( aPaM.GetIndex() != pPPortion->GetNode()->GetText().Len() ) )
1710*cdf0e10cSrcweir 		{
1711*cdf0e10cSrcweir 			// Bei einem Blank in einer autom. umgebrochenen Zeile macht es Sinn,
1712*cdf0e10cSrcweir 			// davor zu stehen, da der Anwender hinter das Wort will.
1713*cdf0e10cSrcweir 			// Wenn diese geaendert wird, Sonderbehandlung fuer Pos1 nach End!
1714*cdf0e10cSrcweir 			aPaM.GetIndex()--;
1715*cdf0e10cSrcweir 		}
1716*cdf0e10cSrcweir 	}
1717*cdf0e10cSrcweir 	return aPaM;
1718*cdf0e10cSrcweir }
1719*cdf0e10cSrcweir 
1720*cdf0e10cSrcweir TextPaM TextView::CursorStartOfParagraph( const TextPaM& rPaM )
1721*cdf0e10cSrcweir {
1722*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1723*cdf0e10cSrcweir 	aPaM.GetIndex() = 0;
1724*cdf0e10cSrcweir 	return aPaM;
1725*cdf0e10cSrcweir }
1726*cdf0e10cSrcweir 
1727*cdf0e10cSrcweir TextPaM TextView::CursorEndOfParagraph( const TextPaM& rPaM )
1728*cdf0e10cSrcweir {
1729*cdf0e10cSrcweir     TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( rPaM.GetPara() );
1730*cdf0e10cSrcweir 	TextPaM aPaM( rPaM );
1731*cdf0e10cSrcweir 	aPaM.GetIndex() = pNode->GetText().Len();
1732*cdf0e10cSrcweir 	return aPaM;
1733*cdf0e10cSrcweir }
1734*cdf0e10cSrcweir 
1735*cdf0e10cSrcweir TextPaM TextView::CursorStartOfDoc()
1736*cdf0e10cSrcweir {
1737*cdf0e10cSrcweir 	TextPaM aPaM( 0, 0 );
1738*cdf0e10cSrcweir 	return aPaM;
1739*cdf0e10cSrcweir }
1740*cdf0e10cSrcweir 
1741*cdf0e10cSrcweir TextPaM TextView::CursorEndOfDoc()
1742*cdf0e10cSrcweir {
1743*cdf0e10cSrcweir     sal_uLong nNode = mpImpl->mpTextEngine->mpDoc->GetNodes().Count() - 1;
1744*cdf0e10cSrcweir     TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( nNode );
1745*cdf0e10cSrcweir 	TextPaM aPaM( nNode, pNode->GetText().Len() );
1746*cdf0e10cSrcweir 	return aPaM;
1747*cdf0e10cSrcweir }
1748*cdf0e10cSrcweir 
1749*cdf0e10cSrcweir TextPaM TextView::PageUp( const TextPaM& rPaM )
1750*cdf0e10cSrcweir {
1751*cdf0e10cSrcweir     Rectangle aRec = mpImpl->mpTextEngine->PaMtoEditCursor( rPaM );
1752*cdf0e10cSrcweir 	Point aTopLeft = aRec.TopLeft();
1753*cdf0e10cSrcweir     aTopLeft.Y() -= mpImpl->mpWindow->GetOutputSizePixel().Height() * 9/10;
1754*cdf0e10cSrcweir 	aTopLeft.X() += 1;
1755*cdf0e10cSrcweir 	if ( aTopLeft.Y() < 0 )
1756*cdf0e10cSrcweir 		aTopLeft.Y() = 0;
1757*cdf0e10cSrcweir 
1758*cdf0e10cSrcweir     TextPaM aPaM = mpImpl->mpTextEngine->GetPaM( aTopLeft );
1759*cdf0e10cSrcweir 	return aPaM;
1760*cdf0e10cSrcweir }
1761*cdf0e10cSrcweir 
1762*cdf0e10cSrcweir TextPaM TextView::PageDown( const TextPaM& rPaM )
1763*cdf0e10cSrcweir {
1764*cdf0e10cSrcweir     Rectangle aRec = mpImpl->mpTextEngine->PaMtoEditCursor( rPaM );
1765*cdf0e10cSrcweir 	Point aBottomRight = aRec.BottomRight();
1766*cdf0e10cSrcweir     aBottomRight.Y() += mpImpl->mpWindow->GetOutputSizePixel().Height() * 9/10;
1767*cdf0e10cSrcweir 	aBottomRight.X() += 1;
1768*cdf0e10cSrcweir     long nHeight = mpImpl->mpTextEngine->GetTextHeight();
1769*cdf0e10cSrcweir 	if ( aBottomRight.Y() > nHeight )
1770*cdf0e10cSrcweir 		aBottomRight.Y() = nHeight-1;
1771*cdf0e10cSrcweir 
1772*cdf0e10cSrcweir     TextPaM aPaM = mpImpl->mpTextEngine->GetPaM( aBottomRight );
1773*cdf0e10cSrcweir 	return aPaM;
1774*cdf0e10cSrcweir }
1775*cdf0e10cSrcweir 
1776*cdf0e10cSrcweir void TextView::ImpShowCursor( sal_Bool bGotoCursor, sal_Bool bForceVisCursor, sal_Bool bSpecial )
1777*cdf0e10cSrcweir {
1778*cdf0e10cSrcweir     if ( mpImpl->mpTextEngine->IsFormatting() )
1779*cdf0e10cSrcweir 		return;
1780*cdf0e10cSrcweir     if ( mpImpl->mpTextEngine->GetUpdateMode() == sal_False )
1781*cdf0e10cSrcweir 		return;
1782*cdf0e10cSrcweir     if ( mpImpl->mpTextEngine->IsInUndo() )
1783*cdf0e10cSrcweir 		return;
1784*cdf0e10cSrcweir 
1785*cdf0e10cSrcweir     mpImpl->mpTextEngine->CheckIdleFormatter();
1786*cdf0e10cSrcweir     if ( !mpImpl->mpTextEngine->IsFormatted() )
1787*cdf0e10cSrcweir         mpImpl->mpTextEngine->FormatAndUpdate( this );
1788*cdf0e10cSrcweir 
1789*cdf0e10cSrcweir 
1790*cdf0e10cSrcweir     TextPaM aPaM( mpImpl->maSelection.GetEnd() );
1791*cdf0e10cSrcweir     Rectangle aEditCursor = mpImpl->mpTextEngine->PaMtoEditCursor( aPaM, bSpecial );
1792*cdf0e10cSrcweir 
1793*cdf0e10cSrcweir     // Remember that we placed the cursor behind the last character of a line
1794*cdf0e10cSrcweir     mpImpl->mbCursorAtEndOfLine = false;
1795*cdf0e10cSrcweir     if( bSpecial )
1796*cdf0e10cSrcweir     {
1797*cdf0e10cSrcweir         TEParaPortion* pParaPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() );
1798*cdf0e10cSrcweir         mpImpl->mbCursorAtEndOfLine =
1799*cdf0e10cSrcweir             pParaPortion->GetLineNumber( aPaM.GetIndex(), sal_True ) != pParaPortion->GetLineNumber( aPaM.GetIndex(), sal_False );
1800*cdf0e10cSrcweir     }
1801*cdf0e10cSrcweir 
1802*cdf0e10cSrcweir     if ( !IsInsertMode() && !mpImpl->maSelection.HasRange() )
1803*cdf0e10cSrcweir 	{
1804*cdf0e10cSrcweir         TextNode* pNode = mpImpl->mpTextEngine->mpDoc->GetNodes().GetObject( aPaM.GetPara() );
1805*cdf0e10cSrcweir 		if ( pNode->GetText().Len() && ( aPaM.GetIndex() < pNode->GetText().Len() ) )
1806*cdf0e10cSrcweir 		{
1807*cdf0e10cSrcweir             // If we are behind a portion, and the next portion has other direction, we must change position...
1808*cdf0e10cSrcweir             aEditCursor.Left() = aEditCursor.Right() = mpImpl->mpTextEngine->GetEditCursor( aPaM, sal_False, sal_True ).Left();
1809*cdf0e10cSrcweir 
1810*cdf0e10cSrcweir             TEParaPortion* pParaPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() );
1811*cdf0e10cSrcweir 
1812*cdf0e10cSrcweir             sal_uInt16 nTextPortionStart = 0;
1813*cdf0e10cSrcweir             sal_uInt16 nTextPortion = pParaPortion->GetTextPortions().FindPortion( aPaM.GetIndex(), nTextPortionStart, sal_True );
1814*cdf0e10cSrcweir             TETextPortion* pTextPortion = pParaPortion->GetTextPortions().GetObject( nTextPortion );
1815*cdf0e10cSrcweir             if ( pTextPortion->GetKind() == PORTIONKIND_TAB )
1816*cdf0e10cSrcweir             {
1817*cdf0e10cSrcweir                 if ( mpImpl->mpTextEngine->IsRightToLeft() )
1818*cdf0e10cSrcweir                 {
1819*cdf0e10cSrcweir 
1820*cdf0e10cSrcweir                 }
1821*cdf0e10cSrcweir 		        aEditCursor.Right() += pTextPortion->GetWidth();
1822*cdf0e10cSrcweir             }
1823*cdf0e10cSrcweir             else
1824*cdf0e10cSrcweir             {
1825*cdf0e10cSrcweir                 TextPaM aNext = CursorRight( TextPaM( aPaM.GetPara(), aPaM.GetIndex() ), (sal_uInt16)i18n::CharacterIteratorMode::SKIPCELL );
1826*cdf0e10cSrcweir                 aEditCursor.Right() = mpImpl->mpTextEngine->GetEditCursor( aNext, sal_True ).Left();
1827*cdf0e10cSrcweir             }
1828*cdf0e10cSrcweir 		}
1829*cdf0e10cSrcweir 	}
1830*cdf0e10cSrcweir 
1831*cdf0e10cSrcweir     Size aOutSz = mpImpl->mpWindow->GetOutputSizePixel();
1832*cdf0e10cSrcweir 	if ( aEditCursor.GetHeight() > aOutSz.Height() )
1833*cdf0e10cSrcweir 		aEditCursor.Bottom() = aEditCursor.Top() + aOutSz.Height() - 1;
1834*cdf0e10cSrcweir 
1835*cdf0e10cSrcweir     aEditCursor.Left() -= 1;
1836*cdf0e10cSrcweir 
1837*cdf0e10cSrcweir 	if ( bGotoCursor
1838*cdf0e10cSrcweir         // #i81283# protext maStartDocPos against initialization problems
1839*cdf0e10cSrcweir         && aOutSz.Width() && aOutSz.Height()
1840*cdf0e10cSrcweir     )
1841*cdf0e10cSrcweir 	{
1842*cdf0e10cSrcweir         long nVisStartY = mpImpl->maStartDocPos.Y();
1843*cdf0e10cSrcweir         long nVisEndY = mpImpl->maStartDocPos.Y() + aOutSz.Height();
1844*cdf0e10cSrcweir         long nVisStartX = mpImpl->maStartDocPos.X();
1845*cdf0e10cSrcweir         long nVisEndX = mpImpl->maStartDocPos.X() + aOutSz.Width();
1846*cdf0e10cSrcweir 		long nMoreX = aOutSz.Width() / 4;
1847*cdf0e10cSrcweir 
1848*cdf0e10cSrcweir         Point aNewStartPos( mpImpl->maStartDocPos );
1849*cdf0e10cSrcweir 
1850*cdf0e10cSrcweir 		if ( aEditCursor.Bottom() > nVisEndY )
1851*cdf0e10cSrcweir 		{
1852*cdf0e10cSrcweir 			aNewStartPos.Y() += ( aEditCursor.Bottom() - nVisEndY );
1853*cdf0e10cSrcweir 		}
1854*cdf0e10cSrcweir 		else if ( aEditCursor.Top() < nVisStartY )
1855*cdf0e10cSrcweir 		{
1856*cdf0e10cSrcweir 			aNewStartPos.Y() -= ( nVisStartY - aEditCursor.Top() );
1857*cdf0e10cSrcweir 		}
1858*cdf0e10cSrcweir 
1859*cdf0e10cSrcweir 		if ( aEditCursor.Right() >= nVisEndX )
1860*cdf0e10cSrcweir 		{
1861*cdf0e10cSrcweir 			aNewStartPos.X() += ( aEditCursor.Right() - nVisEndX );
1862*cdf0e10cSrcweir 
1863*cdf0e10cSrcweir 			// Darfs ein bischen mehr sein?
1864*cdf0e10cSrcweir 			aNewStartPos.X() += nMoreX;
1865*cdf0e10cSrcweir 		}
1866*cdf0e10cSrcweir 		else if ( aEditCursor.Left() <= nVisStartX )
1867*cdf0e10cSrcweir 		{
1868*cdf0e10cSrcweir 			aNewStartPos.X() -= ( nVisStartX - aEditCursor.Left() );
1869*cdf0e10cSrcweir 
1870*cdf0e10cSrcweir 			// Darfs ein bischen mehr sein?
1871*cdf0e10cSrcweir 			aNewStartPos.X() -= nMoreX;
1872*cdf0e10cSrcweir 		}
1873*cdf0e10cSrcweir 
1874*cdf0e10cSrcweir 		// X kann durch das 'bischen mehr' falsch sein:
1875*cdf0e10cSrcweir //      sal_uLong nMaxTextWidth = mpImpl->mpTextEngine->GetMaxTextWidth();
1876*cdf0e10cSrcweir //		if ( !nMaxTextWidth || ( nMaxTextWidth > 0x7FFFFFFF ) )
1877*cdf0e10cSrcweir //			nMaxTextWidth = 0x7FFFFFFF;
1878*cdf0e10cSrcweir //		long nMaxX = (long)nMaxTextWidth - aOutSz.Width();
1879*cdf0e10cSrcweir         long nMaxX = mpImpl->mpTextEngine->CalcTextWidth() - aOutSz.Width();
1880*cdf0e10cSrcweir 		if ( nMaxX < 0 )
1881*cdf0e10cSrcweir 			nMaxX = 0;
1882*cdf0e10cSrcweir 
1883*cdf0e10cSrcweir 		if ( aNewStartPos.X() < 0 )
1884*cdf0e10cSrcweir 			aNewStartPos.X() = 0;
1885*cdf0e10cSrcweir 		else if ( aNewStartPos.X() > nMaxX )
1886*cdf0e10cSrcweir 			aNewStartPos.X() = nMaxX;
1887*cdf0e10cSrcweir 
1888*cdf0e10cSrcweir 		// Y sollte nicht weiter unten als noetig liegen:
1889*cdf0e10cSrcweir         long nYMax = mpImpl->mpTextEngine->GetTextHeight() - aOutSz.Height();
1890*cdf0e10cSrcweir 		if ( nYMax < 0 )
1891*cdf0e10cSrcweir 			nYMax = 0;
1892*cdf0e10cSrcweir 		if ( aNewStartPos.Y() > nYMax )
1893*cdf0e10cSrcweir 			aNewStartPos.Y() = nYMax;
1894*cdf0e10cSrcweir 
1895*cdf0e10cSrcweir         if ( aNewStartPos != mpImpl->maStartDocPos )
1896*cdf0e10cSrcweir             Scroll( -(aNewStartPos.X() - mpImpl->maStartDocPos.X()), -(aNewStartPos.Y() - mpImpl->maStartDocPos.Y()) );
1897*cdf0e10cSrcweir 	}
1898*cdf0e10cSrcweir 
1899*cdf0e10cSrcweir     if ( aEditCursor.Right() < aEditCursor.Left() )
1900*cdf0e10cSrcweir     {
1901*cdf0e10cSrcweir         long n = aEditCursor.Left();
1902*cdf0e10cSrcweir         aEditCursor.Left() = aEditCursor.Right();
1903*cdf0e10cSrcweir         aEditCursor.Right() = n;
1904*cdf0e10cSrcweir     }
1905*cdf0e10cSrcweir 
1906*cdf0e10cSrcweir     Point aPoint( GetWindowPos( !mpImpl->mpTextEngine->IsRightToLeft() ? aEditCursor.TopLeft() : aEditCursor.TopRight() ) );
1907*cdf0e10cSrcweir     mpImpl->mpCursor->SetPos( aPoint );
1908*cdf0e10cSrcweir     mpImpl->mpCursor->SetSize( aEditCursor.GetSize() );
1909*cdf0e10cSrcweir     if ( bForceVisCursor && mpImpl->mbCursorEnabled )
1910*cdf0e10cSrcweir         mpImpl->mpCursor->Show();
1911*cdf0e10cSrcweir }
1912*cdf0e10cSrcweir 
1913*cdf0e10cSrcweir sal_Bool TextView::SetCursorAtPoint( const Point& rPosPixel )
1914*cdf0e10cSrcweir {
1915*cdf0e10cSrcweir     mpImpl->mpTextEngine->CheckIdleFormatter();
1916*cdf0e10cSrcweir 
1917*cdf0e10cSrcweir 	Point aDocPos = GetDocPos( rPosPixel );
1918*cdf0e10cSrcweir 
1919*cdf0e10cSrcweir     TextPaM aPaM = mpImpl->mpTextEngine->GetPaM( aDocPos );
1920*cdf0e10cSrcweir 
1921*cdf0e10cSrcweir 	// aTmpNewSel: Diff zwischen alt und neu, nicht die neue Selektion
1922*cdf0e10cSrcweir     TextSelection aTmpNewSel( mpImpl->maSelection.GetEnd(), aPaM );
1923*cdf0e10cSrcweir     TextSelection aNewSel( mpImpl->maSelection );
1924*cdf0e10cSrcweir 	aNewSel.GetEnd() = aPaM;
1925*cdf0e10cSrcweir 
1926*cdf0e10cSrcweir     if ( !mpImpl->mpSelEngine->HasAnchor() )
1927*cdf0e10cSrcweir 	{
1928*cdf0e10cSrcweir         if ( mpImpl->maSelection.GetStart() != aPaM )
1929*cdf0e10cSrcweir             mpImpl->mpTextEngine->CursorMoved( mpImpl->maSelection.GetStart().GetPara() );
1930*cdf0e10cSrcweir 		aNewSel.GetStart() = aPaM;
1931*cdf0e10cSrcweir         ImpSetSelection( aNewSel );
1932*cdf0e10cSrcweir 	}
1933*cdf0e10cSrcweir 	else
1934*cdf0e10cSrcweir 	{
1935*cdf0e10cSrcweir         ImpSetSelection( aNewSel );
1936*cdf0e10cSrcweir 		ShowSelection( aTmpNewSel );
1937*cdf0e10cSrcweir 	}
1938*cdf0e10cSrcweir 
1939*cdf0e10cSrcweir     sal_Bool bForceCursor =  mpImpl->mpDDInfo ? sal_False : sal_True; // && !mbInSelection
1940*cdf0e10cSrcweir     ImpShowCursor( mpImpl->mbAutoScroll, bForceCursor, sal_False );
1941*cdf0e10cSrcweir 	return sal_True;
1942*cdf0e10cSrcweir }
1943*cdf0e10cSrcweir 
1944*cdf0e10cSrcweir sal_Bool TextView::IsSelectionAtPoint( const Point& rPosPixel )
1945*cdf0e10cSrcweir {
1946*cdf0e10cSrcweir //  if ( !Rectangle( Point(), mpImpl->mpWindow->GetOutputSizePixel() ).IsInside( rPosPixel ) && !mbInSelection )
1947*cdf0e10cSrcweir //		return sal_False;
1948*cdf0e10cSrcweir 
1949*cdf0e10cSrcweir 	Point aDocPos = GetDocPos( rPosPixel );
1950*cdf0e10cSrcweir     TextPaM aPaM = mpImpl->mpTextEngine->GetPaM( aDocPos, sal_False );
1951*cdf0e10cSrcweir 	// Bei Hyperlinks D&D auch ohne Selektion starten.
1952*cdf0e10cSrcweir 	// BeginDrag wird aber nur gerufen, wenn IsSelectionAtPoint()
1953*cdf0e10cSrcweir 	// Problem: IsSelectionAtPoint wird bei Command() nicht gerufen,
1954*cdf0e10cSrcweir 	// wenn vorher im MBDown schon sal_False returnt wurde.
1955*cdf0e10cSrcweir 	return ( IsInSelection( aPaM ) ||
1956*cdf0e10cSrcweir             ( /* mpImpl->mpSelEngine->IsInCommand() && */ mpImpl->mpTextEngine->FindAttrib( aPaM, TEXTATTR_HYPERLINK ) ) );
1957*cdf0e10cSrcweir }
1958*cdf0e10cSrcweir 
1959*cdf0e10cSrcweir sal_Bool TextView::IsInSelection( const TextPaM& rPaM )
1960*cdf0e10cSrcweir {
1961*cdf0e10cSrcweir     TextSelection aSel = mpImpl->maSelection;
1962*cdf0e10cSrcweir 	aSel.Justify();
1963*cdf0e10cSrcweir 
1964*cdf0e10cSrcweir 	sal_uLong nStartNode = aSel.GetStart().GetPara();
1965*cdf0e10cSrcweir 	sal_uLong nEndNode = aSel.GetEnd().GetPara();
1966*cdf0e10cSrcweir 	sal_uLong nCurNode = rPaM.GetPara();
1967*cdf0e10cSrcweir 
1968*cdf0e10cSrcweir 	if ( ( nCurNode > nStartNode ) && ( nCurNode < nEndNode ) )
1969*cdf0e10cSrcweir 		return sal_True;
1970*cdf0e10cSrcweir 
1971*cdf0e10cSrcweir 	if ( nStartNode == nEndNode )
1972*cdf0e10cSrcweir 	{
1973*cdf0e10cSrcweir 		if ( nCurNode == nStartNode )
1974*cdf0e10cSrcweir 			if ( ( rPaM.GetIndex() >= aSel.GetStart().GetIndex() ) && ( rPaM.GetIndex() < aSel.GetEnd().GetIndex() ) )
1975*cdf0e10cSrcweir 				return sal_True;
1976*cdf0e10cSrcweir 	}
1977*cdf0e10cSrcweir 	else if ( ( nCurNode == nStartNode ) && ( rPaM.GetIndex() >= aSel.GetStart().GetIndex() ) )
1978*cdf0e10cSrcweir 		return sal_True;
1979*cdf0e10cSrcweir 	else if ( ( nCurNode == nEndNode ) && ( rPaM.GetIndex() < aSel.GetEnd().GetIndex() ) )
1980*cdf0e10cSrcweir 		return sal_True;
1981*cdf0e10cSrcweir 
1982*cdf0e10cSrcweir 	return sal_False;
1983*cdf0e10cSrcweir }
1984*cdf0e10cSrcweir 
1985*cdf0e10cSrcweir void TextView::ImpHideDDCursor()
1986*cdf0e10cSrcweir {
1987*cdf0e10cSrcweir     if ( mpImpl->mpDDInfo && mpImpl->mpDDInfo->mbVisCursor )
1988*cdf0e10cSrcweir 	{
1989*cdf0e10cSrcweir         mpImpl->mpDDInfo->maCursor.Hide();
1990*cdf0e10cSrcweir         mpImpl->mpDDInfo->mbVisCursor = sal_False;
1991*cdf0e10cSrcweir 	}
1992*cdf0e10cSrcweir }
1993*cdf0e10cSrcweir 
1994*cdf0e10cSrcweir void TextView::ImpShowDDCursor()
1995*cdf0e10cSrcweir {
1996*cdf0e10cSrcweir     if ( !mpImpl->mpDDInfo->mbVisCursor )
1997*cdf0e10cSrcweir 	{
1998*cdf0e10cSrcweir         Rectangle aCursor = mpImpl->mpTextEngine->PaMtoEditCursor( mpImpl->mpDDInfo->maDropPos, sal_True );
1999*cdf0e10cSrcweir 		aCursor.Right()++;
2000*cdf0e10cSrcweir 		aCursor.SetPos( GetWindowPos( aCursor.TopLeft() ) );
2001*cdf0e10cSrcweir 
2002*cdf0e10cSrcweir         mpImpl->mpDDInfo->maCursor.SetWindow( mpImpl->mpWindow );
2003*cdf0e10cSrcweir         mpImpl->mpDDInfo->maCursor.SetPos( aCursor.TopLeft() );
2004*cdf0e10cSrcweir         mpImpl->mpDDInfo->maCursor.SetSize( aCursor.GetSize() );
2005*cdf0e10cSrcweir         mpImpl->mpDDInfo->maCursor.Show();
2006*cdf0e10cSrcweir         mpImpl->mpDDInfo->mbVisCursor = sal_True;
2007*cdf0e10cSrcweir 	}
2008*cdf0e10cSrcweir }
2009*cdf0e10cSrcweir 
2010*cdf0e10cSrcweir void TextView::SetPaintSelection( sal_Bool bPaint )
2011*cdf0e10cSrcweir {
2012*cdf0e10cSrcweir     if ( bPaint != mpImpl->mbPaintSelection )
2013*cdf0e10cSrcweir 	{
2014*cdf0e10cSrcweir         mpImpl->mbPaintSelection = bPaint;
2015*cdf0e10cSrcweir         ShowSelection( mpImpl->maSelection );
2016*cdf0e10cSrcweir 	}
2017*cdf0e10cSrcweir }
2018*cdf0e10cSrcweir 
2019*cdf0e10cSrcweir void TextView::SetHighlightSelection( sal_Bool bSelectByHighlight )
2020*cdf0e10cSrcweir {
2021*cdf0e10cSrcweir     if ( bSelectByHighlight != mpImpl->mbHighlightSelection )
2022*cdf0e10cSrcweir 	{
2023*cdf0e10cSrcweir 		// Falls umschalten zwischendurch moeglich...
2024*cdf0e10cSrcweir         mpImpl->mbHighlightSelection = bSelectByHighlight;
2025*cdf0e10cSrcweir 	}
2026*cdf0e10cSrcweir }
2027*cdf0e10cSrcweir 
2028*cdf0e10cSrcweir sal_Bool TextView::Read( SvStream& rInput )
2029*cdf0e10cSrcweir {
2030*cdf0e10cSrcweir     sal_Bool bDone = mpImpl->mpTextEngine->Read( rInput, &mpImpl->maSelection );
2031*cdf0e10cSrcweir 	ShowCursor();
2032*cdf0e10cSrcweir 	return bDone;
2033*cdf0e10cSrcweir }
2034*cdf0e10cSrcweir 
2035*cdf0e10cSrcweir sal_Bool TextView::Write( SvStream& rOutput )
2036*cdf0e10cSrcweir {
2037*cdf0e10cSrcweir     return mpImpl->mpTextEngine->Read( rOutput, &mpImpl->maSelection );
2038*cdf0e10cSrcweir }
2039*cdf0e10cSrcweir 
2040*cdf0e10cSrcweir bool TextView::ImplTruncateNewText( rtl::OUString& rNewText ) const
2041*cdf0e10cSrcweir {
2042*cdf0e10cSrcweir 	bool bTruncated = false;
2043*cdf0e10cSrcweir 
2044*cdf0e10cSrcweir     if( rNewText.getLength() > 65534 ) // limit to String API
2045*cdf0e10cSrcweir     {
2046*cdf0e10cSrcweir         rNewText = rNewText.copy( 0, 65534 );
2047*cdf0e10cSrcweir         bTruncated = true;
2048*cdf0e10cSrcweir     }
2049*cdf0e10cSrcweir 
2050*cdf0e10cSrcweir     sal_uLong nMaxLen = mpImpl->mpTextEngine->GetMaxTextLen();
2051*cdf0e10cSrcweir     // 0 means unlimited, there is just the String API limit handled above
2052*cdf0e10cSrcweir     if( nMaxLen != 0 )
2053*cdf0e10cSrcweir     {
2054*cdf0e10cSrcweir         sal_uLong nCurLen = mpImpl->mpTextEngine->GetTextLen();
2055*cdf0e10cSrcweir 
2056*cdf0e10cSrcweir         sal_uInt32 nNewLen = rNewText.getLength();
2057*cdf0e10cSrcweir         if ( nCurLen + nNewLen > nMaxLen )
2058*cdf0e10cSrcweir         {
2059*cdf0e10cSrcweir             // see how much text will be replaced
2060*cdf0e10cSrcweir             sal_uLong nSelLen = mpImpl->mpTextEngine->GetTextLen( mpImpl->maSelection );
2061*cdf0e10cSrcweir             if ( nCurLen + nNewLen - nSelLen > nMaxLen )
2062*cdf0e10cSrcweir             {
2063*cdf0e10cSrcweir                 sal_uInt32 nTruncatedLen = static_cast<sal_uInt32>(nMaxLen - (nCurLen - nSelLen));
2064*cdf0e10cSrcweir                 rNewText = rNewText.copy( 0, nTruncatedLen );
2065*cdf0e10cSrcweir                 bTruncated = true;
2066*cdf0e10cSrcweir             }
2067*cdf0e10cSrcweir         }
2068*cdf0e10cSrcweir     }
2069*cdf0e10cSrcweir 	return bTruncated;
2070*cdf0e10cSrcweir }
2071*cdf0e10cSrcweir 
2072*cdf0e10cSrcweir sal_Bool TextView::ImplCheckTextLen( const String& rNewText )
2073*cdf0e10cSrcweir {
2074*cdf0e10cSrcweir 	sal_Bool bOK = sal_True;
2075*cdf0e10cSrcweir     if ( mpImpl->mpTextEngine->GetMaxTextLen() )
2076*cdf0e10cSrcweir 	{
2077*cdf0e10cSrcweir         sal_uLong n = mpImpl->mpTextEngine->GetTextLen();
2078*cdf0e10cSrcweir 		n += rNewText.Len();
2079*cdf0e10cSrcweir         if ( n > mpImpl->mpTextEngine->GetMaxTextLen() )
2080*cdf0e10cSrcweir 		{
2081*cdf0e10cSrcweir 			// nur dann noch ermitteln, wie viel Text geloescht wird
2082*cdf0e10cSrcweir             n -= mpImpl->mpTextEngine->GetTextLen( mpImpl->maSelection );
2083*cdf0e10cSrcweir             if ( n > mpImpl->mpTextEngine->GetMaxTextLen() )
2084*cdf0e10cSrcweir 			{
2085*cdf0e10cSrcweir 				// Beep hat hier eigentlich nichts verloren, sondern lieber ein Hdl,
2086*cdf0e10cSrcweir 				// aber so funktioniert es wenigstens in ME, BasicIDE, SourceView
2087*cdf0e10cSrcweir 				Sound::Beep();
2088*cdf0e10cSrcweir 				bOK = sal_False;
2089*cdf0e10cSrcweir 			}
2090*cdf0e10cSrcweir 		}
2091*cdf0e10cSrcweir 	}
2092*cdf0e10cSrcweir 	return bOK;
2093*cdf0e10cSrcweir }
2094*cdf0e10cSrcweir 
2095*cdf0e10cSrcweir void TextView::dragGestureRecognized( const ::com::sun::star::datatransfer::dnd::DragGestureEvent& rDGE ) throw (::com::sun::star::uno::RuntimeException)
2096*cdf0e10cSrcweir {
2097*cdf0e10cSrcweir     if ( mpImpl->mbClickedInSelection )
2098*cdf0e10cSrcweir     {
2099*cdf0e10cSrcweir 	    vos::OGuard aVclGuard( Application::GetSolarMutex() );
2100*cdf0e10cSrcweir 
2101*cdf0e10cSrcweir         DBG_ASSERT( mpImpl->maSelection.HasRange(), "TextView::dragGestureRecognized: mpImpl->mbClickedInSelection, but no selection?" );
2102*cdf0e10cSrcweir 
2103*cdf0e10cSrcweir         delete mpImpl->mpDDInfo;
2104*cdf0e10cSrcweir         mpImpl->mpDDInfo = new TextDDInfo;
2105*cdf0e10cSrcweir         mpImpl->mpDDInfo->mbStarterOfDD = sal_True;
2106*cdf0e10cSrcweir 
2107*cdf0e10cSrcweir 	    TETextDataObject* pDataObj = new TETextDataObject( GetSelected() );
2108*cdf0e10cSrcweir 
2109*cdf0e10cSrcweir         if ( mpImpl->mpTextEngine->HasAttrib( TEXTATTR_HYPERLINK ) )  // Dann auch als HTML
2110*cdf0e10cSrcweir             mpImpl->mpTextEngine->Write( pDataObj->GetHTMLStream(), &mpImpl->maSelection, sal_True );
2111*cdf0e10cSrcweir 
2112*cdf0e10cSrcweir 
2113*cdf0e10cSrcweir         /*
2114*cdf0e10cSrcweir 	    // D&D eines Hyperlinks.
2115*cdf0e10cSrcweir 	    // Besser waere es im MBDown sich den MBDownPaM zu merken,
2116*cdf0e10cSrcweir 	    // ist dann aber inkompatibel => spaeter mal umstellen.
2117*cdf0e10cSrcweir         TextPaM aPaM( mpImpl->mpTextEngine->GetPaM( GetDocPos( GetWindow()->GetPointerPosPixel() ) ) );
2118*cdf0e10cSrcweir         const TextCharAttrib* pAttr = mpImpl->mpTextEngine->FindCharAttrib( aPaM, TEXTATTR_HYPERLINK );
2119*cdf0e10cSrcweir 	    if ( pAttr )
2120*cdf0e10cSrcweir 	    {
2121*cdf0e10cSrcweir 		    aSel = aPaM;
2122*cdf0e10cSrcweir 		    aSel.GetStart().GetIndex() = pAttr->GetStart();
2123*cdf0e10cSrcweir 		    aSel.GetEnd().GetIndex() = pAttr->GetEnd();
2124*cdf0e10cSrcweir 
2125*cdf0e10cSrcweir 		    const TextAttribHyperLink& rLink = (const TextAttribHyperLink&)pAttr->GetAttr();
2126*cdf0e10cSrcweir 		    String aText( rLink.GetDescription() );
2127*cdf0e10cSrcweir 		    if ( !aText.Len() )
2128*cdf0e10cSrcweir                 aText = mpImpl->mpTextEngine->GetText( aSel );
2129*cdf0e10cSrcweir 		    INetBookmark aBookmark( rLink.GetURL(), aText );
2130*cdf0e10cSrcweir 		    aBookmark.CopyDragServer();
2131*cdf0e10cSrcweir 	    }
2132*cdf0e10cSrcweir         */
2133*cdf0e10cSrcweir 
2134*cdf0e10cSrcweir         mpImpl->mpCursor->Hide();
2135*cdf0e10cSrcweir 
2136*cdf0e10cSrcweir         sal_Int8 nActions = datatransfer::dnd::DNDConstants::ACTION_COPY;
2137*cdf0e10cSrcweir         if ( !IsReadOnly() )
2138*cdf0e10cSrcweir             nActions |= datatransfer::dnd::DNDConstants::ACTION_MOVE;
2139*cdf0e10cSrcweir         rDGE.DragSource->startDrag( rDGE, nActions, 0 /*cursor*/, 0 /*image*/, pDataObj, mpImpl->mxDnDListener );
2140*cdf0e10cSrcweir     }
2141*cdf0e10cSrcweir }
2142*cdf0e10cSrcweir 
2143*cdf0e10cSrcweir void TextView::dragDropEnd( const ::com::sun::star::datatransfer::dnd::DragSourceDropEvent& ) throw (::com::sun::star::uno::RuntimeException)
2144*cdf0e10cSrcweir {
2145*cdf0e10cSrcweir     ImpHideDDCursor();
2146*cdf0e10cSrcweir     delete mpImpl->mpDDInfo;
2147*cdf0e10cSrcweir     mpImpl->mpDDInfo = NULL;
2148*cdf0e10cSrcweir }
2149*cdf0e10cSrcweir 
2150*cdf0e10cSrcweir void TextView::drop( const ::com::sun::star::datatransfer::dnd::DropTargetDropEvent& rDTDE ) throw (::com::sun::star::uno::RuntimeException)
2151*cdf0e10cSrcweir {
2152*cdf0e10cSrcweir 	vos::OGuard aVclGuard( Application::GetSolarMutex() );
2153*cdf0e10cSrcweir 
2154*cdf0e10cSrcweir 	sal_Bool bChanges = sal_False;
2155*cdf0e10cSrcweir     if ( !mpImpl->mbReadOnly && mpImpl->mpDDInfo )
2156*cdf0e10cSrcweir 	{
2157*cdf0e10cSrcweir 		ImpHideDDCursor();
2158*cdf0e10cSrcweir 
2159*cdf0e10cSrcweir 		// Daten fuer das loeschen nach einem DROP_MOVE:
2160*cdf0e10cSrcweir         TextSelection aPrevSel( mpImpl->maSelection );
2161*cdf0e10cSrcweir 		aPrevSel.Justify();
2162*cdf0e10cSrcweir         sal_uLong nPrevParaCount = mpImpl->mpTextEngine->GetParagraphCount();
2163*cdf0e10cSrcweir         sal_uInt16 nPrevStartParaLen = mpImpl->mpTextEngine->GetTextLen( aPrevSel.GetStart().GetPara() );
2164*cdf0e10cSrcweir 
2165*cdf0e10cSrcweir 		sal_Bool bStarterOfDD = sal_False;
2166*cdf0e10cSrcweir         for ( sal_uInt16 nView = mpImpl->mpTextEngine->GetViewCount(); nView && !bStarterOfDD; )
2167*cdf0e10cSrcweir             bStarterOfDD = mpImpl->mpTextEngine->GetView( --nView )->mpImpl->mpDDInfo ? mpImpl->mpTextEngine->GetView( nView )->mpImpl->mpDDInfo->mbStarterOfDD : sal_False;
2168*cdf0e10cSrcweir 
2169*cdf0e10cSrcweir 		HideSelection();
2170*cdf0e10cSrcweir         ImpSetSelection( mpImpl->mpDDInfo->maDropPos );
2171*cdf0e10cSrcweir 
2172*cdf0e10cSrcweir         mpImpl->mpTextEngine->UndoActionStart();
2173*cdf0e10cSrcweir 
2174*cdf0e10cSrcweir 		String aText;
2175*cdf0e10cSrcweir 		uno::Reference< datatransfer::XTransferable > xDataObj = rDTDE.Transferable;
2176*cdf0e10cSrcweir 		if ( xDataObj.is() )
2177*cdf0e10cSrcweir 		{
2178*cdf0e10cSrcweir 		    datatransfer::DataFlavor aFlavor;
2179*cdf0e10cSrcweir 		    SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
2180*cdf0e10cSrcweir 		    if ( xDataObj->isDataFlavorSupported( aFlavor ) )
2181*cdf0e10cSrcweir 		    {
2182*cdf0e10cSrcweir 			    uno::Any aData = xDataObj->getTransferData( aFlavor );
2183*cdf0e10cSrcweir 			    ::rtl::OUString aOUString;
2184*cdf0e10cSrcweir 			    aData >>= aOUString;
2185*cdf0e10cSrcweir                 aText = aOUString;
2186*cdf0e10cSrcweir 		        aText.ConvertLineEnd( LINEEND_LF );
2187*cdf0e10cSrcweir 		    }
2188*cdf0e10cSrcweir         }
2189*cdf0e10cSrcweir 
2190*cdf0e10cSrcweir 		if ( aText.Len() && ( aText.GetChar( aText.Len()-1 ) == LINE_SEP ) )
2191*cdf0e10cSrcweir 			aText.Erase( aText.Len()-1 );
2192*cdf0e10cSrcweir 
2193*cdf0e10cSrcweir 		TextPaM aTempStart = mpImpl->maSelection.GetStart();
2194*cdf0e10cSrcweir         if ( ImplCheckTextLen( aText ) )
2195*cdf0e10cSrcweir             ImpSetSelection( mpImpl->mpTextEngine->ImpInsertText( mpImpl->mpDDInfo->maDropPos, aText ) );
2196*cdf0e10cSrcweir         if(mpImpl->mbSupportProtectAttribute)
2197*cdf0e10cSrcweir         {
2198*cdf0e10cSrcweir             mpImpl->mpTextEngine->SetAttrib( TextAttribProtect(),
2199*cdf0e10cSrcweir                 aTempStart.GetPara(),
2200*cdf0e10cSrcweir                 aTempStart.GetIndex(),
2201*cdf0e10cSrcweir                 mpImpl->maSelection.GetEnd().GetIndex(), sal_False );
2202*cdf0e10cSrcweir         }
2203*cdf0e10cSrcweir 
2204*cdf0e10cSrcweir         if ( aPrevSel.HasRange() &&
2205*cdf0e10cSrcweir                 !mpImpl->mbSupportProtectAttribute && // don't remove currently selected element
2206*cdf0e10cSrcweir                 (( rDTDE.DropAction & datatransfer::dnd::DNDConstants::ACTION_MOVE ) || !bStarterOfDD) )
2207*cdf0e10cSrcweir 		{
2208*cdf0e10cSrcweir 			// ggf. Selection anpasssen:
2209*cdf0e10cSrcweir             if ( ( mpImpl->mpDDInfo->maDropPos.GetPara() < aPrevSel.GetStart().GetPara() ) ||
2210*cdf0e10cSrcweir                  ( ( mpImpl->mpDDInfo->maDropPos.GetPara() == aPrevSel.GetStart().GetPara() )
2211*cdf0e10cSrcweir                         && ( mpImpl->mpDDInfo->maDropPos.GetIndex() < aPrevSel.GetStart().GetIndex() ) ) )
2212*cdf0e10cSrcweir 			{
2213*cdf0e10cSrcweir 				sal_uLong nNewParasBeforeSelection =
2214*cdf0e10cSrcweir                     mpImpl->mpTextEngine->GetParagraphCount() -    nPrevParaCount;
2215*cdf0e10cSrcweir 
2216*cdf0e10cSrcweir 				aPrevSel.GetStart().GetPara() += nNewParasBeforeSelection;
2217*cdf0e10cSrcweir 				aPrevSel.GetEnd().GetPara() += nNewParasBeforeSelection;
2218*cdf0e10cSrcweir 
2219*cdf0e10cSrcweir                 if ( mpImpl->mpDDInfo->maDropPos.GetPara() == aPrevSel.GetStart().GetPara() )
2220*cdf0e10cSrcweir 				{
2221*cdf0e10cSrcweir 					sal_uInt16 nNewChars =
2222*cdf0e10cSrcweir                         mpImpl->mpTextEngine->GetTextLen( aPrevSel.GetStart().GetPara() ) - nPrevStartParaLen;
2223*cdf0e10cSrcweir 
2224*cdf0e10cSrcweir 					aPrevSel.GetStart().GetIndex() =
2225*cdf0e10cSrcweir                         aPrevSel.GetStart().GetIndex() + nNewChars;
2226*cdf0e10cSrcweir 					if ( aPrevSel.GetStart().GetPara() == aPrevSel.GetEnd().GetPara() )
2227*cdf0e10cSrcweir 						aPrevSel.GetEnd().GetIndex() =
2228*cdf0e10cSrcweir                             aPrevSel.GetEnd().GetIndex() + nNewChars;
2229*cdf0e10cSrcweir 				}
2230*cdf0e10cSrcweir 			}
2231*cdf0e10cSrcweir 			else
2232*cdf0e10cSrcweir 			{
2233*cdf0e10cSrcweir 				// aktuelle Selektion anpassen
2234*cdf0e10cSrcweir                 TextPaM aPaM = mpImpl->maSelection.GetStart();
2235*cdf0e10cSrcweir 				aPaM.GetPara() -= ( aPrevSel.GetEnd().GetPara() - aPrevSel.GetStart().GetPara() );
2236*cdf0e10cSrcweir                 if ( aPrevSel.GetEnd().GetPara() == mpImpl->mpDDInfo->maDropPos.GetPara() )
2237*cdf0e10cSrcweir 				{
2238*cdf0e10cSrcweir 					aPaM.GetIndex() =
2239*cdf0e10cSrcweir                         aPaM.GetIndex() - aPrevSel.GetEnd().GetIndex();
2240*cdf0e10cSrcweir                     if ( aPrevSel.GetStart().GetPara() == mpImpl->mpDDInfo->maDropPos.GetPara() )
2241*cdf0e10cSrcweir 						aPaM.GetIndex() =
2242*cdf0e10cSrcweir                             aPaM.GetIndex() + aPrevSel.GetStart().GetIndex();
2243*cdf0e10cSrcweir 				}
2244*cdf0e10cSrcweir 				ImpSetSelection( aPaM );
2245*cdf0e10cSrcweir 
2246*cdf0e10cSrcweir 			}
2247*cdf0e10cSrcweir             mpImpl->mpTextEngine->ImpDeleteText( aPrevSel );
2248*cdf0e10cSrcweir 		}
2249*cdf0e10cSrcweir 
2250*cdf0e10cSrcweir         mpImpl->mpTextEngine->UndoActionEnd();
2251*cdf0e10cSrcweir 
2252*cdf0e10cSrcweir         delete mpImpl->mpDDInfo;
2253*cdf0e10cSrcweir         mpImpl->mpDDInfo = 0;
2254*cdf0e10cSrcweir 
2255*cdf0e10cSrcweir         mpImpl->mpTextEngine->FormatAndUpdate( this );
2256*cdf0e10cSrcweir 
2257*cdf0e10cSrcweir         mpImpl->mpTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) );
2258*cdf0e10cSrcweir     }
2259*cdf0e10cSrcweir     rDTDE.Context->dropComplete( bChanges );
2260*cdf0e10cSrcweir }
2261*cdf0e10cSrcweir 
2262*cdf0e10cSrcweir void TextView::dragEnter( const ::com::sun::star::datatransfer::dnd::DropTargetDragEnterEvent& ) throw (::com::sun::star::uno::RuntimeException)
2263*cdf0e10cSrcweir {
2264*cdf0e10cSrcweir }
2265*cdf0e10cSrcweir 
2266*cdf0e10cSrcweir void TextView::dragExit( const ::com::sun::star::datatransfer::dnd::DropTargetEvent& ) throw (::com::sun::star::uno::RuntimeException)
2267*cdf0e10cSrcweir {
2268*cdf0e10cSrcweir 	vos::OGuard aVclGuard( Application::GetSolarMutex() );
2269*cdf0e10cSrcweir     ImpHideDDCursor();
2270*cdf0e10cSrcweir }
2271*cdf0e10cSrcweir 
2272*cdf0e10cSrcweir void TextView::dragOver( const ::com::sun::star::datatransfer::dnd::DropTargetDragEvent& rDTDE ) throw (::com::sun::star::uno::RuntimeException)
2273*cdf0e10cSrcweir {
2274*cdf0e10cSrcweir 	vos::OGuard aVclGuard( Application::GetSolarMutex() );
2275*cdf0e10cSrcweir 
2276*cdf0e10cSrcweir     if ( !mpImpl->mpDDInfo )
2277*cdf0e10cSrcweir         mpImpl->mpDDInfo = new TextDDInfo;
2278*cdf0e10cSrcweir 
2279*cdf0e10cSrcweir     TextPaM aPrevDropPos = mpImpl->mpDDInfo->maDropPos;
2280*cdf0e10cSrcweir 	Point aMousePos( rDTDE.LocationX, rDTDE.LocationY );
2281*cdf0e10cSrcweir 	Point aDocPos = GetDocPos( aMousePos );
2282*cdf0e10cSrcweir     mpImpl->mpDDInfo->maDropPos = mpImpl->mpTextEngine->GetPaM( aDocPos );
2283*cdf0e10cSrcweir 
2284*cdf0e10cSrcweir /*
2285*cdf0e10cSrcweir     Size aOutSize = mpImpl->mpWindow->GetOutputSizePixel();
2286*cdf0e10cSrcweir 	if ( ( aMousePos.X() < 0 ) || ( aMousePos.X() > aOutSize.Width() ) ||
2287*cdf0e10cSrcweir 		 ( aMousePos.Y() < 0 ) || ( aMousePos.Y() > aOutSize.Height() ) )
2288*cdf0e10cSrcweir 	{
2289*cdf0e10cSrcweir 		// Scroll?
2290*cdf0e10cSrcweir 		// No, I will not receive events for this...
2291*cdf0e10cSrcweir 	}
2292*cdf0e10cSrcweir */
2293*cdf0e10cSrcweir 
2294*cdf0e10cSrcweir     sal_Bool bProtected = sal_False;
2295*cdf0e10cSrcweir     if(mpImpl->mbSupportProtectAttribute)
2296*cdf0e10cSrcweir     {
2297*cdf0e10cSrcweir         const TextCharAttrib* pStartAttr = mpImpl->mpTextEngine->FindCharAttrib(
2298*cdf0e10cSrcweir                     mpImpl->mpDDInfo->maDropPos,
2299*cdf0e10cSrcweir                     TEXTATTR_PROTECTED );
2300*cdf0e10cSrcweir         bProtected = pStartAttr != 0 &&
2301*cdf0e10cSrcweir                 pStartAttr->GetStart() != mpImpl->mpDDInfo->maDropPos.GetIndex() &&
2302*cdf0e10cSrcweir                 pStartAttr->GetEnd() != mpImpl->mpDDInfo->maDropPos.GetIndex();
2303*cdf0e10cSrcweir     }
2304*cdf0e10cSrcweir     // Don't drop in selection or in read only engine
2305*cdf0e10cSrcweir     if ( IsReadOnly() || IsInSelection( mpImpl->mpDDInfo->maDropPos ) || bProtected)
2306*cdf0e10cSrcweir 	{
2307*cdf0e10cSrcweir 		ImpHideDDCursor();
2308*cdf0e10cSrcweir         rDTDE.Context->rejectDrag();
2309*cdf0e10cSrcweir 	}
2310*cdf0e10cSrcweir     else
2311*cdf0e10cSrcweir     {
2312*cdf0e10cSrcweir 	    // Alten Cursor wegzeichnen...
2313*cdf0e10cSrcweir         if ( !mpImpl->mpDDInfo->mbVisCursor || ( aPrevDropPos != mpImpl->mpDDInfo->maDropPos ) )
2314*cdf0e10cSrcweir 	    {
2315*cdf0e10cSrcweir 		    ImpHideDDCursor();
2316*cdf0e10cSrcweir 		    ImpShowDDCursor();
2317*cdf0e10cSrcweir 	    }
2318*cdf0e10cSrcweir         rDTDE.Context->acceptDrag( rDTDE.DropAction );
2319*cdf0e10cSrcweir     }
2320*cdf0e10cSrcweir }
2321*cdf0e10cSrcweir 
2322*cdf0e10cSrcweir Point TextView::ImpGetOutputStartPos( const Point& rStartDocPos ) const
2323*cdf0e10cSrcweir {
2324*cdf0e10cSrcweir 	Point aStartPos( -rStartDocPos.X(), -rStartDocPos.Y() );
2325*cdf0e10cSrcweir     if ( mpImpl->mpTextEngine->IsRightToLeft() )
2326*cdf0e10cSrcweir     {
2327*cdf0e10cSrcweir         Size aSz = mpImpl->mpWindow->GetOutputSizePixel();
2328*cdf0e10cSrcweir 		aStartPos.X() = rStartDocPos.X() + aSz.Width() - 1; // -1: Start is 0
2329*cdf0e10cSrcweir     }
2330*cdf0e10cSrcweir     return aStartPos;
2331*cdf0e10cSrcweir }
2332*cdf0e10cSrcweir 
2333*cdf0e10cSrcweir Point TextView::GetDocPos( const Point& rWindowPos ) const
2334*cdf0e10cSrcweir {
2335*cdf0e10cSrcweir 	// Fensterposition => Dokumentposition
2336*cdf0e10cSrcweir 
2337*cdf0e10cSrcweir 	Point aPoint;
2338*cdf0e10cSrcweir 
2339*cdf0e10cSrcweir     aPoint.Y() = rWindowPos.Y() + mpImpl->maStartDocPos.Y();
2340*cdf0e10cSrcweir 
2341*cdf0e10cSrcweir     if ( !mpImpl->mpTextEngine->IsRightToLeft() )
2342*cdf0e10cSrcweir     {
2343*cdf0e10cSrcweir         aPoint.X() = rWindowPos.X() + mpImpl->maStartDocPos.X();
2344*cdf0e10cSrcweir     }
2345*cdf0e10cSrcweir     else
2346*cdf0e10cSrcweir     {
2347*cdf0e10cSrcweir         Size aSz = mpImpl->mpWindow->GetOutputSizePixel();
2348*cdf0e10cSrcweir         aPoint.X() = ( aSz.Width() - 1 ) - rWindowPos.X() + mpImpl->maStartDocPos.X();
2349*cdf0e10cSrcweir     }
2350*cdf0e10cSrcweir 
2351*cdf0e10cSrcweir 	return aPoint;
2352*cdf0e10cSrcweir }
2353*cdf0e10cSrcweir 
2354*cdf0e10cSrcweir Point TextView::GetWindowPos( const Point& rDocPos ) const
2355*cdf0e10cSrcweir {
2356*cdf0e10cSrcweir 	// Dokumentposition => Fensterposition
2357*cdf0e10cSrcweir 
2358*cdf0e10cSrcweir 	Point aPoint;
2359*cdf0e10cSrcweir 
2360*cdf0e10cSrcweir     aPoint.Y() = rDocPos.Y() - mpImpl->maStartDocPos.Y();
2361*cdf0e10cSrcweir 
2362*cdf0e10cSrcweir     if ( !mpImpl->mpTextEngine->IsRightToLeft() )
2363*cdf0e10cSrcweir     {
2364*cdf0e10cSrcweir         aPoint.X() = rDocPos.X() - mpImpl->maStartDocPos.X();
2365*cdf0e10cSrcweir     }
2366*cdf0e10cSrcweir     else
2367*cdf0e10cSrcweir     {
2368*cdf0e10cSrcweir         Size aSz = mpImpl->mpWindow->GetOutputSizePixel();
2369*cdf0e10cSrcweir         aPoint.X() = ( aSz.Width() - 1 ) - ( rDocPos.X() - mpImpl->maStartDocPos.X() );
2370*cdf0e10cSrcweir     }
2371*cdf0e10cSrcweir 
2372*cdf0e10cSrcweir 	return aPoint;
2373*cdf0e10cSrcweir }
2374*cdf0e10cSrcweir 
2375*cdf0e10cSrcweir sal_Int32 TextView::GetLineNumberOfCursorInSelection() const
2376*cdf0e10cSrcweir {
2377*cdf0e10cSrcweir  // PROGRESS
2378*cdf0e10cSrcweir     sal_Int32 nLineNo = -1;
2379*cdf0e10cSrcweir     if( mpImpl->mbCursorEnabled )
2380*cdf0e10cSrcweir     {
2381*cdf0e10cSrcweir         TextPaM aPaM = GetSelection().GetEnd();
2382*cdf0e10cSrcweir         TEParaPortion* pPPortion = mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() );
2383*cdf0e10cSrcweir         nLineNo = pPPortion->GetLineNumber( aPaM.GetIndex(), sal_False );
2384*cdf0e10cSrcweir         if( mpImpl->mbCursorAtEndOfLine )
2385*cdf0e10cSrcweir             --nLineNo;
2386*cdf0e10cSrcweir     }
2387*cdf0e10cSrcweir     return nLineNo;
2388*cdf0e10cSrcweir }
2389*cdf0e10cSrcweir 
2390*cdf0e10cSrcweir 
2391*cdf0e10cSrcweir // -------------------------------------------------------------------------
2392*cdf0e10cSrcweir // (+) class TextSelFunctionSet
2393*cdf0e10cSrcweir // -------------------------------------------------------------------------
2394*cdf0e10cSrcweir TextSelFunctionSet::TextSelFunctionSet( TextView* pView )
2395*cdf0e10cSrcweir {
2396*cdf0e10cSrcweir 	mpView = pView;
2397*cdf0e10cSrcweir }
2398*cdf0e10cSrcweir 
2399*cdf0e10cSrcweir void __EXPORT TextSelFunctionSet::BeginDrag()
2400*cdf0e10cSrcweir {
2401*cdf0e10cSrcweir }
2402*cdf0e10cSrcweir 
2403*cdf0e10cSrcweir void __EXPORT TextSelFunctionSet::CreateAnchor()
2404*cdf0e10cSrcweir {
2405*cdf0e10cSrcweir //	TextSelection aSel( mpView->GetSelection() );
2406*cdf0e10cSrcweir //	aSel.GetStart() = aSel.GetEnd();
2407*cdf0e10cSrcweir //	mpView->SetSelection( aSel );
2408*cdf0e10cSrcweir 
2409*cdf0e10cSrcweir 	// Es darf kein ShowCursor folgen:
2410*cdf0e10cSrcweir 	mpView->HideSelection();
2411*cdf0e10cSrcweir     mpView->ImpSetSelection( mpView->mpImpl->maSelection.GetEnd() );
2412*cdf0e10cSrcweir }
2413*cdf0e10cSrcweir 
2414*cdf0e10cSrcweir sal_Bool __EXPORT TextSelFunctionSet::SetCursorAtPoint( const Point& rPointPixel, sal_Bool )
2415*cdf0e10cSrcweir {
2416*cdf0e10cSrcweir 	return mpView->SetCursorAtPoint( rPointPixel );
2417*cdf0e10cSrcweir }
2418*cdf0e10cSrcweir 
2419*cdf0e10cSrcweir sal_Bool __EXPORT TextSelFunctionSet::IsSelectionAtPoint( const Point& rPointPixel )
2420*cdf0e10cSrcweir {
2421*cdf0e10cSrcweir 	return mpView->IsSelectionAtPoint( rPointPixel );
2422*cdf0e10cSrcweir }
2423*cdf0e10cSrcweir 
2424*cdf0e10cSrcweir void __EXPORT TextSelFunctionSet::DeselectAll()
2425*cdf0e10cSrcweir {
2426*cdf0e10cSrcweir 	CreateAnchor();
2427*cdf0e10cSrcweir }
2428*cdf0e10cSrcweir 
2429*cdf0e10cSrcweir void __EXPORT TextSelFunctionSet::DeselectAtPoint( const Point& )
2430*cdf0e10cSrcweir {
2431*cdf0e10cSrcweir 	// Nur bei Mehrfachselektion
2432*cdf0e10cSrcweir }
2433*cdf0e10cSrcweir 
2434*cdf0e10cSrcweir void __EXPORT TextSelFunctionSet::DestroyAnchor()
2435*cdf0e10cSrcweir {
2436*cdf0e10cSrcweir 	// Nur bei Mehrfachselektion
2437*cdf0e10cSrcweir }
2438*cdf0e10cSrcweir TextEngine*         TextView::GetTextEngine() const
2439*cdf0e10cSrcweir { return mpImpl->mpTextEngine; }
2440*cdf0e10cSrcweir Window*             TextView::GetWindow() const
2441*cdf0e10cSrcweir { return mpImpl->mpWindow; }
2442*cdf0e10cSrcweir void                TextView::EnableCursor( sal_Bool bEnable )
2443*cdf0e10cSrcweir { mpImpl->mbCursorEnabled = bEnable; }
2444*cdf0e10cSrcweir sal_Bool                TextView::IsCursorEnabled() const
2445*cdf0e10cSrcweir { return mpImpl->mbCursorEnabled; }
2446*cdf0e10cSrcweir void                TextView::SetStartDocPos( const Point& rPos )
2447*cdf0e10cSrcweir { mpImpl->maStartDocPos = rPos; }
2448*cdf0e10cSrcweir const Point&        TextView::GetStartDocPos() const
2449*cdf0e10cSrcweir { return mpImpl->maStartDocPos; }
2450*cdf0e10cSrcweir void                TextView::SetAutoIndentMode( sal_Bool bAutoIndent )
2451*cdf0e10cSrcweir { mpImpl->mbAutoIndent = bAutoIndent; }
2452*cdf0e10cSrcweir sal_Bool                TextView::IsAutoIndentMode() const
2453*cdf0e10cSrcweir { return mpImpl->mbAutoIndent; }
2454*cdf0e10cSrcweir sal_Bool                TextView::IsReadOnly() const
2455*cdf0e10cSrcweir { return mpImpl->mbReadOnly; }
2456*cdf0e10cSrcweir void                TextView::SetAutoScroll( sal_Bool bAutoScroll )
2457*cdf0e10cSrcweir { mpImpl->mbAutoScroll = bAutoScroll; }
2458*cdf0e10cSrcweir sal_Bool                TextView::IsAutoScroll() const
2459*cdf0e10cSrcweir { return mpImpl->mbAutoScroll; }
2460*cdf0e10cSrcweir sal_Bool                TextView::IsPaintSelection() const
2461*cdf0e10cSrcweir { return mpImpl->mbPaintSelection; }
2462*cdf0e10cSrcweir sal_Bool                TextView::IsHighlightSelection() const
2463*cdf0e10cSrcweir { return mpImpl->mbHighlightSelection; }
2464*cdf0e10cSrcweir sal_Bool                TextView::HasSelection() const
2465*cdf0e10cSrcweir { return mpImpl->maSelection.HasRange(); }
2466*cdf0e10cSrcweir sal_Bool                TextView::IsInsertMode() const
2467*cdf0e10cSrcweir { return mpImpl->mbInsertMode; }
2468*cdf0e10cSrcweir void                TextView::SupportProtectAttribute(sal_Bool bSupport)
2469*cdf0e10cSrcweir { mpImpl->mbSupportProtectAttribute = bSupport;}
2470*cdf0e10cSrcweir 
2471