xref: /aoo4110/main/vcl/source/control/edit.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_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <tools/rc.h>
28*b1cdbd2cSJim Jagielski #include <vcl/decoview.hxx>
29*b1cdbd2cSJim Jagielski #include <vcl/event.hxx>
30*b1cdbd2cSJim Jagielski #include <vcl/cursor.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
32*b1cdbd2cSJim Jagielski #include <vcl/menu.hxx>
33*b1cdbd2cSJim Jagielski #include <vcl/cmdevt.h>
34*b1cdbd2cSJim Jagielski #include <vcl/edit.hxx>
35*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
36*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <window.h>
39*b1cdbd2cSJim Jagielski #include <svdata.hxx>
40*b1cdbd2cSJim Jagielski #include <svids.hrc>
41*b1cdbd2cSJim Jagielski #include <subedit.hxx>
42*b1cdbd2cSJim Jagielski #include <controldata.hxx>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/XBreakIterator.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/CharacterIteratorMode.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/WordType.hpp>
50*b1cdbd2cSJim Jagielski #include <cppuhelper/weak.hxx>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/datatransfer/XTransferable.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_DATATRANSFER_DND_DNDCONSTANS_HPP_
56*b1cdbd2cSJim Jagielski #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
57*b1cdbd2cSJim Jagielski #endif
58*b1cdbd2cSJim Jagielski #include <com/sun/star/datatransfer/dnd/XDragGestureRecognizer.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_I18N_XEXTENDEDINPUTSEQUENCECHECKER_HDL_
62*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/XExtendedInputSequenceChecker.hpp>
63*b1cdbd2cSJim Jagielski #endif
64*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/InputSequenceCheckMode.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/ScriptType.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.hxx>
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
71*b1cdbd2cSJim Jagielski #include <comphelper/configurationhelper.hxx>
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski #include <sot/exchange.hxx>
74*b1cdbd2cSJim Jagielski #include <sot/formats.hxx>
75*b1cdbd2cSJim Jagielski #include <rtl/memory.h>
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski #include <vcl/unohelp.hxx>
78*b1cdbd2cSJim Jagielski #include <vcl/unohelp2.hxx>
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
84*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
85*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
86*b1cdbd2cSJim Jagielski using namespace ::rtl;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski // - Redo
89*b1cdbd2cSJim Jagielski // - Bei Tracking-Cancel DefaultSelection wieder herstellen
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski // =======================================================================
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski static FncGetSpecialChars pImplFncGetSpecialChars = NULL;
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski // =======================================================================
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski #define EDIT_ALIGN_LEFT 			1
98*b1cdbd2cSJim Jagielski #define EDIT_ALIGN_CENTER			2
99*b1cdbd2cSJim Jagielski #define EDIT_ALIGN_RIGHT			3
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski #define EDIT_DEL_LEFT				1
102*b1cdbd2cSJim Jagielski #define EDIT_DEL_RIGHT				2
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski #define EDIT_DELMODE_SIMPLE 		11
105*b1cdbd2cSJim Jagielski #define EDIT_DELMODE_RESTOFWORD 	12
106*b1cdbd2cSJim Jagielski #define EDIT_DELMODE_RESTOFCONTENT	13
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski // =======================================================================
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski struct DDInfo
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski 	Cursor			aCursor;
113*b1cdbd2cSJim Jagielski     Selection       aDndStartSel;
114*b1cdbd2cSJim Jagielski 	xub_StrLen		nDropPos;
115*b1cdbd2cSJim Jagielski 	sal_Bool			bStarterOfDD;
116*b1cdbd2cSJim Jagielski 	sal_Bool			bDroppedInMe;
117*b1cdbd2cSJim Jagielski 	sal_Bool			bVisCursor;
118*b1cdbd2cSJim Jagielski     sal_Bool            bIsStringSupported;
119*b1cdbd2cSJim Jagielski 
DDInfoDDInfo120*b1cdbd2cSJim Jagielski 	DDInfo()
121*b1cdbd2cSJim Jagielski 	{
122*b1cdbd2cSJim Jagielski 		aCursor.SetStyle( CURSOR_SHADOW );
123*b1cdbd2cSJim Jagielski 		nDropPos = 0;
124*b1cdbd2cSJim Jagielski 		bStarterOfDD = sal_False;
125*b1cdbd2cSJim Jagielski 		bDroppedInMe = sal_False;
126*b1cdbd2cSJim Jagielski 		bVisCursor = sal_False;
127*b1cdbd2cSJim Jagielski         bIsStringSupported = sal_False;
128*b1cdbd2cSJim Jagielski 	}
129*b1cdbd2cSJim Jagielski };
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski // =======================================================================
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski struct Impl_IMEInfos
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski     String      aOldTextAfterStartPos;
136*b1cdbd2cSJim Jagielski 	sal_uInt16* 	pAttribs;
137*b1cdbd2cSJim Jagielski 	xub_StrLen	nPos;
138*b1cdbd2cSJim Jagielski 	xub_StrLen	nLen;
139*b1cdbd2cSJim Jagielski 	sal_Bool		bCursor;
140*b1cdbd2cSJim Jagielski 	sal_Bool		bWasCursorOverwrite;
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 				Impl_IMEInfos( xub_StrLen nPos, const String& rOldTextAfterStartPos );
143*b1cdbd2cSJim Jagielski 				~Impl_IMEInfos();
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	void		CopyAttribs( const xub_StrLen* pA, xub_StrLen nL );
146*b1cdbd2cSJim Jagielski 	void		DestroyAttribs();
147*b1cdbd2cSJim Jagielski };
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
150*b1cdbd2cSJim Jagielski 
Impl_IMEInfos(xub_StrLen nP,const String & rOldTextAfterStartPos)151*b1cdbd2cSJim Jagielski Impl_IMEInfos::Impl_IMEInfos( xub_StrLen nP, const String& rOldTextAfterStartPos )
152*b1cdbd2cSJim Jagielski  : aOldTextAfterStartPos( rOldTextAfterStartPos )
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski 	nPos = nP;
155*b1cdbd2cSJim Jagielski 	nLen = 0;
156*b1cdbd2cSJim Jagielski 	bCursor = sal_True;
157*b1cdbd2cSJim Jagielski 	pAttribs = NULL;
158*b1cdbd2cSJim Jagielski 	bWasCursorOverwrite = sal_False;
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
162*b1cdbd2cSJim Jagielski 
~Impl_IMEInfos()163*b1cdbd2cSJim Jagielski Impl_IMEInfos::~Impl_IMEInfos()
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski 	delete[] pAttribs;
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
169*b1cdbd2cSJim Jagielski 
CopyAttribs(const xub_StrLen * pA,xub_StrLen nL)170*b1cdbd2cSJim Jagielski void Impl_IMEInfos::CopyAttribs( const xub_StrLen* pA, xub_StrLen nL )
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski 	nLen = nL;
173*b1cdbd2cSJim Jagielski 	delete[] pAttribs;
174*b1cdbd2cSJim Jagielski 	pAttribs = new sal_uInt16[ nL ];
175*b1cdbd2cSJim Jagielski 	rtl_copyMemory( pAttribs, pA, nL*sizeof(sal_uInt16) );
176*b1cdbd2cSJim Jagielski }
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
179*b1cdbd2cSJim Jagielski 
DestroyAttribs()180*b1cdbd2cSJim Jagielski void Impl_IMEInfos::DestroyAttribs()
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski 	delete[] pAttribs;
183*b1cdbd2cSJim Jagielski 	pAttribs = NULL;
184*b1cdbd2cSJim Jagielski 	nLen = 0;
185*b1cdbd2cSJim Jagielski }
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski // =======================================================================
188*b1cdbd2cSJim Jagielski 
Edit(WindowType nType)189*b1cdbd2cSJim Jagielski Edit::Edit( WindowType nType ) :
190*b1cdbd2cSJim Jagielski 	Control( nType )
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski 	ImplInitEditData();
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
196*b1cdbd2cSJim Jagielski 
Edit(Window * pParent,WinBits nStyle)197*b1cdbd2cSJim Jagielski Edit::Edit( Window* pParent, WinBits nStyle ) :
198*b1cdbd2cSJim Jagielski 	Control( WINDOW_EDIT )
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski 	ImplInitEditData();
201*b1cdbd2cSJim Jagielski 	ImplInit( pParent, nStyle );
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
205*b1cdbd2cSJim Jagielski 
Edit(Window * pParent,const ResId & rResId)206*b1cdbd2cSJim Jagielski Edit::Edit( Window* pParent, const ResId& rResId ) :
207*b1cdbd2cSJim Jagielski     Control( WINDOW_EDIT )
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski     ImplInitEditData();
210*b1cdbd2cSJim Jagielski     rResId.SetRT( RSC_EDIT );
211*b1cdbd2cSJim Jagielski     WinBits nStyle = ImplInitRes( rResId );
212*b1cdbd2cSJim Jagielski     ImplInit( pParent, nStyle );
213*b1cdbd2cSJim Jagielski     ImplLoadRes( rResId );
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski     // Derived MultiLineEdit takes care to call Show only after MultiLineEdit
216*b1cdbd2cSJim Jagielski     // ctor has already started:
217*b1cdbd2cSJim Jagielski     if ( !(nStyle & WB_HIDE) && rResId.GetRT() != RSC_MULTILINEEDIT )
218*b1cdbd2cSJim Jagielski         Show();
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
222*b1cdbd2cSJim Jagielski 
Edit(Window * pParent,const ResId & rResId,bool bDisableAccessibleLabeledByRelation)223*b1cdbd2cSJim Jagielski Edit::Edit( Window* pParent, const ResId& rResId, bool bDisableAccessibleLabeledByRelation ) :
224*b1cdbd2cSJim Jagielski     Control( WINDOW_EDIT )
225*b1cdbd2cSJim Jagielski {
226*b1cdbd2cSJim Jagielski     ImplInitEditData();
227*b1cdbd2cSJim Jagielski     rResId.SetRT( RSC_EDIT );
228*b1cdbd2cSJim Jagielski     WinBits nStyle = ImplInitRes( rResId );
229*b1cdbd2cSJim Jagielski     ImplInit( pParent, nStyle );
230*b1cdbd2cSJim Jagielski     ImplLoadRes( rResId );
231*b1cdbd2cSJim Jagielski     if ( bDisableAccessibleLabeledByRelation )
232*b1cdbd2cSJim Jagielski         ImplGetWindowImpl()->mbDisableAccessibleLabeledByRelation = sal_True;
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski     // Derived MultiLineEdit takes care to call Show only after MultiLineEdit
235*b1cdbd2cSJim Jagielski     // ctor has already started:
236*b1cdbd2cSJim Jagielski     if ( !(nStyle & WB_HIDE) && rResId.GetRT() != RSC_MULTILINEEDIT )
237*b1cdbd2cSJim Jagielski         Show();
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
241*b1cdbd2cSJim Jagielski 
~Edit()242*b1cdbd2cSJim Jagielski Edit::~Edit()
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski 	delete mpDDInfo;
245*b1cdbd2cSJim Jagielski 	Cursor* pCursor = GetCursor();
246*b1cdbd2cSJim Jagielski 	if ( pCursor )
247*b1cdbd2cSJim Jagielski 	{
248*b1cdbd2cSJim Jagielski 		SetCursor( NULL );
249*b1cdbd2cSJim Jagielski 		delete pCursor;
250*b1cdbd2cSJim Jagielski 	}
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 	delete mpIMEInfos;
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 	if ( mpUpdateDataTimer )
255*b1cdbd2cSJim Jagielski 		delete mpUpdateDataTimer;
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski     if ( mxDnDListener.is() )
258*b1cdbd2cSJim Jagielski     {
259*b1cdbd2cSJim Jagielski         if ( GetDragGestureRecognizer().is() )
260*b1cdbd2cSJim Jagielski         {
261*b1cdbd2cSJim Jagielski             uno::Reference< datatransfer::dnd::XDragGestureListener> xDGL( mxDnDListener, uno::UNO_QUERY );
262*b1cdbd2cSJim Jagielski             GetDragGestureRecognizer()->removeDragGestureListener( xDGL );
263*b1cdbd2cSJim Jagielski         }
264*b1cdbd2cSJim Jagielski         if ( GetDropTarget().is() )
265*b1cdbd2cSJim Jagielski         {
266*b1cdbd2cSJim Jagielski             uno::Reference< datatransfer::dnd::XDropTargetListener> xDTL( mxDnDListener, uno::UNO_QUERY );
267*b1cdbd2cSJim Jagielski             GetDropTarget()->removeDropTargetListener( xDTL );
268*b1cdbd2cSJim Jagielski         }
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski         uno::Reference< lang::XEventListener> xEL( mxDnDListener, uno::UNO_QUERY );
271*b1cdbd2cSJim Jagielski         xEL->disposing( lang::EventObject() );  // #95154# #96585# Empty Source means it's the Client
272*b1cdbd2cSJim Jagielski     }
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
276*b1cdbd2cSJim Jagielski 
ImplInitEditData()277*b1cdbd2cSJim Jagielski void Edit::ImplInitEditData()
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski 	mpSubEdit				= NULL;
280*b1cdbd2cSJim Jagielski 	mpUpdateDataTimer		= NULL;
281*b1cdbd2cSJim Jagielski 	mnXOffset				= 0;
282*b1cdbd2cSJim Jagielski 	mnAlign 				= EDIT_ALIGN_LEFT;
283*b1cdbd2cSJim Jagielski 	mnMaxTextLen			= EDIT_NOLIMIT;
284*b1cdbd2cSJim Jagielski 	meAutocompleteAction	= AUTOCOMPLETE_KEYINPUT;
285*b1cdbd2cSJim Jagielski 	mbModified				= sal_False;
286*b1cdbd2cSJim Jagielski 	mbInternModified		= sal_False;
287*b1cdbd2cSJim Jagielski 	mbReadOnly				= sal_False;
288*b1cdbd2cSJim Jagielski 	mbInsertMode			= sal_True;
289*b1cdbd2cSJim Jagielski 	mbClickedInSelection	= sal_False;
290*b1cdbd2cSJim Jagielski 	mbActivePopup			= sal_False;
291*b1cdbd2cSJim Jagielski 	mbIsSubEdit 			= sal_False;
292*b1cdbd2cSJim Jagielski 	mbInMBDown				= sal_False;
293*b1cdbd2cSJim Jagielski 	mpDDInfo				= NULL;
294*b1cdbd2cSJim Jagielski 	mpIMEInfos				= NULL;
295*b1cdbd2cSJim Jagielski 	mcEchoChar				= 0;
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski     // --- RTL --- no default mirroring for Edit controls
298*b1cdbd2cSJim Jagielski     // note: controls that use a subedit will revert this (SpinField, ComboBox)
299*b1cdbd2cSJim Jagielski     EnableRTL( sal_False );
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski     vcl::unohelper::DragAndDropWrapper* pDnDWrapper = new vcl::unohelper::DragAndDropWrapper( this );
302*b1cdbd2cSJim Jagielski     mxDnDListener = pDnDWrapper;
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
306*b1cdbd2cSJim Jagielski 
ImplUseNativeBorder(WinBits nStyle)307*b1cdbd2cSJim Jagielski bool Edit::ImplUseNativeBorder( WinBits nStyle )
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski     bool bRet =
310*b1cdbd2cSJim Jagielski         IsNativeControlSupported(ImplGetNativeControlType(), HAS_BACKGROUND_TEXTURE)
311*b1cdbd2cSJim Jagielski                                  && ((nStyle&WB_BORDER) && !(nStyle&WB_NOBORDER));
312*b1cdbd2cSJim Jagielski     if( ! bRet && mbIsSubEdit )
313*b1cdbd2cSJim Jagielski     {
314*b1cdbd2cSJim Jagielski         Window* pWindow = GetParent();
315*b1cdbd2cSJim Jagielski         nStyle = pWindow->GetStyle();
316*b1cdbd2cSJim Jagielski         bRet = pWindow->IsNativeControlSupported(ImplGetNativeControlType(), HAS_BACKGROUND_TEXTURE)
317*b1cdbd2cSJim Jagielski                && ((nStyle&WB_BORDER) && !(nStyle&WB_NOBORDER));
318*b1cdbd2cSJim Jagielski     }
319*b1cdbd2cSJim Jagielski     return bRet;
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski 
ImplInit(Window * pParent,WinBits nStyle)322*b1cdbd2cSJim Jagielski void Edit::ImplInit( Window* pParent, WinBits nStyle )
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski 	nStyle = ImplInitStyle( nStyle );
325*b1cdbd2cSJim Jagielski 	if ( !(nStyle & (WB_CENTER | WB_RIGHT)) )
326*b1cdbd2cSJim Jagielski 		nStyle |= WB_LEFT;
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 	Control::ImplInit( pParent, nStyle, NULL );
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski 	mbReadOnly = (nStyle & WB_READONLY) != 0;
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 	mnAlign = EDIT_ALIGN_LEFT;
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski     // --- RTL --- hack: right align until keyinput and cursor travelling works
335*b1cdbd2cSJim Jagielski     if( IsRTLEnabled() )
336*b1cdbd2cSJim Jagielski         mnAlign	= EDIT_ALIGN_RIGHT;
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski     if ( nStyle & WB_RIGHT )
339*b1cdbd2cSJim Jagielski         mnAlign = EDIT_ALIGN_RIGHT;
340*b1cdbd2cSJim Jagielski     else if ( nStyle & WB_CENTER )
341*b1cdbd2cSJim Jagielski         mnAlign = EDIT_ALIGN_CENTER;
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski     SetCursor( new Cursor );
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski     SetPointer( Pointer( POINTER_TEXT ) );
346*b1cdbd2cSJim Jagielski     ImplInitSettings( sal_True, sal_True, sal_True );
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     uno::Reference< datatransfer::dnd::XDragGestureListener> xDGL( mxDnDListener, uno::UNO_QUERY );
349*b1cdbd2cSJim Jagielski     uno::Reference< datatransfer::dnd::XDragGestureRecognizer > xDGR = GetDragGestureRecognizer();
350*b1cdbd2cSJim Jagielski     if ( xDGR.is() )
351*b1cdbd2cSJim Jagielski     {
352*b1cdbd2cSJim Jagielski         xDGR->addDragGestureListener( xDGL );
353*b1cdbd2cSJim Jagielski         uno::Reference< datatransfer::dnd::XDropTargetListener> xDTL( mxDnDListener, uno::UNO_QUERY );
354*b1cdbd2cSJim Jagielski         GetDropTarget()->addDropTargetListener( xDTL );
355*b1cdbd2cSJim Jagielski         GetDropTarget()->setActive( sal_True );
356*b1cdbd2cSJim Jagielski         GetDropTarget()->setDefaultActions( datatransfer::dnd::DNDConstants::ACTION_COPY_OR_MOVE );
357*b1cdbd2cSJim Jagielski     }
358*b1cdbd2cSJim Jagielski }
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
361*b1cdbd2cSJim Jagielski 
ImplInitStyle(WinBits nStyle)362*b1cdbd2cSJim Jagielski WinBits Edit::ImplInitStyle( WinBits nStyle )
363*b1cdbd2cSJim Jagielski {
364*b1cdbd2cSJim Jagielski 	if ( !(nStyle & WB_NOTABSTOP) )
365*b1cdbd2cSJim Jagielski 		nStyle |= WB_TABSTOP;
366*b1cdbd2cSJim Jagielski 	if ( !(nStyle & WB_NOGROUP) )
367*b1cdbd2cSJim Jagielski 		nStyle |= WB_GROUP;
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski 	return nStyle;
370*b1cdbd2cSJim Jagielski }
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
373*b1cdbd2cSJim Jagielski 
IsCharInput(const KeyEvent & rKeyEvent)374*b1cdbd2cSJim Jagielski sal_Bool Edit::IsCharInput( const KeyEvent& rKeyEvent )
375*b1cdbd2cSJim Jagielski {
376*b1cdbd2cSJim Jagielski 	// In the future we must use new Unicode functions for this
377*b1cdbd2cSJim Jagielski 	xub_Unicode cCharCode = rKeyEvent.GetCharCode();
378*b1cdbd2cSJim Jagielski 	return ((cCharCode >= 32) && (cCharCode != 127) &&
379*b1cdbd2cSJim Jagielski             !rKeyEvent.GetKeyCode().IsMod3() &&
380*b1cdbd2cSJim Jagielski             !rKeyEvent.GetKeyCode().IsMod2() &&
381*b1cdbd2cSJim Jagielski             !rKeyEvent.GetKeyCode().IsMod1() );
382*b1cdbd2cSJim Jagielski }
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
385*b1cdbd2cSJim Jagielski 
ImplModified()386*b1cdbd2cSJim Jagielski void Edit::ImplModified()
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski 	mbModified = sal_True;
389*b1cdbd2cSJim Jagielski 	Modify();
390*b1cdbd2cSJim Jagielski }
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
393*b1cdbd2cSJim Jagielski 
ImplInitSettings(sal_Bool bFont,sal_Bool bForeground,sal_Bool bBackground)394*b1cdbd2cSJim Jagielski void Edit::ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground )
395*b1cdbd2cSJim Jagielski {
396*b1cdbd2cSJim Jagielski 	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 	if ( bFont )
399*b1cdbd2cSJim Jagielski 	{
400*b1cdbd2cSJim Jagielski 		Font aFont = rStyleSettings.GetFieldFont();
401*b1cdbd2cSJim Jagielski 		if ( IsControlFont() )
402*b1cdbd2cSJim Jagielski 			aFont.Merge( GetControlFont() );
403*b1cdbd2cSJim Jagielski 		SetZoomedPointFont( aFont );
404*b1cdbd2cSJim Jagielski         ImplClearLayoutData();
405*b1cdbd2cSJim Jagielski 	}
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski 	if ( bFont || bForeground )
408*b1cdbd2cSJim Jagielski 	{
409*b1cdbd2cSJim Jagielski 		Color aTextColor = rStyleSettings.GetFieldTextColor();
410*b1cdbd2cSJim Jagielski 		if ( IsControlForeground() )
411*b1cdbd2cSJim Jagielski 			aTextColor = GetControlForeground();
412*b1cdbd2cSJim Jagielski 		SetTextColor( aTextColor );
413*b1cdbd2cSJim Jagielski 	}
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 	if ( bBackground )
416*b1cdbd2cSJim Jagielski 	{
417*b1cdbd2cSJim Jagielski 		if ( ImplUseNativeBorder( GetStyle() ) || IsPaintTransparent() )
418*b1cdbd2cSJim Jagielski 		{
419*b1cdbd2cSJim Jagielski 			// Transparent background
420*b1cdbd2cSJim Jagielski 			SetBackground();
421*b1cdbd2cSJim Jagielski 			SetFillColor();
422*b1cdbd2cSJim Jagielski 		}
423*b1cdbd2cSJim Jagielski 		else if ( IsControlBackground() )
424*b1cdbd2cSJim Jagielski 		{
425*b1cdbd2cSJim Jagielski 			SetBackground( GetControlBackground() );
426*b1cdbd2cSJim Jagielski 			SetFillColor( GetControlBackground() );
427*b1cdbd2cSJim Jagielski 		}
428*b1cdbd2cSJim Jagielski 		else
429*b1cdbd2cSJim Jagielski 		{
430*b1cdbd2cSJim Jagielski 			SetBackground( rStyleSettings.GetFieldColor() );
431*b1cdbd2cSJim Jagielski 			SetFillColor( rStyleSettings.GetFieldColor() );
432*b1cdbd2cSJim Jagielski 		}
433*b1cdbd2cSJim Jagielski 	}
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
437*b1cdbd2cSJim Jagielski 
ImplGetExtraOffset() const438*b1cdbd2cSJim Jagielski long Edit::ImplGetExtraOffset() const
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski     // MT 09/2002: nExtraOffsetX should become a member, instead of checking every time,
441*b1cdbd2cSJim Jagielski     // but I need an incompatible update for this...
442*b1cdbd2cSJim Jagielski     // #94095# Use extra offset only when edit has a border
443*b1cdbd2cSJim Jagielski     long nExtraOffset = 0;
444*b1cdbd2cSJim Jagielski     if( ( GetStyle() & WB_BORDER ) || ( mbIsSubEdit && ( GetParent()->GetStyle() & WB_BORDER ) ) )
445*b1cdbd2cSJim Jagielski         nExtraOffset = 2;
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski     return nExtraOffset;
448*b1cdbd2cSJim Jagielski }
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
452*b1cdbd2cSJim Jagielski 
ImplGetText() const453*b1cdbd2cSJim Jagielski XubString Edit::ImplGetText() const
454*b1cdbd2cSJim Jagielski {
455*b1cdbd2cSJim Jagielski 	if ( mcEchoChar || (GetStyle() & WB_PASSWORD) )
456*b1cdbd2cSJim Jagielski 	{
457*b1cdbd2cSJim Jagielski 		XubString	aText;
458*b1cdbd2cSJim Jagielski 		xub_Unicode cEchoChar;
459*b1cdbd2cSJim Jagielski 		if ( mcEchoChar )
460*b1cdbd2cSJim Jagielski 			cEchoChar = mcEchoChar;
461*b1cdbd2cSJim Jagielski 		else
462*b1cdbd2cSJim Jagielski 			cEchoChar = '*';
463*b1cdbd2cSJim Jagielski 		aText.Fill( maText.Len(), cEchoChar );
464*b1cdbd2cSJim Jagielski 		return aText;
465*b1cdbd2cSJim Jagielski 	}
466*b1cdbd2cSJim Jagielski 	else
467*b1cdbd2cSJim Jagielski 		return maText;
468*b1cdbd2cSJim Jagielski }
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
471*b1cdbd2cSJim Jagielski 
ImplInvalidateOrRepaint(xub_StrLen nStart,xub_StrLen nEnd)472*b1cdbd2cSJim Jagielski void Edit::ImplInvalidateOrRepaint( xub_StrLen nStart, xub_StrLen nEnd )
473*b1cdbd2cSJim Jagielski {
474*b1cdbd2cSJim Jagielski     if( IsPaintTransparent() )
475*b1cdbd2cSJim Jagielski     {
476*b1cdbd2cSJim Jagielski         Invalidate();
477*b1cdbd2cSJim Jagielski         // FIXME: this is currently only on aqua
478*b1cdbd2cSJim Jagielski         if( ImplGetSVData()->maNWFData.mbNoFocusRects )
479*b1cdbd2cSJim Jagielski             Update();
480*b1cdbd2cSJim Jagielski     }
481*b1cdbd2cSJim Jagielski     else
482*b1cdbd2cSJim Jagielski         ImplRepaint( nStart, nEnd );
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
486*b1cdbd2cSJim Jagielski 
ImplGetTextYPosition() const487*b1cdbd2cSJim Jagielski long Edit::ImplGetTextYPosition() const
488*b1cdbd2cSJim Jagielski {
489*b1cdbd2cSJim Jagielski     if ( GetStyle() & WB_TOP )
490*b1cdbd2cSJim Jagielski         return ImplGetExtraOffset();
491*b1cdbd2cSJim Jagielski     else if ( GetStyle() & WB_BOTTOM )
492*b1cdbd2cSJim Jagielski         return GetOutputSizePixel().Height() - GetTextHeight() - ImplGetExtraOffset();
493*b1cdbd2cSJim Jagielski     return ( GetOutputSizePixel().Height() - GetTextHeight() ) / 2;
494*b1cdbd2cSJim Jagielski }
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
497*b1cdbd2cSJim Jagielski 
ImplRepaint(xub_StrLen nStart,xub_StrLen nEnd,bool bLayout)498*b1cdbd2cSJim Jagielski void Edit::ImplRepaint( xub_StrLen nStart, xub_StrLen nEnd, bool bLayout )
499*b1cdbd2cSJim Jagielski {
500*b1cdbd2cSJim Jagielski 	if ( !IsReallyVisible() )
501*b1cdbd2cSJim Jagielski 		return;
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 	XubString aText = ImplGetText();
504*b1cdbd2cSJim Jagielski     nStart = 0;
505*b1cdbd2cSJim Jagielski     nEnd = aText.Len();
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski     sal_Int32	nDXBuffer[256];
508*b1cdbd2cSJim Jagielski     sal_Int32*	pDXBuffer = NULL;
509*b1cdbd2cSJim Jagielski     sal_Int32*	pDX = nDXBuffer;
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski     if( aText.Len() )
512*b1cdbd2cSJim Jagielski     {
513*b1cdbd2cSJim Jagielski         if( 2*aText.Len() > xub_StrLen(sizeof(nDXBuffer)/sizeof(nDXBuffer[0])) )
514*b1cdbd2cSJim Jagielski         {
515*b1cdbd2cSJim Jagielski             pDXBuffer = new sal_Int32[2*(aText.Len()+1)];
516*b1cdbd2cSJim Jagielski             pDX = pDXBuffer;
517*b1cdbd2cSJim Jagielski         }
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski         GetCaretPositions( aText, pDX, nStart, nEnd );
520*b1cdbd2cSJim Jagielski     }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski 	long	nTH = GetTextHeight();
523*b1cdbd2cSJim Jagielski 	Point	aPos( mnXOffset, ImplGetTextYPosition() );
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski     if( bLayout )
526*b1cdbd2cSJim Jagielski     {
527*b1cdbd2cSJim Jagielski         long nPos = nStart ? pDX[2*nStart] : 0;
528*b1cdbd2cSJim Jagielski         aPos.X() = nPos + mnXOffset + ImplGetExtraOffset();
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski         MetricVector* pVector = &mpControlData->mpLayoutData->m_aUnicodeBoundRects;
531*b1cdbd2cSJim Jagielski         String* pDisplayText = &mpControlData->mpLayoutData->m_aDisplayText;
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski 		DrawText( aPos, aText, nStart, nEnd - nStart, pVector, pDisplayText );
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski         if( pDXBuffer )
536*b1cdbd2cSJim Jagielski             delete [] pDXBuffer;
537*b1cdbd2cSJim Jagielski         return;
538*b1cdbd2cSJim Jagielski     }
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski 	Cursor* pCursor = GetCursor();
541*b1cdbd2cSJim Jagielski 	sal_Bool bVisCursor = pCursor ? pCursor->IsVisible() : sal_False;
542*b1cdbd2cSJim Jagielski 	if ( pCursor )
543*b1cdbd2cSJim Jagielski 		pCursor->Hide();
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski     ImplClearBackground( 0, GetOutputSizePixel().Width() );
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski 	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
548*b1cdbd2cSJim Jagielski 	if ( IsEnabled() )
549*b1cdbd2cSJim Jagielski 		ImplInitSettings( sal_False, sal_True, sal_False );
550*b1cdbd2cSJim Jagielski 	else
551*b1cdbd2cSJim Jagielski 		SetTextColor( rStyleSettings.GetDisableColor() );
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski     // Set background color of the normal text
554*b1cdbd2cSJim Jagielski     if( (GetStyle() & WB_FORCECTRLBACKGROUND) != 0 && IsControlBackground() )
555*b1cdbd2cSJim Jagielski     {
556*b1cdbd2cSJim Jagielski         // check if we need to set ControlBackground even in NWF case
557*b1cdbd2cSJim Jagielski         Push( PUSH_FILLCOLOR | PUSH_LINECOLOR );
558*b1cdbd2cSJim Jagielski         SetLineColor();
559*b1cdbd2cSJim Jagielski         SetFillColor( GetControlBackground() );
560*b1cdbd2cSJim Jagielski         DrawRect( Rectangle( aPos, Size( GetOutputSizePixel().Width() - 2*mnXOffset, nTH ) ) );
561*b1cdbd2cSJim Jagielski         Pop();
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski         SetTextFillColor( GetControlBackground() );
564*b1cdbd2cSJim Jagielski     }
565*b1cdbd2cSJim Jagielski     else if( IsPaintTransparent() || ImplUseNativeBorder( GetStyle() ) )
566*b1cdbd2cSJim Jagielski         SetTextFillColor();
567*b1cdbd2cSJim Jagielski     else
568*b1cdbd2cSJim Jagielski         SetTextFillColor( IsControlBackground() ? GetControlBackground() : rStyleSettings.GetFieldColor() );
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski 	sal_Bool bDrawSelection = maSelection.Len() && ( HasFocus() || ( GetStyle() & WB_NOHIDESELECTION ) || mbActivePopup );
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski     long nPos = nStart ? pDX[2*nStart] : 0;
573*b1cdbd2cSJim Jagielski     aPos.X() = nPos + mnXOffset + ImplGetExtraOffset();
574*b1cdbd2cSJim Jagielski 	if ( !bDrawSelection && !mpIMEInfos )
575*b1cdbd2cSJim Jagielski 	{
576*b1cdbd2cSJim Jagielski 		DrawText( aPos, aText, nStart, nEnd - nStart );
577*b1cdbd2cSJim Jagielski 	}
578*b1cdbd2cSJim Jagielski 	else
579*b1cdbd2cSJim Jagielski 	{
580*b1cdbd2cSJim Jagielski         // save graphics state
581*b1cdbd2cSJim Jagielski         Push();
582*b1cdbd2cSJim Jagielski         // first calculate higlighted and non highlighted clip regions
583*b1cdbd2cSJim Jagielski         Region aHiglightClipRegion;
584*b1cdbd2cSJim Jagielski         Region aNormalClipRegion;
585*b1cdbd2cSJim Jagielski 		Selection aTmpSel( maSelection );
586*b1cdbd2cSJim Jagielski 		aTmpSel.Justify();
587*b1cdbd2cSJim Jagielski         // selection is highlighted
588*b1cdbd2cSJim Jagielski         int i;
589*b1cdbd2cSJim Jagielski         for( i = 0; i < aText.Len(); i++ )
590*b1cdbd2cSJim Jagielski         {
591*b1cdbd2cSJim Jagielski             Rectangle aRect( aPos, Size( 10, nTH ) );
592*b1cdbd2cSJim Jagielski             aRect.Left() = pDX[2*i] + mnXOffset + ImplGetExtraOffset();
593*b1cdbd2cSJim Jagielski             aRect.Right() = pDX[2*i+1] + mnXOffset + ImplGetExtraOffset();
594*b1cdbd2cSJim Jagielski             aRect.Justify();
595*b1cdbd2cSJim Jagielski             bool bHighlight = false;
596*b1cdbd2cSJim Jagielski             if( i >= aTmpSel.Min() && i < aTmpSel.Max() )
597*b1cdbd2cSJim Jagielski                 bHighlight = true;
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski             if( mpIMEInfos && mpIMEInfos->pAttribs &&
600*b1cdbd2cSJim Jagielski                 i >= mpIMEInfos->nPos && i < (mpIMEInfos->nPos+mpIMEInfos->nLen ) &&
601*b1cdbd2cSJim Jagielski                 ( mpIMEInfos->pAttribs[i-mpIMEInfos->nPos] & EXTTEXTINPUT_ATTR_HIGHLIGHT) )
602*b1cdbd2cSJim Jagielski                 bHighlight = true;
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski             if( bHighlight )
605*b1cdbd2cSJim Jagielski                 aHiglightClipRegion.Union( aRect );
606*b1cdbd2cSJim Jagielski             else
607*b1cdbd2cSJim Jagielski                 aNormalClipRegion.Union( aRect );
608*b1cdbd2cSJim Jagielski         }
609*b1cdbd2cSJim Jagielski         // draw normal text
610*b1cdbd2cSJim Jagielski         Color aNormalTextColor = GetTextColor();
611*b1cdbd2cSJim Jagielski         SetClipRegion( aNormalClipRegion );
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski         if( IsPaintTransparent() )
614*b1cdbd2cSJim Jagielski             SetTextFillColor();
615*b1cdbd2cSJim Jagielski         else
616*b1cdbd2cSJim Jagielski         {
617*b1cdbd2cSJim Jagielski             // Set background color when part of the text is selected
618*b1cdbd2cSJim Jagielski             if ( ImplUseNativeBorder( GetStyle() ) )
619*b1cdbd2cSJim Jagielski             {
620*b1cdbd2cSJim Jagielski                 if( (GetStyle() & WB_FORCECTRLBACKGROUND) != 0 && IsControlBackground() )
621*b1cdbd2cSJim Jagielski                     SetTextFillColor( GetControlBackground() );
622*b1cdbd2cSJim Jagielski                 else
623*b1cdbd2cSJim Jagielski                     SetTextFillColor();
624*b1cdbd2cSJim Jagielski             }
625*b1cdbd2cSJim Jagielski             else
626*b1cdbd2cSJim Jagielski                 SetTextFillColor( IsControlBackground() ? GetControlBackground() : rStyleSettings.GetFieldColor() );
627*b1cdbd2cSJim Jagielski         }
628*b1cdbd2cSJim Jagielski 		DrawText( aPos, aText, nStart, nEnd - nStart );
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski         // draw highlighted text
631*b1cdbd2cSJim Jagielski         SetClipRegion( aHiglightClipRegion );
632*b1cdbd2cSJim Jagielski         SetTextColor( rStyleSettings.GetHighlightTextColor() );
633*b1cdbd2cSJim Jagielski         SetTextFillColor( rStyleSettings.GetHighlightColor() );
634*b1cdbd2cSJim Jagielski 		DrawText( aPos, aText, nStart, nEnd - nStart );
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski         // if IME info exists loop over portions and output different font attributes
637*b1cdbd2cSJim Jagielski         if( mpIMEInfos && mpIMEInfos->pAttribs )
638*b1cdbd2cSJim Jagielski         {
639*b1cdbd2cSJim Jagielski             for( int n = 0; n < 2; n++ )
640*b1cdbd2cSJim Jagielski             {
641*b1cdbd2cSJim Jagielski                 Region aRegion;
642*b1cdbd2cSJim Jagielski                 if( n == 0 )
643*b1cdbd2cSJim Jagielski                 {
644*b1cdbd2cSJim Jagielski                     SetTextColor( aNormalTextColor );
645*b1cdbd2cSJim Jagielski                     if( IsPaintTransparent() )
646*b1cdbd2cSJim Jagielski                         SetTextFillColor();
647*b1cdbd2cSJim Jagielski                     else
648*b1cdbd2cSJim Jagielski                         SetTextFillColor( IsControlBackground() ? GetControlBackground() : rStyleSettings.GetFieldColor() );
649*b1cdbd2cSJim Jagielski                     aRegion = aNormalClipRegion;
650*b1cdbd2cSJim Jagielski                 }
651*b1cdbd2cSJim Jagielski                 else
652*b1cdbd2cSJim Jagielski                 {
653*b1cdbd2cSJim Jagielski                     SetTextColor( rStyleSettings.GetHighlightTextColor() );
654*b1cdbd2cSJim Jagielski                     SetTextFillColor( rStyleSettings.GetHighlightColor() );
655*b1cdbd2cSJim Jagielski                     aRegion = aHiglightClipRegion;
656*b1cdbd2cSJim Jagielski                 }
657*b1cdbd2cSJim Jagielski 
658*b1cdbd2cSJim Jagielski                 for( i = 0; i < mpIMEInfos->nLen; )
659*b1cdbd2cSJim Jagielski                 {
660*b1cdbd2cSJim Jagielski                     sal_uInt16 nAttr = mpIMEInfos->pAttribs[i];
661*b1cdbd2cSJim Jagielski                     Region aClip;
662*b1cdbd2cSJim Jagielski                     int nIndex = i;
663*b1cdbd2cSJim Jagielski                     while( nIndex < mpIMEInfos->nLen && mpIMEInfos->pAttribs[nIndex] == nAttr)  // #112631# check nIndex before using it
664*b1cdbd2cSJim Jagielski                     {
665*b1cdbd2cSJim Jagielski                         Rectangle aRect( aPos, Size( 10, nTH ) );
666*b1cdbd2cSJim Jagielski                         aRect.Left() = pDX[2*(nIndex+mpIMEInfos->nPos)] + mnXOffset + ImplGetExtraOffset();
667*b1cdbd2cSJim Jagielski                         aRect.Right() = pDX[2*(nIndex+mpIMEInfos->nPos)+1] + mnXOffset + ImplGetExtraOffset();
668*b1cdbd2cSJim Jagielski                         aRect.Justify();
669*b1cdbd2cSJim Jagielski                         aClip.Union( aRect );
670*b1cdbd2cSJim Jagielski                         nIndex++;
671*b1cdbd2cSJim Jagielski                     }
672*b1cdbd2cSJim Jagielski                     i = nIndex;
673*b1cdbd2cSJim Jagielski                     if( aClip.Intersect( aRegion ) && nAttr )
674*b1cdbd2cSJim Jagielski                     {
675*b1cdbd2cSJim Jagielski                         Font aFont = GetFont();
676*b1cdbd2cSJim Jagielski                         if ( nAttr & EXTTEXTINPUT_ATTR_UNDERLINE )
677*b1cdbd2cSJim Jagielski                             aFont.SetUnderline( UNDERLINE_SINGLE );
678*b1cdbd2cSJim Jagielski                         else if ( nAttr & EXTTEXTINPUT_ATTR_BOLDUNDERLINE )
679*b1cdbd2cSJim Jagielski                             aFont.SetUnderline( UNDERLINE_BOLD );
680*b1cdbd2cSJim Jagielski                         else if ( nAttr & EXTTEXTINPUT_ATTR_DOTTEDUNDERLINE )
681*b1cdbd2cSJim Jagielski                             aFont.SetUnderline( UNDERLINE_DOTTED );
682*b1cdbd2cSJim Jagielski                         else if ( nAttr & EXTTEXTINPUT_ATTR_DASHDOTUNDERLINE )
683*b1cdbd2cSJim Jagielski                             aFont.SetUnderline( UNDERLINE_DOTTED );
684*b1cdbd2cSJim Jagielski                         else if ( nAttr & EXTTEXTINPUT_ATTR_GRAYWAVELINE )
685*b1cdbd2cSJim Jagielski                         {
686*b1cdbd2cSJim Jagielski                             aFont.SetUnderline( UNDERLINE_WAVE );
687*b1cdbd2cSJim Jagielski                             SetTextLineColor( Color( COL_LIGHTGRAY ) );
688*b1cdbd2cSJim Jagielski                         }
689*b1cdbd2cSJim Jagielski                         SetFont( aFont );
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski                         if ( nAttr & EXTTEXTINPUT_ATTR_REDTEXT )
692*b1cdbd2cSJim Jagielski                             SetTextColor( Color( COL_RED ) );
693*b1cdbd2cSJim Jagielski                         else if ( nAttr & EXTTEXTINPUT_ATTR_HALFTONETEXT )
694*b1cdbd2cSJim Jagielski                             SetTextColor( Color( COL_LIGHTGRAY ) );
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski                         SetClipRegion( aClip );
697*b1cdbd2cSJim Jagielski                         DrawText( aPos, aText, nStart, nEnd - nStart );
698*b1cdbd2cSJim Jagielski                     }
699*b1cdbd2cSJim Jagielski                 }
700*b1cdbd2cSJim Jagielski             }
701*b1cdbd2cSJim Jagielski         }
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski         // restore graphics state
704*b1cdbd2cSJim Jagielski         Pop();
705*b1cdbd2cSJim Jagielski 	}
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski 	if ( bVisCursor && ( !mpIMEInfos || mpIMEInfos->bCursor ) )
708*b1cdbd2cSJim Jagielski 		pCursor->Show();
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski     if( pDXBuffer )
711*b1cdbd2cSJim Jagielski         delete [] pDXBuffer;
712*b1cdbd2cSJim Jagielski }
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
715*b1cdbd2cSJim Jagielski 
ImplDelete(const Selection & rSelection,sal_uInt8 nDirection,sal_uInt8 nMode)716*b1cdbd2cSJim Jagielski void Edit::ImplDelete( const Selection& rSelection, sal_uInt8 nDirection, sal_uInt8 nMode )
717*b1cdbd2cSJim Jagielski {
718*b1cdbd2cSJim Jagielski 	XubString aText = ImplGetText();
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 	// loeschen moeglich?
721*b1cdbd2cSJim Jagielski 	if ( !rSelection.Len() &&
722*b1cdbd2cSJim Jagielski 		 (((rSelection.Min() == 0) && (nDirection == EDIT_DEL_LEFT)) ||
723*b1cdbd2cSJim Jagielski 		  ((rSelection.Max() == aText.Len()) && (nDirection == EDIT_DEL_RIGHT))) )
724*b1cdbd2cSJim Jagielski 		return;
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski     ImplClearLayoutData();
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski 	Selection aSelection( rSelection );
729*b1cdbd2cSJim Jagielski 	aSelection.Justify();
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski 	if ( !aSelection.Len() )
732*b1cdbd2cSJim Jagielski 	{
733*b1cdbd2cSJim Jagielski 		uno::Reference < i18n::XBreakIterator > xBI = ImplGetBreakIterator();
734*b1cdbd2cSJim Jagielski 		if ( nDirection == EDIT_DEL_LEFT )
735*b1cdbd2cSJim Jagielski 		{
736*b1cdbd2cSJim Jagielski 			if ( nMode == EDIT_DELMODE_RESTOFWORD )
737*b1cdbd2cSJim Jagielski 			{
738*b1cdbd2cSJim Jagielski 				i18n::Boundary aBoundary = xBI->getWordBoundary( maText, aSelection.Min(), GetSettings().GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True );
739*b1cdbd2cSJim Jagielski 				if ( aBoundary.startPos == aSelection.Min() )
740*b1cdbd2cSJim Jagielski 					aBoundary = xBI->previousWord( maText, aSelection.Min(), GetSettings().GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES );
741*b1cdbd2cSJim Jagielski 				aSelection.Min() = aBoundary.startPos;
742*b1cdbd2cSJim Jagielski 			}
743*b1cdbd2cSJim Jagielski 			else if ( nMode == EDIT_DELMODE_RESTOFCONTENT )
744*b1cdbd2cSJim Jagielski 		   	{
745*b1cdbd2cSJim Jagielski 				aSelection.Min() = 0;
746*b1cdbd2cSJim Jagielski 			}
747*b1cdbd2cSJim Jagielski 			else
748*b1cdbd2cSJim Jagielski 			{
749*b1cdbd2cSJim Jagielski 				sal_Int32 nCount = 1;
750*b1cdbd2cSJim Jagielski 				aSelection.Min() = xBI->previousCharacters( maText, aSelection.Min(), GetSettings().GetLocale(), i18n::CharacterIteratorMode::SKIPCHARACTER, nCount, nCount );
751*b1cdbd2cSJim Jagielski 			}
752*b1cdbd2cSJim Jagielski 		}
753*b1cdbd2cSJim Jagielski 		else
754*b1cdbd2cSJim Jagielski 		{
755*b1cdbd2cSJim Jagielski 			if ( nMode == EDIT_DELMODE_RESTOFWORD )
756*b1cdbd2cSJim Jagielski 			{
757*b1cdbd2cSJim Jagielski 				i18n::Boundary aBoundary = xBI->nextWord( maText, aSelection.Max(), GetSettings().GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES );
758*b1cdbd2cSJim Jagielski 				aSelection.Max() = aBoundary.startPos;
759*b1cdbd2cSJim Jagielski 			}
760*b1cdbd2cSJim Jagielski 			else if ( nMode == EDIT_DELMODE_RESTOFCONTENT )
761*b1cdbd2cSJim Jagielski 			{
762*b1cdbd2cSJim Jagielski 				aSelection.Max() = aText.Len();
763*b1cdbd2cSJim Jagielski 			}
764*b1cdbd2cSJim Jagielski 			else
765*b1cdbd2cSJim Jagielski 			{
766*b1cdbd2cSJim Jagielski 				sal_Int32 nCount = 1;
767*b1cdbd2cSJim Jagielski 				aSelection.Max() = xBI->nextCharacters( maText, aSelection.Max(), GetSettings().GetLocale(), i18n::CharacterIteratorMode::SKIPCHARACTER, nCount, nCount );;
768*b1cdbd2cSJim Jagielski 			}
769*b1cdbd2cSJim Jagielski 		}
770*b1cdbd2cSJim Jagielski 	}
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski 	maText.Erase( (xub_StrLen)aSelection.Min(), (xub_StrLen)aSelection.Len() );
773*b1cdbd2cSJim Jagielski 	maSelection.Min() = aSelection.Min();
774*b1cdbd2cSJim Jagielski 	maSelection.Max() = aSelection.Min();
775*b1cdbd2cSJim Jagielski 	ImplAlignAndPaint();
776*b1cdbd2cSJim Jagielski 	mbInternModified = sal_True;
777*b1cdbd2cSJim Jagielski }
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
780*b1cdbd2cSJim Jagielski 
ImplGetValidString(const String & rString) const781*b1cdbd2cSJim Jagielski String Edit::ImplGetValidString( const String& rString ) const
782*b1cdbd2cSJim Jagielski {
783*b1cdbd2cSJim Jagielski     String aValidString( rString );
784*b1cdbd2cSJim Jagielski 	aValidString.EraseAllChars( _LF );
785*b1cdbd2cSJim Jagielski 	aValidString.EraseAllChars( _CR );
786*b1cdbd2cSJim Jagielski 	aValidString.SearchAndReplaceAll( '\t', ' ' );
787*b1cdbd2cSJim Jagielski     return aValidString;
788*b1cdbd2cSJim Jagielski }
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
ImplGetBreakIterator() const791*b1cdbd2cSJim Jagielski uno::Reference < i18n::XBreakIterator > Edit::ImplGetBreakIterator() const
792*b1cdbd2cSJim Jagielski {
793*b1cdbd2cSJim Jagielski     //!! since we don't want to become incompatible in the next minor update
794*b1cdbd2cSJim Jagielski     //!! where this code will get integrated into, xISC will be a local
795*b1cdbd2cSJim Jagielski     //!! variable instead of a class member!
796*b1cdbd2cSJim Jagielski     uno::Reference < i18n::XBreakIterator > xBI;
797*b1cdbd2cSJim Jagielski //    if ( !xBI.is() )
798*b1cdbd2cSJim Jagielski     {
799*b1cdbd2cSJim Jagielski         uno::Reference< lang::XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
800*b1cdbd2cSJim Jagielski         uno::Reference < XInterface > xI = xMSF->createInstance( OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) );
801*b1cdbd2cSJim Jagielski         if ( xI.is() )
802*b1cdbd2cSJim Jagielski         {
803*b1cdbd2cSJim Jagielski             Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XBreakIterator >*)0) );
804*b1cdbd2cSJim Jagielski             x >>= xBI;
805*b1cdbd2cSJim Jagielski         }
806*b1cdbd2cSJim Jagielski     }
807*b1cdbd2cSJim Jagielski     return xBI;
808*b1cdbd2cSJim Jagielski }
809*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
810*b1cdbd2cSJim Jagielski 
ImplGetInputSequenceChecker() const811*b1cdbd2cSJim Jagielski uno::Reference < i18n::XExtendedInputSequenceChecker > Edit::ImplGetInputSequenceChecker() const
812*b1cdbd2cSJim Jagielski {
813*b1cdbd2cSJim Jagielski     //!! since we don't want to become incompatible in the next minor update
814*b1cdbd2cSJim Jagielski     //!! where this code will get integrated into, xISC will be a local
815*b1cdbd2cSJim Jagielski     //!! variable instead of a class member!
816*b1cdbd2cSJim Jagielski     uno::Reference < i18n::XExtendedInputSequenceChecker > xISC;
817*b1cdbd2cSJim Jagielski //    if ( !xISC.is() )
818*b1cdbd2cSJim Jagielski     {
819*b1cdbd2cSJim Jagielski         uno::Reference< lang::XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
820*b1cdbd2cSJim Jagielski         uno::Reference < XInterface > xI = xMSF->createInstance( OUString::createFromAscii( "com.sun.star.i18n.InputSequenceChecker" ) );
821*b1cdbd2cSJim Jagielski         if ( xI.is() )
822*b1cdbd2cSJim Jagielski         {
823*b1cdbd2cSJim Jagielski             Any x = xI->queryInterface( ::getCppuType((const uno::Reference< i18n::XExtendedInputSequenceChecker >*)0) );
824*b1cdbd2cSJim Jagielski             x >>= xISC;
825*b1cdbd2cSJim Jagielski         }
826*b1cdbd2cSJim Jagielski     }
827*b1cdbd2cSJim Jagielski     return xISC;
828*b1cdbd2cSJim Jagielski }
829*b1cdbd2cSJim Jagielski 
830*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
831*b1cdbd2cSJim Jagielski 
ShowTruncationWarning(Window * pParent)832*b1cdbd2cSJim Jagielski void Edit::ShowTruncationWarning( Window* pParent )
833*b1cdbd2cSJim Jagielski {
834*b1cdbd2cSJim Jagielski     ResMgr* pResMgr = ImplGetResMgr();
835*b1cdbd2cSJim Jagielski     if( pResMgr )
836*b1cdbd2cSJim Jagielski     {
837*b1cdbd2cSJim Jagielski         WarningBox aBox( pParent, ResId( SV_EDIT_WARNING_BOX, *pResMgr ) );
838*b1cdbd2cSJim Jagielski         aBox.Execute();
839*b1cdbd2cSJim Jagielski     }
840*b1cdbd2cSJim Jagielski }
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
843*b1cdbd2cSJim Jagielski 
ImplTruncateToMaxLen(rtl::OUString & rStr,sal_uInt32 nSelectionLen) const844*b1cdbd2cSJim Jagielski bool Edit::ImplTruncateToMaxLen( rtl::OUString& rStr, sal_uInt32 nSelectionLen ) const
845*b1cdbd2cSJim Jagielski {
846*b1cdbd2cSJim Jagielski     bool bWasTruncated = false;
847*b1cdbd2cSJim Jagielski     const sal_uInt32 nMaxLen = mnMaxTextLen < 65534 ? mnMaxTextLen : 65534;
848*b1cdbd2cSJim Jagielski     sal_uInt32 nLenAfter = static_cast<sal_uInt32>(maText.Len()) + rStr.getLength() - nSelectionLen;
849*b1cdbd2cSJim Jagielski     if ( nLenAfter > nMaxLen )
850*b1cdbd2cSJim Jagielski 	{
851*b1cdbd2cSJim Jagielski         sal_uInt32 nErasePos = nMaxLen - static_cast<sal_uInt32>(maText.Len()) + nSelectionLen;
852*b1cdbd2cSJim Jagielski         rStr = rStr.copy( 0, nErasePos );
853*b1cdbd2cSJim Jagielski         bWasTruncated = true;
854*b1cdbd2cSJim Jagielski     }
855*b1cdbd2cSJim Jagielski     return bWasTruncated;
856*b1cdbd2cSJim Jagielski }
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
859*b1cdbd2cSJim Jagielski 
ImplInsertText(const XubString & rStr,const Selection * pNewSel,sal_Bool bIsUserInput)860*b1cdbd2cSJim Jagielski void Edit::ImplInsertText( const XubString& rStr, const Selection* pNewSel, sal_Bool bIsUserInput )
861*b1cdbd2cSJim Jagielski {
862*b1cdbd2cSJim Jagielski 	Selection aSelection( maSelection );
863*b1cdbd2cSJim Jagielski 	aSelection.Justify();
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski 	rtl::OUString aNewText( ImplGetValidString( rStr ) );
866*b1cdbd2cSJim Jagielski     ImplTruncateToMaxLen( aNewText, aSelection.Len() );
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski     ImplClearLayoutData();
869*b1cdbd2cSJim Jagielski 
870*b1cdbd2cSJim Jagielski 	if ( aSelection.Len() )
871*b1cdbd2cSJim Jagielski 		maText.Erase( (xub_StrLen)aSelection.Min(), (xub_StrLen)aSelection.Len() );
872*b1cdbd2cSJim Jagielski 	else if ( !mbInsertMode && (aSelection.Max() < maText.Len()) )
873*b1cdbd2cSJim Jagielski 		maText.Erase( (xub_StrLen)aSelection.Max(), 1 );
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski     // take care of input-sequence-checking now
876*b1cdbd2cSJim Jagielski     if (bIsUserInput && rStr.Len())
877*b1cdbd2cSJim Jagielski     {
878*b1cdbd2cSJim Jagielski         DBG_ASSERT( rStr.Len() == 1, "unexpected string length. User input is expected to providse 1 char only!" );
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski         // determine if input-sequence-checking should be applied or not
881*b1cdbd2cSJim Jagielski         //
882*b1cdbd2cSJim Jagielski         static OUString sModule( OUString::createFromAscii( "/org.openoffice.Office.Common/I18N" ) );
883*b1cdbd2cSJim Jagielski         static OUString sRelNode( OUString::createFromAscii( "CTL" ) );
884*b1cdbd2cSJim Jagielski         static OUString sCTLSequenceChecking( OUString::createFromAscii( "CTLSequenceChecking" ) );
885*b1cdbd2cSJim Jagielski         static OUString sCTLSequenceCheckingRestricted( OUString::createFromAscii( "CTLSequenceCheckingRestricted" ) );
886*b1cdbd2cSJim Jagielski         static OUString sCTLSequenceCheckingTypeAndReplace( OUString::createFromAscii( "CTLSequenceCheckingTypeAndReplace" ) );
887*b1cdbd2cSJim Jagielski         static OUString sCTLFont( OUString::createFromAscii( "CTLFont" ) );
888*b1cdbd2cSJim Jagielski         //
889*b1cdbd2cSJim Jagielski         sal_Bool bCTLSequenceChecking               = sal_False;
890*b1cdbd2cSJim Jagielski         sal_Bool bCTLSequenceCheckingRestricted     = sal_False;
891*b1cdbd2cSJim Jagielski         sal_Bool bCTLSequenceCheckingTypeAndReplace = sal_False;
892*b1cdbd2cSJim Jagielski 		sal_Bool bCTLFontEnabled					= sal_False;
893*b1cdbd2cSJim Jagielski         sal_Bool bIsInputSequenceChecking			= sal_False;
894*b1cdbd2cSJim Jagielski         //
895*b1cdbd2cSJim Jagielski         // get access to the configuration of this office module
896*b1cdbd2cSJim Jagielski 		try
897*b1cdbd2cSJim Jagielski 		{
898*b1cdbd2cSJim Jagielski 			uno::Reference< lang::XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
899*b1cdbd2cSJim Jagielski 			uno::Reference< container::XNameAccess > xModuleCfg( ::comphelper::ConfigurationHelper::openConfig(
900*b1cdbd2cSJim Jagielski 									xMSF,
901*b1cdbd2cSJim Jagielski 									sModule,
902*b1cdbd2cSJim Jagielski 									::comphelper::ConfigurationHelper::E_READONLY ),
903*b1cdbd2cSJim Jagielski 								uno::UNO_QUERY );
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski 			//!! get values from configuration.
906*b1cdbd2cSJim Jagielski 			//!! we can't use SvtCTLOptions here since vcl must not be linked
907*b1cdbd2cSJim Jagielski 			//!! against svtools. (It is already the other way around.)
908*b1cdbd2cSJim Jagielski 			Any aCTLSequenceChecking                = ::comphelper::ConfigurationHelper::readRelativeKey( xModuleCfg, sRelNode, sCTLSequenceChecking );
909*b1cdbd2cSJim Jagielski 			Any aCTLSequenceCheckingRestricted      = ::comphelper::ConfigurationHelper::readRelativeKey( xModuleCfg, sRelNode, sCTLSequenceCheckingRestricted );
910*b1cdbd2cSJim Jagielski 			Any aCTLSequenceCheckingTypeAndReplace  = ::comphelper::ConfigurationHelper::readRelativeKey( xModuleCfg, sRelNode, sCTLSequenceCheckingTypeAndReplace );
911*b1cdbd2cSJim Jagielski             Any aCTLFontEnabled                     = ::comphelper::ConfigurationHelper::readRelativeKey( xModuleCfg, sRelNode, sCTLFont );
912*b1cdbd2cSJim Jagielski 			aCTLSequenceChecking                >>= bCTLSequenceChecking;
913*b1cdbd2cSJim Jagielski 			aCTLSequenceCheckingRestricted      >>= bCTLSequenceCheckingRestricted;
914*b1cdbd2cSJim Jagielski 			aCTLSequenceCheckingTypeAndReplace  >>= bCTLSequenceCheckingTypeAndReplace;
915*b1cdbd2cSJim Jagielski             aCTLFontEnabled                     >>= bCTLFontEnabled;
916*b1cdbd2cSJim Jagielski 		}
917*b1cdbd2cSJim Jagielski 		catch(...)
918*b1cdbd2cSJim Jagielski 		{
919*b1cdbd2cSJim Jagielski 			bIsInputSequenceChecking = sal_False;	// continue with inserting the new text
920*b1cdbd2cSJim Jagielski 		}
921*b1cdbd2cSJim Jagielski         //
922*b1cdbd2cSJim Jagielski         uno::Reference < i18n::XBreakIterator > xBI( ImplGetBreakIterator(), UNO_QUERY );
923*b1cdbd2cSJim Jagielski         bIsInputSequenceChecking = rStr.Len() == 1 &&
924*b1cdbd2cSJim Jagielski                 bCTLFontEnabled &&
925*b1cdbd2cSJim Jagielski                 bCTLSequenceChecking &&
926*b1cdbd2cSJim Jagielski                 aSelection.Min() > 0 && /* first char needs not to be checked */
927*b1cdbd2cSJim Jagielski                 xBI.is() && i18n::ScriptType::COMPLEX == xBI->getScriptType( rStr, 0 );
928*b1cdbd2cSJim Jagielski 
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski 		uno::Reference < i18n::XExtendedInputSequenceChecker > xISC;
931*b1cdbd2cSJim Jagielski         if (bIsInputSequenceChecking && (xISC = ImplGetInputSequenceChecker()).is())
932*b1cdbd2cSJim Jagielski         {
933*b1cdbd2cSJim Jagielski             sal_Unicode cChar = rStr.GetChar(0);
934*b1cdbd2cSJim Jagielski             xub_StrLen nTmpPos = static_cast< xub_StrLen >( aSelection.Min() );
935*b1cdbd2cSJim Jagielski             sal_Int16 nCheckMode = bCTLSequenceCheckingRestricted ?
936*b1cdbd2cSJim Jagielski                     i18n::InputSequenceCheckMode::STRICT : i18n::InputSequenceCheckMode::BASIC;
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski             // the text that needs to be checked is only the one
939*b1cdbd2cSJim Jagielski             // before the current cursor position
940*b1cdbd2cSJim Jagielski             rtl::OUString aOldText( maText.Copy(0, nTmpPos) );
941*b1cdbd2cSJim Jagielski             rtl::OUString aTmpText( aOldText );
942*b1cdbd2cSJim Jagielski             if (bCTLSequenceCheckingTypeAndReplace)
943*b1cdbd2cSJim Jagielski             {
944*b1cdbd2cSJim Jagielski                 xISC->correctInputSequence( aTmpText, nTmpPos - 1, cChar, nCheckMode );
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski                 // find position of first character that has changed
947*b1cdbd2cSJim Jagielski                 sal_Int32 nOldLen = aOldText.getLength();
948*b1cdbd2cSJim Jagielski                 sal_Int32 nTmpLen = aTmpText.getLength();
949*b1cdbd2cSJim Jagielski                 const sal_Unicode *pOldTxt = aOldText.getStr();
950*b1cdbd2cSJim Jagielski                 const sal_Unicode *pTmpTxt = aTmpText.getStr();
951*b1cdbd2cSJim Jagielski                 sal_Int32 nChgPos = 0;
952*b1cdbd2cSJim Jagielski                 while ( nChgPos < nOldLen && nChgPos < nTmpLen &&
953*b1cdbd2cSJim Jagielski                         pOldTxt[nChgPos] == pTmpTxt[nChgPos] )
954*b1cdbd2cSJim Jagielski                     ++nChgPos;
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski                 xub_StrLen nChgLen = static_cast< xub_StrLen >( nTmpLen - nChgPos );
957*b1cdbd2cSJim Jagielski                 String aChgText( aTmpText.copy( nChgPos ).getStr(), nChgLen );
958*b1cdbd2cSJim Jagielski 
959*b1cdbd2cSJim Jagielski                 // remove text from first pos to be changed to current pos
960*b1cdbd2cSJim Jagielski                 maText.Erase( static_cast< xub_StrLen >( nChgPos ), static_cast< xub_StrLen >( nTmpPos - nChgPos ) );
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski                 if (aChgText.Len())
963*b1cdbd2cSJim Jagielski 				{
964*b1cdbd2cSJim Jagielski                     aNewText = aChgText;
965*b1cdbd2cSJim Jagielski 					aSelection.Min() = nChgPos;	// position for new text to be inserted
966*b1cdbd2cSJim Jagielski 				}
967*b1cdbd2cSJim Jagielski                 else
968*b1cdbd2cSJim Jagielski                     aNewText = String::EmptyString();
969*b1cdbd2cSJim Jagielski             }
970*b1cdbd2cSJim Jagielski             else
971*b1cdbd2cSJim Jagielski             {
972*b1cdbd2cSJim Jagielski                 // should the character be ignored (i.e. not get inserted) ?
973*b1cdbd2cSJim Jagielski                 if (!xISC->checkInputSequence( aOldText, nTmpPos - 1, cChar, nCheckMode ))
974*b1cdbd2cSJim Jagielski                     aNewText = String::EmptyString();
975*b1cdbd2cSJim Jagielski             }
976*b1cdbd2cSJim Jagielski         }
977*b1cdbd2cSJim Jagielski 
978*b1cdbd2cSJim Jagielski         // at this point now we will insert the non-empty text 'normally' some lines below...
979*b1cdbd2cSJim Jagielski     }
980*b1cdbd2cSJim Jagielski 
981*b1cdbd2cSJim Jagielski 	if ( aNewText.getLength() )
982*b1cdbd2cSJim Jagielski 		maText.Insert( String( aNewText ), (xub_StrLen)aSelection.Min() );
983*b1cdbd2cSJim Jagielski 
984*b1cdbd2cSJim Jagielski 	if ( !pNewSel )
985*b1cdbd2cSJim Jagielski 	{
986*b1cdbd2cSJim Jagielski 		maSelection.Min() = aSelection.Min() + aNewText.getLength();
987*b1cdbd2cSJim Jagielski 		maSelection.Max() = maSelection.Min();
988*b1cdbd2cSJim Jagielski 	}
989*b1cdbd2cSJim Jagielski 	else
990*b1cdbd2cSJim Jagielski 	{
991*b1cdbd2cSJim Jagielski 		maSelection = *pNewSel;
992*b1cdbd2cSJim Jagielski 		if ( maSelection.Min() > maText.Len() )
993*b1cdbd2cSJim Jagielski 			maSelection.Min() = maText.Len();
994*b1cdbd2cSJim Jagielski 		if ( maSelection.Max() > maText.Len() )
995*b1cdbd2cSJim Jagielski 			maSelection.Max() = maText.Len();
996*b1cdbd2cSJim Jagielski 	}
997*b1cdbd2cSJim Jagielski 
998*b1cdbd2cSJim Jagielski 	ImplAlignAndPaint();
999*b1cdbd2cSJim Jagielski 	mbInternModified = sal_True;
1000*b1cdbd2cSJim Jagielski }
1001*b1cdbd2cSJim Jagielski 
1002*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1003*b1cdbd2cSJim Jagielski 
ImplSetText(const XubString & rText,const Selection * pNewSelection)1004*b1cdbd2cSJim Jagielski void Edit::ImplSetText( const XubString& rText, const Selection* pNewSelection )
1005*b1cdbd2cSJim Jagielski {
1006*b1cdbd2cSJim Jagielski 	// Der Text wird dadurch geloescht das der alte Text komplett 'selektiert'
1007*b1cdbd2cSJim Jagielski 	// wird, dann InsertText, damit flackerfrei.
1008*b1cdbd2cSJim Jagielski 	if ( ( rText.Len() <= mnMaxTextLen ) && ( (rText != maText) || (pNewSelection && (*pNewSelection != maSelection)) ) )
1009*b1cdbd2cSJim Jagielski 	{
1010*b1cdbd2cSJim Jagielski         ImplClearLayoutData();
1011*b1cdbd2cSJim Jagielski 		maSelection.Min() = 0;
1012*b1cdbd2cSJim Jagielski 		maSelection.Max() = maText.Len();
1013*b1cdbd2cSJim Jagielski 		if ( mnXOffset || HasPaintEvent() )
1014*b1cdbd2cSJim Jagielski 		{
1015*b1cdbd2cSJim Jagielski 			mnXOffset = 0;
1016*b1cdbd2cSJim Jagielski 			maText = ImplGetValidString( rText );
1017*b1cdbd2cSJim Jagielski 
1018*b1cdbd2cSJim Jagielski             // #i54929# recalculate mnXOffset before ImplSetSelection,
1019*b1cdbd2cSJim Jagielski             // else cursor ends up in wrong position
1020*b1cdbd2cSJim Jagielski             ImplAlign();
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski 			if ( pNewSelection )
1023*b1cdbd2cSJim Jagielski 				ImplSetSelection( *pNewSelection, sal_False );
1024*b1cdbd2cSJim Jagielski 
1025*b1cdbd2cSJim Jagielski 			if ( mnXOffset && !pNewSelection )
1026*b1cdbd2cSJim Jagielski 				maSelection.Max() = 0;
1027*b1cdbd2cSJim Jagielski 
1028*b1cdbd2cSJim Jagielski 			Invalidate();
1029*b1cdbd2cSJim Jagielski 		}
1030*b1cdbd2cSJim Jagielski 		else
1031*b1cdbd2cSJim Jagielski 			ImplInsertText( rText, pNewSelection );
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski         ImplCallEventListeners( VCLEVENT_EDIT_MODIFY );
1034*b1cdbd2cSJim Jagielski 	}
1035*b1cdbd2cSJim Jagielski }
1036*b1cdbd2cSJim Jagielski 
1037*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1038*b1cdbd2cSJim Jagielski 
ImplGetNativeControlType()1039*b1cdbd2cSJim Jagielski int Edit::ImplGetNativeControlType()
1040*b1cdbd2cSJim Jagielski {
1041*b1cdbd2cSJim Jagielski     int nCtrl = 0;
1042*b1cdbd2cSJim Jagielski     Window *pControl = mbIsSubEdit ? GetParent() : this;
1043*b1cdbd2cSJim Jagielski 
1044*b1cdbd2cSJim Jagielski     switch( pControl->GetType() )
1045*b1cdbd2cSJim Jagielski     {
1046*b1cdbd2cSJim Jagielski         case WINDOW_COMBOBOX:
1047*b1cdbd2cSJim Jagielski         case WINDOW_PATTERNBOX:
1048*b1cdbd2cSJim Jagielski         case WINDOW_NUMERICBOX:
1049*b1cdbd2cSJim Jagielski         case WINDOW_METRICBOX:
1050*b1cdbd2cSJim Jagielski         case WINDOW_CURRENCYBOX:
1051*b1cdbd2cSJim Jagielski         case WINDOW_DATEBOX:
1052*b1cdbd2cSJim Jagielski         case WINDOW_TIMEBOX:
1053*b1cdbd2cSJim Jagielski         case WINDOW_LONGCURRENCYBOX:
1054*b1cdbd2cSJim Jagielski             nCtrl = CTRL_COMBOBOX;
1055*b1cdbd2cSJim Jagielski             break;
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski         case WINDOW_MULTILINEEDIT:
1058*b1cdbd2cSJim Jagielski             if ( GetWindow( WINDOW_BORDER ) != this )
1059*b1cdbd2cSJim Jagielski                 nCtrl = CTRL_MULTILINE_EDITBOX;
1060*b1cdbd2cSJim Jagielski             else
1061*b1cdbd2cSJim Jagielski                 nCtrl = CTRL_EDITBOX_NOBORDER;
1062*b1cdbd2cSJim Jagielski             break;
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski         case WINDOW_EDIT:
1065*b1cdbd2cSJim Jagielski         case WINDOW_PATTERNFIELD:
1066*b1cdbd2cSJim Jagielski         case WINDOW_METRICFIELD:
1067*b1cdbd2cSJim Jagielski         case WINDOW_CURRENCYFIELD:
1068*b1cdbd2cSJim Jagielski         case WINDOW_DATEFIELD:
1069*b1cdbd2cSJim Jagielski         case WINDOW_TIMEFIELD:
1070*b1cdbd2cSJim Jagielski         case WINDOW_LONGCURRENCYFIELD:
1071*b1cdbd2cSJim Jagielski         case WINDOW_NUMERICFIELD:
1072*b1cdbd2cSJim Jagielski         case WINDOW_SPINFIELD:
1073*b1cdbd2cSJim Jagielski             if( pControl->GetStyle() & WB_SPIN )
1074*b1cdbd2cSJim Jagielski                 nCtrl = CTRL_SPINBOX;
1075*b1cdbd2cSJim Jagielski             else
1076*b1cdbd2cSJim Jagielski             {
1077*b1cdbd2cSJim Jagielski                 if ( GetWindow( WINDOW_BORDER ) != this )
1078*b1cdbd2cSJim Jagielski                     nCtrl = CTRL_EDITBOX;
1079*b1cdbd2cSJim Jagielski                 else
1080*b1cdbd2cSJim Jagielski                     nCtrl = CTRL_EDITBOX_NOBORDER;
1081*b1cdbd2cSJim Jagielski             }
1082*b1cdbd2cSJim Jagielski             break;
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski         default:
1085*b1cdbd2cSJim Jagielski             nCtrl = CTRL_EDITBOX;
1086*b1cdbd2cSJim Jagielski     }
1087*b1cdbd2cSJim Jagielski     return nCtrl;
1088*b1cdbd2cSJim Jagielski }
1089*b1cdbd2cSJim Jagielski 
ImplClearBackground(long nXStart,long nXEnd)1090*b1cdbd2cSJim Jagielski void Edit::ImplClearBackground( long nXStart, long nXEnd )
1091*b1cdbd2cSJim Jagielski {
1092*b1cdbd2cSJim Jagielski     /*
1093*b1cdbd2cSJim Jagielski     * note: at this point the cursor must be switched off already
1094*b1cdbd2cSJim Jagielski     */
1095*b1cdbd2cSJim Jagielski 	Point aTmpPoint;
1096*b1cdbd2cSJim Jagielski 	Rectangle aRect( aTmpPoint, GetOutputSizePixel() );
1097*b1cdbd2cSJim Jagielski 	aRect.Left() = nXStart;
1098*b1cdbd2cSJim Jagielski 	aRect.Right() = nXEnd;
1099*b1cdbd2cSJim Jagielski 
1100*b1cdbd2cSJim Jagielski     if( ImplUseNativeBorder( GetStyle() ) || IsPaintTransparent() )
1101*b1cdbd2cSJim Jagielski     {
1102*b1cdbd2cSJim Jagielski         // draw the inner part by painting the whole control using its border window
1103*b1cdbd2cSJim Jagielski         Window *pControl = this;
1104*b1cdbd2cSJim Jagielski         Window *pBorder = GetWindow( WINDOW_BORDER );
1105*b1cdbd2cSJim Jagielski         if( pBorder == this )
1106*b1cdbd2cSJim Jagielski         {
1107*b1cdbd2cSJim Jagielski             // we have no border, use parent
1108*b1cdbd2cSJim Jagielski             pControl = mbIsSubEdit ? GetParent() : this;
1109*b1cdbd2cSJim Jagielski             pBorder = pControl->GetWindow( WINDOW_BORDER );
1110*b1cdbd2cSJim Jagielski             if( pBorder == this )
1111*b1cdbd2cSJim Jagielski                 pBorder = GetParent();
1112*b1cdbd2cSJim Jagielski         }
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski         if( pBorder )
1115*b1cdbd2cSJim Jagielski         {
1116*b1cdbd2cSJim Jagielski             // set proper clipping region to not overdraw the whole control
1117*b1cdbd2cSJim Jagielski             Region aClipRgn = GetPaintRegion();
1118*b1cdbd2cSJim Jagielski             if( !aClipRgn.IsNull() )
1119*b1cdbd2cSJim Jagielski             {
1120*b1cdbd2cSJim Jagielski                 // transform clipping region to border window's coordinate system
1121*b1cdbd2cSJim Jagielski                 if( IsRTLEnabled() != pBorder->IsRTLEnabled() && Application::GetSettings().GetLayoutRTL() )
1122*b1cdbd2cSJim Jagielski                 {
1123*b1cdbd2cSJim Jagielski                     // need to mirror in case border is not RTL but edit is (or vice versa)
1124*b1cdbd2cSJim Jagielski 
1125*b1cdbd2cSJim Jagielski                     // mirror
1126*b1cdbd2cSJim Jagielski                     Rectangle aBounds( aClipRgn.GetBoundRect() );
1127*b1cdbd2cSJim Jagielski                     int xNew = GetOutputSizePixel().Width() - aBounds.GetWidth() - aBounds.Left();
1128*b1cdbd2cSJim Jagielski                     aClipRgn.Move( xNew - aBounds.Left(), 0 );
1129*b1cdbd2cSJim Jagielski 
1130*b1cdbd2cSJim Jagielski                     // move offset of border window
1131*b1cdbd2cSJim Jagielski                     Point aBorderOffs;
1132*b1cdbd2cSJim Jagielski                     aBorderOffs = pBorder->ScreenToOutputPixel( OutputToScreenPixel( aBorderOffs ) );
1133*b1cdbd2cSJim Jagielski                     aClipRgn.Move( aBorderOffs.X(), aBorderOffs.Y() );
1134*b1cdbd2cSJim Jagielski                 }
1135*b1cdbd2cSJim Jagielski                 else
1136*b1cdbd2cSJim Jagielski                 {
1137*b1cdbd2cSJim Jagielski                     // normal case
1138*b1cdbd2cSJim Jagielski                     Point aBorderOffs;
1139*b1cdbd2cSJim Jagielski                     aBorderOffs = pBorder->ScreenToOutputPixel( OutputToScreenPixel( aBorderOffs ) );
1140*b1cdbd2cSJim Jagielski                     aClipRgn.Move( aBorderOffs.X(), aBorderOffs.Y() );
1141*b1cdbd2cSJim Jagielski                 }
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski                 Region oldRgn( pBorder->GetClipRegion() );
1144*b1cdbd2cSJim Jagielski                 pBorder->SetClipRegion( aClipRgn );
1145*b1cdbd2cSJim Jagielski 
1146*b1cdbd2cSJim Jagielski                 pBorder->Paint( Rectangle() );
1147*b1cdbd2cSJim Jagielski 
1148*b1cdbd2cSJim Jagielski                 pBorder->SetClipRegion( oldRgn );
1149*b1cdbd2cSJim Jagielski             }
1150*b1cdbd2cSJim Jagielski             else
1151*b1cdbd2cSJim Jagielski                 pBorder->Paint( Rectangle() );
1152*b1cdbd2cSJim Jagielski 
1153*b1cdbd2cSJim Jagielski         }
1154*b1cdbd2cSJim Jagielski     }
1155*b1cdbd2cSJim Jagielski     else
1156*b1cdbd2cSJim Jagielski 	    Erase( aRect );
1157*b1cdbd2cSJim Jagielski }
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1160*b1cdbd2cSJim Jagielski 
ImplShowCursor(sal_Bool bOnlyIfVisible)1161*b1cdbd2cSJim Jagielski void Edit::ImplShowCursor( sal_Bool bOnlyIfVisible )
1162*b1cdbd2cSJim Jagielski {
1163*b1cdbd2cSJim Jagielski 	if ( !IsUpdateMode() || ( bOnlyIfVisible && !IsReallyVisible() ) )
1164*b1cdbd2cSJim Jagielski 		return;
1165*b1cdbd2cSJim Jagielski 
1166*b1cdbd2cSJim Jagielski 	Cursor* 	pCursor = GetCursor();
1167*b1cdbd2cSJim Jagielski 	XubString	aText = ImplGetText();
1168*b1cdbd2cSJim Jagielski 
1169*b1cdbd2cSJim Jagielski     long nTextPos = 0;
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski     sal_Int32	nDXBuffer[256];
1172*b1cdbd2cSJim Jagielski     sal_Int32*	pDXBuffer = NULL;
1173*b1cdbd2cSJim Jagielski     sal_Int32*	pDX = nDXBuffer;
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski     if( aText.Len() )
1176*b1cdbd2cSJim Jagielski     {
1177*b1cdbd2cSJim Jagielski         if( 2*aText.Len() > xub_StrLen(sizeof(nDXBuffer)/sizeof(nDXBuffer[0])) )
1178*b1cdbd2cSJim Jagielski         {
1179*b1cdbd2cSJim Jagielski             pDXBuffer = new sal_Int32[2*(aText.Len()+1)];
1180*b1cdbd2cSJim Jagielski             pDX = pDXBuffer;
1181*b1cdbd2cSJim Jagielski         }
1182*b1cdbd2cSJim Jagielski 
1183*b1cdbd2cSJim Jagielski         GetCaretPositions( aText, pDX, 0, aText.Len() );
1184*b1cdbd2cSJim Jagielski 
1185*b1cdbd2cSJim Jagielski         if( maSelection.Max() < aText.Len() )
1186*b1cdbd2cSJim Jagielski             nTextPos = pDX[ 2*maSelection.Max() ];
1187*b1cdbd2cSJim Jagielski         else
1188*b1cdbd2cSJim Jagielski             nTextPos = pDX[ 2*aText.Len()-1 ];
1189*b1cdbd2cSJim Jagielski     }
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski 	long nCursorWidth = 0;
1192*b1cdbd2cSJim Jagielski 	if ( !mbInsertMode && !maSelection.Len() && (maSelection.Max() < aText.Len()) )
1193*b1cdbd2cSJim Jagielski 		nCursorWidth = GetTextWidth( aText, (xub_StrLen)maSelection.Max(), 1 );
1194*b1cdbd2cSJim Jagielski 	long nCursorPosX = nTextPos + mnXOffset + ImplGetExtraOffset();
1195*b1cdbd2cSJim Jagielski 
1196*b1cdbd2cSJim Jagielski 	// Cursor muss im sichtbaren Bereich landen:
1197*b1cdbd2cSJim Jagielski 	const Size aOutSize = GetOutputSizePixel();
1198*b1cdbd2cSJim Jagielski 	if ( (nCursorPosX < 0) || (nCursorPosX >= aOutSize.Width()) )
1199*b1cdbd2cSJim Jagielski 	{
1200*b1cdbd2cSJim Jagielski 		long nOldXOffset = mnXOffset;
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski 		if ( nCursorPosX < 0 )
1203*b1cdbd2cSJim Jagielski 		{
1204*b1cdbd2cSJim Jagielski 			mnXOffset = - nTextPos;
1205*b1cdbd2cSJim Jagielski 			long nMaxX = 0;
1206*b1cdbd2cSJim Jagielski 			mnXOffset += aOutSize.Width() / 5;
1207*b1cdbd2cSJim Jagielski 			if ( mnXOffset > nMaxX )
1208*b1cdbd2cSJim Jagielski 				mnXOffset = nMaxX;
1209*b1cdbd2cSJim Jagielski 		}
1210*b1cdbd2cSJim Jagielski 		else
1211*b1cdbd2cSJim Jagielski 		{
1212*b1cdbd2cSJim Jagielski 			mnXOffset = (aOutSize.Width()-ImplGetExtraOffset()) - nTextPos;
1213*b1cdbd2cSJim Jagielski 			// Etwas mehr?
1214*b1cdbd2cSJim Jagielski 			if ( (aOutSize.Width()-ImplGetExtraOffset()) < nTextPos )
1215*b1cdbd2cSJim Jagielski 			{
1216*b1cdbd2cSJim Jagielski 				long nMaxNegX = (aOutSize.Width()-ImplGetExtraOffset()) - GetTextWidth( aText );
1217*b1cdbd2cSJim Jagielski 				mnXOffset -= aOutSize.Width() / 5;
1218*b1cdbd2cSJim Jagielski 				if ( mnXOffset < nMaxNegX )  // beides negativ...
1219*b1cdbd2cSJim Jagielski 					mnXOffset = nMaxNegX;
1220*b1cdbd2cSJim Jagielski 			}
1221*b1cdbd2cSJim Jagielski 		}
1222*b1cdbd2cSJim Jagielski 
1223*b1cdbd2cSJim Jagielski 		nCursorPosX = nTextPos + mnXOffset + ImplGetExtraOffset();
1224*b1cdbd2cSJim Jagielski 		if ( nCursorPosX == aOutSize.Width() )	// dann nicht sichtbar...
1225*b1cdbd2cSJim Jagielski 			nCursorPosX--;
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski 		if ( mnXOffset != nOldXOffset )
1228*b1cdbd2cSJim Jagielski 			ImplInvalidateOrRepaint();
1229*b1cdbd2cSJim Jagielski 	}
1230*b1cdbd2cSJim Jagielski 
1231*b1cdbd2cSJim Jagielski 	const long nTextHeight = GetTextHeight();
1232*b1cdbd2cSJim Jagielski 	const long nCursorPosY = ImplGetTextYPosition();
1233*b1cdbd2cSJim Jagielski 	pCursor->SetPos( Point( nCursorPosX, nCursorPosY ) );
1234*b1cdbd2cSJim Jagielski 	pCursor->SetSize( Size( nCursorWidth, nTextHeight ) );
1235*b1cdbd2cSJim Jagielski 	pCursor->Show();
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski     if( pDXBuffer )
1238*b1cdbd2cSJim Jagielski         delete [] pDXBuffer;
1239*b1cdbd2cSJim Jagielski }
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1242*b1cdbd2cSJim Jagielski 
ImplAlign()1243*b1cdbd2cSJim Jagielski void Edit::ImplAlign()
1244*b1cdbd2cSJim Jagielski {
1245*b1cdbd2cSJim Jagielski 	long nTextWidth = GetTextWidth( ImplGetText() );
1246*b1cdbd2cSJim Jagielski 	long nOutWidth = GetOutputSizePixel().Width();
1247*b1cdbd2cSJim Jagielski 
1248*b1cdbd2cSJim Jagielski 	if ( mnAlign == EDIT_ALIGN_LEFT )
1249*b1cdbd2cSJim Jagielski     {
1250*b1cdbd2cSJim Jagielski 		if( mnXOffset && ( nTextWidth < nOutWidth ) )
1251*b1cdbd2cSJim Jagielski             mnXOffset = 0;
1252*b1cdbd2cSJim Jagielski 
1253*b1cdbd2cSJim Jagielski     }
1254*b1cdbd2cSJim Jagielski 	else if ( mnAlign == EDIT_ALIGN_RIGHT )
1255*b1cdbd2cSJim Jagielski 	{
1256*b1cdbd2cSJim Jagielski         long nMinXOffset = nOutWidth - nTextWidth - 1 - ImplGetExtraOffset();
1257*b1cdbd2cSJim Jagielski         bool bRTL = IsRTLEnabled();
1258*b1cdbd2cSJim Jagielski         if( mbIsSubEdit && GetParent() )
1259*b1cdbd2cSJim Jagielski             bRTL = GetParent()->IsRTLEnabled();
1260*b1cdbd2cSJim Jagielski         if( bRTL )
1261*b1cdbd2cSJim Jagielski         {
1262*b1cdbd2cSJim Jagielski             if( nTextWidth < nOutWidth )
1263*b1cdbd2cSJim Jagielski                 mnXOffset = nMinXOffset;
1264*b1cdbd2cSJim Jagielski         }
1265*b1cdbd2cSJim Jagielski         else
1266*b1cdbd2cSJim Jagielski         {
1267*b1cdbd2cSJim Jagielski             if( nTextWidth < nOutWidth )
1268*b1cdbd2cSJim Jagielski                 mnXOffset = nMinXOffset;
1269*b1cdbd2cSJim Jagielski             else if ( mnXOffset < nMinXOffset )
1270*b1cdbd2cSJim Jagielski                 mnXOffset = nMinXOffset;
1271*b1cdbd2cSJim Jagielski         }
1272*b1cdbd2cSJim Jagielski 	}
1273*b1cdbd2cSJim Jagielski 	else if( mnAlign == EDIT_ALIGN_CENTER )
1274*b1cdbd2cSJim Jagielski 	{
1275*b1cdbd2cSJim Jagielski 		// Mit Abfrage schoener, wenn gescrollt, dann aber nicht zentriert im gescrollten Zustand...
1276*b1cdbd2cSJim Jagielski //		if ( nTextWidth < nOutWidth )
1277*b1cdbd2cSJim Jagielski 			mnXOffset = (nOutWidth - nTextWidth) / 2;
1278*b1cdbd2cSJim Jagielski 	}
1279*b1cdbd2cSJim Jagielski }
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1283*b1cdbd2cSJim Jagielski 
ImplAlignAndPaint()1284*b1cdbd2cSJim Jagielski void Edit::ImplAlignAndPaint()
1285*b1cdbd2cSJim Jagielski {
1286*b1cdbd2cSJim Jagielski 	ImplAlign();
1287*b1cdbd2cSJim Jagielski 	ImplInvalidateOrRepaint( 0, STRING_LEN );
1288*b1cdbd2cSJim Jagielski 	ImplShowCursor();
1289*b1cdbd2cSJim Jagielski }
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1292*b1cdbd2cSJim Jagielski 
ImplGetCharPos(const Point & rWindowPos) const1293*b1cdbd2cSJim Jagielski xub_StrLen Edit::ImplGetCharPos( const Point& rWindowPos ) const
1294*b1cdbd2cSJim Jagielski {
1295*b1cdbd2cSJim Jagielski     xub_StrLen nIndex = STRING_LEN;
1296*b1cdbd2cSJim Jagielski     String aText = ImplGetText();
1297*b1cdbd2cSJim Jagielski 
1298*b1cdbd2cSJim Jagielski     sal_Int32	nDXBuffer[256];
1299*b1cdbd2cSJim Jagielski     sal_Int32*	pDXBuffer = NULL;
1300*b1cdbd2cSJim Jagielski     sal_Int32*	pDX = nDXBuffer;
1301*b1cdbd2cSJim Jagielski     if( 2*aText.Len() > xub_StrLen(sizeof(nDXBuffer)/sizeof(nDXBuffer[0])) )
1302*b1cdbd2cSJim Jagielski     {
1303*b1cdbd2cSJim Jagielski         pDXBuffer = new sal_Int32[2*(aText.Len()+1)];
1304*b1cdbd2cSJim Jagielski         pDX = pDXBuffer;
1305*b1cdbd2cSJim Jagielski     }
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski     GetCaretPositions( aText, pDX, 0, aText.Len() );
1308*b1cdbd2cSJim Jagielski     long nX = rWindowPos.X() - mnXOffset - ImplGetExtraOffset();
1309*b1cdbd2cSJim Jagielski     for( int i = 0; i < aText.Len(); i++ )
1310*b1cdbd2cSJim Jagielski     {
1311*b1cdbd2cSJim Jagielski         if( (pDX[2*i] >= nX && pDX[2*i+1] <= nX) ||
1312*b1cdbd2cSJim Jagielski             (pDX[2*i+1] >= nX && pDX[2*i] <= nX))
1313*b1cdbd2cSJim Jagielski         {
1314*b1cdbd2cSJim Jagielski             nIndex = sal::static_int_cast<xub_StrLen>(i);
1315*b1cdbd2cSJim Jagielski             if( pDX[2*i] < pDX[2*i+1] )
1316*b1cdbd2cSJim Jagielski             {
1317*b1cdbd2cSJim Jagielski                 if( nX > (pDX[2*i]+pDX[2*i+1])/2 )
1318*b1cdbd2cSJim Jagielski                     nIndex++;
1319*b1cdbd2cSJim Jagielski             }
1320*b1cdbd2cSJim Jagielski             else
1321*b1cdbd2cSJim Jagielski             {
1322*b1cdbd2cSJim Jagielski                 if( nX < (pDX[2*i]+pDX[2*i+1])/2 )
1323*b1cdbd2cSJim Jagielski                     nIndex++;
1324*b1cdbd2cSJim Jagielski             }
1325*b1cdbd2cSJim Jagielski             break;
1326*b1cdbd2cSJim Jagielski         }
1327*b1cdbd2cSJim Jagielski     }
1328*b1cdbd2cSJim Jagielski     if( nIndex == STRING_LEN )
1329*b1cdbd2cSJim Jagielski     {
1330*b1cdbd2cSJim Jagielski         nIndex = 0;
1331*b1cdbd2cSJim Jagielski         long nDiff = Abs( pDX[0]-nX );
1332*b1cdbd2cSJim Jagielski         for( int i = 1; i < aText.Len(); i++ )
1333*b1cdbd2cSJim Jagielski         {
1334*b1cdbd2cSJim Jagielski             long nNewDiff = Abs( pDX[2*i]-nX );
1335*b1cdbd2cSJim Jagielski 
1336*b1cdbd2cSJim Jagielski             if( nNewDiff < nDiff )
1337*b1cdbd2cSJim Jagielski             {
1338*b1cdbd2cSJim Jagielski                 nIndex = sal::static_int_cast<xub_StrLen>(i);
1339*b1cdbd2cSJim Jagielski                 nDiff = nNewDiff;
1340*b1cdbd2cSJim Jagielski             }
1341*b1cdbd2cSJim Jagielski         }
1342*b1cdbd2cSJim Jagielski         if( nIndex == aText.Len()-1 && Abs( pDX[2*nIndex+1] - nX ) < nDiff )
1343*b1cdbd2cSJim Jagielski             nIndex = STRING_LEN;
1344*b1cdbd2cSJim Jagielski     }
1345*b1cdbd2cSJim Jagielski 
1346*b1cdbd2cSJim Jagielski     if( pDXBuffer )
1347*b1cdbd2cSJim Jagielski         delete [] pDXBuffer;
1348*b1cdbd2cSJim Jagielski 
1349*b1cdbd2cSJim Jagielski     return nIndex;
1350*b1cdbd2cSJim Jagielski }
1351*b1cdbd2cSJim Jagielski 
1352*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1353*b1cdbd2cSJim Jagielski 
ImplSetCursorPos(xub_StrLen nChar,sal_Bool bSelect)1354*b1cdbd2cSJim Jagielski void Edit::ImplSetCursorPos( xub_StrLen nChar, sal_Bool bSelect )
1355*b1cdbd2cSJim Jagielski {
1356*b1cdbd2cSJim Jagielski 	Selection aSelection( maSelection );
1357*b1cdbd2cSJim Jagielski 	aSelection.Max() = nChar;
1358*b1cdbd2cSJim Jagielski 	if ( !bSelect )
1359*b1cdbd2cSJim Jagielski 		aSelection.Min() = aSelection.Max();
1360*b1cdbd2cSJim Jagielski 	ImplSetSelection( aSelection );
1361*b1cdbd2cSJim Jagielski }
1362*b1cdbd2cSJim Jagielski 
1363*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1364*b1cdbd2cSJim Jagielski 
ImplLoadRes(const ResId & rResId)1365*b1cdbd2cSJim Jagielski void Edit::ImplLoadRes( const ResId& rResId )
1366*b1cdbd2cSJim Jagielski {
1367*b1cdbd2cSJim Jagielski 	Control::ImplLoadRes( rResId );
1368*b1cdbd2cSJim Jagielski 
1369*b1cdbd2cSJim Jagielski 	xub_StrLen nTextLength = ReadShortRes();
1370*b1cdbd2cSJim Jagielski 	if ( nTextLength )
1371*b1cdbd2cSJim Jagielski 		SetMaxTextLen( nTextLength );
1372*b1cdbd2cSJim Jagielski }
1373*b1cdbd2cSJim Jagielski 
1374*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1375*b1cdbd2cSJim Jagielski 
ImplCopyToSelectionClipboard()1376*b1cdbd2cSJim Jagielski void Edit::ImplCopyToSelectionClipboard()
1377*b1cdbd2cSJim Jagielski {
1378*b1cdbd2cSJim Jagielski     if ( GetSelection().Len() )
1379*b1cdbd2cSJim Jagielski     {
1380*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<com::sun::star::datatransfer::clipboard::XClipboard> aSelection(GetPrimarySelection());
1381*b1cdbd2cSJim Jagielski         ImplCopy( aSelection );
1382*b1cdbd2cSJim Jagielski     }
1383*b1cdbd2cSJim Jagielski }
1384*b1cdbd2cSJim Jagielski 
ImplCopy(uno::Reference<datatransfer::clipboard::XClipboard> & rxClipboard)1385*b1cdbd2cSJim Jagielski void Edit::ImplCopy( uno::Reference< datatransfer::clipboard::XClipboard >& rxClipboard )
1386*b1cdbd2cSJim Jagielski {
1387*b1cdbd2cSJim Jagielski     ::vcl::unohelper::TextDataObject::CopyStringTo( GetSelected(), rxClipboard );
1388*b1cdbd2cSJim Jagielski }
1389*b1cdbd2cSJim Jagielski 
1390*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1391*b1cdbd2cSJim Jagielski 
ImplPaste(uno::Reference<datatransfer::clipboard::XClipboard> & rxClipboard)1392*b1cdbd2cSJim Jagielski void Edit::ImplPaste( uno::Reference< datatransfer::clipboard::XClipboard >& rxClipboard )
1393*b1cdbd2cSJim Jagielski {
1394*b1cdbd2cSJim Jagielski 	if ( rxClipboard.is() )
1395*b1cdbd2cSJim Jagielski 	{
1396*b1cdbd2cSJim Jagielski         uno::Reference< datatransfer::XTransferable > xDataObj;
1397*b1cdbd2cSJim Jagielski 
1398*b1cdbd2cSJim Jagielski 		const sal_uInt32 nRef = Application::ReleaseSolarMutex();
1399*b1cdbd2cSJim Jagielski 
1400*b1cdbd2cSJim Jagielski         try
1401*b1cdbd2cSJim Jagielski 		{
1402*b1cdbd2cSJim Jagielski             xDataObj = rxClipboard->getContents();
1403*b1cdbd2cSJim Jagielski 		}
1404*b1cdbd2cSJim Jagielski 		catch( const ::com::sun::star::uno::Exception& )
1405*b1cdbd2cSJim Jagielski 		{
1406*b1cdbd2cSJim Jagielski 		}
1407*b1cdbd2cSJim Jagielski 
1408*b1cdbd2cSJim Jagielski         Application::AcquireSolarMutex( nRef );
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski         if ( xDataObj.is() )
1411*b1cdbd2cSJim Jagielski 		{
1412*b1cdbd2cSJim Jagielski 			datatransfer::DataFlavor aFlavor;
1413*b1cdbd2cSJim Jagielski 			SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
1414*b1cdbd2cSJim Jagielski             try
1415*b1cdbd2cSJim Jagielski             {
1416*b1cdbd2cSJim Jagielski 				uno::Any aData = xDataObj->getTransferData( aFlavor );
1417*b1cdbd2cSJim Jagielski 				::rtl::OUString aText;
1418*b1cdbd2cSJim Jagielski 				aData >>= aText;
1419*b1cdbd2cSJim Jagielski                 if( ImplTruncateToMaxLen( aText, maSelection.Len() ) )
1420*b1cdbd2cSJim Jagielski                     ShowTruncationWarning( const_cast<Edit*>(this) );
1421*b1cdbd2cSJim Jagielski 				ReplaceSelected( aText );
1422*b1cdbd2cSJim Jagielski 			}
1423*b1cdbd2cSJim Jagielski             catch( const ::com::sun::star::uno::Exception& )
1424*b1cdbd2cSJim Jagielski             {
1425*b1cdbd2cSJim Jagielski             }
1426*b1cdbd2cSJim Jagielski 		}
1427*b1cdbd2cSJim Jagielski 	}
1428*b1cdbd2cSJim Jagielski }
1429*b1cdbd2cSJim Jagielski 
1430*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1431*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rMEvt)1432*b1cdbd2cSJim Jagielski void Edit::MouseButtonDown( const MouseEvent& rMEvt )
1433*b1cdbd2cSJim Jagielski {
1434*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
1435*b1cdbd2cSJim Jagielski 	{
1436*b1cdbd2cSJim Jagielski 		Control::MouseButtonDown( rMEvt );
1437*b1cdbd2cSJim Jagielski 		return;
1438*b1cdbd2cSJim Jagielski 	}
1439*b1cdbd2cSJim Jagielski 
1440*b1cdbd2cSJim Jagielski 	xub_StrLen nChar = ImplGetCharPos( rMEvt.GetPosPixel() );
1441*b1cdbd2cSJim Jagielski 	Selection aSelection( maSelection );
1442*b1cdbd2cSJim Jagielski 	aSelection.Justify();
1443*b1cdbd2cSJim Jagielski 
1444*b1cdbd2cSJim Jagielski 	if ( rMEvt.GetClicks() < 4 )
1445*b1cdbd2cSJim Jagielski 	{
1446*b1cdbd2cSJim Jagielski 		mbClickedInSelection = sal_False;
1447*b1cdbd2cSJim Jagielski 		if ( rMEvt.GetClicks() == 3 )
1448*b1cdbd2cSJim Jagielski         {
1449*b1cdbd2cSJim Jagielski 			ImplSetSelection( Selection( 0, 0xFFFF ) );
1450*b1cdbd2cSJim Jagielski             ImplCopyToSelectionClipboard();
1451*b1cdbd2cSJim Jagielski 
1452*b1cdbd2cSJim Jagielski         }
1453*b1cdbd2cSJim Jagielski 		else if ( rMEvt.GetClicks() == 2 )
1454*b1cdbd2cSJim Jagielski 		{
1455*b1cdbd2cSJim Jagielski 			uno::Reference < i18n::XBreakIterator > xBI = ImplGetBreakIterator();
1456*b1cdbd2cSJim Jagielski  			i18n::Boundary aBoundary = xBI->getWordBoundary( maText, aSelection.Max(), GetSettings().GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True );
1457*b1cdbd2cSJim Jagielski 			ImplSetSelection( Selection( aBoundary.startPos, aBoundary.endPos ) );
1458*b1cdbd2cSJim Jagielski             ImplCopyToSelectionClipboard();
1459*b1cdbd2cSJim Jagielski 		}
1460*b1cdbd2cSJim Jagielski 		else if ( !rMEvt.IsShift() && HasFocus() && aSelection.IsInside( nChar ) )
1461*b1cdbd2cSJim Jagielski 			mbClickedInSelection = sal_True;
1462*b1cdbd2cSJim Jagielski 		else if ( rMEvt.IsLeft() )
1463*b1cdbd2cSJim Jagielski 			ImplSetCursorPos( nChar, rMEvt.IsShift() );
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski 		if ( !mbClickedInSelection && rMEvt.IsLeft() && ( rMEvt.GetClicks() == 1 ) )
1466*b1cdbd2cSJim Jagielski 			StartTracking( STARTTRACK_SCROLLREPEAT );
1467*b1cdbd2cSJim Jagielski 	}
1468*b1cdbd2cSJim Jagielski 
1469*b1cdbd2cSJim Jagielski 	mbInMBDown = sal_True;	// Dann im GetFocus nicht alles selektieren
1470*b1cdbd2cSJim Jagielski 	GrabFocus();
1471*b1cdbd2cSJim Jagielski 	mbInMBDown = sal_False;
1472*b1cdbd2cSJim Jagielski }
1473*b1cdbd2cSJim Jagielski 
1474*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1475*b1cdbd2cSJim Jagielski 
MouseButtonUp(const MouseEvent & rMEvt)1476*b1cdbd2cSJim Jagielski void Edit::MouseButtonUp( const MouseEvent& rMEvt )
1477*b1cdbd2cSJim Jagielski {
1478*b1cdbd2cSJim Jagielski 	if ( mbClickedInSelection && rMEvt.IsLeft() )
1479*b1cdbd2cSJim Jagielski 	{
1480*b1cdbd2cSJim Jagielski 		xub_StrLen nChar = ImplGetCharPos( rMEvt.GetPosPixel() );
1481*b1cdbd2cSJim Jagielski 		ImplSetCursorPos( nChar, sal_False );
1482*b1cdbd2cSJim Jagielski 		mbClickedInSelection = sal_False;
1483*b1cdbd2cSJim Jagielski 	}
1484*b1cdbd2cSJim Jagielski     else if ( rMEvt.IsMiddle() && !mbReadOnly &&
1485*b1cdbd2cSJim Jagielski               ( GetSettings().GetMouseSettings().GetMiddleButtonAction() == MOUSE_MIDDLE_PASTESELECTION ) )
1486*b1cdbd2cSJim Jagielski     {
1487*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<com::sun::star::datatransfer::clipboard::XClipboard> aSelection(Window::GetPrimarySelection());
1488*b1cdbd2cSJim Jagielski         ImplPaste( aSelection );
1489*b1cdbd2cSJim Jagielski         ImplModified();
1490*b1cdbd2cSJim Jagielski     }
1491*b1cdbd2cSJim Jagielski }
1492*b1cdbd2cSJim Jagielski 
1493*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1494*b1cdbd2cSJim Jagielski 
Tracking(const TrackingEvent & rTEvt)1495*b1cdbd2cSJim Jagielski void Edit::Tracking( const TrackingEvent& rTEvt )
1496*b1cdbd2cSJim Jagielski {
1497*b1cdbd2cSJim Jagielski 	if ( rTEvt.IsTrackingEnded() )
1498*b1cdbd2cSJim Jagielski 	{
1499*b1cdbd2cSJim Jagielski 		if ( mbClickedInSelection )
1500*b1cdbd2cSJim Jagielski 		{
1501*b1cdbd2cSJim Jagielski 			xub_StrLen nChar = ImplGetCharPos( rTEvt.GetMouseEvent().GetPosPixel() );
1502*b1cdbd2cSJim Jagielski 			ImplSetCursorPos( nChar, sal_False );
1503*b1cdbd2cSJim Jagielski 			mbClickedInSelection = sal_False;
1504*b1cdbd2cSJim Jagielski 		}
1505*b1cdbd2cSJim Jagielski         else if ( rTEvt.GetMouseEvent().IsLeft() )
1506*b1cdbd2cSJim Jagielski         {
1507*b1cdbd2cSJim Jagielski             ImplCopyToSelectionClipboard();
1508*b1cdbd2cSJim Jagielski         }
1509*b1cdbd2cSJim Jagielski 	}
1510*b1cdbd2cSJim Jagielski 	else
1511*b1cdbd2cSJim Jagielski 	{
1512*b1cdbd2cSJim Jagielski 		if( !mbClickedInSelection )
1513*b1cdbd2cSJim Jagielski 		{
1514*b1cdbd2cSJim Jagielski 			xub_StrLen nChar = ImplGetCharPos( rTEvt.GetMouseEvent().GetPosPixel() );
1515*b1cdbd2cSJim Jagielski 			ImplSetCursorPos( nChar, sal_True );
1516*b1cdbd2cSJim Jagielski 		}
1517*b1cdbd2cSJim Jagielski 	}
1518*b1cdbd2cSJim Jagielski 
1519*b1cdbd2cSJim Jagielski     if ( mpUpdateDataTimer && !mbIsSubEdit && mpUpdateDataTimer->IsActive() )
1520*b1cdbd2cSJim Jagielski         mpUpdateDataTimer->Start();//do not update while the user is still travelling in the control
1521*b1cdbd2cSJim Jagielski }
1522*b1cdbd2cSJim Jagielski 
1523*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1524*b1cdbd2cSJim Jagielski 
ImplHandleKeyEvent(const KeyEvent & rKEvt)1525*b1cdbd2cSJim Jagielski sal_Bool Edit::ImplHandleKeyEvent( const KeyEvent& rKEvt )
1526*b1cdbd2cSJim Jagielski {
1527*b1cdbd2cSJim Jagielski 	sal_Bool		bDone = sal_False;
1528*b1cdbd2cSJim Jagielski 	sal_uInt16		nCode = rKEvt.GetKeyCode().GetCode();
1529*b1cdbd2cSJim Jagielski 	KeyFuncType eFunc = rKEvt.GetKeyCode().GetFunction();
1530*b1cdbd2cSJim Jagielski 
1531*b1cdbd2cSJim Jagielski 	mbInternModified = sal_False;
1532*b1cdbd2cSJim Jagielski 
1533*b1cdbd2cSJim Jagielski 	if ( eFunc != KEYFUNC_DONTKNOW )
1534*b1cdbd2cSJim Jagielski 	{
1535*b1cdbd2cSJim Jagielski 		switch ( eFunc )
1536*b1cdbd2cSJim Jagielski 		{
1537*b1cdbd2cSJim Jagielski 			case KEYFUNC_CUT:
1538*b1cdbd2cSJim Jagielski 			{
1539*b1cdbd2cSJim Jagielski 				if ( !mbReadOnly && maSelection.Len() && !(GetStyle() & WB_PASSWORD) )
1540*b1cdbd2cSJim Jagielski 				{
1541*b1cdbd2cSJim Jagielski 					Cut();
1542*b1cdbd2cSJim Jagielski 					ImplModified();
1543*b1cdbd2cSJim Jagielski 					bDone = sal_True;
1544*b1cdbd2cSJim Jagielski 				}
1545*b1cdbd2cSJim Jagielski 			}
1546*b1cdbd2cSJim Jagielski 			break;
1547*b1cdbd2cSJim Jagielski 
1548*b1cdbd2cSJim Jagielski 			case KEYFUNC_COPY:
1549*b1cdbd2cSJim Jagielski 			{
1550*b1cdbd2cSJim Jagielski 				if ( !(GetStyle() & WB_PASSWORD) )
1551*b1cdbd2cSJim Jagielski 				{
1552*b1cdbd2cSJim Jagielski 					Copy();
1553*b1cdbd2cSJim Jagielski 					bDone = sal_True;
1554*b1cdbd2cSJim Jagielski 				}
1555*b1cdbd2cSJim Jagielski 			}
1556*b1cdbd2cSJim Jagielski 			break;
1557*b1cdbd2cSJim Jagielski 
1558*b1cdbd2cSJim Jagielski 			case KEYFUNC_PASTE:
1559*b1cdbd2cSJim Jagielski 			{
1560*b1cdbd2cSJim Jagielski 				if ( !mbReadOnly )
1561*b1cdbd2cSJim Jagielski 				{
1562*b1cdbd2cSJim Jagielski 					Paste();
1563*b1cdbd2cSJim Jagielski 					bDone = sal_True;
1564*b1cdbd2cSJim Jagielski 				}
1565*b1cdbd2cSJim Jagielski 			}
1566*b1cdbd2cSJim Jagielski 			break;
1567*b1cdbd2cSJim Jagielski 
1568*b1cdbd2cSJim Jagielski 			case KEYFUNC_UNDO:
1569*b1cdbd2cSJim Jagielski 			{
1570*b1cdbd2cSJim Jagielski 				if ( !mbReadOnly )
1571*b1cdbd2cSJim Jagielski 				{
1572*b1cdbd2cSJim Jagielski 					Undo();
1573*b1cdbd2cSJim Jagielski 					bDone = sal_True;
1574*b1cdbd2cSJim Jagielski 				}
1575*b1cdbd2cSJim Jagielski 			}
1576*b1cdbd2cSJim Jagielski 			break;
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski 			default: // wird dann evtl. unten bearbeitet.
1579*b1cdbd2cSJim Jagielski 				eFunc = KEYFUNC_DONTKNOW;
1580*b1cdbd2cSJim Jagielski 		}
1581*b1cdbd2cSJim Jagielski 	}
1582*b1cdbd2cSJim Jagielski 
1583*b1cdbd2cSJim Jagielski 	if ( !bDone && rKEvt.GetKeyCode().IsMod1() && !rKEvt.GetKeyCode().IsMod2() )
1584*b1cdbd2cSJim Jagielski 	{
1585*b1cdbd2cSJim Jagielski 		if ( nCode == KEY_A )
1586*b1cdbd2cSJim Jagielski 		{
1587*b1cdbd2cSJim Jagielski 			ImplSetSelection( Selection( 0, maText.Len() ) );
1588*b1cdbd2cSJim Jagielski 			bDone = sal_True;
1589*b1cdbd2cSJim Jagielski 		}
1590*b1cdbd2cSJim Jagielski 		else if ( rKEvt.GetKeyCode().IsShift() && (nCode == KEY_S) )
1591*b1cdbd2cSJim Jagielski 		{
1592*b1cdbd2cSJim Jagielski 			if ( pImplFncGetSpecialChars )
1593*b1cdbd2cSJim Jagielski 			{
1594*b1cdbd2cSJim Jagielski 				Selection aSaveSel = GetSelection();	// Falls jemand in Get/LoseFocus die Selektion verbiegt, z.B. URL-Zeile...
1595*b1cdbd2cSJim Jagielski 				XubString aChars = pImplFncGetSpecialChars( this, GetFont() );
1596*b1cdbd2cSJim Jagielski 				SetSelection( aSaveSel );
1597*b1cdbd2cSJim Jagielski 				if ( aChars.Len() )
1598*b1cdbd2cSJim Jagielski 				{
1599*b1cdbd2cSJim Jagielski 					ImplInsertText( aChars );
1600*b1cdbd2cSJim Jagielski 					ImplModified();
1601*b1cdbd2cSJim Jagielski 				}
1602*b1cdbd2cSJim Jagielski 				bDone = sal_True;
1603*b1cdbd2cSJim Jagielski 			}
1604*b1cdbd2cSJim Jagielski 		}
1605*b1cdbd2cSJim Jagielski 	}
1606*b1cdbd2cSJim Jagielski 
1607*b1cdbd2cSJim Jagielski 	if ( eFunc == KEYFUNC_DONTKNOW && ! bDone )
1608*b1cdbd2cSJim Jagielski 	{
1609*b1cdbd2cSJim Jagielski 		switch ( nCode )
1610*b1cdbd2cSJim Jagielski 		{
1611*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_ALL:
1612*b1cdbd2cSJim Jagielski             {
1613*b1cdbd2cSJim Jagielski                 ImplSetSelection( Selection( 0, maText.Len() ) );
1614*b1cdbd2cSJim Jagielski                 bDone = sal_True;
1615*b1cdbd2cSJim Jagielski             }
1616*b1cdbd2cSJim Jagielski             break;
1617*b1cdbd2cSJim Jagielski 
1618*b1cdbd2cSJim Jagielski 			case KEY_LEFT:
1619*b1cdbd2cSJim Jagielski 			case KEY_RIGHT:
1620*b1cdbd2cSJim Jagielski 			case KEY_HOME:
1621*b1cdbd2cSJim Jagielski 			case KEY_END:
1622*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::MOVE_WORD_FORWARD:
1623*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_WORD_FORWARD:
1624*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::MOVE_WORD_BACKWARD:
1625*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_WORD_BACKWARD:
1626*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE:
1627*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::MOVE_TO_END_OF_LINE:
1628*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE:
1629*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE:
1630*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
1631*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
1632*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
1633*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
1634*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
1635*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT:
1636*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
1637*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT:
1638*b1cdbd2cSJim Jagielski 			{
1639*b1cdbd2cSJim Jagielski 				if ( !rKEvt.GetKeyCode().IsMod2() )
1640*b1cdbd2cSJim Jagielski 				{
1641*b1cdbd2cSJim Jagielski                     ImplClearLayoutData();
1642*b1cdbd2cSJim Jagielski 					uno::Reference < i18n::XBreakIterator > xBI = ImplGetBreakIterator();
1643*b1cdbd2cSJim Jagielski 
1644*b1cdbd2cSJim Jagielski 					Selection aSel( maSelection );
1645*b1cdbd2cSJim Jagielski 					bool bWord = rKEvt.GetKeyCode().IsMod1();
1646*b1cdbd2cSJim Jagielski                     bool bSelect = rKEvt.GetKeyCode().IsShift();
1647*b1cdbd2cSJim Jagielski                     bool bGoLeft = (nCode == KEY_LEFT);
1648*b1cdbd2cSJim Jagielski                     bool bGoRight = (nCode == KEY_RIGHT);
1649*b1cdbd2cSJim Jagielski                     bool bGoHome = (nCode == KEY_HOME);
1650*b1cdbd2cSJim Jagielski                     bool bGoEnd = (nCode == KEY_END);
1651*b1cdbd2cSJim Jagielski 
1652*b1cdbd2cSJim Jagielski                     switch( nCode )
1653*b1cdbd2cSJim Jagielski                     {
1654*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::MOVE_WORD_FORWARD:
1655*b1cdbd2cSJim Jagielski                         bGoRight = bWord = true;break;
1656*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::SELECT_WORD_FORWARD:
1657*b1cdbd2cSJim Jagielski                         bGoRight = bSelect = bWord = true;break;
1658*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::MOVE_WORD_BACKWARD:
1659*b1cdbd2cSJim Jagielski                         bGoLeft = bWord = true;break;
1660*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::SELECT_WORD_BACKWARD:
1661*b1cdbd2cSJim Jagielski                         bGoLeft = bSelect = bWord = true;break;
1662*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE:
1663*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
1664*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
1665*b1cdbd2cSJim Jagielski                         bSelect = true;
1666*b1cdbd2cSJim Jagielski                         // fallthrough intended
1667*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE:
1668*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
1669*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
1670*b1cdbd2cSJim Jagielski                         bGoHome = true;break;
1671*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::SELECT_TO_END_OF_LINE:
1672*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
1673*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT:
1674*b1cdbd2cSJim Jagielski                         bSelect = true;
1675*b1cdbd2cSJim Jagielski                         // fallthrough intended
1676*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::MOVE_TO_END_OF_LINE:
1677*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
1678*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT:
1679*b1cdbd2cSJim Jagielski                         bGoEnd = true;break;
1680*b1cdbd2cSJim Jagielski                     default:
1681*b1cdbd2cSJim Jagielski                         break;
1682*b1cdbd2cSJim Jagielski                     };
1683*b1cdbd2cSJim Jagielski 
1684*b1cdbd2cSJim Jagielski 					// Range wird in ImplSetSelection geprueft...
1685*b1cdbd2cSJim Jagielski 					if ( bGoLeft && aSel.Max() )
1686*b1cdbd2cSJim Jagielski 					{
1687*b1cdbd2cSJim Jagielski 						if ( bWord )
1688*b1cdbd2cSJim Jagielski 						{
1689*b1cdbd2cSJim Jagielski 							i18n::Boundary aBoundary = xBI->getWordBoundary( maText, aSel.Max(), GetSettings().GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES, sal_True );
1690*b1cdbd2cSJim Jagielski 							if ( aBoundary.startPos == aSel.Max() )
1691*b1cdbd2cSJim Jagielski 								aBoundary = xBI->previousWord( maText, aSel.Max(), GetSettings().GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES );
1692*b1cdbd2cSJim Jagielski 							aSel.Max() = aBoundary.startPos;
1693*b1cdbd2cSJim Jagielski 						}
1694*b1cdbd2cSJim Jagielski 						else
1695*b1cdbd2cSJim Jagielski 						{
1696*b1cdbd2cSJim Jagielski 							sal_Int32 nCount = 1;
1697*b1cdbd2cSJim Jagielski 							aSel.Max() = xBI->previousCharacters( maText, aSel.Max(), GetSettings().GetLocale(), i18n::CharacterIteratorMode::SKIPCHARACTER, nCount, nCount );
1698*b1cdbd2cSJim Jagielski 						}
1699*b1cdbd2cSJim Jagielski 					}
1700*b1cdbd2cSJim Jagielski 					else if ( bGoRight && ( aSel.Max() < maText.Len() ) )
1701*b1cdbd2cSJim Jagielski 					{
1702*b1cdbd2cSJim Jagielski 						if ( bWord )
1703*b1cdbd2cSJim Jagielski 					   	{
1704*b1cdbd2cSJim Jagielski 							i18n::Boundary aBoundary = xBI->nextWord( maText, aSel.Max(), GetSettings().GetLocale(), i18n::WordType::ANYWORD_IGNOREWHITESPACES );
1705*b1cdbd2cSJim Jagielski 							aSel.Max() = aBoundary.startPos;
1706*b1cdbd2cSJim Jagielski 						}
1707*b1cdbd2cSJim Jagielski 						else
1708*b1cdbd2cSJim Jagielski 						{
1709*b1cdbd2cSJim Jagielski 							sal_Int32 nCount = 1;
1710*b1cdbd2cSJim Jagielski 							aSel.Max() = xBI->nextCharacters( maText, aSel.Max(), GetSettings().GetLocale(), i18n::CharacterIteratorMode::SKIPCHARACTER, nCount, nCount );
1711*b1cdbd2cSJim Jagielski 						}
1712*b1cdbd2cSJim Jagielski 					}
1713*b1cdbd2cSJim Jagielski 					else if ( bGoHome )
1714*b1cdbd2cSJim Jagielski                     {
1715*b1cdbd2cSJim Jagielski 						aSel.Max() = 0;
1716*b1cdbd2cSJim Jagielski                     }
1717*b1cdbd2cSJim Jagielski 					else if ( bGoEnd )
1718*b1cdbd2cSJim Jagielski                     {
1719*b1cdbd2cSJim Jagielski 						aSel.Max() = 0xFFFF;
1720*b1cdbd2cSJim Jagielski                     }
1721*b1cdbd2cSJim Jagielski 
1722*b1cdbd2cSJim Jagielski 					if ( !bSelect )
1723*b1cdbd2cSJim Jagielski 						aSel.Min() = aSel.Max();
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski                     if ( aSel != GetSelection() )
1726*b1cdbd2cSJim Jagielski                     {
1727*b1cdbd2cSJim Jagielski 					    ImplSetSelection( aSel );
1728*b1cdbd2cSJim Jagielski                         ImplCopyToSelectionClipboard();
1729*b1cdbd2cSJim Jagielski                     }
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski 					if ( bGoEnd && maAutocompleteHdl.IsSet() && !rKEvt.GetKeyCode().GetModifier() )
1732*b1cdbd2cSJim Jagielski 					{
1733*b1cdbd2cSJim Jagielski 						if ( (maSelection.Min() == maSelection.Max()) && (maSelection.Min() == maText.Len()) )
1734*b1cdbd2cSJim Jagielski 						{
1735*b1cdbd2cSJim Jagielski 							meAutocompleteAction = AUTOCOMPLETE_KEYINPUT;
1736*b1cdbd2cSJim Jagielski 							maAutocompleteHdl.Call( this );
1737*b1cdbd2cSJim Jagielski 						}
1738*b1cdbd2cSJim Jagielski 					}
1739*b1cdbd2cSJim Jagielski 
1740*b1cdbd2cSJim Jagielski 					bDone = sal_True;
1741*b1cdbd2cSJim Jagielski 				}
1742*b1cdbd2cSJim Jagielski 			}
1743*b1cdbd2cSJim Jagielski 			break;
1744*b1cdbd2cSJim Jagielski 
1745*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::DELETE_WORD_BACKWARD:
1746*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::DELETE_WORD_FORWARD:
1747*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_LINE:
1748*b1cdbd2cSJim Jagielski             case com::sun::star::awt::Key::DELETE_TO_END_OF_LINE:
1749*b1cdbd2cSJim Jagielski 			case KEY_BACKSPACE:
1750*b1cdbd2cSJim Jagielski 			case KEY_DELETE:
1751*b1cdbd2cSJim Jagielski 			{
1752*b1cdbd2cSJim Jagielski 				if ( !mbReadOnly && !rKEvt.GetKeyCode().IsMod2() )
1753*b1cdbd2cSJim Jagielski 				{
1754*b1cdbd2cSJim Jagielski 					sal_uInt8 nDel = (nCode == KEY_DELETE) ? EDIT_DEL_RIGHT : EDIT_DEL_LEFT;
1755*b1cdbd2cSJim Jagielski 					sal_uInt8 nMode = rKEvt.GetKeyCode().IsMod1() ? EDIT_DELMODE_RESTOFWORD : EDIT_DELMODE_SIMPLE;
1756*b1cdbd2cSJim Jagielski 					if ( (nMode == EDIT_DELMODE_RESTOFWORD) && rKEvt.GetKeyCode().IsShift() )
1757*b1cdbd2cSJim Jagielski 						nMode = EDIT_DELMODE_RESTOFCONTENT;
1758*b1cdbd2cSJim Jagielski                     switch( nCode )
1759*b1cdbd2cSJim Jagielski                     {
1760*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::DELETE_WORD_BACKWARD:
1761*b1cdbd2cSJim Jagielski                         nDel = EDIT_DEL_LEFT;
1762*b1cdbd2cSJim Jagielski                         nMode = EDIT_DELMODE_RESTOFWORD;
1763*b1cdbd2cSJim Jagielski                         break;
1764*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::DELETE_WORD_FORWARD:
1765*b1cdbd2cSJim Jagielski                         nDel = EDIT_DEL_RIGHT;
1766*b1cdbd2cSJim Jagielski                         nMode = EDIT_DELMODE_RESTOFWORD;
1767*b1cdbd2cSJim Jagielski                         break;
1768*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::DELETE_TO_BEGIN_OF_LINE:
1769*b1cdbd2cSJim Jagielski                         nDel = EDIT_DEL_LEFT;
1770*b1cdbd2cSJim Jagielski                         nMode = EDIT_DELMODE_RESTOFCONTENT;
1771*b1cdbd2cSJim Jagielski                         break;
1772*b1cdbd2cSJim Jagielski                     case com::sun::star::awt::Key::DELETE_TO_END_OF_LINE:
1773*b1cdbd2cSJim Jagielski                         nDel = EDIT_DEL_RIGHT;
1774*b1cdbd2cSJim Jagielski                         nMode = EDIT_DELMODE_RESTOFCONTENT;
1775*b1cdbd2cSJim Jagielski                         break;
1776*b1cdbd2cSJim Jagielski                     default: break;
1777*b1cdbd2cSJim Jagielski                     }
1778*b1cdbd2cSJim Jagielski 					xub_StrLen nOldLen = maText.Len();
1779*b1cdbd2cSJim Jagielski 					ImplDelete( maSelection, nDel, nMode );
1780*b1cdbd2cSJim Jagielski 					if ( maText.Len() != nOldLen )
1781*b1cdbd2cSJim Jagielski 						ImplModified();
1782*b1cdbd2cSJim Jagielski 					bDone = sal_True;
1783*b1cdbd2cSJim Jagielski 				}
1784*b1cdbd2cSJim Jagielski 			}
1785*b1cdbd2cSJim Jagielski 			break;
1786*b1cdbd2cSJim Jagielski 
1787*b1cdbd2cSJim Jagielski 			case KEY_INSERT:
1788*b1cdbd2cSJim Jagielski 			{
1789*b1cdbd2cSJim Jagielski 				if ( !mpIMEInfos && !mbReadOnly && !rKEvt.GetKeyCode().IsMod2() )
1790*b1cdbd2cSJim Jagielski 				{
1791*b1cdbd2cSJim Jagielski 					SetInsertMode( !mbInsertMode );
1792*b1cdbd2cSJim Jagielski 					bDone = sal_True;
1793*b1cdbd2cSJim Jagielski 				}
1794*b1cdbd2cSJim Jagielski 			}
1795*b1cdbd2cSJim Jagielski 			break;
1796*b1cdbd2cSJim Jagielski 
1797*b1cdbd2cSJim Jagielski 			/* #i101255# disable autocomplete tab forward/backward
1798*b1cdbd2cSJim Jagielski 			   users expect tab/shif-tab to move the focus to other controls
1799*b1cdbd2cSJim Jagielski 			   not suddenly to cycle the autocompletion
1800*b1cdbd2cSJim Jagielski 			case KEY_TAB:
1801*b1cdbd2cSJim Jagielski 			{
1802*b1cdbd2cSJim Jagielski 				if ( !mbReadOnly && maAutocompleteHdl.IsSet() &&
1803*b1cdbd2cSJim Jagielski 					 maSelection.Min() && (maSelection.Min() == maText.Len()) &&
1804*b1cdbd2cSJim Jagielski 					 !rKEvt.GetKeyCode().IsMod1() && !rKEvt.GetKeyCode().IsMod2() )
1805*b1cdbd2cSJim Jagielski 				{
1806*b1cdbd2cSJim Jagielski 					// Kein Autocomplete wenn alles Selektiert oder Edit leer, weil dann
1807*b1cdbd2cSJim Jagielski 					// keine vernuenftige Tab-Steuerung!
1808*b1cdbd2cSJim Jagielski 					if ( rKEvt.GetKeyCode().IsShift() )
1809*b1cdbd2cSJim Jagielski 						meAutocompleteAction = AUTOCOMPLETE_TABBACKWARD;
1810*b1cdbd2cSJim Jagielski 					else
1811*b1cdbd2cSJim Jagielski 						meAutocompleteAction = AUTOCOMPLETE_TABFORWARD;
1812*b1cdbd2cSJim Jagielski 
1813*b1cdbd2cSJim Jagielski 					maAutocompleteHdl.Call( this );
1814*b1cdbd2cSJim Jagielski 
1815*b1cdbd2cSJim Jagielski 					// Wurde nichts veraendert, dann TAB fuer DialogControl
1816*b1cdbd2cSJim Jagielski 					if ( GetSelection().Len() )
1817*b1cdbd2cSJim Jagielski 						bDone = sal_True;
1818*b1cdbd2cSJim Jagielski 				}
1819*b1cdbd2cSJim Jagielski 			}
1820*b1cdbd2cSJim Jagielski 			break;
1821*b1cdbd2cSJim Jagielski 			*/
1822*b1cdbd2cSJim Jagielski 
1823*b1cdbd2cSJim Jagielski 			default:
1824*b1cdbd2cSJim Jagielski 			{
1825*b1cdbd2cSJim Jagielski 				if ( IsCharInput( rKEvt ) )
1826*b1cdbd2cSJim Jagielski 				{
1827*b1cdbd2cSJim Jagielski 					bDone = sal_True;	// Auch bei ReadOnly die Zeichen schlucken.
1828*b1cdbd2cSJim Jagielski 					if ( !mbReadOnly )
1829*b1cdbd2cSJim Jagielski 					{
1830*b1cdbd2cSJim Jagielski                         ImplInsertText( rKEvt.GetCharCode(), 0, sal_True );
1831*b1cdbd2cSJim Jagielski 						if ( maAutocompleteHdl.IsSet() )
1832*b1cdbd2cSJim Jagielski 						{
1833*b1cdbd2cSJim Jagielski 							if ( (maSelection.Min() == maSelection.Max()) && (maSelection.Min() == maText.Len()) )
1834*b1cdbd2cSJim Jagielski 							{
1835*b1cdbd2cSJim Jagielski 								meAutocompleteAction = AUTOCOMPLETE_KEYINPUT;
1836*b1cdbd2cSJim Jagielski 								maAutocompleteHdl.Call( this );
1837*b1cdbd2cSJim Jagielski 							}
1838*b1cdbd2cSJim Jagielski 						}
1839*b1cdbd2cSJim Jagielski 					}
1840*b1cdbd2cSJim Jagielski 				}
1841*b1cdbd2cSJim Jagielski 			}
1842*b1cdbd2cSJim Jagielski 		}
1843*b1cdbd2cSJim Jagielski 	}
1844*b1cdbd2cSJim Jagielski 
1845*b1cdbd2cSJim Jagielski 	if ( mbInternModified )
1846*b1cdbd2cSJim Jagielski 		ImplModified();
1847*b1cdbd2cSJim Jagielski 
1848*b1cdbd2cSJim Jagielski 	return bDone;
1849*b1cdbd2cSJim Jagielski }
1850*b1cdbd2cSJim Jagielski 
1851*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1852*b1cdbd2cSJim Jagielski 
KeyInput(const KeyEvent & rKEvt)1853*b1cdbd2cSJim Jagielski void Edit::KeyInput( const KeyEvent& rKEvt )
1854*b1cdbd2cSJim Jagielski {
1855*b1cdbd2cSJim Jagielski     if ( mpUpdateDataTimer && !mbIsSubEdit && mpUpdateDataTimer->IsActive() )
1856*b1cdbd2cSJim Jagielski         mpUpdateDataTimer->Start();//do not update while the user is still travelling in the control
1857*b1cdbd2cSJim Jagielski 
1858*b1cdbd2cSJim Jagielski 	if ( mpSubEdit || !ImplHandleKeyEvent( rKEvt ) )
1859*b1cdbd2cSJim Jagielski 		Control::KeyInput( rKEvt );
1860*b1cdbd2cSJim Jagielski }
1861*b1cdbd2cSJim Jagielski 
1862*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1863*b1cdbd2cSJim Jagielski 
FillLayoutData() const1864*b1cdbd2cSJim Jagielski void Edit::FillLayoutData() const
1865*b1cdbd2cSJim Jagielski {
1866*b1cdbd2cSJim Jagielski     mpControlData->mpLayoutData = new vcl::ControlLayoutData();
1867*b1cdbd2cSJim Jagielski     const_cast<Edit*>(this)->ImplRepaint( 0, STRING_LEN, true );
1868*b1cdbd2cSJim Jagielski }
1869*b1cdbd2cSJim Jagielski 
1870*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1871*b1cdbd2cSJim Jagielski 
Paint(const Rectangle &)1872*b1cdbd2cSJim Jagielski void Edit::Paint( const Rectangle& )
1873*b1cdbd2cSJim Jagielski {
1874*b1cdbd2cSJim Jagielski 	if ( !mpSubEdit )
1875*b1cdbd2cSJim Jagielski 		ImplRepaint();
1876*b1cdbd2cSJim Jagielski }
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1879*b1cdbd2cSJim Jagielski 
Resize()1880*b1cdbd2cSJim Jagielski void Edit::Resize()
1881*b1cdbd2cSJim Jagielski {
1882*b1cdbd2cSJim Jagielski 	if ( !mpSubEdit && IsReallyVisible() )
1883*b1cdbd2cSJim Jagielski 	{
1884*b1cdbd2cSJim Jagielski         Control::Resize();
1885*b1cdbd2cSJim Jagielski 		// Wegen vertikaler Zentrierung...
1886*b1cdbd2cSJim Jagielski 		mnXOffset = 0;
1887*b1cdbd2cSJim Jagielski 		ImplAlign();
1888*b1cdbd2cSJim Jagielski 		Invalidate();
1889*b1cdbd2cSJim Jagielski 		ImplShowCursor();
1890*b1cdbd2cSJim Jagielski 	}
1891*b1cdbd2cSJim Jagielski }
1892*b1cdbd2cSJim Jagielski 
1893*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1894*b1cdbd2cSJim Jagielski 
Draw(OutputDevice * pDev,const Point & rPos,const Size & rSize,sal_uLong nFlags)1895*b1cdbd2cSJim Jagielski void Edit::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
1896*b1cdbd2cSJim Jagielski {
1897*b1cdbd2cSJim Jagielski     ImplInitSettings( sal_True, sal_True, sal_True );
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski 	Point aPos = pDev->LogicToPixel( rPos );
1900*b1cdbd2cSJim Jagielski 	Size aSize = pDev->LogicToPixel( rSize );
1901*b1cdbd2cSJim Jagielski 	Font aFont = GetDrawPixelFont( pDev );
1902*b1cdbd2cSJim Jagielski 	OutDevType eOutDevType = pDev->GetOutDevType();
1903*b1cdbd2cSJim Jagielski 
1904*b1cdbd2cSJim Jagielski 	pDev->Push();
1905*b1cdbd2cSJim Jagielski 	pDev->SetMapMode();
1906*b1cdbd2cSJim Jagielski 	pDev->SetFont( aFont );
1907*b1cdbd2cSJim Jagielski 	pDev->SetTextFillColor();
1908*b1cdbd2cSJim Jagielski 
1909*b1cdbd2cSJim Jagielski 	// Border/Background
1910*b1cdbd2cSJim Jagielski 	pDev->SetLineColor();
1911*b1cdbd2cSJim Jagielski 	pDev->SetFillColor();
1912*b1cdbd2cSJim Jagielski 	sal_Bool bBorder = !(nFlags & WINDOW_DRAW_NOBORDER ) && (GetStyle() & WB_BORDER);
1913*b1cdbd2cSJim Jagielski 	sal_Bool bBackground = !(nFlags & WINDOW_DRAW_NOBACKGROUND) && IsControlBackground();
1914*b1cdbd2cSJim Jagielski 	if ( bBorder || bBackground )
1915*b1cdbd2cSJim Jagielski 	{
1916*b1cdbd2cSJim Jagielski 		Rectangle aRect( aPos, aSize );
1917*b1cdbd2cSJim Jagielski 		if ( bBorder )
1918*b1cdbd2cSJim Jagielski 		{
1919*b1cdbd2cSJim Jagielski             ImplDrawFrame( pDev, aRect );
1920*b1cdbd2cSJim Jagielski 		}
1921*b1cdbd2cSJim Jagielski 		if ( bBackground )
1922*b1cdbd2cSJim Jagielski 		{
1923*b1cdbd2cSJim Jagielski 			pDev->SetFillColor( GetControlBackground() );
1924*b1cdbd2cSJim Jagielski 			pDev->DrawRect( aRect );
1925*b1cdbd2cSJim Jagielski 		}
1926*b1cdbd2cSJim Jagielski 	}
1927*b1cdbd2cSJim Jagielski 
1928*b1cdbd2cSJim Jagielski 	// Inhalt
1929*b1cdbd2cSJim Jagielski 	if ( ( nFlags & WINDOW_DRAW_MONO ) || ( eOutDevType == OUTDEV_PRINTER ) )
1930*b1cdbd2cSJim Jagielski 		pDev->SetTextColor( Color( COL_BLACK ) );
1931*b1cdbd2cSJim Jagielski 	else
1932*b1cdbd2cSJim Jagielski 	{
1933*b1cdbd2cSJim Jagielski 		if ( !(nFlags & WINDOW_DRAW_NODISABLE ) && !IsEnabled() )
1934*b1cdbd2cSJim Jagielski 		{
1935*b1cdbd2cSJim Jagielski 			const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1936*b1cdbd2cSJim Jagielski 			pDev->SetTextColor( rStyleSettings.GetDisableColor() );
1937*b1cdbd2cSJim Jagielski 		}
1938*b1cdbd2cSJim Jagielski 		else
1939*b1cdbd2cSJim Jagielski 		{
1940*b1cdbd2cSJim Jagielski 			pDev->SetTextColor( GetTextColor() );
1941*b1cdbd2cSJim Jagielski 		}
1942*b1cdbd2cSJim Jagielski 	}
1943*b1cdbd2cSJim Jagielski 
1944*b1cdbd2cSJim Jagielski 	XubString	aText = ImplGetText();
1945*b1cdbd2cSJim Jagielski 	long		nTextHeight = pDev->GetTextHeight();
1946*b1cdbd2cSJim Jagielski 	long		nTextWidth = pDev->GetTextWidth( aText );
1947*b1cdbd2cSJim Jagielski 	long		nOnePixel = GetDrawPixel( pDev, 1 );
1948*b1cdbd2cSJim Jagielski 	long		nOffX = 3*nOnePixel;
1949*b1cdbd2cSJim Jagielski 	long		nOffY = (aSize.Height() - nTextHeight) / 2;
1950*b1cdbd2cSJim Jagielski 
1951*b1cdbd2cSJim Jagielski 	// Clipping?
1952*b1cdbd2cSJim Jagielski 	if ( (nOffY < 0) ||
1953*b1cdbd2cSJim Jagielski 		 ((nOffY+nTextHeight) > aSize.Height()) ||
1954*b1cdbd2cSJim Jagielski 		 ((nOffX+nTextWidth) > aSize.Width()) )
1955*b1cdbd2cSJim Jagielski 	{
1956*b1cdbd2cSJim Jagielski 		Rectangle aClip( aPos, aSize );
1957*b1cdbd2cSJim Jagielski 		if ( nTextHeight > aSize.Height() )
1958*b1cdbd2cSJim Jagielski 			aClip.Bottom() += nTextHeight-aSize.Height()+1;  // Damit HP-Drucker nicht 'weg-optimieren'
1959*b1cdbd2cSJim Jagielski 		pDev->IntersectClipRegion( aClip );
1960*b1cdbd2cSJim Jagielski 	}
1961*b1cdbd2cSJim Jagielski 
1962*b1cdbd2cSJim Jagielski 	if ( GetStyle() & WB_CENTER )
1963*b1cdbd2cSJim Jagielski 	{
1964*b1cdbd2cSJim Jagielski 		aPos.X() += (aSize.Width() - nTextWidth) / 2;
1965*b1cdbd2cSJim Jagielski 		nOffX = 0;
1966*b1cdbd2cSJim Jagielski 	}
1967*b1cdbd2cSJim Jagielski 	else if ( GetStyle() & WB_RIGHT )
1968*b1cdbd2cSJim Jagielski 	{
1969*b1cdbd2cSJim Jagielski 		aPos.X() += aSize.Width() - nTextWidth;
1970*b1cdbd2cSJim Jagielski 		nOffX = -nOffX;
1971*b1cdbd2cSJim Jagielski 	}
1972*b1cdbd2cSJim Jagielski 
1973*b1cdbd2cSJim Jagielski 	pDev->DrawText( Point( aPos.X() + nOffX, aPos.Y() + nOffY ), aText );
1974*b1cdbd2cSJim Jagielski 	pDev->Pop();
1975*b1cdbd2cSJim Jagielski 
1976*b1cdbd2cSJim Jagielski     if ( GetSubEdit() )
1977*b1cdbd2cSJim Jagielski     {
1978*b1cdbd2cSJim Jagielski 	    GetSubEdit()->Draw( pDev, rPos, rSize, nFlags );
1979*b1cdbd2cSJim Jagielski     }
1980*b1cdbd2cSJim Jagielski }
1981*b1cdbd2cSJim Jagielski 
1982*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1983*b1cdbd2cSJim Jagielski 
ImplInvalidateOutermostBorder(Window * pWin)1984*b1cdbd2cSJim Jagielski void Edit::ImplInvalidateOutermostBorder( Window* pWin )
1985*b1cdbd2cSJim Jagielski {
1986*b1cdbd2cSJim Jagielski     // allow control to show focused state
1987*b1cdbd2cSJim Jagielski     Window *pInvalWin = pWin, *pBorder = pWin;
1988*b1cdbd2cSJim Jagielski     while( ( pBorder = pInvalWin->GetWindow( WINDOW_BORDER ) ) != pInvalWin && pBorder &&
1989*b1cdbd2cSJim Jagielski            pInvalWin->ImplGetFrame() == pBorder->ImplGetFrame() )
1990*b1cdbd2cSJim Jagielski     {
1991*b1cdbd2cSJim Jagielski         pInvalWin = pBorder;
1992*b1cdbd2cSJim Jagielski     }
1993*b1cdbd2cSJim Jagielski 
1994*b1cdbd2cSJim Jagielski     pInvalWin->Invalidate( INVALIDATE_CHILDREN | INVALIDATE_UPDATE );
1995*b1cdbd2cSJim Jagielski }
1996*b1cdbd2cSJim Jagielski 
GetFocus()1997*b1cdbd2cSJim Jagielski void Edit::GetFocus()
1998*b1cdbd2cSJim Jagielski {
1999*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2000*b1cdbd2cSJim Jagielski 		mpSubEdit->ImplGrabFocus( GetGetFocusFlags() );
2001*b1cdbd2cSJim Jagielski 	else if ( !mbActivePopup )
2002*b1cdbd2cSJim Jagielski 	{
2003*b1cdbd2cSJim Jagielski 		maUndoText = maText;
2004*b1cdbd2cSJim Jagielski 
2005*b1cdbd2cSJim Jagielski 		sal_uLong nSelOptions = GetSettings().GetStyleSettings().GetSelectionOptions();
2006*b1cdbd2cSJim Jagielski 		if ( !( GetStyle() & (WB_NOHIDESELECTION|WB_READONLY) )
2007*b1cdbd2cSJim Jagielski 				&& ( GetGetFocusFlags() & (GETFOCUS_INIT|GETFOCUS_TAB|GETFOCUS_CURSOR|GETFOCUS_MNEMONIC) ) )
2008*b1cdbd2cSJim Jagielski 		{
2009*b1cdbd2cSJim Jagielski 			if ( nSelOptions & SELECTION_OPTION_SHOWFIRST )
2010*b1cdbd2cSJim Jagielski 			{
2011*b1cdbd2cSJim Jagielski 				maSelection.Min() = maText.Len();
2012*b1cdbd2cSJim Jagielski 				maSelection.Max() = 0;
2013*b1cdbd2cSJim Jagielski 			}
2014*b1cdbd2cSJim Jagielski 			else
2015*b1cdbd2cSJim Jagielski 			{
2016*b1cdbd2cSJim Jagielski 				maSelection.Min() = 0;
2017*b1cdbd2cSJim Jagielski 				maSelection.Max() = maText.Len();
2018*b1cdbd2cSJim Jagielski 			}
2019*b1cdbd2cSJim Jagielski 			if ( mbIsSubEdit )
2020*b1cdbd2cSJim Jagielski 				((Edit*)GetParent())->ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
2021*b1cdbd2cSJim Jagielski 			else
2022*b1cdbd2cSJim Jagielski 				ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
2023*b1cdbd2cSJim Jagielski 		}
2024*b1cdbd2cSJim Jagielski 
2025*b1cdbd2cSJim Jagielski 		ImplShowCursor();
2026*b1cdbd2cSJim Jagielski 
2027*b1cdbd2cSJim Jagielski         // FIXME: this is currently only on aqua
2028*b1cdbd2cSJim Jagielski         // check for other platforms that need similar handling
2029*b1cdbd2cSJim Jagielski         if( ImplGetSVData()->maNWFData.mbNoFocusRects &&
2030*b1cdbd2cSJim Jagielski             IsNativeWidgetEnabled() &&
2031*b1cdbd2cSJim Jagielski             IsNativeControlSupported( CTRL_EDITBOX, PART_ENTIRE_CONTROL ) )
2032*b1cdbd2cSJim Jagielski         {
2033*b1cdbd2cSJim Jagielski             ImplInvalidateOutermostBorder( mbIsSubEdit ? GetParent() : this );
2034*b1cdbd2cSJim Jagielski         }
2035*b1cdbd2cSJim Jagielski 		else if ( maSelection.Len() )
2036*b1cdbd2cSJim Jagielski 		{
2037*b1cdbd2cSJim Jagielski 			// Selektion malen
2038*b1cdbd2cSJim Jagielski 			if ( !HasPaintEvent() )
2039*b1cdbd2cSJim Jagielski 				ImplInvalidateOrRepaint();
2040*b1cdbd2cSJim Jagielski 			else
2041*b1cdbd2cSJim Jagielski 				Invalidate();
2042*b1cdbd2cSJim Jagielski 		}
2043*b1cdbd2cSJim Jagielski 
2044*b1cdbd2cSJim Jagielski 		SetInputContext( InputContext( GetFont(), !IsReadOnly() ? INPUTCONTEXT_TEXT|INPUTCONTEXT_EXTTEXTINPUT : 0 ) );
2045*b1cdbd2cSJim Jagielski 	}
2046*b1cdbd2cSJim Jagielski 
2047*b1cdbd2cSJim Jagielski 	Control::GetFocus();
2048*b1cdbd2cSJim Jagielski }
2049*b1cdbd2cSJim Jagielski 
2050*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2051*b1cdbd2cSJim Jagielski 
GetPreferredKeyInputWindow()2052*b1cdbd2cSJim Jagielski Window* Edit::GetPreferredKeyInputWindow()
2053*b1cdbd2cSJim Jagielski {
2054*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2055*b1cdbd2cSJim Jagielski         return mpSubEdit->GetPreferredKeyInputWindow();
2056*b1cdbd2cSJim Jagielski     else
2057*b1cdbd2cSJim Jagielski         return this;
2058*b1cdbd2cSJim Jagielski }
2059*b1cdbd2cSJim Jagielski 
2060*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2061*b1cdbd2cSJim Jagielski 
LoseFocus()2062*b1cdbd2cSJim Jagielski void Edit::LoseFocus()
2063*b1cdbd2cSJim Jagielski {
2064*b1cdbd2cSJim Jagielski     if ( mpUpdateDataTimer && !mbIsSubEdit && mpUpdateDataTimer->IsActive() )
2065*b1cdbd2cSJim Jagielski     {
2066*b1cdbd2cSJim Jagielski         //notify an update latest when the focus is lost
2067*b1cdbd2cSJim Jagielski         mpUpdateDataTimer->Stop();
2068*b1cdbd2cSJim Jagielski         mpUpdateDataTimer->Timeout();
2069*b1cdbd2cSJim Jagielski     }
2070*b1cdbd2cSJim Jagielski 
2071*b1cdbd2cSJim Jagielski 	if ( !mpSubEdit )
2072*b1cdbd2cSJim Jagielski 	{
2073*b1cdbd2cSJim Jagielski         // FIXME: this is currently only on aqua
2074*b1cdbd2cSJim Jagielski         // check for other platforms that need similar handling
2075*b1cdbd2cSJim Jagielski         if( ImplGetSVData()->maNWFData.mbNoFocusRects &&
2076*b1cdbd2cSJim Jagielski             IsNativeWidgetEnabled() &&
2077*b1cdbd2cSJim Jagielski             IsNativeControlSupported( CTRL_EDITBOX, PART_ENTIRE_CONTROL ) )
2078*b1cdbd2cSJim Jagielski         {
2079*b1cdbd2cSJim Jagielski             ImplInvalidateOutermostBorder( mbIsSubEdit ? GetParent() : this );
2080*b1cdbd2cSJim Jagielski         }
2081*b1cdbd2cSJim Jagielski 
2082*b1cdbd2cSJim Jagielski 		if ( !mbActivePopup && !( GetStyle() & WB_NOHIDESELECTION ) && maSelection.Len() )
2083*b1cdbd2cSJim Jagielski 			ImplInvalidateOrRepaint();	  // Selektion malen
2084*b1cdbd2cSJim Jagielski 	}
2085*b1cdbd2cSJim Jagielski 
2086*b1cdbd2cSJim Jagielski 	Control::LoseFocus();
2087*b1cdbd2cSJim Jagielski }
2088*b1cdbd2cSJim Jagielski 
2089*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2090*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rCEvt)2091*b1cdbd2cSJim Jagielski void Edit::Command( const CommandEvent& rCEvt )
2092*b1cdbd2cSJim Jagielski {
2093*b1cdbd2cSJim Jagielski 	if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
2094*b1cdbd2cSJim Jagielski 	{
2095*b1cdbd2cSJim Jagielski 		PopupMenu* pPopup = Edit::CreatePopupMenu();
2096*b1cdbd2cSJim Jagielski 		const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
2097*b1cdbd2cSJim Jagielski 		if ( rStyleSettings.GetOptions() & STYLE_OPTION_HIDEDISABLED )
2098*b1cdbd2cSJim Jagielski 			pPopup->SetMenuFlags( MENU_FLAG_HIDEDISABLEDENTRIES );
2099*b1cdbd2cSJim Jagielski 
2100*b1cdbd2cSJim Jagielski 		if ( !maSelection.Len() )
2101*b1cdbd2cSJim Jagielski 		{
2102*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_CUT, sal_False );
2103*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_COPY, sal_False );
2104*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_DELETE, sal_False );
2105*b1cdbd2cSJim Jagielski 		}
2106*b1cdbd2cSJim Jagielski 
2107*b1cdbd2cSJim Jagielski 		if ( IsReadOnly() )
2108*b1cdbd2cSJim Jagielski 		{
2109*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_CUT, sal_False );
2110*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_PASTE, sal_False );
2111*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_DELETE, sal_False );
2112*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_INSERTSYMBOL, sal_False );
2113*b1cdbd2cSJim Jagielski 		}
2114*b1cdbd2cSJim Jagielski 		else
2115*b1cdbd2cSJim Jagielski 		{
2116*b1cdbd2cSJim Jagielski 			// Paste nur, wenn Text im Clipboard
2117*b1cdbd2cSJim Jagielski 			sal_Bool bData = sal_False;
2118*b1cdbd2cSJim Jagielski 			uno::Reference< datatransfer::clipboard::XClipboard > xClipboard = GetClipboard();
2119*b1cdbd2cSJim Jagielski 			if ( xClipboard.is() )
2120*b1cdbd2cSJim Jagielski 			{
2121*b1cdbd2cSJim Jagielski 				const sal_uInt32 nRef = Application::ReleaseSolarMutex();
2122*b1cdbd2cSJim Jagielski 				uno::Reference< datatransfer::XTransferable > xDataObj = xClipboard->getContents();
2123*b1cdbd2cSJim Jagielski 				Application::AcquireSolarMutex( nRef );
2124*b1cdbd2cSJim Jagielski 				if ( xDataObj.is() )
2125*b1cdbd2cSJim Jagielski 				{
2126*b1cdbd2cSJim Jagielski 					datatransfer::DataFlavor aFlavor;
2127*b1cdbd2cSJim Jagielski 					SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
2128*b1cdbd2cSJim Jagielski 					bData = xDataObj->isDataFlavorSupported( aFlavor );
2129*b1cdbd2cSJim Jagielski 				}
2130*b1cdbd2cSJim Jagielski 			}
2131*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_PASTE, bData );
2132*b1cdbd2cSJim Jagielski 		}
2133*b1cdbd2cSJim Jagielski 
2134*b1cdbd2cSJim Jagielski 		if ( maUndoText == maText )
2135*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_UNDO, sal_False );
2136*b1cdbd2cSJim Jagielski 		if ( ( maSelection.Min() == 0 ) && ( maSelection.Max() == maText.Len() ) )
2137*b1cdbd2cSJim Jagielski 			pPopup->EnableItem( SV_MENU_EDIT_SELECTALL, sal_False );
2138*b1cdbd2cSJim Jagielski 		if ( !pImplFncGetSpecialChars )
2139*b1cdbd2cSJim Jagielski 		{
2140*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = pPopup->GetItemPos( SV_MENU_EDIT_INSERTSYMBOL );
2141*b1cdbd2cSJim Jagielski 			pPopup->RemoveItem( nPos );
2142*b1cdbd2cSJim Jagielski 			pPopup->RemoveItem( nPos-1 );
2143*b1cdbd2cSJim Jagielski 		}
2144*b1cdbd2cSJim Jagielski 
2145*b1cdbd2cSJim Jagielski 		mbActivePopup = sal_True;
2146*b1cdbd2cSJim Jagielski 		Selection aSaveSel = GetSelection();	// Falls jemand in Get/LoseFocus die Selektion verbiegt, z.B. URL-Zeile...
2147*b1cdbd2cSJim Jagielski 		Point aPos = rCEvt.GetMousePosPixel();
2148*b1cdbd2cSJim Jagielski 		if ( !rCEvt.IsMouseEvent() )
2149*b1cdbd2cSJim Jagielski 		{
2150*b1cdbd2cSJim Jagielski 			// !!! Irgendwann einmal Menu zentriert in der Selektion anzeigen !!!
2151*b1cdbd2cSJim Jagielski 			Size aSize = GetOutputSizePixel();
2152*b1cdbd2cSJim Jagielski 			aPos = Point( aSize.Width()/2, aSize.Height()/2 );
2153*b1cdbd2cSJim Jagielski 		}
2154*b1cdbd2cSJim Jagielski 		sal_uInt16 n = pPopup->Execute( this, aPos );
2155*b1cdbd2cSJim Jagielski 		Edit::DeletePopupMenu( pPopup );
2156*b1cdbd2cSJim Jagielski 		SetSelection( aSaveSel );
2157*b1cdbd2cSJim Jagielski 		switch ( n )
2158*b1cdbd2cSJim Jagielski 		{
2159*b1cdbd2cSJim Jagielski 			case SV_MENU_EDIT_UNDO:
2160*b1cdbd2cSJim Jagielski 				Undo();
2161*b1cdbd2cSJim Jagielski 				ImplModified();
2162*b1cdbd2cSJim Jagielski 				break;
2163*b1cdbd2cSJim Jagielski 			case SV_MENU_EDIT_CUT:
2164*b1cdbd2cSJim Jagielski 				Cut();
2165*b1cdbd2cSJim Jagielski 				ImplModified();
2166*b1cdbd2cSJim Jagielski 				break;
2167*b1cdbd2cSJim Jagielski 			case SV_MENU_EDIT_COPY:
2168*b1cdbd2cSJim Jagielski 				Copy();
2169*b1cdbd2cSJim Jagielski 				break;
2170*b1cdbd2cSJim Jagielski 			case SV_MENU_EDIT_PASTE:
2171*b1cdbd2cSJim Jagielski 				Paste();
2172*b1cdbd2cSJim Jagielski 				ImplModified();
2173*b1cdbd2cSJim Jagielski 				break;
2174*b1cdbd2cSJim Jagielski 			case SV_MENU_EDIT_DELETE:
2175*b1cdbd2cSJim Jagielski 				DeleteSelected();
2176*b1cdbd2cSJim Jagielski 				ImplModified();
2177*b1cdbd2cSJim Jagielski 				break;
2178*b1cdbd2cSJim Jagielski 			case SV_MENU_EDIT_SELECTALL:
2179*b1cdbd2cSJim Jagielski 				ImplSetSelection( Selection( 0, maText.Len() ) );
2180*b1cdbd2cSJim Jagielski 				break;
2181*b1cdbd2cSJim Jagielski 			case SV_MENU_EDIT_INSERTSYMBOL:
2182*b1cdbd2cSJim Jagielski 				{
2183*b1cdbd2cSJim Jagielski 					XubString aChars = pImplFncGetSpecialChars( this, GetFont() );
2184*b1cdbd2cSJim Jagielski 					SetSelection( aSaveSel );
2185*b1cdbd2cSJim Jagielski 					if ( aChars.Len() )
2186*b1cdbd2cSJim Jagielski 					{
2187*b1cdbd2cSJim Jagielski 						ImplInsertText( aChars );
2188*b1cdbd2cSJim Jagielski 						ImplModified();
2189*b1cdbd2cSJim Jagielski 					}
2190*b1cdbd2cSJim Jagielski 				}
2191*b1cdbd2cSJim Jagielski 				break;
2192*b1cdbd2cSJim Jagielski 		}
2193*b1cdbd2cSJim Jagielski 		mbActivePopup = sal_False;
2194*b1cdbd2cSJim Jagielski 	}
2195*b1cdbd2cSJim Jagielski 	else if ( rCEvt.GetCommand() == COMMAND_VOICE )
2196*b1cdbd2cSJim Jagielski 	{
2197*b1cdbd2cSJim Jagielski 		const CommandVoiceData* pData = rCEvt.GetVoiceData();
2198*b1cdbd2cSJim Jagielski 		if ( pData->GetType() == VOICECOMMANDTYPE_DICTATION )
2199*b1cdbd2cSJim Jagielski 		{
2200*b1cdbd2cSJim Jagielski 			switch ( pData->GetCommand() )
2201*b1cdbd2cSJim Jagielski 			{
2202*b1cdbd2cSJim Jagielski 				case DICTATIONCOMMAND_UNKNOWN:
2203*b1cdbd2cSJim Jagielski 				{
2204*b1cdbd2cSJim Jagielski 					ReplaceSelected( pData->GetText() );
2205*b1cdbd2cSJim Jagielski 				}
2206*b1cdbd2cSJim Jagielski 				break;
2207*b1cdbd2cSJim Jagielski 				case DICTATIONCOMMAND_LEFT:
2208*b1cdbd2cSJim Jagielski 				{
2209*b1cdbd2cSJim Jagielski 					ImplHandleKeyEvent( KeyEvent( 0, KeyCode( KEY_LEFT, KEY_MOD1  ) ) );
2210*b1cdbd2cSJim Jagielski 				}
2211*b1cdbd2cSJim Jagielski 				break;
2212*b1cdbd2cSJim Jagielski 				case DICTATIONCOMMAND_RIGHT:
2213*b1cdbd2cSJim Jagielski 				{
2214*b1cdbd2cSJim Jagielski 					ImplHandleKeyEvent( KeyEvent( 0, KeyCode( KEY_RIGHT, KEY_MOD1  ) ) );
2215*b1cdbd2cSJim Jagielski 				}
2216*b1cdbd2cSJim Jagielski 				break;
2217*b1cdbd2cSJim Jagielski 				case DICTATIONCOMMAND_UNDO:
2218*b1cdbd2cSJim Jagielski 				{
2219*b1cdbd2cSJim Jagielski 					Undo();
2220*b1cdbd2cSJim Jagielski 				}
2221*b1cdbd2cSJim Jagielski 				break;
2222*b1cdbd2cSJim Jagielski 				case DICTATIONCOMMAND_DEL:
2223*b1cdbd2cSJim Jagielski 				{
2224*b1cdbd2cSJim Jagielski 					ImplHandleKeyEvent( KeyEvent( 0, KeyCode( KEY_LEFT, KEY_MOD1|KEY_SHIFT	) ) );
2225*b1cdbd2cSJim Jagielski 					DeleteSelected();
2226*b1cdbd2cSJim Jagielski 				}
2227*b1cdbd2cSJim Jagielski 				break;
2228*b1cdbd2cSJim Jagielski 			}
2229*b1cdbd2cSJim Jagielski 		}
2230*b1cdbd2cSJim Jagielski 	}
2231*b1cdbd2cSJim Jagielski 	else if ( rCEvt.GetCommand() == COMMAND_STARTEXTTEXTINPUT )
2232*b1cdbd2cSJim Jagielski 	{
2233*b1cdbd2cSJim Jagielski 		DeleteSelected();
2234*b1cdbd2cSJim Jagielski 		delete mpIMEInfos;
2235*b1cdbd2cSJim Jagielski 		xub_StrLen nPos = (xub_StrLen)maSelection.Max();
2236*b1cdbd2cSJim Jagielski 		mpIMEInfos = new Impl_IMEInfos( nPos, maText.Copy( nPos ) );
2237*b1cdbd2cSJim Jagielski 		mpIMEInfos->bWasCursorOverwrite = !IsInsertMode();
2238*b1cdbd2cSJim Jagielski 	}
2239*b1cdbd2cSJim Jagielski 	else if ( rCEvt.GetCommand() == COMMAND_ENDEXTTEXTINPUT )
2240*b1cdbd2cSJim Jagielski 	{
2241*b1cdbd2cSJim Jagielski 		sal_Bool bInsertMode = !mpIMEInfos->bWasCursorOverwrite;
2242*b1cdbd2cSJim Jagielski 		delete mpIMEInfos;
2243*b1cdbd2cSJim Jagielski 		mpIMEInfos = NULL;
2244*b1cdbd2cSJim Jagielski 		// Font wieder ohne Attribute einstellen, wird jetzt im Repaint nicht
2245*b1cdbd2cSJim Jagielski 		// mehr neu initialisiert
2246*b1cdbd2cSJim Jagielski 		ImplInitSettings( sal_True, sal_False, sal_False );
2247*b1cdbd2cSJim Jagielski 
2248*b1cdbd2cSJim Jagielski 		SetInsertMode( bInsertMode );
2249*b1cdbd2cSJim Jagielski 
2250*b1cdbd2cSJim Jagielski 		ImplModified();
2251*b1cdbd2cSJim Jagielski 
2252*b1cdbd2cSJim Jagielski         // #i25161# call auto complete handler for ext text commit also
2253*b1cdbd2cSJim Jagielski         if ( maAutocompleteHdl.IsSet() )
2254*b1cdbd2cSJim Jagielski         {
2255*b1cdbd2cSJim Jagielski             if ( (maSelection.Min() == maSelection.Max()) && (maSelection.Min() == maText.Len()) )
2256*b1cdbd2cSJim Jagielski             {
2257*b1cdbd2cSJim Jagielski                 meAutocompleteAction = AUTOCOMPLETE_KEYINPUT;
2258*b1cdbd2cSJim Jagielski                 maAutocompleteHdl.Call( this );
2259*b1cdbd2cSJim Jagielski             }
2260*b1cdbd2cSJim Jagielski         }
2261*b1cdbd2cSJim Jagielski 	}
2262*b1cdbd2cSJim Jagielski 	else if ( rCEvt.GetCommand() == COMMAND_EXTTEXTINPUT )
2263*b1cdbd2cSJim Jagielski 	{
2264*b1cdbd2cSJim Jagielski 		const CommandExtTextInputData* pData = rCEvt.GetExtTextInputData();
2265*b1cdbd2cSJim Jagielski 
2266*b1cdbd2cSJim Jagielski 		maText.Erase( mpIMEInfos->nPos, mpIMEInfos->nLen );
2267*b1cdbd2cSJim Jagielski 		maText.Insert( pData->GetText(), mpIMEInfos->nPos );
2268*b1cdbd2cSJim Jagielski         if ( mpIMEInfos->bWasCursorOverwrite )
2269*b1cdbd2cSJim Jagielski         {
2270*b1cdbd2cSJim Jagielski             sal_uInt16 nOldIMETextLen = mpIMEInfos->nLen;
2271*b1cdbd2cSJim Jagielski             sal_uInt16 nNewIMETextLen = pData->GetText().Len();
2272*b1cdbd2cSJim Jagielski             if ( ( nOldIMETextLen > nNewIMETextLen ) &&
2273*b1cdbd2cSJim Jagielski                  ( nNewIMETextLen < mpIMEInfos->aOldTextAfterStartPos.Len() ) )
2274*b1cdbd2cSJim Jagielski             {
2275*b1cdbd2cSJim Jagielski                 // restore old characters
2276*b1cdbd2cSJim Jagielski                 sal_uInt16 nRestore = nOldIMETextLen - nNewIMETextLen;
2277*b1cdbd2cSJim Jagielski                 maText.Insert( mpIMEInfos->aOldTextAfterStartPos.Copy( nNewIMETextLen, nRestore ), mpIMEInfos->nPos + nNewIMETextLen );
2278*b1cdbd2cSJim Jagielski             }
2279*b1cdbd2cSJim Jagielski             else if ( ( nOldIMETextLen < nNewIMETextLen ) &&
2280*b1cdbd2cSJim Jagielski                       ( nOldIMETextLen < mpIMEInfos->aOldTextAfterStartPos.Len() ) )
2281*b1cdbd2cSJim Jagielski             {
2282*b1cdbd2cSJim Jagielski                 // overwrite
2283*b1cdbd2cSJim Jagielski                 sal_uInt16 nOverwrite = nNewIMETextLen - nOldIMETextLen;
2284*b1cdbd2cSJim Jagielski                 if ( ( nOldIMETextLen + nOverwrite ) > mpIMEInfos->aOldTextAfterStartPos.Len() )
2285*b1cdbd2cSJim Jagielski                     nOverwrite = mpIMEInfos->aOldTextAfterStartPos.Len() - nOldIMETextLen;
2286*b1cdbd2cSJim Jagielski                 maText.Erase( mpIMEInfos->nPos + nNewIMETextLen, nOverwrite );
2287*b1cdbd2cSJim Jagielski             }
2288*b1cdbd2cSJim Jagielski         }
2289*b1cdbd2cSJim Jagielski 
2290*b1cdbd2cSJim Jagielski 
2291*b1cdbd2cSJim Jagielski 		if ( pData->GetTextAttr() )
2292*b1cdbd2cSJim Jagielski 		{
2293*b1cdbd2cSJim Jagielski 			mpIMEInfos->CopyAttribs( pData->GetTextAttr(), pData->GetText().Len() );
2294*b1cdbd2cSJim Jagielski 			mpIMEInfos->bCursor = pData->IsCursorVisible();
2295*b1cdbd2cSJim Jagielski 		}
2296*b1cdbd2cSJim Jagielski 		else
2297*b1cdbd2cSJim Jagielski 		{
2298*b1cdbd2cSJim Jagielski 			mpIMEInfos->DestroyAttribs();
2299*b1cdbd2cSJim Jagielski 		}
2300*b1cdbd2cSJim Jagielski 
2301*b1cdbd2cSJim Jagielski         ImplAlignAndPaint();
2302*b1cdbd2cSJim Jagielski 		xub_StrLen nCursorPos = mpIMEInfos->nPos + pData->GetCursorPos();
2303*b1cdbd2cSJim Jagielski 		SetSelection( Selection( nCursorPos, nCursorPos ) );
2304*b1cdbd2cSJim Jagielski 		SetInsertMode( !pData->IsCursorOverwrite() );
2305*b1cdbd2cSJim Jagielski 
2306*b1cdbd2cSJim Jagielski 		if ( pData->IsCursorVisible() )
2307*b1cdbd2cSJim Jagielski 			GetCursor()->Show();
2308*b1cdbd2cSJim Jagielski 		else
2309*b1cdbd2cSJim Jagielski 			GetCursor()->Hide();
2310*b1cdbd2cSJim Jagielski 	}
2311*b1cdbd2cSJim Jagielski 	else if ( rCEvt.GetCommand() == COMMAND_CURSORPOS )
2312*b1cdbd2cSJim Jagielski 	{
2313*b1cdbd2cSJim Jagielski 		if ( mpIMEInfos )
2314*b1cdbd2cSJim Jagielski 		{
2315*b1cdbd2cSJim Jagielski 			xub_StrLen nCursorPos = (sal_uInt16)GetSelection().Max();
2316*b1cdbd2cSJim Jagielski 			SetCursorRect( NULL, GetTextWidth(
2317*b1cdbd2cSJim Jagielski 				maText, nCursorPos, mpIMEInfos->nPos+mpIMEInfos->nLen-nCursorPos ) );
2318*b1cdbd2cSJim Jagielski 		}
2319*b1cdbd2cSJim Jagielski 		else
2320*b1cdbd2cSJim Jagielski 		{
2321*b1cdbd2cSJim Jagielski 			SetCursorRect();
2322*b1cdbd2cSJim Jagielski 		}
2323*b1cdbd2cSJim Jagielski 	}
2324*b1cdbd2cSJim Jagielski 	else if ( rCEvt.GetCommand() == COMMAND_SELECTIONCHANGE )
2325*b1cdbd2cSJim Jagielski 	{
2326*b1cdbd2cSJim Jagielski 	    const CommandSelectionChangeData *pData = rCEvt.GetSelectionChangeData();
2327*b1cdbd2cSJim Jagielski 	    Selection aSelection( pData->GetStart(), pData->GetEnd() );
2328*b1cdbd2cSJim Jagielski 	    SetSelection(aSelection);
2329*b1cdbd2cSJim Jagielski 	}
2330*b1cdbd2cSJim Jagielski 	else
2331*b1cdbd2cSJim Jagielski 		Control::Command( rCEvt );
2332*b1cdbd2cSJim Jagielski }
2333*b1cdbd2cSJim Jagielski 
2334*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2335*b1cdbd2cSJim Jagielski 
StateChanged(StateChangedType nType)2336*b1cdbd2cSJim Jagielski void Edit::StateChanged( StateChangedType nType )
2337*b1cdbd2cSJim Jagielski {
2338*b1cdbd2cSJim Jagielski 	if ( nType == STATE_CHANGE_INITSHOW )
2339*b1cdbd2cSJim Jagielski 	{
2340*b1cdbd2cSJim Jagielski 		if ( !mpSubEdit )
2341*b1cdbd2cSJim Jagielski 		{
2342*b1cdbd2cSJim Jagielski 			mnXOffset = 0;	// Falls vorher GrabFocus, als Groesse noch falsch.
2343*b1cdbd2cSJim Jagielski 			ImplAlign();
2344*b1cdbd2cSJim Jagielski 			if ( !mpSubEdit )
2345*b1cdbd2cSJim Jagielski 				ImplShowCursor( sal_False );
2346*b1cdbd2cSJim Jagielski 		}
2347*b1cdbd2cSJim Jagielski         // update background (eventual SetPaintTransparent)
2348*b1cdbd2cSJim Jagielski         ImplInitSettings( sal_False, sal_False, sal_True );
2349*b1cdbd2cSJim Jagielski 	}
2350*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_ENABLE )
2351*b1cdbd2cSJim Jagielski 	{
2352*b1cdbd2cSJim Jagielski 		if ( !mpSubEdit )
2353*b1cdbd2cSJim Jagielski 		{
2354*b1cdbd2cSJim Jagielski 			// Es aendert sich nur die Textfarbe...
2355*b1cdbd2cSJim Jagielski 			ImplInvalidateOrRepaint( 0, 0xFFFF );
2356*b1cdbd2cSJim Jagielski 		}
2357*b1cdbd2cSJim Jagielski 	}
2358*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_STYLE || nType == STATE_CHANGE_MIRRORING )
2359*b1cdbd2cSJim Jagielski 	{
2360*b1cdbd2cSJim Jagielski         WinBits nStyle = GetStyle();
2361*b1cdbd2cSJim Jagielski         if( nType == STATE_CHANGE_STYLE )
2362*b1cdbd2cSJim Jagielski         {
2363*b1cdbd2cSJim Jagielski             nStyle = ImplInitStyle( GetStyle() );
2364*b1cdbd2cSJim Jagielski             SetStyle( nStyle );
2365*b1cdbd2cSJim Jagielski         }
2366*b1cdbd2cSJim Jagielski 
2367*b1cdbd2cSJim Jagielski 		sal_uInt16 nOldAlign = mnAlign;
2368*b1cdbd2cSJim Jagielski 		mnAlign = EDIT_ALIGN_LEFT;
2369*b1cdbd2cSJim Jagielski 
2370*b1cdbd2cSJim Jagielski         // --- RTL --- hack: right align until keyinput and cursor travelling works
2371*b1cdbd2cSJim Jagielski         // edits are always RTL disabled
2372*b1cdbd2cSJim Jagielski         // however the parent edits contain the correct setting
2373*b1cdbd2cSJim Jagielski         if( mbIsSubEdit && GetParent()->IsRTLEnabled() )
2374*b1cdbd2cSJim Jagielski         {
2375*b1cdbd2cSJim Jagielski             if( GetParent()->GetStyle() & WB_LEFT )
2376*b1cdbd2cSJim Jagielski                 mnAlign	= EDIT_ALIGN_RIGHT;
2377*b1cdbd2cSJim Jagielski             if ( nType == STATE_CHANGE_MIRRORING )
2378*b1cdbd2cSJim Jagielski                 SetLayoutMode( TEXT_LAYOUT_BIDI_RTL | TEXT_LAYOUT_TEXTORIGIN_LEFT );
2379*b1cdbd2cSJim Jagielski         }
2380*b1cdbd2cSJim Jagielski         else if( mbIsSubEdit && !GetParent()->IsRTLEnabled() )
2381*b1cdbd2cSJim Jagielski         {
2382*b1cdbd2cSJim Jagielski             if ( nType == STATE_CHANGE_MIRRORING )
2383*b1cdbd2cSJim Jagielski                 SetLayoutMode( TEXT_LAYOUT_BIDI_LTR | TEXT_LAYOUT_TEXTORIGIN_LEFT );
2384*b1cdbd2cSJim Jagielski         }
2385*b1cdbd2cSJim Jagielski 
2386*b1cdbd2cSJim Jagielski 		if ( nStyle & WB_RIGHT )
2387*b1cdbd2cSJim Jagielski 			mnAlign = EDIT_ALIGN_RIGHT;
2388*b1cdbd2cSJim Jagielski 		else if ( nStyle & WB_CENTER )
2389*b1cdbd2cSJim Jagielski 			mnAlign = EDIT_ALIGN_CENTER;
2390*b1cdbd2cSJim Jagielski 		if ( maText.Len() && ( mnAlign != nOldAlign ) )
2391*b1cdbd2cSJim Jagielski 		{
2392*b1cdbd2cSJim Jagielski 			ImplAlign();
2393*b1cdbd2cSJim Jagielski 			Invalidate();
2394*b1cdbd2cSJim Jagielski 		}
2395*b1cdbd2cSJim Jagielski 
2396*b1cdbd2cSJim Jagielski 	}
2397*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_ZOOM )
2398*b1cdbd2cSJim Jagielski 	{
2399*b1cdbd2cSJim Jagielski 		if ( !mpSubEdit )
2400*b1cdbd2cSJim Jagielski 		{
2401*b1cdbd2cSJim Jagielski 			ImplInitSettings( sal_True, sal_False, sal_False );
2402*b1cdbd2cSJim Jagielski 			ImplShowCursor( sal_True );
2403*b1cdbd2cSJim Jagielski 			Invalidate();
2404*b1cdbd2cSJim Jagielski 		}
2405*b1cdbd2cSJim Jagielski 	}
2406*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_CONTROLFONT )
2407*b1cdbd2cSJim Jagielski 	{
2408*b1cdbd2cSJim Jagielski 		if ( !mpSubEdit )
2409*b1cdbd2cSJim Jagielski 		{
2410*b1cdbd2cSJim Jagielski 			ImplInitSettings( sal_True, sal_False, sal_False );
2411*b1cdbd2cSJim Jagielski 			ImplShowCursor();
2412*b1cdbd2cSJim Jagielski 			Invalidate();
2413*b1cdbd2cSJim Jagielski 		}
2414*b1cdbd2cSJim Jagielski 	}
2415*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
2416*b1cdbd2cSJim Jagielski 	{
2417*b1cdbd2cSJim Jagielski 		if ( !mpSubEdit )
2418*b1cdbd2cSJim Jagielski 		{
2419*b1cdbd2cSJim Jagielski 			ImplInitSettings( sal_False, sal_True, sal_False );
2420*b1cdbd2cSJim Jagielski 			Invalidate();
2421*b1cdbd2cSJim Jagielski 		}
2422*b1cdbd2cSJim Jagielski 	}
2423*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
2424*b1cdbd2cSJim Jagielski 	{
2425*b1cdbd2cSJim Jagielski 		if ( !mpSubEdit )
2426*b1cdbd2cSJim Jagielski 		{
2427*b1cdbd2cSJim Jagielski 			ImplInitSettings( sal_False, sal_False, sal_True );
2428*b1cdbd2cSJim Jagielski 			Invalidate();
2429*b1cdbd2cSJim Jagielski 		}
2430*b1cdbd2cSJim Jagielski 	}
2431*b1cdbd2cSJim Jagielski 
2432*b1cdbd2cSJim Jagielski 	Control::StateChanged( nType );
2433*b1cdbd2cSJim Jagielski }
2434*b1cdbd2cSJim Jagielski 
2435*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2436*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)2437*b1cdbd2cSJim Jagielski void Edit::DataChanged( const DataChangedEvent& rDCEvt )
2438*b1cdbd2cSJim Jagielski {
2439*b1cdbd2cSJim Jagielski 	if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
2440*b1cdbd2cSJim Jagielski 		 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
2441*b1cdbd2cSJim Jagielski 		 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
2442*b1cdbd2cSJim Jagielski 		  (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
2443*b1cdbd2cSJim Jagielski 	{
2444*b1cdbd2cSJim Jagielski 		if ( !mpSubEdit )
2445*b1cdbd2cSJim Jagielski 		{
2446*b1cdbd2cSJim Jagielski 			ImplInitSettings( sal_True, sal_True, sal_True );
2447*b1cdbd2cSJim Jagielski 			ImplShowCursor( sal_True );
2448*b1cdbd2cSJim Jagielski 			Invalidate();
2449*b1cdbd2cSJim Jagielski 		}
2450*b1cdbd2cSJim Jagielski 	}
2451*b1cdbd2cSJim Jagielski 
2452*b1cdbd2cSJim Jagielski 	Control::DataChanged( rDCEvt );
2453*b1cdbd2cSJim Jagielski }
2454*b1cdbd2cSJim Jagielski 
2455*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2456*b1cdbd2cSJim Jagielski 
ImplShowDDCursor()2457*b1cdbd2cSJim Jagielski void Edit::ImplShowDDCursor()
2458*b1cdbd2cSJim Jagielski {
2459*b1cdbd2cSJim Jagielski 	if ( !mpDDInfo->bVisCursor )
2460*b1cdbd2cSJim Jagielski 	{
2461*b1cdbd2cSJim Jagielski 		long nTextWidth = GetTextWidth( maText, 0, mpDDInfo->nDropPos );
2462*b1cdbd2cSJim Jagielski 		long nTextHeight = GetTextHeight();
2463*b1cdbd2cSJim Jagielski 		Rectangle aCursorRect( Point( nTextWidth + mnXOffset, (GetOutputSize().Height()-nTextHeight)/2 ), Size( 2, nTextHeight ) );
2464*b1cdbd2cSJim Jagielski 		mpDDInfo->aCursor.SetWindow( this );
2465*b1cdbd2cSJim Jagielski 		mpDDInfo->aCursor.SetPos( aCursorRect.TopLeft() );
2466*b1cdbd2cSJim Jagielski 		mpDDInfo->aCursor.SetSize( aCursorRect.GetSize() );
2467*b1cdbd2cSJim Jagielski 		mpDDInfo->aCursor.Show();
2468*b1cdbd2cSJim Jagielski 		mpDDInfo->bVisCursor = sal_True;
2469*b1cdbd2cSJim Jagielski 	}
2470*b1cdbd2cSJim Jagielski }
2471*b1cdbd2cSJim Jagielski 
2472*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2473*b1cdbd2cSJim Jagielski 
ImplHideDDCursor()2474*b1cdbd2cSJim Jagielski void Edit::ImplHideDDCursor()
2475*b1cdbd2cSJim Jagielski {
2476*b1cdbd2cSJim Jagielski 	if ( mpDDInfo && mpDDInfo->bVisCursor )
2477*b1cdbd2cSJim Jagielski 	{
2478*b1cdbd2cSJim Jagielski 		mpDDInfo->aCursor.Hide();
2479*b1cdbd2cSJim Jagielski 		mpDDInfo->bVisCursor = sal_False;
2480*b1cdbd2cSJim Jagielski 	}
2481*b1cdbd2cSJim Jagielski }
2482*b1cdbd2cSJim Jagielski 
2483*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2484*b1cdbd2cSJim Jagielski 
Modify()2485*b1cdbd2cSJim Jagielski void Edit::Modify()
2486*b1cdbd2cSJim Jagielski {
2487*b1cdbd2cSJim Jagielski     if ( mbIsSubEdit )
2488*b1cdbd2cSJim Jagielski 	{
2489*b1cdbd2cSJim Jagielski 		((Edit*)GetParent())->Modify();
2490*b1cdbd2cSJim Jagielski 	}
2491*b1cdbd2cSJim Jagielski 	else
2492*b1cdbd2cSJim Jagielski 	{
2493*b1cdbd2cSJim Jagielski 		if ( mpUpdateDataTimer )
2494*b1cdbd2cSJim Jagielski 			mpUpdateDataTimer->Start();
2495*b1cdbd2cSJim Jagielski 
2496*b1cdbd2cSJim Jagielski         if ( ImplCallEventListenersAndHandler( VCLEVENT_EDIT_MODIFY, maModifyHdl, this ) )
2497*b1cdbd2cSJim Jagielski             // have been destroyed while calling into the handlers
2498*b1cdbd2cSJim Jagielski             return;
2499*b1cdbd2cSJim Jagielski 
2500*b1cdbd2cSJim Jagielski         // #i13677# notify edit listeners about caret position change
2501*b1cdbd2cSJim Jagielski         //ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
2502*b1cdbd2cSJim Jagielski         ImplCallEventListeners( VCLEVENT_EDIT_CARETCHANGED );
2503*b1cdbd2cSJim Jagielski         // FIXME: this is currently only on aqua
2504*b1cdbd2cSJim Jagielski         // check for other platforms that need similar handling
2505*b1cdbd2cSJim Jagielski         if( ImplGetSVData()->maNWFData.mbNoFocusRects &&
2506*b1cdbd2cSJim Jagielski             IsNativeWidgetEnabled() &&
2507*b1cdbd2cSJim Jagielski             IsNativeControlSupported( CTRL_EDITBOX, PART_ENTIRE_CONTROL ) )
2508*b1cdbd2cSJim Jagielski         {
2509*b1cdbd2cSJim Jagielski             ImplInvalidateOutermostBorder( this );
2510*b1cdbd2cSJim Jagielski         }
2511*b1cdbd2cSJim Jagielski 	}
2512*b1cdbd2cSJim Jagielski }
2513*b1cdbd2cSJim Jagielski 
2514*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2515*b1cdbd2cSJim Jagielski 
UpdateData()2516*b1cdbd2cSJim Jagielski void Edit::UpdateData()
2517*b1cdbd2cSJim Jagielski {
2518*b1cdbd2cSJim Jagielski 	maUpdateDataHdl.Call( this );
2519*b1cdbd2cSJim Jagielski }
2520*b1cdbd2cSJim Jagielski 
2521*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2522*b1cdbd2cSJim Jagielski 
IMPL_LINK(Edit,ImplUpdateDataHdl,Timer *,EMPTYARG)2523*b1cdbd2cSJim Jagielski IMPL_LINK( Edit, ImplUpdateDataHdl, Timer*, EMPTYARG )
2524*b1cdbd2cSJim Jagielski {
2525*b1cdbd2cSJim Jagielski 	UpdateData();
2526*b1cdbd2cSJim Jagielski 	return 0;
2527*b1cdbd2cSJim Jagielski }
2528*b1cdbd2cSJim Jagielski 
2529*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2530*b1cdbd2cSJim Jagielski 
EnableUpdateData(sal_uLong nTimeout)2531*b1cdbd2cSJim Jagielski void Edit::EnableUpdateData( sal_uLong nTimeout )
2532*b1cdbd2cSJim Jagielski {
2533*b1cdbd2cSJim Jagielski 	if ( !nTimeout )
2534*b1cdbd2cSJim Jagielski 		DisableUpdateData();
2535*b1cdbd2cSJim Jagielski 	else
2536*b1cdbd2cSJim Jagielski 	{
2537*b1cdbd2cSJim Jagielski 		if ( !mpUpdateDataTimer )
2538*b1cdbd2cSJim Jagielski 		{
2539*b1cdbd2cSJim Jagielski 			mpUpdateDataTimer = new Timer;
2540*b1cdbd2cSJim Jagielski 			mpUpdateDataTimer->SetTimeoutHdl( LINK( this, Edit, ImplUpdateDataHdl ) );
2541*b1cdbd2cSJim Jagielski 		}
2542*b1cdbd2cSJim Jagielski 
2543*b1cdbd2cSJim Jagielski 		mpUpdateDataTimer->SetTimeout( nTimeout );
2544*b1cdbd2cSJim Jagielski 	}
2545*b1cdbd2cSJim Jagielski }
2546*b1cdbd2cSJim Jagielski 
2547*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2548*b1cdbd2cSJim Jagielski 
SetEchoChar(xub_Unicode c)2549*b1cdbd2cSJim Jagielski void Edit::SetEchoChar( xub_Unicode c )
2550*b1cdbd2cSJim Jagielski {
2551*b1cdbd2cSJim Jagielski 	mcEchoChar = c;
2552*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2553*b1cdbd2cSJim Jagielski 		mpSubEdit->SetEchoChar( c );
2554*b1cdbd2cSJim Jagielski }
2555*b1cdbd2cSJim Jagielski 
2556*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2557*b1cdbd2cSJim Jagielski 
SetReadOnly(sal_Bool bReadOnly)2558*b1cdbd2cSJim Jagielski void Edit::SetReadOnly( sal_Bool bReadOnly )
2559*b1cdbd2cSJim Jagielski {
2560*b1cdbd2cSJim Jagielski 	if ( mbReadOnly != bReadOnly )
2561*b1cdbd2cSJim Jagielski 	{
2562*b1cdbd2cSJim Jagielski 		mbReadOnly = bReadOnly;
2563*b1cdbd2cSJim Jagielski 		if ( mpSubEdit )
2564*b1cdbd2cSJim Jagielski 			mpSubEdit->SetReadOnly( bReadOnly );
2565*b1cdbd2cSJim Jagielski 
2566*b1cdbd2cSJim Jagielski 		StateChanged( STATE_CHANGE_READONLY );
2567*b1cdbd2cSJim Jagielski 	}
2568*b1cdbd2cSJim Jagielski }
2569*b1cdbd2cSJim Jagielski 
2570*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2571*b1cdbd2cSJim Jagielski 
SetAutocompleteHdl(const Link & rHdl)2572*b1cdbd2cSJim Jagielski void Edit::SetAutocompleteHdl( const Link& rHdl )
2573*b1cdbd2cSJim Jagielski {
2574*b1cdbd2cSJim Jagielski 	maAutocompleteHdl = rHdl;
2575*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2576*b1cdbd2cSJim Jagielski 		mpSubEdit->SetAutocompleteHdl( rHdl );
2577*b1cdbd2cSJim Jagielski }
2578*b1cdbd2cSJim Jagielski 
2579*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2580*b1cdbd2cSJim Jagielski 
SetInsertMode(sal_Bool bInsert)2581*b1cdbd2cSJim Jagielski void Edit::SetInsertMode( sal_Bool bInsert )
2582*b1cdbd2cSJim Jagielski {
2583*b1cdbd2cSJim Jagielski 	if ( bInsert != mbInsertMode )
2584*b1cdbd2cSJim Jagielski 	{
2585*b1cdbd2cSJim Jagielski 		mbInsertMode = bInsert;
2586*b1cdbd2cSJim Jagielski 		if ( mpSubEdit )
2587*b1cdbd2cSJim Jagielski 			mpSubEdit->SetInsertMode( bInsert );
2588*b1cdbd2cSJim Jagielski 		else
2589*b1cdbd2cSJim Jagielski 			ImplShowCursor();
2590*b1cdbd2cSJim Jagielski 	}
2591*b1cdbd2cSJim Jagielski }
2592*b1cdbd2cSJim Jagielski 
2593*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2594*b1cdbd2cSJim Jagielski 
IsInsertMode() const2595*b1cdbd2cSJim Jagielski sal_Bool Edit::IsInsertMode() const
2596*b1cdbd2cSJim Jagielski {
2597*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2598*b1cdbd2cSJim Jagielski 		return mpSubEdit->IsInsertMode();
2599*b1cdbd2cSJim Jagielski 	else
2600*b1cdbd2cSJim Jagielski 		return mbInsertMode;
2601*b1cdbd2cSJim Jagielski }
2602*b1cdbd2cSJim Jagielski 
2603*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2604*b1cdbd2cSJim Jagielski 
SetMaxTextLen(xub_StrLen nMaxLen)2605*b1cdbd2cSJim Jagielski void Edit::SetMaxTextLen( xub_StrLen nMaxLen )
2606*b1cdbd2cSJim Jagielski {
2607*b1cdbd2cSJim Jagielski 	mnMaxTextLen = nMaxLen ? nMaxLen : EDIT_NOLIMIT;
2608*b1cdbd2cSJim Jagielski 
2609*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2610*b1cdbd2cSJim Jagielski 		mpSubEdit->SetMaxTextLen( mnMaxTextLen );
2611*b1cdbd2cSJim Jagielski 	else
2612*b1cdbd2cSJim Jagielski 	{
2613*b1cdbd2cSJim Jagielski 		if ( maText.Len() > mnMaxTextLen )
2614*b1cdbd2cSJim Jagielski 			ImplDelete( Selection( mnMaxTextLen, maText.Len() ), EDIT_DEL_RIGHT, EDIT_DELMODE_SIMPLE );
2615*b1cdbd2cSJim Jagielski 	}
2616*b1cdbd2cSJim Jagielski }
2617*b1cdbd2cSJim Jagielski 
2618*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2619*b1cdbd2cSJim Jagielski 
SetSelection(const Selection & rSelection)2620*b1cdbd2cSJim Jagielski void Edit::SetSelection( const Selection& rSelection )
2621*b1cdbd2cSJim Jagielski {
2622*b1cdbd2cSJim Jagielski 	// Wenn von aussen z.B. im MouseButtonDown die Selektion geaendert wird,
2623*b1cdbd2cSJim Jagielski 	// soll nicht gleich ein Tracking() zuschlagen und die Selektion aendern.
2624*b1cdbd2cSJim Jagielski 	if ( IsTracking() )
2625*b1cdbd2cSJim Jagielski 		EndTracking();
2626*b1cdbd2cSJim Jagielski 	else if ( mpSubEdit && mpSubEdit->IsTracking() )
2627*b1cdbd2cSJim Jagielski 		mpSubEdit->EndTracking();
2628*b1cdbd2cSJim Jagielski 
2629*b1cdbd2cSJim Jagielski 	ImplSetSelection( rSelection );
2630*b1cdbd2cSJim Jagielski }
2631*b1cdbd2cSJim Jagielski 
2632*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2633*b1cdbd2cSJim Jagielski 
ImplSetSelection(const Selection & rSelection,sal_Bool bPaint)2634*b1cdbd2cSJim Jagielski void Edit::ImplSetSelection( const Selection& rSelection, sal_Bool bPaint )
2635*b1cdbd2cSJim Jagielski {
2636*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2637*b1cdbd2cSJim Jagielski 		mpSubEdit->ImplSetSelection( rSelection );
2638*b1cdbd2cSJim Jagielski 	else
2639*b1cdbd2cSJim Jagielski 	{
2640*b1cdbd2cSJim Jagielski 		if ( rSelection != maSelection )
2641*b1cdbd2cSJim Jagielski 		{
2642*b1cdbd2cSJim Jagielski 			Selection aOld( maSelection );
2643*b1cdbd2cSJim Jagielski 			Selection aNew( rSelection );
2644*b1cdbd2cSJim Jagielski 
2645*b1cdbd2cSJim Jagielski 			if ( aNew.Min() > maText.Len() )
2646*b1cdbd2cSJim Jagielski 				aNew.Min() = maText.Len();
2647*b1cdbd2cSJim Jagielski 			if ( aNew.Max() > maText.Len() )
2648*b1cdbd2cSJim Jagielski 				aNew.Max() = maText.Len();
2649*b1cdbd2cSJim Jagielski 			if ( aNew.Min() < 0 )
2650*b1cdbd2cSJim Jagielski 				aNew.Min() = 0;
2651*b1cdbd2cSJim Jagielski 			if ( aNew.Max() < 0 )
2652*b1cdbd2cSJim Jagielski 				aNew.Max() = 0;
2653*b1cdbd2cSJim Jagielski 
2654*b1cdbd2cSJim Jagielski 			if ( aNew != maSelection )
2655*b1cdbd2cSJim Jagielski 			{
2656*b1cdbd2cSJim Jagielski                 ImplClearLayoutData();
2657*b1cdbd2cSJim Jagielski 				Selection aTemp = maSelection;
2658*b1cdbd2cSJim Jagielski 				maSelection = aNew;
2659*b1cdbd2cSJim Jagielski 
2660*b1cdbd2cSJim Jagielski 				if ( bPaint && ( aOld.Len() || aNew.Len() || IsPaintTransparent() ) )
2661*b1cdbd2cSJim Jagielski                     ImplInvalidateOrRepaint( 0, maText.Len() );
2662*b1cdbd2cSJim Jagielski 				ImplShowCursor();
2663*b1cdbd2cSJim Jagielski 				sal_Bool bCaret = sal_False, bSelection = sal_False;
2664*b1cdbd2cSJim Jagielski 				long nB=aNew.Max(), nA=aNew.Min(),oB=aTemp.Max(), oA=aTemp.Min();
2665*b1cdbd2cSJim Jagielski 				long nGap = nB-nA, oGap = oB-oA;
2666*b1cdbd2cSJim Jagielski 				if (nB != oB)
2667*b1cdbd2cSJim Jagielski 					bCaret = sal_True;
2668*b1cdbd2cSJim Jagielski 				if (nGap != 0 || oGap != 0)
2669*b1cdbd2cSJim Jagielski 					bSelection = sal_True;
2670*b1cdbd2cSJim Jagielski 				if (bCaret)
2671*b1cdbd2cSJim Jagielski 				{
2672*b1cdbd2cSJim Jagielski 					if ( mbIsSubEdit )
2673*b1cdbd2cSJim Jagielski 						((Edit*)GetParent())->ImplCallEventListeners( VCLEVENT_EDIT_CARETCHANGED );
2674*b1cdbd2cSJim Jagielski 					else
2675*b1cdbd2cSJim Jagielski 						ImplCallEventListeners( VCLEVENT_EDIT_CARETCHANGED );
2676*b1cdbd2cSJim Jagielski 				}
2677*b1cdbd2cSJim Jagielski 				if (bSelection)
2678*b1cdbd2cSJim Jagielski 				{
2679*b1cdbd2cSJim Jagielski 					if ( mbIsSubEdit )
2680*b1cdbd2cSJim Jagielski 						((Edit*)GetParent())->ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
2681*b1cdbd2cSJim Jagielski 					else
2682*b1cdbd2cSJim Jagielski 						ImplCallEventListeners( VCLEVENT_EDIT_SELECTIONCHANGED );
2683*b1cdbd2cSJim Jagielski 				}
2684*b1cdbd2cSJim Jagielski                 // #103511# notify combobox listeners of deselection
2685*b1cdbd2cSJim Jagielski                 if( !maSelection && GetParent() && GetParent()->GetType() == WINDOW_COMBOBOX )
2686*b1cdbd2cSJim Jagielski                     ((Edit*)GetParent())->ImplCallEventListeners( VCLEVENT_COMBOBOX_DESELECT );
2687*b1cdbd2cSJim Jagielski 			}
2688*b1cdbd2cSJim Jagielski 		}
2689*b1cdbd2cSJim Jagielski 	}
2690*b1cdbd2cSJim Jagielski }
2691*b1cdbd2cSJim Jagielski 
2692*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2693*b1cdbd2cSJim Jagielski 
GetSelection() const2694*b1cdbd2cSJim Jagielski const Selection& Edit::GetSelection() const
2695*b1cdbd2cSJim Jagielski {
2696*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2697*b1cdbd2cSJim Jagielski 		return mpSubEdit->GetSelection();
2698*b1cdbd2cSJim Jagielski 	else
2699*b1cdbd2cSJim Jagielski 		return maSelection;
2700*b1cdbd2cSJim Jagielski }
2701*b1cdbd2cSJim Jagielski 
2702*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2703*b1cdbd2cSJim Jagielski 
ReplaceSelected(const XubString & rStr)2704*b1cdbd2cSJim Jagielski void Edit::ReplaceSelected( const XubString& rStr )
2705*b1cdbd2cSJim Jagielski {
2706*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2707*b1cdbd2cSJim Jagielski 		mpSubEdit->ReplaceSelected( rStr );
2708*b1cdbd2cSJim Jagielski 	else
2709*b1cdbd2cSJim Jagielski 		ImplInsertText( rStr );
2710*b1cdbd2cSJim Jagielski }
2711*b1cdbd2cSJim Jagielski 
2712*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2713*b1cdbd2cSJim Jagielski 
DeleteSelected()2714*b1cdbd2cSJim Jagielski void Edit::DeleteSelected()
2715*b1cdbd2cSJim Jagielski {
2716*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2717*b1cdbd2cSJim Jagielski 		mpSubEdit->DeleteSelected();
2718*b1cdbd2cSJim Jagielski 	else
2719*b1cdbd2cSJim Jagielski 	{
2720*b1cdbd2cSJim Jagielski 		if ( maSelection.Len() )
2721*b1cdbd2cSJim Jagielski 			ImplDelete( maSelection, EDIT_DEL_RIGHT, EDIT_DELMODE_SIMPLE );
2722*b1cdbd2cSJim Jagielski 	}
2723*b1cdbd2cSJim Jagielski }
2724*b1cdbd2cSJim Jagielski 
2725*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2726*b1cdbd2cSJim Jagielski 
GetSelected() const2727*b1cdbd2cSJim Jagielski XubString Edit::GetSelected() const
2728*b1cdbd2cSJim Jagielski {
2729*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2730*b1cdbd2cSJim Jagielski 		return mpSubEdit->GetSelected();
2731*b1cdbd2cSJim Jagielski 	else
2732*b1cdbd2cSJim Jagielski 	{
2733*b1cdbd2cSJim Jagielski 		Selection aSelection( maSelection );
2734*b1cdbd2cSJim Jagielski 		aSelection.Justify();
2735*b1cdbd2cSJim Jagielski 		return maText.Copy( (xub_StrLen)aSelection.Min(), (xub_StrLen)aSelection.Len() );
2736*b1cdbd2cSJim Jagielski 	}
2737*b1cdbd2cSJim Jagielski }
2738*b1cdbd2cSJim Jagielski 
2739*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2740*b1cdbd2cSJim Jagielski 
Cut()2741*b1cdbd2cSJim Jagielski void Edit::Cut()
2742*b1cdbd2cSJim Jagielski {
2743*b1cdbd2cSJim Jagielski 	if ( !(GetStyle() & WB_PASSWORD ) )
2744*b1cdbd2cSJim Jagielski 	{
2745*b1cdbd2cSJim Jagielski 		Copy();
2746*b1cdbd2cSJim Jagielski 		ReplaceSelected( ImplGetSVEmptyStr() );
2747*b1cdbd2cSJim Jagielski 	}
2748*b1cdbd2cSJim Jagielski }
2749*b1cdbd2cSJim Jagielski 
2750*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2751*b1cdbd2cSJim Jagielski 
Copy()2752*b1cdbd2cSJim Jagielski void Edit::Copy()
2753*b1cdbd2cSJim Jagielski {
2754*b1cdbd2cSJim Jagielski 	if ( !(GetStyle() & WB_PASSWORD ) )
2755*b1cdbd2cSJim Jagielski 	{
2756*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipboard(GetClipboard());
2757*b1cdbd2cSJim Jagielski         ImplCopy( aClipboard );
2758*b1cdbd2cSJim Jagielski 	}
2759*b1cdbd2cSJim Jagielski }
2760*b1cdbd2cSJim Jagielski 
2761*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2762*b1cdbd2cSJim Jagielski 
Paste()2763*b1cdbd2cSJim Jagielski void Edit::Paste()
2764*b1cdbd2cSJim Jagielski {
2765*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipboard(GetClipboard());
2766*b1cdbd2cSJim Jagielski     ImplPaste( aClipboard );
2767*b1cdbd2cSJim Jagielski }
2768*b1cdbd2cSJim Jagielski 
2769*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2770*b1cdbd2cSJim Jagielski 
Undo()2771*b1cdbd2cSJim Jagielski void Edit::Undo()
2772*b1cdbd2cSJim Jagielski {
2773*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2774*b1cdbd2cSJim Jagielski 		mpSubEdit->Undo();
2775*b1cdbd2cSJim Jagielski 	else
2776*b1cdbd2cSJim Jagielski 	{
2777*b1cdbd2cSJim Jagielski 		XubString aText( maText );
2778*b1cdbd2cSJim Jagielski 		ImplDelete( Selection( 0, aText.Len() ), EDIT_DEL_RIGHT, EDIT_DELMODE_SIMPLE );
2779*b1cdbd2cSJim Jagielski 		ImplInsertText( maUndoText );
2780*b1cdbd2cSJim Jagielski 		ImplSetSelection( Selection( 0, maUndoText.Len() ) );
2781*b1cdbd2cSJim Jagielski 		maUndoText = aText;
2782*b1cdbd2cSJim Jagielski 	}
2783*b1cdbd2cSJim Jagielski }
2784*b1cdbd2cSJim Jagielski 
2785*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2786*b1cdbd2cSJim Jagielski 
SetText(const XubString & rStr)2787*b1cdbd2cSJim Jagielski void Edit::SetText( const XubString& rStr )
2788*b1cdbd2cSJim Jagielski {
2789*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2790*b1cdbd2cSJim Jagielski 		mpSubEdit->SetText( rStr ); 	// Nicht direkt ImplSetText, falls SetText ueberladen
2791*b1cdbd2cSJim Jagielski 	else
2792*b1cdbd2cSJim Jagielski 	{
2793*b1cdbd2cSJim Jagielski 		Selection aNewSel( 0, 0 );	// Damit nicht gescrollt wird
2794*b1cdbd2cSJim Jagielski 		ImplSetText( rStr, &aNewSel );
2795*b1cdbd2cSJim Jagielski 	}
2796*b1cdbd2cSJim Jagielski }
2797*b1cdbd2cSJim Jagielski 
2798*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2799*b1cdbd2cSJim Jagielski 
SetText(const XubString & rStr,const Selection & rSelection)2800*b1cdbd2cSJim Jagielski void Edit::SetText( const XubString& rStr, const Selection& rSelection )
2801*b1cdbd2cSJim Jagielski {
2802*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2803*b1cdbd2cSJim Jagielski 		mpSubEdit->SetText( rStr, rSelection );
2804*b1cdbd2cSJim Jagielski 	else
2805*b1cdbd2cSJim Jagielski 		ImplSetText( rStr, &rSelection );
2806*b1cdbd2cSJim Jagielski }
2807*b1cdbd2cSJim Jagielski 
2808*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2809*b1cdbd2cSJim Jagielski 
GetText() const2810*b1cdbd2cSJim Jagielski XubString Edit::GetText() const
2811*b1cdbd2cSJim Jagielski {
2812*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2813*b1cdbd2cSJim Jagielski 		return mpSubEdit->GetText();
2814*b1cdbd2cSJim Jagielski 	else
2815*b1cdbd2cSJim Jagielski 		return maText;
2816*b1cdbd2cSJim Jagielski }
2817*b1cdbd2cSJim Jagielski 
2818*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2819*b1cdbd2cSJim Jagielski 
SetModifyFlag()2820*b1cdbd2cSJim Jagielski void Edit::SetModifyFlag()
2821*b1cdbd2cSJim Jagielski {
2822*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2823*b1cdbd2cSJim Jagielski 		mpSubEdit->mbModified = sal_True;
2824*b1cdbd2cSJim Jagielski 	else
2825*b1cdbd2cSJim Jagielski 		mbModified = sal_True;
2826*b1cdbd2cSJim Jagielski }
2827*b1cdbd2cSJim Jagielski 
2828*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2829*b1cdbd2cSJim Jagielski 
ClearModifyFlag()2830*b1cdbd2cSJim Jagielski void Edit::ClearModifyFlag()
2831*b1cdbd2cSJim Jagielski {
2832*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2833*b1cdbd2cSJim Jagielski 		mpSubEdit->mbModified = sal_False;
2834*b1cdbd2cSJim Jagielski 	else
2835*b1cdbd2cSJim Jagielski 		mbModified = sal_False;
2836*b1cdbd2cSJim Jagielski }
2837*b1cdbd2cSJim Jagielski 
2838*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2839*b1cdbd2cSJim Jagielski 
SetSubEdit(Edit * pEdit)2840*b1cdbd2cSJim Jagielski void Edit::SetSubEdit( Edit* pEdit )
2841*b1cdbd2cSJim Jagielski {
2842*b1cdbd2cSJim Jagielski 	mpSubEdit = pEdit;
2843*b1cdbd2cSJim Jagielski 	if ( mpSubEdit )
2844*b1cdbd2cSJim Jagielski 	{
2845*b1cdbd2cSJim Jagielski 		SetPointer( POINTER_ARROW );	// Nur das SubEdit hat den BEAM...
2846*b1cdbd2cSJim Jagielski 		mpSubEdit->mbIsSubEdit = sal_True;
2847*b1cdbd2cSJim Jagielski 
2848*b1cdbd2cSJim Jagielski         mpSubEdit->SetReadOnly( mbReadOnly );
2849*b1cdbd2cSJim Jagielski 	}
2850*b1cdbd2cSJim Jagielski }
2851*b1cdbd2cSJim Jagielski 
2852*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2853*b1cdbd2cSJim Jagielski 
CalcMinimumSize() const2854*b1cdbd2cSJim Jagielski Size Edit::CalcMinimumSize() const
2855*b1cdbd2cSJim Jagielski {
2856*b1cdbd2cSJim Jagielski 	Size aSize ( GetTextWidth( GetText() ), GetTextHeight() );
2857*b1cdbd2cSJim Jagielski     // do not create edit fields in which one cannot enter anything
2858*b1cdbd2cSJim Jagielski     // a default minimum width should exist for at least 3 characters
2859*b1cdbd2cSJim Jagielski     Size aMinSize ( CalcSize( 3 ) );
2860*b1cdbd2cSJim Jagielski     if( aSize.Width() < aMinSize.Width() )
2861*b1cdbd2cSJim Jagielski         aSize.Width() = aMinSize.Width();
2862*b1cdbd2cSJim Jagielski     // add some space between text entry and border
2863*b1cdbd2cSJim Jagielski     aSize.Height() += 4;
2864*b1cdbd2cSJim Jagielski 
2865*b1cdbd2cSJim Jagielski 	aSize = CalcWindowSize( aSize );
2866*b1cdbd2cSJim Jagielski 
2867*b1cdbd2cSJim Jagielski     // ask NWF what if it has an opinion, too
2868*b1cdbd2cSJim Jagielski     ImplControlValue aControlValue;
2869*b1cdbd2cSJim Jagielski     Rectangle aRect( Point( 0, 0 ), aSize );
2870*b1cdbd2cSJim Jagielski     Rectangle aContent, aBound;
2871*b1cdbd2cSJim Jagielski     if( const_cast<Edit*>(this)->GetNativeControlRegion(
2872*b1cdbd2cSJim Jagielski                    CTRL_EDITBOX, PART_ENTIRE_CONTROL,
2873*b1cdbd2cSJim Jagielski                    aRect, 0, aControlValue, rtl::OUString(), aBound, aContent) )
2874*b1cdbd2cSJim Jagielski     {
2875*b1cdbd2cSJim Jagielski         if( aBound.GetHeight() > aSize.Height() )
2876*b1cdbd2cSJim Jagielski             aSize.Height() = aBound.GetHeight();
2877*b1cdbd2cSJim Jagielski     }
2878*b1cdbd2cSJim Jagielski     return aSize;
2879*b1cdbd2cSJim Jagielski }
2880*b1cdbd2cSJim Jagielski 
GetMinimumEditSize()2881*b1cdbd2cSJim Jagielski Size Edit::GetMinimumEditSize()
2882*b1cdbd2cSJim Jagielski {
2883*b1cdbd2cSJim Jagielski     Window* pDefWin = ImplGetDefaultWindow();
2884*b1cdbd2cSJim Jagielski     Edit aEdit( pDefWin, WB_BORDER );
2885*b1cdbd2cSJim Jagielski     Size aSize( aEdit.CalcMinimumSize() );
2886*b1cdbd2cSJim Jagielski     return aSize;
2887*b1cdbd2cSJim Jagielski }
2888*b1cdbd2cSJim Jagielski 
2889*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2890*b1cdbd2cSJim Jagielski 
GetOptimalSize(WindowSizeType eType) const2891*b1cdbd2cSJim Jagielski Size Edit::GetOptimalSize(WindowSizeType eType) const
2892*b1cdbd2cSJim Jagielski {
2893*b1cdbd2cSJim Jagielski     switch (eType) {
2894*b1cdbd2cSJim Jagielski     case WINDOWSIZE_MINIMUM:
2895*b1cdbd2cSJim Jagielski         return CalcMinimumSize();
2896*b1cdbd2cSJim Jagielski     default:
2897*b1cdbd2cSJim Jagielski         return Control::GetOptimalSize( eType );
2898*b1cdbd2cSJim Jagielski     }
2899*b1cdbd2cSJim Jagielski }
2900*b1cdbd2cSJim Jagielski 
2901*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2902*b1cdbd2cSJim Jagielski 
CalcSize(xub_StrLen nChars) const2903*b1cdbd2cSJim Jagielski Size Edit::CalcSize( xub_StrLen nChars ) const
2904*b1cdbd2cSJim Jagielski {
2905*b1cdbd2cSJim Jagielski 	// Breite fuer n Zeichen, unabhaengig vom Inhalt.
2906*b1cdbd2cSJim Jagielski 	// Funktioniert nur bei FixedFont richtig, sonst Mittelwert.
2907*b1cdbd2cSJim Jagielski 	Size aSz( GetTextWidth( XubString( 'x' ) ), GetTextHeight() );
2908*b1cdbd2cSJim Jagielski 	aSz.Width() *= nChars;
2909*b1cdbd2cSJim Jagielski 	aSz = CalcWindowSize( aSz );
2910*b1cdbd2cSJim Jagielski 	return aSz;
2911*b1cdbd2cSJim Jagielski }
2912*b1cdbd2cSJim Jagielski 
2913*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2914*b1cdbd2cSJim Jagielski 
GetMaxVisChars() const2915*b1cdbd2cSJim Jagielski xub_StrLen Edit::GetMaxVisChars() const
2916*b1cdbd2cSJim Jagielski {
2917*b1cdbd2cSJim Jagielski 	const Window* pW = mpSubEdit ? mpSubEdit : this;
2918*b1cdbd2cSJim Jagielski 	long nOutWidth = pW->GetOutputSizePixel().Width();
2919*b1cdbd2cSJim Jagielski 	long nCharWidth = GetTextWidth( XubString( 'x' ) );
2920*b1cdbd2cSJim Jagielski 	return nCharWidth ? (xub_StrLen)(nOutWidth/nCharWidth) : 0;
2921*b1cdbd2cSJim Jagielski }
2922*b1cdbd2cSJim Jagielski 
2923*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2924*b1cdbd2cSJim Jagielski 
GetCharPos(const Point & rWindowPos) const2925*b1cdbd2cSJim Jagielski xub_StrLen Edit::GetCharPos( const Point& rWindowPos ) const
2926*b1cdbd2cSJim Jagielski {
2927*b1cdbd2cSJim Jagielski     return ImplGetCharPos( rWindowPos );
2928*b1cdbd2cSJim Jagielski }
2929*b1cdbd2cSJim Jagielski 
2930*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2931*b1cdbd2cSJim Jagielski 
SetGetSpecialCharsFunction(FncGetSpecialChars fn)2932*b1cdbd2cSJim Jagielski void Edit::SetGetSpecialCharsFunction( FncGetSpecialChars fn )
2933*b1cdbd2cSJim Jagielski {
2934*b1cdbd2cSJim Jagielski 	pImplFncGetSpecialChars = fn;
2935*b1cdbd2cSJim Jagielski }
2936*b1cdbd2cSJim Jagielski 
2937*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2938*b1cdbd2cSJim Jagielski 
GetGetSpecialCharsFunction()2939*b1cdbd2cSJim Jagielski FncGetSpecialChars Edit::GetGetSpecialCharsFunction()
2940*b1cdbd2cSJim Jagielski {
2941*b1cdbd2cSJim Jagielski 	return pImplFncGetSpecialChars;
2942*b1cdbd2cSJim Jagielski }
2943*b1cdbd2cSJim Jagielski 
2944*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2945*b1cdbd2cSJim Jagielski 
CreatePopupMenu()2946*b1cdbd2cSJim Jagielski PopupMenu* Edit::CreatePopupMenu()
2947*b1cdbd2cSJim Jagielski {
2948*b1cdbd2cSJim Jagielski     ResMgr* pResMgr = ImplGetResMgr();
2949*b1cdbd2cSJim Jagielski     if( ! pResMgr )
2950*b1cdbd2cSJim Jagielski         return new PopupMenu();
2951*b1cdbd2cSJim Jagielski 
2952*b1cdbd2cSJim Jagielski 	PopupMenu* pPopup = new PopupMenu( ResId( SV_RESID_MENU_EDIT, *pResMgr ) );
2953*b1cdbd2cSJim Jagielski 	pPopup->SetAccelKey( SV_MENU_EDIT_UNDO, KeyCode( KEYFUNC_UNDO ) );
2954*b1cdbd2cSJim Jagielski 	pPopup->SetAccelKey( SV_MENU_EDIT_CUT, KeyCode( KEYFUNC_CUT ) );
2955*b1cdbd2cSJim Jagielski 	pPopup->SetAccelKey( SV_MENU_EDIT_COPY, KeyCode( KEYFUNC_COPY ) );
2956*b1cdbd2cSJim Jagielski 	pPopup->SetAccelKey( SV_MENU_EDIT_PASTE, KeyCode( KEYFUNC_PASTE ) );
2957*b1cdbd2cSJim Jagielski 	pPopup->SetAccelKey( SV_MENU_EDIT_DELETE, KeyCode( KEYFUNC_DELETE ) );
2958*b1cdbd2cSJim Jagielski 	pPopup->SetAccelKey( SV_MENU_EDIT_SELECTALL, KeyCode( KEY_A, sal_False, sal_True, sal_False, sal_False ) );
2959*b1cdbd2cSJim Jagielski 	pPopup->SetAccelKey( SV_MENU_EDIT_INSERTSYMBOL, KeyCode( KEY_S, sal_True, sal_True, sal_False, sal_False ) );
2960*b1cdbd2cSJim Jagielski 	return pPopup;
2961*b1cdbd2cSJim Jagielski }
2962*b1cdbd2cSJim Jagielski 
2963*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
2964*b1cdbd2cSJim Jagielski 
DeletePopupMenu(PopupMenu * pMenu)2965*b1cdbd2cSJim Jagielski void Edit::DeletePopupMenu( PopupMenu* pMenu )
2966*b1cdbd2cSJim Jagielski {
2967*b1cdbd2cSJim Jagielski 	delete pMenu;
2968*b1cdbd2cSJim Jagielski }
2969*b1cdbd2cSJim Jagielski 
2970*b1cdbd2cSJim Jagielski // ::com::sun::star::datatransfer::dnd::XDragGestureListener
dragGestureRecognized(const::com::sun::star::datatransfer::dnd::DragGestureEvent & rDGE)2971*b1cdbd2cSJim Jagielski void Edit::dragGestureRecognized( const ::com::sun::star::datatransfer::dnd::DragGestureEvent& rDGE ) throw (::com::sun::star::uno::RuntimeException)
2972*b1cdbd2cSJim Jagielski {
2973*b1cdbd2cSJim Jagielski 	vos::OGuard aVclGuard( Application::GetSolarMutex() );
2974*b1cdbd2cSJim Jagielski 
2975*b1cdbd2cSJim Jagielski     if ( !IsTracking() && maSelection.Len() &&
2976*b1cdbd2cSJim Jagielski 		 !(GetStyle() & WB_PASSWORD) && (!mpDDInfo || mpDDInfo->bStarterOfDD == sal_False) ) // Kein Mehrfach D&D
2977*b1cdbd2cSJim Jagielski 	{
2978*b1cdbd2cSJim Jagielski 		Selection aSel( maSelection );
2979*b1cdbd2cSJim Jagielski 		aSel.Justify();
2980*b1cdbd2cSJim Jagielski 
2981*b1cdbd2cSJim Jagielski 		// Nur wenn Maus in der Selektion...
2982*b1cdbd2cSJim Jagielski 		Point aMousePos( rDGE.DragOriginX, rDGE.DragOriginY );
2983*b1cdbd2cSJim Jagielski 		xub_StrLen nChar = ImplGetCharPos( aMousePos );
2984*b1cdbd2cSJim Jagielski 		if ( (nChar >= aSel.Min()) && (nChar < aSel.Max()) )
2985*b1cdbd2cSJim Jagielski 		{
2986*b1cdbd2cSJim Jagielski 			if ( !mpDDInfo )
2987*b1cdbd2cSJim Jagielski 				mpDDInfo = new DDInfo;
2988*b1cdbd2cSJim Jagielski 
2989*b1cdbd2cSJim Jagielski 			mpDDInfo->bStarterOfDD = sal_True;
2990*b1cdbd2cSJim Jagielski             mpDDInfo->aDndStartSel = aSel;
2991*b1cdbd2cSJim Jagielski 
2992*b1cdbd2cSJim Jagielski 
2993*b1cdbd2cSJim Jagielski 			if ( IsTracking() )
2994*b1cdbd2cSJim Jagielski 				EndTracking();	// Vor D&D Tracking ausschalten
2995*b1cdbd2cSJim Jagielski 
2996*b1cdbd2cSJim Jagielski             ::vcl::unohelper::TextDataObject* pDataObj = new ::vcl::unohelper::TextDataObject( GetSelected() );
2997*b1cdbd2cSJim Jagielski             sal_Int8 nActions = datatransfer::dnd::DNDConstants::ACTION_COPY;
2998*b1cdbd2cSJim Jagielski             if ( !IsReadOnly() )
2999*b1cdbd2cSJim Jagielski                 nActions |= datatransfer::dnd::DNDConstants::ACTION_MOVE;
3000*b1cdbd2cSJim Jagielski             rDGE.DragSource->startDrag( rDGE, nActions, 0 /*cursor*/, 0 /*image*/, pDataObj, mxDnDListener );
3001*b1cdbd2cSJim Jagielski 			if ( GetCursor() )
3002*b1cdbd2cSJim Jagielski 				GetCursor()->Hide();
3003*b1cdbd2cSJim Jagielski 
3004*b1cdbd2cSJim Jagielski 		}
3005*b1cdbd2cSJim Jagielski 	}
3006*b1cdbd2cSJim Jagielski }
3007*b1cdbd2cSJim Jagielski 
3008*b1cdbd2cSJim Jagielski // ::com::sun::star::datatransfer::dnd::XDragSourceListener
dragDropEnd(const::com::sun::star::datatransfer::dnd::DragSourceDropEvent & rDSDE)3009*b1cdbd2cSJim Jagielski void Edit::dragDropEnd( const ::com::sun::star::datatransfer::dnd::DragSourceDropEvent& rDSDE ) throw (::com::sun::star::uno::RuntimeException)
3010*b1cdbd2cSJim Jagielski {
3011*b1cdbd2cSJim Jagielski 	vos::OGuard aVclGuard( Application::GetSolarMutex() );
3012*b1cdbd2cSJim Jagielski 
3013*b1cdbd2cSJim Jagielski 	if ( rDSDE.DropSuccess && ( rDSDE.DropAction & datatransfer::dnd::DNDConstants::ACTION_MOVE ) )
3014*b1cdbd2cSJim Jagielski 	{
3015*b1cdbd2cSJim Jagielski         Selection aSel( mpDDInfo->aDndStartSel );
3016*b1cdbd2cSJim Jagielski 		if ( mpDDInfo->bDroppedInMe )
3017*b1cdbd2cSJim Jagielski 		{
3018*b1cdbd2cSJim Jagielski 			if ( aSel.Max() > mpDDInfo->nDropPos )
3019*b1cdbd2cSJim Jagielski 			{
3020*b1cdbd2cSJim Jagielski 				long nLen = aSel.Len();
3021*b1cdbd2cSJim Jagielski 				aSel.Min() += nLen;
3022*b1cdbd2cSJim Jagielski 				aSel.Max() += nLen;
3023*b1cdbd2cSJim Jagielski 			}
3024*b1cdbd2cSJim Jagielski 		}
3025*b1cdbd2cSJim Jagielski 		ImplDelete( aSel, EDIT_DEL_RIGHT, EDIT_DELMODE_SIMPLE );
3026*b1cdbd2cSJim Jagielski 		ImplModified();
3027*b1cdbd2cSJim Jagielski 	}
3028*b1cdbd2cSJim Jagielski 
3029*b1cdbd2cSJim Jagielski 	ImplHideDDCursor();
3030*b1cdbd2cSJim Jagielski 	delete mpDDInfo;
3031*b1cdbd2cSJim Jagielski 	mpDDInfo = NULL;
3032*b1cdbd2cSJim Jagielski }
3033*b1cdbd2cSJim Jagielski 
3034*b1cdbd2cSJim Jagielski // ::com::sun::star::datatransfer::dnd::XDropTargetListener
drop(const::com::sun::star::datatransfer::dnd::DropTargetDropEvent & rDTDE)3035*b1cdbd2cSJim Jagielski void Edit::drop( const ::com::sun::star::datatransfer::dnd::DropTargetDropEvent& rDTDE ) throw (::com::sun::star::uno::RuntimeException)
3036*b1cdbd2cSJim Jagielski {
3037*b1cdbd2cSJim Jagielski 	vos::OGuard aVclGuard( Application::GetSolarMutex() );
3038*b1cdbd2cSJim Jagielski 
3039*b1cdbd2cSJim Jagielski 	sal_Bool bChanges = sal_False;
3040*b1cdbd2cSJim Jagielski 	if ( !mbReadOnly && mpDDInfo )
3041*b1cdbd2cSJim Jagielski 	{
3042*b1cdbd2cSJim Jagielski 		ImplHideDDCursor();
3043*b1cdbd2cSJim Jagielski 
3044*b1cdbd2cSJim Jagielski 		Selection aSel( maSelection );
3045*b1cdbd2cSJim Jagielski 		aSel.Justify();
3046*b1cdbd2cSJim Jagielski 
3047*b1cdbd2cSJim Jagielski 		if ( aSel.Len() && !mpDDInfo->bStarterOfDD )
3048*b1cdbd2cSJim Jagielski 			ImplDelete( aSel, EDIT_DEL_RIGHT, EDIT_DELMODE_SIMPLE );
3049*b1cdbd2cSJim Jagielski 
3050*b1cdbd2cSJim Jagielski 		mpDDInfo->bDroppedInMe = sal_True;
3051*b1cdbd2cSJim Jagielski 
3052*b1cdbd2cSJim Jagielski 		aSel.Min() = mpDDInfo->nDropPos;
3053*b1cdbd2cSJim Jagielski 		aSel.Max() = mpDDInfo->nDropPos;
3054*b1cdbd2cSJim Jagielski 		ImplSetSelection( aSel );
3055*b1cdbd2cSJim Jagielski 
3056*b1cdbd2cSJim Jagielski 		uno::Reference< datatransfer::XTransferable > xDataObj = rDTDE.Transferable;
3057*b1cdbd2cSJim Jagielski 		if ( xDataObj.is() )
3058*b1cdbd2cSJim Jagielski 		{
3059*b1cdbd2cSJim Jagielski 			datatransfer::DataFlavor aFlavor;
3060*b1cdbd2cSJim Jagielski 			SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
3061*b1cdbd2cSJim Jagielski 			if ( xDataObj->isDataFlavorSupported( aFlavor ) )
3062*b1cdbd2cSJim Jagielski 			{
3063*b1cdbd2cSJim Jagielski 				uno::Any aData = xDataObj->getTransferData( aFlavor );
3064*b1cdbd2cSJim Jagielski 				::rtl::OUString aText;
3065*b1cdbd2cSJim Jagielski 				aData >>= aText;
3066*b1cdbd2cSJim Jagielski 			    ImplInsertText( aText );
3067*b1cdbd2cSJim Jagielski                 bChanges = sal_True;
3068*b1cdbd2cSJim Jagielski 		        ImplModified();
3069*b1cdbd2cSJim Jagielski 			}
3070*b1cdbd2cSJim Jagielski 		}
3071*b1cdbd2cSJim Jagielski 
3072*b1cdbd2cSJim Jagielski 		if ( !mpDDInfo->bStarterOfDD )
3073*b1cdbd2cSJim Jagielski 		{
3074*b1cdbd2cSJim Jagielski 			delete mpDDInfo;
3075*b1cdbd2cSJim Jagielski 			mpDDInfo = NULL;
3076*b1cdbd2cSJim Jagielski 		}
3077*b1cdbd2cSJim Jagielski 	}
3078*b1cdbd2cSJim Jagielski 
3079*b1cdbd2cSJim Jagielski     rDTDE.Context->dropComplete( bChanges );
3080*b1cdbd2cSJim Jagielski }
3081*b1cdbd2cSJim Jagielski 
dragEnter(const::com::sun::star::datatransfer::dnd::DropTargetDragEnterEvent & rDTDE)3082*b1cdbd2cSJim Jagielski void Edit::dragEnter( const ::com::sun::star::datatransfer::dnd::DropTargetDragEnterEvent& rDTDE ) throw (::com::sun::star::uno::RuntimeException)
3083*b1cdbd2cSJim Jagielski {
3084*b1cdbd2cSJim Jagielski     if ( !mpDDInfo )
3085*b1cdbd2cSJim Jagielski     {
3086*b1cdbd2cSJim Jagielski 		mpDDInfo = new DDInfo;
3087*b1cdbd2cSJim Jagielski     }
3088*b1cdbd2cSJim Jagielski     // search for string data type
3089*b1cdbd2cSJim Jagielski     const Sequence< com::sun::star::datatransfer::DataFlavor >& rFlavors( rDTDE.SupportedDataFlavors );
3090*b1cdbd2cSJim Jagielski     sal_Int32 nEle = rFlavors.getLength();
3091*b1cdbd2cSJim Jagielski     mpDDInfo->bIsStringSupported = sal_False;
3092*b1cdbd2cSJim Jagielski     for( sal_Int32 i = 0; i < nEle; i++ )
3093*b1cdbd2cSJim Jagielski     {
3094*b1cdbd2cSJim Jagielski         sal_Int32 nIndex = 0;
3095*b1cdbd2cSJim Jagielski         rtl::OUString aMimetype = rFlavors[i].MimeType.getToken( 0, ';', nIndex );
3096*b1cdbd2cSJim Jagielski         if( aMimetype.equalsAscii( "text/plain" ) )
3097*b1cdbd2cSJim Jagielski         {
3098*b1cdbd2cSJim Jagielski             mpDDInfo->bIsStringSupported = sal_True;
3099*b1cdbd2cSJim Jagielski             break;
3100*b1cdbd2cSJim Jagielski         }
3101*b1cdbd2cSJim Jagielski     }
3102*b1cdbd2cSJim Jagielski }
3103*b1cdbd2cSJim Jagielski 
dragExit(const::com::sun::star::datatransfer::dnd::DropTargetEvent &)3104*b1cdbd2cSJim Jagielski void Edit::dragExit( const ::com::sun::star::datatransfer::dnd::DropTargetEvent& ) throw (::com::sun::star::uno::RuntimeException)
3105*b1cdbd2cSJim Jagielski {
3106*b1cdbd2cSJim Jagielski 	vos::OGuard aVclGuard( Application::GetSolarMutex() );
3107*b1cdbd2cSJim Jagielski 
3108*b1cdbd2cSJim Jagielski     ImplHideDDCursor();
3109*b1cdbd2cSJim Jagielski }
3110*b1cdbd2cSJim Jagielski 
dragOver(const::com::sun::star::datatransfer::dnd::DropTargetDragEvent & rDTDE)3111*b1cdbd2cSJim Jagielski void Edit::dragOver( const ::com::sun::star::datatransfer::dnd::DropTargetDragEvent& rDTDE ) throw (::com::sun::star::uno::RuntimeException)
3112*b1cdbd2cSJim Jagielski {
3113*b1cdbd2cSJim Jagielski 	vos::OGuard aVclGuard( Application::GetSolarMutex() );
3114*b1cdbd2cSJim Jagielski 
3115*b1cdbd2cSJim Jagielski 	Point aMousePos( rDTDE.LocationX, rDTDE.LocationY );
3116*b1cdbd2cSJim Jagielski 
3117*b1cdbd2cSJim Jagielski 	xub_StrLen nPrevDropPos = mpDDInfo->nDropPos;
3118*b1cdbd2cSJim Jagielski 	mpDDInfo->nDropPos = ImplGetCharPos( aMousePos );
3119*b1cdbd2cSJim Jagielski 
3120*b1cdbd2cSJim Jagielski 	/*
3121*b1cdbd2cSJim Jagielski 	Size aOutSize = GetOutputSizePixel();
3122*b1cdbd2cSJim Jagielski 	if ( ( aMousePos.X() < 0 ) || ( aMousePos.X() > aOutSize.Width() ) )
3123*b1cdbd2cSJim Jagielski 	{
3124*b1cdbd2cSJim Jagielski 		// Scroll?
3125*b1cdbd2cSJim Jagielski 		// No, I will not receive events in this case....
3126*b1cdbd2cSJim Jagielski 	}
3127*b1cdbd2cSJim Jagielski 	*/
3128*b1cdbd2cSJim Jagielski 
3129*b1cdbd2cSJim Jagielski 	Selection aSel( maSelection );
3130*b1cdbd2cSJim Jagielski 	aSel.Justify();
3131*b1cdbd2cSJim Jagielski 
3132*b1cdbd2cSJim Jagielski 	// Don't accept drop in selection or read-only field...
3133*b1cdbd2cSJim Jagielski 	if ( IsReadOnly() || aSel.IsInside( mpDDInfo->nDropPos ) || ! mpDDInfo->bIsStringSupported )
3134*b1cdbd2cSJim Jagielski 	{
3135*b1cdbd2cSJim Jagielski 		ImplHideDDCursor();
3136*b1cdbd2cSJim Jagielski         rDTDE.Context->rejectDrag();
3137*b1cdbd2cSJim Jagielski 	}
3138*b1cdbd2cSJim Jagielski     else
3139*b1cdbd2cSJim Jagielski     {
3140*b1cdbd2cSJim Jagielski 	    // Alten Cursor wegzeichnen...
3141*b1cdbd2cSJim Jagielski 	    if ( !mpDDInfo->bVisCursor || ( nPrevDropPos != mpDDInfo->nDropPos ) )
3142*b1cdbd2cSJim Jagielski 	    {
3143*b1cdbd2cSJim Jagielski 		    ImplHideDDCursor();
3144*b1cdbd2cSJim Jagielski 		    ImplShowDDCursor();
3145*b1cdbd2cSJim Jagielski 	    }
3146*b1cdbd2cSJim Jagielski         rDTDE.Context->acceptDrag( rDTDE.DropAction );
3147*b1cdbd2cSJim Jagielski     }
3148*b1cdbd2cSJim Jagielski }
3149*b1cdbd2cSJim Jagielski 
ImplSubEdit(Edit * pParent,WinBits nStyle)3150*b1cdbd2cSJim Jagielski ImplSubEdit::ImplSubEdit( Edit* pParent, WinBits nStyle ) :
3151*b1cdbd2cSJim Jagielski 	Edit( pParent, nStyle )
3152*b1cdbd2cSJim Jagielski {
3153*b1cdbd2cSJim Jagielski 	pParent->SetSubEdit( this );
3154*b1cdbd2cSJim Jagielski }
3155*b1cdbd2cSJim Jagielski 
3156*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3157*b1cdbd2cSJim Jagielski 
Modify()3158*b1cdbd2cSJim Jagielski void ImplSubEdit::Modify()
3159*b1cdbd2cSJim Jagielski {
3160*b1cdbd2cSJim Jagielski 	GetParent()->Modify();
3161*b1cdbd2cSJim Jagielski }
3162*b1cdbd2cSJim Jagielski 
GetSurroundingText() const3163*b1cdbd2cSJim Jagielski XubString Edit::GetSurroundingText() const
3164*b1cdbd2cSJim Jagielski {
3165*b1cdbd2cSJim Jagielski   if ( mpSubEdit )
3166*b1cdbd2cSJim Jagielski     return mpSubEdit->GetSurroundingText();
3167*b1cdbd2cSJim Jagielski   else
3168*b1cdbd2cSJim Jagielski     return maText;
3169*b1cdbd2cSJim Jagielski }
3170*b1cdbd2cSJim Jagielski 
GetSurroundingTextSelection() const3171*b1cdbd2cSJim Jagielski Selection Edit::GetSurroundingTextSelection() const
3172*b1cdbd2cSJim Jagielski {
3173*b1cdbd2cSJim Jagielski   return GetSelection();
3174*b1cdbd2cSJim Jagielski }
3175