]> git.saurik.com Git - wxWidgets.git/blame - src/os2/textctrl.cpp
added stabs for missing wxNativeFontInfo methods when using Pango
[wxWidgets.git] / src / os2 / textctrl.cpp
CommitLineData
0e320a79
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: textctrl.cpp
3// Purpose: wxTextCtrl
d90895ac 4// Author: David Webster
0e320a79 5// Modified by:
d90895ac 6// Created: 10/17/99
0e320a79 7// RCS-ID: $Id$
d90895ac
DW
8// Copyright: (c) David Webster
9// Licence: wxWindows licence
0e320a79
DW
10/////////////////////////////////////////////////////////////////////////////
11
d90895ac
DW
12// ----------------------------------------------------------------------------
13// headers
14// ----------------------------------------------------------------------------
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifndef WX_PRECOMP
20 #include "wx/textctrl.h"
19193a2c 21 #include "wx/scrolwin.h"
d90895ac
DW
22 #include "wx/settings.h"
23 #include "wx/brush.h"
24 #include "wx/utils.h"
25 #include "wx/log.h"
0e320a79
DW
26#endif
27
d90895ac
DW
28#if wxUSE_CLIPBOARD
29 #include "wx/app.h"
30 #include "wx/clipbrd.h"
31#endif
0e320a79 32
d90895ac
DW
33#include "wx/textfile.h"
34
35#include "wx/os2/private.h"
36
37#include <string.h>
38#include <stdlib.h>
39#include <sys/types.h>
0e320a79 40
d90895ac
DW
41#if wxUSE_IOSTREAMH
42# include <fstream.h>
0e320a79 43#else
d90895ac 44# include <fstream>
0e320a79
DW
45#endif
46
19193a2c 47#if !defined(MLE_INDEX)
a92d9721
SN
48#define MLE_INDEX 0
49#define MLE_RGB 1
50#endif
51
d90895ac
DW
52
53// ----------------------------------------------------------------------------
54// event tables and other macros
55// ----------------------------------------------------------------------------
56
0e320a79
DW
57IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
58
59BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
d90895ac
DW
60 EVT_CHAR(wxTextCtrl::OnChar)
61 EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
62
0e320a79
DW
63 EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
64 EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
65 EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
66 EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
67 EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
68
69 EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
70 EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
71 EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
72 EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
73 EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
74END_EVENT_TABLE()
0e320a79 75
d90895ac
DW
76
77// ============================================================================
78// implementation
79// ============================================================================
80
81// ----------------------------------------------------------------------------
82// creation
83// ----------------------------------------------------------------------------
84
0e320a79 85wxTextCtrl::wxTextCtrl()
0e320a79 86{
0e320a79
DW
87}
88
2b5f62a0
VZ
89wxTextCtrl::~wxTextCtrl()
90{
91}
92
3bd418ca
DW
93bool wxTextCtrl::Create(
94 wxWindow* pParent
95, wxWindowID vId
96, const wxString& rsValue
97, const wxPoint& rPos
98, const wxSize& rSize
99, long lStyle
3bd418ca 100, const wxValidator& rValidator
3bd418ca
DW
101, const wxString& rsName
102)
103{
39c26ef2
DW
104 HWND hParent;
105 int nTempy;
cfcebdb1 106
3bd418ca
DW
107 //
108 // Base initialization
109 //
110 if ( !CreateBase( pParent
111 ,vId
112 ,rPos
113 ,rSize
114 ,lStyle
3bd418ca 115 ,rValidator
3bd418ca
DW
116 ,rsName
117 ))
d90895ac 118 return FALSE;
0e320a79 119
45bfc84b 120 wxPoint vPos = rPos; // The OS/2 position
5d44b24e 121 SWP vSwp;
45bfc84b 122
3bd418ca 123 if (pParent )
45bfc84b 124 {
3bd418ca 125 pParent->AddChild(this);
45bfc84b 126 }
0e320a79 127
3bd418ca 128 m_windowStyle = lStyle;
70a2c656 129 m_bIsMLE = FALSE;
d90895ac 130
3bd418ca
DW
131 long lSstyle = WS_VISIBLE | WS_TABSTOP;
132
133 //
134 // Single and multiline edit fields are two different controls in PM
135 //
d90895ac
DW
136 if ( m_windowStyle & wxTE_MULTILINE )
137 {
9c88ff79 138 lSstyle |= MLS_BORDER | MLS_WORDWRAP;
3bd418ca 139 m_bIsMLE = TRUE;
d90895ac 140
d90895ac 141 if ((m_windowStyle & wxTE_NO_VSCROLL) == 0)
3bd418ca
DW
142 lSstyle |= MLS_VSCROLL;
143 if (m_windowStyle & wxHSCROLL)
144 lSstyle |= MLS_HSCROLL;
145 if (m_windowStyle & wxTE_READONLY)
146 lSstyle |= MLS_READONLY;
d90895ac 147 }
0e320a79 148 else
3bd418ca 149 {
987da0d4 150 lSstyle |= ES_LEFT | ES_AUTOSCROLL | ES_MARGIN;
3bd418ca
DW
151
152 if (m_windowStyle & wxHSCROLL)
153 lSstyle |= ES_AUTOSCROLL;
154 if (m_windowStyle & wxTE_READONLY)
155 lSstyle |= ES_READONLY;
156 if (m_windowStyle & wxTE_PASSWORD) // hidden input
157 lSstyle |= ES_UNREADABLE;
158 }
5d44b24e 159
3bd418ca
DW
160 if (m_bIsMLE)
161 {
162 m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
163 ,WC_MLE // Window class
164 ,(PSZ)rsValue.c_str() // Initial Text
165 ,(ULONG)lSstyle // Style flags
716ed225
DW
166 ,(LONG)0 // X pos of origin
167 ,(LONG)0 // Y pos of origin
168 ,(LONG)0 // field width
169 ,(LONG)0 // field height
3bd418ca
DW
170 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
171 ,HWND_TOP // initial z position
172 ,(ULONG)vId // Window identifier
173 ,NULL // no control data
174 ,NULL // no Presentation parameters
175 );
176 }
177 else
178 {
179 m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
180 ,WC_ENTRYFIELD // Window class
181 ,(PSZ)rsValue.c_str() // Initial Text
182 ,(ULONG)lSstyle // Style flags
716ed225
DW
183 ,(LONG)0 // X pos of origin
184 ,(LONG)0 // Y pos of origin
185 ,(LONG)0 // field width
186 ,(LONG)0 // field height
3bd418ca
DW
187 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
188 ,HWND_TOP // initial z position
189 ,(ULONG)vId // Window identifier
190 ,NULL // no control data
191 ,NULL // no Presentation parameters
192 );
193 }
194
195 if (m_hWnd == 0)
196 {
197 return FALSE;
198 }
199
d90895ac
DW
200 SubclassWin(GetHWND());
201
3bd418ca
DW
202 //
203 // Set font, position, size and initial value
204 //
70a2c656 205 wxFont* pTextFont = new wxFont( 8
2c1e8f2e
DW
206 ,wxMODERN
207 ,wxNORMAL
208 ,wxNORMAL
209 );
210 SetFont(*pTextFont);
3bd418ca
DW
211 if (!rsValue.IsEmpty())
212 {
213 SetValue(rsValue);
214 }
215 SetupColours();
5d44b24e
DW
216 //
217 // If X and/or Y are not zero the difference is the compensation value
218 // for margins for OS/2 controls.
219 //
220 ::WinQueryWindowPos(m_hWnd, &vSwp);
221 SetXComp(vSwp.x);
222 SetYComp(vSwp.y);
70a2c656
DW
223 SetSize( vPos.x - GetXComp()
224 ,vPos.y - GetYComp()
3bd418ca
DW
225 ,rSize.x
226 ,rSize.y
227 );
b3260bce 228 delete pTextFont;
0e320a79 229 return TRUE;
3bd418ca 230} // end of wxTextCtrl::Create
0e320a79 231
3bd418ca 232//
d90895ac 233// Make sure the window style (etc.) reflects the HWND style (roughly)
3bd418ca 234//
d90895ac
DW
235void wxTextCtrl::AdoptAttributesFromHWND()
236{
3bd418ca
DW
237 HWND hWnd = GetHwnd();
238 LONG lStyle = ::WinQueryWindowULong(hWnd, QWL_STYLE);
d90895ac 239
3bd418ca 240 wxWindow::AdoptAttributesFromHWND();
d90895ac 241
3bd418ca
DW
242 if (m_bIsMLE)
243 {
244 m_windowStyle |= wxTE_MULTILINE;
245 if (lStyle & MLS_READONLY)
246 m_windowStyle |= wxTE_READONLY;
247 }
248 else
249 {
250 if (lStyle & ES_UNREADABLE)
251 m_windowStyle |= wxTE_PASSWORD;
252 if (lStyle & ES_READONLY)
253 m_windowStyle |= wxTE_READONLY;
254 }
c4955899 255} // end of wxTextCtrl::AdoptAttributesFromHWND
d90895ac 256
b9b1d6c8
DW
257WXDWORD wxTextCtrl::OS2GetStyle(
258 long lStyle
259, WXDWORD* pdwExstyle
260) const
261{
262 //
263 // Default border for the text controls is the sunken one
264 //
265 if ((lStyle & wxBORDER_MASK) == wxBORDER_DEFAULT )
266 {
267 lStyle |= wxBORDER_SUNKEN;
268 }
269
270 long dwStyle = wxControl::OS2GetStyle( lStyle
271 ,pdwExstyle
272 );
273
274 dwStyle = WS_VISIBLE | WS_TABSTOP;
275
276 //
277 // Single and multiline edit fields are two different controls in PM
278 //
279 if ( m_windowStyle & wxTE_MULTILINE )
280 {
281 dwStyle |= MLS_BORDER | MLS_WORDWRAP;
282 if ((m_windowStyle & wxTE_NO_VSCROLL) == 0)
283 dwStyle |= MLS_VSCROLL;
284 if (m_windowStyle & wxHSCROLL)
285 dwStyle |= MLS_HSCROLL;
286 if (m_windowStyle & wxTE_READONLY)
287 dwStyle |= MLS_READONLY;
288 }
289 else
290 {
291 dwStyle |= ES_LEFT | ES_AUTOSCROLL | ES_MARGIN;
292 if (m_windowStyle & wxHSCROLL)
293 dwStyle |= ES_AUTOSCROLL;
294 if (m_windowStyle & wxTE_READONLY)
295 dwStyle |= ES_READONLY;
296 if (m_windowStyle & wxTE_PASSWORD) // hidden input
297 dwStyle |= ES_UNREADABLE;
298 }
299 return dwStyle;
300} // end of wxTextCtrl::OS2GetStyle
301
302void wxTextCtrl::SetWindowStyleFlag(
303 long lStyle
304)
305{
306 wxControl::SetWindowStyleFlag(lStyle);
307} // end of wxTextCtrl::SetWindowStyleFlag
308
d90895ac
DW
309void wxTextCtrl::SetupColours()
310{
c4955899
DW
311 wxColour vBkgndColour;
312
a756f210 313 vBkgndColour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
c4955899 314 SetBackgroundColour(vBkgndColour);
d90895ac 315 SetForegroundColour(GetParent()->GetForegroundColour());
9c88ff79
DW
316 if (m_bIsMLE)
317 {
318 ::WinSendMsg( GetHwnd()
319 ,MLM_SETTEXTCOLOR
320 ,(MPARAM)GetParent()->GetForegroundColour().GetPixel()
321 ,(MPARAM)MLE_RGB
322 );
323 }
c4955899 324} // end of wxTextCtrl::SetupColours
d90895ac
DW
325
326// ----------------------------------------------------------------------------
327// set/get the controls text
328// ----------------------------------------------------------------------------
329
0e320a79
DW
330wxString wxTextCtrl::GetValue() const
331{
c4955899
DW
332 wxString sStr = wxGetWindowText(GetHWND());
333 char* zStr = (char*)sStr.c_str();
d90895ac 334
c4955899
DW
335 for ( ; *zStr; zStr++ )
336 {
337 //
338 // this will replace \r\n with just \n
339 //
340 if (*zStr == '\n')
341 *zStr = '\0';
342 if (*zStr == '\r')
343 *zStr = '\n';
344 }
c4955899
DW
345 return sStr;
346} // end of wxTextCtrl::GetValue
0e320a79 347
c4955899
DW
348void wxTextCtrl::SetValue(
349 const wxString& rsValue
350)
0e320a79 351{
c4955899
DW
352 //
353 // If the text is long enough, it's faster to just set it instead of first
354 // comparing it with the old one (chances are that it will be different
355 // anyhow, this comparison is there to avoid flicker for small single-line
356 // edit controls mostly)
357 //
358 if ((rsValue.length() > 0x400) || (rsValue != GetValue()))
359 {
360 ::WinSetWindowText(GetHwnd(), rsValue.c_str());
361 AdjustSpaceLimit();
362 }
363} // end of wxTextCtrl::SetValue
d90895ac 364
c4955899
DW
365void wxTextCtrl::WriteText(
366 const wxString& rsValue
367)
368{
b3260bce
DW
369 if (m_bIsMLE)
370 ::WinSendMsg(GetHwnd(), MLM_INSERT, MPARAM((PCHAR)rsValue.c_str()), MPARAM(0));
371 else
372 ::WinSetWindowText(GetHwnd(), rsValue.c_str());
d90895ac 373 AdjustSpaceLimit();
c4955899 374} // end of wxTextCtrl::WriteText
0e320a79 375
c4955899
DW
376void wxTextCtrl::AppendText(
377 const wxString& rsText
378)
d90895ac 379{
d90895ac 380 SetInsertionPointEnd();
c4955899
DW
381 WriteText(rsText);
382} // end of wxTextCtrl::AppendText
d90895ac
DW
383
384void wxTextCtrl::Clear()
385{
c4955899
DW
386 ::WinSetWindowText(GetHwnd(), "");
387} // end of wxTextCtrl::Clear
d90895ac 388
a086de98
DW
389bool wxTextCtrl::EmulateKeyPress(
390 const wxKeyEvent& rEvent
391)
392{
393 SetFocus();
394 return(wxTextCtrlBase::EmulateKeyPress(rEvent));
395} // end of wxTextCtrl::EmulateKeyPress
396
d90895ac 397// ----------------------------------------------------------------------------
0e320a79 398// Clipboard operations
d90895ac
DW
399// ----------------------------------------------------------------------------
400
0e320a79
DW
401void wxTextCtrl::Copy()
402{
d90895ac
DW
403 if (CanCopy())
404 {
405 HWND hWnd = GetHwnd();
3bd418ca
DW
406 if (m_bIsMLE)
407 ::WinSendMsg(hWnd, MLM_COPY, 0, 0);
408 else
409 ::WinSendMsg(hWnd, EM_COPY, 0, 0);
d90895ac 410 }
3bd418ca 411} // end of wxTextCtrl::Copy
0e320a79
DW
412
413void wxTextCtrl::Cut()
414{
d90895ac
DW
415 if (CanCut())
416 {
417 HWND hWnd = GetHwnd();
3bd418ca
DW
418
419 if (m_bIsMLE)
420 ::WinSendMsg(hWnd, MLM_CUT, 0, 0);
421 else
422 ::WinSendMsg(hWnd, EM_CUT, 0, 0);
d90895ac 423 }
c4955899 424} // end of wxTextCtrl::Cut
0e320a79
DW
425
426void wxTextCtrl::Paste()
427{
d90895ac
DW
428 if (CanPaste())
429 {
c4955899
DW
430 HWND hWnd = GetHwnd();
431
432 ::WinSendMsg(hWnd, EM_PASTE, 0, 0);
d90895ac 433 }
c4955899 434} // end of wxTextCtrl::Paste
d90895ac
DW
435
436bool wxTextCtrl::CanCopy() const
437{
c4955899 438 //
d90895ac 439 // Can copy if there's a selection
c4955899
DW
440 //
441 long lFrom = 0L;
442 long lTo = 0L;
443
444 GetSelection(&lFrom, &lTo);
445 return (lFrom != lTo);
446} // end of wxTextCtrl::CanCopy
d90895ac
DW
447
448bool wxTextCtrl::CanCut() const
449{
c4955899 450 //
d90895ac 451 // Can cut if there's a selection
c4955899
DW
452 //
453 long lFrom = 0L;
454 long lTo = 0L;
455
456 GetSelection(&lFrom, &lTo);
457 return (lFrom != lTo);
458} // end of wxTextCtrl::CanCut
d90895ac
DW
459
460bool wxTextCtrl::CanPaste() const
461{
3bd418ca
DW
462 bool bIsTextAvailable = FALSE;
463
d90895ac
DW
464 if (!IsEditable())
465 return FALSE;
466
3bd418ca
DW
467 //
468 // Check for straight text on clipboard
469 //
470 if (::WinOpenClipbrd(vHabmain))
d90895ac 471 {
3bd418ca
DW
472 bIsTextAvailable = (::WinQueryClipbrdData(vHabmain, CF_TEXT) != 0);
473 ::WinCloseClipbrd(vHabmain);
d90895ac 474 }
3bd418ca
DW
475 return bIsTextAvailable;
476} // end of wxTextCtrl::CanPaste
0e320a79 477
d90895ac
DW
478// ----------------------------------------------------------------------------
479// Accessors
480// ----------------------------------------------------------------------------
481
c4955899
DW
482void wxTextCtrl::SetEditable(
483 bool bEditable
484)
0e320a79 485{
c4955899
DW
486 HWND hWnd = GetHwnd();
487
488 if (m_bIsMLE)
489 ::WinSendMsg(hWnd, MLM_SETREADONLY, MPFROMLONG(!bEditable), (MPARAM)0);
490 else
491 ::WinSendMsg(hWnd, EM_SETREADONLY, MPFROMLONG(!bEditable), (MPARAM)0);
492} // end of wxTextCtrl::SetEditable
0e320a79 493
c4955899
DW
494void wxTextCtrl::SetInsertionPoint(
495 long lPos
496)
0e320a79 497{
c4955899
DW
498 HWND hWnd = GetHwnd();
499
500 if (m_bIsMLE)
501 ::WinSendMsg(hWnd, MLM_SETSEL, (MPARAM)lPos, (MPARAM)lPos);
502 else
503 ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lPos, (USHORT)lPos), (MPARAM)0);
504} // end of wxTextCtrl::SetInsertionPoint
0e320a79
DW
505
506void wxTextCtrl::SetInsertionPointEnd()
507{
c4955899
DW
508 long lPos = GetLastPosition();
509
6e348b12
DW
510 //
511 // We must not do anything if the caret is already there because calling
512 // SetInsertionPoint() thaws the controls if Freeze() had been called even
513 // if it doesn't actually move the caret anywhere and so the simple fact of
514 // doing it results in horrible flicker when appending big amounts of text
515 // to the control in a few chunks (see DoAddText() test in the text sample)
516 //
517 if (GetInsertionPoint() == GetLastPosition())
518 return;
c4955899
DW
519 SetInsertionPoint(lPos);
520} // end of wxTextCtrl::SetInsertionPointEnd
0e320a79
DW
521
522long wxTextCtrl::GetInsertionPoint() const
523{
3bd418ca
DW
524 WXDWORD dwPos = 0L;
525
526 if (m_bIsMLE)
527 dwPos = (WXDWORD)::WinSendMsg(GetHwnd(), MLM_QUERYSEL, (MPARAM)MLFQS_MINSEL, 0);
528 else
529 {
530 dwPos = (WXDWORD)::WinSendMsg(GetHwnd(), EM_QUERYSEL, 0, 0);
531 dwPos = SHORT1FROMMP((MPARAM)dwPos); // the first 16 bit value is the min pos
532 }
533 return (dwPos & 0xFFFF);
534} // end of wxTextCtrl::GetInsertionPoint
0e320a79
DW
535
536long wxTextCtrl::GetLastPosition() const
537{
3bd418ca
DW
538 HWND hWnd = GetHwnd();
539 long lCharIndex;
540 long lLineLength;
0e320a79 541
3bd418ca
DW
542 if (m_bIsMLE)
543 {
544 lCharIndex = 0;
d90895ac 545
3bd418ca
DW
546 //
547 // This just gets the total text length. The last will be this value
548 //
549 lLineLength = (long)::WinSendMsg(hWnd, MLM_QUERYTEXTLENGTH, 0, 0);
550 }
551 else
552 {
553 WNDPARAMS vParams;
554
555 lCharIndex = 0;
556 vParams.fsStatus = WPM_CCHTEXT;
557 if (::WinSendMsg( GetHwnd()
558 ,WM_QUERYWINDOWPARAMS
559 ,&vParams
560 ,0
561 ))
562 {
563 lLineLength = (long)vParams.cchText;
564 }
565 else
566 lLineLength = 0;
567 }
568 return(lCharIndex + lLineLength);
569} // end of wxTextCtrl::GetLastPosition
0e320a79 570
d90895ac
DW
571// If the return values from and to are the same, there is no
572// selection.
c4955899
DW
573void wxTextCtrl::GetSelection(
574 long* plFrom
575, long* plTo
576) const
0e320a79 577{
c4955899 578 WXDWORD dwPos;
0e320a79 579
c4955899
DW
580 if (m_bIsMLE)
581 dwPos = (WXDWORD)::WinSendMsg(GetHwnd(), MLM_QUERYSEL, (MPARAM)MLFQS_MINSEL, 0);
582 else
583 {
584 dwPos = (WXDWORD)::WinSendMsg(GetHwnd(), EM_QUERYSEL, 0, 0);
585 }
586 *plFrom = SHORT1FROMMP((MPARAM)dwPos); // the first 16 bit value is the min pos
587 *plTo = SHORT2FROMMP((MPARAM)dwPos); // the first 16 bit value is the min pos
588} // end of wxTextCtrl::GetSelection
0e320a79 589
d90895ac
DW
590bool wxTextCtrl::IsEditable() const
591{
c4955899
DW
592 if (m_bIsMLE)
593 return((bool)LONGFROMMR(::WinSendMsg(GetHwnd(), MLM_QUERYREADONLY, 0, 0)));
594 else
595 return((bool)LONGFROMMR(::WinSendMsg(GetHwnd(), EM_QUERYREADONLY, 0, 0)));
596} // end of wxTextCtrl::IsEditable
0e320a79 597
d90895ac
DW
598// ----------------------------------------------------------------------------
599// Editing
600// ----------------------------------------------------------------------------
601
c4955899
DW
602void wxTextCtrl::Replace(
603 long lFrom
604, long lTo
605, const wxString& rsValue
606)
0e320a79 607{
d90895ac 608#if wxUSE_CLIPBOARD
c4955899
DW
609 HWND hWnd = GetHwnd();
610 long lFromChar = lFrom;
611 long lToChar = lTo;
0e320a79 612
c4955899 613 //
d90895ac 614 // Set selection and remove it
c4955899
DW
615 //
616 if (m_bIsMLE)
617 {
618 ::WinSendMsg(hWnd, MLM_SETSEL, MPFROM2SHORT((USHORT)lFrom, (USHORT)lTo), 0);
619 ::WinSendMsg(hWnd, MLM_CUT, 0, 0);
620 }
621 else
622 {
623 ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lFrom, (USHORT)lTo), 0);
624 ::WinSendMsg(hWnd, EM_CUT, 0, 0);
625 }
0e320a79 626
c4955899 627 //
d90895ac 628 // Now replace with 'value', by pasting.
c4955899
DW
629 //
630 wxSetClipboardData(wxDF_TEXT, (wxObject *) (const wxChar *)rsValue, 0, 0);
0e320a79 631
d90895ac 632 // Paste into edit control
c4955899
DW
633 if (m_bIsMLE)
634 ::WinSendMsg(hWnd, MLM_PASTE, (MPARAM)0, (MPARAM)0);
635 else
636 ::WinSendMsg(hWnd, EM_PASTE, (MPARAM)0, (MPARAM)0);
d90895ac
DW
637#else
638 wxFAIL_MSG("wxTextCtrl::Replace not implemented if wxUSE_CLIPBOARD is 0.");
639#endif
c4955899 640} // end of wxTextCtrl::Replace
0e320a79 641
c4955899
DW
642void wxTextCtrl::Remove(
643 long lFrom
644, long lTo
645)
0e320a79 646{
c4955899
DW
647 HWND hWnd = GetHwnd();
648 long lFromChar = lFrom;
649 long lToChar = lTo;
d90895ac 650
c4955899
DW
651 if (m_bIsMLE)
652 {
653 ::WinSendMsg(hWnd, MLM_SETSEL, MPFROM2SHORT((USHORT)lFrom, (USHORT)lTo), 0);
654 ::WinSendMsg(hWnd, MLM_CUT, 0, 0);
655 }
656 else
657 {
658 ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lFrom, (USHORT)lTo), 0);
659 ::WinSendMsg(hWnd, EM_CUT, 0, 0);
660 }
661} // end of wxTextCtrl::Remove
0e320a79 662
c4955899
DW
663void wxTextCtrl::SetSelection(
664 long lFrom
665, long lTo
666)
0e320a79 667{
c4955899
DW
668 HWND hWnd = GetHwnd();
669 long lFromChar = lFrom;
670 long lToChar = lTo;
d90895ac 671
c4955899
DW
672 //
673 // If from and to are both -1, it means (in wxWindows) that all text should
d90895ac 674 // be selected. Translate into Windows convention
c4955899
DW
675 //
676 if ((lFrom == -1L) && (lTo == -1L))
d90895ac 677 {
c4955899
DW
678 lFromChar = 0L;
679 lToChar = -1L;
d90895ac 680 }
c4955899
DW
681 if (m_bIsMLE)
682 ::WinSendMsg(hWnd, MLM_SETSEL, (MPARAM)lFromChar, (MPARAM)lToChar);
683 else
684 ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lFromChar, (USHORT)lToChar), (MPARAM)0);
685} // end of wxTextCtrl::SetSelection
d90895ac 686
c4955899
DW
687bool wxTextCtrl::LoadFile(
688 const wxString& rsFile
689)
0e320a79 690{
c4955899 691 if ( wxTextCtrlBase::LoadFile(rsFile) )
d90895ac 692 {
c4955899
DW
693 //
694 // Update the size limit if needed
695 //
d90895ac 696 AdjustSpaceLimit();
d90895ac
DW
697 return TRUE;
698 }
d90895ac 699 return FALSE;
c4955899 700} // end of wxTextCtrl::LoadFile
0e320a79
DW
701
702bool wxTextCtrl::IsModified() const
703{
c4955899
DW
704 bool bRc;
705
706 if (m_bIsMLE)
707 bRc = (bool)LONGFROMMR(::WinSendMsg(GetHwnd(), MLM_QUERYCHANGED, 0, 0));
708 else
709 bRc = (bool)LONGFROMMR(::WinSendMsg(GetHwnd(), EM_QUERYCHANGED, 0, 0));
710 return bRc;
711} // end of wxTextCtrl::IsModified
0e320a79 712
3a9fa0d6
VZ
713void wxTextCtrl::MarkDirty()
714{
715 wxFAIL_MSG( _T("not implemented") );
716}
717
3bd418ca 718//
0e320a79 719// Makes 'unmodified'
3bd418ca 720//
0e320a79
DW
721void wxTextCtrl::DiscardEdits()
722{
3bd418ca
DW
723 if (m_bIsMLE)
724 ::WinSendMsg(GetHwnd(), MLM_SETCHANGED, MPFROMLONG(FALSE), 0);
725 else
726 //
727 // EM controls do not have a SETCHANGED but issuing a query should reset it
728 //
729 ::WinSendMsg(GetHwnd(), EM_QUERYCHANGED, 0, 0);
730} // end of wxTextCtrl::DiscardEdits
0e320a79
DW
731
732int wxTextCtrl::GetNumberOfLines() const
733{
c4955899 734 int nNumLines;
0e320a79 735
c4955899
DW
736 if (m_bIsMLE)
737 nNumLines = (int)::WinSendMsg(GetHwnd(), MLM_QUERYLINECOUNT, 0, 0);
738 else
739 nNumLines = 1;
740 return nNumLines;
741} // end of wxTextCtrl::GetNumberOfLines
d90895ac 742
c4955899
DW
743long wxTextCtrl::XYToPosition(
744 long lX
745, long lY
746) const
747{
748 HWND hWnd = GetHwnd();
749 long lCharIndex = 0L;
750 long lLen;
0e320a79 751
c4955899
DW
752 if (m_bIsMLE)
753 {
754 lLen = (long)::WinSendMsg(GetHwnd(), MLM_QUERYLINELENGTH, 0, 0);
755 lCharIndex = ((lLen * lY) + lX);
756 }
757 else
758 lCharIndex = lX;
759 return lCharIndex;
760} // end of wxTextCtrl::XYToPosition
761
762bool wxTextCtrl::PositionToXY(
763 long lPos
764, long* plX
765, long* plY
766) const
0e320a79 767{
c4955899
DW
768 HWND hWnd = GetHwnd();
769 long nLineNo = -1;
770 long lCharIndex = 0;
d90895ac 771
c4955899
DW
772 if (m_bIsMLE)
773 nLineNo = (long)::WinSendMsg(hWnd, MLM_LINEFROMCHAR, (MPARAM)lPos, 0);
774 else
775 nLineNo = 0;
d90895ac 776
c4955899 777 if (nLineNo == -1)
d90895ac
DW
778 {
779 // no such line
780 return FALSE;
781 }
782
c4955899 783 //
d90895ac 784 // This gets the char index for the _beginning_ of this line
c4955899
DW
785 //
786 long lLineWidth;
787
788 if (m_bIsMLE)
789 {
790 lLineWidth = (long)::WinSendMsg(hWnd, MLM_QUERYLINELENGTH, (MPARAM)0, (MPARAM)0);
791 lCharIndex = (nLineNo + 1) * lLineWidth;
792 }
793 else
794 {
795 WNDPARAMS vParams;
796
797 vParams.fsStatus = WPM_CCHTEXT;
798 if (::WinSendMsg( hWnd
799 ,WM_QUERYWINDOWPARAMS
800 ,&vParams
801 ,0
802 ))
803 {
804 lCharIndex = vParams.cchText;
805 }
806 else
807 lCharIndex = 32;
808 }
809
810 if (lCharIndex == -1)
d90895ac
DW
811 {
812 return FALSE;
813 }
814
c4955899
DW
815 //
816 // The X position must therefore be the difference between pos and charIndex
817 //
818 if (plX)
819 *plX = lPos - lCharIndex;
820 if (plY)
821 *plY = nLineNo;
d90895ac
DW
822
823 return TRUE;
c4955899 824} // end of wxTextCtrl::PositionToXY
0e320a79 825
c4955899
DW
826void wxTextCtrl::ShowPosition(
827 long lPos
828)
0e320a79 829{
c4955899
DW
830 HWND hWnd = GetHwnd();
831 long lCurrentLineLineNo = 0L;
d90895ac
DW
832
833 // To scroll to a position, we pass the number of lines and characters
834 // to scroll *by*. This means that we need to:
835 // (1) Find the line position of the current line.
836 // (2) Find the line position of pos.
837 // (3) Scroll by (pos - current).
838 // For now, ignore the horizontal scrolling.
839
c4955899 840 //
d90895ac
DW
841 // Is this where scrolling is relative to - the line containing the caret?
842 // Or is the first visible line??? Try first visible line.
c4955899
DW
843 //
844 if (m_bIsMLE)
845 {
846 //
847 // In PM this is the actual char position
848 //
849 lCurrentLineLineNo = (long)::WinSendMsg(hWnd, MLM_QUERYFIRSTCHAR, (MPARAM)0, (MPARAM)0);
d90895ac 850
c4955899
DW
851 //
852 // This will cause a scroll to the selected position
853 //
854 ::WinSendMsg(hWnd, MLM_SETSEL, (MPARAM)lCurrentLineLineNo, (MPARAM)lCurrentLineLineNo);
855 }
856} // end of wxTextCtrl::ShowPosition
0e320a79 857
3bd418ca
DW
858int wxTextCtrl::GetLineLength(
859 long lLineNo
860) const
0e320a79 861{
3bd418ca 862 long lLen = 0L;
d90895ac 863
3bd418ca
DW
864 if (m_bIsMLE)
865 lLen = (long)::WinSendMsg(GetHwnd(), MLM_QUERYLINELENGTH, 0, 0);
866 else
867 {
868 WNDPARAMS vParams;
869
870 vParams.fsStatus = WPM_CCHTEXT;
871 if (::WinSendMsg( GetHwnd()
872 ,WM_QUERYWINDOWPARAMS
873 ,&vParams
874 ,0
875 ))
876 {
877 lLen = vParams.cchText;
878 }
879 else
880 lLen = 32;
881 }
882 return lLen;
c4955899 883} // end ofwxTextCtrl::GetLineLength
0e320a79 884
c4955899
DW
885wxString wxTextCtrl::GetLineText(
886 long lLineNo
887) const
0e320a79 888{
c4955899
DW
889 long lLen = (long)GetLineLength((long)lLineNo) + 1;
890 wxString sStr;
891 char* zBuf;
0e320a79 892
c4955899
DW
893 //
894 // There must be at least enough place for the length WORD in the
895 // buffer
896 //
897 lLen += sizeof(WORD);
898 zBuf = new char[lLen];
899 if (m_bIsMLE)
900 {
901 long lIndex;
902 long lBuflen;
903 long lCopied;
0e320a79 904
c4955899
DW
905 lLen = (long)::WinSendMsg(GetHwnd(), MLM_QUERYLINELENGTH, 0, 0);
906 lIndex = lLen * lLineNo;
0e320a79 907
c4955899
DW
908 ::WinSendMsg(GetHwnd(), MLM_SETSEL, (MPARAM)lIndex, (MPARAM)lIndex);
909 ::WinSendMsg(GetHwnd(), MLM_SETIMPORTEXPORT, MPFROMP(zBuf), MPFROMSHORT((USHORT)sizeof(zBuf)));
910 lBuflen = (long)::WinSendMsg(GetHwnd(), MLM_QUERYFORMATTEXTLENGTH, MPFROMLONG(lIndex), MPFROMLONG(-1));
911 lCopied = (long)::WinSendMsg(GetHwnd(), MLM_EXPORT, MPFROMP(&lIndex), MPFROMP(&lBuflen));
912 zBuf[lCopied] = '\0';
913 }
914 else
915 {
916 WNDPARAMS vParams;
917
918 vParams.fsStatus = WPM_CCHTEXT;
919 if (::WinSendMsg( GetHwnd()
920 ,WM_QUERYWINDOWPARAMS
921 ,&vParams
922 ,0
923 ))
924 memcpy(zBuf, vParams.pszText, vParams.cchText);
925 zBuf[vParams.cchText] = '\0';
926 }
927 sStr = zBuf;
928 delete [] zBuf;
929 return sStr;
930} // end of wxTextCtrl::GetLineText
0e320a79 931
d90895ac 932// ----------------------------------------------------------------------------
0e320a79 933// Undo/redo
d90895ac
DW
934// ----------------------------------------------------------------------------
935
0e320a79
DW
936void wxTextCtrl::Undo()
937{
d90895ac
DW
938 if (CanUndo())
939 {
c4955899
DW
940 if (m_bIsMLE)
941 ::WinSendMsg(GetHwnd(), MLM_UNDO, 0, 0);
942 // Simple entryfields cannot be undone
d90895ac 943 }
c4955899 944} // end of wxTextCtrl::Undo
0e320a79
DW
945
946void wxTextCtrl::Redo()
947{
d90895ac
DW
948 if (CanRedo())
949 {
c4955899
DW
950 if (m_bIsMLE)
951 ::WinSendMsg(GetHwnd(), MLM_UNDO, 0, 0);
952 // Simple entryfields cannot be undone
d90895ac 953 }
c4955899 954} // end of wxTextCtrl::Redo
0e320a79
DW
955
956bool wxTextCtrl::CanUndo() const
957{
3bd418ca
DW
958 bool bOk;
959
960 if (m_bIsMLE)
961 bOk = (::WinSendMsg(GetHwnd(), MLM_QUERYUNDO, 0, 0) != 0);
962 else
963 bOk = FALSE; // can't undo regular edit fields in PM
964 return bOk;
965} // end of wxTextCtrl::CanUndo
0e320a79
DW
966
967bool wxTextCtrl::CanRedo() const
968{
3bd418ca
DW
969 bool bOk;
970
971 if (m_bIsMLE)
972 bOk = (::WinSendMsg(GetHwnd(), MLM_QUERYUNDO, 0, 0) != 0);
973 else
974 bOk = FALSE; // can't undo regular edit fields in PM
975 return bOk;
976} // end of wxTextCtrl::CanRedo
0e320a79 977
d90895ac
DW
978// ----------------------------------------------------------------------------
979// implemenation details
980// ----------------------------------------------------------------------------
0e320a79 981
c4955899
DW
982void wxTextCtrl::Command(
983 wxCommandEvent& rEvent
984)
0e320a79 985{
c4955899
DW
986 SetValue(rEvent.GetString());
987 ProcessCommand (rEvent);
988} // end of wxTextCtrl::Command
0e320a79 989
c4955899
DW
990void wxTextCtrl::OnDropFiles(
991 wxDropFilesEvent& rEvent
992)
0e320a79
DW
993{
994 // By default, load the first file into the text window.
c4955899 995 if (rEvent.GetNumberOfFiles() > 0)
0e320a79 996 {
c4955899 997 LoadFile(rEvent.GetFiles()[0]);
0e320a79 998 }
c4955899
DW
999} // end of wxTextCtrl::OnDropFiles
1000
1001WXHBRUSH wxTextCtrl::OnCtlColor(
1002 WXHDC hWxDC
1003, WXHWND hWnd
1004, WXUINT uCtlColor
1005, WXUINT uMessage
1006, WXWPARAM wParam
1007, WXLPARAM lParam
1008)
d90895ac 1009{
c4955899
DW
1010 HPS hPS = (HPS)hWxDC;
1011 wxBrush* pBrush = NULL;
1012 wxColour vColBack = GetBackgroundColour();
1013 wxColour vColFore = GetForegroundColour();
1014 wxBrush* pBackgroundBrush = wxTheBrushList->FindOrCreateBrush( GetBackgroundColour()
1015 ,wxSOLID
1016 );
1017
1018 if (m_bUseCtl3D)
1019 {
1020 HBRUSH hBrush = NULLHANDLE;
0e320a79 1021
c4955899
DW
1022 return hBrush;
1023 }
1024 if (GetParent()->GetTransparentBackground())
1025 ::GpiSetBackMix(hPS, BM_LEAVEALONE);
1026 else
1027 ::GpiSetBackMix(hPS, BM_OVERPAINT);
1028 if (!IsEnabled() && (GetWindowStyle() & wxTE_MULTILINE) == 0)
a756f210 1029 vColBack = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
c4955899
DW
1030 ::GpiSetBackColor(hPS, vColBack.GetPixel());
1031 ::GpiSetColor(hPS, vColFore.GetPixel());
1032 return (WXHBRUSH)pBackgroundBrush->GetResourceHandle();
1033} // end of wxTextCtrl::OnCtlColor
1034
54ffa107
DW
1035bool wxTextCtrl::OS2ShouldPreProcessMessage(
1036 WXMSG* pMsg
1037)
1038{
1039 return wxControl::OS2ShouldPreProcessMessage(pMsg);
1040} // end of wxTextCtrl::OS2ShouldPreProcessMessage
1041
c4955899
DW
1042void wxTextCtrl::OnChar(
1043 wxKeyEvent& rEvent
1044)
0e320a79 1045{
c4955899 1046 switch (rEvent.KeyCode())
d90895ac 1047 {
d90895ac
DW
1048 case WXK_RETURN:
1049 if ( !(m_windowStyle & wxTE_MULTILINE) )
1050 {
c4955899
DW
1051 wxCommandEvent vEvent(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
1052
1053 vEvent.SetEventObject(this);
1054 if ( GetEventHandler()->ProcessEvent(vEvent))
d90895ac
DW
1055 return;
1056 }
1057 //else: multiline controls need Enter for themselves
1058
1059 break;
1060
1061 case WXK_TAB:
1062 // always produce navigation event - even if we process TAB
1063 // ourselves the fact that we got here means that the user code
1064 // decided to skip processing of this TAB - probably to let it
1065 // do its default job.
1066 //
1067 // NB: Notice that Ctrl-Tab is handled elsewhere and Alt-Tab is
1068 // handled by Windows
1069 {
c4955899 1070 wxNavigationKeyEvent vEventNav;
d90895ac 1071
c4955899
DW
1072 vEventNav.SetDirection(!rEvent.ShiftDown());
1073 vEventNav.SetWindowChange(FALSE);
1074 vEventNav.SetEventObject(this);
1075
1076 if ( GetEventHandler()->ProcessEvent(vEventNav) )
d90895ac
DW
1077 return;
1078 }
1079 break;
d90895ac 1080 }
c4955899
DW
1081 rEvent.Skip();
1082} // end of wxTextCtrl::OnChar
0e320a79 1083
c4955899
DW
1084bool wxTextCtrl::OS2Command(
1085 WXUINT uParam
1086, WXWORD WXUNUSED(vId)
1087)
0e320a79 1088{
c4955899 1089 switch (uParam)
d90895ac 1090 {
d90895ac
DW
1091 case EN_SETFOCUS:
1092 case EN_KILLFOCUS:
1093 {
c4955899
DW
1094 wxFocusEvent vEvent( uParam == EN_KILLFOCUS ? wxEVT_KILL_FOCUS
1095 : wxEVT_SET_FOCUS
1096 ,m_windowId
1097 );
1098
1099 vEvent.SetEventObject(this);
1100 GetEventHandler()->ProcessEvent(vEvent);
d90895ac
DW
1101 }
1102 break;
1103
1104 case EN_CHANGE:
1105 {
c4955899
DW
1106 wxCommandEvent vEvent( wxEVT_COMMAND_TEXT_UPDATED
1107 ,m_windowId
1108 );
1109
1110 InitCommandEvent(vEvent);
1111 vEvent.SetString((char*)GetValue().c_str());
1112 ProcessCommand(vEvent);
d90895ac
DW
1113 }
1114 break;
1115
c4955899
DW
1116 case EN_OVERFLOW:
1117 //
1118 // The text size limit has been hit - increase it
1119 //
d90895ac
DW
1120 AdjustSpaceLimit();
1121 break;
1122
c4955899
DW
1123 case EN_SCROLL:
1124 case EN_INSERTMODETOGGLE:
1125 case EN_MEMERROR:
1126 return FALSE;
d90895ac
DW
1127 default:
1128 return FALSE;
1129 }
1130
c4955899
DW
1131 //
1132 // Processed
1133 //
d90895ac 1134 return TRUE;
c4955899 1135} // end of wxTextCtrl::OS2Command
0e320a79 1136
d90895ac 1137void wxTextCtrl::AdjustSpaceLimit()
0e320a79 1138{
3bd418ca
DW
1139 unsigned int uLen = 0;
1140 unsigned int uLimit = 0;
d90895ac 1141
3bd418ca
DW
1142 uLen = ::WinQueryWindowTextLength(GetHwnd());
1143 if (m_bIsMLE)
1144 {
1145 uLimit = (unsigned int)::WinSendMsg( GetHwnd()
1146 ,MLM_QUERYTEXTLIMIT
1147 ,0
1148 ,0
1149 );
1150 }
1151 else
1152 {
1153 ENTRYFDATA* pEfd;
1154 WNDPARAMS vParams;
1155
1156 vParams.fsStatus = WPM_CBCTLDATA;
1157 vParams.cbCtlData = sizeof(ENTRYFDATA);
1158
1159 if (::WinSendMsg( GetHwnd()
1160 ,WM_QUERYWINDOWPARAMS
1161 ,&vParams
1162 ,0
1163 ))
1164 {
1165 pEfd = (ENTRYFDATA*)vParams.pCtlData;
1166 uLimit = (unsigned int)pEfd->cchEditLimit;
1167 }
d90895ac 1168 else
3bd418ca 1169 uLimit = 32; //PM's default
d90895ac 1170 }
3bd418ca
DW
1171 if (uLen >= uLimit)
1172 {
1173 uLimit = uLen + 0x8000; // 32Kb
1174 if (uLimit > 0xffff)
1175 {
1176 uLimit = 0L;
1177 }
1178 if (m_bIsMLE)
1179 ::WinSendMsg(GetHwnd(), MLM_SETTEXTLIMIT, MPFROMLONG(uLimit), 0);
1180 else
1181 ::WinSendMsg(GetHwnd(), EM_SETTEXTLIMIT, MPFROMLONG(uLimit), 0);
1182 }
1183} // end of wxTextCtrl::AdjustSpaceLimit
0e320a79 1184
d90895ac 1185bool wxTextCtrl::AcceptsFocus() const
0e320a79 1186{
c4955899 1187 //
57ff8a87
DW
1188 // We don't want focus if we can't be edited unless we're a multiline
1189 // control because then it might be still nice to get focus from keyboard
1190 // to be able to scroll it without mouse
c4955899 1191 //
57ff8a87 1192 return (IsEditable() || IsMultiLine()) && wxControl::AcceptsFocus();
c4955899 1193} // end of wxTextCtrl::Command
0e320a79 1194
e78c4d50 1195wxSize wxTextCtrl::DoGetBestSize() const
0e320a79 1196{
c4955899
DW
1197 int nCx;
1198 int nCy;
0e320a79 1199
c4955899 1200 wxGetCharSize(GetHWND(), &nCx, &nCy, (wxFont*)&GetFont());
d90895ac 1201
c4955899 1202 int wText = DEFAULT_ITEM_WIDTH;
987da0d4 1203 int hText = (EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * .8);
c4955899
DW
1204
1205 if (m_windowStyle & wxTE_MULTILINE)
d90895ac 1206 {
239c2e96 1207 hText *= wxMax(GetNumberOfLines(), 5);
d90895ac
DW
1208 }
1209 //else: for single line control everything is ok
d90895ac 1210 return wxSize(wText, hText);
c4955899 1211} // end of wxTextCtrl::DoGetBestSize
0e320a79 1212
d90895ac
DW
1213// ----------------------------------------------------------------------------
1214// standard handlers for standard edit menu events
1215// ----------------------------------------------------------------------------
1216
c4955899
DW
1217void wxTextCtrl::OnCut(
1218 wxCommandEvent& rEvent
1219)
0e320a79
DW
1220{
1221 Cut();
c4955899 1222} // end of wxTextCtrl::OnCut
0e320a79 1223
c4955899
DW
1224void wxTextCtrl::OnCopy(
1225 wxCommandEvent& rEvent
1226)
0e320a79
DW
1227{
1228 Copy();
c4955899 1229} // end of wxTextCtrl::OnCopy
0e320a79 1230
c4955899
DW
1231void wxTextCtrl::OnPaste(
1232 wxCommandEvent& rEvent
1233)
0e320a79
DW
1234{
1235 Paste();
c4955899 1236} // end of wxTextCtrl::OnPaste
0e320a79 1237
c4955899
DW
1238void wxTextCtrl::OnUndo(
1239 wxCommandEvent& rEvent
1240)
0e320a79
DW
1241{
1242 Undo();
c4955899 1243} // end of wxTextCtrl::OnUndo
0e320a79 1244
c4955899
DW
1245void wxTextCtrl::OnRedo(
1246 wxCommandEvent& rEvent
1247)
0e320a79
DW
1248{
1249 Redo();
c4955899 1250} // end of wxTextCtrl::OnRedo
0e320a79 1251
2b5f62a0
VZ
1252void wxTextCtrl::OnDelete(
1253 wxCommandEvent& rEvent
1254)
1255{
1256 long lFrom;
1257 long lTo;
1258
1259 GetSelection( &lFrom
1260 ,&lTo
1261 );
1262 if (lFrom != -1 && lTo != -1)
1263 Remove( lFrom
1264 ,lTo
1265 );
1266} // end of wxTextCtrl::OnDelete
1267
1268void wxTextCtrl::OnSelectAll(
1269 wxCommandEvent& rEvent
1270)
1271{
1272 SetSelection(-1, -1);
1273} // end of wxTextCtrl::OnSelectAll
1274
c4955899
DW
1275void wxTextCtrl::OnUpdateCut(
1276 wxUpdateUIEvent& rEvent
1277)
0e320a79 1278{
c4955899
DW
1279 rEvent.Enable(CanCut());
1280} // end of wxTextCtrl::OnUpdateCut
0e320a79 1281
c4955899
DW
1282void wxTextCtrl::OnUpdateCopy(
1283 wxUpdateUIEvent& rEvent
1284)
0e320a79 1285{
c4955899
DW
1286 rEvent.Enable(CanCopy());
1287} // end of wxTextCtrl::OnUpdateCopy
0e320a79 1288
c4955899
DW
1289void wxTextCtrl::OnUpdatePaste(
1290 wxUpdateUIEvent& rEvent
1291)
0e320a79 1292{
c4955899
DW
1293 rEvent.Enable(CanPaste());
1294} // end of wxTextCtrl::OnUpdatePaste
0e320a79 1295
c4955899
DW
1296void wxTextCtrl::OnUpdateUndo(
1297 wxUpdateUIEvent& rEvent
1298)
0e320a79 1299{
c4955899
DW
1300 rEvent.Enable(CanUndo());
1301} // end of wxTextCtrl::OnUpdateUndo
1302
1303void wxTextCtrl::OnUpdateRedo(
1304 wxUpdateUIEvent& rEvent
1305)
1306{
1307 rEvent.Enable(CanRedo());
1308} // end of wxTextCtrl::OnUpdateRedo
0e320a79 1309
2b5f62a0
VZ
1310void wxTextCtrl::OnUpdateDelete(
1311 wxUpdateUIEvent& rEvent
1312)
1313{
1314 long lFrom;
1315 long lTo;
1316
1317 GetSelection( &lFrom
1318 ,&lTo
1319 );
1320 rEvent.Enable( lFrom != -1L && lTo != -1L && lFrom != lTo && IsEditable()) ;
1321} // end of wxTextCtrl::OnUpdateDelete
1322
1323void wxTextCtrl::OnUpdateSelectAll(
1324 wxUpdateUIEvent& rEvent
1325)
1326{
1327 rEvent.Enable(GetLastPosition() > 0);
1328} // end of wxTextCtrl::OnUpdateSelectAll
1329
c4955899
DW
1330bool wxTextCtrl::SetBackgroundColour(
1331 const wxColour& rColour
1332)
0e320a79 1333{
c4955899
DW
1334 if (m_bIsMLE)
1335 ::WinSendMsg(GetHwnd(), MLM_SETBACKCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX);
1336 return TRUE;
1337} // end of wxTextCtrl::SetBackgroundColour
1338
1339bool wxTextCtrl::SetForegroundColour(
1340 const wxColour& rColour
1341)
1342{
1343 if (m_bIsMLE)
1344 ::WinSendMsg(GetHwnd(), MLM_SETTEXTCOLOR, (MPARAM)rColour.GetPixel(), MLE_INDEX);
1345 return TRUE;
1346} // end of wxTextCtrl::SetForegroundColour
d90895ac 1347
39c26ef2
DW
1348bool wxTextCtrl::SetStyle(
1349 long lStart
1350, long lEnd
1351, const wxTextAttr& rStyle
1352)
1353{
1354 HWND hWnd = GetHwnd();
1355
1356 if (lStart > lEnd)
1357 {
1358 long lTmp = lStart;
1359
1360 lStart = lEnd;
1361 lEnd = lTmp;
1362 }
1363
1364 //
1365 // We can only change the format of the selection, so select the range we
1366 // want and restore the old selection later
1367 //
1368 long lStartOld;
1369 long lEndOld;
1370
1371 GetSelection( &lStartOld
1372 ,&lEndOld
1373 );
1374
1375 //
1376 // But do we really have to change the selection?
1377 //
1378 bool bChangeSel = lStart != lStartOld ||
1379 lEnd != lEndOld;
1380
1381 if (bChangeSel)
1382 {
1383 if (m_bIsMLE)
1384 ::WinSendMsg(hWnd, MLM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0);
1385 else
1386 ::WinSendMsg(hWnd, EM_SETSEL, MPFROM2SHORT((USHORT)lStart, (USHORT)lEnd), 0);
1387 }
1388
1389 //
1390 // TODO:: finish this part
1391 //
1392 return TRUE;
1393} // end of wxTextCtrl::SetStyle
1394