From 10ef30eb534117ae854c9d099101c862fe96bcb0 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Wed, 20 Mar 2002 20:43:39 +0000 Subject: [PATCH] wxStyledTextCtrl can now be built and used when wxUSE_UNICODE==1. When in unicode mode Scintilla uses UTF-8 internally so the wxSTC wrapper only needs to convert to/from UTF-8 in the right places. Still need to figure out to get unicode characters from key/char events... git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14693 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/include/wx/stc/stc.h | 120 +++++++++++++++-- contrib/src/stc/PlatWX.cpp | 118 +++++++++------- contrib/src/stc/ScintillaWX.cpp | 21 +-- contrib/src/stc/ScintillaWX.h | 2 +- contrib/src/stc/gen_iface.py | 132 +++++++++--------- contrib/src/stc/stc.cpp | 201 +++++++++++++++------------- contrib/src/stc/stc.cpp.in | 44 +++--- contrib/src/stc/stc.h.in | 2 +- include/wx/stc/stc.h | 120 +++++++++++++++-- src/stc/PlatWX.cpp | 118 +++++++++------- src/stc/ScintillaWX.cpp | 21 +-- src/stc/ScintillaWX.h | 2 +- src/stc/gen_iface.py | 132 +++++++++--------- src/stc/stc.cpp | 201 +++++++++++++++------------- src/stc/stc.cpp.in | 44 +++--- src/stc/stc.h.in | 2 +- wxPython/contrib/stc/msw/stc_.cpp | 99 ++++++++------ wxPython/contrib/stc/msw/stc_.py | 6 +- wxPython/demo/data/stc.h.html | 120 +++++++++++++++-- wxPython/demo/wxStyledTextCtrl_1.py | 22 ++- wxPython/setup.py | 14 +- wxPython/src/my_typemaps.i | 26 ++++ 22 files changed, 1033 insertions(+), 534 deletions(-) diff --git a/contrib/include/wx/stc/stc.h b/contrib/include/wx/stc/stc.h index 0a5cafc81e..10b857dd18 100644 --- a/contrib/include/wx/stc/stc.h +++ b/contrib/include/wx/stc/stc.h @@ -36,7 +36,11 @@ #define wxSTC_START 2000 #define wxSTC_OPTIONAL_START 3000 #define wxSTC_LEXER_START 4000 + +// Redoes the next action on the undo history #define wxSTC_CMD_REDO 2011 + +// Select all the text in the document. #define wxSTC_CMD_SELECTALL 2013 #define wxSTC_WS_INVISIBLE 0 #define wxSTC_WS_VISIBLEALWAYS 1 @@ -154,9 +158,17 @@ #define wxSTC_FIND_MATCHCASE 4 #define wxSTC_FIND_WORDSTART 0x00100000 #define wxSTC_FIND_REGEXP 0x00200000 + +// Undo one action in the undo history. #define wxSTC_CMD_UNDO 2176 + +// Cut the selection to the clipboard. #define wxSTC_CMD_CUT 2177 + +// Copy the selection to the clipboard. #define wxSTC_CMD_COPY 2178 + +// Paste the contents of the clipboard into the document replacing the selection. #define wxSTC_CMD_PASTE 2179 #define wxSTC_FOLDLEVELBASE 0x400 #define wxSTC_FOLDLEVELWHITEFLAG 0x1000 @@ -169,50 +181,144 @@ #define wxSTC_CACHE_CARET 1 #define wxSTC_CACHE_PAGE 2 #define wxSTC_CACHE_DOCUMENT 3 + +// Move caret down one line. #define wxSTC_CMD_LINEDOWN 2300 + +// Move caret down one line extending selection to new caret position. #define wxSTC_CMD_LINEDOWNEXTEND 2301 + +// Move caret up one line. #define wxSTC_CMD_LINEUP 2302 + +// Move caret up one line extending selection to new caret position. #define wxSTC_CMD_LINEUPEXTEND 2303 + +// Move caret left one character. #define wxSTC_CMD_CHARLEFT 2304 + +// Move caret left one character extending selection to new caret position. #define wxSTC_CMD_CHARLEFTEXTEND 2305 + +// Move caret right one character. #define wxSTC_CMD_CHARRIGHT 2306 + +// Move caret right one character extending selection to new caret position. #define wxSTC_CMD_CHARRIGHTEXTEND 2307 + +// Move caret left one word. #define wxSTC_CMD_WORDLEFT 2308 + +// Move caret left one word extending selection to new caret position. #define wxSTC_CMD_WORDLEFTEXTEND 2309 + +// Move caret right one word. #define wxSTC_CMD_WORDRIGHT 2310 + +// Move caret right one word extending selection to new caret position. #define wxSTC_CMD_WORDRIGHTEXTEND 2311 + +// Move caret to first position on line. #define wxSTC_CMD_HOME 2312 + +// Move caret to first position on line extending selection to new caret position. #define wxSTC_CMD_HOMEEXTEND 2313 + +// Move caret to last position on line. #define wxSTC_CMD_LINEEND 2314 + +// Move caret to last position on line extending selection to new caret position. #define wxSTC_CMD_LINEENDEXTEND 2315 + +// Move caret to first position in document. #define wxSTC_CMD_DOCUMENTSTART 2316 + +// Move caret to first position in document extending selection to new caret position. #define wxSTC_CMD_DOCUMENTSTARTEXTEND 2317 + +// Move caret to last position in document. #define wxSTC_CMD_DOCUMENTEND 2318 + +// Move caret to last position in document extending selection to new caret position. #define wxSTC_CMD_DOCUMENTENDEXTEND 2319 + +// Move caret one page up. #define wxSTC_CMD_PAGEUP 2320 + +// Move caret one page up extending selection to new caret position. #define wxSTC_CMD_PAGEUPEXTEND 2321 + +// Move caret one page down. #define wxSTC_CMD_PAGEDOWN 2322 + +// Move caret one page down extending selection to new caret position. #define wxSTC_CMD_PAGEDOWNEXTEND 2323 + +// Switch from insert to overtype mode or the reverse. #define wxSTC_CMD_EDITTOGGLEOVERTYPE 2324 + +// Cancel any modes such as call tip or auto-completion list display. #define wxSTC_CMD_CANCEL 2325 + +// Delete the selection or if no selection, the character before the caret. #define wxSTC_CMD_DELETEBACK 2326 + +// If selection is empty or all on one line replace the selection with a tab +// character. +// If more than one line selected, indent the lines. #define wxSTC_CMD_TAB 2327 + +// Dedent the selected lines. #define wxSTC_CMD_BACKTAB 2328 + +// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. #define wxSTC_CMD_NEWLINE 2329 + +// Insert a Form Feed character. #define wxSTC_CMD_FORMFEED 2330 + +// Move caret to before first visible character on line. +// If already there move to first character on line. #define wxSTC_CMD_VCHOME 2331 + +// Like VCHome but extending selection to new caret position. #define wxSTC_CMD_VCHOMEEXTEND 2332 + +// Magnify the displayed text by increasing the sizes by 1 point. #define wxSTC_CMD_ZOOMIN 2333 + +// Make the displayed text smaller by decreasing the sizes by 1 point. #define wxSTC_CMD_ZOOMOUT 2334 + +// Delete the word to the left of the caret. #define wxSTC_CMD_DELWORDLEFT 2335 + +// Delete the word to the right of the caret. #define wxSTC_CMD_DELWORDRIGHT 2336 + +// Cut the line containing the caret. #define wxSTC_CMD_LINECUT 2337 + +// Delete the line containing the caret. #define wxSTC_CMD_LINEDELETE 2338 + +// Switch the current line with the previous. #define wxSTC_CMD_LINETRANSPOSE 2339 + +// Transform the selection to lower case. #define wxSTC_CMD_LOWERCASE 2340 + +// Transform the selection to upper case. #define wxSTC_CMD_UPPERCASE 2341 + +// Scroll the document down, keeping the caret visible. #define wxSTC_CMD_LINESCROLLDOWN 2342 + +// Scroll the document up, keeping the caret visible. #define wxSTC_CMD_LINESCROLLUP 2343 + +// Delete the selection or if no selection, the character before the caret. +// Will not delete the chraacter before at the start of a line. #define wxSTC_CMD_DELETEBACKNOTLINE 2344 #define wxSTC_EDGE_NONE 0 #define wxSTC_EDGE_LINE 1 @@ -736,7 +842,7 @@ public: void AddText(const wxString& text); // Add array of cells to document - void AddStyledText(const wxString& text); + void AddStyledText(const wxMemoryBuffer& data); // Insert string at a position void InsertText(int pos, const wxString& text); @@ -777,7 +883,7 @@ public: void SetSavePoint(); // Retrieve a buffer of cells. - wxString GetStyledText(int startPos, int endPos); + wxMemoryBuffer GetStyledText(int startPos, int endPos); // Are there any redoable actions in the undo history. bool CanRedo(); @@ -859,7 +965,6 @@ public: int GetTabWidth(); // Set the code page used to interpret the bytes of the document as characters. - // The SC_CP_UTF8 value can be used to enter Unicode mode. void SetCodePage(int codePage); // Set the symbol used for a particular marker number, @@ -949,6 +1054,9 @@ public: // Set a style to be mixed case, or to force upper or lower case. void StyleSetCase(int style, int caseForce); + // Set the character set of the font in a style. + void StyleSetCharacterSet(int style, int characterSet); + // Set the foreground colour of the selection and whether to use this setting. void SetSelForeground(bool useSetting, const wxColour& fore); @@ -1440,10 +1548,6 @@ public: // Retrieve the degree of caching of layout information int GetLayoutCache(); - // Delete the selection or if no selection, the character before the caret. - // Will not delete the chraacter before at the start of a line. - void DeleteBackNotLine(); - // Move the caret inside current view if it's not there already void MoveCaretInsideView(); @@ -1756,7 +1860,7 @@ public: void SetKey(int k) { m_key = k; } void SetModifiers(int m) { m_modifiers = m; } void SetModificationType(int t) { m_modificationType = t; } - void SetText(const char* t) { m_text = t; } + void SetText(const wxString& t) { m_text = t; } void SetLength(int len) { m_length = len; } void SetLinesAdded(int num) { m_linesAdded = num; } void SetLine(int val) { m_line = val; } diff --git a/contrib/src/stc/PlatWX.cpp b/contrib/src/stc/PlatWX.cpp index ae08569e59..a8aa94c669 100644 --- a/contrib/src/stc/PlatWX.cpp +++ b/contrib/src/stc/PlatWX.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include "Platform.h" #include "PlatWX.h" @@ -176,14 +178,16 @@ void Font::Create(const char *faceName, int characterSet, int size, bool bold, b break; } - // TODO: Use wxFontMapper and wxEncodingConverter if encoding not available. + wxFontEncodingArray ea = wxEncodingConverter::GetPlatformEquivalents(encoding); + if (ea.GetCount()) + encoding = ea[0]; id = new wxFont(size, wxDEFAULT, italic ? wxITALIC : wxNORMAL, bold ? wxBOLD : wxNORMAL, false, - faceName, + wxString(faceName, wxConvUTF8), encoding); } @@ -320,8 +324,6 @@ int SurfaceImpl::LogPixelsY() { int SurfaceImpl::DeviceHeightFont(int points) { return points; -// int logPix = LogPixelsY(); -// return (points * logPix + logPix / 2) / 72; } void SurfaceImpl::MoveTo(int x_, int y_) { @@ -391,11 +393,8 @@ void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase, hdc->SetTextBackground(wxColourFromCA(back)); FillRectangle(rc, back); -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - wxString str = wxString(s, len); -#endif + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, len); // ybase is where the baseline should be, but wxWin uses the upper left // corner, so I need to calculate the real position for the text... @@ -411,11 +410,8 @@ void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase, FillRectangle(rc, back); hdc->SetClippingRegion(wxRectFromPRectangle(rc)); -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - wxString str = wxString(s, len); -#endif + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, len); // see comments above hdc->DrawText(str, rc.left, ybase - font.ascent); @@ -427,43 +423,67 @@ int SurfaceImpl::WidthText(Font &font, const char *s, int len) { int w; int h; -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - wxString str = wxString(s, len); -#endif + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, len); hdc->GetTextExtent(str, &w, &h); return w; } -void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) { -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - wxString str = wxString(s, len); -#endif +void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) { + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, len); SetFont(font); + + // Calculate the position of each character based on the widths of + // the previous characters + int* tpos = new int[len]; int totalWidth = 0; - for (size_t i=0; i<(size_t)len; i++) { - int w; - int h; + size_t i; + for (i=0; iGetTextExtent(str[i], &w, &h); totalWidth += w; - positions[i] = totalWidth; + tpos[i] = totalWidth; } + +#if wxUSE_UNICODE + // Map the widths for UCS-2 characters back to the UTF-8 input string + i = 0; + size_t ui = 0; + while (i < len) { + unsigned char uch = (unsigned char)s[i]; + positions[i++] = tpos[ui]; + if (uch >= 0x80) { + if (uch < (0x80 + 0x40 + 0x20)) { + positions[i++] = tpos[ui]; + } else { + positions[i++] = tpos[ui]; + positions[i++] = tpos[ui]; + } + } + ui++; + } +#else + + // If not unicode then just use the widths we have + memcpy(positions, tpos, len * sizeof(*tpos)); +#endif + + delete [] tpos; } + int SurfaceImpl::WidthChar(Font &font, char ch) { SetFont(font); int w; int h; -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - hdc->GetTextExtent(ch, &w, &h); -#endif + char s[2] = { ch, 0 }; + + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, 1); + hdc->GetTextExtent(str, &w, &h); return w; } @@ -517,8 +537,14 @@ void SurfaceImpl::FlushCachedState() { } void SurfaceImpl::SetUnicodeMode(bool unicodeMode_) { - // TODO: Make this jive with wxUSE_UNICODE unicodeMode=unicodeMode_; +#if wxUSE_UNICODE + wxASSERT_MSG(unicodeMode == wxUSE_UNICODE, + wxT("Only unicode may be used when wxUSE_UNICODE is on.")); +#else + wxASSERT_MSG(unicodeMode == wxUSE_UNICODE, + wxT("Only non-unicode may be used when wxUSE_UNICODE is off.")); +#endif } Surface *Surface::Allocate() { @@ -615,11 +641,9 @@ void Window::SetCursor(Cursor curs) { void Window::SetTitle(const char *s) { -#if wxUSE_UNICODE -#error Fix this... -#else - GETWIN(id)->SetTitle(s); -#endif + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8); + GETWIN(id)->SetTitle(str); } @@ -777,12 +801,9 @@ int ListBox::Find(const char *prefix) { } void ListBox::GetValue(int n, char *value, int len) { -#if wxUSE_UNICODE -#error fix this... wxString text = GETLB(id)->GetString(n); - strncpy(value, text.c_str(), len); + strncpy(value, text.mb_str(wxConvUTF8), len); value[len-1] = '\0'; -#endif } void ListBox::Sort() { @@ -824,7 +845,9 @@ ColourDesired Platform::ChromeHighlight() { } const char *Platform::DefaultFont() { - return wxNORMAL_FONT->GetFaceName(); + static char buf[128]; + strcpy(buf, wxNORMAL_FONT->GetFaceName().mbc_str()); + return buf; } int Platform::DefaultFontSize() { @@ -836,7 +859,7 @@ unsigned int Platform::DoubleClickTime() { } void Platform::DebugDisplay(const char *s) { - wxLogDebug(s); + wxLogDebug(wxString(s, *wxConvCurrent)); } bool Platform::IsKeyDown(int key) { @@ -895,7 +918,8 @@ void Platform::Assert(const char *c, const char *file, int line) { char buffer[2000]; sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line); if (assertionPopUps) { - int idButton = wxMessageBox(buffer, "Assertion failure", + int idButton = wxMessageBox(wxString(buffer, *wxConvCurrent), + wxT("Assertion failure"), wxICON_HAND | wxOK); // if (idButton == IDRETRY) { // ::DebugBreak(); diff --git a/contrib/src/stc/ScintillaWX.cpp b/contrib/src/stc/ScintillaWX.cpp index 1b65391a59..6cf99b3412 100644 --- a/contrib/src/stc/ScintillaWX.cpp +++ b/contrib/src/stc/ScintillaWX.cpp @@ -148,7 +148,7 @@ void ScintillaWX::Finalise() { void ScintillaWX::StartDrag() { #if wxUSE_DRAG_AND_DROP - wxString dragText(drag.s, drag.len); + wxString dragText(drag.s, wxConvUTF8, drag.len); // Send an event to allow the drag text to be changed wxStyledTextEvent evt(wxEVT_STC_START_DRAG, stc->GetId()); @@ -296,7 +296,8 @@ void ScintillaWX::Copy() { SelectionText st; CopySelectionRange(&st); wxTheClipboard->Open(); - wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len))); + wxString text(st.s, wxConvUTF8, st.len); + wxTheClipboard->SetData(new wxTextDataObject(text)); wxTheClipboard->Close(); } } @@ -313,9 +314,9 @@ void ScintillaWX::Paste() { gotData = wxTheClipboard->GetData(data); wxTheClipboard->Close(); if (gotData) { - wxString str = data.GetText(); - int len = str.Length(); - pdoc->InsertString(currentPos, str.c_str(), len); + wxWX2MBbuf buf = (wxWX2MBbuf)data.GetText().mb_str(wxConvUTF8); + int len = strlen(buf); + pdoc->InsertString(currentPos, buf, len); SetEmptySelection(currentPos + len); } @@ -329,7 +330,7 @@ bool ScintillaWX::CanPaste() { bool canPaste; wxTheClipboard->Open(); - canPaste = wxTheClipboard->IsSupported( wxDF_TEXT ); + canPaste = wxTheClipboard->IsSupported(wxUSE_UNICODE ? wxDF_UNICODETEXT : wxDF_TEXT); wxTheClipboard->Close(); return canPaste; @@ -345,7 +346,7 @@ void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) { if (!label[0]) ((wxMenu*)popup.GetID())->AppendSeparator(); else - ((wxMenu*)popup.GetID())->Append(cmd, label); + ((wxMenu*)popup.GetID())->Append(cmd, wxString(label, *wxConvCurrent)); if (!enabled) ((wxMenu*)popup.GetID())->Enable(cmd, enabled); @@ -497,8 +498,8 @@ void ScintillaWX::DoButtonMove(Point pt) { } -void ScintillaWX::DoAddChar(char ch) { - AddChar(ch); +void ScintillaWX::DoAddChar(int key) { + AddChar(key); } int ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed) { @@ -579,7 +580,7 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) { dragResult = evt.GetDragResult(); if (dragResult == wxDragMove || dragResult == wxDragCopy) { DropAt(evt.GetPosition(), - evt.GetDragText(), + evt.GetDragText().mb_str(wxConvUTF8), dragResult == wxDragMove, FALSE); // TODO: rectangular? return TRUE; diff --git a/contrib/src/stc/ScintillaWX.h b/contrib/src/stc/ScintillaWX.h index 6d583435ec..3174e9efc3 100644 --- a/contrib/src/stc/ScintillaWX.h +++ b/contrib/src/stc/ScintillaWX.h @@ -126,7 +126,7 @@ public: void DoButtonUp(Point pt, unsigned int curTime, bool ctrl); void DoButtonMove(Point pt); void DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown); - void DoAddChar(char ch); + void DoAddChar(int key); int DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed); void DoTick() { Tick(); } diff --git a/contrib/src/stc/gen_iface.py b/contrib/src/stc/gen_iface.py index b8d0972434..8de2af862f 100644 --- a/contrib/src/stc/gen_iface.py +++ b/contrib/src/stc/gen_iface.py @@ -68,38 +68,39 @@ methodOverrideMap = { 'void %s(const wxString& text);', '''void %s(const wxString& text) { - SendMsg(%s, text.Len(), (long)text.c_str());''', + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + SendMsg(%s, strlen(buf), (long)(const char*)buf);''', 0), 'AddStyledText' : (0, - 'void %s(const wxString& text);', + 'void %s(const wxMemoryBuffer& data);', - '''void %s(const wxString& text) { - SendMsg(%s, text.Len(), (long)text.c_str());''', + '''void %s(const wxMemoryBuffer& data) { + SendMsg(%s, data.GetDataLen(), (long)data.GetData());''', 0), 'GetViewWS' : ( 'GetViewWhiteSpace', 0, 0, 0), 'SetViewWS' : ( 'SetViewWhiteSpace', 0, 0, 0), 'GetStyledText' : (0, - 'wxString %s(int startPos, int endPos);', + 'wxMemoryBuffer %s(int startPos, int endPos);', - '''wxString %s(int startPos, int endPos) { - wxString text; + '''wxMemoryBuffer %s(int startPos, int endPos) { + wxMemoryBuffer buf; if (endPos < startPos) { int temp = startPos; startPos = endPos; endPos = temp; } int len = endPos - startPos; - if (!len) return ""; + if (!len) return buf; TextRange tr; - tr.lpstrText = text.GetWriteBuf(len*2); + tr.lpstrText = (char*)buf.GetWriteBuf(len*2+1); tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(%s, 0, (long)&tr); - text.UngetWriteBuf(len*2); - return text;''', + len = SendMsg(%s, 0, (long)&tr); + buf.UngetWriteBuf(len); + return buf;''', ('Retrieve a buffer of cells.',)), @@ -116,20 +117,20 @@ methodOverrideMap = { '#ifdef SWIG\n wxString %s(int* OUTPUT);\n#else\n wxString GetCurLine(int* linePos=NULL);\n#endif', '''wxString %s(int* linePos) { - wxString text; int len = LineLength(GetCurrentLine()); if (!len) { if (linePos) *linePos = 0; - return ""; + return wxEmptyString; } - // Need an extra byte because SCI_GETCURLINE writes a null to the string - char* buf = text.GetWriteBuf(len+1); + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); int pos = SendMsg(%s, len+1, (long)buf); - text.UngetWriteBuf(len); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); if (linePos) *linePos = pos; - - return text;''', + return wxString(buf, wxConvUTF8);''', 0), @@ -172,9 +173,6 @@ methodOverrideMap = { 'SetCaretFore' : ('SetCaretForeground', 0, 0, 0), 'StyleSetFont' : ('StyleSetFaceName', 0, 0, 0), - # need to fix this to map between wx and scintilla encoding flags, leave it out for now... - 'StyleSetCharacterSet' : (None, 0, 0, 0), - 'AssignCmdKey' : ('CmdKeyAssign', 'void %s(int key, int modifiers, int cmd);', @@ -251,7 +249,7 @@ methodOverrideMap = { flags |= wholeWord ? SCFIND_WHOLEWORD : 0; ft.chrg.cpMin = minPos; ft.chrg.cpMax = maxPos; - ft.lpstrText = (char*)text.c_str(); + ft.lpstrText = (char*)(const char*)text.mb_str(wxConvUTF8); return SendMsg(%s, flags, (long)&ft);''', 0), @@ -299,15 +297,15 @@ methodOverrideMap = { 'wxString %s(int line);', '''wxString %s(int line) { - wxString text; int len = LineLength(line); - if (!len) return ""; - char* buf = text.GetWriteBuf(len); + if (!len) return wxEmptyString; - int pos = SendMsg(%s, line, (long)buf); - text.UngetWriteBuf(len); - - return text;''', + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(%s, line, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8);''', ('Retrieve the contents of a line.',)), @@ -316,18 +314,19 @@ methodOverrideMap = { 'wxString %s();', '''wxString %s() { - wxString text; int start; int end; GetSelection(&start, &end); int len = end - start; - if (!len) return ""; - char* buff = text.GetWriteBuf(len); + if (!len) return wxEmptyString; - SendMsg(%s, 0, (long)buff); - text.UngetWriteBuf(len); - return text;''', + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(%s, 0, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8);''', ('Retrieve the selected text.',)), @@ -335,23 +334,23 @@ methodOverrideMap = { 'wxString %s(int startPos, int endPos);', '''wxString %s(int startPos, int endPos) { - wxString text; if (endPos < startPos) { int temp = startPos; startPos = endPos; endPos = temp; } int len = endPos - startPos; - if (!len) return ""; - char* buff = text.GetWriteBuf(len); + if (!len) return wxEmptyString; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len); TextRange tr; - tr.lpstrText = buff; + tr.lpstrText = buf; tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(%s, 0, (long)&tr); - text.UngetWriteBuf(len); - return text;''', + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8);''', ('Retrieve a range of text.',)), @@ -366,13 +365,13 @@ methodOverrideMap = { 'wxString %s();', '''wxString %s() { - wxString text; - int len = GetTextLength(); - char* buff = text.GetWriteBuf(len+1); // leave room for the null... - - SendMsg(%s, len+1, (long)buff); - text.UngetWriteBuf(len); - return text;''', + int len = GetTextLength(); + wxMemoryBuffer mbuf(len+1); // leave room for the null... + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(%s, len+1, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8);''', ('Retrieve all the text in the document.', )), @@ -389,9 +388,8 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - return SendMsg(%s, text.Len(), (long)text.c_str()); - ''', - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', 0), 'ReplaceTargetRE' : (0, @@ -399,9 +397,8 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - return SendMsg(%s, text.Len(), (long)text.c_str()); - ''', - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', 0), 'SearchInTarget' : (0, @@ -409,9 +406,8 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - return SendMsg(%s, text.Len(), (long)text.c_str()); - ''', - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', 0), @@ -462,6 +458,7 @@ methodOverrideMap = { 'UpperCase' : (None, 0, 0, 0), 'LineScrollDown' : (None, 0, 0, 0), 'LineScrollUp' : (None, 0, 0, 0), + 'DeleteBackNotLine' : (None, 0, 0, 0), 'GetDocPointer' : (0, @@ -493,6 +490,19 @@ methodOverrideMap = { '''void %s(void* docPointer) { SendMsg(%s, (long)docPointer);''', 0), + 'SetCodePage' : (0, + 0, + '''void %s(int codePage) { +#if wxUSE_UNICODE + wxASSERT_MSG(codePage == wxSTC_CP_UTF8, + wxT("Only wxSTC_CP_UTF8 may be used when wxUSE_UNICODE is on.")); +#else + wxASSERT_MSG(codePage != wxSTC_CP_UTF8, + wxT("wxSTC_CP_UTF8 may not be used when wxUSE_UNICODE is off.")); +#endif + SendMsg(%s, codePage);''', + ("Set the code page used to interpret the bytes of the document as characters.",) ), + 'GrabFocus' : (None, 0, 0, 0), 'SetFocus' : ('SetSTCFocus', 0, 0, 0), @@ -652,7 +662,7 @@ def makeArgString(param): typ, name = param if typ == 'string': - return '(long)%s.c_str()' % name + return '(long)(const char*)%s.mb_str(wxConvUTF8)' % name if typ == 'colour': return 'wxColourAsLong(%s)' % name @@ -721,7 +731,7 @@ def parseFun(line, methods, docs, values): num = string.atoi(number) for v in cmdValues: if (type(v) == type(()) and v[0] <= num < v[1]) or v == num: - parseVal('CMD_%s=%s' % (string.upper(name), number), values, ()) + parseVal('CMD_%s=%s' % (string.upper(name), number), values, docs) #if retType == 'void' and not param1 and not param2: diff --git a/contrib/src/stc/stc.cpp b/contrib/src/stc/stc.cpp index 2678cc0202..24d1220b5d 100644 --- a/contrib/src/stc/stc.cpp +++ b/contrib/src/stc/stc.cpp @@ -25,7 +25,7 @@ //---------------------------------------------------------------------- -const wxChar* wxSTCNameStr = "stcwindow"; +const wxChar* wxSTCNameStr = wxT("stcwindow"); DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE ) DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED ) @@ -105,6 +105,10 @@ wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent, m_lastKeyDownConsumed = FALSE; m_vScrollBar = NULL; m_hScrollBar = NULL; +#if wxUSE_UNICODE + // Put Scintilla into unicode (UTF-8) mode + SetCodePage(wxSTC_CP_UTF8); +#endif } @@ -142,11 +146,12 @@ static wxColour wxColourFromLong(long c) { 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); } @@ -159,17 +164,18 @@ static wxColour wxColourFromSpec(const wxString& spec) { // Add text to the document void wxStyledTextCtrl::AddText(const wxString& text) { - SendMsg(2001, text.Len(), (long)text.c_str()); + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + SendMsg(2001, strlen(buf), (long)(const char*)buf); } // Add array of cells to document -void wxStyledTextCtrl::AddStyledText(const wxString& text) { - SendMsg(2002, text.Len(), (long)text.c_str()); +void wxStyledTextCtrl::AddStyledText(const wxMemoryBuffer& data) { + SendMsg(2002, data.GetDataLen(), (long)data.GetData()); } // Insert string at a position void wxStyledTextCtrl::InsertText(int pos, const wxString& text) { - SendMsg(2003, pos, (long)text.c_str()); + SendMsg(2003, pos, (long)(const char*)text.mb_str(wxConvUTF8)); } // Delete all text in the document @@ -230,22 +236,22 @@ void wxStyledTextCtrl::SetSavePoint() { } // Retrieve a buffer of cells. -wxString wxStyledTextCtrl::GetStyledText(int startPos, int endPos) { - wxString text; +wxMemoryBuffer wxStyledTextCtrl::GetStyledText(int startPos, int endPos) { + wxMemoryBuffer buf; if (endPos < startPos) { int temp = startPos; startPos = endPos; endPos = temp; } int len = endPos - startPos; - if (!len) return ""; + if (!len) return buf; TextRange tr; - tr.lpstrText = text.GetWriteBuf(len*2); + tr.lpstrText = (char*)buf.GetWriteBuf(len*2+1); tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(2015, 0, (long)&tr); - text.UngetWriteBuf(len*2); - return text; + len = SendMsg(2015, 0, (long)&tr); + buf.UngetWriteBuf(len); + return buf; } // Are there any redoable actions in the undo history. @@ -309,20 +315,20 @@ void wxStyledTextCtrl::SetAnchor(int posAnchor) { // Retrieve the text of the line containing the caret. // Returns the index of the caret on the line. wxString wxStyledTextCtrl::GetCurLine(int* linePos) { - wxString text; int len = LineLength(GetCurrentLine()); if (!len) { if (linePos) *linePos = 0; - return ""; + return wxEmptyString; } - // Need an extra byte because SCI_GETCURLINE writes a null to the string - char* buf = text.GetWriteBuf(len+1); + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); int pos = SendMsg(2027, len+1, (long)buf); - text.UngetWriteBuf(len); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); if (linePos) *linePos = pos; - - return text; + return wxString(buf, wxConvUTF8); } // Retrieve the position of the last correctly styled character. @@ -381,9 +387,15 @@ int wxStyledTextCtrl::GetTabWidth() { } // Set the code page used to interpret the bytes of the document as characters. -// The SC_CP_UTF8 value can be used to enter Unicode mode. void wxStyledTextCtrl::SetCodePage(int codePage) { - SendMsg(2037, codePage, 0); +#if wxUSE_UNICODE + wxASSERT_MSG(codePage == wxSTC_CP_UTF8, + wxT("Only wxSTC_CP_UTF8 may be used when wxUSE_UNICODE is on.")); +#else + wxASSERT_MSG(codePage != wxSTC_CP_UTF8, + wxT("wxSTC_CP_UTF8 may not be used when wxUSE_UNICODE is off.")); +#endif + SendMsg(2037, codePage); } // Set the symbol used for a particular marker number, @@ -511,7 +523,7 @@ void wxStyledTextCtrl::StyleSetSize(int style, int sizePoints) { // Set the font of a style. void wxStyledTextCtrl::StyleSetFaceName(int style, const wxString& fontName) { - SendMsg(2056, style, (long)fontName.c_str()); + SendMsg(2056, style, (long)(const char*)fontName.mb_str(wxConvUTF8)); } // Set a style to have its end of line filled or not. @@ -534,6 +546,11 @@ void wxStyledTextCtrl::StyleSetCase(int style, int caseForce) { SendMsg(2060, style, caseForce); } +// Set the character set of the font in a style. +void wxStyledTextCtrl::StyleSetCharacterSet(int style, int characterSet) { + SendMsg(2066, style, characterSet); +} + // Set the foreground colour of the selection and whether to use this setting. void wxStyledTextCtrl::SetSelForeground(bool useSetting, const wxColour& fore) { SendMsg(2067, useSetting, wxColourAsLong(fore)); @@ -587,7 +604,7 @@ void wxStyledTextCtrl::SetCaretPeriod(int periodMilliseconds) { // Set the set of characters making up words for when moving or selecting // by word. void wxStyledTextCtrl::SetWordChars(const wxString& characters) { - SendMsg(2077, 0, (long)characters.c_str()); + SendMsg(2077, 0, (long)(const char*)characters.mb_str(wxConvUTF8)); } // Start a sequence of actions that is undone and redone as a unit. @@ -680,7 +697,7 @@ void wxStyledTextCtrl::StyleSetChangeable(int style, bool changeable) { // The lenEntered parameter indicates how many characters before // the caret should be used to provide context. void wxStyledTextCtrl::AutoCompShow(int lenEntered, const wxString& itemList) { - SendMsg(2100, lenEntered, (long)itemList.c_str()); + SendMsg(2100, lenEntered, (long)(const char*)itemList.mb_str(wxConvUTF8)); } // Remove the auto-completion list from the screen. @@ -706,7 +723,7 @@ void wxStyledTextCtrl::AutoCompComplete() { // Define a set of character that when typed cancel the auto-completion list. void wxStyledTextCtrl::AutoCompStops(const wxString& characterSet) { - SendMsg(2105, 0, (long)characterSet.c_str()); + SendMsg(2105, 0, (long)(const char*)characterSet.mb_str(wxConvUTF8)); } // Change the separator character in the string setting up an auto-completion @@ -722,7 +739,7 @@ int wxStyledTextCtrl::AutoCompGetSeparator() { // Select the item in the auto-completion list that starts with a string. void wxStyledTextCtrl::AutoCompSelect(const wxString& text) { - SendMsg(2108, 0, (long)text.c_str()); + SendMsg(2108, 0, (long)(const char*)text.mb_str(wxConvUTF8)); } // Should the auto-completion list be cancelled if the user backspaces to a @@ -739,7 +756,7 @@ bool wxStyledTextCtrl::AutoCompGetCancelAtStart() { // Define a set of characters that when typed will cause the autocompletion to // choose the selected item. void wxStyledTextCtrl::AutoCompSetFillUps(const wxString& characterSet) { - SendMsg(2112, 0, (long)characterSet.c_str()); + SendMsg(2112, 0, (long)(const char*)characterSet.mb_str(wxConvUTF8)); } // Should a single item auto-completion list automatically choose the item. @@ -764,7 +781,7 @@ bool wxStyledTextCtrl::AutoCompGetIgnoreCase() { // Display a list of strings and send notification when user chooses one. void wxStyledTextCtrl::UserListShow(int listType, const wxString& itemList) { - SendMsg(2117, listType, (long)itemList.c_str()); + SendMsg(2117, listType, (long)(const char*)itemList.mb_str(wxConvUTF8)); } // Set whether or not autocompletion is hidden automatically when nothing matches @@ -936,7 +953,7 @@ int wxStyledTextCtrl::FindText(int minPos, int maxPos, flags |= wholeWord ? SCFIND_WHOLEWORD : 0; ft.chrg.cpMin = minPos; ft.chrg.cpMax = maxPos; - ft.lpstrText = (char*)text.c_str(); + ft.lpstrText = (char*)(const char*)text.mb_str(wxConvUTF8); return SendMsg(2150, flags, (long)&ft); } @@ -979,15 +996,15 @@ int wxStyledTextCtrl::GetFirstVisibleLine() { // Retrieve the contents of a line. wxString wxStyledTextCtrl::GetLine(int line) { - wxString text; int len = LineLength(line); - if (!len) return ""; - char* buf = text.GetWriteBuf(len); - - int pos = SendMsg(2153, line, (long)buf); - text.UngetWriteBuf(len); + if (!len) return wxEmptyString; - return text; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(2153, line, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8); } // Returns the number of lines in the document. There is always at least one. @@ -1027,39 +1044,40 @@ void wxStyledTextCtrl::SetSelection(int start, int end) { // Retrieve the selected text. wxString wxStyledTextCtrl::GetSelectedText() { - wxString text; int start; int end; GetSelection(&start, &end); int len = end - start; - if (!len) return ""; - char* buff = text.GetWriteBuf(len); + if (!len) return wxEmptyString; - SendMsg(2161, 0, (long)buff); - text.UngetWriteBuf(len); - return text; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(2161, 0, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8); } // Retrieve a range of text. wxString wxStyledTextCtrl::GetTextRange(int startPos, int endPos) { - wxString text; if (endPos < startPos) { int temp = startPos; startPos = endPos; endPos = temp; } int len = endPos - startPos; - if (!len) return ""; - char* buff = text.GetWriteBuf(len); + if (!len) return wxEmptyString; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len); TextRange tr; - tr.lpstrText = buff; + tr.lpstrText = buf; tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(2162, 0, (long)&tr); - text.UngetWriteBuf(len); - return text; + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8); } // Draw the selection in normal style or with selection highlighted. @@ -1089,7 +1107,7 @@ void wxStyledTextCtrl::EnsureCaretVisible() { // Replace the selected text with the argument text. void wxStyledTextCtrl::ReplaceSelection(const wxString& text) { - SendMsg(2170, 0, (long)text.c_str()); + SendMsg(2170, 0, (long)(const char*)text.mb_str(wxConvUTF8)); } // Set to read only or read write. @@ -1139,18 +1157,18 @@ void wxStyledTextCtrl::Clear() { // Replace the contents of the document with the argument text. void wxStyledTextCtrl::SetText(const wxString& text) { - SendMsg(2181, 0, (long)text.c_str()); + SendMsg(2181, 0, (long)(const char*)text.mb_str(wxConvUTF8)); } // Retrieve all the text in the document. wxString wxStyledTextCtrl::GetText() { - wxString text; - int len = GetTextLength(); - char* buff = text.GetWriteBuf(len+1); // leave room for the null... - - SendMsg(2182, len+1, (long)buff); - text.UngetWriteBuf(len); - return text; + int len = GetTextLength(); + wxMemoryBuffer mbuf(len+1); // leave room for the null... + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(2182, len+1, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8); } // Retrieve the number of characters in the document. @@ -1205,8 +1223,8 @@ int wxStyledTextCtrl::GetTargetEnd() { // Returns the length of the replacement text. int wxStyledTextCtrl::ReplaceTarget(const wxString& text) { - return SendMsg(2194, text.Len(), (long)text.c_str()); - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(2194, strlen(buf), (long)(const char*)buf); } // Replace the target text with the argument text after \d processing. @@ -1217,8 +1235,8 @@ int wxStyledTextCtrl::GetTargetEnd() { // caused by processing the \d patterns. int wxStyledTextCtrl::ReplaceTargetRE(const wxString& text) { - return SendMsg(2195, text.Len(), (long)text.c_str()); - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(2195, strlen(buf), (long)(const char*)buf); } // Search for a counted string in the target and set the target to the found @@ -1226,8 +1244,8 @@ int wxStyledTextCtrl::GetTargetEnd() { // Returns length of range or -1 for failure in which case target is not moved. int wxStyledTextCtrl::SearchInTarget(const wxString& text) { - return SendMsg(2197, text.Len(), (long)text.c_str()); - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(2197, strlen(buf), (long)(const char*)buf); } // Set the search flags used by SearchInTarget @@ -1242,7 +1260,7 @@ int wxStyledTextCtrl::GetSearchFlags() { // Show a call tip containing a definition near position pos. void wxStyledTextCtrl::CallTipShow(int pos, const wxString& definition) { - SendMsg(2200, pos, (long)definition.c_str()); + SendMsg(2200, pos, (long)(const char*)definition.mb_str(wxConvUTF8)); } // Remove the call tip from the screen. @@ -1408,12 +1426,6 @@ int wxStyledTextCtrl::GetLayoutCache() { return SendMsg(2273, 0, 0); } -// Delete the selection or if no selection, the character before the caret. -// Will not delete the chraacter before at the start of a line. -void wxStyledTextCtrl::DeleteBackNotLine() { - SendMsg(2344, 0, 0); -} - // Move the caret inside current view if it's not there already void wxStyledTextCtrl::MoveCaretInsideView() { SendMsg(2401, 0, 0); @@ -1505,13 +1517,13 @@ void wxStyledTextCtrl::SearchAnchor() { // Find some text starting at the search anchor. // Does not ensure the selection is visible. int wxStyledTextCtrl::SearchNext(int flags, const wxString& text) { - return SendMsg(2367, flags, (long)text.c_str()); + return SendMsg(2367, flags, (long)(const char*)text.mb_str(wxConvUTF8)); } // Find some text starting at the search anchor and moving backwards. // Does not ensure the selection is visible. int wxStyledTextCtrl::SearchPrev(int flags, const wxString& text) { - return SendMsg(2368, flags, (long)text.c_str()); + return SendMsg(2368, flags, (long)(const char*)text.mb_str(wxConvUTF8)); } // Set the way the line the caret is on is kept visible. @@ -1688,17 +1700,17 @@ void wxStyledTextCtrl::Colourise(int start, int end) { // Set up a value that may be used by a lexer for some optional feature. void wxStyledTextCtrl::SetProperty(const wxString& key, const wxString& value) { - SendMsg(4004, (long)key.c_str(), (long)value.c_str()); + SendMsg(4004, (long)(const char*)key.mb_str(wxConvUTF8), (long)(const char*)value.mb_str(wxConvUTF8)); } // Set up the key words used by the lexer. void wxStyledTextCtrl::SetKeyWords(int keywordSet, const wxString& keyWords) { - SendMsg(4005, keywordSet, (long)keyWords.c_str()); + SendMsg(4005, keywordSet, (long)(const char*)keyWords.mb_str(wxConvUTF8)); } // Set the lexing language of the document based on string name. void wxStyledTextCtrl::SetLexerLanguage(const wxString& language) { - SendMsg(4006, 0, (long)language.c_str()); + SendMsg(4006, 0, (long)(const char*)language.mb_str(wxConvUTF8)); } // END of generated section @@ -1863,6 +1875,7 @@ void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) { void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) { wxSize sz = GetClientSize(); m_swx->DoSize(sz.x, sz.y); + Refresh(FALSE); } void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) { @@ -1905,10 +1918,7 @@ void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& 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()); + int key = evt.GetKeyCode(); // AltGr keys??? // \|@#¬[]{}?£$~ ã,õ,Ã,Õ, ñ, Ñ @@ -1921,7 +1931,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { 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; } @@ -1930,10 +1943,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) { - long key = evt.KeyCode(); + int key = evt.GetKeyCode(); 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); @@ -2031,8 +2044,14 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { 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); diff --git a/contrib/src/stc/stc.cpp.in b/contrib/src/stc/stc.cpp.in index 68346399e9..0e46fcf507 100644 --- a/contrib/src/stc/stc.cpp.in +++ b/contrib/src/stc/stc.cpp.in @@ -25,7 +25,7 @@ //---------------------------------------------------------------------- -const wxChar* wxSTCNameStr = "stcwindow"; +const wxChar* wxSTCNameStr = wxT("stcwindow"); DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE ) DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED ) @@ -105,6 +105,10 @@ wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent, m_lastKeyDownConsumed = FALSE; m_vScrollBar = NULL; m_hScrollBar = NULL; +#if wxUSE_UNICODE + // Put Scintilla into unicode (UTF-8) mode + SetCodePage(wxSTC_CP_UTF8); +#endif } @@ -142,11 +146,12 @@ static wxColour wxColourFromLong(long c) { 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); } @@ -320,6 +325,7 @@ void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) { void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) { wxSize sz = GetClientSize(); m_swx->DoSize(sz.x, sz.y); + Refresh(FALSE); } void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) { @@ -362,10 +368,7 @@ void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& 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()); + int key = evt.GetKeyCode(); // AltGr keys??? // \|@#¬[]{}?£$~ ã,õ,Ã,Õ, ñ, Ñ @@ -378,7 +381,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { 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; } @@ -387,10 +393,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) { - long key = evt.KeyCode(); + int key = evt.GetKeyCode(); 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); @@ -488,8 +494,14 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { 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); diff --git a/contrib/src/stc/stc.h.in b/contrib/src/stc/stc.h.in index 700ea7c9c9..1f2a2ac2d2 100644 --- a/contrib/src/stc/stc.h.in +++ b/contrib/src/stc/stc.h.in @@ -210,7 +210,7 @@ public: void SetKey(int k) { m_key = k; } void SetModifiers(int m) { m_modifiers = m; } void SetModificationType(int t) { m_modificationType = t; } - void SetText(const char* t) { m_text = t; } + void SetText(const wxString& t) { m_text = t; } void SetLength(int len) { m_length = len; } void SetLinesAdded(int num) { m_linesAdded = num; } void SetLine(int val) { m_line = val; } diff --git a/include/wx/stc/stc.h b/include/wx/stc/stc.h index 0a5cafc81e..10b857dd18 100644 --- a/include/wx/stc/stc.h +++ b/include/wx/stc/stc.h @@ -36,7 +36,11 @@ #define wxSTC_START 2000 #define wxSTC_OPTIONAL_START 3000 #define wxSTC_LEXER_START 4000 + +// Redoes the next action on the undo history #define wxSTC_CMD_REDO 2011 + +// Select all the text in the document. #define wxSTC_CMD_SELECTALL 2013 #define wxSTC_WS_INVISIBLE 0 #define wxSTC_WS_VISIBLEALWAYS 1 @@ -154,9 +158,17 @@ #define wxSTC_FIND_MATCHCASE 4 #define wxSTC_FIND_WORDSTART 0x00100000 #define wxSTC_FIND_REGEXP 0x00200000 + +// Undo one action in the undo history. #define wxSTC_CMD_UNDO 2176 + +// Cut the selection to the clipboard. #define wxSTC_CMD_CUT 2177 + +// Copy the selection to the clipboard. #define wxSTC_CMD_COPY 2178 + +// Paste the contents of the clipboard into the document replacing the selection. #define wxSTC_CMD_PASTE 2179 #define wxSTC_FOLDLEVELBASE 0x400 #define wxSTC_FOLDLEVELWHITEFLAG 0x1000 @@ -169,50 +181,144 @@ #define wxSTC_CACHE_CARET 1 #define wxSTC_CACHE_PAGE 2 #define wxSTC_CACHE_DOCUMENT 3 + +// Move caret down one line. #define wxSTC_CMD_LINEDOWN 2300 + +// Move caret down one line extending selection to new caret position. #define wxSTC_CMD_LINEDOWNEXTEND 2301 + +// Move caret up one line. #define wxSTC_CMD_LINEUP 2302 + +// Move caret up one line extending selection to new caret position. #define wxSTC_CMD_LINEUPEXTEND 2303 + +// Move caret left one character. #define wxSTC_CMD_CHARLEFT 2304 + +// Move caret left one character extending selection to new caret position. #define wxSTC_CMD_CHARLEFTEXTEND 2305 + +// Move caret right one character. #define wxSTC_CMD_CHARRIGHT 2306 + +// Move caret right one character extending selection to new caret position. #define wxSTC_CMD_CHARRIGHTEXTEND 2307 + +// Move caret left one word. #define wxSTC_CMD_WORDLEFT 2308 + +// Move caret left one word extending selection to new caret position. #define wxSTC_CMD_WORDLEFTEXTEND 2309 + +// Move caret right one word. #define wxSTC_CMD_WORDRIGHT 2310 + +// Move caret right one word extending selection to new caret position. #define wxSTC_CMD_WORDRIGHTEXTEND 2311 + +// Move caret to first position on line. #define wxSTC_CMD_HOME 2312 + +// Move caret to first position on line extending selection to new caret position. #define wxSTC_CMD_HOMEEXTEND 2313 + +// Move caret to last position on line. #define wxSTC_CMD_LINEEND 2314 + +// Move caret to last position on line extending selection to new caret position. #define wxSTC_CMD_LINEENDEXTEND 2315 + +// Move caret to first position in document. #define wxSTC_CMD_DOCUMENTSTART 2316 + +// Move caret to first position in document extending selection to new caret position. #define wxSTC_CMD_DOCUMENTSTARTEXTEND 2317 + +// Move caret to last position in document. #define wxSTC_CMD_DOCUMENTEND 2318 + +// Move caret to last position in document extending selection to new caret position. #define wxSTC_CMD_DOCUMENTENDEXTEND 2319 + +// Move caret one page up. #define wxSTC_CMD_PAGEUP 2320 + +// Move caret one page up extending selection to new caret position. #define wxSTC_CMD_PAGEUPEXTEND 2321 + +// Move caret one page down. #define wxSTC_CMD_PAGEDOWN 2322 + +// Move caret one page down extending selection to new caret position. #define wxSTC_CMD_PAGEDOWNEXTEND 2323 + +// Switch from insert to overtype mode or the reverse. #define wxSTC_CMD_EDITTOGGLEOVERTYPE 2324 + +// Cancel any modes such as call tip or auto-completion list display. #define wxSTC_CMD_CANCEL 2325 + +// Delete the selection or if no selection, the character before the caret. #define wxSTC_CMD_DELETEBACK 2326 + +// If selection is empty or all on one line replace the selection with a tab +// character. +// If more than one line selected, indent the lines. #define wxSTC_CMD_TAB 2327 + +// Dedent the selected lines. #define wxSTC_CMD_BACKTAB 2328 + +// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. #define wxSTC_CMD_NEWLINE 2329 + +// Insert a Form Feed character. #define wxSTC_CMD_FORMFEED 2330 + +// Move caret to before first visible character on line. +// If already there move to first character on line. #define wxSTC_CMD_VCHOME 2331 + +// Like VCHome but extending selection to new caret position. #define wxSTC_CMD_VCHOMEEXTEND 2332 + +// Magnify the displayed text by increasing the sizes by 1 point. #define wxSTC_CMD_ZOOMIN 2333 + +// Make the displayed text smaller by decreasing the sizes by 1 point. #define wxSTC_CMD_ZOOMOUT 2334 + +// Delete the word to the left of the caret. #define wxSTC_CMD_DELWORDLEFT 2335 + +// Delete the word to the right of the caret. #define wxSTC_CMD_DELWORDRIGHT 2336 + +// Cut the line containing the caret. #define wxSTC_CMD_LINECUT 2337 + +// Delete the line containing the caret. #define wxSTC_CMD_LINEDELETE 2338 + +// Switch the current line with the previous. #define wxSTC_CMD_LINETRANSPOSE 2339 + +// Transform the selection to lower case. #define wxSTC_CMD_LOWERCASE 2340 + +// Transform the selection to upper case. #define wxSTC_CMD_UPPERCASE 2341 + +// Scroll the document down, keeping the caret visible. #define wxSTC_CMD_LINESCROLLDOWN 2342 + +// Scroll the document up, keeping the caret visible. #define wxSTC_CMD_LINESCROLLUP 2343 + +// Delete the selection or if no selection, the character before the caret. +// Will not delete the chraacter before at the start of a line. #define wxSTC_CMD_DELETEBACKNOTLINE 2344 #define wxSTC_EDGE_NONE 0 #define wxSTC_EDGE_LINE 1 @@ -736,7 +842,7 @@ public: void AddText(const wxString& text); // Add array of cells to document - void AddStyledText(const wxString& text); + void AddStyledText(const wxMemoryBuffer& data); // Insert string at a position void InsertText(int pos, const wxString& text); @@ -777,7 +883,7 @@ public: void SetSavePoint(); // Retrieve a buffer of cells. - wxString GetStyledText(int startPos, int endPos); + wxMemoryBuffer GetStyledText(int startPos, int endPos); // Are there any redoable actions in the undo history. bool CanRedo(); @@ -859,7 +965,6 @@ public: int GetTabWidth(); // Set the code page used to interpret the bytes of the document as characters. - // The SC_CP_UTF8 value can be used to enter Unicode mode. void SetCodePage(int codePage); // Set the symbol used for a particular marker number, @@ -949,6 +1054,9 @@ public: // Set a style to be mixed case, or to force upper or lower case. void StyleSetCase(int style, int caseForce); + // Set the character set of the font in a style. + void StyleSetCharacterSet(int style, int characterSet); + // Set the foreground colour of the selection and whether to use this setting. void SetSelForeground(bool useSetting, const wxColour& fore); @@ -1440,10 +1548,6 @@ public: // Retrieve the degree of caching of layout information int GetLayoutCache(); - // Delete the selection or if no selection, the character before the caret. - // Will not delete the chraacter before at the start of a line. - void DeleteBackNotLine(); - // Move the caret inside current view if it's not there already void MoveCaretInsideView(); @@ -1756,7 +1860,7 @@ public: void SetKey(int k) { m_key = k; } void SetModifiers(int m) { m_modifiers = m; } void SetModificationType(int t) { m_modificationType = t; } - void SetText(const char* t) { m_text = t; } + void SetText(const wxString& t) { m_text = t; } void SetLength(int len) { m_length = len; } void SetLinesAdded(int num) { m_linesAdded = num; } void SetLine(int val) { m_line = val; } diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index ae08569e59..a8aa94c669 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include "Platform.h" #include "PlatWX.h" @@ -176,14 +178,16 @@ void Font::Create(const char *faceName, int characterSet, int size, bool bold, b break; } - // TODO: Use wxFontMapper and wxEncodingConverter if encoding not available. + wxFontEncodingArray ea = wxEncodingConverter::GetPlatformEquivalents(encoding); + if (ea.GetCount()) + encoding = ea[0]; id = new wxFont(size, wxDEFAULT, italic ? wxITALIC : wxNORMAL, bold ? wxBOLD : wxNORMAL, false, - faceName, + wxString(faceName, wxConvUTF8), encoding); } @@ -320,8 +324,6 @@ int SurfaceImpl::LogPixelsY() { int SurfaceImpl::DeviceHeightFont(int points) { return points; -// int logPix = LogPixelsY(); -// return (points * logPix + logPix / 2) / 72; } void SurfaceImpl::MoveTo(int x_, int y_) { @@ -391,11 +393,8 @@ void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase, hdc->SetTextBackground(wxColourFromCA(back)); FillRectangle(rc, back); -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - wxString str = wxString(s, len); -#endif + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, len); // ybase is where the baseline should be, but wxWin uses the upper left // corner, so I need to calculate the real position for the text... @@ -411,11 +410,8 @@ void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase, FillRectangle(rc, back); hdc->SetClippingRegion(wxRectFromPRectangle(rc)); -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - wxString str = wxString(s, len); -#endif + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, len); // see comments above hdc->DrawText(str, rc.left, ybase - font.ascent); @@ -427,43 +423,67 @@ int SurfaceImpl::WidthText(Font &font, const char *s, int len) { int w; int h; -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - wxString str = wxString(s, len); -#endif + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, len); hdc->GetTextExtent(str, &w, &h); return w; } -void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) { -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - wxString str = wxString(s, len); -#endif +void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) { + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, len); SetFont(font); + + // Calculate the position of each character based on the widths of + // the previous characters + int* tpos = new int[len]; int totalWidth = 0; - for (size_t i=0; i<(size_t)len; i++) { - int w; - int h; + size_t i; + for (i=0; iGetTextExtent(str[i], &w, &h); totalWidth += w; - positions[i] = totalWidth; + tpos[i] = totalWidth; } + +#if wxUSE_UNICODE + // Map the widths for UCS-2 characters back to the UTF-8 input string + i = 0; + size_t ui = 0; + while (i < len) { + unsigned char uch = (unsigned char)s[i]; + positions[i++] = tpos[ui]; + if (uch >= 0x80) { + if (uch < (0x80 + 0x40 + 0x20)) { + positions[i++] = tpos[ui]; + } else { + positions[i++] = tpos[ui]; + positions[i++] = tpos[ui]; + } + } + ui++; + } +#else + + // If not unicode then just use the widths we have + memcpy(positions, tpos, len * sizeof(*tpos)); +#endif + + delete [] tpos; } + int SurfaceImpl::WidthChar(Font &font, char ch) { SetFont(font); int w; int h; -#if wxUSE_UNICODE -#error fix this... Convert s from UTF-8. -#else - hdc->GetTextExtent(ch, &w, &h); -#endif + char s[2] = { ch, 0 }; + + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8, 1); + hdc->GetTextExtent(str, &w, &h); return w; } @@ -517,8 +537,14 @@ void SurfaceImpl::FlushCachedState() { } void SurfaceImpl::SetUnicodeMode(bool unicodeMode_) { - // TODO: Make this jive with wxUSE_UNICODE unicodeMode=unicodeMode_; +#if wxUSE_UNICODE + wxASSERT_MSG(unicodeMode == wxUSE_UNICODE, + wxT("Only unicode may be used when wxUSE_UNICODE is on.")); +#else + wxASSERT_MSG(unicodeMode == wxUSE_UNICODE, + wxT("Only non-unicode may be used when wxUSE_UNICODE is off.")); +#endif } Surface *Surface::Allocate() { @@ -615,11 +641,9 @@ void Window::SetCursor(Cursor curs) { void Window::SetTitle(const char *s) { -#if wxUSE_UNICODE -#error Fix this... -#else - GETWIN(id)->SetTitle(s); -#endif + // will convert from UTF-8 in unicode mode + wxString str(s, wxConvUTF8); + GETWIN(id)->SetTitle(str); } @@ -777,12 +801,9 @@ int ListBox::Find(const char *prefix) { } void ListBox::GetValue(int n, char *value, int len) { -#if wxUSE_UNICODE -#error fix this... wxString text = GETLB(id)->GetString(n); - strncpy(value, text.c_str(), len); + strncpy(value, text.mb_str(wxConvUTF8), len); value[len-1] = '\0'; -#endif } void ListBox::Sort() { @@ -824,7 +845,9 @@ ColourDesired Platform::ChromeHighlight() { } const char *Platform::DefaultFont() { - return wxNORMAL_FONT->GetFaceName(); + static char buf[128]; + strcpy(buf, wxNORMAL_FONT->GetFaceName().mbc_str()); + return buf; } int Platform::DefaultFontSize() { @@ -836,7 +859,7 @@ unsigned int Platform::DoubleClickTime() { } void Platform::DebugDisplay(const char *s) { - wxLogDebug(s); + wxLogDebug(wxString(s, *wxConvCurrent)); } bool Platform::IsKeyDown(int key) { @@ -895,7 +918,8 @@ void Platform::Assert(const char *c, const char *file, int line) { char buffer[2000]; sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line); if (assertionPopUps) { - int idButton = wxMessageBox(buffer, "Assertion failure", + int idButton = wxMessageBox(wxString(buffer, *wxConvCurrent), + wxT("Assertion failure"), wxICON_HAND | wxOK); // if (idButton == IDRETRY) { // ::DebugBreak(); diff --git a/src/stc/ScintillaWX.cpp b/src/stc/ScintillaWX.cpp index 1b65391a59..6cf99b3412 100644 --- a/src/stc/ScintillaWX.cpp +++ b/src/stc/ScintillaWX.cpp @@ -148,7 +148,7 @@ void ScintillaWX::Finalise() { void ScintillaWX::StartDrag() { #if wxUSE_DRAG_AND_DROP - wxString dragText(drag.s, drag.len); + wxString dragText(drag.s, wxConvUTF8, drag.len); // Send an event to allow the drag text to be changed wxStyledTextEvent evt(wxEVT_STC_START_DRAG, stc->GetId()); @@ -296,7 +296,8 @@ void ScintillaWX::Copy() { SelectionText st; CopySelectionRange(&st); wxTheClipboard->Open(); - wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len))); + wxString text(st.s, wxConvUTF8, st.len); + wxTheClipboard->SetData(new wxTextDataObject(text)); wxTheClipboard->Close(); } } @@ -313,9 +314,9 @@ void ScintillaWX::Paste() { gotData = wxTheClipboard->GetData(data); wxTheClipboard->Close(); if (gotData) { - wxString str = data.GetText(); - int len = str.Length(); - pdoc->InsertString(currentPos, str.c_str(), len); + wxWX2MBbuf buf = (wxWX2MBbuf)data.GetText().mb_str(wxConvUTF8); + int len = strlen(buf); + pdoc->InsertString(currentPos, buf, len); SetEmptySelection(currentPos + len); } @@ -329,7 +330,7 @@ bool ScintillaWX::CanPaste() { bool canPaste; wxTheClipboard->Open(); - canPaste = wxTheClipboard->IsSupported( wxDF_TEXT ); + canPaste = wxTheClipboard->IsSupported(wxUSE_UNICODE ? wxDF_UNICODETEXT : wxDF_TEXT); wxTheClipboard->Close(); return canPaste; @@ -345,7 +346,7 @@ void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) { if (!label[0]) ((wxMenu*)popup.GetID())->AppendSeparator(); else - ((wxMenu*)popup.GetID())->Append(cmd, label); + ((wxMenu*)popup.GetID())->Append(cmd, wxString(label, *wxConvCurrent)); if (!enabled) ((wxMenu*)popup.GetID())->Enable(cmd, enabled); @@ -497,8 +498,8 @@ void ScintillaWX::DoButtonMove(Point pt) { } -void ScintillaWX::DoAddChar(char ch) { - AddChar(ch); +void ScintillaWX::DoAddChar(int key) { + AddChar(key); } int ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed) { @@ -579,7 +580,7 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) { dragResult = evt.GetDragResult(); if (dragResult == wxDragMove || dragResult == wxDragCopy) { DropAt(evt.GetPosition(), - evt.GetDragText(), + evt.GetDragText().mb_str(wxConvUTF8), dragResult == wxDragMove, FALSE); // TODO: rectangular? return TRUE; diff --git a/src/stc/ScintillaWX.h b/src/stc/ScintillaWX.h index 6d583435ec..3174e9efc3 100644 --- a/src/stc/ScintillaWX.h +++ b/src/stc/ScintillaWX.h @@ -126,7 +126,7 @@ public: void DoButtonUp(Point pt, unsigned int curTime, bool ctrl); void DoButtonMove(Point pt); void DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown); - void DoAddChar(char ch); + void DoAddChar(int key); int DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed); void DoTick() { Tick(); } diff --git a/src/stc/gen_iface.py b/src/stc/gen_iface.py index b8d0972434..8de2af862f 100644 --- a/src/stc/gen_iface.py +++ b/src/stc/gen_iface.py @@ -68,38 +68,39 @@ methodOverrideMap = { 'void %s(const wxString& text);', '''void %s(const wxString& text) { - SendMsg(%s, text.Len(), (long)text.c_str());''', + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + SendMsg(%s, strlen(buf), (long)(const char*)buf);''', 0), 'AddStyledText' : (0, - 'void %s(const wxString& text);', + 'void %s(const wxMemoryBuffer& data);', - '''void %s(const wxString& text) { - SendMsg(%s, text.Len(), (long)text.c_str());''', + '''void %s(const wxMemoryBuffer& data) { + SendMsg(%s, data.GetDataLen(), (long)data.GetData());''', 0), 'GetViewWS' : ( 'GetViewWhiteSpace', 0, 0, 0), 'SetViewWS' : ( 'SetViewWhiteSpace', 0, 0, 0), 'GetStyledText' : (0, - 'wxString %s(int startPos, int endPos);', + 'wxMemoryBuffer %s(int startPos, int endPos);', - '''wxString %s(int startPos, int endPos) { - wxString text; + '''wxMemoryBuffer %s(int startPos, int endPos) { + wxMemoryBuffer buf; if (endPos < startPos) { int temp = startPos; startPos = endPos; endPos = temp; } int len = endPos - startPos; - if (!len) return ""; + if (!len) return buf; TextRange tr; - tr.lpstrText = text.GetWriteBuf(len*2); + tr.lpstrText = (char*)buf.GetWriteBuf(len*2+1); tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(%s, 0, (long)&tr); - text.UngetWriteBuf(len*2); - return text;''', + len = SendMsg(%s, 0, (long)&tr); + buf.UngetWriteBuf(len); + return buf;''', ('Retrieve a buffer of cells.',)), @@ -116,20 +117,20 @@ methodOverrideMap = { '#ifdef SWIG\n wxString %s(int* OUTPUT);\n#else\n wxString GetCurLine(int* linePos=NULL);\n#endif', '''wxString %s(int* linePos) { - wxString text; int len = LineLength(GetCurrentLine()); if (!len) { if (linePos) *linePos = 0; - return ""; + return wxEmptyString; } - // Need an extra byte because SCI_GETCURLINE writes a null to the string - char* buf = text.GetWriteBuf(len+1); + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); int pos = SendMsg(%s, len+1, (long)buf); - text.UngetWriteBuf(len); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); if (linePos) *linePos = pos; - - return text;''', + return wxString(buf, wxConvUTF8);''', 0), @@ -172,9 +173,6 @@ methodOverrideMap = { 'SetCaretFore' : ('SetCaretForeground', 0, 0, 0), 'StyleSetFont' : ('StyleSetFaceName', 0, 0, 0), - # need to fix this to map between wx and scintilla encoding flags, leave it out for now... - 'StyleSetCharacterSet' : (None, 0, 0, 0), - 'AssignCmdKey' : ('CmdKeyAssign', 'void %s(int key, int modifiers, int cmd);', @@ -251,7 +249,7 @@ methodOverrideMap = { flags |= wholeWord ? SCFIND_WHOLEWORD : 0; ft.chrg.cpMin = minPos; ft.chrg.cpMax = maxPos; - ft.lpstrText = (char*)text.c_str(); + ft.lpstrText = (char*)(const char*)text.mb_str(wxConvUTF8); return SendMsg(%s, flags, (long)&ft);''', 0), @@ -299,15 +297,15 @@ methodOverrideMap = { 'wxString %s(int line);', '''wxString %s(int line) { - wxString text; int len = LineLength(line); - if (!len) return ""; - char* buf = text.GetWriteBuf(len); + if (!len) return wxEmptyString; - int pos = SendMsg(%s, line, (long)buf); - text.UngetWriteBuf(len); - - return text;''', + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(%s, line, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8);''', ('Retrieve the contents of a line.',)), @@ -316,18 +314,19 @@ methodOverrideMap = { 'wxString %s();', '''wxString %s() { - wxString text; int start; int end; GetSelection(&start, &end); int len = end - start; - if (!len) return ""; - char* buff = text.GetWriteBuf(len); + if (!len) return wxEmptyString; - SendMsg(%s, 0, (long)buff); - text.UngetWriteBuf(len); - return text;''', + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(%s, 0, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8);''', ('Retrieve the selected text.',)), @@ -335,23 +334,23 @@ methodOverrideMap = { 'wxString %s(int startPos, int endPos);', '''wxString %s(int startPos, int endPos) { - wxString text; if (endPos < startPos) { int temp = startPos; startPos = endPos; endPos = temp; } int len = endPos - startPos; - if (!len) return ""; - char* buff = text.GetWriteBuf(len); + if (!len) return wxEmptyString; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len); TextRange tr; - tr.lpstrText = buff; + tr.lpstrText = buf; tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(%s, 0, (long)&tr); - text.UngetWriteBuf(len); - return text;''', + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8);''', ('Retrieve a range of text.',)), @@ -366,13 +365,13 @@ methodOverrideMap = { 'wxString %s();', '''wxString %s() { - wxString text; - int len = GetTextLength(); - char* buff = text.GetWriteBuf(len+1); // leave room for the null... - - SendMsg(%s, len+1, (long)buff); - text.UngetWriteBuf(len); - return text;''', + int len = GetTextLength(); + wxMemoryBuffer mbuf(len+1); // leave room for the null... + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(%s, len+1, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8);''', ('Retrieve all the text in the document.', )), @@ -389,9 +388,8 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - return SendMsg(%s, text.Len(), (long)text.c_str()); - ''', - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', 0), 'ReplaceTargetRE' : (0, @@ -399,9 +397,8 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - return SendMsg(%s, text.Len(), (long)text.c_str()); - ''', - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', 0), 'SearchInTarget' : (0, @@ -409,9 +406,8 @@ methodOverrideMap = { ''' int %s(const wxString& text) { - return SendMsg(%s, text.Len(), (long)text.c_str()); - ''', - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(%s, strlen(buf), (long)(const char*)buf);''', 0), @@ -462,6 +458,7 @@ methodOverrideMap = { 'UpperCase' : (None, 0, 0, 0), 'LineScrollDown' : (None, 0, 0, 0), 'LineScrollUp' : (None, 0, 0, 0), + 'DeleteBackNotLine' : (None, 0, 0, 0), 'GetDocPointer' : (0, @@ -493,6 +490,19 @@ methodOverrideMap = { '''void %s(void* docPointer) { SendMsg(%s, (long)docPointer);''', 0), + 'SetCodePage' : (0, + 0, + '''void %s(int codePage) { +#if wxUSE_UNICODE + wxASSERT_MSG(codePage == wxSTC_CP_UTF8, + wxT("Only wxSTC_CP_UTF8 may be used when wxUSE_UNICODE is on.")); +#else + wxASSERT_MSG(codePage != wxSTC_CP_UTF8, + wxT("wxSTC_CP_UTF8 may not be used when wxUSE_UNICODE is off.")); +#endif + SendMsg(%s, codePage);''', + ("Set the code page used to interpret the bytes of the document as characters.",) ), + 'GrabFocus' : (None, 0, 0, 0), 'SetFocus' : ('SetSTCFocus', 0, 0, 0), @@ -652,7 +662,7 @@ def makeArgString(param): typ, name = param if typ == 'string': - return '(long)%s.c_str()' % name + return '(long)(const char*)%s.mb_str(wxConvUTF8)' % name if typ == 'colour': return 'wxColourAsLong(%s)' % name @@ -721,7 +731,7 @@ def parseFun(line, methods, docs, values): num = string.atoi(number) for v in cmdValues: if (type(v) == type(()) and v[0] <= num < v[1]) or v == num: - parseVal('CMD_%s=%s' % (string.upper(name), number), values, ()) + parseVal('CMD_%s=%s' % (string.upper(name), number), values, docs) #if retType == 'void' and not param1 and not param2: diff --git a/src/stc/stc.cpp b/src/stc/stc.cpp index 2678cc0202..24d1220b5d 100644 --- a/src/stc/stc.cpp +++ b/src/stc/stc.cpp @@ -25,7 +25,7 @@ //---------------------------------------------------------------------- -const wxChar* wxSTCNameStr = "stcwindow"; +const wxChar* wxSTCNameStr = wxT("stcwindow"); DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE ) DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED ) @@ -105,6 +105,10 @@ wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent, m_lastKeyDownConsumed = FALSE; m_vScrollBar = NULL; m_hScrollBar = NULL; +#if wxUSE_UNICODE + // Put Scintilla into unicode (UTF-8) mode + SetCodePage(wxSTC_CP_UTF8); +#endif } @@ -142,11 +146,12 @@ static wxColour wxColourFromLong(long c) { 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); } @@ -159,17 +164,18 @@ static wxColour wxColourFromSpec(const wxString& spec) { // Add text to the document void wxStyledTextCtrl::AddText(const wxString& text) { - SendMsg(2001, text.Len(), (long)text.c_str()); + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + SendMsg(2001, strlen(buf), (long)(const char*)buf); } // Add array of cells to document -void wxStyledTextCtrl::AddStyledText(const wxString& text) { - SendMsg(2002, text.Len(), (long)text.c_str()); +void wxStyledTextCtrl::AddStyledText(const wxMemoryBuffer& data) { + SendMsg(2002, data.GetDataLen(), (long)data.GetData()); } // Insert string at a position void wxStyledTextCtrl::InsertText(int pos, const wxString& text) { - SendMsg(2003, pos, (long)text.c_str()); + SendMsg(2003, pos, (long)(const char*)text.mb_str(wxConvUTF8)); } // Delete all text in the document @@ -230,22 +236,22 @@ void wxStyledTextCtrl::SetSavePoint() { } // Retrieve a buffer of cells. -wxString wxStyledTextCtrl::GetStyledText(int startPos, int endPos) { - wxString text; +wxMemoryBuffer wxStyledTextCtrl::GetStyledText(int startPos, int endPos) { + wxMemoryBuffer buf; if (endPos < startPos) { int temp = startPos; startPos = endPos; endPos = temp; } int len = endPos - startPos; - if (!len) return ""; + if (!len) return buf; TextRange tr; - tr.lpstrText = text.GetWriteBuf(len*2); + tr.lpstrText = (char*)buf.GetWriteBuf(len*2+1); tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(2015, 0, (long)&tr); - text.UngetWriteBuf(len*2); - return text; + len = SendMsg(2015, 0, (long)&tr); + buf.UngetWriteBuf(len); + return buf; } // Are there any redoable actions in the undo history. @@ -309,20 +315,20 @@ void wxStyledTextCtrl::SetAnchor(int posAnchor) { // Retrieve the text of the line containing the caret. // Returns the index of the caret on the line. wxString wxStyledTextCtrl::GetCurLine(int* linePos) { - wxString text; int len = LineLength(GetCurrentLine()); if (!len) { if (linePos) *linePos = 0; - return ""; + return wxEmptyString; } - // Need an extra byte because SCI_GETCURLINE writes a null to the string - char* buf = text.GetWriteBuf(len+1); + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); int pos = SendMsg(2027, len+1, (long)buf); - text.UngetWriteBuf(len); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); if (linePos) *linePos = pos; - - return text; + return wxString(buf, wxConvUTF8); } // Retrieve the position of the last correctly styled character. @@ -381,9 +387,15 @@ int wxStyledTextCtrl::GetTabWidth() { } // Set the code page used to interpret the bytes of the document as characters. -// The SC_CP_UTF8 value can be used to enter Unicode mode. void wxStyledTextCtrl::SetCodePage(int codePage) { - SendMsg(2037, codePage, 0); +#if wxUSE_UNICODE + wxASSERT_MSG(codePage == wxSTC_CP_UTF8, + wxT("Only wxSTC_CP_UTF8 may be used when wxUSE_UNICODE is on.")); +#else + wxASSERT_MSG(codePage != wxSTC_CP_UTF8, + wxT("wxSTC_CP_UTF8 may not be used when wxUSE_UNICODE is off.")); +#endif + SendMsg(2037, codePage); } // Set the symbol used for a particular marker number, @@ -511,7 +523,7 @@ void wxStyledTextCtrl::StyleSetSize(int style, int sizePoints) { // Set the font of a style. void wxStyledTextCtrl::StyleSetFaceName(int style, const wxString& fontName) { - SendMsg(2056, style, (long)fontName.c_str()); + SendMsg(2056, style, (long)(const char*)fontName.mb_str(wxConvUTF8)); } // Set a style to have its end of line filled or not. @@ -534,6 +546,11 @@ void wxStyledTextCtrl::StyleSetCase(int style, int caseForce) { SendMsg(2060, style, caseForce); } +// Set the character set of the font in a style. +void wxStyledTextCtrl::StyleSetCharacterSet(int style, int characterSet) { + SendMsg(2066, style, characterSet); +} + // Set the foreground colour of the selection and whether to use this setting. void wxStyledTextCtrl::SetSelForeground(bool useSetting, const wxColour& fore) { SendMsg(2067, useSetting, wxColourAsLong(fore)); @@ -587,7 +604,7 @@ void wxStyledTextCtrl::SetCaretPeriod(int periodMilliseconds) { // Set the set of characters making up words for when moving or selecting // by word. void wxStyledTextCtrl::SetWordChars(const wxString& characters) { - SendMsg(2077, 0, (long)characters.c_str()); + SendMsg(2077, 0, (long)(const char*)characters.mb_str(wxConvUTF8)); } // Start a sequence of actions that is undone and redone as a unit. @@ -680,7 +697,7 @@ void wxStyledTextCtrl::StyleSetChangeable(int style, bool changeable) { // The lenEntered parameter indicates how many characters before // the caret should be used to provide context. void wxStyledTextCtrl::AutoCompShow(int lenEntered, const wxString& itemList) { - SendMsg(2100, lenEntered, (long)itemList.c_str()); + SendMsg(2100, lenEntered, (long)(const char*)itemList.mb_str(wxConvUTF8)); } // Remove the auto-completion list from the screen. @@ -706,7 +723,7 @@ void wxStyledTextCtrl::AutoCompComplete() { // Define a set of character that when typed cancel the auto-completion list. void wxStyledTextCtrl::AutoCompStops(const wxString& characterSet) { - SendMsg(2105, 0, (long)characterSet.c_str()); + SendMsg(2105, 0, (long)(const char*)characterSet.mb_str(wxConvUTF8)); } // Change the separator character in the string setting up an auto-completion @@ -722,7 +739,7 @@ int wxStyledTextCtrl::AutoCompGetSeparator() { // Select the item in the auto-completion list that starts with a string. void wxStyledTextCtrl::AutoCompSelect(const wxString& text) { - SendMsg(2108, 0, (long)text.c_str()); + SendMsg(2108, 0, (long)(const char*)text.mb_str(wxConvUTF8)); } // Should the auto-completion list be cancelled if the user backspaces to a @@ -739,7 +756,7 @@ bool wxStyledTextCtrl::AutoCompGetCancelAtStart() { // Define a set of characters that when typed will cause the autocompletion to // choose the selected item. void wxStyledTextCtrl::AutoCompSetFillUps(const wxString& characterSet) { - SendMsg(2112, 0, (long)characterSet.c_str()); + SendMsg(2112, 0, (long)(const char*)characterSet.mb_str(wxConvUTF8)); } // Should a single item auto-completion list automatically choose the item. @@ -764,7 +781,7 @@ bool wxStyledTextCtrl::AutoCompGetIgnoreCase() { // Display a list of strings and send notification when user chooses one. void wxStyledTextCtrl::UserListShow(int listType, const wxString& itemList) { - SendMsg(2117, listType, (long)itemList.c_str()); + SendMsg(2117, listType, (long)(const char*)itemList.mb_str(wxConvUTF8)); } // Set whether or not autocompletion is hidden automatically when nothing matches @@ -936,7 +953,7 @@ int wxStyledTextCtrl::FindText(int minPos, int maxPos, flags |= wholeWord ? SCFIND_WHOLEWORD : 0; ft.chrg.cpMin = minPos; ft.chrg.cpMax = maxPos; - ft.lpstrText = (char*)text.c_str(); + ft.lpstrText = (char*)(const char*)text.mb_str(wxConvUTF8); return SendMsg(2150, flags, (long)&ft); } @@ -979,15 +996,15 @@ int wxStyledTextCtrl::GetFirstVisibleLine() { // Retrieve the contents of a line. wxString wxStyledTextCtrl::GetLine(int line) { - wxString text; int len = LineLength(line); - if (!len) return ""; - char* buf = text.GetWriteBuf(len); - - int pos = SendMsg(2153, line, (long)buf); - text.UngetWriteBuf(len); + if (!len) return wxEmptyString; - return text; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(2153, line, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8); } // Returns the number of lines in the document. There is always at least one. @@ -1027,39 +1044,40 @@ void wxStyledTextCtrl::SetSelection(int start, int end) { // Retrieve the selected text. wxString wxStyledTextCtrl::GetSelectedText() { - wxString text; int start; int end; GetSelection(&start, &end); int len = end - start; - if (!len) return ""; - char* buff = text.GetWriteBuf(len); + if (!len) return wxEmptyString; - SendMsg(2161, 0, (long)buff); - text.UngetWriteBuf(len); - return text; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(2161, 0, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8); } // Retrieve a range of text. wxString wxStyledTextCtrl::GetTextRange(int startPos, int endPos) { - wxString text; if (endPos < startPos) { int temp = startPos; startPos = endPos; endPos = temp; } int len = endPos - startPos; - if (!len) return ""; - char* buff = text.GetWriteBuf(len); + if (!len) return wxEmptyString; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len); TextRange tr; - tr.lpstrText = buff; + tr.lpstrText = buf; tr.chrg.cpMin = startPos; tr.chrg.cpMax = endPos; - SendMsg(2162, 0, (long)&tr); - text.UngetWriteBuf(len); - return text; + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8); } // Draw the selection in normal style or with selection highlighted. @@ -1089,7 +1107,7 @@ void wxStyledTextCtrl::EnsureCaretVisible() { // Replace the selected text with the argument text. void wxStyledTextCtrl::ReplaceSelection(const wxString& text) { - SendMsg(2170, 0, (long)text.c_str()); + SendMsg(2170, 0, (long)(const char*)text.mb_str(wxConvUTF8)); } // Set to read only or read write. @@ -1139,18 +1157,18 @@ void wxStyledTextCtrl::Clear() { // Replace the contents of the document with the argument text. void wxStyledTextCtrl::SetText(const wxString& text) { - SendMsg(2181, 0, (long)text.c_str()); + SendMsg(2181, 0, (long)(const char*)text.mb_str(wxConvUTF8)); } // Retrieve all the text in the document. wxString wxStyledTextCtrl::GetText() { - wxString text; - int len = GetTextLength(); - char* buff = text.GetWriteBuf(len+1); // leave room for the null... - - SendMsg(2182, len+1, (long)buff); - text.UngetWriteBuf(len); - return text; + int len = GetTextLength(); + wxMemoryBuffer mbuf(len+1); // leave room for the null... + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(2182, len+1, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return wxString(buf, wxConvUTF8); } // Retrieve the number of characters in the document. @@ -1205,8 +1223,8 @@ int wxStyledTextCtrl::GetTargetEnd() { // Returns the length of the replacement text. int wxStyledTextCtrl::ReplaceTarget(const wxString& text) { - return SendMsg(2194, text.Len(), (long)text.c_str()); - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(2194, strlen(buf), (long)(const char*)buf); } // Replace the target text with the argument text after \d processing. @@ -1217,8 +1235,8 @@ int wxStyledTextCtrl::GetTargetEnd() { // caused by processing the \d patterns. int wxStyledTextCtrl::ReplaceTargetRE(const wxString& text) { - return SendMsg(2195, text.Len(), (long)text.c_str()); - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(2195, strlen(buf), (long)(const char*)buf); } // Search for a counted string in the target and set the target to the found @@ -1226,8 +1244,8 @@ int wxStyledTextCtrl::GetTargetEnd() { // Returns length of range or -1 for failure in which case target is not moved. int wxStyledTextCtrl::SearchInTarget(const wxString& text) { - return SendMsg(2197, text.Len(), (long)text.c_str()); - + wxWX2MBbuf buf = (wxWX2MBbuf)text.mb_str(wxConvUTF8); + return SendMsg(2197, strlen(buf), (long)(const char*)buf); } // Set the search flags used by SearchInTarget @@ -1242,7 +1260,7 @@ int wxStyledTextCtrl::GetSearchFlags() { // Show a call tip containing a definition near position pos. void wxStyledTextCtrl::CallTipShow(int pos, const wxString& definition) { - SendMsg(2200, pos, (long)definition.c_str()); + SendMsg(2200, pos, (long)(const char*)definition.mb_str(wxConvUTF8)); } // Remove the call tip from the screen. @@ -1408,12 +1426,6 @@ int wxStyledTextCtrl::GetLayoutCache() { return SendMsg(2273, 0, 0); } -// Delete the selection or if no selection, the character before the caret. -// Will not delete the chraacter before at the start of a line. -void wxStyledTextCtrl::DeleteBackNotLine() { - SendMsg(2344, 0, 0); -} - // Move the caret inside current view if it's not there already void wxStyledTextCtrl::MoveCaretInsideView() { SendMsg(2401, 0, 0); @@ -1505,13 +1517,13 @@ void wxStyledTextCtrl::SearchAnchor() { // Find some text starting at the search anchor. // Does not ensure the selection is visible. int wxStyledTextCtrl::SearchNext(int flags, const wxString& text) { - return SendMsg(2367, flags, (long)text.c_str()); + return SendMsg(2367, flags, (long)(const char*)text.mb_str(wxConvUTF8)); } // Find some text starting at the search anchor and moving backwards. // Does not ensure the selection is visible. int wxStyledTextCtrl::SearchPrev(int flags, const wxString& text) { - return SendMsg(2368, flags, (long)text.c_str()); + return SendMsg(2368, flags, (long)(const char*)text.mb_str(wxConvUTF8)); } // Set the way the line the caret is on is kept visible. @@ -1688,17 +1700,17 @@ void wxStyledTextCtrl::Colourise(int start, int end) { // Set up a value that may be used by a lexer for some optional feature. void wxStyledTextCtrl::SetProperty(const wxString& key, const wxString& value) { - SendMsg(4004, (long)key.c_str(), (long)value.c_str()); + SendMsg(4004, (long)(const char*)key.mb_str(wxConvUTF8), (long)(const char*)value.mb_str(wxConvUTF8)); } // Set up the key words used by the lexer. void wxStyledTextCtrl::SetKeyWords(int keywordSet, const wxString& keyWords) { - SendMsg(4005, keywordSet, (long)keyWords.c_str()); + SendMsg(4005, keywordSet, (long)(const char*)keyWords.mb_str(wxConvUTF8)); } // Set the lexing language of the document based on string name. void wxStyledTextCtrl::SetLexerLanguage(const wxString& language) { - SendMsg(4006, 0, (long)language.c_str()); + SendMsg(4006, 0, (long)(const char*)language.mb_str(wxConvUTF8)); } // END of generated section @@ -1863,6 +1875,7 @@ void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) { void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) { wxSize sz = GetClientSize(); m_swx->DoSize(sz.x, sz.y); + Refresh(FALSE); } void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) { @@ -1905,10 +1918,7 @@ void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& 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()); + int key = evt.GetKeyCode(); // AltGr keys??? // \|@#¬[]{}?£$~ ã,õ,Ã,Õ, ñ, Ñ @@ -1921,7 +1931,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { 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; } @@ -1930,10 +1943,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) { - long key = evt.KeyCode(); + int key = evt.GetKeyCode(); 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); @@ -2031,8 +2044,14 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { 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); diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in index 68346399e9..0e46fcf507 100644 --- a/src/stc/stc.cpp.in +++ b/src/stc/stc.cpp.in @@ -25,7 +25,7 @@ //---------------------------------------------------------------------- -const wxChar* wxSTCNameStr = "stcwindow"; +const wxChar* wxSTCNameStr = wxT("stcwindow"); DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE ) DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED ) @@ -105,6 +105,10 @@ wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent, m_lastKeyDownConsumed = FALSE; m_vScrollBar = NULL; m_hScrollBar = NULL; +#if wxUSE_UNICODE + // Put Scintilla into unicode (UTF-8) mode + SetCodePage(wxSTC_CP_UTF8); +#endif } @@ -142,11 +146,12 @@ static wxColour wxColourFromLong(long c) { 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); } @@ -320,6 +325,7 @@ void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) { void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) { wxSize sz = GetClientSize(); m_swx->DoSize(sz.x, sz.y); + Refresh(FALSE); } void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) { @@ -362,10 +368,7 @@ void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& 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()); + int key = evt.GetKeyCode(); // AltGr keys??? // \|@#¬[]{}?£$~ ã,õ,Ã,Õ, ñ, Ñ @@ -378,7 +381,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { 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; } @@ -387,10 +393,10 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) { - long key = evt.KeyCode(); + int key = evt.GetKeyCode(); 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); @@ -488,8 +494,14 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { 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); diff --git a/src/stc/stc.h.in b/src/stc/stc.h.in index 700ea7c9c9..1f2a2ac2d2 100644 --- a/src/stc/stc.h.in +++ b/src/stc/stc.h.in @@ -210,7 +210,7 @@ public: void SetKey(int k) { m_key = k; } void SetModifiers(int m) { m_modifiers = m; } void SetModificationType(int t) { m_modificationType = t; } - void SetText(const char* t) { m_text = t; } + void SetText(const wxString& t) { m_text = t; } void SetLength(int len) { m_length = len; } void SetLinesAdded(int num) { m_linesAdded = num; } void SetLine(int val) { m_line = val; } diff --git a/wxPython/contrib/stc/msw/stc_.cpp b/wxPython/contrib/stc/msw/stc_.cpp index 1bb901b932..04085efc97 100644 --- a/wxPython/contrib/stc/msw/stc_.cpp +++ b/wxPython/contrib/stc/msw/stc_.cpp @@ -218,10 +218,10 @@ static PyObject *_wrap_wxStyledTextCtrl_AddText(PyObject *self, PyObject *args, static PyObject *_wrap_wxStyledTextCtrl_AddStyledText(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; wxStyledTextCtrl * _arg0; - wxString * _arg1; + wxMemoryBuffer * _arg1; PyObject * _argo0 = 0; PyObject * _obj1 = 0; - char *_kwnames[] = { "self","text", NULL }; + char *_kwnames[] = { "self","data", NULL }; self = self; if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextCtrl_AddStyledText",_kwnames,&_argo0,&_obj1)) @@ -234,9 +234,14 @@ static PyObject *_wrap_wxStyledTextCtrl_AddStyledText(PyObject *self, PyObject * } } { - _arg1 = wxString_in_helper(_obj1); - if (_arg1 == NULL) + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, "String buffer expected"); return NULL; + } + char* str = PyString_AS_STRING(_obj1); + int len = PyString_GET_SIZE(_obj1); + _arg1 = new wxMemoryBuffer(len); + memcpy(_arg1->GetData(), str, len); } { PyThreadState* __tstate = wxPyBeginAllowThreads(); @@ -609,7 +614,7 @@ static PyObject *_wrap_wxStyledTextCtrl_SetSavePoint(PyObject *self, PyObject *a #define wxStyledTextCtrl_GetStyledText(_swigobj,_swigarg0,_swigarg1) (_swigobj->GetStyledText(_swigarg0,_swigarg1)) static PyObject *_wrap_wxStyledTextCtrl_GetStyledText(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; - wxString * _result; + wxMemoryBuffer * _result; wxStyledTextCtrl * _arg0; int _arg1; int _arg2; @@ -628,16 +633,12 @@ static PyObject *_wrap_wxStyledTextCtrl_GetStyledText(PyObject *self, PyObject * } { PyThreadState* __tstate = wxPyBeginAllowThreads(); - _result = new wxString (wxStyledTextCtrl_GetStyledText(_arg0,_arg1,_arg2)); + _result = new wxMemoryBuffer (wxStyledTextCtrl_GetStyledText(_arg0,_arg1,_arg2)); wxPyEndAllowThreads(__tstate); if (PyErr_Occurred()) return NULL; }{ -#if wxUSE_UNICODE - _resultobj = PyUnicode_FromUnicode(_result->c_str(), _result->Len()); -#else - _resultobj = PyString_FromStringAndSize(_result->c_str(), _result->Len()); -#endif + _resultobj = PyString_FromStringAndSize((char*)_result->GetData(), _result->GetDataLen()); } { delete _result; @@ -2231,6 +2232,36 @@ static PyObject *_wrap_wxStyledTextCtrl_StyleSetCase(PyObject *self, PyObject *a return _resultobj; } +#define wxStyledTextCtrl_StyleSetCharacterSet(_swigobj,_swigarg0,_swigarg1) (_swigobj->StyleSetCharacterSet(_swigarg0,_swigarg1)) +static PyObject *_wrap_wxStyledTextCtrl_StyleSetCharacterSet(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxStyledTextCtrl * _arg0; + int _arg1; + int _arg2; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self","style","characterSet", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oii:wxStyledTextCtrl_StyleSetCharacterSet",_kwnames,&_argo0,&_arg1,&_arg2)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_StyleSetCharacterSet. Expected _wxStyledTextCtrl_p."); + return NULL; + } + } +{ + PyThreadState* __tstate = wxPyBeginAllowThreads(); + wxStyledTextCtrl_StyleSetCharacterSet(_arg0,_arg1,_arg2); + + wxPyEndAllowThreads(__tstate); + if (PyErr_Occurred()) return NULL; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + #define wxStyledTextCtrl_SetSelForeground(_swigobj,_swigarg0,_swigarg1) (_swigobj->SetSelForeground(_swigarg0,_swigarg1)) static PyObject *_wrap_wxStyledTextCtrl_SetSelForeground(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; @@ -6907,34 +6938,6 @@ static PyObject *_wrap_wxStyledTextCtrl_GetLayoutCache(PyObject *self, PyObject return _resultobj; } -#define wxStyledTextCtrl_DeleteBackNotLine(_swigobj) (_swigobj->DeleteBackNotLine()) -static PyObject *_wrap_wxStyledTextCtrl_DeleteBackNotLine(PyObject *self, PyObject *args, PyObject *kwargs) { - PyObject * _resultobj; - wxStyledTextCtrl * _arg0; - PyObject * _argo0 = 0; - char *_kwnames[] = { "self", NULL }; - - self = self; - if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxStyledTextCtrl_DeleteBackNotLine",_kwnames,&_argo0)) - return NULL; - if (_argo0) { - if (_argo0 == Py_None) { _arg0 = NULL; } - else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxStyledTextCtrl_p")) { - PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxStyledTextCtrl_DeleteBackNotLine. Expected _wxStyledTextCtrl_p."); - return NULL; - } - } -{ - PyThreadState* __tstate = wxPyBeginAllowThreads(); - wxStyledTextCtrl_DeleteBackNotLine(_arg0); - - wxPyEndAllowThreads(__tstate); - if (PyErr_Occurred()) return NULL; -} Py_INCREF(Py_None); - _resultobj = Py_None; - return _resultobj; -} - #define wxStyledTextCtrl_MoveCaretInsideView(_swigobj) (_swigobj->MoveCaretInsideView()) static PyObject *_wrap_wxStyledTextCtrl_MoveCaretInsideView(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; @@ -9312,12 +9315,13 @@ static PyObject *_wrap_wxStyledTextEvent_SetModificationType(PyObject *self, PyO static PyObject *_wrap_wxStyledTextEvent_SetText(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; wxStyledTextEvent * _arg0; - char * _arg1; + wxString * _arg1; PyObject * _argo0 = 0; + PyObject * _obj1 = 0; char *_kwnames[] = { "self","t", NULL }; self = self; - if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Os:wxStyledTextEvent_SetText",_kwnames,&_argo0,&_arg1)) + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxStyledTextEvent_SetText",_kwnames,&_argo0,&_obj1)) return NULL; if (_argo0) { if (_argo0 == Py_None) { _arg0 = NULL; } @@ -9326,14 +9330,23 @@ static PyObject *_wrap_wxStyledTextEvent_SetText(PyObject *self, PyObject *args, return NULL; } } +{ + _arg1 = wxString_in_helper(_obj1); + if (_arg1 == NULL) + return NULL; +} { PyThreadState* __tstate = wxPyBeginAllowThreads(); - wxStyledTextEvent_SetText(_arg0,_arg1); + wxStyledTextEvent_SetText(_arg0,*_arg1); wxPyEndAllowThreads(__tstate); if (PyErr_Occurred()) return NULL; } Py_INCREF(Py_None); _resultobj = Py_None; +{ + if (_obj1) + delete _arg1; +} return _resultobj; } @@ -10597,7 +10610,6 @@ static PyMethodDef stc_cMethods[] = { { "wxStyledTextCtrl_BraceHighlight", (PyCFunction) _wrap_wxStyledTextCtrl_BraceHighlight, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_LineLength", (PyCFunction) _wrap_wxStyledTextCtrl_LineLength, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_MoveCaretInsideView", (PyCFunction) _wrap_wxStyledTextCtrl_MoveCaretInsideView, METH_VARARGS | METH_KEYWORDS }, - { "wxStyledTextCtrl_DeleteBackNotLine", (PyCFunction) _wrap_wxStyledTextCtrl_DeleteBackNotLine, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_GetLayoutCache", (PyCFunction) _wrap_wxStyledTextCtrl_GetLayoutCache, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_SetLayoutCache", (PyCFunction) _wrap_wxStyledTextCtrl_SetLayoutCache, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_GetWrapMode", (PyCFunction) _wrap_wxStyledTextCtrl_GetWrapMode, METH_VARARGS | METH_KEYWORDS }, @@ -10750,6 +10762,7 @@ static PyMethodDef stc_cMethods[] = { { "wxStyledTextCtrl_SetCaretForeground", (PyCFunction) _wrap_wxStyledTextCtrl_SetCaretForeground, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_SetSelBackground", (PyCFunction) _wrap_wxStyledTextCtrl_SetSelBackground, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_SetSelForeground", (PyCFunction) _wrap_wxStyledTextCtrl_SetSelForeground, METH_VARARGS | METH_KEYWORDS }, + { "wxStyledTextCtrl_StyleSetCharacterSet", (PyCFunction) _wrap_wxStyledTextCtrl_StyleSetCharacterSet, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_StyleSetCase", (PyCFunction) _wrap_wxStyledTextCtrl_StyleSetCase, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_StyleSetUnderline", (PyCFunction) _wrap_wxStyledTextCtrl_StyleSetUnderline, METH_VARARGS | METH_KEYWORDS }, { "wxStyledTextCtrl_StyleResetDefault", (PyCFunction) _wrap_wxStyledTextCtrl_StyleResetDefault, METH_VARARGS | METH_KEYWORDS }, diff --git a/wxPython/contrib/stc/msw/stc_.py b/wxPython/contrib/stc/msw/stc_.py index a7f4f8e05c..a7a8e8718a 100644 --- a/wxPython/contrib/stc/msw/stc_.py +++ b/wxPython/contrib/stc/msw/stc_.py @@ -310,6 +310,9 @@ class wxStyledTextCtrlPtr(wxControlPtr): def StyleSetCase(self, *_args, **_kwargs): val = apply(stc_c.wxStyledTextCtrl_StyleSetCase,(self,) + _args, _kwargs) return val + def StyleSetCharacterSet(self, *_args, **_kwargs): + val = apply(stc_c.wxStyledTextCtrl_StyleSetCharacterSet,(self,) + _args, _kwargs) + return val def SetSelForeground(self, *_args, **_kwargs): val = apply(stc_c.wxStyledTextCtrl_SetSelForeground,(self,) + _args, _kwargs) return val @@ -769,9 +772,6 @@ class wxStyledTextCtrlPtr(wxControlPtr): def GetLayoutCache(self, *_args, **_kwargs): val = apply(stc_c.wxStyledTextCtrl_GetLayoutCache,(self,) + _args, _kwargs) return val - def DeleteBackNotLine(self, *_args, **_kwargs): - val = apply(stc_c.wxStyledTextCtrl_DeleteBackNotLine,(self,) + _args, _kwargs) - return val def MoveCaretInsideView(self, *_args, **_kwargs): val = apply(stc_c.wxStyledTextCtrl_MoveCaretInsideView,(self,) + _args, _kwargs) return val diff --git a/wxPython/demo/data/stc.h.html b/wxPython/demo/data/stc.h.html index 19c8c573ae..4cd44645b7 100644 --- a/wxPython/demo/data/stc.h.html +++ b/wxPython/demo/data/stc.h.html @@ -42,7 +42,11 @@ #define wxSTC_START 2000 #define wxSTC_OPTIONAL_START 3000 #define wxSTC_LEXER_START 4000 + +// Redoes the next action on the undo history #define wxSTC_CMD_REDO 2011 + +// Select all the text in the document. #define wxSTC_CMD_SELECTALL 2013 #define wxSTC_WS_INVISIBLE 0 #define wxSTC_WS_VISIBLEALWAYS 1 @@ -160,9 +164,17 @@ #define wxSTC_FIND_MATCHCASE 4 #define wxSTC_FIND_WORDSTART 0x00100000 #define wxSTC_FIND_REGEXP 0x00200000 + +// Undo one action in the undo history. #define wxSTC_CMD_UNDO 2176 + +// Cut the selection to the clipboard. #define wxSTC_CMD_CUT 2177 + +// Copy the selection to the clipboard. #define wxSTC_CMD_COPY 2178 + +// Paste the contents of the clipboard into the document replacing the selection. #define wxSTC_CMD_PASTE 2179 #define wxSTC_FOLDLEVELBASE 0x400 #define wxSTC_FOLDLEVELWHITEFLAG 0x1000 @@ -175,50 +187,144 @@ #define wxSTC_CACHE_CARET 1 #define wxSTC_CACHE_PAGE 2 #define wxSTC_CACHE_DOCUMENT 3 + +// Move caret down one line. #define wxSTC_CMD_LINEDOWN 2300 + +// Move caret down one line extending selection to new caret position. #define wxSTC_CMD_LINEDOWNEXTEND 2301 + +// Move caret up one line. #define wxSTC_CMD_LINEUP 2302 + +// Move caret up one line extending selection to new caret position. #define wxSTC_CMD_LINEUPEXTEND 2303 + +// Move caret left one character. #define wxSTC_CMD_CHARLEFT 2304 + +// Move caret left one character extending selection to new caret position. #define wxSTC_CMD_CHARLEFTEXTEND 2305 + +// Move caret right one character. #define wxSTC_CMD_CHARRIGHT 2306 + +// Move caret right one character extending selection to new caret position. #define wxSTC_CMD_CHARRIGHTEXTEND 2307 + +// Move caret left one word. #define wxSTC_CMD_WORDLEFT 2308 + +// Move caret left one word extending selection to new caret position. #define wxSTC_CMD_WORDLEFTEXTEND 2309 + +// Move caret right one word. #define wxSTC_CMD_WORDRIGHT 2310 + +// Move caret right one word extending selection to new caret position. #define wxSTC_CMD_WORDRIGHTEXTEND 2311 + +// Move caret to first position on line. #define wxSTC_CMD_HOME 2312 + +// Move caret to first position on line extending selection to new caret position. #define wxSTC_CMD_HOMEEXTEND 2313 + +// Move caret to last position on line. #define wxSTC_CMD_LINEEND 2314 + +// Move caret to last position on line extending selection to new caret position. #define wxSTC_CMD_LINEENDEXTEND 2315 + +// Move caret to first position in document. #define wxSTC_CMD_DOCUMENTSTART 2316 + +// Move caret to first position in document extending selection to new caret position. #define wxSTC_CMD_DOCUMENTSTARTEXTEND 2317 + +// Move caret to last position in document. #define wxSTC_CMD_DOCUMENTEND 2318 + +// Move caret to last position in document extending selection to new caret position. #define wxSTC_CMD_DOCUMENTENDEXTEND 2319 + +// Move caret one page up. #define wxSTC_CMD_PAGEUP 2320 + +// Move caret one page up extending selection to new caret position. #define wxSTC_CMD_PAGEUPEXTEND 2321 + +// Move caret one page down. #define wxSTC_CMD_PAGEDOWN 2322 + +// Move caret one page down extending selection to new caret position. #define wxSTC_CMD_PAGEDOWNEXTEND 2323 + +// Switch from insert to overtype mode or the reverse. #define wxSTC_CMD_EDITTOGGLEOVERTYPE 2324 + +// Cancel any modes such as call tip or auto-completion list display. #define wxSTC_CMD_CANCEL 2325 + +// Delete the selection or if no selection, the character before the caret. #define wxSTC_CMD_DELETEBACK 2326 + +// If selection is empty or all on one line replace the selection with a tab +// character. +// If more than one line selected, indent the lines. #define wxSTC_CMD_TAB 2327 + +// Dedent the selected lines. #define wxSTC_CMD_BACKTAB 2328 + +// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. #define wxSTC_CMD_NEWLINE 2329 + +// Insert a Form Feed character. #define wxSTC_CMD_FORMFEED 2330 + +// Move caret to before first visible character on line. +// If already there move to first character on line. #define wxSTC_CMD_VCHOME 2331 + +// Like VCHome but extending selection to new caret position. #define wxSTC_CMD_VCHOMEEXTEND 2332 + +// Magnify the displayed text by increasing the sizes by 1 point. #define wxSTC_CMD_ZOOMIN 2333 + +// Make the displayed text smaller by decreasing the sizes by 1 point. #define wxSTC_CMD_ZOOMOUT 2334 + +// Delete the word to the left of the caret. #define wxSTC_CMD_DELWORDLEFT 2335 + +// Delete the word to the right of the caret. #define wxSTC_CMD_DELWORDRIGHT 2336 + +// Cut the line containing the caret. #define wxSTC_CMD_LINECUT 2337 + +// Delete the line containing the caret. #define wxSTC_CMD_LINEDELETE 2338 + +// Switch the current line with the previous. #define wxSTC_CMD_LINETRANSPOSE 2339 + +// Transform the selection to lower case. #define wxSTC_CMD_LOWERCASE 2340 + +// Transform the selection to upper case. #define wxSTC_CMD_UPPERCASE 2341 + +// Scroll the document down, keeping the caret visible. #define wxSTC_CMD_LINESCROLLDOWN 2342 + +// Scroll the document up, keeping the caret visible. #define wxSTC_CMD_LINESCROLLUP 2343 + +// Delete the selection or if no selection, the character before the caret. +// Will not delete the chraacter before at the start of a line. #define wxSTC_CMD_DELETEBACKNOTLINE 2344 #define wxSTC_EDGE_NONE 0 #define wxSTC_EDGE_LINE 1 @@ -742,7 +848,7 @@ void AddText(const wxString& text); // Add array of cells to document - void AddStyledText(const wxString& text); + void AddStyledText(const wxMemoryBuffer& data); // Insert string at a position void InsertText(int pos, const wxString& text); @@ -783,7 +889,7 @@ void SetSavePoint(); // Retrieve a buffer of cells. - wxString GetStyledText(int startPos, int endPos); + wxMemoryBuffer GetStyledText(int startPos, int endPos); // Are there any redoable actions in the undo history. bool CanRedo(); @@ -865,7 +971,6 @@ int GetTabWidth(); // Set the code page used to interpret the bytes of the document as characters. - // The SC_CP_UTF8 value can be used to enter Unicode mode. void SetCodePage(int codePage); // Set the symbol used for a particular marker number, @@ -955,6 +1060,9 @@ // Set a style to be mixed case, or to force upper or lower case. void StyleSetCase(int style, int caseForce); + // Set the character set of the font in a style. + void StyleSetCharacterSet(int style, int characterSet); + // Set the foreground colour of the selection and whether to use this setting. void SetSelForeground(bool useSetting, const wxColour& fore); @@ -1446,10 +1554,6 @@ // Retrieve the degree of caching of layout information int GetLayoutCache(); - // Delete the selection or if no selection, the character before the caret. - // Will not delete the chraacter before at the start of a line. - void DeleteBackNotLine(); - // Move the caret inside current view if it's not there already void MoveCaretInsideView(); @@ -1762,7 +1866,7 @@ void SetKey(int k) { m_key = k; } void SetModifiers(int m) { m_modifiers = m; } void SetModificationType(int t) { m_modificationType = t; } - void SetText(const char* t) { m_text = t; } + void SetText(const wxString& t) { m_text = t; } void SetLength(int len) { m_length = len; } void SetLinesAdded(int num) { m_linesAdded = num; } void SetLine(int val) { m_line = val; } diff --git a/wxPython/demo/wxStyledTextCtrl_1.py b/wxPython/demo/wxStyledTextCtrl_1.py index c641f2d9fa..ed9a403f72 100644 --- a/wxPython/demo/wxStyledTextCtrl_1.py +++ b/wxPython/demo/wxStyledTextCtrl_1.py @@ -107,7 +107,7 @@ class MySTC(wxStyledTextCtrl): evt.GetPosition(), evt.GetLinesAdded(), evt.GetLength(), - evt.GetText() )) + repr(evt.GetText()) )) def transModType(self, modType): @@ -153,7 +153,23 @@ def runTest(frame, nb, log): p.SetSizer(s) p.SetAutoLayout(true) + +## ed.SetBufferedDraw(false) +## ed.StyleClearAll() ed.SetText(demoText) + if wxUSE_UNICODE: + import codecs + decode = codecs.lookup("utf-8")[1] + + ed.GotoPos(ed.GetLength()) + ed.AddText("\n\nwxStyledTextCtrl can also do Unicode:\n") + unitext, l = decode('\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd - ' + '\xd0\xbb\xd1\x83\xd1\x87\xd1\x88\xd0\xb8\xd0\xb9 ' + '\xd1\x8f\xd0\xb7\xd1\x8b\xd0\xba \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb3\xd1\x80\xd0\xb0\xd0\xbc\xd0\xbc\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f!\n\n') + ed.AddText('\tRussian: ') + ed.AddText(unitext) + ed.GotoPos(0) + ed.EmptyUndoBuffer() # make some styles @@ -163,8 +179,7 @@ def runTest(frame, nb, log): ed.StyleSetSpec(3, "face:%s,bold,size:%d" % (face2, pb+2)) ed.StyleSetSpec(4, "face:%s,size:%d" % (face1, pb-1)) - - # now set some text to those styles... Normally this would be + # Now set some text to those styles... Normally this would be # done in an event handler that happens when text needs displayed. ed.StartStyling(98, 0xff) ed.SetStyling(6, 1) # set style for 6 characters using style 1 @@ -211,6 +226,7 @@ def runTest(frame, nb, log): ed.SetStyling(10, wxSTC_INDIC1_MASK) ed.SetStyling(10, wxSTC_INDIC2_MASK | wxSTC_INDIC1_MASK) + # some test stuff... if debug: print "GetTextLength(): ", ed.GetTextLength(), len(ed.GetText()) diff --git a/wxPython/setup.py b/wxPython/setup.py index f9cb2d5e6e..ae094c25f0 100755 --- a/wxPython/setup.py +++ b/wxPython/setup.py @@ -465,7 +465,7 @@ if BUILD_GLCANVAS or GL_ONLY: other_sources = [] swig_sources = run_swig(swig_files, location, GENDIR, PKGDIR, - USE_SWIG, swig_force, swig_args) + USE_SWIG, swig_force, swig_args, swig_deps) gl_libs = [] if os.name == 'posix': @@ -507,7 +507,7 @@ if not GL_ONLY and BUILD_OGL: 'oglcanvas.i'] swig_sources = run_swig(swig_files, location, '', PKGDIR, - USE_SWIG, swig_force, swig_args) + USE_SWIG, swig_force, swig_args, swig_deps) if IN_CVS_TREE: # make sure local copy of contrib files are up to date @@ -577,7 +577,7 @@ if not GL_ONLY and BUILD_STC: swig_sources = run_swig(swig_files, location, GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args + ['-I'+STC_H, '-I'+location], - [opj(STC_H, 'stc.h')]) + [opj(STC_H, 'stc.h')] + swig_deps) # copy a contrib project specific py module to the main package dir copy_file(opj(location, 'stc.py'), PKGDIR, update=1, verbose=0) @@ -666,7 +666,7 @@ if not GL_ONLY and BUILD_IEWIN: swig_files = ['iewin.i', ] swig_sources = run_swig(swig_files, location, '', PKGDIR, - USE_SWIG, swig_force, swig_args) + USE_SWIG, swig_force, swig_args, swig_deps) ext = Extension('iewinc', ['%s/IEHtmlWin.cpp' % location, @@ -698,7 +698,7 @@ if not GL_ONLY and BUILD_XRC: swig_files = ['xrc.i'] swig_sources = run_swig(swig_files, location, '', PKGDIR, - USE_SWIG, swig_force, swig_args) + USE_SWIG, swig_force, swig_args, swig_deps) xmlres_includes = includes[:] xmlres_includes.append('%s/expat/xmlparse' % XMLLOC) @@ -786,7 +786,7 @@ if not GL_ONLY and BUILD_GIZMOS: swig_files = ['gizmos.i'] swig_sources = run_swig(swig_files, location, '', PKGDIR, - USE_SWIG, swig_force, swig_args) + USE_SWIG, swig_force, swig_args, swig_deps) gizmos_includes = includes[:] gizmos_includes.append(GIZMOINC) @@ -829,7 +829,7 @@ if not GL_ONLY and BUILD_DLLWIDGET: swig_files = ['dllwidget_.i'] swig_sources = run_swig(swig_files, location, '', PKGDIR, - USE_SWIG, swig_force, swig_args) + USE_SWIG, swig_force, swig_args, swig_deps) # copy a contrib project specific py module to the main package dir copy_file(opj(location, 'dllwidget.py'), PKGDIR, update=1, verbose=0) diff --git a/wxPython/src/my_typemaps.i b/wxPython/src/my_typemaps.i index 1c712edc4f..cd202b68fd 100644 --- a/wxPython/src/my_typemaps.i +++ b/wxPython/src/my_typemaps.i @@ -188,6 +188,32 @@ $function +//--------------------------------------------------------------------------- + + +%typemap(python, in) wxMemoryBuffer& { + if (!PyString_Check($source)) { + PyErr_SetString(PyExc_TypeError, "String buffer expected"); + return NULL; + } + char* str = PyString_AS_STRING($source); + int len = PyString_GET_SIZE($source); + $target = new wxMemoryBuffer(len); + memcpy($target->GetData(), str, len); +} + +%typemap(python, freearg) wxMemoryBuffer& { + if ($target) + delete $source; +} + +%typemap(python, out) wxMemoryBuffer { + $target = PyString_FromStringAndSize((char*)$source->GetData(), $source->GetDataLen()); +} + +%typemap(python, ret) wxMemoryBuffer { + delete $source; +} //--------------------------------------------------------------------------- -- 2.45.2