X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ccfc3219dbe96561abd2975ffe3eba2c7f31ef2c..18591d70d9f37ca7af5208c68d4647192b07740d:/src/stc/stc.cpp.in diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in index 91641689aa..73a311bf8b 100644 --- a/src/stc/stc.cpp.in +++ b/src/stc/stc.cpp.in @@ -15,17 +15,30 @@ // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -#include +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STC #include "wx/stc/stc.h" -#include "ScintillaWX.h" +#include "wx/stc/private.h" + +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif // WX_PRECOMP + +#include -#include -#include -#include -#include -#include +#include "wx/tokenzr.h" +#include "wx/mstream.h" +#include "wx/image.h" +#include "wx/file.h" +#include "ScintillaWX.h" //---------------------------------------------------------------------- @@ -46,7 +59,9 @@ static long wxColourAsLong(const wxColour& co) { static wxColour wxColourFromLong(long c) { wxColour clr; - clr.Set(c & 0xff, (c >> 8) & 0xff, (c >> 16) & 0xff); + clr.Set((unsigned char)(c & 0xff), + (unsigned char)((c >> 8) & 0xff), + (unsigned char)((c >> 16) & 0xff)); return clr; } @@ -60,7 +75,9 @@ static wxColour wxColourFromSpec(const wxString& spec) { spec.Mid(1,2).ToLong(&red, 16); spec.Mid(3,2).ToLong(&green, 16); spec.Mid(5,2).ToLong(&blue, 16); - return wxColour(red, green, blue); + return wxColour((unsigned char)red, + (unsigned char)green, + (unsigned char)blue); } else return wxColour(spec); @@ -93,6 +110,9 @@ DEFINE_EVENT_TYPE( wxEVT_STC_ZOOM ) DEFINE_EVENT_TYPE( wxEVT_STC_HOTSPOT_CLICK ) DEFINE_EVENT_TYPE( wxEVT_STC_HOTSPOT_DCLICK ) DEFINE_EVENT_TYPE( wxEVT_STC_CALLTIP_CLICK ) +DEFINE_EVENT_TYPE( wxEVT_STC_AUTOCOMP_SELECTION ) +DEFINE_EVENT_TYPE( wxEVT_STC_INDICATOR_CLICK ) +DEFINE_EVENT_TYPE( wxEVT_STC_INDICATOR_RELEASE ) @@ -147,19 +167,18 @@ wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent, } -void wxStyledTextCtrl::Create(wxWindow *parent, - wxWindowID id, - const wxPoint& pos, - const wxSize& size, - long style, - const wxString& name) +bool wxStyledTextCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) { -#ifdef __WXMAC__ style |= wxVSCROLL | wxHSCROLL; -#endif - wxControl::Create(parent, id, pos, size, - style | wxWANTS_CHARS | wxCLIP_CHILDREN, - wxDefaultValidator, name); + if (!wxControl::Create(parent, id, pos, size, + style | wxWANTS_CHARS | wxCLIP_CHILDREN, + wxDefaultValidator, name)) + return false; #ifdef LINK_LEXERS Scintilla_LinkLexers(); @@ -174,7 +193,11 @@ void wxStyledTextCtrl::Create(wxWindow *parent, SetCodePage(wxSTC_CP_UTF8); #endif - SetBestFittingSize(size); + SetInitialSize(size); + + // Reduces flicker on GTK+/X11 + SetBackgroundStyle(wxBG_STYLE_CUSTOM); + return true; } @@ -280,6 +303,25 @@ void wxStyledTextCtrl::StyleSetSpec(int styleNum, const wxString& spec) { } +// Get the font of a style +wxFont wxStyledTextCtrl::StyleGetFont(int style) { + wxFont font; + font.SetPointSize(StyleGetSize(style)); + font.SetFaceName(StyleGetFaceName(style)); + if( StyleGetBold(style) ) + font.SetWeight(wxFONTWEIGHT_BOLD); + else + font.SetWeight(wxFONTWEIGHT_NORMAL); + + if( StyleGetItalic(style) ) + font.SetStyle(wxFONTSTYLE_ITALIC); + else + font.SetStyle(wxFONTSTYLE_NORMAL); + + return font; +} + + // Set style size, face, bold, italic, and underline attributes from // a wxFont's attributes. void wxStyledTextCtrl::StyleSetFont(int styleNum, wxFont& font) { @@ -288,28 +330,135 @@ void wxStyledTextCtrl::StyleSetFont(int styleNum, wxFont& font) { int x, y; GetTextExtent(wxT("X"), &x, &y, NULL, NULL, &font); #endif - int size = font.GetPointSize(); - wxString faceName = font.GetFaceName(); - bool bold = font.GetWeight() == wxBOLD; - bool italic = font.GetStyle() != wxNORMAL; - bool under = font.GetUnderlined(); - - // TODO: add encoding/charset mapping - StyleSetFontAttr(styleNum, size, faceName, bold, italic, under); + int size = font.GetPointSize(); + wxString faceName = font.GetFaceName(); + bool bold = font.GetWeight() == wxBOLD; + bool italic = font.GetStyle() != wxNORMAL; + bool under = font.GetUnderlined(); + wxFontEncoding encoding = font.GetEncoding(); + + StyleSetFontAttr(styleNum, size, faceName, bold, italic, under, encoding); } // Set all font style attributes at once. void wxStyledTextCtrl::StyleSetFontAttr(int styleNum, int size, const wxString& faceName, bool bold, bool italic, - bool underline) { + bool underline, + wxFontEncoding encoding) { StyleSetSize(styleNum, size); StyleSetFaceName(styleNum, faceName); StyleSetBold(styleNum, bold); StyleSetItalic(styleNum, italic); StyleSetUnderline(styleNum, underline); + StyleSetFontEncoding(styleNum, encoding); +} + - // TODO: add encoding/charset mapping +// Set the character set of the font in a style. Converts the Scintilla +// character set values to a wxFontEncoding. +void wxStyledTextCtrl::StyleSetCharacterSet(int style, int characterSet) +{ + wxFontEncoding encoding; + + // Translate the Scintilla characterSet to a wxFontEncoding + switch (characterSet) { + default: + case wxSTC_CHARSET_ANSI: + case wxSTC_CHARSET_DEFAULT: + encoding = wxFONTENCODING_DEFAULT; + break; + + case wxSTC_CHARSET_BALTIC: + encoding = wxFONTENCODING_ISO8859_13; + break; + + case wxSTC_CHARSET_CHINESEBIG5: + encoding = wxFONTENCODING_CP950; + break; + + case wxSTC_CHARSET_EASTEUROPE: + encoding = wxFONTENCODING_ISO8859_2; + break; + + case wxSTC_CHARSET_GB2312: + encoding = wxFONTENCODING_CP936; + break; + + case wxSTC_CHARSET_GREEK: + encoding = wxFONTENCODING_ISO8859_7; + break; + + case wxSTC_CHARSET_HANGUL: + encoding = wxFONTENCODING_CP949; + break; + + case wxSTC_CHARSET_MAC: + encoding = wxFONTENCODING_DEFAULT; + break; + + case wxSTC_CHARSET_OEM: + encoding = wxFONTENCODING_DEFAULT; + break; + + case wxSTC_CHARSET_RUSSIAN: + encoding = wxFONTENCODING_KOI8; + break; + + case wxSTC_CHARSET_SHIFTJIS: + encoding = wxFONTENCODING_CP932; + break; + + case wxSTC_CHARSET_SYMBOL: + encoding = wxFONTENCODING_DEFAULT; + break; + + case wxSTC_CHARSET_TURKISH: + encoding = wxFONTENCODING_ISO8859_9; + break; + + case wxSTC_CHARSET_JOHAB: + encoding = wxFONTENCODING_DEFAULT; + break; + + case wxSTC_CHARSET_HEBREW: + encoding = wxFONTENCODING_ISO8859_8; + break; + + case wxSTC_CHARSET_ARABIC: + encoding = wxFONTENCODING_ISO8859_6; + break; + + case wxSTC_CHARSET_VIETNAMESE: + encoding = wxFONTENCODING_DEFAULT; + break; + + case wxSTC_CHARSET_THAI: + encoding = wxFONTENCODING_ISO8859_11; + break; + + case wxSTC_CHARSET_CYRILLIC: + encoding = wxFONTENCODING_ISO8859_5; + break; + + case wxSTC_CHARSET_8859_15: + encoding = wxFONTENCODING_ISO8859_15;; + break; + } + + // We just have Scintilla track the wxFontEncoding for us. It gets used + // in Font::Create in PlatWX.cpp. We add one to the value so that the + // effective wxFONENCODING_DEFAULT == SC_SHARSET_DEFAULT and so when + // Scintilla internally uses SC_CHARSET_DEFAULT we will translate it back + // to wxFONENCODING_DEFAULT in Font::Create. + SendMsg(SCI_STYLESETCHARACTERSET, style, encoding+1); +} + + +// Set the font encoding to be used by a style. +void wxStyledTextCtrl::StyleSetFontEncoding(int style, wxFontEncoding encoding) +{ + SendMsg(SCI_STYLESETCHARACTERSET, style, encoding+1); } @@ -377,7 +526,9 @@ bool wxStyledTextCtrl::LoadFile(const wxString& filename) if (file.IsOpened()) { wxString contents; - size_t len = (size_t)file.Length(); + // get the file size (assume it is not huge file...) + ssize_t len = (ssize_t)file.Length(); + if (len > 0) { #if wxUSE_UNICODE @@ -394,7 +545,12 @@ bool wxStyledTextCtrl::LoadFile(const wxString& filename) #endif } else - success = true; // empty file is ok + { + if (len == 0) + success = true; // empty file is ok + else + success = false; // len == wxInvalidOffset + } if (success) { @@ -428,6 +584,109 @@ bool wxStyledTextCtrl::GetUseAntiAliasing() { return m_swx->GetUseAntiAliasing(); } + + + + +void wxStyledTextCtrl::AddTextRaw(const char* text) +{ + SendMsg(SCI_ADDTEXT, strlen(text), (long)text); +} + +void wxStyledTextCtrl::InsertTextRaw(int pos, const char* text) +{ + SendMsg(SCI_INSERTTEXT, pos, (long)text); +} + +wxCharBuffer wxStyledTextCtrl::GetCurLineRaw(int* linePos) +{ + int len = LineLength(GetCurrentLine()); + if (!len) { + if (linePos) *linePos = 0; + wxCharBuffer empty; + return empty; + } + + wxCharBuffer buf(len); + int pos = SendMsg(SCI_GETCURLINE, len, (long)buf.data()); + if (linePos) *linePos = pos; + return buf; +} + +wxCharBuffer wxStyledTextCtrl::GetLineRaw(int line) +{ + int len = LineLength(line); + if (!len) { + wxCharBuffer empty; + return empty; + } + + wxCharBuffer buf(len); + SendMsg(SCI_GETLINE, line, (long)buf.data()); + return buf; +} + +wxCharBuffer wxStyledTextCtrl::GetSelectedTextRaw() +{ + int start; + int end; + + GetSelection(&start, &end); + int len = end - start; + if (!len) { + wxCharBuffer empty; + return empty; + } + + wxCharBuffer buf(len); + SendMsg(SCI_GETSELTEXT, 0, (long)buf.data()); + return buf; +} + +wxCharBuffer wxStyledTextCtrl::GetTextRangeRaw(int startPos, int endPos) +{ + if (endPos < startPos) { + int temp = startPos; + startPos = endPos; + endPos = temp; + } + int len = endPos - startPos; + if (!len) { + wxCharBuffer empty; + return empty; + } + + wxCharBuffer buf(len); + TextRange tr; + tr.lpstrText = buf.data(); + tr.chrg.cpMin = startPos; + tr.chrg.cpMax = endPos; + SendMsg(SCI_GETTEXTRANGE, 0, (long)&tr); + return buf; +} + +void wxStyledTextCtrl::SetTextRaw(const char* text) +{ + SendMsg(SCI_SETTEXT, 0, (long)text); +} + +wxCharBuffer wxStyledTextCtrl::GetTextRaw() +{ + int len = GetTextLength(); + wxCharBuffer buf(len); + SendMsg(SCI_GETTEXT, len, (long)buf.data()); + return buf; +} + +void wxStyledTextCtrl::AppendTextRaw(const char* text) +{ + SendMsg(SCI_APPENDTEXT, strlen(text), (long)text); +} + + + + + //---------------------------------------------------------------------- // Event handlers @@ -515,7 +774,7 @@ void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) { void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { - // On (some?) non-US keyboards the AltGr key is required to enter some + // On (some?) non-US PC keyboards the AltGr key is required to enter some // common characters. It comes to us as both Alt and Ctrl down so we need // to let the char through in that case, otherwise if only ctrl or only // alt let's skip it. @@ -530,32 +789,45 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { #endif bool skip = ((ctrl || alt) && ! (ctrl && alt)); - int key = evt.GetKeyCode(); - -// printf("OnChar key:%%d consumed:%%d ctrl:%%d alt:%%d skip:%%d\n", -// key, m_lastKeyDownConsumed, ctrl, alt, skip); +#if wxUSE_UNICODE + // apparently if we don't do this, Unicode keys pressed after non-char + // ASCII ones (e.g. Enter, Tab) are not taken into account (patch 1615989) + if (m_lastKeyDownConsumed && evt.GetUnicodeKey() > 255) + m_lastKeyDownConsumed = false; +#endif - if ( (key <= WXK_START || key > WXK_COMMAND) && - !m_lastKeyDownConsumed && !skip) { - m_swx->DoAddChar(key); - return; + if (!m_lastKeyDownConsumed && !skip) { +#if wxUSE_UNICODE + int key = evt.GetUnicodeKey(); + bool keyOk = true; + + // if the unicode key code is not really a unicode character (it may + // be a function key or etc., the platforms appear to always give us a + // small value in this case) then fallback to the ascii key code but + // don't do anything for function keys or etc. + if (key <= 127) { + key = evt.GetKeyCode(); + keyOk = (key <= 127); + } + if (keyOk) { + m_swx->DoAddChar(key); + return; + } +#else + int key = evt.GetKeyCode(); + if (key <= WXK_START || key > WXK_COMMAND) { + m_swx->DoAddChar(key); + return; + } +#endif } + evt.Skip(); } void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) { - int key = evt.GetKeyCode(); - bool shift = evt.ShiftDown(), - ctrl = evt.ControlDown(), - alt = evt.AltDown(), - meta = evt.MetaDown(); - - int processed = m_swx->DoKeyDown(key, shift, ctrl, alt, meta, &m_lastKeyDownConsumed); - -// printf("KeyDn key:%%d shift:%%d ctrl:%%d alt:%%d processed:%%d consumed:%%d\n", -// key, shift, ctrl, alt, processed, m_lastKeyDownConsumed); - + int processed = m_swx->DoKeyDown(evt, &m_lastKeyDownConsumed); if (!processed && !m_lastKeyDownConsumed) evt.Skip(); } @@ -622,12 +894,7 @@ static void SetEventText(wxStyledTextEvent& evt, const char* text, size_t length) { if(!text) return; - // 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(length+1); - buf.AppendData((void*)text, length); - buf.AppendByte(0); - evt.SetText(stc2wx(buf)); + evt.SetText(stc2wx(text, length)); } @@ -705,10 +972,18 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { evt.SetEventType(wxEVT_STC_PAINTED); break; + case SCN_AUTOCSELECTION: + evt.SetEventType(wxEVT_STC_AUTOCOMP_SELECTION); + evt.SetListType(scn.listType); + SetEventText(evt, scn.text, strlen(scn.text)); + evt.SetPosition(scn.lParam); + break; + case SCN_USERLISTSELECTION: evt.SetEventType(wxEVT_STC_USERLISTSELECTION); evt.SetListType(scn.listType); SetEventText(evt, scn.text, strlen(scn.text)); + evt.SetPosition(scn.lParam); break; case SCN_URIDROPPED: @@ -744,6 +1019,14 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { evt.SetEventType(wxEVT_STC_CALLTIP_CLICK); break; + case SCN_INDICATORCLICK: + evt.SetEventType(wxEVT_STC_INDICATOR_CLICK); + break; + + case SCN_INDICATORRELEASE: + evt.SetEventType(wxEVT_STC_INDICATOR_RELEASE); + break; + default: return; } @@ -820,11 +1103,4 @@ wxStyledTextEvent::wxStyledTextEvent(const wxStyledTextEvent& event): //---------------------------------------------------------------------- //---------------------------------------------------------------------- - - - - - - - - +#endif // wxUSE_STC