xref: /trunk/main/svtools/source/edit/svmedit.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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