]> git.saurik.com Git - wxWidgets.git/blob - src/gtk/textctrl.cpp
It's possible now to save to a PNG. OK, I still
[wxWidgets.git] / src / gtk / textctrl.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: textctrl.cpp
3 // Purpose:
4 // Author: Robert Roebling
5 // Created: 01/02/97
6 // Id:
7 // Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 #ifdef __GNUG__
12 #pragma implementation "textctrl.h"
13 #endif
14
15 #include "wx/textctrl.h"
16 #include "wx/utils.h"
17 #include <wx/intl.h>
18
19 //-----------------------------------------------------------------------------
20 // "changed"
21 //-----------------------------------------------------------------------------
22
23 static void gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
24 {
25 win->SetModified();
26
27 wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->m_windowId );
28 wxString val( win->GetValue() );
29 if (!val.IsNull()) event.m_commandString = WXSTRINGCAST val;
30 event.SetEventObject( win );
31 win->GetEventHandler()->ProcessEvent( event );
32 }
33
34 //-----------------------------------------------------------------------------
35 // wxTextCtrl
36 //-----------------------------------------------------------------------------
37
38 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl,wxControl)
39
40 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
41 EVT_CHAR(wxTextCtrl::OnChar)
42 END_EVENT_TABLE()
43
44 wxTextCtrl::wxTextCtrl(void) : streambuf()
45 {
46 if (allocate()) setp(base(),ebuf());
47
48 m_modified = FALSE;
49 }
50
51 wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value,
52 const wxPoint &pos, const wxSize &size,
53 int style, const wxValidator& validator, const wxString &name ) : streambuf()
54 {
55 if (allocate()) setp(base(),ebuf());
56
57 m_modified = FALSE;
58 Create( parent, id, value, pos, size, style, validator, name );
59 }
60
61 bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
62 const wxPoint &pos, const wxSize &size,
63 int style, const wxValidator& validator, const wxString &name )
64 {
65 m_needParent = TRUE;
66
67 PreCreation( parent, id, pos, size, style, name );
68
69 SetValidator( validator );
70
71 bool bMultiLine = (style & wxTE_MULTILINE) != 0;
72 if ( bMultiLine )
73 {
74 // a multi-line edit control: create a vertical scrollbar by default and
75 // horizontal if requested
76 bool bHasHScrollbar = (style & wxHSCROLL) != 0;
77
78 // create our control...
79 m_text = gtk_text_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
80
81 // ... and put into the upper left hand corner of the table
82 m_widget = gtk_table_new(bHasHScrollbar ? 2 : 1, 2, FALSE);
83 gtk_table_attach(GTK_TABLE(m_widget), m_text, 0, 1, 0, 1,
84 GTK_FILL | GTK_EXPAND,
85 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
86 0, 0);
87
88 // put the horizontal scrollbar in the lower left hand corner
89 if (bHasHScrollbar)
90 {
91 GtkWidget *hscrollbar = gtk_hscrollbar_new(GTK_TEXT(m_text)->hadj);
92 gtk_table_attach(GTK_TABLE(m_widget), hscrollbar, 0, 1, 1, 2,
93 GTK_EXPAND | GTK_FILL,
94 GTK_FILL,
95 0, 0);
96 gtk_widget_show(hscrollbar);
97 }
98
99 // finally, put the vertical scrollbar in the upper right corner
100 GtkWidget *vscrollbar = gtk_vscrollbar_new(GTK_TEXT(m_text)->vadj);
101 gtk_table_attach(GTK_TABLE(m_widget), vscrollbar, 1, 2, 0, 1,
102 GTK_FILL,
103 GTK_EXPAND | GTK_FILL | GTK_SHRINK,
104 0, 0);
105 gtk_widget_show( vscrollbar );
106 }
107 else
108 {
109 // a single-line text control: no need for scrollbars
110 m_widget =
111 m_text = gtk_entry_new();
112 }
113
114 wxSize newSize = size;
115 if (newSize.x == -1) newSize.x = 80;
116 if (newSize.y == -1) newSize.y = 26;
117 SetSize( newSize.x, newSize.y );
118
119 PostCreation();
120
121 if (bMultiLine)
122 {
123 gtk_widget_realize(m_text);
124 gtk_widget_show(m_text);
125 }
126
127 // we want to be notified about text changes
128 gtk_signal_connect(GTK_OBJECT(m_text), "changed",
129 GTK_SIGNAL_FUNC(gtk_text_changed_callback),
130 (gpointer)this);
131
132 if (!value.IsNull())
133 {
134 gint tmp = 0;
135 gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &tmp );
136 }
137
138 if (style & wxTE_READONLY)
139 {
140 }
141 else
142 {
143 if (bMultiLine)
144 gtk_text_set_editable( GTK_TEXT(m_text), 1 );
145 }
146
147 Show( TRUE );
148
149 return TRUE;
150 }
151
152 wxString wxTextCtrl::GetValue(void) const
153 {
154 wxString tmp;
155 if (m_windowStyle & wxTE_MULTILINE)
156 {
157 gint len = gtk_text_get_length( GTK_TEXT(m_text) );
158 tmp = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
159 }
160 else
161 {
162 tmp = gtk_entry_get_text( GTK_ENTRY(m_text) );
163 }
164 return tmp;
165 }
166
167 void wxTextCtrl::SetValue( const wxString &value )
168 {
169 wxString tmp = "";
170 if (!value.IsNull()) tmp = value;
171 if (m_windowStyle & wxTE_MULTILINE)
172 {
173 gint len = gtk_text_get_length( GTK_TEXT(m_text) );
174 gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len );
175 len = 0;
176 gtk_editable_insert_text( GTK_EDITABLE(m_text), tmp, tmp.Length(), &len );
177 }
178 else
179 {
180 gtk_entry_set_text( GTK_ENTRY(m_text), tmp );
181 }
182 }
183
184 void wxTextCtrl::WriteText( const wxString &text )
185 {
186 if (text.IsNull()) return;
187
188 if (m_windowStyle & wxTE_MULTILINE)
189 {
190 gint len = gtk_text_get_length( GTK_TEXT(m_text) );
191 gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
192 }
193 else
194 {
195 gtk_entry_append_text( GTK_ENTRY(m_text), text );
196 }
197 }
198
199 bool wxTextCtrl::LoadFile( const wxString &WXUNUSED(file) )
200 {
201 wxFAIL_MSG( "wxTextCtrl::LoadFile not implemented" );
202
203 return FALSE;
204 }
205
206 bool wxTextCtrl::SaveFile( const wxString &WXUNUSED(file) )
207 {
208 wxFAIL_MSG( "wxTextCtrl::SaveFile not implemented" );
209
210 return FALSE;
211 }
212
213 /*
214 wxString wxTextCtrl::GetLineText( long lineNo ) const
215 {
216 }
217
218
219 void wxTextCtrl::OnDropFiles( wxDropFilesEvent &event )
220 {
221 }
222
223 long wxTextCtrl::PositionToXY( long pos, long *x, long *y ) const
224 {
225 }
226
227 long wxTextCtrl::XYToPosition( long x, long y )
228 {
229 }
230
231 int wxTextCtrl::GetNumberOfLines(void)
232 {
233 }
234
235 */
236 void wxTextCtrl::SetInsertionPoint( long pos )
237 {
238 int tmp = (int) pos;
239 if (m_windowStyle & wxTE_MULTILINE)
240 gtk_text_set_point( GTK_TEXT(m_text), tmp );
241 else
242 gtk_entry_set_position( GTK_ENTRY(m_text), tmp );
243 }
244
245 void wxTextCtrl::SetInsertionPointEnd(void)
246 {
247 int pos = 0;
248 if (m_windowStyle & wxTE_MULTILINE)
249 pos = gtk_text_get_length( GTK_TEXT(m_text) );
250 else
251 pos = GTK_ENTRY(m_text)->text_length;
252 SetInsertionPoint( pos-1 );
253 }
254
255 void wxTextCtrl::SetEditable( bool editable )
256 {
257 if (m_windowStyle & wxTE_MULTILINE)
258 gtk_text_set_editable( GTK_TEXT(m_text), editable );
259 else
260 gtk_entry_set_editable( GTK_ENTRY(m_text), editable );
261 }
262
263 void wxTextCtrl::SetSelection( long from, long to )
264 {
265 gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
266 }
267
268 void wxTextCtrl::ShowPosition( long WXUNUSED(pos) )
269 {
270 wxFAIL_MSG(_("wxTextCtrl::ShowPosition not implemented"));
271 }
272
273 long wxTextCtrl::GetInsertionPoint(void) const
274 {
275 return (long) GTK_EDITABLE(m_text)->current_pos;
276 }
277
278 long wxTextCtrl::GetLastPosition(void) const
279 {
280 int pos = 0;
281 if (m_windowStyle & wxTE_MULTILINE)
282 pos = gtk_text_get_length( GTK_TEXT(m_text) );
283 else
284 pos = GTK_ENTRY(m_text)->text_length;
285 return (long)pos-1;
286 }
287
288 void wxTextCtrl::Remove( long from, long to )
289 {
290 gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
291 }
292
293 void wxTextCtrl::Replace( long from, long to, const wxString &value )
294 {
295 gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
296 if (value.IsNull()) return;
297 gint pos = (gint)to;
298 gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos );
299 }
300
301 void wxTextCtrl::Cut(void)
302 {
303 gtk_editable_cut_clipboard( GTK_EDITABLE(m_text), 0 );
304 }
305
306 void wxTextCtrl::Copy(void)
307 {
308 gtk_editable_copy_clipboard( GTK_EDITABLE(m_text), 0 );
309 }
310
311 void wxTextCtrl::Paste(void)
312 {
313 gtk_editable_paste_clipboard( GTK_EDITABLE(m_text), 0 );
314 }
315
316 void wxTextCtrl::Delete(void)
317 {
318 SetValue( "" );
319 }
320
321 void wxTextCtrl::OnChar( wxKeyEvent &key_event )
322 {
323 if ((key_event.KeyCode() == WXK_RETURN) && (m_windowStyle & wxPROCESS_ENTER))
324 {
325 wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
326 event.SetEventObject(this);
327 printf( "Hallo.\n" );
328 if (GetEventHandler()->ProcessEvent(event)) return;
329 }
330 else if (key_event.KeyCode() == WXK_TAB)
331 {
332 wxNavigationKeyEvent event;
333 event.SetDirection( key_event.m_shiftDown );
334 event.SetWindowChange(FALSE);
335 event.SetEventObject(this);
336
337 if (GetEventHandler()->ProcessEvent(event)) return;
338 }
339 key_event.Skip();
340 }
341
342 int wxTextCtrl::overflow( int WXUNUSED(c) )
343 {
344 int len = pptr() - pbase();
345 char *txt = new char[len+1];
346 strncpy(txt, pbase(), len);
347 txt[len] = '\0';
348 (*this) << txt;
349 setp(pbase(), epptr());
350 delete[] txt;
351 return EOF;
352 }
353
354 int wxTextCtrl::sync(void)
355 {
356 int len = pptr() - pbase();
357 char *txt = new char[len+1];
358 strncpy(txt, pbase(), len);
359 txt[len] = '\0';
360 (*this) << txt;
361 setp(pbase(), epptr());
362 delete[] txt;
363 return 0;
364 }
365
366 int wxTextCtrl::underflow(void)
367 {
368 return EOF;
369 }
370
371 wxTextCtrl& wxTextCtrl::operator<<(const wxString& s)
372 {
373 WriteText(s);
374 return *this;
375 }
376
377 wxTextCtrl& wxTextCtrl::operator<<(float f)
378 {
379 static char buf[100];
380 sprintf(buf, "%.2f", f);
381 WriteText(buf);
382 return *this;
383 }
384
385 wxTextCtrl& wxTextCtrl::operator<<(double d)
386 {
387 static char buf[100];
388 sprintf(buf, "%.2f", d);
389 WriteText(buf);
390 return *this;
391 }
392
393 wxTextCtrl& wxTextCtrl::operator<<(int i)
394 {
395 static char buf[100];
396 sprintf(buf, "%i", i);
397 WriteText(buf);
398 return *this;
399 }
400
401 wxTextCtrl& wxTextCtrl::operator<<(long i)
402 {
403 static char buf[100];
404 sprintf(buf, "%ld", i);
405 WriteText(buf);
406 return *this;
407 }
408
409 wxTextCtrl& wxTextCtrl::operator<<(const char c)
410 {
411 char buf[2];
412
413 buf[0] = c;
414 buf[1] = 0;
415 WriteText(buf);
416 return *this;
417 }
418
419 GtkWidget* wxTextCtrl::GetConnectWidget(void)
420 {
421 return GTK_WIDGET(m_text);
422 }
423
424 bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window )
425 {
426 if (m_windowStyle & wxTE_MULTILINE)
427 return (window == GTK_TEXT(m_text)->text_area);
428 else
429 return (window == GTK_ENTRY(m_text)->text_area);
430 }
431
432
433