X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88a8b04e9c387b5e5295d42f2ed23afcf37e3c2e..8064223b7b1b3657363b7a635c381b9269d95e55:/src/stc/stc.cpp diff --git a/src/stc/stc.cpp b/src/stc/stc.cpp index 829cb32e61..6230d02ca5 100644 --- a/src/stc/stc.cpp +++ b/src/stc/stc.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////// // Name: stc.cpp -// Purpose: A wxWindows implementation of Scintilla. This class is the +// Purpose: A wxWidgets implementation of Scintilla. This class is the // one meant to be used directly by wx applications. It does not // derive directly from the Scintilla classes, but instead // delegates most things to the real Scintilla class. @@ -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,19 +59,28 @@ 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; } 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); + // spec should be a colour name or "#RRGGBB" + if (spec.GetChar(0) == wxT('#')) { + + 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((unsigned char)red, + (unsigned char)green, + (unsigned char)blue); + } + else + return wxColour(spec); } //---------------------------------------------------------------------- @@ -76,7 +98,6 @@ DEFINE_EVENT_TYPE( wxEVT_STC_MODIFIED ) DEFINE_EVENT_TYPE( wxEVT_STC_MACRORECORD ) DEFINE_EVENT_TYPE( wxEVT_STC_MARGINCLICK ) DEFINE_EVENT_TYPE( wxEVT_STC_NEEDSHOWN ) -DEFINE_EVENT_TYPE( wxEVT_STC_POSCHANGED ) DEFINE_EVENT_TYPE( wxEVT_STC_PAINTED ) DEFINE_EVENT_TYPE( wxEVT_STC_USERLISTSELECTION ) DEFINE_EVENT_TYPE( wxEVT_STC_URIDROPPED ) @@ -89,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 ) @@ -116,7 +140,7 @@ BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl) EVT_SYS_COLOUR_CHANGED (wxStyledTextCtrl::OnSysColourChanged) EVT_ERASE_BACKGROUND (wxStyledTextCtrl::OnEraseBackground) EVT_MENU_RANGE (10, 16, wxStyledTextCtrl::OnMenu) - EVT_LISTBOX_DCLICK (-1, wxStyledTextCtrl::OnListBox) + EVT_LISTBOX_DCLICK (wxID_ANY, wxStyledTextCtrl::OnListBox) END_EVENT_TABLE() @@ -136,23 +160,44 @@ 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); +} + + +bool wxStyledTextCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) { + style |= wxVSCROLL | wxHSCROLL; + if (!wxControl::Create(parent, id, pos, size, + style | wxWANTS_CHARS | wxCLIP_CHILDREN, + wxDefaultValidator, name)) + return false; + #ifdef LINK_LEXERS Scintilla_LinkLexers(); #endif m_swx = new ScintillaWX(this); m_stopWatch.Start(); - m_lastKeyDownConsumed = FALSE; + m_lastKeyDownConsumed = false; m_vScrollBar = NULL; m_hScrollBar = NULL; #if wxUSE_UNICODE // Put Scintilla into unicode (UTF-8) mode SetCodePage(wxSTC_CP_UTF8); #endif + + SetInitialSize(size); + + // Reduces flicker on GTK+/X11 + SetBackgroundStyle(wxBG_STYLE_CUSTOM); + return true; } @@ -168,7 +213,26 @@ long wxStyledTextCtrl::SendMsg(int msg, long wp, long lp) { return m_swx->WndProc(msg, wp, lp); } +//---------------------------------------------------------------------- + +// Set the vertical scrollbar to use instead of the ont that's built-in. +void wxStyledTextCtrl::SetVScrollBar(wxScrollBar* bar) { + m_vScrollBar = bar; + if (bar != NULL) { + // ensure that the built-in scrollbar is not visible + SetScrollbar(wxVERTICAL, 0, 0, 0); + } +} + +// Set the horizontal scrollbar to use instead of the ont that's built-in. +void wxStyledTextCtrl::SetHScrollBar(wxScrollBar* bar) { + m_hScrollBar = bar; + if (bar != NULL) { + // ensure that the built-in scrollbar is not visible + SetScrollbar(wxHORIZONTAL, 0, 0, 0); + } +} //---------------------------------------------------------------------- // BEGIN generated section. The following code is automatically generated @@ -176,7 +240,7 @@ long wxStyledTextCtrl::SendMsg(int msg, long wp, long lp) { // this file. Edit stc.cpp.in or gen_iface.py instead and regenerate. -// Add text to the document. +// Add text to the document at current position. void wxStyledTextCtrl::AddText(const wxString& text) { wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); SendMsg(2001, strlen(buf), (long)(const char*)buf); @@ -202,7 +266,7 @@ void wxStyledTextCtrl::ClearDocumentStyle() { SendMsg(2005, 0, 0); } -// The number of characters in the document. +// Returns the number of characters in the document. int wxStyledTextCtrl::GetLength() { return SendMsg(2006, 0, 0); } @@ -468,6 +532,8 @@ void wxStyledTextCtrl::MarkerDefineBitmap(int markerNumber, const wxBitmap& bmp) // convert bmp to a xpm in a string wxMemoryOutputStream strm; wxImage img = bmp.ConvertToImage(); + if (img.HasAlpha()) + img.ConvertAlphaToMask(); img.SaveFile(strm, wxBITMAP_TYPE_XPM); size_t len = strm.GetSize(); char* buff = new char[len+1]; @@ -478,6 +544,16 @@ void wxStyledTextCtrl::MarkerDefineBitmap(int markerNumber, const wxBitmap& bmp) } +// Add a set of markers to a line. +void wxStyledTextCtrl::MarkerAddSet(int line, int set) { + SendMsg(2466, line, set); +} + +// Set the alpha used for a marker that is drawn in the text area, not the margin. +void wxStyledTextCtrl::MarkerSetAlpha(int markerNumber, int alpha) { + SendMsg(2476, markerNumber, alpha); +} + // Set a margin to be either numeric or symbolic. void wxStyledTextCtrl::SetMarginType(int margin, int marginType) { SendMsg(2240, margin, marginType); @@ -568,16 +644,86 @@ void wxStyledTextCtrl::StyleSetUnderline(int style, bool underline) { SendMsg(2059, style, underline); } +// Get the foreground colour of a style. +wxColour wxStyledTextCtrl::StyleGetForeground(int style) { + long c = SendMsg(2481, style, 0); + return wxColourFromLong(c); +} + +// Get the background colour of a style. +wxColour wxStyledTextCtrl::StyleGetBackground(int style) { + long c = SendMsg(2482, style, 0); + return wxColourFromLong(c); +} + +// Get is a style bold or not. +bool wxStyledTextCtrl::StyleGetBold(int style) { + return SendMsg(2483, style, 0) != 0; +} + +// Get is a style italic or not. +bool wxStyledTextCtrl::StyleGetItalic(int style) { + return SendMsg(2484, style, 0) != 0; +} + +// Get the size of characters of a style. +int wxStyledTextCtrl::StyleGetSize(int style) { + return SendMsg(2485, style, 0); +} + +// Get the font facename of a style +wxString wxStyledTextCtrl::StyleGetFaceName(int style) { + long msg = 2486; + long len = SendMsg(msg, style, 0); + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(msg, style, (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf); +} + +// Get is a style to have its end of line filled or not. +bool wxStyledTextCtrl::StyleGetEOLFilled(int style) { + return SendMsg(2487, style, 0) != 0; +} + +// Get is a style underlined or not. +bool wxStyledTextCtrl::StyleGetUnderline(int style) { + return SendMsg(2488, style, 0) != 0; +} + +// Get is a style mixed case, or to force upper or lower case. +int wxStyledTextCtrl::StyleGetCase(int style) { + return SendMsg(2489, style, 0); +} + +// Get the character set of the font in a style. +int wxStyledTextCtrl::StyleGetCharacterSet(int style) { + return SendMsg(2490, style, 0); +} + +// Get is a style visible or not. +bool wxStyledTextCtrl::StyleGetVisible(int style) { + return SendMsg(2491, style, 0) != 0; +} + +// Get is a style changeable or not (read only). +// Experimental feature, currently buggy. +bool wxStyledTextCtrl::StyleGetChangeable(int style) { + return SendMsg(2492, style, 0) != 0; +} + +// Get is a style a hotspot or not. +bool wxStyledTextCtrl::StyleGetHotSpot(int style) { + return SendMsg(2493, style, 0) != 0; +} + // Set a style to be mixed case, or to force upper or lower case. 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 a style to be a hotspot or not. void wxStyledTextCtrl::StyleSetHotSpot(int style, bool hotspot) { SendMsg(2409, style, hotspot); @@ -593,6 +739,26 @@ void wxStyledTextCtrl::SetSelBackground(bool useSetting, const wxColour& back) { SendMsg(2068, useSetting, wxColourAsLong(back)); } +// Get the alpha of the selection. +int wxStyledTextCtrl::GetSelAlpha() { + return SendMsg(2477, 0, 0); +} + +// Set the alpha of the selection. +void wxStyledTextCtrl::SetSelAlpha(int alpha) { + SendMsg(2478, alpha, 0); +} + +// Is the selection end of line filled? +bool wxStyledTextCtrl::GetSelEOLFilled() { + return SendMsg(2479, 0, 0) != 0; +} + +// Set the selection to have its end of line filled or not. +void wxStyledTextCtrl::SetSelEOLFilled(bool filled) { + SendMsg(2480, filled, 0); +} + // Set the foreground colour of the caret. void wxStyledTextCtrl::SetCaretForeground(const wxColour& fore) { SendMsg(2069, wxColourAsLong(fore), 0); @@ -603,7 +769,7 @@ void wxStyledTextCtrl::CmdKeyAssign(int key, int modifiers, int 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)); } @@ -634,6 +800,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)); } @@ -670,6 +837,16 @@ wxColour wxStyledTextCtrl::IndicatorGetForeground(int indic) { return wxColourFromLong(c); } +// Set an indicator to draw under text or over(default). +void wxStyledTextCtrl::IndicatorSetUnder(int indic, bool under) { + SendMsg(2510, indic, under); +} + +// Retrieve whether indicator drawn under or over text. +bool wxStyledTextCtrl::IndicatorGetUnder(int indic) { + return SendMsg(2511, indic, 0) != 0; +} + // Set the foreground colour of all whitespace and whether to use this setting. void wxStyledTextCtrl::SetWhitespaceForeground(bool useSetting, const wxColour& fore) { SendMsg(2084, useSetting, wxColourAsLong(fore)); @@ -718,13 +895,13 @@ void wxStyledTextCtrl::SetCaretLineVisible(bool show) { } // Get the colour of the background of the line containing the caret. -wxColour wxStyledTextCtrl::GetCaretLineBack() { +wxColour wxStyledTextCtrl::GetCaretLineBackground() { long c = SendMsg(2097, 0, 0); return wxColourFromLong(c); } // Set the colour of the background of the line containing the caret. -void wxStyledTextCtrl::SetCaretLineBack(const wxColour& back) { +void wxStyledTextCtrl::SetCaretLineBackground(const wxColour& back) { SendMsg(2098, wxColourAsLong(back), 0); } @@ -851,6 +1028,8 @@ void wxStyledTextCtrl::RegisterImage(int type, const wxBitmap& bmp) { // convert bmp to a xpm in a string wxMemoryOutputStream strm; wxImage img = bmp.ConvertToImage(); + if (img.HasAlpha()) + img.ConvertAlphaToMask(); img.SaveFile(strm, wxBITMAP_TYPE_XPM); size_t len = strm.GetSize(); char* buff = new char[len+1]; @@ -877,6 +1056,28 @@ void wxStyledTextCtrl::AutoCompSetTypeSeparator(int separatorCharacter) { SendMsg(2286, separatorCharacter, 0); } +// Set the maximum width, in characters, of auto-completion and user lists. +// Set to 0 to autosize to fit longest item, which is the default. +void wxStyledTextCtrl::AutoCompSetMaxWidth(int characterCount) { + SendMsg(2208, characterCount, 0); +} + +// Get the maximum width, in characters, of auto-completion and user lists. +int wxStyledTextCtrl::AutoCompGetMaxWidth() { + return SendMsg(2209, 0, 0); +} + +// Set the maximum height, in rows, of auto-completion and user lists. +// The default is 5 rows. +void wxStyledTextCtrl::AutoCompSetMaxHeight(int rowCount) { + SendMsg(2210, rowCount, 0); +} + +// Set the maximum height, in rows, of auto-completion and user lists. +int wxStyledTextCtrl::AutoCompGetMaxHeight() { + return SendMsg(2211, 0, 0); +} + // Set the number of spaces used for one level of indentation. void wxStyledTextCtrl::SetIndent(int indentSize) { SendMsg(2122, indentSize, 0); @@ -929,13 +1130,13 @@ bool wxStyledTextCtrl::GetUseHorizontalScrollBar() { } // Show or hide indentation guides. -void wxStyledTextCtrl::SetIndentationGuides(bool show) { - SendMsg(2132, show, 0); +void wxStyledTextCtrl::SetIndentationGuides(int indentView) { + SendMsg(2132, indentView, 0); } // Are the indentation guides visible? -bool wxStyledTextCtrl::GetIndentationGuides() { - return SendMsg(2133, 0, 0) != 0; +int wxStyledTextCtrl::GetIndentationGuides() { + return SendMsg(2133, 0, 0); } // Set the highlighted indentation guide column. @@ -1033,7 +1234,7 @@ int wxStyledTextCtrl::FindText(int minPos, int maxPos, int startPos, int endPos, wxDC* draw, - wxDC* target, // Why does it use two? Can they be the same? + wxDC* target, wxRect renderRect, wxRect pageRect) { RangeToFormat fr; @@ -1289,7 +1490,7 @@ 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) { @@ -1298,7 +1499,7 @@ int wxStyledTextCtrl::GetTargetEnd() { } // 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 @@ -1310,7 +1511,7 @@ int wxStyledTextCtrl::GetTargetEnd() { } // 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) { @@ -1368,6 +1569,11 @@ void wxStyledTextCtrl::CallTipSetForegroundHighlight(const wxColour& fore) { SendMsg(2207, wxColourAsLong(fore), 0); } +// Enable use of STYLE_CALLTIP and set call tip tab size in pixels. +void wxStyledTextCtrl::CallTipUseStyle(int tabSize) { + SendMsg(2212, tabSize, 0); +} + // Find the display line of a document line taking hidden lines into account. int wxStyledTextCtrl::VisibleFromDocLine(int line) { return SendMsg(2220, line, 0); @@ -1378,6 +1584,11 @@ int wxStyledTextCtrl::DocLineFromVisible(int lineDisplay) { return SendMsg(2221, lineDisplay, 0); } +// The number of display lines needed to wrap a document line +int wxStyledTextCtrl::WrapCount(int line) { + return SendMsg(2235, line, 0); +} + // Set the fold level of a line. // This encodes an integer level along with flags indicating whether the // line is a header and whether it is effectively white space. @@ -1496,6 +1707,36 @@ int wxStyledTextCtrl::GetWrapMode() { return SendMsg(2269, 0, 0); } +// Set the display mode of visual flags for wrapped lines. +void wxStyledTextCtrl::SetWrapVisualFlags(int wrapVisualFlags) { + SendMsg(2460, wrapVisualFlags, 0); +} + +// Retrive the display mode of visual flags for wrapped lines. +int wxStyledTextCtrl::GetWrapVisualFlags() { + return SendMsg(2461, 0, 0); +} + +// Set the location of visual flags for wrapped lines. +void wxStyledTextCtrl::SetWrapVisualFlagsLocation(int wrapVisualFlagsLocation) { + SendMsg(2462, wrapVisualFlagsLocation, 0); +} + +// Retrive the location of visual flags for wrapped lines. +int wxStyledTextCtrl::GetWrapVisualFlagsLocation() { + return SendMsg(2463, 0, 0); +} + +// Set the start indent for wrapped lines. +void wxStyledTextCtrl::SetWrapStartIndent(int indent) { + SendMsg(2464, indent, 0); +} + +// Retrive the start indent for wrapped lines. +int wxStyledTextCtrl::GetWrapStartIndent() { + return SendMsg(2465, 0, 0); +} + // Sets the degree of caching of layout information. void wxStyledTextCtrl::SetLayoutCache(int mode) { SendMsg(2272, mode, 0); @@ -1516,8 +1757,18 @@ int wxStyledTextCtrl::GetScrollWidth() { return SendMsg(2275, 0, 0); } +// Sets whether the maximum width line displayed is used to set scroll width. +void wxStyledTextCtrl::SetScrollWidthTracking(bool tracking) { + SendMsg(2516, tracking, 0); +} + +// Retrieve whether the scroll width tracks wide lines. +bool wxStyledTextCtrl::GetScrollWidthTracking() { + return SendMsg(2517, 0, 0) != 0; +} + // 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)); @@ -1532,8 +1783,8 @@ void wxStyledTextCtrl::SetEndAtLastLine(bool endAtLastLine) { // Retrieve whether the maximum scroll position has the last // line at the bottom of the view. -int wxStyledTextCtrl::GetEndAtLastLine() { - return SendMsg(2278, 0, 0); +bool wxStyledTextCtrl::GetEndAtLastLine() { + return SendMsg(2278, 0, 0) != 0; } // Retrieve the height of a particular line of text in pixels. @@ -1552,8 +1803,9 @@ bool wxStyledTextCtrl::GetUseVerticalScrollBar() { } // 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)); +void wxStyledTextCtrl::AppendText(const wxString& text) { + wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); + SendMsg(2282, strlen(buf), (long)(const char*)buf); } // Is drawing done in two phases with backgrounds drawn before foregrounds? @@ -1591,11 +1843,244 @@ void wxStyledTextCtrl::SetFoldMarginHiColour(bool useSetting, const wxColour& fo 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); +} + +// Delete the word to the right of the caret, but not the trailing non-word characters. +void wxStyledTextCtrl::DelWordRightEnd() { + SendMsg(2518, 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); @@ -1618,6 +2103,30 @@ 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); @@ -1868,7 +2377,7 @@ int wxStyledTextCtrl::GetXOffset() { return SendMsg(2398, 0, 0); } -// Set the last x chosen value to be the caret x position +// Set the last x chosen value to be the caret x position. void wxStyledTextCtrl::ChooseCaretX() { SendMsg(2399, 0, 0); } @@ -1890,7 +2399,7 @@ void wxStyledTextCtrl::SetPrintWrapMode(int mode) { SendMsg(2406, mode, 0); } -// Is printing line wrapped. +// Is printing line wrapped? int wxStyledTextCtrl::GetPrintWrapMode() { return SendMsg(2407, 0, 0); } @@ -1900,16 +2409,57 @@ void wxStyledTextCtrl::SetHotspotActiveForeground(bool useSetting, const wxColou SendMsg(2410, useSetting, wxColourAsLong(fore)); } +// Get the fore colour for active hotspots. +wxColour wxStyledTextCtrl::GetHotspotActiveForeground() { + long c = SendMsg(2494, 0, 0); + return wxColourFromLong(c); +} + // Set a back colour for active hotspots. void wxStyledTextCtrl::SetHotspotActiveBackground(bool useSetting, const wxColour& back) { SendMsg(2411, useSetting, wxColourAsLong(back)); } +// Get the back colour for active hotspots. +wxColour wxStyledTextCtrl::GetHotspotActiveBackground() { + long c = SendMsg(2495, 0, 0); + return wxColourFromLong(c); +} + // Enable / Disable underlining active hotspots. void wxStyledTextCtrl::SetHotspotActiveUnderline(bool underline) { SendMsg(2412, underline, 0); } +// Get whether underlining for active hotspots. +bool wxStyledTextCtrl::GetHotspotActiveUnderline() { + return SendMsg(2496, 0, 0) != 0; +} + +// Limit hotspots to single line so hotspots on two lines don't merge. +void wxStyledTextCtrl::SetHotspotSingleLine(bool singleLine) { + SendMsg(2421, singleLine, 0); +} + +// Get the HotspotSingleLine property +bool wxStyledTextCtrl::GetHotspotSingleLine() { + return SendMsg(2497, 0, 0) != 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) { @@ -1932,6 +2482,251 @@ 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); +} + +// Enlarge the document to a particular size of text bytes. +void wxStyledTextCtrl::Allocate(int bytes) { + SendMsg(2446, bytes, 0); +} + +// Find the position of a column on a line taking into account tabs and +// multi-byte characters. If beyond end of line, return line end position. +int wxStyledTextCtrl::FindColumn(int line, int column) { + return SendMsg(2456, line, column); +} + +// Can the caret preferred x position only be changed by explicit movement commands? +bool wxStyledTextCtrl::GetCaretSticky() { + return SendMsg(2457, 0, 0) != 0; +} + +// Stop the caret preferred x position changing when the user types. +void wxStyledTextCtrl::SetCaretSticky(bool useCaretStickyBehaviour) { + SendMsg(2458, useCaretStickyBehaviour, 0); +} + +// Switch between sticky and non-sticky: meant to be bound to a key. +void wxStyledTextCtrl::ToggleCaretSticky() { + SendMsg(2459, 0, 0); +} + +// Enable/Disable convert-on-paste for line endings +void wxStyledTextCtrl::SetPasteConvertEndings(bool convert) { + SendMsg(2467, convert, 0); +} + +// Get convert-on-paste setting +bool wxStyledTextCtrl::GetPasteConvertEndings() { + return SendMsg(2468, 0, 0) != 0; +} + +// Duplicate the selection. If selection empty duplicate the line containing the caret. +void wxStyledTextCtrl::SelectionDuplicate() { + SendMsg(2469, 0, 0); +} + +// Set background alpha of the caret line. +void wxStyledTextCtrl::SetCaretLineBackAlpha(int alpha) { + SendMsg(2470, alpha, 0); +} + +// Get the background alpha of the caret line. +int wxStyledTextCtrl::GetCaretLineBackAlpha() { + return SendMsg(2471, 0, 0); +} + +// Set the style of the caret to be drawn. +void wxStyledTextCtrl::SetCaretStyle(int caretStyle) { + SendMsg(2512, caretStyle, 0); +} + +// Returns the current style of the caret. +int wxStyledTextCtrl::GetCaretStyle() { + return SendMsg(2513, 0, 0); +} + +// Set the indicator used for IndicatorFillRange and IndicatorClearRange +void wxStyledTextCtrl::SetIndicatorCurrent(int indicator) { + SendMsg(2500, indicator, 0); +} + +// Get the current indicator +int wxStyledTextCtrl::GetIndicatorCurrent() { + return SendMsg(2501, 0, 0); +} + +// Set the value used for IndicatorFillRange +void wxStyledTextCtrl::SetIndicatorValue(int value) { + SendMsg(2502, value, 0); +} + +// Get the current indicator vaue +int wxStyledTextCtrl::GetIndicatorValue() { + return SendMsg(2503, 0, 0); +} + +// Turn a indicator on over a range. +void wxStyledTextCtrl::IndicatorFillRange(int position, int fillLength) { + SendMsg(2504, position, fillLength); +} + +// Turn a indicator off over a range. +void wxStyledTextCtrl::IndicatorClearRange(int position, int clearLength) { + SendMsg(2505, position, clearLength); +} + +// Are any indicators present at position? +int wxStyledTextCtrl::IndicatorAllOnFor(int position) { + return SendMsg(2506, position, 0); +} + +// What value does a particular indicator have at at a position? +int wxStyledTextCtrl::IndicatorValueAt(int indicator, int position) { + return SendMsg(2507, indicator, position); +} + +// Where does a particular indicator start? +int wxStyledTextCtrl::IndicatorStart(int indicator, int position) { + return SendMsg(2508, indicator, position); +} + +// Where does a particular indicator end? +int wxStyledTextCtrl::IndicatorEnd(int indicator, int position) { + return SendMsg(2509, indicator, position); +} + +// Set number of entries in position cache +void wxStyledTextCtrl::SetPositionCacheSize(int size) { + SendMsg(2514, size, 0); +} + +// How many entries are allocated to the position cache? +int wxStyledTextCtrl::GetPositionCacheSize() { + return SendMsg(2515, 0, 0); +} + // Start notifying the container of all key presses and commands. void wxStyledTextCtrl::StartRecord() { SendMsg(3001, 0, 0); @@ -1972,6 +2767,44 @@ void wxStyledTextCtrl::SetLexerLanguage(const wxString& language) { SendMsg(4006, 0, (long)(const char*)wx2stc(language)); } +// Retrieve a 'property' value previously set with SetProperty. +wxString wxStyledTextCtrl::GetProperty(const wxString& key) { + int len = SendMsg(SCI_GETPROPERTY, (long)(const char*)wx2stc(key), 0); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(4008, (long)(const char*)wx2stc(key), (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf); +} + +// Retrieve a 'property' value previously set with SetProperty, +// with '$()' variable replacement on returned buffer. +wxString wxStyledTextCtrl::GetPropertyExpanded(const wxString& key) { + int len = SendMsg(SCI_GETPROPERTYEXPANDED, (long)(const char*)wx2stc(key), 0); + if (!len) return wxEmptyString; + + wxMemoryBuffer mbuf(len+1); + char* buf = (char*)mbuf.GetWriteBuf(len+1); + SendMsg(4009, (long)(const char*)wx2stc(key), (long)buf); + mbuf.UngetWriteBuf(len); + mbuf.AppendByte(0); + return stc2wx(buf); +} + +// Retrieve a 'property' value previously set with SetProperty, +// interpreted as an int AFTER any '$()' variable replacement. +int wxStyledTextCtrl::GetPropertyInt(const wxString& key) { + return SendMsg(4010, (long)(const char*)wx2stc(key), 0); +} + +// Retrieve the number of bits the current lexer needs for styling. +int wxStyledTextCtrl::GetStyleBitsNeeded() { + return SendMsg(4011, 0, 0); +} + // END of generated section //---------------------------------------------------------------------- @@ -1988,8 +2821,8 @@ int wxStyledTextCtrl::GetCurrentLine() { // // bold turns on bold // italic turns on italics -// fore:#RRGGBB sets the foreground colour -// back:#RRGGBB sets the background colour +// fore:[name or #RRGGBB] sets the foreground colour +// back:[name or #RRGGBB] sets the background colour // face:[facename] sets the font face name to use // size:[num] sets the font size in points // eol turns on eol filling @@ -2034,6 +2867,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) { @@ -2042,28 +2894,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(); + 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(); - // TODO: add encoding/charset mapping - StyleSetFontAttr(styleNum, size, faceName, bold, italic, under); + 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); } @@ -2113,13 +3072,13 @@ bool wxStyledTextCtrl::SaveFile(const wxString& filename) wxFile file(filename, wxFile::write); if (!file.IsOpened()) - return FALSE; + return false; bool success = file.Write(GetText(), *wxConvCurrent); - if (success) { + if (success) SetSavePoint(); - } + return success; } @@ -2131,26 +3090,31 @@ bool wxStyledTextCtrl::LoadFile(const wxString& filename) if (file.IsOpened()) { wxString contents; -#if wxUSE_UNICODE - wxMemoryBuffer buffer; -#else - wxString buffer; -#endif - - off_t len = file.Length(); + // get the file size (assume it is not huge file...) + ssize_t len = (ssize_t)file.Length(); + if (len > 0) { - void *bufptr = buffer.GetWriteBuf(len); - success = (file.Read(bufptr, len) == len); - buffer.UngetWriteBuf(len); #if wxUSE_UNICODE - contents = wxString(buffer, *wxConvCurrent); + 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 (len == 0) + success = true; // empty file is ok + else + success = false; // len == wxInvalidOffset + } if (success) { @@ -2164,6 +3128,129 @@ bool wxStyledTextCtrl::LoadFile(const wxString& filename) } +#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(); +} + + + + + +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 @@ -2190,8 +3277,10 @@ void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) { } void wxStyledTextCtrl::OnSize(wxSizeEvent& WXUNUSED(evt)) { - wxSize sz = GetClientSize(); - m_swx->DoSize(sz.x, sz.y); + if (m_swx) { + wxSize sz = GetClientSize(); + m_swx->DoSize(sz.x, sz.y); + } } void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) { @@ -2227,6 +3316,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)); } @@ -2241,52 +3338,74 @@ 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. bool ctrl = evt.ControlDown(); +#ifdef __WXMAC__ + // On the Mac the Alt key is just a modifier key (like Shift) so we need + // to allow the char events to be processed when Alt is pressed. + // TODO: Should we check MetaDown instead in this case? + bool alt = false; +#else bool alt = evt.AltDown(); +#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_NUMPAD_DIVIDE) && - !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(); } -void wxStyledTextCtrl::OnLoseFocus(wxFocusEvent& WXUNUSED(evt)) { +void wxStyledTextCtrl::OnLoseFocus(wxFocusEvent& evt) { m_swx->DoLoseFocus(); + evt.Skip(); } -void wxStyledTextCtrl::OnGainFocus(wxFocusEvent& WXUNUSED(evt)) { +void wxStyledTextCtrl::OnGainFocus(wxFocusEvent& evt) { m_swx->DoGainFocus(); + evt.Skip(); } @@ -2311,6 +3430,19 @@ void wxStyledTextCtrl::OnListBox(wxCommandEvent& WXUNUSED(evt)) { } +void wxStyledTextCtrl::OnIdle(wxIdleEvent& evt) { + m_swx->DoOnIdle(evt); +} + + +wxSize wxStyledTextCtrl::DoGetBestSize() const +{ + // What would be the best size for a wxSTC? + // Just give a reasonable minimum until something else can be figured out. + return wxSize(200,100); +} + + //---------------------------------------------------------------------- // Turn notifications from Scintilla into events @@ -2326,12 +3458,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)); } @@ -2409,10 +3536,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: @@ -2448,6 +3583,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; } @@ -2479,7 +3622,7 @@ wxStyledTextEvent::wxStyledTextEvent(wxEventType commandType, int id) m_listType = 0; m_x = 0; m_y = 0; - m_dragAllowMove = FALSE; + m_dragAllowMove = false; #if wxUSE_DRAG_AND_DROP m_dragResult = wxDragNone; #endif @@ -2524,11 +3667,4 @@ wxStyledTextEvent::wxStyledTextEvent(const wxStyledTextEvent& event): //---------------------------------------------------------------------- //---------------------------------------------------------------------- - - - - - - - - +#endif // wxUSE_STC