]> git.saurik.com Git - wxWidgets.git/blobdiff - src/stc/stc.cpp.in
Don't do the wx cleanup if wxPython didn't do the initialization.
[wxWidgets.git] / src / stc / stc.cpp.in
index b3a666d8655aa9b528ce9101548473beb636eb35..f6c30c0896d8f8a8a00ed04dc3d661ae00b7a506 100644 (file)
 
 #include <wx/tokenzr.h>
 
 
 #include <wx/tokenzr.h>
 
-// The following code forces a reference to all of the Scintilla lexers.
-// If we don't do something like this, then the linker tends to "optimize"
-// them away. (eric@sourcegear.com)
-
-int wxForceScintillaLexers(void)
-{
-  extern LexerModule lmAda;
-  extern LexerModule lmAVE;
-  extern LexerModule lmConf;
-  extern LexerModule lmCPP;
-  extern LexerModule lmNncrontab;
-  extern LexerModule lmEiffel;
-  extern LexerModule lmHTML;
-  extern LexerModule lmLISP;
-  extern LexerModule lmLua;
-  extern LexerModule lmBatch;  // In LexOthers.cxx
-  extern LexerModule lmPascal;
-  extern LexerModule lmPerl;
-  extern LexerModule lmPython;
-  extern LexerModule lmRuby;
-  extern LexerModule lmSQL;
-  extern LexerModule lmVB;
-
-  if (  &lmAda
-     && &lmAVE
-     && &lmConf
-     && &lmCPP
-     && &lmNncrontab
-     && &lmEiffel
-     && &lmHTML
-     && &lmLISP
-     && &lmLua
-     && &lmBatch
-     && &lmPascal
-     && &lmPerl
-     && &lmPython
-     && &lmRuby
-     && &lmSQL
-     && &lmVB )
-    {
-      return 1;
-    }
-  else
-    {
-      return 0;
-    }
-}
 
 //----------------------------------------------------------------------
 
 
 //----------------------------------------------------------------------
 
-const wxChar* wxSTCNameStr = "stcwindow";
+const wxChar* wxSTCNameStr = wxT("stcwindow");
 
 DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE )
 DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED )
 
 DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE )
 DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED )
@@ -130,6 +83,9 @@ END_EVENT_TABLE()
 IMPLEMENT_CLASS(wxStyledTextCtrl, wxControl)
 IMPLEMENT_DYNAMIC_CLASS(wxStyledTextEvent, wxCommandEvent)
 
 IMPLEMENT_CLASS(wxStyledTextCtrl, wxControl)
 IMPLEMENT_DYNAMIC_CLASS(wxStyledTextEvent, wxCommandEvent)
 
+// forces the linking of the lexer modules
+int Scintilla_LinkLexers();
+
 //----------------------------------------------------------------------
 // Constructor and Destructor
 
 //----------------------------------------------------------------------
 // Constructor and Destructor
 
@@ -143,12 +99,16 @@ wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent,
               style | wxVSCROLL | wxHSCROLL | wxWANTS_CHARS | wxCLIP_CHILDREN,
               wxDefaultValidator, name)
 {
               style | wxVSCROLL | wxHSCROLL | wxWANTS_CHARS | wxCLIP_CHILDREN,
               wxDefaultValidator, name)
 {
-    wxForceScintillaLexers();
+    Scintilla_LinkLexers();
     m_swx = new ScintillaWX(this);
     m_stopWatch.Start();
     m_lastKeyDownConsumed = FALSE;
     m_vScrollBar = NULL;
     m_hScrollBar = NULL;
     m_swx = new ScintillaWX(this);
     m_stopWatch.Start();
     m_lastKeyDownConsumed = FALSE;
     m_vScrollBar = NULL;
     m_hScrollBar = NULL;
+#if wxUSE_UNICODE
+    // Put Scintilla into unicode (UTF-8) mode
+    SetCodePage(wxSTC_CP_UTF8);
+#endif
 }
 
 
 }
 
 
