1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/gtk/textctrl.h
3 // Purpose:
4 // Author:      Robert Roebling
5 // Created:     01/02/97
6 // Copyright:   (c) 1998 Robert Roebling
7 // Licence:     wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9 
10 #ifndef _WX_GTK_TEXTCTRL_H_
11 #define _WX_GTK_TEXTCTRL_H_
12 
13 typedef struct _GtkTextMark GtkTextMark;
14 
15 //-----------------------------------------------------------------------------
16 // wxTextCtrl
17 //-----------------------------------------------------------------------------
18 
19 class WXDLLIMPEXP_CORE wxTextCtrl: public wxTextCtrlBase
20 {
21 public:
wxTextCtrl()22     wxTextCtrl() { Init(); }
23     wxTextCtrl(wxWindow *parent,
24                wxWindowID id,
25                const wxString &value = wxEmptyString,
26                const wxPoint &pos = wxDefaultPosition,
27                const wxSize &size = wxDefaultSize,
28                long style = 0,
29                const wxValidator& validator = wxDefaultValidator,
30                const wxString &name = wxTextCtrlNameStr);
31 
32     virtual ~wxTextCtrl();
33 
34     bool Create(wxWindow *parent,
35                 wxWindowID id,
36                 const wxString &value = wxEmptyString,
37                 const wxPoint &pos = wxDefaultPosition,
38                 const wxSize &size = wxDefaultSize,
39                 long style = 0,
40                 const wxValidator& validator = wxDefaultValidator,
41                 const wxString &name = wxTextCtrlNameStr);
42 
43     // implement base class pure virtuals
44     // ----------------------------------
45 
46     virtual void WriteText(const wxString& text);
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     virtual void GetSelection(long* from, long* to) const;
58 
59     virtual void Remove(long from, long to);
60 
61     virtual void MarkDirty();
62     virtual void DiscardEdits();
63 
64     virtual bool SetStyle(long start, long end, const wxTextAttr& style);
65     virtual bool GetStyle(long position, wxTextAttr& style);
66 
67     // translate between the position (which is just an index in the text ctrl
68     // considering all its contents as a single strings) and (x, y) coordinates
69     // which represent column and line.
70     virtual long XYToPosition(long x, long y) const;
71     virtual bool PositionToXY(long pos, long *x, long *y) const;
72 
73     virtual void ShowPosition(long pos);
74 
75     virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const;
HitTest(const wxPoint & pt,wxTextCoord * col,wxTextCoord * row)76     virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt,
77                                             wxTextCoord *col,
78                                             wxTextCoord *row) const
79     {
80         return wxTextCtrlBase::HitTest(pt, col, row);
81     }
82 
83     // Clipboard operations
84     virtual void Copy();
85     virtual void Cut();
86     virtual void Paste();
87 
88     // Insertion point
89     virtual void SetInsertionPoint(long pos);
90     virtual long GetInsertionPoint() const;
91     virtual wxTextPos GetLastPosition() const;
92 
93     virtual void SetSelection(long from, long to);
94     virtual void SetEditable(bool editable);
95 
96     // Overridden wxWindow methods
97     virtual void SetWindowStyleFlag( long style );
98     virtual bool Enable( bool enable = true );
99 
100     // Implementation from now on
101     void OnDropFiles( wxDropFilesEvent &event );
102     void OnChar( wxKeyEvent &event );
103 
104     void OnCut(wxCommandEvent& event);
105     void OnCopy(wxCommandEvent& event);
106     void OnPaste(wxCommandEvent& event);
107     void OnUndo(wxCommandEvent& event);
108     void OnRedo(wxCommandEvent& event);
109 
110     void OnUpdateCut(wxUpdateUIEvent& event);
111     void OnUpdateCopy(wxUpdateUIEvent& event);
112     void OnUpdatePaste(wxUpdateUIEvent& event);
113     void OnUpdateUndo(wxUpdateUIEvent& event);
114     void OnUpdateRedo(wxUpdateUIEvent& event);
115 
116     bool SetFont(const wxFont& font);
117     bool SetForegroundColour(const wxColour& colour);
118     bool SetBackgroundColour(const wxColour& colour);
119 
120     GtkWidget* GetConnectWidget();
121 
SetUpdateFont(bool WXUNUSED (update))122     void SetUpdateFont(bool WXUNUSED(update)) { }
123 
124     // implementation only from now on
125 
126     // tell the control to ignore next text changed signal
127     void IgnoreNextTextUpdate(int n = 1) { m_countUpdatesToIgnore = n; }
128 
129     // should we ignore the changed signal? always resets the flag
130     bool IgnoreTextUpdate();
131 
132     // call this to indicate that the control is about to be changed
133     // programmatically and so m_modified flag shouldn't be set
DontMarkDirtyOnNextChange()134     void DontMarkDirtyOnNextChange() { m_dontMarkDirty = true; }
135 
136     // should we mark the control as dirty? always resets the flag
137     bool MarkDirtyOnChange();
138 
139     // always let GTK have mouse release events for multiline controls
140     virtual bool GTKProcessEvent(wxEvent& event) const;
141 
142 
143     static wxVisualAttributes
144     GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
145 
146 protected:
147     // overridden wxWindow virtual methods
148     virtual wxSize DoGetBestSize() const;
149     virtual void DoApplyWidgetStyle(GtkRcStyle *style);
150     virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const;
151 
152     virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
153 
154     virtual void DoFreeze();
155     virtual void DoThaw();
156 
157     // Widgets that use the style->base colour for the BG colour should
158     // override this and return true.
UseGTKStyleBase()159     virtual bool UseGTKStyleBase() const { return true; }
160 
161     virtual void DoSetValue(const wxString &value, int flags = 0);
162 
163     // Override this to use either GtkEntry or GtkTextView IME depending on the
164     // kind of control we are.
165     virtual int GTKIMFilterKeypress(GdkEventKey* event) const;
166 
167     virtual wxPoint DoPositionToCoords(long pos) const;
168 
169     // wrappers hiding the differences between functions doing the same thing
170     // for GtkTextView and GtkEntry (all of them use current window style to
171     // set the given characteristic)
172     void GTKSetEditable();
173     void GTKSetVisibility();
174     void GTKSetActivatesDefault();
175     void GTKSetWrapMode();
176     void GTKSetJustification();
177 
178 private:
179     void Init();
180 
181     // overridden wxTextEntry virtual methods
182     virtual GtkEditable *GetEditable() const;
183     virtual GtkEntry *GetEntry() const;
184     virtual void EnableTextChangedEvents(bool enable);
185 
186     // change the font for everything in this control
187     void ChangeFontGlobally();
188 
189     // get the encoding which is used in this control: this looks at our font
190     // and default style but not the current style (i.e. the style for the
191     // current position); returns wxFONTENCODING_SYSTEM if we have no specific
192     // encoding
193     wxFontEncoding GetTextEncoding() const;
194 
195     // returns either m_text or m_buffer depending on whether the control is
196     // single- or multi-line; convenient for the GTK+ functions which work with
197     // both
GetTextObject()198     void *GetTextObject() const
199     {
200         return IsMultiLine() ? static_cast<void *>(m_buffer)
201                              : static_cast<void *>(m_text);
202     }
203 
204 
205     // the widget used for single line controls
206     GtkWidget  *m_text;
207 
208     bool        m_modified:1;
209     bool        m_dontMarkDirty:1;
210 
211     int         m_countUpdatesToIgnore;
212 
213     // Our text buffer. Convenient, and holds the buffer while using
214     // a dummy one when frozen
215     GtkTextBuffer *m_buffer;
216 
217     GtkTextMark* m_showPositionOnThaw;
218     GSList* m_anonymousMarkList;
219 
220     // For wxTE_AUTO_URL
221     void OnUrlMouseEvent(wxMouseEvent&);
222 
223     DECLARE_EVENT_TABLE()
224     DECLARE_DYNAMIC_CLASS(wxTextCtrl)
225 };
226 
227 #endif // _WX_GTK_TEXTCTRL_H_
228