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