]> git.saurik.com Git - wxWidgets.git/blobdiff - src/qt/textctrl.cpp
Merged some STC fixes over to the main branch
[wxWidgets.git] / src / qt / textctrl.cpp
index 7168de80cc497930a097d291ed6300852a8f6122..f8267f300b5670070cd860ccf6d8c13e10cd409e 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
 // Name:        textctrl.cpp
-// Purpose:
-// Author:      Robert Roebling
-// Created:     01/02/97
-// Id:
-// Copyright:   (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
-// Licence:     wxWindows licence
+// Purpose:     wxTextCtrl
+// Author:      AUTHOR
+// Modified by:
+// Created:     ??/??/98
+// RCS-ID:      $Id$
+// Copyright:   (c) AUTHOR
+// Licence:    wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 #pragma implementation "textctrl.h"
 #endif
 
-#include "wx/textctrl.h"
-#include "wx/utils.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fstream.h>
 
-//-----------------------------------------------------------------------------
-//  wxTextCtrl
-//-----------------------------------------------------------------------------
+#include "wx/textctrl.h"
+#include "wx/settings.h"
 
-IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl,wxControl)
+#if defined(__BORLANDC__) && !defined(__WIN32__)
+#include <alloc.h>
+#else
+#ifndef __GNUWIN32__
+#include <malloc.h>
+#endif
+#endif
 
+IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
-//  EVT_CHAR(wxTextCtrl::OnChar)
+       EVT_CHAR(wxTextCtrl::OnChar)
+       EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
+       EVT_ERASE_BACKGROUND(wxTextCtrl::OnEraseBackground)
 END_EVENT_TABLE()
 
-wxTextCtrl::wxTextCtrl(void) : streambuf()
+// Text item
+wxTextCtrl::wxTextCtrl()
+#ifndef NO_TEXT_WINDOW_STREAM
+ :streambuf()
+#endif
 {
-    if( allocate() )
-  setp(base(),ebuf());
-
-  m_modified = FALSE;
-};
+    m_fileName = "";
+}
 
-wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value,
-      const wxPoint &pos, const wxSize &size,
-      int style, const wxString &name ) : streambuf()
+bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
+                  const wxString& value,
+           const wxPoint& pos,
+           const wxSize& size, long style,
+           const wxValidator& validator,
+           const wxString& name)
 {
-  if( allocate() )
-    setp(base(),ebuf());
+    m_fileName = "";
+    SetName(name);
+    SetValidator(validator);
+    if (parent) parent->AddChild(this);
+
+    m_windowStyle = style;
+
+    if ( id == -1 )
+           m_windowId = (int)NewControlId();
+    else
+           m_windowId = id;
 
-  m_modified = FALSE;
-  Create( parent, id, value, pos, size, style, name );
-};
+    return TRUE;
+}
 
-bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
-      const wxPoint &pos, const wxSize &size,
-      int style, const wxString &name )
+wxString wxTextCtrl::GetValue() const
 {
-  return TRUE;
-};
+    // TODO
+    return wxString("");
+}
 
-wxString wxTextCtrl::GetValue(void) const
+void wxTextCtrl::SetValue(const wxString& value)
 {
-  return tmp;
-};
+    // TODO
+}
 
-void wxTextCtrl::SetValue( const wxString &value )
+void wxTextCtrl::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-};
+    // TODO
+}
 
-void wxTextCtrl::WriteText( const wxString &text )
+// Clipboard operations
+void wxTextCtrl::Copy()
 {
-};
+    // TODO
+}
 
-bool wxTextCtrl::LoadFile( const wxString &WXUNUSED(file) )
+void wxTextCtrl::Cut()
 {
-  return FALSE;
-};
+    // TODO
+}
 
-bool wxTextCtrl::SaveFile( const wxString &WXUNUSED(file) )
+void wxTextCtrl::Paste()
 {
-  return FALSE;
-};
+    // TODO
+}
 
-/*
-wxString wxTextCtrl::GetLineText( long lineNo ) const
+void wxTextCtrl::SetEditable(bool editable)
 {
-};
+    // TODO
+}
 
+void wxTextCtrl::SetInsertionPoint(long pos)
+{
+    // TODO
+}
 
-void wxTextCtrl::OnDropFiles( wxDropFilesEvent &event )
+void wxTextCtrl::SetInsertionPointEnd()
 {
-};
+    long pos = GetLastPosition();
+    SetInsertionPoint(pos);
+}
 
-long wxTextCtrl::PositionToXY( long pos, long *x, long *y ) const
+long wxTextCtrl::GetInsertionPoint() const
 {
-};
+    // TODO
+    return 0;
+}
 
-long wxTextCtrl::XYToPosition( long x, long y )
+long wxTextCtrl::GetLastPosition() const
 {
-};
+    // TODO
+    return 0;
+}
 
-int wxTextCtrl::GetNumberOfLines(void)
+void wxTextCtrl::Replace(long from, long to, const wxString& value)
 {
-};
+    // TODO
+    return 0;
+}
 
-*/
-void wxTextCtrl::SetInsertionPoint( long pos )
+void wxTextCtrl::Remove(long from, long to)
 {
-};
+    // TODO
+}
 
