📄 scintillawx.cpp
字号:
////////////////////////////////////////////////////////////////////////////// Name: ScintillaWX.cxx// Purpose: A wxWidgets implementation of Scintilla. A class derived// from ScintillaBase that uses the "wx platform" defined in// PlatformWX.cxx This class is one end of a bridge between// the wx world and the Scintilla world. It needs a peer// object of type wxScintilla to function.//// Author: Robin Dunn//// Created: 13-Jan-2000// RCS-ID: $Id: ScintillaWX.cpp,v 1.1 2008/02/24 16:18:07 rollmark Exp $// Copyright: (c) 2000 by Total Control Software// Licence: wxWindows license/////////////////////////////////////////////////////////////////////////////#include "ScintillaWX.h"//?#include "ExternalLexer.h"#include "PlatWX.h"#include "wx/wxscintilla.h"#include <wx/textbuf.h>#ifdef __WXMSW__#include <wx/msw/private.h> // GetHwndOf()#endif//----------------------------------------------------------------------// Helper classesclass wxSCITimer : public wxTimer {public: wxSCITimer(ScintillaWX* swx) { this->swx = swx; } void Notify() { swx->DoTick(); }private: ScintillaWX* swx;};#if wxUSE_DRAG_AND_DROPclass wxStartDragTimer : public wxTimer {public: wxStartDragTimer(ScintillaWX* swx) { this->swx = swx; } void Notify() { swx->DoStartDrag(); }private: ScintillaWX* swx;};bool wxSCIDropTarget::OnDropText(wxCoord x, wxCoord y, const wxString& data) { return swx->DoDropText(x, y, data);}wxDragResult wxSCIDropTarget::OnEnter(wxCoord x, wxCoord y, wxDragResult def) { return swx->DoDragEnter(x, y, def);}wxDragResult wxSCIDropTarget::OnDragOver(wxCoord x, wxCoord y, wxDragResult def) { return swx->DoDragOver(x, y, def);}void wxSCIDropTarget::OnLeave() { swx->DoDragLeave();}#endif#if wxUSE_POPUPWIN && wxSCI_USE_POPUP#include <wx/popupwin.h>#define wxSCICallTipBase wxPopupWindow#define param2 wxBORDER_NONE // popup's 2nd param is flags#else#define wxSCICallTipBase wxWindow#define param2 -1 // wxWindow's 2nd param is ID#endif#include <wx/dcbuffer.h>class wxSCICallTip : public wxSCICallTipBase {public: wxSCICallTip(wxWindow* parent, CallTip* ct, ScintillaWX* swx) : wxSCICallTipBase(parent, param2), m_ct(ct), m_swx(swx), m_cx(-1), m_cy(-1) { } ~wxSCICallTip() {#if wxUSE_POPUPWIN && wxSCI_USE_POPUP && defined(__WXGTK__) wxRect rect = GetRect(); rect.x = m_cx; rect.y = m_cy; GetParent()->Refresh(false, &rect);#endif } bool AcceptsFocus() const { return false; } void OnPaint(wxPaintEvent& WXUNUSED(evt)) { wxBufferedPaintDC dc(this); Surface* surfaceWindow = Surface::Allocate(); surfaceWindow->Init(&dc, m_ct->wDraw.GetID()); m_ct->PaintCT(surfaceWindow); surfaceWindow->Release(); delete surfaceWindow; } void OnFocus(wxFocusEvent& event) { GetParent()->SetFocus(); event.Skip(); } void OnLeftDown(wxMouseEvent& event) { wxPoint pt = event.GetPosition(); Point p(pt.x, pt.y); m_ct->MouseClick(p); m_swx->CallTipClick(); }#if wxUSE_POPUPWIN && wxSCI_USE_POPUP virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO) { if (x != -1) { m_cx = x; GetParent()->ClientToScreen(&x, NULL); } if (y != -1) { m_cy = y; GetParent()->ClientToScreen(NULL, &y); } wxSCICallTipBase::DoSetSize(x, y, width, height, sizeFlags); }#endif wxPoint GetMyPosition() { return wxPoint(m_cx, m_cy); }private: CallTip* m_ct; ScintillaWX* m_swx; int m_cx, m_cy; DECLARE_EVENT_TABLE()};BEGIN_EVENT_TABLE(wxSCICallTip, wxSCICallTipBase) EVT_PAINT(wxSCICallTip::OnPaint) EVT_SET_FOCUS(wxSCICallTip::OnFocus) EVT_LEFT_DOWN(wxSCICallTip::OnLeftDown)END_EVENT_TABLE()//----------------------------------------------------------------------#if wxUSE_DATAOBJstatic wxTextFileType wxConvertEOLMode(int scintillaMode){ wxTextFileType type; switch (scintillaMode) { case wxSCI_EOL_CRLF: type = wxTextFileType_Dos; break; case wxSCI_EOL_CR: type = wxTextFileType_Mac; break; case wxSCI_EOL_LF: type = wxTextFileType_Unix; break; default: type = wxTextBuffer::typeDefault; break; } return type;}#endif // wxUSE_DATAOBJstatic int wxCountLines(const char* text, int scintillaMode){ char eolchar; switch (scintillaMode) { case wxSCI_EOL_CRLF: case wxSCI_EOL_LF: eolchar = '\n'; break; case wxSCI_EOL_CR: eolchar = '\r'; break; default: return 0; } int count = 0; int i = 0; while (text[i] != 0) { if (text[i] == eolchar) { count++; } i++; } return count;}//----------------------------------------------------------------------// Constructor/DestructorScintillaWX::ScintillaWX(wxScintilla* win) { capturedMouse = false; focusEvent = false; wMain = win; sci = win; wheelRotation = 0; Initialise();#ifdef __WXMSW__#if wxCHECK_VERSION(2, 5, 0) sysCaretBitmap = 0; sysCaretWidth = 0; sysCaretHeight = 0;#endif#endif#if wxUSE_DRAG_AND_DROP startDragTimer = new wxStartDragTimer(this);#endif}ScintillaWX::~ScintillaWX() {#if wxUSE_DRAG_AND_DROP delete startDragTimer;#endif Finalise();}//----------------------------------------------------------------------// base class virtualsvoid ScintillaWX::Initialise() { //ScintillaBase::Initialise();#if wxUSE_DRAG_AND_DROP dropTarget = new wxSCIDropTarget; dropTarget->SetScintilla(this); sci->SetDropTarget(dropTarget); dragRectangle = false;#endif#ifdef __WXMAC__ vs.extraFontFlag = false; // UseAntiAliasing#else vs.extraFontFlag = true; // UseAntiAliasing#endif}void ScintillaWX::Finalise() { ScintillaBase::Finalise(); SetTicking(false); SetIdle(false); DestroySystemCaret();}void ScintillaWX::StartDrag() {#if wxUSE_DRAG_AND_DROP // We defer the starting of the DnD, otherwise the LeftUp of a normal // click could be lost and the STC will think it is doing a DnD when the // user just wanted a normal click. startDragTimer->Start (200, true);#endif}void ScintillaWX::DoStartDrag() {#if wxUSE_DRAG_AND_DROP wxString dragText = sci2wx (drag.s, drag.len); // Send an event to allow the drag text to be changed wxScintillaEvent evt(wxEVT_SCI_START_DRAG, sci->GetId()); evt.SetEventObject (sci); evt.SetDragText (dragText); evt.SetDragAllowMove (true); evt.SetPosition (wxMin(sci->GetSelectionStart(), sci->GetSelectionEnd())); sci->GetEventHandler()->ProcessEvent (evt); dragText = evt.GetDragText(); dragRectangle = drag.rectangular; if (dragText.Length()) { wxDropSource source(sci); wxTextDataObject data(dragText); wxDragResult result; source.SetData(data); dropWentOutside = true; result = source.DoDragDrop(evt.GetDragAllowMove()); if (result == wxDragMove && dropWentOutside) ClearSelection(); inDragDrop = false; SetDragPosition (invalidPosition); }#endif}bool ScintillaWX::SetIdle(bool on) { if (idler.state != on) { // connect or disconnect the EVT_IDLE handler if (on) sci->Connect(wxID_ANY, wxEVT_IDLE, (wxObjectEventFunction) (wxEventFunction) (wxIdleEventFunction) &wxScintilla::OnIdle); else sci->Disconnect(wxID_ANY, wxEVT_IDLE, (wxObjectEventFunction) (wxEventFunction) (wxIdleEventFunction) &wxScintilla::OnIdle); idler.state = on; } return idler.state;}void ScintillaWX::SetTicking(bool on) { wxSCITimer* stiTimer; if (timer.ticking != on) { timer.ticking = on; if (timer.ticking) { stiTimer = new wxSCITimer(this); stiTimer->Start(timer.tickSize); timer.tickerID = stiTimer; } else { stiTimer = (wxSCITimer*)timer.tickerID; stiTimer->Stop(); delete stiTimer; timer.tickerID = 0; } } timer.ticksToWait = caret.period;}void ScintillaWX::SetMouseCapture(bool on) { if (mouseDownCaptures) { if (on && !capturedMouse) sci->CaptureMouse(); else if (!on && capturedMouse && sci->HasCapture()) sci->ReleaseMouse(); capturedMouse = on; }}bool ScintillaWX::HaveMouseCapture() { return capturedMouse;}void ScintillaWX::ScrollText(int linesToMove) { int dy = vs.lineHeight * (linesToMove); sci->ScrollWindow(0, dy); sci->Update();}void ScintillaWX::SetVerticalScrollPos() { if (sci->m_vScrollBar == NULL) { // Use built-in scrollbar sci->SetScrollPos(wxVERTICAL, topLine); } else { // otherwise use the one that's been given to us sci->m_vScrollBar->SetThumbPosition(topLine); }}void ScintillaWX::SetHorizontalScrollPos() { if (sci->m_hScrollBar == NULL) { // Use built-in scrollbar sci->SetScrollPos(wxHORIZONTAL, xOffset); } else { // otherwise use the one that's been given to us sci->m_hScrollBar->SetThumbPosition(xOffset); }}const int H_SCROLL_STEP = 20;bool ScintillaWX::ModifyScrollBars(int nMax, int nPage) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -