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