-void wxTextCtrl::SetInsertionPointEnd(void)
+void wxTextCtrl::SetSelection(long from, long to)
 {
-};
+    // TODO
+}
+
+bool wxTextCtrl::LoadFile(const wxString& file)
+{
+    if (!wxFileExists(file))
+        return FALSE;
+
+    m_fileName = file;
+
+    Clear();
+
+    ifstream input((char*) (const char*) file, ios::nocreate | ios::in);
+
+    if (!input.bad())
+    {
+        struct stat stat_buf;
+        if (stat(file, &stat_buf) < 0)
+            return FALSE;
+        // This may need to be a bigger buffer than the file size suggests,
+        // if it's a UNIX file. Give it an extra 1000 just in case.
+        char *tmp_buffer = (char*)malloc((size_t)(stat_buf.st_size+1+1000));
+        long no_lines = 0;
+        long pos = 0;
+        while (!input.eof() && input.peek() != EOF)
+        {
+            input.getline(wxBuffer, 500);
+               int len = strlen(wxBuffer);
+               wxBuffer[len] = 13;
+               wxBuffer[len+1] = 10;
+               wxBuffer[len+2] = 0;
+               strcpy(tmp_buffer+pos, wxBuffer);
+               pos += strlen(wxBuffer);
+               no_lines++;
+         }
+
+         // TODO add line
+
+         free(tmp_buffer);
+
+         return TRUE;
+    }
+    return FALSE;
+}
+
+// If file is null, try saved file name first
+// Returns TRUE if succeeds.
+bool wxTextCtrl::SaveFile(const wxString& file)
+{
+    wxString theFile(file);
+    if (theFile == "")
+        theFile = m_fileName;
+    if (theFile == "")
+        return FALSE;
+    m_fileName = theFile;
+
+    ofstream output((char*) (const char*) theFile);
+    if (output.bad())
+           return FALSE;
+
+    // TODO get and save text
+
+    return FALSE;
+}
 
-void wxTextCtrl::SetEditable( bool editable )
+void wxTextCtrl::WriteText(const wxString& text)
 {
-};
+    // TODO write text to control
+}
 
-void wxTextCtrl::SetSelection( long from, long to )
+void wxTextCtrl::AppendText(const wxString& text)
 {
-};
+    // TODO append text to control
+}
 
-void wxTextCtrl::ShowPosition( long WXUNUSED(pos) )
+void wxTextCtrl::Clear()
 {
-};
+    // TODO
+}
 
-long wxTextCtrl::GetInsertionPoint(void) const
+bool wxTextCtrl::IsModified() const
 {
-};
+    // TODO
+    return FALSE;
+}
 
-long wxTextCtrl::GetLastPosition(void) const
+// Makes 'unmodified'
+void wxTextCtrl::DiscardEdits()
 {
-};
+    // TODO
+}
 
-void wxTextCtrl::Remove( long from, long to )
+int wxTextCtrl::GetNumberOfLines() const
 {
-};
+    // TODO
+    return 0;
+}
 
-void wxTextCtrl::Replace( long from, long to, const wxString &value )
+long wxTextCtrl::XYToPosition(long x, long y) const
 {
-};
+    // TODO
+    return 0;
+}
 
-void wxTextCtrl::Cut(void)
+void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
 {
-};
+    // TODO
+}
 
-void wxTextCtrl::Copy(void)
+void wxTextCtrl::ShowPosition(long pos)
 {
-};
+    // TODO
+}
 
-void wxTextCtrl::Paste(void)
+int wxTextCtrl::GetLineLength(long lineNo) const
 {
-};
+    // TODO
+    return 0;
+}
 
-void wxTextCtrl::Delete(void)
+wxString wxTextCtrl::GetLineText(long lineNo) const
 {
-};
+    // TODO
+    return wxString("");
+}
 
-void wxTextCtrl::OnChar( wxKeyEvent &WXUNUSED(event) )
+/*
+ * Text item
+ */
+void wxTextCtrl::Command(wxCommandEvent & event)
 {
-};
+    SetValue (event.GetString());
+    ProcessCommand (event);
+}
 
