]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/textctrl.cpp
Fixed doubled-up key effects in wxTextCtrl by resetting m_lastMsg to 0
[wxWidgets.git] / src / mac / carbon / textctrl.cpp
CommitLineData
e9576ca5
SC
1/////////////////////////////////////////////////////////////////////////////
2// Name: textctrl.cpp
3// Purpose: wxTextCtrl
4// Author: AUTHOR
5// Modified by:
6// Created: ??/??/98
7// RCS-ID: $Id$
8// Copyright: (c) AUTHOR
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "textctrl.h"
14#endif
15
16#ifndef __WXMAC__
17#include <sys/types.h>
18#include <sys/stat.h>
19#else
20#include <stat.h>
21#endif
22#include <fstream.h>
23
24#include "wx/textctrl.h"
25#include "wx/settings.h"
26#include "wx/filefn.h"
27#include "wx/utils.h"
28
29#if defined(__BORLANDC__) && !defined(__WIN32__)
30#include <alloc.h>
31#else
32#ifndef __MWERKS__
33#ifndef __GNUWIN32__
34#include <malloc.h>
35#endif
36#endif
37#endif
38
39#if !USE_SHARED_LIBRARY
40IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
41
42BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
43 EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
44END_EVENT_TABLE()
45#endif
46
47// Text item
48wxTextCtrl::wxTextCtrl()
49#ifndef NO_TEXT_WINDOW_STREAM
50 :streambuf()
51#endif
52{
53 m_fileName = "";
54}
55
56bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
57 const wxString& value,
58 const wxPoint& pos,
59 const wxSize& size, long style,
60 const wxValidator& validator,
61 const wxString& name)
62{
63 m_fileName = "";
64 SetName(name);
65 SetValidator(validator);
66 if (parent) parent->AddChild(this);
67
68 m_windowStyle = style;
69
70 if ( id == -1 )
71 m_windowId = (int)NewControlId();
72 else
73 m_windowId = id;
74
75 return TRUE;
76}
77
78wxString wxTextCtrl::GetValue() const
79{
80 // TODO
81 return wxString("");
82}
83
84void wxTextCtrl::SetValue(const wxString& value)
85{
86 // TODO
87}
88
89void wxTextCtrl::SetSize(int x, int y, int width, int height, int sizeFlags)
90{
91 // TODO
92}
93
94// Clipboard operations
95void wxTextCtrl::Copy()
96{
97 // TODO
98}
99
100void wxTextCtrl::Cut()
101{
102 // TODO
103}
104
105void wxTextCtrl::Paste()
106{
107 // TODO
108}
109
110void wxTextCtrl::SetEditable(bool editable)
111{
112 // TODO
113}
114
115void wxTextCtrl::SetInsertionPoint(long pos)
116{
117 // TODO
118}
119
120void wxTextCtrl::SetInsertionPointEnd()
121{
122 long pos = GetLastPosition();
123 SetInsertionPoint(pos);
124}
125
126long wxTextCtrl::GetInsertionPoint() const
127{
128 // TODO
129 return 0;
130}
131
132long wxTextCtrl::GetLastPosition() const
133{
134 // TODO
135 return 0;
136}
137
138void wxTextCtrl::Replace(long from, long to, const wxString& value)
139{
140 // TODO
141}
142
143void wxTextCtrl::Remove(long from, long to)
144{
145 // TODO
146}
147
148void wxTextCtrl::SetSelection(long from, long to)
149{
150 // TODO
151}
152
153bool wxTextCtrl::LoadFile(const wxString& file)
154{
155 if (!wxFileExists(file))
156 return FALSE;
157
158 m_fileName = file;
159
160 Clear();
161
162#ifndef __WXMAC__
163 ifstream input((char*) (const char*) file, ios::nocreate | ios::in);
164#else
165 ifstream input((char*) (const char*) file, ios::in);
166#endif
167 if (!input.bad())
168 {
169 struct stat stat_buf;
170 if (stat(file, &stat_buf) < 0)
171 return FALSE;
172 // This may need to be a bigger buffer than the file size suggests,
173 // if it's a UNIX file. Give it an extra 1000 just in case.
174 char *tmp_buffer = (char*)malloc((size_t)(stat_buf.st_size+1+1000));
175 long no_lines = 0;
176 long pos = 0;
177 while (!input.eof() && input.peek() != EOF)
178 {
179 input.getline(wxBuffer, 500);
180 int len = strlen(wxBuffer);
181 wxBuffer[len] = 13;
182 wxBuffer[len+1] = 10;
183 wxBuffer[len+2] = 0;
184 strcpy(tmp_buffer+pos, wxBuffer);
185 pos += strlen(wxBuffer);
186 no_lines++;
187 }
188
189 // TODO add line
190
191 free(tmp_buffer);
192
193 return TRUE;
194 }
195 return FALSE;
196}
197
198// If file is null, try saved file name first
199// Returns TRUE if succeeds.
200bool wxTextCtrl::SaveFile(const wxString& file)
201{
202 wxString theFile(file);
203 if (theFile == "")
204 theFile = m_fileName;
205 if (theFile == "")
206 return FALSE;
207 m_fileName = theFile;
208
209 ofstream output((char*) (const char*) theFile);
210 if (output.bad())
211 return FALSE;
212
213 // TODO get and save text
214
215 return FALSE;
216}
217
218void wxTextCtrl::WriteText(const wxString& text)
219{
220 // TODO write text to control
221}
222
13c21be5
HH
223void wxTextCtrl::AppendText(const wxString& text)
224{
225 // TODO append text to control
226}
227
e9576ca5
SC
228void wxTextCtrl::Clear()
229{
230 // TODO
231}
232
233bool wxTextCtrl::IsModified() const
234{
235 // TODO
236 return FALSE;
237}
238
239// Makes 'unmodified'
240void wxTextCtrl::DiscardEdits()
241{
242 // TODO
243}
244
245int wxTextCtrl::GetNumberOfLines() const
246{
247 // TODO
248 return 0;
249}
250
251long wxTextCtrl::XYToPosition(long x, long y) const
252{
253 // TODO
254 return 0;
255}
256
257void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
258{
259 // TODO
260}
261
262void wxTextCtrl::ShowPosition(long pos)
263{
264 // TODO
265}
266
267int wxTextCtrl::GetLineLength(long lineNo) const
268{
269 // TODO
270 return 0;
271}
272
273wxString wxTextCtrl::GetLineText(long lineNo) const
274{
275 // TODO
276 return wxString("");
277}
278
279/*
280 * Text item
281 */
282
283void wxTextCtrl::Command(wxCommandEvent & event)
284{
285 SetValue (event.GetString());
286 ProcessCommand (event);
287}
288
289void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
290{
291 // By default, load the first file into the text window.
292 if (event.GetNumberOfFiles() > 0)
293 {
294 LoadFile(event.GetFiles()[0]);
295 }
296}
297
298// The streambuf code was partly taken from chapter 3 by Jerry Schwarz of
299// AT&T's "C++ Lanuage System Release 3.0 Library Manual" - Stein Somers
300
301//=========================================================================
302// Called then the buffer is full (gcc 2.6.3)
303// or when "endl" is output (Borland 4.5)
304//=========================================================================
305// Class declaration using multiple inheritance doesn't work properly for
306// Borland. See note in wb_text.h.
307#ifndef NO_TEXT_WINDOW_STREAM
308int wxTextCtrl::overflow(int c)
309{
310 // Make sure there is a holding area
311 if ( allocate()==EOF )
312 {
313 wxError("Streambuf allocation failed","Internal error");
314 return EOF;
315 }
316
317 // Verify that there are no characters in get area
318 if ( gptr() && gptr() < egptr() )
319 {
320 wxError("Who's trespassing my get area?","Internal error");
321 return EOF;
322 }
323
324 // Reset get area
325 setg(0,0,0);
326
327 // Make sure there is a put area
328 if ( ! pptr() )
329 {
330/* This doesn't seem to be fatal so comment out error message */
331// wxError("Put area not opened","Internal error");
332 setp( base(), base() );
333 }
334
335 // Determine how many characters have been inserted but no consumed
336 int plen = pptr() - pbase();
337
338 // Now Jerry relies on the fact that the buffer is at least 2 chars
339 // long, but the holding area "may be as small as 1" ???
340 // And we need an additional \0, so let's keep this inefficient but
341 // safe copy.
342
343 // If c!=EOF, it is a character that must also be comsumed
344 int xtra = c==EOF? 0 : 1;
345
346 // Write temporary C-string to wxTextWindow
347 {
348 char *txt = new char[plen+xtra+1];
349 memcpy(txt, pbase(), plen);
350 txt[plen] = (char)c; // append c
351 txt[plen+xtra] = '\0'; // append '\0' or overwrite c
352 // If the put area already contained \0, output will be truncated there
13c21be5 353 AppendText(txt);
e9576ca5
SC
354 delete[] txt;
355 }
356
357 // Reset put area
358 setp(pbase(), epptr());
359
360#if defined(__WATCOMC__)
361 return __NOT_EOF;
362#elif defined(zapeof) // HP-UX (all cfront based?)
363 return zapeof(c);
364#else
365 return c!=EOF ? c : 0; // this should make everybody happy
366#endif
367}
368
369//=========================================================================
370// called then "endl" is output (gcc) or then explicit sync is done (Borland)
371//=========================================================================
372int wxTextCtrl::sync()
373{
374 // Verify that there are no characters in get area
375 if ( gptr() && gptr() < egptr() )
376 {
377 wxError("Who's trespassing my get area?","Internal error");
378 return EOF;
379 }
380
381 if ( pptr() && pptr() > pbase() ) return overflow(EOF);
382
383 return 0;
384/* OLD CODE
385 int len = pptr() - pbase();
386 char *txt = new char[len+1];
387 strncpy(txt, pbase(), len);
388 txt[len] = '\0';
389 (*this) << txt;
390 setp(pbase(), epptr());
391 delete[] txt;
392 return 0;
393*/
394}
395
396//=========================================================================
397// Should not be called by a "ostream". Used by a "istream"
398//=========================================================================
399int wxTextCtrl::underflow()
400{
401 return EOF;
402}
403#endif
404
405wxTextCtrl& wxTextCtrl::operator<<(const wxString& s)
406{
13c21be5 407 AppendText(s);
e9576ca5
SC
408 return *this;
409}
410
411wxTextCtrl& wxTextCtrl::operator<<(float f)
412{
413 wxString str;
414 str.Printf("%.2f", f);
13c21be5 415 AppendText(str);
e9576ca5
SC
416 return *this;
417}
418
419wxTextCtrl& wxTextCtrl::operator<<(double d)
420{
421 wxString str;
422 str.Printf("%.2f", d);
13c21be5 423 AppendText(str);
e9576ca5
SC
424 return *this;
425}
426
427wxTextCtrl& wxTextCtrl::operator<<(int i)
428{
429 wxString str;
430 str.Printf("%d", i);
13c21be5 431 AppendText(str);
e9576ca5
SC
432 return *this;
433}
434
435wxTextCtrl& wxTextCtrl::operator<<(long i)
436{
437 wxString str;
438 str.Printf("%ld", i);
13c21be5 439 AppendText(str);
e9576ca5
SC
440 return *this;
441}
442
443wxTextCtrl& wxTextCtrl::operator<<(const char c)
444{
445 char buf[2];
446
447 buf[0] = c;
448 buf[1] = 0;
13c21be5 449 AppendText(buf);
e9576ca5
SC
450 return *this;
451}
452