X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b5f62a0b2db198609b45dec622a018dae37008e..90c108964caba82a62602c7eef1268d4bb6e4841:/contrib/src/stc/stc.cpp diff --git a/contrib/src/stc/stc.cpp b/contrib/src/stc/stc.cpp index 17cf6ee406..c3a5c5a725 100644 --- a/contrib/src/stc/stc.cpp +++ b/contrib/src/stc/stc.cpp @@ -20,7 +20,11 @@ #include "wx/stc/stc.h" #include "ScintillaWX.h" +#include #include +#include +#include +#include //---------------------------------------------------------------------- @@ -82,6 +86,10 @@ DEFINE_EVENT_TYPE( wxEVT_STC_START_DRAG ) DEFINE_EVENT_TYPE( wxEVT_STC_DRAG_OVER ) DEFINE_EVENT_TYPE( wxEVT_STC_DO_DROP ) 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) @@ -128,11 +136,27 @@ wxStyledTextCtrl::wxStyledTextCtrl(wxWindow *parent, const wxPoint& pos, const wxSize& size, long style, - const wxString& name) : - wxControl(parent, id, pos, size, - style | wxVSCROLL | wxHSCROLL | wxWANTS_CHARS | wxCLIP_CHILDREN, - wxDefaultValidator, name) + const wxString& name) +{ + m_swx = NULL; + Create(parent, id, pos, size, style, name); +} + + +void 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); + #ifdef LINK_LEXERS Scintilla_LinkLexers(); #endif @@ -201,7 +225,7 @@ int wxStyledTextCtrl::GetLength() { // Returns the character byte at the position. int wxStyledTextCtrl::GetCharAt(int pos) { - return (unsigned char)SendMsg(2007, pos, 0); + return (unsigned char)SendMsg(2007, pos, 0); } // Returns the position of the caret. @@ -216,7 +240,7 @@ int wxStyledTextCtrl::GetAnchor() { // Returns the style byte at the position. int wxStyledTextCtrl::GetStyleAt(int pos) { - return (unsigned char)SendMsg(2010, pos, 0); + return (unsigned char)SendMsg(2010, pos, 0); } // Redoes the next action on the undo history. @@ -243,21 +267,21 @@ void wxStyledTextCtrl::SetSavePoint() { // Retrieve a buffer of cells. 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 buf; - TextRange tr; - tr.lpstrText = (char*)buf.GetWriteBuf(len*2+1); - tr.chrg.cpMin = startPos; - tr.chrg.cpMax = endPos; - len = SendMsg(2015, 0, (long)&tr); - buf.UngetWriteBuf(len); - return buf; + wxMemoryBuffer buf; + if (endPos < startPos) { + int temp = startPos; + startPos = endPos; + endPos = temp; + } + int len = endPos - startPos; + if (!len) return buf; + TextRange tr; + tr.lpstrText = (char*)buf.GetWriteBuf(len*2+1); + tr.chrg.cpMin = startPos; + tr.chrg.cpMax = endPos; + len = SendMsg(2015, 0, (long)&tr); + buf.UngetWriteBuf(len); + return buf; } // Are there any redoable actions in the undo history? @@ -293,7 +317,7 @@ void wxStyledTextCtrl::SetViewWhiteSpace(int viewWS) { // Find the position from a point within the window. int wxStyledTextCtrl::PositionFromPoint(wxPoint pt) { - return SendMsg(2022, pt.x, pt.y); + return SendMsg(2022, pt.x, pt.y); } // Find the position from a point within the window but return @@ -321,20 +345,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) { - int len = LineLength(GetCurrentLine()); - if (!len) { - if (linePos) *linePos = 0; - return wxEmptyString; - } + int len = LineLength(GetCurrentLine()); + if (!len) { + if (linePos) *linePos = 0; + return wxEmptyString; + } - wxMemoryBuffer mbuf(len+1); - char* buf = (char*)mbuf.GetWriteBuf(len+1); + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); - int pos = SendMsg(2027, len+1, (long)buf); - mbuf.UngetWriteBuf(len); - mbuf.AppendByte(0); - if (linePos) *linePos = pos; - return stc2wx(buf); + int pos = SendMsg(2027, len+1, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + if (linePos) *linePos = pos; + return stc2wx(buf); } // Retrieve the position of the last correctly styled character. @@ -399,20 +423,20 @@ void wxStyledTextCtrl::SetCodePage(int codePage) { wxASSERT_MSG(codePage != wxSTC_CP_UTF8, wxT("wxSTC_CP_UTF8 may not be used when wxUSE_UNICODE is off.")); #endif - SendMsg(2037, codePage); + SendMsg(2037, codePage); } // Set the symbol used for a particular marker number, // and optionally the fore and background colours. void wxStyledTextCtrl::MarkerDefine(int markerNumber, int markerSymbol, - const wxColour& foreground, - const wxColour& background) { + const wxColour& foreground, + const wxColour& background) { - SendMsg(2040, markerNumber, markerSymbol); - if (foreground.Ok()) - MarkerSetForeground(markerNumber, foreground); - if (background.Ok()) - MarkerSetBackground(markerNumber, background); + SendMsg(2040, markerNumber, markerSymbol); + if (foreground.Ok()) + MarkerSetForeground(markerNumber, foreground); + if (background.Ok()) + MarkerSetBackground(markerNumber, background); } // Set the foreground colour used for a particular marker number. @@ -455,6 +479,21 @@ int wxStyledTextCtrl::MarkerPrevious(int lineStart, int markerMask) { return SendMsg(2048, lineStart, markerMask); } +// Define a marker from a bitmap +void wxStyledTextCtrl::MarkerDefineBitmap(int markerNumber, const wxBitmap& bmp) { + // convert bmp to a xpm in a string + wxMemoryOutputStream strm; + wxImage img = bmp.ConvertToImage(); + img.SaveFile(strm, wxBITMAP_TYPE_XPM); + size_t len = strm.GetSize(); + char* buff = new char[len+1]; + strm.CopyTo(buff, len); + buff[len] = 0; + SendMsg(2049, markerNumber, (long)buff); + delete [] buff; + +} + // Set a margin to be either numeric or symbolic. void wxStyledTextCtrl::SetMarginType(int margin, int marginType) { SendMsg(2240, margin, marginType); @@ -555,6 +594,11 @@ void wxStyledTextCtrl::StyleSetCharacterSet(int style, int characterSet) { SendMsg(2066, style, characterSet); } +// Set a style to be a hotspot or not. +void wxStyledTextCtrl::StyleSetHotSpot(int style, bool hotspot) { + SendMsg(2409, style, hotspot); +} + // 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)); @@ -572,12 +616,12 @@ void wxStyledTextCtrl::SetCaretForeground(const wxColour& fore) { // When key+modifier combination km is pressed perform msg. void wxStyledTextCtrl::CmdKeyAssign(int key, int modifiers, int cmd) { - SendMsg(2070, MAKELONG(key, modifiers), cmd); + SendMsg(2070, MAKELONG(key, modifiers), cmd); } -// When key+modifier combination km do nothing. +// When key+modifier combination km is pressed do nothing. void wxStyledTextCtrl::CmdKeyClear(int key, int modifiers) { - SendMsg(2071, MAKELONG(key, modifiers)); + SendMsg(2071, MAKELONG(key, modifiers)); } // Drop all key mappings. @@ -587,7 +631,7 @@ void wxStyledTextCtrl::CmdKeyClearAll() { // Set the styles for a segment of the document. void wxStyledTextCtrl::SetStyleBytes(int length, char* styleBytes) { - SendMsg(2073, length, (long)styleBytes); + SendMsg(2073, length, (long)styleBytes); } // Set a style to be visible or not. @@ -606,6 +650,7 @@ void wxStyledTextCtrl::SetCaretPeriod(int periodMilliseconds) { } // Set the set of characters making up words for when moving or selecting by word. +// First sets deaults like SetCharsDefault. void wxStyledTextCtrl::SetWordChars(const wxString& characters) { SendMsg(2077, 0, (long)(const char*)wx2stc(characters)); } @@ -818,6 +863,37 @@ bool wxStyledTextCtrl::AutoCompGetDropRestOfWord() { return SendMsg(2271, 0, 0) != 0; } +// Register an image for use in autocompletion lists. +void wxStyledTextCtrl::RegisterImage(int type, const wxBitmap& bmp) { + // convert bmp to a xpm in a string + wxMemoryOutputStream strm; + wxImage img = bmp.ConvertToImage(); + img.SaveFile(strm, wxBITMAP_TYPE_XPM); + size_t len = strm.GetSize(); + char* buff = new char[len+1]; + strm.CopyTo(buff, len); + buff[len] = 0; + SendMsg(2405, type, (long)buff); + delete [] buff; + +} + +// Clear all the registered images. +void wxStyledTextCtrl::ClearRegisteredImages() { + SendMsg(2408, 0, 0); +} + +// Retrieve the auto-completion list type-separator character. +int wxStyledTextCtrl::AutoCompGetTypeSeparator() { + return SendMsg(2285, 0, 0); +} + +// Change the type-separator character in the string setting up an auto-completion list. +// Default is '?' but can be changed if items contain '?'. +void wxStyledTextCtrl::AutoCompSetTypeSeparator(int separatorCharacter) { + SendMsg(2286, separatorCharacter, 0); +} + // Set the number of spaces used for one level of indentation. void wxStyledTextCtrl::SetIndent(int indentSize) { SendMsg(2122, indentSize, 0); @@ -958,64 +1034,64 @@ int wxStyledTextCtrl::GetPrintColourMode() { // Find some text in the document. int wxStyledTextCtrl::FindText(int minPos, int maxPos, - const wxString& text, - int flags) { - TextToFind ft; - ft.chrg.cpMin = minPos; - ft.chrg.cpMax = maxPos; - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); - ft.lpstrText = (char*)(const char*)buf; + const wxString& text, + int flags) { + TextToFind ft; + ft.chrg.cpMin = minPos; + ft.chrg.cpMax = maxPos; + wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); + ft.lpstrText = (char*)(const char*)buf; - return SendMsg(2150, flags, (long)&ft); + return SendMsg(2150, flags, (long)&ft); } // On Windows, will draw the document into a display context such as a printer. int wxStyledTextCtrl::FormatRange(bool doDraw, - int startPos, - int endPos, - wxDC* draw, - wxDC* target, // Why does it use two? Can they be the same? - wxRect renderRect, - wxRect pageRect) { - RangeToFormat fr; - - if (endPos < startPos) { - int temp = startPos; - startPos = endPos; - endPos = temp; - } - fr.hdc = draw; - fr.hdcTarget = target; - fr.rc.top = renderRect.GetTop(); - fr.rc.left = renderRect.GetLeft(); - fr.rc.right = renderRect.GetRight(); - fr.rc.bottom = renderRect.GetBottom(); - fr.rcPage.top = pageRect.GetTop(); - fr.rcPage.left = pageRect.GetLeft(); - fr.rcPage.right = pageRect.GetRight(); - fr.rcPage.bottom = pageRect.GetBottom(); - fr.chrg.cpMin = startPos; - fr.chrg.cpMax = endPos; - - return SendMsg(2151, doDraw, (long)&fr); -} - -// Retrieve the line at the top of the display. + int startPos, + int endPos, + wxDC* draw, + wxDC* target, + wxRect renderRect, + wxRect pageRect) { + RangeToFormat fr; + + if (endPos < startPos) { + int temp = startPos; + startPos = endPos; + endPos = temp; + } + fr.hdc = draw; + fr.hdcTarget = target; + fr.rc.top = renderRect.GetTop(); + fr.rc.left = renderRect.GetLeft(); + fr.rc.right = renderRect.GetRight(); + fr.rc.bottom = renderRect.GetBottom(); + fr.rcPage.top = pageRect.GetTop(); + fr.rcPage.left = pageRect.GetLeft(); + fr.rcPage.right = pageRect.GetRight(); + fr.rcPage.bottom = pageRect.GetBottom(); + fr.chrg.cpMin = startPos; + fr.chrg.cpMax = endPos; + + return SendMsg(2151, doDraw, (long)&fr); +} + +// Retrieve the display line at the top of the display. int wxStyledTextCtrl::GetFirstVisibleLine() { return SendMsg(2152, 0, 0); } // Retrieve the contents of a line. wxString wxStyledTextCtrl::GetLine(int line) { - int len = LineLength(line); - if (!len) return wxEmptyString; + int len = LineLength(line); + if (!len) return wxEmptyString; - wxMemoryBuffer mbuf(len+1); - char* buf = (char*)mbuf.GetWriteBuf(len+1); - SendMsg(2153, line, (long)buf); - mbuf.UngetWriteBuf(len); - mbuf.AppendByte(0); - return stc2wx(buf); + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(2153, line, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf); } // Returns the number of lines in the document. There is always at least one. @@ -1055,40 +1131,40 @@ void wxStyledTextCtrl::SetSelection(int start, int end) { // Retrieve the selected text. wxString wxStyledTextCtrl::GetSelectedText() { - int start; - int end; + int start; + int end; - GetSelection(&start, &end); - int len = end - start; - if (!len) return wxEmptyString; + GetSelection(&start, &end); + int len = end - start; + if (!len) return wxEmptyString; - wxMemoryBuffer mbuf(len+1); - char* buf = (char*)mbuf.GetWriteBuf(len+1); - SendMsg(2161, 0, (long)buf); - mbuf.UngetWriteBuf(len); - mbuf.AppendByte(0); - return stc2wx(buf); + wxMemoryBuffer mbuf(len+2); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(2161, 0, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf); } // Retrieve a range of text. wxString wxStyledTextCtrl::GetTextRange(int startPos, int endPos) { - if (endPos < startPos) { - int temp = startPos; - startPos = endPos; - endPos = temp; - } - int len = endPos - startPos; - if (!len) return wxEmptyString; - wxMemoryBuffer mbuf(len+1); - char* buf = (char*)mbuf.GetWriteBuf(len); - TextRange tr; - tr.lpstrText = buf; - tr.chrg.cpMin = startPos; - tr.chrg.cpMax = endPos; - SendMsg(2162, 0, (long)&tr); - mbuf.UngetWriteBuf(len); - mbuf.AppendByte(0); - return stc2wx(buf); + if (endPos < startPos) { + int temp = startPos; + startPos = endPos; + endPos = temp; + } + int len = endPos - startPos; + if (!len) return wxEmptyString; + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len); + TextRange tr; + tr.lpstrText = buf; + tr.chrg.cpMin = startPos; + tr.chrg.cpMax = endPos; + SendMsg(2162, 0, (long)&tr); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf); } // Draw the selection in normal style or with selection highlighted. @@ -1173,13 +1249,13 @@ void wxStyledTextCtrl::SetText(const wxString& text) { // Retrieve all the text in the document. wxString wxStyledTextCtrl::GetText() { - 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 stc2wx(buf); + 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 stc2wx(buf); } // Retrieve the number of characters in the document. @@ -1230,33 +1306,33 @@ int wxStyledTextCtrl::GetTargetEnd() { } // Replace the target text with the argument text. -// Text is counted so it can contain nulls. +// Text is counted so it can contain NULs. // Returns the length of the replacement text. - int wxStyledTextCtrl::ReplaceTarget(const wxString& text) { - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); - return SendMsg(2194, strlen(buf), (long)(const char*)buf); + int wxStyledTextCtrl::ReplaceTarget(const wxString& text) { + wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); + return SendMsg(2194, strlen(buf), (long)(const char*)buf); } // Replace the target text with the argument text after \d processing. -// Text is counted so it can contain nulls. +// Text is counted so it can contain NULs. // Looks for \d where d is between 1 and 9 and replaces these with the strings // matched in the last search operation which were surrounded by \( and \). // Returns the length of the replacement text including any change // caused by processing the \d patterns. - int wxStyledTextCtrl::ReplaceTargetRE(const wxString& text) { - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); - return SendMsg(2195, strlen(buf), (long)(const char*)buf); + int wxStyledTextCtrl::ReplaceTargetRE(const wxString& text) { + wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); + return SendMsg(2195, strlen(buf), (long)(const char*)buf); } // Search for a counted string in the target and set the target to the found -// range. Text is counted so it can contain nulls. +// range. Text is counted so it can contain NULs. // Returns length of range or -1 for failure in which case target is not moved. - int wxStyledTextCtrl::SearchInTarget(const wxString& text) { - wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); - return SendMsg(2197, strlen(buf), (long)(const char*)buf); + int wxStyledTextCtrl::SearchInTarget(const wxString& text) { + wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); + return SendMsg(2197, strlen(buf), (long)(const char*)buf); } // Set the search flags used by SearchInTarget. @@ -1299,6 +1375,16 @@ void wxStyledTextCtrl::CallTipSetBackground(const wxColour& back) { SendMsg(2205, wxColourAsLong(back), 0); } +// Set the foreground colour for the call tip. +void wxStyledTextCtrl::CallTipSetForeground(const wxColour& fore) { + SendMsg(2206, wxColourAsLong(fore), 0); +} + +// Set the foreground colour for the highlighted part of the call tip. +void wxStyledTextCtrl::CallTipSetForegroundHighlight(const wxColour& fore) { + SendMsg(2207, wxColourAsLong(fore), 0); +} + // Find the display line of a document line taking hidden lines into account. int wxStyledTextCtrl::VisibleFromDocLine(int line) { return SendMsg(2220, line, 0); @@ -1366,7 +1452,7 @@ void wxStyledTextCtrl::EnsureVisible(int line) { SendMsg(2232, line, 0); } -// Set some debugging options for folding. +// Set some style options for folding. void wxStyledTextCtrl::SetFoldFlags(int flags) { SendMsg(2233, flags, 0); } @@ -1448,7 +1534,7 @@ int wxStyledTextCtrl::GetScrollWidth() { } // Measure the pixel width of some text in a particular style. -// Nul terminated text argument. +// NUL terminated text argument. // Does not handle tab or control characters. int wxStyledTextCtrl::TextWidth(int style, const wxString& text) { return SendMsg(2276, style, (long)(const char*)wx2stc(text)); @@ -1472,6 +1558,289 @@ int wxStyledTextCtrl::TextHeight(int line) { return SendMsg(2279, line, 0); } +// Show or hide the vertical scroll bar. +void wxStyledTextCtrl::SetUseVerticalScrollBar(bool show) { + SendMsg(2280, show, 0); +} + +// Is the vertical scroll bar visible? +bool wxStyledTextCtrl::GetUseVerticalScrollBar() { + return SendMsg(2281, 0, 0) != 0; +} + +// Append a string to the end of the document without changing the selection. +void wxStyledTextCtrl::AppendText(int length, const wxString& text) { + SendMsg(2282, length, (long)(const char*)wx2stc(text)); +} + +// Is drawing done in two phases with backgrounds drawn before foregrounds? +bool wxStyledTextCtrl::GetTwoPhaseDraw() { + return SendMsg(2283, 0, 0) != 0; +} + +// In twoPhaseDraw mode, drawing is performed in two phases, first the background +// and then the foreground. This avoids chopping off characters that overlap the next run. +void wxStyledTextCtrl::SetTwoPhaseDraw(bool twoPhase) { + SendMsg(2284, twoPhase, 0); +} + +// Make the target range start and end be the same as the selection range start and end. +void wxStyledTextCtrl::TargetFromSelection() { + SendMsg(2287, 0, 0); +} + +// Join the lines in the target. +void wxStyledTextCtrl::LinesJoin() { + SendMsg(2288, 0, 0); +} + +// Split the lines in the target into lines that are less wide than pixelWidth +// where possible. +void wxStyledTextCtrl::LinesSplit(int pixelWidth) { + SendMsg(2289, pixelWidth, 0); +} + +// Set the colours used as a chequerboard pattern in the fold margin +void wxStyledTextCtrl::SetFoldMarginColour(bool useSetting, const wxColour& back) { + SendMsg(2290, useSetting, wxColourAsLong(back)); +} +void wxStyledTextCtrl::SetFoldMarginHiColour(bool useSetting, const wxColour& fore) { + SendMsg(2291, useSetting, wxColourAsLong(fore)); +} + +// Move caret down one line. +void wxStyledTextCtrl::LineDown() { + SendMsg(2300, 0, 0); +} + +// Move caret down one line extending selection to new caret position. +void wxStyledTextCtrl::LineDownExtend() { + SendMsg(2301, 0, 0); +} + +// Move caret up one line. +void wxStyledTextCtrl::LineUp() { + SendMsg(2302, 0, 0); +} + +// Move caret up one line extending selection to new caret position. +void wxStyledTextCtrl::LineUpExtend() { + SendMsg(2303, 0, 0); +} + +// Move caret left one character. +void wxStyledTextCtrl::CharLeft() { + SendMsg(2304, 0, 0); +} + +// Move caret left one character extending selection to new caret position. +void wxStyledTextCtrl::CharLeftExtend() { + SendMsg(2305, 0, 0); +} + +// Move caret right one character. +void wxStyledTextCtrl::CharRight() { + SendMsg(2306, 0, 0); +} + +// Move caret right one character extending selection to new caret position. +void wxStyledTextCtrl::CharRightExtend() { + SendMsg(2307, 0, 0); +} + +// Move caret left one word. +void wxStyledTextCtrl::WordLeft() { + SendMsg(2308, 0, 0); +} + +// Move caret left one word extending selection to new caret position. +void wxStyledTextCtrl::WordLeftExtend() { + SendMsg(2309, 0, 0); +} + +// Move caret right one word. +void wxStyledTextCtrl::WordRight() { + SendMsg(2310, 0, 0); +} + +// Move caret right one word extending selection to new caret position. +void wxStyledTextCtrl::WordRightExtend() { + SendMsg(2311, 0, 0); +} + +// Move caret to first position on line. +void wxStyledTextCtrl::Home() { + SendMsg(2312, 0, 0); +} + +// Move caret to first position on line extending selection to new caret position. +void wxStyledTextCtrl::HomeExtend() { + SendMsg(2313, 0, 0); +} + +// Move caret to last position on line. +void wxStyledTextCtrl::LineEnd() { + SendMsg(2314, 0, 0); +} + +// Move caret to last position on line extending selection to new caret position. +void wxStyledTextCtrl::LineEndExtend() { + SendMsg(2315, 0, 0); +} + +// Move caret to first position in document. +void wxStyledTextCtrl::DocumentStart() { + SendMsg(2316, 0, 0); +} + +// Move caret to first position in document extending selection to new caret position. +void wxStyledTextCtrl::DocumentStartExtend() { + SendMsg(2317, 0, 0); +} + +// Move caret to last position in document. +void wxStyledTextCtrl::DocumentEnd() { + SendMsg(2318, 0, 0); +} + +// Move caret to last position in document extending selection to new caret position. +void wxStyledTextCtrl::DocumentEndExtend() { + SendMsg(2319, 0, 0); +} + +// Move caret one page up. +void wxStyledTextCtrl::PageUp() { + SendMsg(2320, 0, 0); +} + +// Move caret one page up extending selection to new caret position. +void wxStyledTextCtrl::PageUpExtend() { + SendMsg(2321, 0, 0); +} + +// Move caret one page down. +void wxStyledTextCtrl::PageDown() { + SendMsg(2322, 0, 0); +} + +// Move caret one page down extending selection to new caret position. +void wxStyledTextCtrl::PageDownExtend() { + SendMsg(2323, 0, 0); +} + +// Switch from insert to overtype mode or the reverse. +void wxStyledTextCtrl::EditToggleOvertype() { + SendMsg(2324, 0, 0); +} + +// Cancel any modes such as call tip or auto-completion list display. +void wxStyledTextCtrl::Cancel() { + SendMsg(2325, 0, 0); +} + +// Delete the selection or if no selection, the character before the caret. +void wxStyledTextCtrl::DeleteBack() { + SendMsg(2326, 0, 0); +} + +// 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. +void wxStyledTextCtrl::Tab() { + SendMsg(2327, 0, 0); +} + +// Dedent the selected lines. +void wxStyledTextCtrl::BackTab() { + SendMsg(2328, 0, 0); +} + +// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. +void wxStyledTextCtrl::NewLine() { + SendMsg(2329, 0, 0); +} + +// Insert a Form Feed character. +void wxStyledTextCtrl::FormFeed() { + SendMsg(2330, 0, 0); +} + +// Move caret to before first visible character on line. +// If already there move to first character on line. +void wxStyledTextCtrl::VCHome() { + SendMsg(2331, 0, 0); +} + +// Like VCHome but extending selection to new caret position. +void wxStyledTextCtrl::VCHomeExtend() { + SendMsg(2332, 0, 0); +} + +// Magnify the displayed text by increasing the sizes by 1 point. +void wxStyledTextCtrl::ZoomIn() { + SendMsg(2333, 0, 0); +} + +// Make the displayed text smaller by decreasing the sizes by 1 point. +void wxStyledTextCtrl::ZoomOut() { + SendMsg(2334, 0, 0); +} + +// Delete the word to the left of the caret. +void wxStyledTextCtrl::DelWordLeft() { + SendMsg(2335, 0, 0); +} + +// Delete the word to the right of the caret. +void wxStyledTextCtrl::DelWordRight() { + SendMsg(2336, 0, 0); +} + +// Cut the line containing the caret. +void wxStyledTextCtrl::LineCut() { + SendMsg(2337, 0, 0); +} + +// Delete the line containing the caret. +void wxStyledTextCtrl::LineDelete() { + SendMsg(2338, 0, 0); +} + +// Switch the current line with the previous. +void wxStyledTextCtrl::LineTranspose() { + SendMsg(2339, 0, 0); +} + +// Duplicate the current line. +void wxStyledTextCtrl::LineDuplicate() { + SendMsg(2404, 0, 0); +} + +// Transform the selection to lower case. +void wxStyledTextCtrl::LowerCase() { + SendMsg(2340, 0, 0); +} + +// Transform the selection to upper case. +void wxStyledTextCtrl::UpperCase() { + SendMsg(2341, 0, 0); +} + +// Scroll the document down, keeping the caret visible. +void wxStyledTextCtrl::LineScrollDown() { + SendMsg(2342, 0, 0); +} + +// Scroll the document up, keeping the caret visible. +void wxStyledTextCtrl::LineScrollUp() { + SendMsg(2343, 0, 0); +} + +// Delete the selection or if no selection, the character before the caret. +// Will not delete the character before at the start of a line. +void wxStyledTextCtrl::DeleteBackNotLine() { + SendMsg(2344, 0, 0); +} + // Move caret to first position on display line. void wxStyledTextCtrl::HomeDisplay() { SendMsg(2345, 0, 0); @@ -1494,6 +1863,35 @@ void wxStyledTextCtrl::LineEndDisplayExtend() { SendMsg(2348, 0, 0); } +// These are like their namesakes Home(Extend)?, LineEnd(Extend)?, VCHome(Extend)? +// except they behave differently when word-wrap is enabled: +// They go first to the start / end of the display line, like (Home|LineEnd)Display +// The difference is that, the cursor is already at the point, it goes on to the start +// or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?. +void wxStyledTextCtrl::HomeWrap() { + SendMsg(2349, 0, 0); +} +void wxStyledTextCtrl::HomeWrapExtend() { + SendMsg(2450, 0, 0); +} +void wxStyledTextCtrl::LineEndWrap() { + SendMsg(2451, 0, 0); +} +void wxStyledTextCtrl::LineEndWrapExtend() { + SendMsg(2452, 0, 0); +} +void wxStyledTextCtrl::VCHomeWrap() { + SendMsg(2453, 0, 0); +} +void wxStyledTextCtrl::VCHomeWrapExtend() { + SendMsg(2454, 0, 0); +} + +// Copy the line containing the caret. +void wxStyledTextCtrl::LineCopy() { + SendMsg(2455, 0, 0); +} + // Move the caret inside current view if it's not there already. void wxStyledTextCtrl::MoveCaretInsideView() { SendMsg(2401, 0, 0); @@ -1531,12 +1929,12 @@ void wxStyledTextCtrl::SetViewEOL(bool visible) { // Retrieve a pointer to the document object. void* wxStyledTextCtrl::GetDocPointer() { - return (void*)SendMsg(2357); + return (void*)SendMsg(2357); } // Change the document object used. void wxStyledTextCtrl::SetDocPointer(void* docPointer) { - SendMsg(2358, 0, (long)docPointer); + SendMsg(2358, 0, (long)docPointer); } // Set which document modification events are sent to the container. @@ -1624,17 +2022,17 @@ int wxStyledTextCtrl::GetZoom() { // Create a new document object. // Starts with reference count of 1 and not selected into editor. void* wxStyledTextCtrl::CreateDocument() { - return (void*)SendMsg(2375); + return (void*)SendMsg(2375); } // Extend life of document. void wxStyledTextCtrl::AddRefDocument(void* docPointer) { - SendMsg(2376, 0, (long)docPointer); + SendMsg(2376, 0, (long)docPointer); } // Release a reference to the document, deleting document if it fades to black. void wxStyledTextCtrl::ReleaseDocument(void* docPointer) { - SendMsg(2377, 0, (long)docPointer); + SendMsg(2377, 0, (long)docPointer); } // Get which document modification events are sent to the container. @@ -1673,12 +2071,12 @@ bool wxStyledTextCtrl::GetMouseDownCaptures() { } // Sets the cursor to one of the SC_CURSOR* values. -void wxStyledTextCtrl::SetCursor(int cursorType) { +void wxStyledTextCtrl::SetSTCCursor(int cursorType) { SendMsg(2386, cursorType, 0); } // Get cursor type. -int wxStyledTextCtrl::GetCursor() { +int wxStyledTextCtrl::GetSTCCursor() { return SendMsg(2387, 0, 0); } @@ -1739,6 +2137,11 @@ int wxStyledTextCtrl::GetXOffset() { return SendMsg(2398, 0, 0); } +// Set the last x chosen value to be the caret x position. +void wxStyledTextCtrl::ChooseCaretX() { + SendMsg(2399, 0, 0); +} + // Set the way the caret is kept visible when going sideway. // The exclusion zone is given in pixels. void wxStyledTextCtrl::SetXCaretPolicy(int caretPolicy, int caretSlop) { @@ -1751,6 +2154,196 @@ void wxStyledTextCtrl::SetYCaretPolicy(int caretPolicy, int caretSlop) { SendMsg(2403, caretPolicy, caretSlop); } +// Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE). +void wxStyledTextCtrl::SetPrintWrapMode(int mode) { + SendMsg(2406, mode, 0); +} + +// Is printing line wrapped? +int wxStyledTextCtrl::GetPrintWrapMode() { + return SendMsg(2407, 0, 0); +} + +// Set a fore colour for active hotspots. +void wxStyledTextCtrl::SetHotspotActiveForeground(bool useSetting, const wxColour& fore) { + SendMsg(2410, useSetting, wxColourAsLong(fore)); +} + +// Set a back colour for active hotspots. +void wxStyledTextCtrl::SetHotspotActiveBackground(bool useSetting, const wxColour& back) { + SendMsg(2411, useSetting, wxColourAsLong(back)); +} + +// Enable / Disable underlining active hotspots. +void wxStyledTextCtrl::SetHotspotActiveUnderline(bool underline) { + SendMsg(2412, underline, 0); +} + +// Limit hotspots to single line so hotspots on two lines don't merge. +void wxStyledTextCtrl::SetHotspotSingleLine(bool singleLine) { + SendMsg(2421, singleLine, 0); +} + +// Move caret between paragraphs (delimited by empty lines). +void wxStyledTextCtrl::ParaDown() { + SendMsg(2413, 0, 0); +} +void wxStyledTextCtrl::ParaDownExtend() { + SendMsg(2414, 0, 0); +} +void wxStyledTextCtrl::ParaUp() { + SendMsg(2415, 0, 0); +} +void wxStyledTextCtrl::ParaUpExtend() { + SendMsg(2416, 0, 0); +} + +// Given a valid document position, return the previous position taking code +// page into account. Returns 0 if passed 0. +int wxStyledTextCtrl::PositionBefore(int pos) { + return SendMsg(2417, pos, 0); +} + +// Given a valid document position, return the next position taking code +// page into account. Maximum value returned is the last position in the document. +int wxStyledTextCtrl::PositionAfter(int pos) { + return SendMsg(2418, pos, 0); +} + +// Copy a range of text to the clipboard. Positions are clipped into the document. +void wxStyledTextCtrl::CopyRange(int start, int end) { + SendMsg(2419, start, end); +} + +// Copy argument text to the clipboard. +void wxStyledTextCtrl::CopyText(int length, const wxString& text) { + SendMsg(2420, length, (long)(const char*)wx2stc(text)); +} + +// Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE) or +// by lines (SC_SEL_LINES). +void wxStyledTextCtrl::SetSelectionMode(int mode) { + SendMsg(2422, mode, 0); +} + +// Get the mode of the current selection. +int wxStyledTextCtrl::GetSelectionMode() { + return SendMsg(2423, 0, 0); +} + +// Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line). +int wxStyledTextCtrl::GetLineSelStartPosition(int line) { + return SendMsg(2424, line, 0); +} + +// Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line). +int wxStyledTextCtrl::GetLineSelEndPosition(int line) { + return SendMsg(2425, line, 0); +} + +// Move caret down one line, extending rectangular selection to new caret position. +void wxStyledTextCtrl::LineDownRectExtend() { + SendMsg(2426, 0, 0); +} + +// Move caret up one line, extending rectangular selection to new caret position. +void wxStyledTextCtrl::LineUpRectExtend() { + SendMsg(2427, 0, 0); +} + +// Move caret left one character, extending rectangular selection to new caret position. +void wxStyledTextCtrl::CharLeftRectExtend() { + SendMsg(2428, 0, 0); +} + +// Move caret right one character, extending rectangular selection to new caret position. +void wxStyledTextCtrl::CharRightRectExtend() { + SendMsg(2429, 0, 0); +} + +// Move caret to first position on line, extending rectangular selection to new caret position. +void wxStyledTextCtrl::HomeRectExtend() { + SendMsg(2430, 0, 0); +} + +// Move caret to before first visible character on line. +// If already there move to first character on line. +// In either case, extend rectangular selection to new caret position. +void wxStyledTextCtrl::VCHomeRectExtend() { + SendMsg(2431, 0, 0); +} + +// Move caret to last position on line, extending rectangular selection to new caret position. +void wxStyledTextCtrl::LineEndRectExtend() { + SendMsg(2432, 0, 0); +} + +// Move caret one page up, extending rectangular selection to new caret position. +void wxStyledTextCtrl::PageUpRectExtend() { + SendMsg(2433, 0, 0); +} + +// Move caret one page down, extending rectangular selection to new caret position. +void wxStyledTextCtrl::PageDownRectExtend() { + SendMsg(2434, 0, 0); +} + +// Move caret to top of page, or one page up if already at top of page. +void wxStyledTextCtrl::StutteredPageUp() { + SendMsg(2435, 0, 0); +} + +// Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. +void wxStyledTextCtrl::StutteredPageUpExtend() { + SendMsg(2436, 0, 0); +} + +// Move caret to bottom of page, or one page down if already at bottom of page. +void wxStyledTextCtrl::StutteredPageDown() { + SendMsg(2437, 0, 0); +} + +// Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. +void wxStyledTextCtrl::StutteredPageDownExtend() { + SendMsg(2438, 0, 0); +} + +// Move caret left one word, position cursor at end of word. +void wxStyledTextCtrl::WordLeftEnd() { + SendMsg(2439, 0, 0); +} + +// Move caret left one word, position cursor at end of word, extending selection to new caret position. +void wxStyledTextCtrl::WordLeftEndExtend() { + SendMsg(2440, 0, 0); +} + +// Move caret right one word, position cursor at end of word. +void wxStyledTextCtrl::WordRightEnd() { + SendMsg(2441, 0, 0); +} + +// Move caret right one word, position cursor at end of word, extending selection to new caret position. +void wxStyledTextCtrl::WordRightEndExtend() { + SendMsg(2442, 0, 0); +} + +// Set the set of characters making up whitespace for when moving or selecting by word. +// Should be called after SetWordChars. +void wxStyledTextCtrl::SetWhitespaceChars(const wxString& characters) { + SendMsg(2443, 0, (long)(const char*)wx2stc(characters)); +} + +// Reset the set of characters for whitespace and word characters to the defaults. +void wxStyledTextCtrl::SetCharsDefault() { + SendMsg(2444, 0, 0); +} + +// Get currently selected item position in the auto-completion list +int wxStyledTextCtrl::AutoCompGetCurrent() { + return SendMsg(2445, 0, 0); +} + // Start notifying the container of all key presses and commands. void wxStyledTextCtrl::StartRecord() { SendMsg(3001, 0, 0); @@ -1856,6 +2449,11 @@ void wxStyledTextCtrl::StyleSetSpec(int styleNum, const wxString& spec) { // Set style size, face, bold, italic, and underline attributes from // a wxFont's attributes. void wxStyledTextCtrl::StyleSetFont(int styleNum, wxFont& font) { +#ifdef __WXGTK__ + // Ensure that the native font is initialized + 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; @@ -1922,15 +2520,86 @@ 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(), *wxConvCurrent); + + 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) + { +#if wxUSE_UNICODE + wxMemoryBuffer buffer(len+1); + success = (file.Read(buffer.GetData(), len) == len); + if (success) { + ((char*)buffer.GetData())[len] = 0; + contents = wxString(buffer, *wxConvCurrent, len); + } +#else + wxString buffer; + success = (file.Read(wxStringBuffer(buffer, len), len) == len); + contents = buffer; +#endif + } + else + success = true; // empty file is ok + + if (success) + { + SetText(contents); + EmptyUndoBuffer(); + SetSavePoint(); + } + } + + return success; +} + + +#if wxUSE_DRAG_AND_DROP +wxDragResult wxStyledTextCtrl::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { + return m_swx->DoDragOver(x, y, def); +} + + +bool wxStyledTextCtrl::DoDropText(long x, long y, const wxString& data) { + return m_swx->DoDropText(x, y, data); +} +#endif + + +void wxStyledTextCtrl::SetUseAntiAliasing(bool useAA) { + m_swx->SetUseAntiAliasing(useAA); +} + +bool wxStyledTextCtrl::GetUseAntiAliasing() { + return m_swx->GetUseAntiAliasing(); +} //---------------------------------------------------------------------- // Event handlers -void wxStyledTextCtrl::OnPaint(wxPaintEvent& evt) { +void wxStyledTextCtrl::OnPaint(wxPaintEvent& WXUNUSED(evt)) { wxPaintDC dc(this); - wxRegion region = GetUpdateRegion(); - - m_swx->DoPaint(&dc, region.GetBox()); + m_swx->DoPaint(&dc, GetUpdateRegion().GetBox()); } void wxStyledTextCtrl::OnScrollWin(wxScrollWinEvent& evt) { @@ -1950,9 +2619,11 @@ void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) { } } -void wxStyledTextCtrl::OnSize(wxSizeEvent& evt) { - wxSize sz = GetClientSize(); - m_swx->DoSize(sz.x, sz.y); +void wxStyledTextCtrl::OnSize(wxSizeEvent& WXUNUSED(evt)) { + if (m_swx) { + wxSize sz = GetClientSize(); + m_swx->DoSize(sz.x, sz.y); + } } void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) { @@ -1988,6 +2659,14 @@ void wxStyledTextCtrl::OnMouseMiddleUp(wxMouseEvent& evt) { void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) { wxPoint pt = evt.GetPosition(); ScreenToClient(&pt.x, &pt.y); + /* + Show context menu at event point if it's within the window, + or at caret location if not + */ + wxHitTest ht = this->HitTest(pt); + if (ht != wxHT_WINDOW_INSIDE) { + pt = this->PointFromPosition(this->GetCurrentPos()); + } m_swx->DoContextMenu(Point(pt.x, pt.y)); } @@ -2015,7 +2694,7 @@ void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) { // 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) && + if ( (key <= WXK_START || key > WXK_COMMAND) && !m_lastKeyDownConsumed && !skip) { m_swx->DoAddChar(key); return; @@ -2028,9 +2707,10 @@ void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) { int key = evt.GetKeyCode(); bool shift = evt.ShiftDown(), ctrl = evt.ControlDown(), - alt = evt.AltDown(); + alt = evt.AltDown(), + meta = evt.MetaDown(); - int processed = m_swx->DoKeyDown(key, shift, ctrl, alt, &m_lastKeyDownConsumed); + 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); @@ -2042,20 +2722,22 @@ void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) { void wxStyledTextCtrl::OnLoseFocus(wxFocusEvent& evt) { m_swx->DoLoseFocus(); + evt.Skip(); } void wxStyledTextCtrl::OnGainFocus(wxFocusEvent& evt) { m_swx->DoGainFocus(); + evt.Skip(); } -void wxStyledTextCtrl::OnSysColourChanged(wxSysColourChangedEvent& evt) { +void wxStyledTextCtrl::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(evt)) { m_swx->DoSysColourChange(); } -void wxStyledTextCtrl::OnEraseBackground(wxEraseEvent& evt) { +void wxStyledTextCtrl::OnEraseBackground(wxEraseEvent& WXUNUSED(evt)) { // do nothing to help avoid flashing } @@ -2066,11 +2748,16 @@ void wxStyledTextCtrl::OnMenu(wxCommandEvent& evt) { } -void wxStyledTextCtrl::OnListBox(wxCommandEvent& evt) { +void wxStyledTextCtrl::OnListBox(wxCommandEvent& WXUNUSED(evt)) { m_swx->DoOnListBox(); } +void wxStyledTextCtrl::OnIdle(wxIdleEvent& evt) { + m_swx->DoOnIdle(evt); +} + + //---------------------------------------------------------------------- // Turn notifications from Scintilla into events @@ -2196,6 +2883,18 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) { 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; }