1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/gtk/textctrl.h
3 // Purpose:
4 // Author:      Robert Roebling
5 // Created:     01/02/97
6 // Id:          $Id: textctrl.h 43870 2006-12-09 06:21:15Z PC $
7 // Copyright:   (c) 1998 Robert Roebling
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef _WX_GTK_TEXTCTRL_H_
12 #define _WX_GTK_TEXTCTRL_H_
13 
14 typedef struct _GtkTextMark GtkTextMark;
15 
16 //-----------------------------------------------------------------------------
17 // wxTextCtrl
18 //-----------------------------------------------------------------------------
19 
20 class WXDLLIMPEXP_CORE wxTextCtrl: public wxTextCtrlBase
21 {
22 public:
wxTextCtrl()23     wxTextCtrl() { Init(); }
24     wxTextCtrl(wxWindow *parent,
25                wxWindowID id,
26                const wxString &value = wxEmptyString,
27                const wxPoint &pos = wxDefaultPosition,
28                const wxSize &size = wxDefaultSize,
29                long style = 0,
30                const wxValidator& validator = wxDefaultValidator,
31                const wxString &name = wxTextCtrlNameStr);
32 
33     virtual ~wxTextCtrl();
34 
35     bool Create(wxWindow *parent,
36                 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 int GetLineLength(long lineNo) const;
51     virtual wxString GetLineText(long lineNo) const;
52     virtual int GetNumberOfLines() const;
53 
54     virtual bool IsModified() const;
55     virtual bool IsEditable() const;
56 
57     // If the return values from and to are the same, there is no selection.
58     virtual void GetSelection(long* from, long* to) const;
59 
60     // operations
61     // ----------
62 
63     // editing
64     virtual void Clear();
65     virtual void Replace(long from, long to, const wxString& value);
66     virtual void Remove(long from, long to);
67 
68     // sets/clears the dirty flag
69     virtual void MarkDirty();
70     virtual void DiscardEdits();
71 
72     virtual void SetMaxLength(unsigned long len);
73 
74     // writing text inserts it at the current position, appending always
75     // inserts it at the end
76     virtual void WriteText(const wxString& text);
77     virtual void AppendText(const wxString& text);
78 
79     // apply text attribute to the range of text (only works with richedit
80     // controls)
81     virtual bool SetStyle(long start, long end, const wxTextAttr& style);
82 
83     // translate between the position (which is just an index in the text ctrl
84     // considering all its contents as a single strings) and (x, y) coordinates
85     // which represent column and line.
86     virtual long XYToPosition(long x, long y) const;
87     virtual bool PositionToXY(long pos, long *x, long *y) const;
88 
89     virtual void ShowPosition(long pos);
90 
91     virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const;
HitTest(const wxPoint & pt,wxTextCoord * col,wxTextCoord * row)92     virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt,
93                                             wxTextCoord *col,
94                                             wxTextCoord *row) const
95     {
96         return wxTextCtrlBase::HitTest(pt, col, row);
97     }
98 
99     // Clipboard operations
100     virtual void Copy();
101     virtual void Cut();
102     virtual void Paste();
103 
104     // Undo/redo
105     virtual void Undo();
106     virtual void Redo();
107 
108     virtual bool CanUndo() const;
109     virtual bool CanRedo() const;
110 
111     // Insertion point
112     virtual void SetInsertionPoint(long pos);
113     virtual void SetInsertionPointEnd();
114     virtual long GetInsertionPoint() const;
115     virtual wxTextPos GetLastPosition() const;
116 
117     virtual void SetSelection(long from, long to);
118     virtual void SetEditable(bool editable);
119 
120     // Overridden wxWindow methods
121     virtual void SetWindowStyleFlag( long style );
122     virtual bool Enable( bool enable = true );
123 
124     // Implementation from now on
125     void OnDropFiles( wxDropFilesEvent &event );
126     void OnChar( wxKeyEvent &event );
127 
128     void OnCut(wxCommandEvent& event);
129     void OnCopy(wxCommandEvent& event);
130     void OnPaste(wxCommandEvent& event);
131     void OnUndo(wxCommandEvent& event);
132     void OnRedo(wxCommandEvent& event);
133 
134     void OnUpdateCut(wxUpdateUIEvent& event);
135     void OnUpdateCopy(wxUpdateUIEvent& event);
136     void OnUpdatePaste(wxUpdateUIEvent& event);
137     void OnUpdateUndo(wxUpdateUIEvent& event);
138     void OnUpdateRedo(wxUpdateUIEvent& event);
139 
140     bool SetFont(const wxFont& font);
141     bool SetForegroundColour(const wxColour& colour);
142     bool SetBackgroundColour(const wxColour& colour);
143 
144     GtkWidget* GetConnectWidget();
145 
SetUpdateFont(bool WXUNUSED (update))146     void SetUpdateFont(bool WXUNUSED(update)) { }
147 
148     // GTK+ textctrl is so dumb that you need to freeze/thaw it manually to
149     // avoid horrible flicker/scrolling back and forth
150     virtual void Freeze();
151     virtual void Thaw();
152 
153     // implementation only from now on
154 
155     // wxGTK-specific: called recursively by Enable,
156     // to give widgets an oppprtunity to correct their colours after they
157     // have been changed by Enable
158     virtual void OnParentEnable( bool enable ) ;
159 
160     // tell the control to ignore next text changed signal
161     void IgnoreNextTextUpdate(int n = 1) { m_countUpdatesToIgnore = n; }
162 
163     // should we ignore the changed signal? always resets the flag
164     bool IgnoreTextUpdate();
165 
166     // call this to indicate that the control is about to be changed
167     // programmatically and so m_modified flag shouldn't be set
DontMarkDirtyOnNextChange()168     void DontMarkDirtyOnNextChange() { m_dontMarkDirty = true; }
169 
170     // should we mark the control as dirty? always resets the flag
171     bool MarkDirtyOnChange();
172 
173     // always let GTK have mouse release events for multiline controls
174     virtual bool GTKProcessEvent(wxEvent& event) const;
175 
176 
177     static wxVisualAttributes
178     GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
179 
180     // has the control been frozen by Freeze()?
IsFrozen()181     bool IsFrozen() const { return m_freezeCount > 0; }
182 
183 protected:
184     virtual wxSize DoGetBestSize() const;
185     virtual void DoApplyWidgetStyle(GtkRcStyle *style);
186     virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const;
187 
188     // common part of all ctors
189     void Init();
190 
191     // Widgets that use the style->base colour for the BG colour should
192     // override this and return true.
UseGTKStyleBase()193     virtual bool UseGTKStyleBase() const { return true; }
194 
195     virtual void DoSetValue(const wxString &value, int flags = 0);
196 
197     // wrappers hiding the differences between functions doing the same thing
198     // for GtkTextView and GtkEntry (all of them use current window style to
199     // set the given characteristic)
200     void GTKSetEditable();
201     void GTKSetVisibility();
202     void GTKSetWrapMode();
203     void GTKSetJustification();
204 
205 private:
206     // change the font for everything in this control
207     void ChangeFontGlobally();
208 
209     // get the encoding which is used in this control: this looks at our font
210     // and default style but not the current style (i.e. the style for the
211     // current position); returns wxFONTENCODING_SYSTEM if we have no specific
212     // encoding
213     wxFontEncoding GetTextEncoding() const;
214 
215 
216     GtkWidget  *m_text;
217 
218     bool        m_modified:1;
219     bool        m_dontMarkDirty:1;
220 
221     int         m_countUpdatesToIgnore;
222 
223     // Our text buffer. Convenient, and holds the buffer while using
224     // a dummy one when frozen
225     GtkTextBuffer *m_buffer;
226 
227     // number of calls to Freeze() minus number of calls to Thaw()
228     unsigned m_freezeCount;
229     GtkTextMark* m_showPositionOnThaw;
230 
231     // For wxTE_AUTO_URL
232     void OnUrlMouseEvent(wxMouseEvent&);
233     GdkCursor *m_gdkHandCursor;
234     GdkCursor *m_gdkXTermCursor;
235 
236     DECLARE_EVENT_TABLE()
237     DECLARE_DYNAMIC_CLASS(wxTextCtrl)
238 };
239 
240 #endif // _WX_GTK_TEXTCTRL_H_
241