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 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include <memory> 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir #include "unoiface.hxx" 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <tools/rc.h> 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir #include <vcl/decoview.hxx> 39*cdf0e10cSrcweir #include <vcl/svapp.hxx> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include <svtools/svmedit.hxx> 42*cdf0e10cSrcweir #include <svtools/xtextedt.hxx> 43*cdf0e10cSrcweir #include <svl/brdcst.hxx> 44*cdf0e10cSrcweir #include <svl/undo.hxx> 45*cdf0e10cSrcweir #include <svtools/textwindowpeer.hxx> 46*cdf0e10cSrcweir #include <svl/lstner.hxx> 47*cdf0e10cSrcweir #include <svl/smplhint.hxx> 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir // IDs erstmal aus VCL geklaut, muss mal richtig delivert werden... 51*cdf0e10cSrcweir #define SV_MENU_EDIT_UNDO 1 52*cdf0e10cSrcweir #define SV_MENU_EDIT_CUT 2 53*cdf0e10cSrcweir #define SV_MENU_EDIT_COPY 3 54*cdf0e10cSrcweir #define SV_MENU_EDIT_PASTE 4 55*cdf0e10cSrcweir #define SV_MENU_EDIT_DELETE 5 56*cdf0e10cSrcweir #define SV_MENU_EDIT_SELECTALL 6 57*cdf0e10cSrcweir #define SV_MENU_EDIT_INSERTSYMBOL 7 58*cdf0e10cSrcweir #include <vcl/scrbar.hxx> 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir namespace css = ::com::sun::star; 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir class TextWindow : public Window 63*cdf0e10cSrcweir { 64*cdf0e10cSrcweir private: 65*cdf0e10cSrcweir ExtTextEngine* mpExtTextEngine; 66*cdf0e10cSrcweir ExtTextView* mpExtTextView; 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir sal_Bool mbInMBDown; 69*cdf0e10cSrcweir sal_Bool mbFocusSelectionHide; 70*cdf0e10cSrcweir sal_Bool mbIgnoreTab; 71*cdf0e10cSrcweir sal_Bool mbActivePopup; 72*cdf0e10cSrcweir sal_Bool mbSelectOnTab; 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir public: 75*cdf0e10cSrcweir TextWindow( Window* pParent ); 76*cdf0e10cSrcweir ~TextWindow(); 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir ExtTextEngine* GetTextEngine() const { return mpExtTextEngine; } 79*cdf0e10cSrcweir ExtTextView* GetTextView() const { return mpExtTextView; } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir virtual void MouseMove( const MouseEvent& rMEvt ); 82*cdf0e10cSrcweir virtual void MouseButtonDown( const MouseEvent& rMEvt ); 83*cdf0e10cSrcweir virtual void MouseButtonUp( const MouseEvent& rMEvt ); 84*cdf0e10cSrcweir virtual void KeyInput( const KeyEvent& rKEvent ); 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir virtual void Command( const CommandEvent& rCEvt ); 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir virtual void Paint( const Rectangle& rRect ); 89*cdf0e10cSrcweir virtual void Resize(); 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir virtual void GetFocus(); 92*cdf0e10cSrcweir virtual void LoseFocus(); 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir sal_Bool IsAutoFocusHide() const { return mbFocusSelectionHide; } 95*cdf0e10cSrcweir void SetAutoFocusHide( sal_Bool bAutoHide ) { mbFocusSelectionHide = bAutoHide; } 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir sal_Bool IsIgnoreTab() const { return mbIgnoreTab; } 98*cdf0e10cSrcweir void SetIgnoreTab( sal_Bool bIgnore ) { mbIgnoreTab = bIgnore; } 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir void DisableSelectionOnFocus() {mbSelectOnTab = sal_False;} 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir virtual 103*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > 104*cdf0e10cSrcweir GetComponentInterface(sal_Bool bCreate = sal_True); 105*cdf0e10cSrcweir }; 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir class ImpSvMEdit : public SfxListener 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir private: 111*cdf0e10cSrcweir MultiLineEdit* pSvMultiLineEdit; 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir TextWindow* mpTextWindow; 114*cdf0e10cSrcweir ScrollBar* mpHScrollBar; 115*cdf0e10cSrcweir ScrollBar* mpVScrollBar; 116*cdf0e10cSrcweir ScrollBarBox* mpScrollBox; 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir Point maTextWindowOffset; 119*cdf0e10cSrcweir xub_StrLen mnTextWidth; 120*cdf0e10cSrcweir mutable Selection maSelection; 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir protected: 123*cdf0e10cSrcweir virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 124*cdf0e10cSrcweir void ImpUpdateSrollBarVis( WinBits nWinStyle ); 125*cdf0e10cSrcweir void ImpInitScrollBars(); 126*cdf0e10cSrcweir void ImpSetScrollBarRanges(); 127*cdf0e10cSrcweir void ImpSetHScrollBarThumbPos(); 128*cdf0e10cSrcweir DECL_LINK( ScrollHdl, ScrollBar* ); 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir public: 131*cdf0e10cSrcweir ImpSvMEdit( MultiLineEdit* pSvMultiLineEdit, WinBits nWinStyle ); 132*cdf0e10cSrcweir ~ImpSvMEdit(); 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir void SetModified( sal_Bool bMod ); 135*cdf0e10cSrcweir sal_Bool IsModified() const; 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir void SetReadOnly( sal_Bool bRdOnly ); 138*cdf0e10cSrcweir sal_Bool IsReadOnly() const; 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir void SetMaxTextLen( xub_StrLen nLen ); 141*cdf0e10cSrcweir xub_StrLen GetMaxTextLen() const; 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir void SetInsertMode( sal_Bool bInsert ); 144*cdf0e10cSrcweir sal_Bool IsInsertMode() const; 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir void InsertText( const String& rStr ); 147*cdf0e10cSrcweir String GetSelected() const; 148*cdf0e10cSrcweir String GetSelected( LineEnd aSeparator ) const; 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir void SetSelection( const Selection& rSelection ); 151*cdf0e10cSrcweir const Selection& GetSelection() const; 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir void Cut(); 154*cdf0e10cSrcweir void Copy(); 155*cdf0e10cSrcweir void Paste(); 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir void SetText( const String& rStr ); 158*cdf0e10cSrcweir String GetText() const; 159*cdf0e10cSrcweir String GetText( LineEnd aSeparator ) const; 160*cdf0e10cSrcweir String GetTextLines() const; 161*cdf0e10cSrcweir String GetTextLines( LineEnd aSeparator ) const; 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir void Resize(); 164*cdf0e10cSrcweir void GetFocus(); 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir sal_Bool HandleCommand( const CommandEvent& rCEvt ); 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir void Enable( sal_Bool bEnable ); 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir Size CalcMinimumSize() const; 171*cdf0e10cSrcweir Size CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const; 172*cdf0e10cSrcweir void GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const; 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir void SetAlign( WinBits nWinStyle ); 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir void InitFromStyle( WinBits nWinStyle ); 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir TextWindow* GetTextWindow() { return mpTextWindow; } 179*cdf0e10cSrcweir ScrollBar* GetHScrollBar() { return mpHScrollBar; } 180*cdf0e10cSrcweir ScrollBar* GetVScrollBar() { return mpVScrollBar; } 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir void SetTextWindowOffset( const Point& rOffset ); 183*cdf0e10cSrcweir }; 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir ImpSvMEdit::ImpSvMEdit( MultiLineEdit* pEdt, WinBits nWinStyle ) 186*cdf0e10cSrcweir :mpHScrollBar(NULL) 187*cdf0e10cSrcweir ,mpVScrollBar(NULL) 188*cdf0e10cSrcweir ,mpScrollBox(NULL) 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir pSvMultiLineEdit = pEdt; 191*cdf0e10cSrcweir mnTextWidth = 0; 192*cdf0e10cSrcweir mpTextWindow = new TextWindow( pEdt ); 193*cdf0e10cSrcweir mpTextWindow->Show(); 194*cdf0e10cSrcweir InitFromStyle( nWinStyle ); 195*cdf0e10cSrcweir StartListening( *mpTextWindow->GetTextEngine() ); 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir void ImpSvMEdit::ImpUpdateSrollBarVis( WinBits nWinStyle ) 199*cdf0e10cSrcweir { 200*cdf0e10cSrcweir const sal_Bool bHaveVScroll = (NULL != mpVScrollBar); 201*cdf0e10cSrcweir const sal_Bool bHaveHScroll = (NULL != mpHScrollBar); 202*cdf0e10cSrcweir const sal_Bool bHaveScrollBox = (NULL != mpScrollBox); 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir sal_Bool bNeedVScroll = ( nWinStyle & WB_VSCROLL ) == WB_VSCROLL; 205*cdf0e10cSrcweir const sal_Bool bNeedHScroll = ( nWinStyle & WB_HSCROLL ) == WB_HSCROLL; 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir const sal_Bool bAutoVScroll = ( nWinStyle & WB_AUTOVSCROLL ) == WB_AUTOVSCROLL; 208*cdf0e10cSrcweir if ( !bNeedVScroll && bAutoVScroll ) 209*cdf0e10cSrcweir { 210*cdf0e10cSrcweir TextEngine& rEngine( *mpTextWindow->GetTextEngine() ); 211*cdf0e10cSrcweir sal_uLong nOverallTextHeight(0); 212*cdf0e10cSrcweir for ( sal_uLong i=0; i<rEngine.GetParagraphCount(); ++i ) 213*cdf0e10cSrcweir nOverallTextHeight += rEngine.GetTextHeight( i ); 214*cdf0e10cSrcweir if ( nOverallTextHeight > (sal_uLong)mpTextWindow->GetOutputSizePixel().Height() ) 215*cdf0e10cSrcweir bNeedVScroll = true; 216*cdf0e10cSrcweir } 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir const sal_Bool bNeedScrollBox = bNeedVScroll && bNeedHScroll; 219*cdf0e10cSrcweir 220*cdf0e10cSrcweir sal_Bool bScrollbarsChanged = false; 221*cdf0e10cSrcweir if ( bHaveVScroll != bNeedVScroll ) 222*cdf0e10cSrcweir { 223*cdf0e10cSrcweir delete mpVScrollBar; 224*cdf0e10cSrcweir mpVScrollBar = bNeedVScroll ? new ScrollBar( pSvMultiLineEdit, WB_VSCROLL|WB_DRAG ) : NULL; 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir if ( bNeedVScroll ) 227*cdf0e10cSrcweir { 228*cdf0e10cSrcweir mpVScrollBar->Show(); 229*cdf0e10cSrcweir mpVScrollBar->SetScrollHdl( LINK( this, ImpSvMEdit, ScrollHdl ) ); 230*cdf0e10cSrcweir } 231*cdf0e10cSrcweir 232*cdf0e10cSrcweir bScrollbarsChanged = sal_True; 233*cdf0e10cSrcweir } 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir if ( bHaveHScroll != bNeedHScroll ) 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir delete mpHScrollBar; 238*cdf0e10cSrcweir mpHScrollBar = bNeedHScroll ? new ScrollBar( pSvMultiLineEdit, WB_HSCROLL|WB_DRAG ) : NULL; 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir if ( bNeedHScroll ) 241*cdf0e10cSrcweir { 242*cdf0e10cSrcweir mpHScrollBar->Show(); 243*cdf0e10cSrcweir mpHScrollBar->SetScrollHdl( LINK( this, ImpSvMEdit, ScrollHdl ) ); 244*cdf0e10cSrcweir } 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir bScrollbarsChanged = sal_True; 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir if ( bHaveScrollBox != bNeedScrollBox ) 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir delete mpScrollBox; 252*cdf0e10cSrcweir mpScrollBox = bNeedScrollBox ? new ScrollBarBox( pSvMultiLineEdit, WB_SIZEABLE ) : NULL; 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir if ( bNeedScrollBox ) 255*cdf0e10cSrcweir mpScrollBox->Show(); 256*cdf0e10cSrcweir } 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir if ( bScrollbarsChanged ) 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir ImpInitScrollBars(); 261*cdf0e10cSrcweir Resize(); 262*cdf0e10cSrcweir } 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir 265*cdf0e10cSrcweir void ImpSvMEdit::InitFromStyle( WinBits nWinStyle ) 266*cdf0e10cSrcweir { 267*cdf0e10cSrcweir ImpUpdateSrollBarVis( nWinStyle ); 268*cdf0e10cSrcweir SetAlign( nWinStyle ); 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir if ( nWinStyle & WB_NOHIDESELECTION ) 271*cdf0e10cSrcweir mpTextWindow->SetAutoFocusHide( sal_False ); 272*cdf0e10cSrcweir else 273*cdf0e10cSrcweir mpTextWindow->SetAutoFocusHide( sal_True ); 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir if ( nWinStyle & WB_READONLY ) 276*cdf0e10cSrcweir mpTextWindow->GetTextView()->SetReadOnly( sal_True ); 277*cdf0e10cSrcweir else 278*cdf0e10cSrcweir mpTextWindow->GetTextView()->SetReadOnly( sal_False ); 279*cdf0e10cSrcweir 280*cdf0e10cSrcweir if ( nWinStyle & WB_IGNORETAB ) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir mpTextWindow->SetIgnoreTab( sal_True ); 283*cdf0e10cSrcweir } 284*cdf0e10cSrcweir else 285*cdf0e10cSrcweir { 286*cdf0e10cSrcweir mpTextWindow->SetIgnoreTab( sal_False ); 287*cdf0e10cSrcweir // #103667# MultiLineEdit has the flag, but focusable window also needs this flag 288*cdf0e10cSrcweir WinBits nStyle = mpTextWindow->GetStyle(); 289*cdf0e10cSrcweir nStyle |= WINDOW_DLGCTRL_MOD1TAB; 290*cdf0e10cSrcweir mpTextWindow->SetStyle( nStyle ); 291*cdf0e10cSrcweir } 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir ImpSvMEdit::~ImpSvMEdit() 295*cdf0e10cSrcweir { 296*cdf0e10cSrcweir EndListening( *mpTextWindow->GetTextEngine() ); 297*cdf0e10cSrcweir delete mpTextWindow; 298*cdf0e10cSrcweir delete mpHScrollBar; 299*cdf0e10cSrcweir delete mpVScrollBar; 300*cdf0e10cSrcweir delete mpScrollBox; 301*cdf0e10cSrcweir } 302*cdf0e10cSrcweir 303*cdf0e10cSrcweir void ImpSvMEdit::ImpSetScrollBarRanges() 304*cdf0e10cSrcweir { 305*cdf0e10cSrcweir if ( mpVScrollBar ) 306*cdf0e10cSrcweir { 307*cdf0e10cSrcweir sal_uLong nTextHeight = mpTextWindow->GetTextEngine()->GetTextHeight(); 308*cdf0e10cSrcweir mpVScrollBar->SetRange( Range( 0, (long)nTextHeight-1 ) ); 309*cdf0e10cSrcweir } 310*cdf0e10cSrcweir if ( mpHScrollBar ) 311*cdf0e10cSrcweir { 312*cdf0e10cSrcweir // sal_uLong nTextWidth = mpTextWindow->GetTextEngine()->CalcTextWidth(); 313*cdf0e10cSrcweir // Es gibt kein Notify bei Breiten-Aenderung... 314*cdf0e10cSrcweir // sal_uLong nW = Max( (sal_uLong)mpTextWindow->GetOutputSizePixel().Width()*5, (sal_uLong)nTextWidth ); 315*cdf0e10cSrcweir // mpHScrollBar->SetRange( Range( 0, (long)nW ) ); 316*cdf0e10cSrcweir mpHScrollBar->SetRange( Range( 0, (long)mnTextWidth-1 ) ); 317*cdf0e10cSrcweir } 318*cdf0e10cSrcweir } 319*cdf0e10cSrcweir 320*cdf0e10cSrcweir void ImpSvMEdit::ImpInitScrollBars() 321*cdf0e10cSrcweir { 322*cdf0e10cSrcweir static const sal_Unicode sampleText[] = { 'x', '\0' }; 323*cdf0e10cSrcweir if ( mpHScrollBar || mpVScrollBar ) 324*cdf0e10cSrcweir { 325*cdf0e10cSrcweir ImpSetScrollBarRanges(); 326*cdf0e10cSrcweir Size aCharBox; 327*cdf0e10cSrcweir aCharBox.Width() = mpTextWindow->GetTextWidth( sampleText ); 328*cdf0e10cSrcweir aCharBox.Height() = mpTextWindow->GetTextHeight(); 329*cdf0e10cSrcweir Size aOutSz = mpTextWindow->GetOutputSizePixel(); 330*cdf0e10cSrcweir if ( mpHScrollBar ) 331*cdf0e10cSrcweir { 332*cdf0e10cSrcweir mpHScrollBar->SetVisibleSize( aOutSz.Width() ); 333*cdf0e10cSrcweir mpHScrollBar->SetPageSize( aOutSz.Width() * 8 / 10 ); 334*cdf0e10cSrcweir mpHScrollBar->SetLineSize( aCharBox.Width()*10 ); 335*cdf0e10cSrcweir ImpSetHScrollBarThumbPos(); 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir if ( mpVScrollBar ) 338*cdf0e10cSrcweir { 339*cdf0e10cSrcweir mpVScrollBar->SetVisibleSize( aOutSz.Height() ); 340*cdf0e10cSrcweir mpVScrollBar->SetPageSize( aOutSz.Height() * 8 / 10 ); 341*cdf0e10cSrcweir mpVScrollBar->SetLineSize( aCharBox.Height() ); 342*cdf0e10cSrcweir mpVScrollBar->SetThumbPos( mpTextWindow->GetTextView()->GetStartDocPos().Y() ); 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir } 345*cdf0e10cSrcweir } 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir void ImpSvMEdit::ImpSetHScrollBarThumbPos() 348*cdf0e10cSrcweir { 349*cdf0e10cSrcweir long nX = mpTextWindow->GetTextView()->GetStartDocPos().X(); 350*cdf0e10cSrcweir if ( !mpTextWindow->GetTextEngine()->IsRightToLeft() ) 351*cdf0e10cSrcweir mpHScrollBar->SetThumbPos( nX ); 352*cdf0e10cSrcweir else 353*cdf0e10cSrcweir mpHScrollBar->SetThumbPos( mnTextWidth - mpHScrollBar->GetVisibleSize() - nX ); 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir } 356*cdf0e10cSrcweir 357*cdf0e10cSrcweir IMPL_LINK( ImpSvMEdit, ScrollHdl, ScrollBar*, pCurScrollBar ) 358*cdf0e10cSrcweir { 359*cdf0e10cSrcweir long nDiffX = 0, nDiffY = 0; 360*cdf0e10cSrcweir 361*cdf0e10cSrcweir if ( pCurScrollBar == mpVScrollBar ) 362*cdf0e10cSrcweir nDiffY = mpTextWindow->GetTextView()->GetStartDocPos().Y() - pCurScrollBar->GetThumbPos(); 363*cdf0e10cSrcweir else if ( pCurScrollBar == mpHScrollBar ) 364*cdf0e10cSrcweir nDiffX = mpTextWindow->GetTextView()->GetStartDocPos().X() - pCurScrollBar->GetThumbPos(); 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir mpTextWindow->GetTextView()->Scroll( nDiffX, nDiffY ); 367*cdf0e10cSrcweir // mpTextWindow->GetTextView()->ShowCursor( sal_False, sal_True ); 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir return 0; 370*cdf0e10cSrcweir } 371*cdf0e10cSrcweir 372*cdf0e10cSrcweir 373*cdf0e10cSrcweir // void ImpSvMEdit::ImpModified() 374*cdf0e10cSrcweir // { 375*cdf0e10cSrcweir // // Wann wird das gerufen ????????????????????? 376*cdf0e10cSrcweir // pSvMultiLineEdit->Modify(); 377*cdf0e10cSrcweir // } 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir void ImpSvMEdit::SetAlign( WinBits nWinStyle ) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir sal_Bool bRTL = Application::GetSettings().GetLayoutRTL(); 382*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetRightToLeft( bRTL ); 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir if ( nWinStyle & WB_CENTER ) 385*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetTextAlign( TXTALIGN_CENTER ); 386*cdf0e10cSrcweir else if ( nWinStyle & WB_RIGHT ) 387*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetTextAlign( !bRTL ? TXTALIGN_RIGHT : TXTALIGN_LEFT ); 388*cdf0e10cSrcweir else if ( nWinStyle & WB_LEFT ) 389*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetTextAlign( !bRTL ? TXTALIGN_LEFT : TXTALIGN_RIGHT ); 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir void ImpSvMEdit::SetTextWindowOffset( const Point& rOffset ) 393*cdf0e10cSrcweir { 394*cdf0e10cSrcweir maTextWindowOffset = rOffset; 395*cdf0e10cSrcweir Resize(); 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir void ImpSvMEdit::SetModified( sal_Bool bMod ) 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetModified( bMod ); 401*cdf0e10cSrcweir } 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir sal_Bool ImpSvMEdit::IsModified() const 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir return mpTextWindow->GetTextEngine()->IsModified(); 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir void ImpSvMEdit::SetInsertMode( sal_Bool bInsert ) 409*cdf0e10cSrcweir { 410*cdf0e10cSrcweir mpTextWindow->GetTextView()->SetInsertMode( bInsert ); 411*cdf0e10cSrcweir } 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir void ImpSvMEdit::SetReadOnly( sal_Bool bRdOnly ) 414*cdf0e10cSrcweir { 415*cdf0e10cSrcweir mpTextWindow->GetTextView()->SetReadOnly( bRdOnly ); 416*cdf0e10cSrcweir // Farbe anpassen ??????????????????????????? 417*cdf0e10cSrcweir } 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir sal_Bool ImpSvMEdit::IsReadOnly() const 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir return mpTextWindow->GetTextView()->IsReadOnly(); 422*cdf0e10cSrcweir } 423*cdf0e10cSrcweir 424*cdf0e10cSrcweir void ImpSvMEdit::SetMaxTextLen( xub_StrLen nLen ) 425*cdf0e10cSrcweir { 426*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetMaxTextLen( nLen ); 427*cdf0e10cSrcweir } 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir xub_StrLen ImpSvMEdit::GetMaxTextLen() const 430*cdf0e10cSrcweir { 431*cdf0e10cSrcweir return sal::static_int_cast< xub_StrLen >( 432*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->GetMaxTextLen()); 433*cdf0e10cSrcweir } 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir void ImpSvMEdit::InsertText( const String& rStr ) 436*cdf0e10cSrcweir { 437*cdf0e10cSrcweir mpTextWindow->GetTextView()->InsertText( rStr ); 438*cdf0e10cSrcweir } 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir String ImpSvMEdit::GetSelected() const 441*cdf0e10cSrcweir { 442*cdf0e10cSrcweir return mpTextWindow->GetTextView()->GetSelected(); 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir String ImpSvMEdit::GetSelected( LineEnd aSeparator ) const 446*cdf0e10cSrcweir { 447*cdf0e10cSrcweir return mpTextWindow->GetTextView()->GetSelected( aSeparator ); 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir void ImpSvMEdit::Resize() 451*cdf0e10cSrcweir { 452*cdf0e10cSrcweir size_t nIteration = 1; 453*cdf0e10cSrcweir do 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir WinBits nWinStyle( pSvMultiLineEdit->GetStyle() ); 456*cdf0e10cSrcweir if ( ( nWinStyle & WB_AUTOVSCROLL ) == WB_AUTOVSCROLL ) 457*cdf0e10cSrcweir ImpUpdateSrollBarVis( nWinStyle ); 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir Size aSz = pSvMultiLineEdit->GetOutputSizePixel(); 460*cdf0e10cSrcweir Size aEditSize = aSz; 461*cdf0e10cSrcweir long nSBWidth = pSvMultiLineEdit->GetSettings().GetStyleSettings().GetScrollBarSize(); 462*cdf0e10cSrcweir nSBWidth = pSvMultiLineEdit->CalcZoom( nSBWidth ); 463*cdf0e10cSrcweir 464*cdf0e10cSrcweir if ( mpHScrollBar ) 465*cdf0e10cSrcweir aSz.Height() -= nSBWidth+1; 466*cdf0e10cSrcweir if ( mpVScrollBar ) 467*cdf0e10cSrcweir aSz.Width() -= nSBWidth+1; 468*cdf0e10cSrcweir 469*cdf0e10cSrcweir if ( !mpHScrollBar ) 470*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetMaxTextWidth( aSz.Width() ); 471*cdf0e10cSrcweir else 472*cdf0e10cSrcweir mpHScrollBar->SetPosSizePixel( 0, aEditSize.Height()-nSBWidth, aSz.Width(), nSBWidth ); 473*cdf0e10cSrcweir 474*cdf0e10cSrcweir Point aTextWindowPos( maTextWindowOffset ); 475*cdf0e10cSrcweir if ( mpVScrollBar ) 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir if( Application::GetSettings().GetLayoutRTL() ) 478*cdf0e10cSrcweir { 479*cdf0e10cSrcweir mpVScrollBar->SetPosSizePixel( 0, 0, nSBWidth, aSz.Height() ); 480*cdf0e10cSrcweir aTextWindowPos.X() += nSBWidth; 481*cdf0e10cSrcweir } 482*cdf0e10cSrcweir else 483*cdf0e10cSrcweir mpVScrollBar->SetPosSizePixel( aEditSize.Width()-nSBWidth, 0, nSBWidth, aSz.Height() ); 484*cdf0e10cSrcweir } 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir if ( mpScrollBox ) 487*cdf0e10cSrcweir mpScrollBox->SetPosSizePixel( aSz.Width(), aSz.Height(), nSBWidth, nSBWidth ); 488*cdf0e10cSrcweir 489*cdf0e10cSrcweir Size aTextWindowSize( aSz ); 490*cdf0e10cSrcweir aTextWindowSize.Width() -= maTextWindowOffset.X(); 491*cdf0e10cSrcweir aTextWindowSize.Height() -= maTextWindowOffset.Y(); 492*cdf0e10cSrcweir if ( aTextWindowSize.Width() < 0 ) 493*cdf0e10cSrcweir aTextWindowSize.Width() = 0; 494*cdf0e10cSrcweir if ( aTextWindowSize.Height() < 0 ) 495*cdf0e10cSrcweir aTextWindowSize.Height() = 0; 496*cdf0e10cSrcweir 497*cdf0e10cSrcweir Size aOldTextWindowSize( mpTextWindow->GetSizePixel() ); 498*cdf0e10cSrcweir mpTextWindow->SetPosSizePixel( aTextWindowPos, aTextWindowSize ); 499*cdf0e10cSrcweir if ( aOldTextWindowSize == aTextWindowSize ) 500*cdf0e10cSrcweir break; 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir // Changing the text window size might effectively have changed the need for 503*cdf0e10cSrcweir // scrollbars, so do another iteration. 504*cdf0e10cSrcweir ++nIteration; 505*cdf0e10cSrcweir OSL_ENSURE( nIteration < 3, "ImpSvMEdit::Resize: isn't this expected to terminate with the second iteration?" ); 506*cdf0e10cSrcweir 507*cdf0e10cSrcweir } while ( nIteration <= 3 ); // artificial break after four iterations 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir ImpInitScrollBars(); 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir void ImpSvMEdit::GetFocus() 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir mpTextWindow->GrabFocus(); 515*cdf0e10cSrcweir } 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir void ImpSvMEdit::Cut() 518*cdf0e10cSrcweir { 519*cdf0e10cSrcweir if ( !mpTextWindow->GetTextView()->IsReadOnly() ) 520*cdf0e10cSrcweir mpTextWindow->GetTextView()->Cut(); 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir 523*cdf0e10cSrcweir void ImpSvMEdit::Copy() 524*cdf0e10cSrcweir { 525*cdf0e10cSrcweir mpTextWindow->GetTextView()->Copy(); 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir void ImpSvMEdit::Paste() 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir if ( !mpTextWindow->GetTextView()->IsReadOnly() ) 531*cdf0e10cSrcweir mpTextWindow->GetTextView()->Paste(); 532*cdf0e10cSrcweir } 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir void ImpSvMEdit::SetText( const String& rStr ) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir sal_Bool bWasModified = mpTextWindow->GetTextEngine()->IsModified(); 537*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetText( rStr ); 538*cdf0e10cSrcweir if ( !bWasModified ) 539*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->SetModified( sal_False ); 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir mpTextWindow->GetTextView()->SetSelection( TextSelection() ); 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir WinBits nWinStyle( pSvMultiLineEdit->GetStyle() ); 544*cdf0e10cSrcweir if ( ( nWinStyle & WB_AUTOVSCROLL ) == WB_AUTOVSCROLL ) 545*cdf0e10cSrcweir ImpUpdateSrollBarVis( nWinStyle ); 546*cdf0e10cSrcweir } 547*cdf0e10cSrcweir 548*cdf0e10cSrcweir String ImpSvMEdit::GetText() const 549*cdf0e10cSrcweir { 550*cdf0e10cSrcweir return mpTextWindow->GetTextEngine()->GetText(); 551*cdf0e10cSrcweir } 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir String ImpSvMEdit::GetText( LineEnd aSeparator ) const 554*cdf0e10cSrcweir { 555*cdf0e10cSrcweir return mpTextWindow->GetTextEngine()->GetText( aSeparator ); 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir String ImpSvMEdit::GetTextLines() const 559*cdf0e10cSrcweir { 560*cdf0e10cSrcweir return mpTextWindow->GetTextEngine()->GetTextLines(); 561*cdf0e10cSrcweir } 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir String ImpSvMEdit::GetTextLines( LineEnd aSeparator ) const 564*cdf0e10cSrcweir { 565*cdf0e10cSrcweir return mpTextWindow->GetTextEngine()->GetTextLines( aSeparator ); 566*cdf0e10cSrcweir } 567*cdf0e10cSrcweir 568*cdf0e10cSrcweir void ImpSvMEdit::Notify( SfxBroadcaster&, const SfxHint& rHint ) 569*cdf0e10cSrcweir { 570*cdf0e10cSrcweir if ( rHint.ISA( TextHint ) ) 571*cdf0e10cSrcweir { 572*cdf0e10cSrcweir const TextHint& rTextHint = (const TextHint&)rHint; 573*cdf0e10cSrcweir if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED ) 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir if ( mpHScrollBar ) 576*cdf0e10cSrcweir ImpSetHScrollBarThumbPos(); 577*cdf0e10cSrcweir if ( mpVScrollBar ) 578*cdf0e10cSrcweir mpVScrollBar->SetThumbPos( mpTextWindow->GetTextView()->GetStartDocPos().Y() ); 579*cdf0e10cSrcweir } 580*cdf0e10cSrcweir else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED ) 581*cdf0e10cSrcweir { 582*cdf0e10cSrcweir if ( mpTextWindow->GetTextView()->GetStartDocPos().Y() ) 583*cdf0e10cSrcweir { 584*cdf0e10cSrcweir long nOutHeight = mpTextWindow->GetOutputSizePixel().Height(); 585*cdf0e10cSrcweir long nTextHeight = mpTextWindow->GetTextEngine()->GetTextHeight(); 586*cdf0e10cSrcweir if ( nTextHeight < nOutHeight ) 587*cdf0e10cSrcweir mpTextWindow->GetTextView()->Scroll( 0, mpTextWindow->GetTextView()->GetStartDocPos().Y() ); 588*cdf0e10cSrcweir } 589*cdf0e10cSrcweir 590*cdf0e10cSrcweir ImpSetScrollBarRanges(); 591*cdf0e10cSrcweir } 592*cdf0e10cSrcweir else if( rTextHint.GetId() == TEXT_HINT_TEXTFORMATTED ) 593*cdf0e10cSrcweir { 594*cdf0e10cSrcweir if ( mpHScrollBar ) 595*cdf0e10cSrcweir { 596*cdf0e10cSrcweir sal_uLong nWidth = mpTextWindow->GetTextEngine()->CalcTextWidth(); 597*cdf0e10cSrcweir if ( nWidth != mnTextWidth ) 598*cdf0e10cSrcweir { 599*cdf0e10cSrcweir mnTextWidth = sal::static_int_cast< xub_StrLen >(nWidth); 600*cdf0e10cSrcweir mpHScrollBar->SetRange( Range( 0, (long)mnTextWidth-1 ) ); 601*cdf0e10cSrcweir ImpSetHScrollBarThumbPos(); 602*cdf0e10cSrcweir } 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir } 605*cdf0e10cSrcweir else if( rTextHint.GetId() == TEXT_HINT_MODIFIED ) 606*cdf0e10cSrcweir { 607*cdf0e10cSrcweir pSvMultiLineEdit->Modify(); 608*cdf0e10cSrcweir } 609*cdf0e10cSrcweir } 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir void ImpSvMEdit::SetSelection( const Selection& rSelection ) 613*cdf0e10cSrcweir { 614*cdf0e10cSrcweir String aText = mpTextWindow->GetTextEngine()->GetText(); 615*cdf0e10cSrcweir 616*cdf0e10cSrcweir Selection aNewSelection( rSelection ); 617*cdf0e10cSrcweir if ( aNewSelection.Min() < 0 ) 618*cdf0e10cSrcweir aNewSelection.Min() = 0; 619*cdf0e10cSrcweir else if ( aNewSelection.Min() > aText.Len() ) 620*cdf0e10cSrcweir aNewSelection.Min() = aText.Len(); 621*cdf0e10cSrcweir if ( aNewSelection.Max() < 0 ) 622*cdf0e10cSrcweir aNewSelection.Max() = 0; 623*cdf0e10cSrcweir else if ( aNewSelection.Max() > aText.Len() ) 624*cdf0e10cSrcweir aNewSelection.Max() = aText.Len(); 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir long nEnd = Max( aNewSelection.Min(), aNewSelection.Max() ); 627*cdf0e10cSrcweir TextSelection aTextSel; 628*cdf0e10cSrcweir sal_uLong nPara = 0; 629*cdf0e10cSrcweir sal_uInt16 nChar = 0; 630*cdf0e10cSrcweir sal_uInt16 x = 0; 631*cdf0e10cSrcweir while ( x <= nEnd ) 632*cdf0e10cSrcweir { 633*cdf0e10cSrcweir if ( x == aNewSelection.Min() ) 634*cdf0e10cSrcweir aTextSel.GetStart() = TextPaM( nPara, nChar ); 635*cdf0e10cSrcweir if ( x == aNewSelection.Max() ) 636*cdf0e10cSrcweir aTextSel.GetEnd() = TextPaM( nPara, nChar ); 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir if ( ( x < aText.Len() ) && ( aText.GetChar( x ) == '\n' ) ) 639*cdf0e10cSrcweir { 640*cdf0e10cSrcweir nPara++; 641*cdf0e10cSrcweir nChar = 0; 642*cdf0e10cSrcweir } 643*cdf0e10cSrcweir else 644*cdf0e10cSrcweir nChar++; 645*cdf0e10cSrcweir x++; 646*cdf0e10cSrcweir } 647*cdf0e10cSrcweir mpTextWindow->GetTextView()->SetSelection( aTextSel ); 648*cdf0e10cSrcweir } 649*cdf0e10cSrcweir 650*cdf0e10cSrcweir const Selection& ImpSvMEdit::GetSelection() const 651*cdf0e10cSrcweir { 652*cdf0e10cSrcweir maSelection = Selection(); 653*cdf0e10cSrcweir TextSelection aTextSel( mpTextWindow->GetTextView()->GetSelection() ); 654*cdf0e10cSrcweir aTextSel.Justify(); 655*cdf0e10cSrcweir // Selektion flachklopfen => jeder Umbruch ein Zeichen... 656*cdf0e10cSrcweir 657*cdf0e10cSrcweir ExtTextEngine* pExtTextEngine = mpTextWindow->GetTextEngine(); 658*cdf0e10cSrcweir // Absaetze davor: 659*cdf0e10cSrcweir sal_uLong n; 660*cdf0e10cSrcweir for ( n = 0; n < aTextSel.GetStart().GetPara(); n++ ) 661*cdf0e10cSrcweir { 662*cdf0e10cSrcweir maSelection.Min() += pExtTextEngine->GetTextLen( n ); 663*cdf0e10cSrcweir maSelection.Min()++; 664*cdf0e10cSrcweir } 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir // Erster Absatz mit Selektion: 667*cdf0e10cSrcweir maSelection.Max() = maSelection.Min(); 668*cdf0e10cSrcweir maSelection.Min() += aTextSel.GetStart().GetIndex(); 669*cdf0e10cSrcweir 670*cdf0e10cSrcweir for ( n = aTextSel.GetStart().GetPara(); n < aTextSel.GetEnd().GetPara(); n++ ) 671*cdf0e10cSrcweir { 672*cdf0e10cSrcweir maSelection.Max() += pExtTextEngine->GetTextLen( n ); 673*cdf0e10cSrcweir maSelection.Max()++; 674*cdf0e10cSrcweir } 675*cdf0e10cSrcweir 676*cdf0e10cSrcweir maSelection.Max() += aTextSel.GetEnd().GetIndex(); 677*cdf0e10cSrcweir 678*cdf0e10cSrcweir return maSelection; 679*cdf0e10cSrcweir } 680*cdf0e10cSrcweir 681*cdf0e10cSrcweir Size ImpSvMEdit::CalcMinimumSize() const 682*cdf0e10cSrcweir { 683*cdf0e10cSrcweir Size aSz( mpTextWindow->GetTextEngine()->CalcTextWidth(), 684*cdf0e10cSrcweir mpTextWindow->GetTextEngine()->GetTextHeight() ); 685*cdf0e10cSrcweir 686*cdf0e10cSrcweir if ( mpHScrollBar ) 687*cdf0e10cSrcweir aSz.Height() += mpHScrollBar->GetSizePixel().Height(); 688*cdf0e10cSrcweir if ( mpVScrollBar ) 689*cdf0e10cSrcweir aSz.Width() += mpVScrollBar->GetSizePixel().Width(); 690*cdf0e10cSrcweir 691*cdf0e10cSrcweir return aSz; 692*cdf0e10cSrcweir } 693*cdf0e10cSrcweir 694*cdf0e10cSrcweir Size ImpSvMEdit::CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const 695*cdf0e10cSrcweir { 696*cdf0e10cSrcweir static const sal_Unicode sampleText[] = { 'X', '\0' }; 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir Size aSz; 699*cdf0e10cSrcweir Size aCharSz; 700*cdf0e10cSrcweir aCharSz.Width() = mpTextWindow->GetTextWidth( sampleText ); 701*cdf0e10cSrcweir aCharSz.Height() = mpTextWindow->GetTextHeight(); 702*cdf0e10cSrcweir 703*cdf0e10cSrcweir if ( nLines ) 704*cdf0e10cSrcweir aSz.Height() = nLines*aCharSz.Height(); 705*cdf0e10cSrcweir else 706*cdf0e10cSrcweir aSz.Height() = mpTextWindow->GetTextEngine()->GetTextHeight(); 707*cdf0e10cSrcweir 708*cdf0e10cSrcweir if ( nColumns ) 709*cdf0e10cSrcweir aSz.Width() = nColumns*aCharSz.Width(); 710*cdf0e10cSrcweir else 711*cdf0e10cSrcweir aSz.Width() = mpTextWindow->GetTextEngine()->CalcTextWidth(); 712*cdf0e10cSrcweir 713*cdf0e10cSrcweir if ( mpHScrollBar ) 714*cdf0e10cSrcweir aSz.Height() += mpHScrollBar->GetSizePixel().Height(); 715*cdf0e10cSrcweir if ( mpVScrollBar ) 716*cdf0e10cSrcweir aSz.Width() += mpVScrollBar->GetSizePixel().Width(); 717*cdf0e10cSrcweir 718*cdf0e10cSrcweir return aSz; 719*cdf0e10cSrcweir } 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir void ImpSvMEdit::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const 722*cdf0e10cSrcweir { 723*cdf0e10cSrcweir static const sal_Unicode sampleText[] = { 'x', '\0' }; 724*cdf0e10cSrcweir Size aOutSz = mpTextWindow->GetOutputSizePixel(); 725*cdf0e10cSrcweir Size aCharSz( mpTextWindow->GetTextWidth( sampleText ), mpTextWindow->GetTextHeight() ); 726*cdf0e10cSrcweir rnCols = (sal_uInt16) (aOutSz.Width()/aCharSz.Width()); 727*cdf0e10cSrcweir rnLines = (sal_uInt16) (aOutSz.Height()/aCharSz.Height()); 728*cdf0e10cSrcweir } 729*cdf0e10cSrcweir 730*cdf0e10cSrcweir void ImpSvMEdit::Enable( sal_Bool bEnable ) 731*cdf0e10cSrcweir { 732*cdf0e10cSrcweir mpTextWindow->Enable( bEnable ); 733*cdf0e10cSrcweir if ( mpHScrollBar ) 734*cdf0e10cSrcweir mpHScrollBar->Enable( bEnable ); 735*cdf0e10cSrcweir if ( mpVScrollBar ) 736*cdf0e10cSrcweir mpVScrollBar->Enable( bEnable ); 737*cdf0e10cSrcweir } 738*cdf0e10cSrcweir 739*cdf0e10cSrcweir sal_Bool ImpSvMEdit::HandleCommand( const CommandEvent& rCEvt ) 740*cdf0e10cSrcweir { 741*cdf0e10cSrcweir sal_Bool bDone = sal_False; 742*cdf0e10cSrcweir if ( ( rCEvt.GetCommand() == COMMAND_WHEEL ) || 743*cdf0e10cSrcweir ( rCEvt.GetCommand() == COMMAND_STARTAUTOSCROLL ) || 744*cdf0e10cSrcweir ( rCEvt.GetCommand() == COMMAND_AUTOSCROLL ) ) 745*cdf0e10cSrcweir { 746*cdf0e10cSrcweir mpTextWindow->HandleScrollCommand( rCEvt, mpHScrollBar, mpVScrollBar ); 747*cdf0e10cSrcweir bDone = sal_True; 748*cdf0e10cSrcweir } 749*cdf0e10cSrcweir return bDone; 750*cdf0e10cSrcweir } 751*cdf0e10cSrcweir 752*cdf0e10cSrcweir 753*cdf0e10cSrcweir TextWindow::TextWindow( Window* pParent ) : Window( pParent ) 754*cdf0e10cSrcweir { 755*cdf0e10cSrcweir mbInMBDown = sal_False; 756*cdf0e10cSrcweir mbSelectOnTab = sal_True; 757*cdf0e10cSrcweir mbFocusSelectionHide = sal_False; 758*cdf0e10cSrcweir mbIgnoreTab = sal_False; 759*cdf0e10cSrcweir mbActivePopup = sal_False; 760*cdf0e10cSrcweir mbSelectOnTab = sal_True; 761*cdf0e10cSrcweir 762*cdf0e10cSrcweir SetPointer( Pointer( POINTER_TEXT ) ); 763*cdf0e10cSrcweir 764*cdf0e10cSrcweir mpExtTextEngine = new ExtTextEngine; 765*cdf0e10cSrcweir mpExtTextEngine->SetMaxTextLen( STRING_MAXLEN ); 766*cdf0e10cSrcweir if( pParent->GetStyle() & WB_BORDER ) 767*cdf0e10cSrcweir mpExtTextEngine->SetLeftMargin( 2 ); 768*cdf0e10cSrcweir mpExtTextEngine->SetLocale( GetSettings().GetLocale() ); 769*cdf0e10cSrcweir mpExtTextView = new ExtTextView( mpExtTextEngine, this ); 770*cdf0e10cSrcweir mpExtTextEngine->InsertView( mpExtTextView ); 771*cdf0e10cSrcweir mpExtTextEngine->EnableUndo( sal_True ); 772*cdf0e10cSrcweir mpExtTextView->ShowCursor(); 773*cdf0e10cSrcweir 774*cdf0e10cSrcweir Color aBackgroundColor = GetSettings().GetStyleSettings().GetWorkspaceColor(); 775*cdf0e10cSrcweir SetBackground( aBackgroundColor ); 776*cdf0e10cSrcweir pParent->SetBackground( aBackgroundColor ); 777*cdf0e10cSrcweir } 778*cdf0e10cSrcweir 779*cdf0e10cSrcweir TextWindow::~TextWindow() 780*cdf0e10cSrcweir { 781*cdf0e10cSrcweir delete mpExtTextView; 782*cdf0e10cSrcweir delete mpExtTextEngine; 783*cdf0e10cSrcweir } 784*cdf0e10cSrcweir 785*cdf0e10cSrcweir void TextWindow::MouseMove( const MouseEvent& rMEvt ) 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir mpExtTextView->MouseMove( rMEvt ); 788*cdf0e10cSrcweir Window::MouseMove( rMEvt ); 789*cdf0e10cSrcweir } 790*cdf0e10cSrcweir 791*cdf0e10cSrcweir void TextWindow::MouseButtonDown( const MouseEvent& rMEvt ) 792*cdf0e10cSrcweir { 793*cdf0e10cSrcweir mbInMBDown = sal_True; // Dann im GetFocus nicht alles selektieren wird 794*cdf0e10cSrcweir mpExtTextView->MouseButtonDown( rMEvt ); 795*cdf0e10cSrcweir Window::MouseButtonDown( rMEvt ); 796*cdf0e10cSrcweir GrabFocus(); 797*cdf0e10cSrcweir mbInMBDown = sal_False; 798*cdf0e10cSrcweir } 799*cdf0e10cSrcweir 800*cdf0e10cSrcweir void TextWindow::MouseButtonUp( const MouseEvent& rMEvt ) 801*cdf0e10cSrcweir { 802*cdf0e10cSrcweir mpExtTextView->MouseButtonUp( rMEvt ); 803*cdf0e10cSrcweir Window::MouseButtonUp( rMEvt ); 804*cdf0e10cSrcweir } 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir void TextWindow::KeyInput( const KeyEvent& rKEvent ) 807*cdf0e10cSrcweir { 808*cdf0e10cSrcweir sal_Bool bDone = sal_False; 809*cdf0e10cSrcweir sal_uInt16 nCode = rKEvent.GetKeyCode().GetCode(); 810*cdf0e10cSrcweir if ( nCode == com::sun::star::awt::Key::SELECT_ALL || 811*cdf0e10cSrcweir ( (nCode == KEY_A) && rKEvent.GetKeyCode().IsMod1() && !rKEvent.GetKeyCode().IsMod2() ) 812*cdf0e10cSrcweir ) 813*cdf0e10cSrcweir { 814*cdf0e10cSrcweir mpExtTextView->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFF, 0xFFFF ) ) ); 815*cdf0e10cSrcweir bDone = sal_True; 816*cdf0e10cSrcweir } 817*cdf0e10cSrcweir else if ( (nCode == KEY_S) && rKEvent.GetKeyCode().IsShift() && rKEvent.GetKeyCode().IsMod1() ) 818*cdf0e10cSrcweir { 819*cdf0e10cSrcweir if ( Edit::GetGetSpecialCharsFunction() ) 820*cdf0e10cSrcweir { 821*cdf0e10cSrcweir // Damit die Selektion erhalten bleibt 822*cdf0e10cSrcweir mbActivePopup = sal_True; 823*cdf0e10cSrcweir XubString aChars = Edit::GetGetSpecialCharsFunction()( this, GetFont() ); 824*cdf0e10cSrcweir if ( aChars.Len() ) 825*cdf0e10cSrcweir { 826*cdf0e10cSrcweir mpExtTextView->InsertText( aChars ); 827*cdf0e10cSrcweir mpExtTextView->GetTextEngine()->SetModified( sal_True ); 828*cdf0e10cSrcweir } 829*cdf0e10cSrcweir mbActivePopup = sal_False; 830*cdf0e10cSrcweir bDone = sal_True; 831*cdf0e10cSrcweir } 832*cdf0e10cSrcweir } 833*cdf0e10cSrcweir else if ( nCode == KEY_TAB ) 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir if ( !mbIgnoreTab || rKEvent.GetKeyCode().IsMod1() ) 836*cdf0e10cSrcweir bDone = mpExtTextView->KeyInput( rKEvent ); 837*cdf0e10cSrcweir } 838*cdf0e10cSrcweir else 839*cdf0e10cSrcweir { 840*cdf0e10cSrcweir bDone = mpExtTextView->KeyInput( rKEvent ); 841*cdf0e10cSrcweir } 842*cdf0e10cSrcweir 843*cdf0e10cSrcweir if ( !bDone ) 844*cdf0e10cSrcweir Window::KeyInput( rKEvent ); 845*cdf0e10cSrcweir } 846*cdf0e10cSrcweir 847*cdf0e10cSrcweir void TextWindow::Paint( const Rectangle& rRect ) 848*cdf0e10cSrcweir { 849*cdf0e10cSrcweir mpExtTextView->Paint( rRect ); 850*cdf0e10cSrcweir } 851*cdf0e10cSrcweir 852*cdf0e10cSrcweir void TextWindow::Resize() 853*cdf0e10cSrcweir { 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir 856*cdf0e10cSrcweir void TextWindow::Command( const CommandEvent& rCEvt ) 857*cdf0e10cSrcweir { 858*cdf0e10cSrcweir if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) 859*cdf0e10cSrcweir { 860*cdf0e10cSrcweir PopupMenu* pPopup = Edit::CreatePopupMenu(); 861*cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 862*cdf0e10cSrcweir if ( rStyleSettings.GetOptions() & STYLE_OPTION_HIDEDISABLED ) 863*cdf0e10cSrcweir pPopup->SetMenuFlags( MENU_FLAG_HIDEDISABLEDENTRIES ); 864*cdf0e10cSrcweir if ( !mpExtTextView->HasSelection() ) 865*cdf0e10cSrcweir { 866*cdf0e10cSrcweir pPopup->EnableItem( SV_MENU_EDIT_CUT, sal_False ); 867*cdf0e10cSrcweir pPopup->EnableItem( SV_MENU_EDIT_COPY, sal_False ); 868*cdf0e10cSrcweir pPopup->EnableItem( SV_MENU_EDIT_DELETE, sal_False ); 869*cdf0e10cSrcweir } 870*cdf0e10cSrcweir if ( mpExtTextView->IsReadOnly() ) 871*cdf0e10cSrcweir { 872*cdf0e10cSrcweir pPopup->EnableItem( SV_MENU_EDIT_CUT, sal_False ); 873*cdf0e10cSrcweir pPopup->EnableItem( SV_MENU_EDIT_PASTE, sal_False ); 874*cdf0e10cSrcweir pPopup->EnableItem( SV_MENU_EDIT_DELETE, sal_False ); 875*cdf0e10cSrcweir pPopup->EnableItem( SV_MENU_EDIT_INSERTSYMBOL, sal_False ); 876*cdf0e10cSrcweir } 877*cdf0e10cSrcweir if ( !mpExtTextView->GetTextEngine()->HasUndoManager() || !mpExtTextView->GetTextEngine()->GetUndoManager().GetUndoActionCount() ) 878*cdf0e10cSrcweir { 879*cdf0e10cSrcweir pPopup->EnableItem( SV_MENU_EDIT_UNDO, sal_False ); 880*cdf0e10cSrcweir } 881*cdf0e10cSrcweir // if ( ( maSelection.Min() == 0 ) && ( maSelection.Max() == maText.Len() ) ) 882*cdf0e10cSrcweir // { 883*cdf0e10cSrcweir // pPopup->EnableItem( SV_MENU_EDIT_SELECTALL, sal_False ); 884*cdf0e10cSrcweir // } 885*cdf0e10cSrcweir if ( !Edit::GetGetSpecialCharsFunction() ) 886*cdf0e10cSrcweir { 887*cdf0e10cSrcweir sal_uInt16 nPos = pPopup->GetItemPos( SV_MENU_EDIT_INSERTSYMBOL ); 888*cdf0e10cSrcweir pPopup->RemoveItem( nPos ); 889*cdf0e10cSrcweir pPopup->RemoveItem( nPos-1 ); 890*cdf0e10cSrcweir } 891*cdf0e10cSrcweir 892*cdf0e10cSrcweir mbActivePopup = sal_True; 893*cdf0e10cSrcweir Point aPos = rCEvt.GetMousePosPixel(); 894*cdf0e10cSrcweir if ( !rCEvt.IsMouseEvent() ) 895*cdf0e10cSrcweir { 896*cdf0e10cSrcweir // !!! Irgendwann einmal Menu zentriert in der Selektion anzeigen !!! 897*cdf0e10cSrcweir Size aSize = GetOutputSizePixel(); 898*cdf0e10cSrcweir aPos = Point( aSize.Width()/2, aSize.Height()/2 ); 899*cdf0e10cSrcweir } 900*cdf0e10cSrcweir // pPopup->RemoveDisabledEntries(); 901*cdf0e10cSrcweir sal_uInt16 n = pPopup->Execute( this, aPos ); 902*cdf0e10cSrcweir Edit::DeletePopupMenu( pPopup ); 903*cdf0e10cSrcweir switch ( n ) 904*cdf0e10cSrcweir { 905*cdf0e10cSrcweir case SV_MENU_EDIT_UNDO: mpExtTextView->Undo(); 906*cdf0e10cSrcweir mpExtTextEngine->SetModified( sal_True ); 907*cdf0e10cSrcweir mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); 908*cdf0e10cSrcweir break; 909*cdf0e10cSrcweir case SV_MENU_EDIT_CUT: mpExtTextView->Cut(); 910*cdf0e10cSrcweir mpExtTextEngine->SetModified( sal_True ); 911*cdf0e10cSrcweir mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); 912*cdf0e10cSrcweir break; 913*cdf0e10cSrcweir case SV_MENU_EDIT_COPY: mpExtTextView->Copy(); 914*cdf0e10cSrcweir break; 915*cdf0e10cSrcweir case SV_MENU_EDIT_PASTE: mpExtTextView->Paste(); 916*cdf0e10cSrcweir mpExtTextEngine->SetModified( sal_True ); 917*cdf0e10cSrcweir mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); 918*cdf0e10cSrcweir break; 919*cdf0e10cSrcweir case SV_MENU_EDIT_DELETE: mpExtTextView->DeleteSelected(); 920*cdf0e10cSrcweir mpExtTextEngine->SetModified( sal_True ); 921*cdf0e10cSrcweir mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); 922*cdf0e10cSrcweir break; 923*cdf0e10cSrcweir case SV_MENU_EDIT_SELECTALL: mpExtTextView->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) ); 924*cdf0e10cSrcweir break; 925*cdf0e10cSrcweir case SV_MENU_EDIT_INSERTSYMBOL: 926*cdf0e10cSrcweir { 927*cdf0e10cSrcweir XubString aChars = Edit::GetGetSpecialCharsFunction()( this, GetFont() ); 928*cdf0e10cSrcweir if ( aChars.Len() ) 929*cdf0e10cSrcweir { 930*cdf0e10cSrcweir mpExtTextView->InsertText( aChars ); 931*cdf0e10cSrcweir mpExtTextEngine->SetModified( sal_True ); 932*cdf0e10cSrcweir mpExtTextEngine->Broadcast( TextHint( TEXT_HINT_MODIFIED ) ); 933*cdf0e10cSrcweir } 934*cdf0e10cSrcweir } 935*cdf0e10cSrcweir break; 936*cdf0e10cSrcweir } 937*cdf0e10cSrcweir mbActivePopup = sal_False; 938*cdf0e10cSrcweir } 939*cdf0e10cSrcweir else 940*cdf0e10cSrcweir { 941*cdf0e10cSrcweir mpExtTextView->Command( rCEvt ); 942*cdf0e10cSrcweir } 943*cdf0e10cSrcweir Window::Command( rCEvt ); 944*cdf0e10cSrcweir } 945*cdf0e10cSrcweir 946*cdf0e10cSrcweir void TextWindow::GetFocus() 947*cdf0e10cSrcweir { 948*cdf0e10cSrcweir Window::GetFocus(); 949*cdf0e10cSrcweir if ( !mbActivePopup ) 950*cdf0e10cSrcweir { 951*cdf0e10cSrcweir sal_Bool bGotoCursor = !mpExtTextView->IsReadOnly(); 952*cdf0e10cSrcweir if ( mbFocusSelectionHide && IsReallyVisible() && !mpExtTextView->IsReadOnly() 953*cdf0e10cSrcweir && ( mbSelectOnTab && 954*cdf0e10cSrcweir (!mbInMBDown || ( GetSettings().GetStyleSettings().GetSelectionOptions() & SELECTION_OPTION_FOCUS ) )) ) 955*cdf0e10cSrcweir { 956*cdf0e10cSrcweir // Alles selektieren, aber nicht scrollen 957*cdf0e10cSrcweir sal_Bool bAutoScroll = mpExtTextView->IsAutoScroll(); 958*cdf0e10cSrcweir mpExtTextView->SetAutoScroll( sal_False ); 959*cdf0e10cSrcweir mpExtTextView->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFF, 0xFFFF ) ) ); 960*cdf0e10cSrcweir mpExtTextView->SetAutoScroll( bAutoScroll ); 961*cdf0e10cSrcweir bGotoCursor = sal_False; 962*cdf0e10cSrcweir } 963*cdf0e10cSrcweir mpExtTextView->SetPaintSelection( sal_True ); 964*cdf0e10cSrcweir mpExtTextView->ShowCursor( bGotoCursor ); 965*cdf0e10cSrcweir } 966*cdf0e10cSrcweir } 967*cdf0e10cSrcweir 968*cdf0e10cSrcweir void TextWindow::LoseFocus() 969*cdf0e10cSrcweir { 970*cdf0e10cSrcweir Window::LoseFocus(); 971*cdf0e10cSrcweir 972*cdf0e10cSrcweir if ( mbFocusSelectionHide && !mbActivePopup ) 973*cdf0e10cSrcweir mpExtTextView->SetPaintSelection( sal_False ); 974*cdf0e10cSrcweir } 975*cdf0e10cSrcweir 976*cdf0e10cSrcweir // virtual 977*cdf0e10cSrcweir ::css::uno::Reference< ::css::awt::XWindowPeer > 978*cdf0e10cSrcweir TextWindow::GetComponentInterface(sal_Bool bCreate) 979*cdf0e10cSrcweir { 980*cdf0e10cSrcweir ::css::uno::Reference< ::css::awt::XWindowPeer > xPeer( 981*cdf0e10cSrcweir Window::GetComponentInterface(false)); 982*cdf0e10cSrcweir if (!xPeer.is() && bCreate) 983*cdf0e10cSrcweir { 984*cdf0e10cSrcweir xPeer = new ::svt::TextWindowPeer(*GetTextView(), true); 985*cdf0e10cSrcweir SetComponentInterface(xPeer); 986*cdf0e10cSrcweir } 987*cdf0e10cSrcweir return xPeer; 988*cdf0e10cSrcweir } 989*cdf0e10cSrcweir 990*cdf0e10cSrcweir MultiLineEdit::MultiLineEdit( Window* pParent, WinBits nWinStyle ) 991*cdf0e10cSrcweir : Edit( pParent, nWinStyle ) 992*cdf0e10cSrcweir { 993*cdf0e10cSrcweir SetType( WINDOW_MULTILINEEDIT ); 994*cdf0e10cSrcweir pImpSvMEdit = new ImpSvMEdit( this, nWinStyle ); 995*cdf0e10cSrcweir ImplInitSettings( sal_True, sal_True, sal_True ); 996*cdf0e10cSrcweir pUpdateDataTimer = 0; 997*cdf0e10cSrcweir 998*cdf0e10cSrcweir SetCompoundControl( sal_True ); 999*cdf0e10cSrcweir SetStyle( ImplInitStyle( nWinStyle ) ); 1000*cdf0e10cSrcweir } 1001*cdf0e10cSrcweir 1002*cdf0e10cSrcweir MultiLineEdit::MultiLineEdit( Window* pParent, const ResId& rResId ) 1003*cdf0e10cSrcweir : Edit( pParent, rResId.SetRT( RSC_MULTILINEEDIT ) ) 1004*cdf0e10cSrcweir { 1005*cdf0e10cSrcweir SetType( WINDOW_MULTILINEEDIT ); 1006*cdf0e10cSrcweir WinBits nWinStyle = rResId.GetWinBits(); 1007*cdf0e10cSrcweir pImpSvMEdit = new ImpSvMEdit( this, nWinStyle ); 1008*cdf0e10cSrcweir ImplInitSettings( sal_True, sal_True, sal_True ); 1009*cdf0e10cSrcweir pUpdateDataTimer = 0; 1010*cdf0e10cSrcweir 1011*cdf0e10cSrcweir sal_uInt16 nMaxLen = Edit::GetMaxTextLen(); 1012*cdf0e10cSrcweir if ( nMaxLen ) 1013*cdf0e10cSrcweir SetMaxTextLen( nMaxLen ); 1014*cdf0e10cSrcweir 1015*cdf0e10cSrcweir SetText( Edit::GetText() ); 1016*cdf0e10cSrcweir 1017*cdf0e10cSrcweir if ( IsVisible() ) 1018*cdf0e10cSrcweir pImpSvMEdit->Resize(); 1019*cdf0e10cSrcweir 1020*cdf0e10cSrcweir SetCompoundControl( sal_True ); 1021*cdf0e10cSrcweir SetStyle( ImplInitStyle( nWinStyle ) ); 1022*cdf0e10cSrcweir 1023*cdf0e10cSrcweir // Base Edit ctor could call Show already, but that would cause problems 1024*cdf0e10cSrcweir // with accessibility, as Show might (indirectly) trigger a call to virtual 1025*cdf0e10cSrcweir // GetComponentInterface, which is the Edit's base version instead of the 1026*cdf0e10cSrcweir // MultiLineEdit's version while in the base Edit ctor: 1027*cdf0e10cSrcweir if ((GetStyle() & WB_HIDE) == 0) 1028*cdf0e10cSrcweir Show(); 1029*cdf0e10cSrcweir } 1030*cdf0e10cSrcweir 1031*cdf0e10cSrcweir MultiLineEdit::~MultiLineEdit() 1032*cdf0e10cSrcweir { 1033*cdf0e10cSrcweir { 1034*cdf0e10cSrcweir ::std::auto_ptr< ImpSvMEdit > pDelete( pImpSvMEdit ); 1035*cdf0e10cSrcweir pImpSvMEdit = NULL; 1036*cdf0e10cSrcweir } 1037*cdf0e10cSrcweir delete pUpdateDataTimer; 1038*cdf0e10cSrcweir } 1039*cdf0e10cSrcweir 1040*cdf0e10cSrcweir WinBits MultiLineEdit::ImplInitStyle( WinBits nStyle ) 1041*cdf0e10cSrcweir { 1042*cdf0e10cSrcweir if ( !(nStyle & WB_NOTABSTOP) ) 1043*cdf0e10cSrcweir nStyle |= WB_TABSTOP; 1044*cdf0e10cSrcweir 1045*cdf0e10cSrcweir if ( !(nStyle & WB_NOGROUP) ) 1046*cdf0e10cSrcweir nStyle |= WB_GROUP; 1047*cdf0e10cSrcweir 1048*cdf0e10cSrcweir if ( !(nStyle & WB_IGNORETAB )) 1049*cdf0e10cSrcweir nStyle |= WINDOW_DLGCTRL_MOD1TAB; 1050*cdf0e10cSrcweir 1051*cdf0e10cSrcweir return nStyle; 1052*cdf0e10cSrcweir } 1053*cdf0e10cSrcweir 1054*cdf0e10cSrcweir 1055*cdf0e10cSrcweir void MultiLineEdit::ImplInitSettings( sal_Bool /*bFont*/, sal_Bool /*bForeground*/, sal_Bool bBackground ) 1056*cdf0e10cSrcweir { 1057*cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 1058*cdf0e10cSrcweir 1059*cdf0e10cSrcweir // Der Font muss immer mit manipuliert werden, weil die TextEngine 1060*cdf0e10cSrcweir // sich nicht um TextColor/Background kuemmert 1061*cdf0e10cSrcweir 1062*cdf0e10cSrcweir Color aTextColor = rStyleSettings.GetFieldTextColor(); 1063*cdf0e10cSrcweir if ( IsControlForeground() ) 1064*cdf0e10cSrcweir aTextColor = GetControlForeground(); 1065*cdf0e10cSrcweir if ( !IsEnabled() ) 1066*cdf0e10cSrcweir aTextColor = rStyleSettings.GetDisableColor(); 1067*cdf0e10cSrcweir 1068*cdf0e10cSrcweir Font aFont = rStyleSettings.GetFieldFont(); 1069*cdf0e10cSrcweir if ( IsControlFont() ) 1070*cdf0e10cSrcweir aFont.Merge( GetControlFont() ); 1071*cdf0e10cSrcweir aFont.SetTransparent( IsPaintTransparent() ); 1072*cdf0e10cSrcweir SetZoomedPointFont( aFont ); 1073*cdf0e10cSrcweir Font TheFont = GetFont(); 1074*cdf0e10cSrcweir TheFont.SetColor( aTextColor ); 1075*cdf0e10cSrcweir if( IsPaintTransparent() ) 1076*cdf0e10cSrcweir TheFont.SetFillColor( Color( COL_TRANSPARENT ) ); 1077*cdf0e10cSrcweir else 1078*cdf0e10cSrcweir TheFont.SetFillColor( IsControlBackground() ? GetControlBackground() : rStyleSettings.GetFieldColor() ); 1079*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetFont( TheFont ); 1080*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->GetTextEngine()->SetFont( TheFont ); 1081*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetTextColor( aTextColor ); 1082*cdf0e10cSrcweir 1083*cdf0e10cSrcweir if ( bBackground ) 1084*cdf0e10cSrcweir { 1085*cdf0e10cSrcweir if( IsPaintTransparent() ) 1086*cdf0e10cSrcweir { 1087*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetPaintTransparent( sal_True ); 1088*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetBackground(); 1089*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetControlBackground(); 1090*cdf0e10cSrcweir SetBackground(); 1091*cdf0e10cSrcweir SetControlBackground(); 1092*cdf0e10cSrcweir } 1093*cdf0e10cSrcweir else 1094*cdf0e10cSrcweir { 1095*cdf0e10cSrcweir if( IsControlBackground() ) 1096*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetBackground( GetControlBackground() ); 1097*cdf0e10cSrcweir else 1098*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetBackground( rStyleSettings.GetFieldColor() ); 1099*cdf0e10cSrcweir // Auch am MultiLineEdit einstellen, weil die TextComponent 1100*cdf0e10cSrcweir // ggf. die Scrollbars hidet. 1101*cdf0e10cSrcweir SetBackground( pImpSvMEdit->GetTextWindow()->GetBackground() ); 1102*cdf0e10cSrcweir } 1103*cdf0e10cSrcweir } 1104*cdf0e10cSrcweir } 1105*cdf0e10cSrcweir 1106*cdf0e10cSrcweir void MultiLineEdit::Modify() 1107*cdf0e10cSrcweir { 1108*cdf0e10cSrcweir aModifyHdlLink.Call( this ); 1109*cdf0e10cSrcweir 1110*cdf0e10cSrcweir CallEventListeners( VCLEVENT_EDIT_MODIFY ); 1111*cdf0e10cSrcweir 1112*cdf0e10cSrcweir if ( pUpdateDataTimer ) 1113*cdf0e10cSrcweir pUpdateDataTimer->Start(); 1114*cdf0e10cSrcweir } 1115*cdf0e10cSrcweir 1116*cdf0e10cSrcweir IMPL_LINK( MultiLineEdit, ImpUpdateDataHdl, Timer*, EMPTYARG ) 1117*cdf0e10cSrcweir { 1118*cdf0e10cSrcweir UpdateData(); 1119*cdf0e10cSrcweir return 0; 1120*cdf0e10cSrcweir } 1121*cdf0e10cSrcweir 1122*cdf0e10cSrcweir void MultiLineEdit::UpdateData() 1123*cdf0e10cSrcweir { 1124*cdf0e10cSrcweir aUpdateDataHdlLink.Call( this ); 1125*cdf0e10cSrcweir } 1126*cdf0e10cSrcweir 1127*cdf0e10cSrcweir void MultiLineEdit::SetModifyFlag() 1128*cdf0e10cSrcweir { 1129*cdf0e10cSrcweir pImpSvMEdit->SetModified( sal_True ); 1130*cdf0e10cSrcweir } 1131*cdf0e10cSrcweir 1132*cdf0e10cSrcweir void MultiLineEdit::ClearModifyFlag() 1133*cdf0e10cSrcweir { 1134*cdf0e10cSrcweir pImpSvMEdit->SetModified( sal_False ); 1135*cdf0e10cSrcweir } 1136*cdf0e10cSrcweir 1137*cdf0e10cSrcweir sal_Bool MultiLineEdit::IsModified() const 1138*cdf0e10cSrcweir { 1139*cdf0e10cSrcweir return pImpSvMEdit->IsModified(); 1140*cdf0e10cSrcweir } 1141*cdf0e10cSrcweir 1142*cdf0e10cSrcweir void MultiLineEdit::EnableUpdateData( sal_uLong nTimeout ) 1143*cdf0e10cSrcweir { 1144*cdf0e10cSrcweir if ( !nTimeout ) 1145*cdf0e10cSrcweir DisableUpdateData(); 1146*cdf0e10cSrcweir else 1147*cdf0e10cSrcweir { 1148*cdf0e10cSrcweir if ( !pUpdateDataTimer ) 1149*cdf0e10cSrcweir { 1150*cdf0e10cSrcweir pUpdateDataTimer = new Timer; 1151*cdf0e10cSrcweir pUpdateDataTimer->SetTimeoutHdl( LINK( this, MultiLineEdit, ImpUpdateDataHdl ) ); 1152*cdf0e10cSrcweir } 1153*cdf0e10cSrcweir pUpdateDataTimer->SetTimeout( nTimeout ); 1154*cdf0e10cSrcweir } 1155*cdf0e10cSrcweir } 1156*cdf0e10cSrcweir 1157*cdf0e10cSrcweir void MultiLineEdit::SetReadOnly( sal_Bool bReadOnly ) 1158*cdf0e10cSrcweir { 1159*cdf0e10cSrcweir pImpSvMEdit->SetReadOnly( bReadOnly ); 1160*cdf0e10cSrcweir Edit::SetReadOnly( bReadOnly ); 1161*cdf0e10cSrcweir 1162*cdf0e10cSrcweir // #94921# ReadOnly can be overwritten in InitFromStyle() when WB not set. 1163*cdf0e10cSrcweir WinBits nStyle = GetStyle(); 1164*cdf0e10cSrcweir if ( bReadOnly ) 1165*cdf0e10cSrcweir nStyle |= WB_READONLY; 1166*cdf0e10cSrcweir else 1167*cdf0e10cSrcweir nStyle &= ~WB_READONLY; 1168*cdf0e10cSrcweir SetStyle( nStyle ); 1169*cdf0e10cSrcweir } 1170*cdf0e10cSrcweir 1171*cdf0e10cSrcweir sal_Bool MultiLineEdit::IsReadOnly() const 1172*cdf0e10cSrcweir { 1173*cdf0e10cSrcweir return pImpSvMEdit->IsReadOnly(); 1174*cdf0e10cSrcweir } 1175*cdf0e10cSrcweir 1176*cdf0e10cSrcweir void MultiLineEdit::SetMaxTextLen( xub_StrLen nMaxLen ) 1177*cdf0e10cSrcweir { 1178*cdf0e10cSrcweir pImpSvMEdit->SetMaxTextLen( nMaxLen ); 1179*cdf0e10cSrcweir } 1180*cdf0e10cSrcweir 1181*cdf0e10cSrcweir xub_StrLen MultiLineEdit::GetMaxTextLen() const 1182*cdf0e10cSrcweir { 1183*cdf0e10cSrcweir return pImpSvMEdit->GetMaxTextLen(); 1184*cdf0e10cSrcweir } 1185*cdf0e10cSrcweir 1186*cdf0e10cSrcweir void MultiLineEdit::ReplaceSelected( const String& rStr ) 1187*cdf0e10cSrcweir { 1188*cdf0e10cSrcweir pImpSvMEdit->InsertText( rStr ); 1189*cdf0e10cSrcweir } 1190*cdf0e10cSrcweir 1191*cdf0e10cSrcweir void MultiLineEdit::DeleteSelected() 1192*cdf0e10cSrcweir { 1193*cdf0e10cSrcweir pImpSvMEdit->InsertText( String() ); 1194*cdf0e10cSrcweir } 1195*cdf0e10cSrcweir 1196*cdf0e10cSrcweir String MultiLineEdit::GetSelected() const 1197*cdf0e10cSrcweir { 1198*cdf0e10cSrcweir return pImpSvMEdit->GetSelected(); 1199*cdf0e10cSrcweir } 1200*cdf0e10cSrcweir 1201*cdf0e10cSrcweir String MultiLineEdit::GetSelected( LineEnd aSeparator ) const 1202*cdf0e10cSrcweir { 1203*cdf0e10cSrcweir return pImpSvMEdit->GetSelected( aSeparator ); 1204*cdf0e10cSrcweir } 1205*cdf0e10cSrcweir 1206*cdf0e10cSrcweir void MultiLineEdit::Cut() 1207*cdf0e10cSrcweir { 1208*cdf0e10cSrcweir pImpSvMEdit->Cut(); 1209*cdf0e10cSrcweir } 1210*cdf0e10cSrcweir 1211*cdf0e10cSrcweir void MultiLineEdit::Copy() 1212*cdf0e10cSrcweir { 1213*cdf0e10cSrcweir pImpSvMEdit->Copy(); 1214*cdf0e10cSrcweir } 1215*cdf0e10cSrcweir 1216*cdf0e10cSrcweir void MultiLineEdit::Paste() 1217*cdf0e10cSrcweir { 1218*cdf0e10cSrcweir pImpSvMEdit->Paste(); 1219*cdf0e10cSrcweir } 1220*cdf0e10cSrcweir 1221*cdf0e10cSrcweir void MultiLineEdit::SetText( const String& rStr ) 1222*cdf0e10cSrcweir { 1223*cdf0e10cSrcweir pImpSvMEdit->SetText( rStr ); 1224*cdf0e10cSrcweir } 1225*cdf0e10cSrcweir 1226*cdf0e10cSrcweir String MultiLineEdit::GetText() const 1227*cdf0e10cSrcweir { 1228*cdf0e10cSrcweir return pImpSvMEdit->GetText(); 1229*cdf0e10cSrcweir } 1230*cdf0e10cSrcweir 1231*cdf0e10cSrcweir String MultiLineEdit::GetText( LineEnd aSeparator ) const 1232*cdf0e10cSrcweir { 1233*cdf0e10cSrcweir return pImpSvMEdit->GetText( aSeparator ); 1234*cdf0e10cSrcweir } 1235*cdf0e10cSrcweir 1236*cdf0e10cSrcweir String MultiLineEdit::GetTextLines() const 1237*cdf0e10cSrcweir { 1238*cdf0e10cSrcweir return pImpSvMEdit->GetTextLines(); 1239*cdf0e10cSrcweir } 1240*cdf0e10cSrcweir 1241*cdf0e10cSrcweir String MultiLineEdit::GetTextLines( LineEnd aSeparator ) const 1242*cdf0e10cSrcweir { 1243*cdf0e10cSrcweir return pImpSvMEdit->GetTextLines( aSeparator ); 1244*cdf0e10cSrcweir } 1245*cdf0e10cSrcweir 1246*cdf0e10cSrcweir void MultiLineEdit::Resize() 1247*cdf0e10cSrcweir { 1248*cdf0e10cSrcweir pImpSvMEdit->Resize(); 1249*cdf0e10cSrcweir } 1250*cdf0e10cSrcweir 1251*cdf0e10cSrcweir void MultiLineEdit::GetFocus() 1252*cdf0e10cSrcweir { 1253*cdf0e10cSrcweir if ( !pImpSvMEdit ) // might be called from within the dtor, when pImpSvMEdit == NULL is a valid state 1254*cdf0e10cSrcweir return; 1255*cdf0e10cSrcweir 1256*cdf0e10cSrcweir Edit::GetFocus(); 1257*cdf0e10cSrcweir pImpSvMEdit->GetFocus(); 1258*cdf0e10cSrcweir } 1259*cdf0e10cSrcweir 1260*cdf0e10cSrcweir void MultiLineEdit::SetSelection( const Selection& rSelection ) 1261*cdf0e10cSrcweir { 1262*cdf0e10cSrcweir pImpSvMEdit->SetSelection( rSelection ); 1263*cdf0e10cSrcweir } 1264*cdf0e10cSrcweir 1265*cdf0e10cSrcweir const Selection& MultiLineEdit::GetSelection() const 1266*cdf0e10cSrcweir { 1267*cdf0e10cSrcweir return pImpSvMEdit->GetSelection(); 1268*cdf0e10cSrcweir } 1269*cdf0e10cSrcweir 1270*cdf0e10cSrcweir Size MultiLineEdit::CalcMinimumSize() const 1271*cdf0e10cSrcweir { 1272*cdf0e10cSrcweir Size aSz = pImpSvMEdit->CalcMinimumSize(); 1273*cdf0e10cSrcweir 1274*cdf0e10cSrcweir sal_Int32 nLeft, nTop, nRight, nBottom; 1275*cdf0e10cSrcweir ((Window*)this)->GetBorder( nLeft, nTop, nRight, nBottom ); 1276*cdf0e10cSrcweir aSz.Width() += nLeft+nRight; 1277*cdf0e10cSrcweir aSz.Height() += nTop+nBottom; 1278*cdf0e10cSrcweir 1279*cdf0e10cSrcweir return aSz; 1280*cdf0e10cSrcweir } 1281*cdf0e10cSrcweir 1282*cdf0e10cSrcweir Size MultiLineEdit::CalcAdjustedSize( const Size& rPrefSize ) const 1283*cdf0e10cSrcweir { 1284*cdf0e10cSrcweir Size aSz = rPrefSize; 1285*cdf0e10cSrcweir sal_Int32 nLeft, nTop, nRight, nBottom; 1286*cdf0e10cSrcweir ((Window*)this)->GetBorder( nLeft, nTop, nRight, nBottom ); 1287*cdf0e10cSrcweir 1288*cdf0e10cSrcweir // In der Hoehe auf ganze Zeilen justieren 1289*cdf0e10cSrcweir 1290*cdf0e10cSrcweir long nHeight = aSz.Height() - nTop - nBottom; 1291*cdf0e10cSrcweir long nLineHeight = pImpSvMEdit->CalcSize( 1, 1 ).Height(); 1292*cdf0e10cSrcweir long nLines = nHeight / nLineHeight; 1293*cdf0e10cSrcweir if ( nLines < 1 ) 1294*cdf0e10cSrcweir nLines = 1; 1295*cdf0e10cSrcweir 1296*cdf0e10cSrcweir aSz.Height() = nLines * nLineHeight; 1297*cdf0e10cSrcweir aSz.Height() += nTop+nBottom; 1298*cdf0e10cSrcweir 1299*cdf0e10cSrcweir return aSz; 1300*cdf0e10cSrcweir } 1301*cdf0e10cSrcweir 1302*cdf0e10cSrcweir Size MultiLineEdit::CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const 1303*cdf0e10cSrcweir { 1304*cdf0e10cSrcweir Size aSz = pImpSvMEdit->CalcSize( nColumns, nLines ); 1305*cdf0e10cSrcweir 1306*cdf0e10cSrcweir sal_Int32 nLeft, nTop, nRight, nBottom; 1307*cdf0e10cSrcweir ((Window*)this)->GetBorder( nLeft, nTop, nRight, nBottom ); 1308*cdf0e10cSrcweir aSz.Width() += nLeft+nRight; 1309*cdf0e10cSrcweir aSz.Height() += nTop+nBottom; 1310*cdf0e10cSrcweir return aSz; 1311*cdf0e10cSrcweir } 1312*cdf0e10cSrcweir 1313*cdf0e10cSrcweir void MultiLineEdit::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const 1314*cdf0e10cSrcweir { 1315*cdf0e10cSrcweir pImpSvMEdit->GetMaxVisColumnsAndLines( rnCols, rnLines ); 1316*cdf0e10cSrcweir } 1317*cdf0e10cSrcweir 1318*cdf0e10cSrcweir void MultiLineEdit::StateChanged( StateChangedType nType ) 1319*cdf0e10cSrcweir { 1320*cdf0e10cSrcweir if( nType == STATE_CHANGE_ENABLE ) 1321*cdf0e10cSrcweir { 1322*cdf0e10cSrcweir pImpSvMEdit->Enable( IsEnabled() ); 1323*cdf0e10cSrcweir ImplInitSettings( sal_True, sal_False, sal_False ); 1324*cdf0e10cSrcweir } 1325*cdf0e10cSrcweir else if( nType == STATE_CHANGE_READONLY ) 1326*cdf0e10cSrcweir { 1327*cdf0e10cSrcweir pImpSvMEdit->SetReadOnly( IsReadOnly() ); 1328*cdf0e10cSrcweir } 1329*cdf0e10cSrcweir else if ( nType == STATE_CHANGE_ZOOM ) 1330*cdf0e10cSrcweir { 1331*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetZoom( GetZoom() ); 1332*cdf0e10cSrcweir ImplInitSettings( sal_True, sal_False, sal_False ); 1333*cdf0e10cSrcweir Resize(); 1334*cdf0e10cSrcweir } 1335*cdf0e10cSrcweir else if ( nType == STATE_CHANGE_CONTROLFONT ) 1336*cdf0e10cSrcweir { 1337*cdf0e10cSrcweir ImplInitSettings( sal_True, sal_False, sal_False ); 1338*cdf0e10cSrcweir Resize(); 1339*cdf0e10cSrcweir Invalidate(); 1340*cdf0e10cSrcweir } 1341*cdf0e10cSrcweir else if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) 1342*cdf0e10cSrcweir { 1343*cdf0e10cSrcweir ImplInitSettings( sal_False, sal_True, sal_False ); 1344*cdf0e10cSrcweir Invalidate(); 1345*cdf0e10cSrcweir } 1346*cdf0e10cSrcweir else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) 1347*cdf0e10cSrcweir { 1348*cdf0e10cSrcweir ImplInitSettings( sal_False, sal_False, sal_True ); 1349*cdf0e10cSrcweir Invalidate(); 1350*cdf0e10cSrcweir } 1351*cdf0e10cSrcweir else if ( nType == STATE_CHANGE_STYLE ) 1352*cdf0e10cSrcweir { 1353*cdf0e10cSrcweir pImpSvMEdit->InitFromStyle( GetStyle() ); 1354*cdf0e10cSrcweir SetStyle( ImplInitStyle( GetStyle() ) ); 1355*cdf0e10cSrcweir } 1356*cdf0e10cSrcweir else if ( nType == STATE_CHANGE_INITSHOW ) 1357*cdf0e10cSrcweir { 1358*cdf0e10cSrcweir if( IsPaintTransparent() ) 1359*cdf0e10cSrcweir { 1360*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetPaintTransparent( sal_True ); 1361*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetBackground(); 1362*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetControlBackground(); 1363*cdf0e10cSrcweir SetBackground(); 1364*cdf0e10cSrcweir SetControlBackground(); 1365*cdf0e10cSrcweir } 1366*cdf0e10cSrcweir } 1367*cdf0e10cSrcweir 1368*cdf0e10cSrcweir Control::StateChanged( nType ); 1369*cdf0e10cSrcweir } 1370*cdf0e10cSrcweir 1371*cdf0e10cSrcweir void MultiLineEdit::DataChanged( const DataChangedEvent& rDCEvt ) 1372*cdf0e10cSrcweir { 1373*cdf0e10cSrcweir if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 1374*cdf0e10cSrcweir (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 1375*cdf0e10cSrcweir { 1376*cdf0e10cSrcweir ImplInitSettings( sal_True, sal_True, sal_True ); 1377*cdf0e10cSrcweir Resize(); 1378*cdf0e10cSrcweir Invalidate(); 1379*cdf0e10cSrcweir } 1380*cdf0e10cSrcweir else 1381*cdf0e10cSrcweir Control::DataChanged( rDCEvt ); 1382*cdf0e10cSrcweir } 1383*cdf0e10cSrcweir 1384*cdf0e10cSrcweir void MultiLineEdit::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) 1385*cdf0e10cSrcweir { 1386*cdf0e10cSrcweir ImplInitSettings( sal_True, sal_True, sal_True ); 1387*cdf0e10cSrcweir 1388*cdf0e10cSrcweir Point aPos = pDev->LogicToPixel( rPos ); 1389*cdf0e10cSrcweir Size aSize = pDev->LogicToPixel( rSize ); 1390*cdf0e10cSrcweir Font aFont = pImpSvMEdit->GetTextWindow()->GetDrawPixelFont( pDev ); 1391*cdf0e10cSrcweir aFont.SetTransparent( sal_True ); 1392*cdf0e10cSrcweir OutDevType eOutDevType = pDev->GetOutDevType(); 1393*cdf0e10cSrcweir 1394*cdf0e10cSrcweir pDev->Push(); 1395*cdf0e10cSrcweir pDev->SetMapMode(); 1396*cdf0e10cSrcweir pDev->SetFont( aFont ); 1397*cdf0e10cSrcweir pDev->SetTextFillColor(); 1398*cdf0e10cSrcweir 1399*cdf0e10cSrcweir // Border/Background 1400*cdf0e10cSrcweir pDev->SetLineColor(); 1401*cdf0e10cSrcweir pDev->SetFillColor(); 1402*cdf0e10cSrcweir sal_Bool bBorder = !(nFlags & WINDOW_DRAW_NOBORDER ) && (GetStyle() & WB_BORDER); 1403*cdf0e10cSrcweir sal_Bool bBackground = !(nFlags & WINDOW_DRAW_NOBACKGROUND) && IsControlBackground(); 1404*cdf0e10cSrcweir if ( bBorder || bBackground ) 1405*cdf0e10cSrcweir { 1406*cdf0e10cSrcweir Rectangle aRect( aPos, aSize ); 1407*cdf0e10cSrcweir if ( bBorder ) 1408*cdf0e10cSrcweir { 1409*cdf0e10cSrcweir DecorationView aDecoView( pDev ); 1410*cdf0e10cSrcweir aRect = aDecoView.DrawFrame( aRect, FRAME_DRAW_DOUBLEIN ); 1411*cdf0e10cSrcweir } 1412*cdf0e10cSrcweir if ( bBackground ) 1413*cdf0e10cSrcweir { 1414*cdf0e10cSrcweir pDev->SetFillColor( GetControlBackground() ); 1415*cdf0e10cSrcweir pDev->DrawRect( aRect ); 1416*cdf0e10cSrcweir } 1417*cdf0e10cSrcweir } 1418*cdf0e10cSrcweir 1419*cdf0e10cSrcweir // Inhalt 1420*cdf0e10cSrcweir if ( ( nFlags & WINDOW_DRAW_MONO ) || ( eOutDevType == OUTDEV_PRINTER ) ) 1421*cdf0e10cSrcweir pDev->SetTextColor( Color( COL_BLACK ) ); 1422*cdf0e10cSrcweir else 1423*cdf0e10cSrcweir { 1424*cdf0e10cSrcweir if ( !(nFlags & WINDOW_DRAW_NODISABLE ) && !IsEnabled() ) 1425*cdf0e10cSrcweir { 1426*cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 1427*cdf0e10cSrcweir pDev->SetTextColor( rStyleSettings.GetDisableColor() ); 1428*cdf0e10cSrcweir } 1429*cdf0e10cSrcweir else 1430*cdf0e10cSrcweir { 1431*cdf0e10cSrcweir pDev->SetTextColor( GetTextColor() ); 1432*cdf0e10cSrcweir } 1433*cdf0e10cSrcweir } 1434*cdf0e10cSrcweir 1435*cdf0e10cSrcweir XubString aText = GetText(); 1436*cdf0e10cSrcweir Size aTextSz( pDev->GetTextWidth( aText ), pDev->GetTextHeight() ); 1437*cdf0e10cSrcweir sal_uLong nLines = (sal_uLong) (aSize.Height() / aTextSz.Height()); 1438*cdf0e10cSrcweir if ( !nLines ) 1439*cdf0e10cSrcweir nLines = 1; 1440*cdf0e10cSrcweir aTextSz.Height() = nLines*aTextSz.Height(); 1441*cdf0e10cSrcweir long nOnePixel = GetDrawPixel( pDev, 1 ); 1442*cdf0e10cSrcweir long nOffX = 3*nOnePixel; 1443*cdf0e10cSrcweir long nOffY = 2*nOnePixel; 1444*cdf0e10cSrcweir 1445*cdf0e10cSrcweir // Clipping? 1446*cdf0e10cSrcweir if ( ( nOffY < 0 ) || ( (nOffY+aTextSz.Height()) > aSize.Height() ) || ( (nOffX+aTextSz.Width()) > aSize.Width() ) ) 1447*cdf0e10cSrcweir { 1448*cdf0e10cSrcweir Rectangle aClip( aPos, aSize ); 1449*cdf0e10cSrcweir if ( aTextSz.Height() > aSize.Height() ) 1450*cdf0e10cSrcweir aClip.Bottom() += aTextSz.Height() - aSize.Height() + 1; // Damit HP-Drucker nicht 'weg-optimieren' 1451*cdf0e10cSrcweir pDev->IntersectClipRegion( aClip ); 1452*cdf0e10cSrcweir } 1453*cdf0e10cSrcweir 1454*cdf0e10cSrcweir TextEngine aTE; 1455*cdf0e10cSrcweir aTE.SetText( GetText() ); 1456*cdf0e10cSrcweir aTE.SetMaxTextWidth( aSize.Width() ); 1457*cdf0e10cSrcweir aTE.SetFont( aFont ); 1458*cdf0e10cSrcweir aTE.SetTextAlign( pImpSvMEdit->GetTextWindow()->GetTextEngine()->GetTextAlign() ); 1459*cdf0e10cSrcweir aTE.Draw( pDev, Point( aPos.X() + nOffX, aPos.Y() + nOffY ) ); 1460*cdf0e10cSrcweir 1461*cdf0e10cSrcweir pDev->Pop(); 1462*cdf0e10cSrcweir } 1463*cdf0e10cSrcweir 1464*cdf0e10cSrcweir long MultiLineEdit::Notify( NotifyEvent& rNEvt ) 1465*cdf0e10cSrcweir { 1466*cdf0e10cSrcweir long nDone = 0; 1467*cdf0e10cSrcweir if( rNEvt.GetType() == EVENT_COMMAND ) 1468*cdf0e10cSrcweir { 1469*cdf0e10cSrcweir nDone = pImpSvMEdit->HandleCommand( *rNEvt.GetCommandEvent() ); 1470*cdf0e10cSrcweir } 1471*cdf0e10cSrcweir return nDone ? nDone : Edit::Notify( rNEvt ); 1472*cdf0e10cSrcweir } 1473*cdf0e10cSrcweir 1474*cdf0e10cSrcweir long MultiLineEdit::PreNotify( NotifyEvent& rNEvt ) 1475*cdf0e10cSrcweir { 1476*cdf0e10cSrcweir long nDone = 0; 1477*cdf0e10cSrcweir 1478*cdf0e10cSrcweir #if (OSL_DEBUG_LEVEL > 1) && defined(DBG_UTIL) 1479*cdf0e10cSrcweir if( rNEvt.GetType() == EVENT_KEYINPUT ) 1480*cdf0e10cSrcweir { 1481*cdf0e10cSrcweir const KeyEvent& rKEvent = *rNEvt.GetKeyEvent(); 1482*cdf0e10cSrcweir if ( ( rKEvent.GetKeyCode().GetCode() == KEY_W ) && rKEvent.GetKeyCode().IsMod1() && rKEvent.GetKeyCode().IsMod2() ) 1483*cdf0e10cSrcweir { 1484*cdf0e10cSrcweir SetRightToLeft( !IsRightToLeft() ); 1485*cdf0e10cSrcweir } 1486*cdf0e10cSrcweir } 1487*cdf0e10cSrcweir #endif 1488*cdf0e10cSrcweir 1489*cdf0e10cSrcweir if( ( rNEvt.GetType() == EVENT_KEYINPUT ) && ( !GetTextView()->IsCursorEnabled() ) ) 1490*cdf0e10cSrcweir { 1491*cdf0e10cSrcweir const KeyEvent& rKEvent = *rNEvt.GetKeyEvent(); 1492*cdf0e10cSrcweir if ( !rKEvent.GetKeyCode().IsShift() && ( rKEvent.GetKeyCode().GetGroup() == KEYGROUP_CURSOR ) ) 1493*cdf0e10cSrcweir { 1494*cdf0e10cSrcweir nDone = 1; 1495*cdf0e10cSrcweir TextSelection aSel = pImpSvMEdit->GetTextWindow()->GetTextView()->GetSelection(); 1496*cdf0e10cSrcweir if ( aSel.HasRange() ) 1497*cdf0e10cSrcweir { 1498*cdf0e10cSrcweir aSel.GetStart() = aSel.GetEnd(); 1499*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->GetTextView()->SetSelection( aSel ); 1500*cdf0e10cSrcweir } 1501*cdf0e10cSrcweir else 1502*cdf0e10cSrcweir { 1503*cdf0e10cSrcweir switch ( rKEvent.GetKeyCode().GetCode() ) 1504*cdf0e10cSrcweir { 1505*cdf0e10cSrcweir case KEY_UP: 1506*cdf0e10cSrcweir { 1507*cdf0e10cSrcweir if ( pImpSvMEdit->GetVScrollBar() ) 1508*cdf0e10cSrcweir pImpSvMEdit->GetVScrollBar()->DoScrollAction( SCROLL_LINEUP ); 1509*cdf0e10cSrcweir } 1510*cdf0e10cSrcweir break; 1511*cdf0e10cSrcweir case KEY_DOWN: 1512*cdf0e10cSrcweir { 1513*cdf0e10cSrcweir if ( pImpSvMEdit->GetVScrollBar() ) 1514*cdf0e10cSrcweir pImpSvMEdit->GetVScrollBar()->DoScrollAction( SCROLL_LINEDOWN ); 1515*cdf0e10cSrcweir } 1516*cdf0e10cSrcweir break; 1517*cdf0e10cSrcweir case KEY_PAGEUP : 1518*cdf0e10cSrcweir { 1519*cdf0e10cSrcweir if ( pImpSvMEdit->GetVScrollBar() ) 1520*cdf0e10cSrcweir pImpSvMEdit->GetVScrollBar()->DoScrollAction( SCROLL_PAGEUP ); 1521*cdf0e10cSrcweir } 1522*cdf0e10cSrcweir break; 1523*cdf0e10cSrcweir case KEY_PAGEDOWN: 1524*cdf0e10cSrcweir { 1525*cdf0e10cSrcweir if ( pImpSvMEdit->GetVScrollBar() ) 1526*cdf0e10cSrcweir pImpSvMEdit->GetVScrollBar()->DoScrollAction( SCROLL_PAGEDOWN ); 1527*cdf0e10cSrcweir } 1528*cdf0e10cSrcweir break; 1529*cdf0e10cSrcweir case KEY_LEFT: 1530*cdf0e10cSrcweir { 1531*cdf0e10cSrcweir if ( pImpSvMEdit->GetHScrollBar() ) 1532*cdf0e10cSrcweir pImpSvMEdit->GetHScrollBar()->DoScrollAction( SCROLL_LINEUP ); 1533*cdf0e10cSrcweir } 1534*cdf0e10cSrcweir break; 1535*cdf0e10cSrcweir case KEY_RIGHT: 1536*cdf0e10cSrcweir { 1537*cdf0e10cSrcweir if ( pImpSvMEdit->GetHScrollBar() ) 1538*cdf0e10cSrcweir pImpSvMEdit->GetHScrollBar()->DoScrollAction( SCROLL_LINEDOWN ); 1539*cdf0e10cSrcweir } 1540*cdf0e10cSrcweir break; 1541*cdf0e10cSrcweir case KEY_HOME: 1542*cdf0e10cSrcweir { 1543*cdf0e10cSrcweir if ( rKEvent.GetKeyCode().IsMod1() ) 1544*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->GetTextView()-> 1545*cdf0e10cSrcweir SetSelection( TextSelection( TextPaM( 0, 0 ) ) ); 1546*cdf0e10cSrcweir } 1547*cdf0e10cSrcweir break; 1548*cdf0e10cSrcweir case KEY_END: 1549*cdf0e10cSrcweir { 1550*cdf0e10cSrcweir if ( rKEvent.GetKeyCode().IsMod1() ) 1551*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->GetTextView()-> 1552*cdf0e10cSrcweir SetSelection( TextSelection( TextPaM( 0xFFFF, 0xFFFF ) ) ); 1553*cdf0e10cSrcweir } 1554*cdf0e10cSrcweir break; 1555*cdf0e10cSrcweir default: 1556*cdf0e10cSrcweir { 1557*cdf0e10cSrcweir nDone = 0; 1558*cdf0e10cSrcweir } 1559*cdf0e10cSrcweir } 1560*cdf0e10cSrcweir } 1561*cdf0e10cSrcweir } 1562*cdf0e10cSrcweir } 1563*cdf0e10cSrcweir 1564*cdf0e10cSrcweir return nDone ? nDone : Edit::PreNotify( rNEvt ); 1565*cdf0e10cSrcweir } 1566*cdf0e10cSrcweir 1567*cdf0e10cSrcweir // 1568*cdf0e10cSrcweir // Internas fuer abgeleitete Klassen, z.B. TextComponent 1569*cdf0e10cSrcweir 1570*cdf0e10cSrcweir ExtTextEngine* MultiLineEdit::GetTextEngine() const 1571*cdf0e10cSrcweir { 1572*cdf0e10cSrcweir return pImpSvMEdit->GetTextWindow()->GetTextEngine(); 1573*cdf0e10cSrcweir } 1574*cdf0e10cSrcweir 1575*cdf0e10cSrcweir ExtTextView* MultiLineEdit::GetTextView() const 1576*cdf0e10cSrcweir { 1577*cdf0e10cSrcweir return pImpSvMEdit->GetTextWindow()->GetTextView(); 1578*cdf0e10cSrcweir } 1579*cdf0e10cSrcweir 1580*cdf0e10cSrcweir ScrollBar* MultiLineEdit::GetHScrollBar() const 1581*cdf0e10cSrcweir { 1582*cdf0e10cSrcweir return pImpSvMEdit->GetHScrollBar(); 1583*cdf0e10cSrcweir } 1584*cdf0e10cSrcweir 1585*cdf0e10cSrcweir 1586*cdf0e10cSrcweir ScrollBar* MultiLineEdit::GetVScrollBar() const 1587*cdf0e10cSrcweir { 1588*cdf0e10cSrcweir return pImpSvMEdit->GetVScrollBar(); 1589*cdf0e10cSrcweir } 1590*cdf0e10cSrcweir 1591*cdf0e10cSrcweir void MultiLineEdit::EnableFocusSelectionHide( sal_Bool bHide ) 1592*cdf0e10cSrcweir { 1593*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->SetAutoFocusHide( bHide ); 1594*cdf0e10cSrcweir } 1595*cdf0e10cSrcweir 1596*cdf0e10cSrcweir sal_Bool MultiLineEdit::IsFocusSelectionHideEnabled() const 1597*cdf0e10cSrcweir { 1598*cdf0e10cSrcweir return pImpSvMEdit->GetTextWindow()->IsAutoFocusHide(); 1599*cdf0e10cSrcweir } 1600*cdf0e10cSrcweir 1601*cdf0e10cSrcweir 1602*cdf0e10cSrcweir void MultiLineEdit::SetLeftMargin( sal_uInt16 n ) 1603*cdf0e10cSrcweir { 1604*cdf0e10cSrcweir if ( GetTextEngine() ) 1605*cdf0e10cSrcweir GetTextEngine()->SetLeftMargin( n ); 1606*cdf0e10cSrcweir } 1607*cdf0e10cSrcweir 1608*cdf0e10cSrcweir sal_uInt16 MultiLineEdit::GetLeftMargin() const 1609*cdf0e10cSrcweir { 1610*cdf0e10cSrcweir if ( GetTextEngine() ) 1611*cdf0e10cSrcweir return GetTextEngine()->GetLeftMargin(); 1612*cdf0e10cSrcweir else 1613*cdf0e10cSrcweir return 0; 1614*cdf0e10cSrcweir } 1615*cdf0e10cSrcweir 1616*cdf0e10cSrcweir void MultiLineEdit::SetRightToLeft( sal_Bool bRightToLeft ) 1617*cdf0e10cSrcweir { 1618*cdf0e10cSrcweir if ( GetTextEngine() ) 1619*cdf0e10cSrcweir { 1620*cdf0e10cSrcweir GetTextEngine()->SetRightToLeft( bRightToLeft ); 1621*cdf0e10cSrcweir GetTextView()->ShowCursor(); 1622*cdf0e10cSrcweir } 1623*cdf0e10cSrcweir } 1624*cdf0e10cSrcweir 1625*cdf0e10cSrcweir sal_Bool MultiLineEdit::IsRightToLeft() const 1626*cdf0e10cSrcweir { 1627*cdf0e10cSrcweir sal_Bool bRightToLeft = sal_False; 1628*cdf0e10cSrcweir 1629*cdf0e10cSrcweir if ( GetTextEngine() ) 1630*cdf0e10cSrcweir bRightToLeft = GetTextEngine()->IsRightToLeft(); 1631*cdf0e10cSrcweir 1632*cdf0e10cSrcweir return bRightToLeft; 1633*cdf0e10cSrcweir } 1634*cdf0e10cSrcweir 1635*cdf0e10cSrcweir // virtual 1636*cdf0e10cSrcweir ::css::uno::Reference< ::css::awt::XWindowPeer > 1637*cdf0e10cSrcweir MultiLineEdit::GetComponentInterface(sal_Bool bCreate) 1638*cdf0e10cSrcweir { 1639*cdf0e10cSrcweir ::css::uno::Reference< ::css::awt::XWindowPeer > xPeer( 1640*cdf0e10cSrcweir Edit::GetComponentInterface(false)); 1641*cdf0e10cSrcweir if (!xPeer.is() && bCreate) 1642*cdf0e10cSrcweir { 1643*cdf0e10cSrcweir ::std::auto_ptr< VCLXMultiLineEdit > xEdit(new VCLXMultiLineEdit()); 1644*cdf0e10cSrcweir xEdit->SetWindow(this); 1645*cdf0e10cSrcweir xPeer = xEdit.release(); 1646*cdf0e10cSrcweir SetComponentInterface(xPeer); 1647*cdf0e10cSrcweir } 1648*cdf0e10cSrcweir return xPeer; 1649*cdf0e10cSrcweir } 1650*cdf0e10cSrcweir /*-- 11.08.2004 11:29:23--------------------------------------------------- 1651*cdf0e10cSrcweir 1652*cdf0e10cSrcweir -----------------------------------------------------------------------*/ 1653*cdf0e10cSrcweir void MultiLineEdit::DisableSelectionOnFocus() 1654*cdf0e10cSrcweir { 1655*cdf0e10cSrcweir pImpSvMEdit->GetTextWindow()->DisableSelectionOnFocus(); 1656*cdf0e10cSrcweir } 1657