@@ -186,11 +146,12 @@ static wxColour wxColourFromLong(long c) {
 
 
 static wxColour wxColourFromSpec(const wxString& spec) {
 
 
 static wxColour wxColourFromSpec(const wxString& spec) {
-    // spec should be #RRGGBB
-    char* junk;
-    int red   = strtol(spec.Mid(1,2), &junk, 16);
-    int green = strtol(spec.Mid(3,2), &junk, 16);
-    int blue  = strtol(spec.Mid(5,2), &junk, 16);
+    // spec should be "#RRGGBB"
+    long red, green, blue;
+    red = green = blue = 0;
+    spec.Mid(1,2).ToLong(&red,   16);
+    spec.Mid(3,2).ToLong(&green, 16);
+    spec.Mid(5,2).ToLong(&blue,  16);
     return wxColour(red, green, blue);
 }
 
     return wxColour(red, green, blue);
 }
 
@@ -364,6 +325,7 @@ void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) {
 void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) {
     wxSize sz = GetClientSize();
     m_swx->DoSize(sz.x, sz.y);
 void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) {
     wxSize sz = GetClientSize();
     m_swx->DoSize(sz.x, sz.y);
+    Refresh(FALSE);
 }
 
 void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) {
 }
 
 void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) {
@@ -406,13 +368,7 @@ void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) {
 
 
 void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
 
 
 void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
-    long key = evt.KeyCode();
-
-//      printf("OnChar  key:%%d  consumed:%%d  ctrl:%%d  alt:%%d\n",
-//             key, m_lastKeyDownConsumed, evt.ControlDown(), evt.AltDown());
-
-    // AltGr keys???
-    // \|@#¬[]{}?£$~  ã,õ,Ã,Õ, ñ, Ñ
+    int key = evt.GetKeyCode();
 
     // On (some?) non-US keyboards the AltGr key is required to enter some
     // common characters.  It comes to us as both Alt and Ctrl down so we need
 
     // On (some?) non-US keyboards the AltGr key is required to enter some
     // common characters.  It comes to us as both Alt and Ctrl down so we need
@@ -422,7 +378,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
     bool alt  = evt.AltDown();
     bool skip = ((ctrl || alt) && ! (ctrl && alt));
 
     bool alt  = evt.AltDown();
     bool skip = ((ctrl || alt) && ! (ctrl && alt));
 
-    if (key <= 0xff && key >= 32 && !m_lastKeyDownConsumed && !skip) {
+    //printf("OnChar  key:%%d  consumed:%%d  ctrl:%%d  alt:%%d  skip:%%d\n",
+    //       key, m_lastKeyDownConsumed, ctrl, alt, skip);
+
+    if (key <= WXK_START && /*key >= 32 &&*/ !m_lastKeyDownConsumed && !skip) {
         m_swx->DoAddChar(key);
         return;
     }
         m_swx->DoAddChar(key);
         return;
     }
@@ -431,10 +390,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
 
 
 void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
 
 
 void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
-    long key = evt.KeyCode();
+    int key = evt.GetKeyCode();
     bool shift = evt.ShiftDown(),
     bool shift = evt.ShiftDown(),
-        ctrl  = evt.ControlDown(),
-        alt   = evt.AltDown();
+         ctrl  = evt.ControlDown(),
+         alt   = evt.AltDown();
 
     int processed = m_swx->DoKeyDown(key, shift, ctrl, alt, &m_lastKeyDownConsumed);
 
 
     int processed = m_swx->DoKeyDown(key, shift, ctrl, alt, &m_lastKeyDownConsumed);
 
@@ -532,8 +491,14 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
     case SCN_MODIFIED:
         evt.SetEventType(wxEVT_STC_MODIFIED);
         evt.SetModificationType(scn.modificationType);
     case SCN_MODIFIED:
         evt.SetEventType(wxEVT_STC_MODIFIED);
         evt.SetModificationType(scn.modificationType);
-        if (scn.text)
-            evt.SetText(wxString(scn.text, scn.length));
+        if (scn.text) {
+            // The unicode conversion MUST have a null byte to terminate the
+            // string so move it into a buffer first and give it one.
+            wxMemoryBuffer buf(scn.length+1);
+            buf.AppendData((void*)scn.text, scn.length);
+            buf.AppendByte(0);
+            evt.SetText(wxString(buf, wxConvUTF8));
+        }
         evt.SetLength(scn.length);
         evt.SetLinesAdded(scn.linesAdded);
         evt.SetLine(scn.line);
         evt.SetLength(scn.length);
         evt.SetLinesAdded(scn.linesAdded);
         evt.SetLine(scn.line);
@@ -558,10 +523,6 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
         evt.SetLength(scn.length);
         break;
 
         evt.SetLength(scn.length);
         break;
 
-    case SCN_POSCHANGED:
-        evt.SetEventType(wxEVT_STC_POSCHANGED);
-        break;
-
     case SCN_PAINTED:
         evt.SetEventType(wxEVT_STC_PAINTED);
         break;
     case SCN_PAINTED:
         evt.SetEventType(wxEVT_STC_PAINTED);
         break;