1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/msw/textctrl.h
3// Purpose:     wxTextCtrl class
4// Author:      Julian Smart
5// Modified by:
6// Created:     01/02/97
7// RCS-ID:      $Id: textctrl.h 52547 2008-03-15 12:33:04Z VS $
8// Copyright:   (c) Julian Smart
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_TEXTCTRL_H_
13#define _WX_TEXTCTRL_H_
14
15class WXDLLEXPORT wxTextCtrl : public wxTextCtrlBase
16{
17public:
18    // creation
19    // --------
20
21    wxTextCtrl() { Init(); }
22    wxTextCtrl(wxWindow *parent, wxWindowID id,
23               const wxString& value = wxEmptyString,
24               const wxPoint& pos = wxDefaultPosition,
25               const wxSize& size = wxDefaultSize,
26               long style = 0,
27               const wxValidator& validator = wxDefaultValidator,
28               const wxString& name = wxTextCtrlNameStr)
29    {
30        Init();
31
32        Create(parent, id, value, pos, size, style, validator, name);
33    }
34    virtual ~wxTextCtrl();
35
36    bool Create(wxWindow *parent, wxWindowID id,
37                const wxString& value = wxEmptyString,
38                const wxPoint& pos = wxDefaultPosition,
39                const wxSize& size = wxDefaultSize,
40                long style = 0,
41                const wxValidator& validator = wxDefaultValidator,
42                const wxString& name = wxTextCtrlNameStr);
43
44    // implement base class pure virtuals
45    // ----------------------------------
46
47    virtual wxString GetValue() const;
48    virtual bool IsEmpty() const;
49
50    virtual wxString GetRange(long from, long to) const;
51
52    virtual int GetLineLength(long lineNo) const;
53    virtual wxString GetLineText(long lineNo) const;
54    virtual int GetNumberOfLines() const;
55
56    virtual bool IsModified() const;
57    virtual bool IsEditable() const;
58
59    virtual void GetSelection(long* from, long* to) const;
60
61    // operations
62    // ----------
63
64    // editing
65    virtual void Clear();
66    virtual void Replace(long from, long to, const wxString& value);
67    virtual void Remove(long from, long to);
68
69    // load the control's contents from the file
70    virtual bool DoLoadFile(const wxString& file, int fileType);
71
72    // clears the dirty flag
73    virtual void MarkDirty();
74    virtual void DiscardEdits();
75
76    virtual void SetMaxLength(unsigned long len);
77
78    // writing text inserts it at the current position, appending always
79    // inserts it at the end
80    virtual void WriteText(const wxString& text);
81    virtual void AppendText(const wxString& text);
82
83#ifdef __WIN32__
84    virtual bool EmulateKeyPress(const wxKeyEvent& event);
85#endif // __WIN32__
86
87#if wxUSE_RICHEDIT
88    // apply text attribute to the range of text (only works with richedit
89    // controls)
90    virtual bool SetStyle(long start, long end, const wxTextAttr& style);
91    virtual bool SetDefaultStyle(const wxTextAttr& style);
92    virtual bool GetStyle(long position, wxTextAttr& style);
93#endif // wxUSE_RICHEDIT
94
95    // translate between the position (which is just an index in the text ctrl
96    // considering all its contents as a single strings) and (x, y) coordinates
97    // which represent column and line.
98    virtual long XYToPosition(long x, long y) const;
99    virtual bool PositionToXY(long pos, long *x, long *y) const;
100
101    virtual void ShowPosition(long pos);
102    virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const;
103    virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt,
104                                            wxTextCoord *col,
105                                            wxTextCoord *row) const
106    {
107        return wxTextCtrlBase::HitTest(pt, col, row);
108    }
109
110    // Clipboard operations
111    virtual void Copy();
112    virtual void Cut();
113    virtual void Paste();
114
115    virtual bool CanCopy() const;
116    virtual bool CanCut() const;
117    virtual bool CanPaste() const;
118
119    // Undo/redo
120    virtual void Undo();
121    virtual void Redo();
122
123    virtual bool CanUndo() const;
124    virtual bool CanRedo() const;
125
126    // Insertion point
127    virtual void SetInsertionPoint(long pos);
128    virtual void SetInsertionPointEnd();
129    virtual long GetInsertionPoint() const;
130    virtual wxTextPos GetLastPosition() const;
131
132    virtual void SetSelection(long from, long to);
133    virtual void SetEditable(bool editable);
134
135    // Caret handling (Windows only)
136
137    bool ShowNativeCaret(bool show = true);
138    bool HideNativeCaret() { return ShowNativeCaret(false); }
139
140    // Implementation from now on
141    // --------------------------
142
143    virtual void SetWindowStyleFlag(long style);
144
145    virtual void Command(wxCommandEvent& event);
146    virtual bool MSWCommand(WXUINT param, WXWORD id);
147    virtual WXHBRUSH MSWControlColor(WXHDC hDC, WXHWND hWnd);
148
149#if wxUSE_RICHEDIT
150    virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
151
152    int GetRichVersion() const { return m_verRichEdit; }
153    bool IsRich() const { return m_verRichEdit != 0; }
154
155    // rich edit controls are not compatible with normal ones and wem ust set
156    // the colours for them otherwise
157    virtual bool SetBackgroundColour(const wxColour& colour);
158    virtual bool SetForegroundColour(const wxColour& colour);
159#else
160    bool IsRich() const { return false; }
161#endif // wxUSE_RICHEDIT
162
163#if wxUSE_INKEDIT && wxUSE_RICHEDIT
164    bool IsInkEdit() const { return m_isInkEdit != 0; }
165#else
166    bool IsInkEdit() const { return false; }
167#endif
168
169    virtual void AdoptAttributesFromHWND();
170
171    virtual bool AcceptsFocus() const;
172
173    // callbacks
174    void OnDropFiles(wxDropFilesEvent& event);
175    void OnChar(wxKeyEvent& event); // Process 'enter' if required
176
177    void OnCut(wxCommandEvent& event);
178    void OnCopy(wxCommandEvent& event);
179    void OnPaste(wxCommandEvent& event);
180    void OnUndo(wxCommandEvent& event);
181    void OnRedo(wxCommandEvent& event);
182    void OnDelete(wxCommandEvent& event);
183    void OnSelectAll(wxCommandEvent& event);
184
185    void OnUpdateCut(wxUpdateUIEvent& event);
186    void OnUpdateCopy(wxUpdateUIEvent& event);
187    void OnUpdatePaste(wxUpdateUIEvent& event);
188    void OnUpdateUndo(wxUpdateUIEvent& event);
189    void OnUpdateRedo(wxUpdateUIEvent& event);
190    void OnUpdateDelete(wxUpdateUIEvent& event);
191    void OnUpdateSelectAll(wxUpdateUIEvent& event);
192
193    // Show a context menu for Rich Edit controls (the standard
194    // EDIT control has one already)
195    void OnContextMenu(wxContextMenuEvent& event);
196
197    // be sure the caret remains invisible if the user
198    // called HideNativeCaret() before
199    void OnSetFocus(wxFocusEvent& event);
200
201    // intercept WM_GETDLGCODE
202    virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
203
204    virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg);
205    virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
206    virtual wxVisualAttributes GetDefaultAttributes() const;
207
208protected:
209    // common part of all ctors
210    void Init();
211
212    // creates the control of appropriate class (plain or rich edit) with the
213    // styles corresponding to m_windowStyle
214    //
215    // this is used by ctor/Create() and when we need to recreate the control
216    // later
217    bool MSWCreateText(const wxString& value,
218                       const wxPoint& pos,
219                       const wxSize& size);
220
221    virtual void DoSetValue(const wxString &value, int flags = 0);
222
223    // return true if this control has a user-set limit on amount of text (i.e.
224    // the limit is due to a previous call to SetMaxLength() and not built in)
225    bool HasSpaceLimit(unsigned int *len) const;
226
227    // call this to increase the size limit (will do nothing if the current
228    // limit is big enough)
229    //
230    // returns true if we increased the limit to allow entering more text,
231    // false if we hit the limit set by SetMaxLength() and so didn't change it
232    bool AdjustSpaceLimit();
233
234#if wxUSE_RICHEDIT && (!wxUSE_UNICODE || wxUSE_UNICODE_MSLU)
235    // replace the selection or the entire control contents with the given text
236    // in the specified encoding
237    bool StreamIn(const wxString& value, wxFontEncoding encoding, bool selOnly);
238
239    // get the contents of the control out as text in the given encoding
240    wxString StreamOut(wxFontEncoding encoding, bool selOnly = false) const;
241#endif // wxUSE_RICHEDIT
242
243    // replace the contents of the selection or of the entire control with the
244    // given text
245    void DoWriteText(const wxString& text,
246                     int flags = SetValue_SendEvent | SetValue_SelectionOnly);
247
248    // set the selection possibly without scrolling the caret into view
249    void DoSetSelection(long from, long to, bool scrollCaret = true);
250
251    // return true if there is a non empty selection in the control
252    bool HasSelection() const;
253
254    // get the length of the line containing the character at the given
255    // position
256    long GetLengthOfLineContainingPos(long pos) const;
257
258    // send TEXT_UPDATED event, return true if it was handled, false otherwise
259    bool SendUpdateEvent();
260
261    virtual wxSize DoGetBestSize() const;
262
263#if wxUSE_RICHEDIT
264    // we're using RICHEDIT (and not simple EDIT) control if this field is not
265    // 0, it also gives the version of the RICHEDIT control being used (1, 2 or
266    // 3 so far)
267    int m_verRichEdit;
268#endif // wxUSE_RICHEDIT
269
270    // number of EN_UPDATE events sent by Windows when we change the controls
271    // text ourselves: we want this to be exactly 1
272    int m_updatesCount;
273
274private:
275    void OnKeyDown(wxKeyEvent& event);
276
277    DECLARE_EVENT_TABLE()
278    DECLARE_DYNAMIC_CLASS_NO_COPY(wxTextCtrl)
279
280    wxMenu* m_privateContextMenu;
281
282    bool m_isNativeCaretShown;
283
284#if wxUSE_INKEDIT && wxUSE_RICHEDIT
285    int  m_isInkEdit;
286#endif
287
288};
289
290#endif
291    // _WX_TEXTCTRL_H_
292