xref: /AOO41X/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