+
+ // 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);
+}
+
+
+// Perform one of the operations defined by the wxSTC_CMD_* constants.
+void wxStyledTextCtrl::CmdKeyExecute(int cmd) {
+ SendMsg(cmd);
+}
+
+
+// Set the left and right margin in the edit area, measured in pixels.
+void wxStyledTextCtrl::SetMargins(int left, int right) {
+ SetMarginLeft(left);
+ SetMarginRight(right);
+}
+
+
+// Retrieve the start and end positions of the current selection.
+void wxStyledTextCtrl::GetSelection(int* startPos, int* endPos) {
+ if (startPos != NULL)
+ *startPos = SendMsg(SCI_GETSELECTIONSTART);
+ if (endPos != NULL)
+ *endPos = SendMsg(SCI_GETSELECTIONEND);
+}
+
+
+// Retrieve the point in the window where a position is displayed.
+wxPoint wxStyledTextCtrl::PointFromPosition(int pos) {
+ int x = SendMsg(SCI_POINTXFROMPOSITION, 0, pos);
+ int y = SendMsg(SCI_POINTYFROMPOSITION, 0, pos);
+ return wxPoint(x, y);
+}
+
+// Scroll enough to make the given line visible
+void wxStyledTextCtrl::ScrollToLine(int line) {
+ m_swx->DoScrollToLine(line);
+}
+
+
+// Scroll enough to make the given column visible
+void wxStyledTextCtrl::ScrollToColumn(int column) {
+ m_swx->DoScrollToColumn(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;
+ // get the file size (assume it is not huge file...)
+ ssize_t len = (ssize_t)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
+ {
+ if (len == 0)
+ success = true; // empty file is ok
+ else
+ success = false; // len == wxInvalidOffset
+ }
+
+ 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();
+}
+
+
+
+
+
+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
+
+void wxStyledTextCtrl::OnPaint(wxPaintEvent& WXUNUSED(evt)) {
+ wxPaintDC dc(this);
+ m_swx->DoPaint(&dc, GetUpdateRegion().GetBox());
+}
+
+void wxStyledTextCtrl::OnScrollWin(wxScrollWinEvent& evt) {
+ if (evt.GetOrientation() == wxHORIZONTAL)
+ m_swx->DoHScroll(evt.GetEventType(), evt.GetPosition());
+ else
+ m_swx->DoVScroll(evt.GetEventType(), evt.GetPosition());
+}
+
+void wxStyledTextCtrl::OnScroll(wxScrollEvent& evt) {
+ wxScrollBar* sb = wxDynamicCast(evt.GetEventObject(), wxScrollBar);
+ if (sb) {
+ if (sb->IsVertical())
+ m_swx->DoVScroll(evt.GetEventType(), evt.GetPosition());
+ else
+ m_swx->DoHScroll(evt.GetEventType(), evt.GetPosition());
+ }
+}
+
+void wxStyledTextCtrl::OnSize(wxSizeEvent& WXUNUSED(evt)) {
+ if (m_swx) {
+ wxSize sz = GetClientSize();
+ m_swx->DoSize(sz.x, sz.y);
+ }
+}
+
+void wxStyledTextCtrl::OnMouseLeftDown(wxMouseEvent& evt) {
+ SetFocus();
+ wxPoint pt = evt.GetPosition();
+ m_swx->DoLeftButtonDown(Point(pt.x, pt.y), m_stopWatch.Time(),
+ evt.ShiftDown(), evt.ControlDown(), evt.AltDown());
+}
+
+void wxStyledTextCtrl::OnMouseMove(wxMouseEvent& evt) {
+ wxPoint pt = evt.GetPosition();
+ m_swx->DoLeftButtonMove(Point(pt.x, pt.y));
+}
+
+void wxStyledTextCtrl::OnMouseLeftUp(wxMouseEvent& evt) {
+ wxPoint pt = evt.GetPosition();
+ m_swx->DoLeftButtonUp(Point(pt.x, pt.y), m_stopWatch.Time(),
+ evt.ControlDown());
+}
+
+
+void wxStyledTextCtrl::OnMouseRightUp(wxMouseEvent& evt) {
+ wxPoint pt = evt.GetPosition();
+ m_swx->DoContextMenu(Point(pt.x, pt.y));
+}
+
+
+void wxStyledTextCtrl::OnMouseMiddleUp(wxMouseEvent& evt) {
+ wxPoint pt = evt.GetPosition();
+ m_swx->DoMiddleButtonUp(Point(pt.x, pt.y));
+}
+
+void wxStyledTextCtrl::OnContextMenu(wxContextMenuEvent& evt) {
+ wxPoint pt = evt.GetPosition();
+ ScreenToClient(&pt.x, &pt.y);
+ /*
+ 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));
+}
+
+
+void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) {
+ m_swx->DoMouseWheel(evt.GetWheelRotation(),
+ evt.GetWheelDelta(),
+ evt.GetLinesPerAction(),
+ evt.ControlDown(),
+ evt.IsPageScroll());
+}
+
+
+void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
+ // 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));
+
+ 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 processed = m_swx->DoKeyDown(evt, &m_lastKeyDownConsumed);
+ if (!processed && !m_lastKeyDownConsumed)