X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/00c64037fb763781c64036f6e165fc0555a07d4e..1978421a6d8b81c1f8a961da4b8ddf544fec7b1b:/src/stc/stc.cpp.in?ds=inline diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in index 991ae203ac..60360d977e 100644 --- a/src/stc/stc.cpp.in +++ b/src/stc/stc.cpp.in @@ -20,59 +20,48 @@ #include "wx/stc/stc.h" #include "ScintillaWX.h" +#include #include +#include +#include +#include -// The following code forces a reference to all of the Scintilla lexers. -// If we don't do something like this, then the linker tends to "optimize" -// them away. (eric@sourcegear.com) -int wxForceScintillaLexers(void) -{ - extern LexerModule lmAda; - extern LexerModule lmAVE; - extern LexerModule lmConf; - extern LexerModule lmCPP; - extern LexerModule lmNncrontab; - extern LexerModule lmEiffel; - extern LexerModule lmHTML; - extern LexerModule lmLISP; - extern LexerModule lmLua; - extern LexerModule lmBatch; // In LexOthers.cxx - extern LexerModule lmPascal; - extern LexerModule lmPerl; - extern LexerModule lmPython; - extern LexerModule lmRuby; - extern LexerModule lmSQL; - extern LexerModule lmVB; - - if ( &lmAda - && &lmAVE - && &lmConf - && &lmCPP - && &lmNncrontab - && &lmEiffel - && &lmHTML - && &lmLISP - && &lmLua - && &lmBatch - && &lmPascal - && &lmPerl - && &lmPython - && &lmRuby - && &lmSQL - && &lmVB ) - { - return 1; - } - else - { - return 0; - } +//---------------------------------------------------------------------- + +const wxChar* wxSTCNameStr = wxT("stcwindow"); + +#ifdef MAKELONG +#undef MAKELONG +#endif + +#define MAKELONG(a, b) ((a) | ((b) << 16)) + + +static long wxColourAsLong(const wxColour& co) { + return (((long)co.Blue() << 16) | + ((long)co.Green() << 8) | + ((long)co.Red())); +} + +static wxColour wxColourFromLong(long c) { + wxColour clr; + clr.Set(c & 0xff, (c >> 8) & 0xff, (c >> 16) & 0xff); + return clr; } -//---------------------------------------------------------------------- -const wxChar* wxSTCNameStr = "stcwindow"; +static wxColour wxColourFromSpec(const wxString& spec) { + // 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); +} + +//---------------------------------------------------------------------- DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE ) DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED ) @@ -93,33 +82,40 @@ DEFINE_EVENT_TYPE( wxEVT_STC_USERLISTSELECTION ) DEFINE_EVENT_TYPE( wxEVT_STC_URIDROPPED ) DEFINE_EVENT_TYPE( wxEVT_STC_DWELLSTART ) DEFINE_EVENT_TYPE( wxEVT_STC_DWELLEND ) -#if wxUSE_DRAG_AND_DROP DEFINE_EVENT_TYPE( wxEVT_STC_START_DRAG ) DEFINE_EVENT_TYPE( wxEVT_STC_DRAG_OVER ) DEFINE_EVENT_TYPE( wxEVT_STC_DO_DROP ) -#endif +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 ) + BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl) EVT_PAINT (wxStyledTextCtrl::OnPaint) EVT_SCROLLWIN (wxStyledTextCtrl::OnScrollWin) + EVT_SCROLL (wxStyledTextCtrl::OnScroll) EVT_SIZE (wxStyledTextCtrl::OnSize) EVT_LEFT_DOWN (wxStyledTextCtrl::OnMouseLeftDown) -#ifdef __WXMSW__ // Let Scintilla see the double click as a second click EVT_LEFT_DCLICK (wxStyledTextCtrl::OnMouseLeftDown) -#endif EVT_MOTION (wxStyledTextCtrl::OnMouseMove) EVT_LEFT_UP (wxStyledTextCtrl::OnMouseLeftUp) +#if defined(__WXGTK__) || defined(__WXMAC__) + EVT_RIGHT_UP (wxStyledTextCtrl::OnMouseRightUp) +#else EVT_CONTEXT_MENU (wxStyledTextCtrl::OnContextMenu) +#endif EVT_MOUSEWHEEL (wxStyledTextCtrl::OnMouseWheel) + EVT_MIDDLE_UP (wxStyledTextCtrl::OnMouseMiddleUp) EVT_CHAR (wxStyledTextCtrl::OnChar) EVT_KEY_DOWN (wxStyledTextCtrl::OnKeyDown) EVT_KILL_FOCUS (wxStyledTextCtrl::OnLoseFocus) EVT_SET_FOCUS (wxStyledTextCtrl::OnGainFocus) EVT_SYS_COLOUR_CHANGED (wxStyledTextCtrl::OnSysColourChanged) EVT_ERASE_BACKGROUND (wxStyledTextCtrl::OnEraseBackground) - EVT_MENU_RANGE (-1, -1, wxStyledTextCtrl::OnMenu) + EVT_MENU_RANGE (10, 16, wxStyledTextCtrl::OnMenu) EVT_LISTBOX_DCLICK (-1, wxStyledTextCtrl::OnListBox) END_EVENT_TABLE() @@ -127,6 +123,11 @@ END_EVENT_TABLE() IMPLEMENT_CLASS(wxStyledTextCtrl, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxStyledTextEvent, wxCommandEvent) +#ifdef LINK_LEXERS +// forces the linking of the lexer modules +int Scintilla_LinkLexers(); +#endif + //---------------------------------------------------------------------- // Constructor and Destructor @@ -140,9 +141,18 @@ wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent, style | wxVSCROLL | wxHSCROLL | wxWANTS_CHARS | wxCLIP_CHILDREN, wxDefaultValidator, name) { +#ifdef LINK_LEXERS + Scintilla_LinkLexers(); +#endif m_swx = new ScintillaWX(this); m_stopWatch.Start(); m_lastKeyDownConsumed = FALSE; + m_vScrollBar = NULL; + m_hScrollBar = NULL; +#if wxUSE_UNICODE + // Put Scintilla into unicode (UTF-8) mode + SetCodePage(wxSTC_CP_UTF8); +#endif } @@ -159,35 +169,6 @@ long wxStyledTextCtrl::SendMsg(int msg, long wp, long lp) { } -#ifdef MAKELONG -#undef MAKELONG -#endif - -#define MAKELONG(a, b) ((a) | ((b) << 16)) - - -static long wxColourAsLong(const wxColour& co) { - return (((long)co.Blue() << 16) | - ((long)co.Green() << 8) | - ((long)co.Red())); -} - -static wxColour wxColourFromLong(long c) { - wxColour clr; - clr.Set(c & 0xff, (c >> 8) & 0xff, (c >> 16) & 0xff); - return clr; -} - - -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); - return wxColour(red, green, blue); -} - //---------------------------------------------------------------------- // BEGIN generated section. The following code is automatically generated @@ -221,38 +202,38 @@ int wxStyledTextCtrl::GetCurrentLine() { // void wxStyledTextCtrl::StyleSetSpec(int styleNum, const wxString& spec) { - wxStringTokenizer tkz(spec, ","); + wxStringTokenizer tkz(spec, wxT(",")); while (tkz.HasMoreTokens()) { wxString token = tkz.GetNextToken(); wxString option = token.BeforeFirst(':'); wxString val = token.AfterFirst(':'); - if (option == "bold") + if (option == wxT("bold")) StyleSetBold(styleNum, true); - else if (option == "italic") + else if (option == wxT("italic")) StyleSetItalic(styleNum, true); - else if (option == "underline") + else if (option == wxT("underline")) StyleSetUnderline(styleNum, true); - else if (option == "eol") + else if (option == wxT("eol")) StyleSetEOLFilled(styleNum, true); - else if (option == "size") { + else if (option == wxT("size")) { long points; if (val.ToLong(&points)) StyleSetSize(styleNum, points); } - else if (option == "face") + else if (option == wxT("face")) StyleSetFaceName(styleNum, val); - else if (option == "fore") + else if (option == wxT("fore")) StyleSetForeground(styleNum, wxColourFromSpec(val)); - else if (option == "back") + else if (option == wxT("back")) StyleSetBackground(styleNum, wxColourFromSpec(val)); } } @@ -327,15 +308,58 @@ void wxStyledTextCtrl::ScrollToColumn(int column) { } +bool wxStyledTextCtrl::SaveFile(const wxString& filename) +{ + wxFile file(filename, wxFile::write); + + if (!file.IsOpened()) + return FALSE; + + bool success = file.Write(GetText()); + + if (success) + SetSavePoint(); + + return success; +} + +bool wxStyledTextCtrl::LoadFile(const wxString& filename) +{ + bool success = false; + wxFile file(filename, wxFile::read); + + if (file.IsOpened()) + { + wxString contents; + off_t len = file.Length(); + + if (len > 0) + { + wxChar *buf = contents.GetWriteBuf(len); + success = (file.Read(buf, len) == len); + contents.UngetWriteBuf(); + } + else + success = true; // empty file is ok + + if (success) + { + SetText(contents); + EmptyUndoBuffer(); + SetSavePoint(); + } + } + + return success; +} + //---------------------------------------------------------------------- // Event handlers void wxStyledTextCtrl::OnPaint(wxPaintEvent& evt) { wxPaintDC dc(this); - wxRegion region = GetUpdateRegion(); - - m_swx->DoPaint(&dc, region.GetBox()); + m_swx->DoPaint(&dc, GetUpdateRegion().GetBox()); } void wxStyledTextCtrl::OnScrollWin(wxScrollWinEvent& evt) { @@ -345,29 +369,51 @@ void wxStyledTextCtrl::OnScrollWin(wxScrollWinEvent& evt) { m_swx->DoVScroll(evt.GetEventType(), evt.GetPosition()); } +void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) { + wxScrollBar* sb = wxDynamicCast(evt.GetEventObject(), wxScrollBar); + if (sb) { + if (sb->IsVertical()) + m_swx->DoVScroll(evt.GetEventType(), evt.GetPosition()); + else + m_swx->DoHScroll(evt.GetEventType(), evt.GetPosition()); + } +} + void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) { wxSize sz = GetClientSize(); m_swx->DoSize(sz.x, sz.y); } void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) { + SetFocus(); wxPoint pt = evt.GetPosition(); - m_swx->DoButtonDown(Point(pt.x, pt.y), m_stopWatch.Time(), + m_swx->DoLeftButtonDown(Point(pt.x, pt.y), m_stopWatch.Time(), evt.ShiftDown(), evt.ControlDown(), evt.AltDown()); } void wxStyledTextCtrl::OnMouseMove(wxMouseEvent& evt) { wxPoint pt = evt.GetPosition(); - m_swx->DoButtonMove(Point(pt.x, pt.y)); + m_swx->DoLeftButtonMove(Point(pt.x, pt.y)); } void wxStyledTextCtrl::OnMouseLeftUp(wxMouseEvent& evt) { wxPoint pt = evt.GetPosition(); - m_swx->DoButtonUp(Point(pt.x, pt.y), m_stopWatch.Time(), + m_swx->DoLeftButtonUp(Point(pt.x, pt.y), m_stopWatch.Time(), evt.ControlDown()); } +void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) { + wxPoint pt = evt.GetPosition(); + m_swx->DoContextMenu(Point(pt.x, pt.y)); +} + + +void wxStyledTextCtrl::OnMouseMiddleUp(wxMouseEvent& evt) { + wxPoint pt = evt.GetPosition(); + m_swx->DoMiddleButtonUp(Point(pt.x, pt.y)); +} + void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) { wxPoint pt = evt.GetPosition(); ScreenToClient(&pt.x, &pt.y); @@ -379,19 +425,12 @@ void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) { m_swx->DoMouseWheel(evt.GetWheelRotation(), evt.GetWheelDelta(), evt.GetLinesPerAction(), - evt.ControlDown()); + evt.ControlDown(), + evt.IsPageScroll()); } void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { - long key = evt.KeyCode(); - -// printf("OnChar key:%%d consumed:%%d ctrl:%%d alt:%%d\n", -// key, m_lastKeyDownConsumed, evt.ControlDown(), evt.AltDown()); - - // AltGr keys??? - // \|@#¬[]{}?£$~ ã,õ,Ã,Õ, ñ, Ñ - // On (some?) non-US keyboards the AltGr key is required to enter some // common characters. It comes to us as both Alt and Ctrl down so we need // to let the char through in that case, otherwise if only ctrl or only @@ -400,7 +439,13 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { bool alt = evt.AltDown(); bool skip = ((ctrl || alt) && ! (ctrl && alt)); - if (key <= 0xff && !iscntrl(key) && !m_lastKeyDownConsumed && !skip) { + int key = evt.GetKeyCode(); + +// printf("OnChar key:%%d consumed:%%d ctrl:%%d alt:%%d skip:%%d\n", +// key, m_lastKeyDownConsumed, ctrl, alt, skip); + + if ( (key <= WXK_START || key > WXK_NUMPAD_DIVIDE) && + !m_lastKeyDownConsumed && !skip) { m_swx->DoAddChar(key); return; } @@ -409,15 +454,15 @@ 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); -// printf("key: %%d shift: %%d ctrl: %%d alt: %%d processed: %%d consumed: %%d\n", -// key, shift, ctrl, alt, processed, m_lastKeyDownConsumed); +// printf("KeyDn key:%%d shift:%%d ctrl:%%d alt:%%d processed:%%d consumed:%%d\n", +// key, shift, ctrl, alt, processed, m_lastKeyDownConsumed); if (!processed && !m_lastKeyDownConsumed) evt.Skip(); @@ -465,6 +510,20 @@ void wxStyledTextCtrl::NotifyChange() { GetEventHandler()->ProcessEvent(evt); } + +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)); +} + + void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { SCNotification& scn = *_scn; wxStyledTextEvent evt(0, GetId()); @@ -510,8 +569,7 @@ 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)); + SetEventText(evt, scn.text, scn.length); evt.SetLength(scn.length); evt.SetLinesAdded(scn.linesAdded); evt.SetLine(scn.line); @@ -536,10 +594,6 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { evt.SetLength(scn.length); break; - case SCN_POSCHANGED: - evt.SetEventType(wxEVT_STC_POSCHANGED); - break; - case SCN_PAINTED: evt.SetEventType(wxEVT_STC_PAINTED); break; @@ -547,12 +601,12 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { case SCN_USERLISTSELECTION: evt.SetEventType(wxEVT_STC_USERLISTSELECTION); evt.SetListType(scn.listType); - evt.SetText(scn.text); + SetEventText(evt, scn.text, strlen(scn.text)); break; case SCN_URIDROPPED: evt.SetEventType(wxEVT_STC_URIDROPPED); - evt.SetText(scn.text); + SetEventText(evt, scn.text, strlen(scn.text)); break; case SCN_DWELLSTART: @@ -567,6 +621,22 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { evt.SetY(scn.y); break; + case SCN_ZOOM: + evt.SetEventType(wxEVT_STC_ZOOM); + break; + + case SCN_HOTSPOTCLICK: + evt.SetEventType(wxEVT_STC_HOTSPOT_CLICK); + break; + + case SCN_HOTSPOTDOUBLECLICK: + evt.SetEventType(wxEVT_STC_HOTSPOT_DCLICK); + break; + + case SCN_CALLTIPCLICK: + evt.SetEventType(wxEVT_STC_CALLTIP_CLICK); + break; + default: return; } @@ -598,8 +668,8 @@ wxStyledTextEvent::wxStyledTextEvent(wxEventType commandType, int id) m_listType = 0; m_x = 0; m_y = 0; -#if wxUSE_DRAG_AND_DROP m_dragAllowMove = FALSE; +#if wxUSE_DRAG_AND_DROP m_dragResult = wxDragNone; #endif } @@ -608,35 +678,35 @@ bool wxStyledTextEvent::GetShift() const { return (m_modifiers & SCI_SHIFT) != 0 bool wxStyledTextEvent::GetControl() const { return (m_modifiers & SCI_CTRL) != 0; } bool wxStyledTextEvent::GetAlt() const { return (m_modifiers & SCI_ALT) != 0; } -void wxStyledTextEvent::CopyObject(wxObject& obj) const { - wxCommandEvent::CopyObject(obj); - - wxStyledTextEvent* o = (wxStyledTextEvent*)&obj; - o->m_position = m_position; - o->m_key = m_key; - o->m_modifiers = m_modifiers; - o->m_modificationType = m_modificationType; - o->m_text = m_text; - o->m_length = m_length; - o->m_linesAdded = m_linesAdded; - o->m_line = m_line; - o->m_foldLevelNow = m_foldLevelNow; - o->m_foldLevelPrev = m_foldLevelPrev; - - o->m_margin = m_margin; - - o->m_message = m_message; - o->m_wParam = m_wParam; - o->m_lParam = m_lParam; - - o->m_listType = m_listType; - o->m_x = m_x; - o->m_y = m_y; +wxStyledTextEvent::wxStyledTextEvent(const wxStyledTextEvent& event): + wxCommandEvent(event) +{ + m_position = event.m_position; + m_key = event.m_key; + m_modifiers = event.m_modifiers; + m_modificationType = event.m_modificationType; + m_text = event.m_text; + m_length = event.m_length; + m_linesAdded = event.m_linesAdded; + m_line = event.m_line; + m_foldLevelNow = event.m_foldLevelNow; + m_foldLevelPrev = event.m_foldLevelPrev; + + m_margin = event.m_margin; + + m_message = event.m_message; + m_wParam = event.m_wParam; + m_lParam = event.m_lParam; + + m_listType = event.m_listType; + m_x = event.m_x; + m_y = event.m_y; + + m_dragText = event.m_dragText; + m_dragAllowMove =event.m_dragAllowMove; #if wxUSE_DRAG_AND_DROP - o->m_dragText = m_dragText; - o->m_dragAllowMove =m_dragAllowMove; - o->m_dragResult = m_dragResult; + m_dragResult = event.m_dragResult; #endif } @@ -646,3 +716,8 @@ void wxStyledTextEvent::CopyObject(wxObject& obj) const { + + + + +