-int wxTextCtrl::overflow( int WXUNUSED(c) )
+void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
 {
-  int len = pptr() - pbase();
-  char *txt = new char[len+1];
-  strncpy(txt, pbase(), len);
-  txt[len] = '\0';
-  (*this) << txt;
+    // By default, load the first file into the text window.
+    if (event.GetNumberOfFiles() > 0)
+    {
+        LoadFile(event.GetFiles()[0]);
+    }
+}
+
+// The streambuf code was partly taken from chapter 3 by Jerry Schwarz of
+// AT&T's "C++ Lanuage System Release 3.0 Library Manual" - Stein Somers
+
+//=========================================================================
+// Called then the buffer is full (gcc 2.6.3) 
+// or when "endl" is output (Borland 4.5)
+//=========================================================================
+// Class declaration using multiple inheritance doesn't work properly for
+// Borland. See note in wb_text.h.
+#ifndef NO_TEXT_WINDOW_STREAM
+int wxTextCtrl::overflow(int c)
+{
+  // Make sure there is a holding area
+  if ( allocate()==EOF )
+  {
+    wxError("Streambuf allocation failed","Internal error");
+    return EOF;
+  }
+  
+  // Verify that there are no characters in get area
+  if ( gptr() && gptr() < egptr() )
+  {
+     wxError("Who's trespassing my get area?","Internal error");
+     return EOF;
+  }
+
+  // Reset get area
+  setg(0,0,0);
+
+  // Make sure there is a put area
+  if ( ! pptr() )
+  {
+/* This doesn't seem to be fatal so comment out error message */
+//    wxError("Put area not opened","Internal error");
+    setp( base(), base() );
+  }
+
+  // Determine how many characters have been inserted but no consumed
+  int plen = pptr() - pbase();
+
+  // Now Jerry relies on the fact that the buffer is at least 2 chars
+  // long, but the holding area "may be as small as 1" ???
+  // And we need an additional \0, so let's keep this inefficient but
+  // safe copy.
+
+  // If c!=EOF, it is a character that must also be comsumed
+  int xtra = c==EOF? 0 : 1;
+
+  // Write temporary C-string to wxTextWindow
+  {
+  char *txt = new char[plen+xtra+1];
+  memcpy(txt, pbase(), plen);
+  txt[plen] = (char)c;     // append c
+  txt[plen+xtra] = '\0';   // append '\0' or overwrite c
+    // If the put area already contained \0, output will be truncated there
+  AppendText(txt);
+    delete[] txt;
+  }
+
+  // Reset put area
   setp(pbase(), epptr());
-  delete[] txt;
-  return EOF;
-};
 
-int wxTextCtrl::sync(void)
+#if defined(__WATCOMC__)
+  return __NOT_EOF;
+#elif defined(zapeof)     // HP-UX (all cfront based?)
+  return zapeof(c);
+#else
+  return c!=EOF ? c : 0;  // this should make everybody happy
+#endif
+}
+
+//=========================================================================
+// called then "endl" is output (gcc) or then explicit sync is done (Borland)
+//=========================================================================
+int wxTextCtrl::sync()
 {
+  // Verify that there are no characters in get area
+  if ( gptr() && gptr() < egptr() )
+  {
+     wxError("Who's trespassing my get area?","Internal error");
+     return EOF;
+  }
+
+  if ( pptr() && pptr() > pbase() ) return overflow(EOF);
+
+  return 0;
+/* OLD CODE
   int len = pptr() - pbase();
   char *txt = new char[len+1];
   strncpy(txt, pbase(), len);
@@ -176,60 +380,63 @@ int wxTextCtrl::sync(void)
   setp(pbase(), epptr());
   delete[] txt;
   return 0;
-};
+*/
+}
 
-int wxTextCtrl::underflow(void)
+//=========================================================================
+// Should not be called by a "ostream". Used by a "istream"
+//=========================================================================
+int wxTextCtrl::underflow()
 {
   return EOF;
-};
+}
+#endif
 
 wxTextCtrl& wxTextCtrl::operator<<(const wxString& s)
 {
-  WriteText(s);
-  return *this;
+    AppendText(s);
+    return *this;
 }
 
 wxTextCtrl& wxTextCtrl::operator<<(float f)
 {
-  static char buf[100];
-  sprintf(buf, "%.2f", f);
-  WriteText(buf);
-  return *this;
+    wxString str;
+    str.Printf("%.2f", f);
+    AppendText(str);
+    return *this;
 }
 
 wxTextCtrl& wxTextCtrl::operator<<(double d)
 {
-  static char buf[100];
-  sprintf(buf, "%.2f", d);
-  WriteText(buf);
-  return *this;
+    wxString str;
+    str.Printf("%.2f", d);
+    AppendText(str);
+    return *this;
 }
 
 wxTextCtrl& wxTextCtrl::operator<<(int i)
 {
-  static char buf[100];
-  sprintf(buf, "%i", i);
-  WriteText(buf);
-  return *this;
+    wxString str;
+    str.Printf("%d", i);
+    AppendText(str);
+    return *this;
 }
 
 wxTextCtrl& wxTextCtrl::operator<<(long i)
 {
-  static char buf[100];
-  sprintf(buf, "%ld", i);
-  WriteText(buf);
-  return *this;
+    wxString str;
+    str.Printf("%ld", i);
+    AppendText(str);
+    return *this;
 }
 
 wxTextCtrl& wxTextCtrl::operator<<(const char c)
 {
-  char buf[2];
+    char buf[2];
 
-  buf[0] = c;
-  buf[1] = 0;
-  WriteText(buf);
-  return *this;
+    buf[0] = c;
+    buf[1] = 0;
+    AppendText(buf);
+    return *this;
 }
 
-
-