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