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