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