📄 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.2 2005/08/26 11:15:32 mandrav 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 classes
class wxSCITimer : public wxTimer {
public:
wxSCITimer(ScintillaWX* swx) {
this->swx = swx;
}
void Notify() {
swx->DoTick();
}
private:
ScintillaWX* swx;
};
#if wxUSE_DRAG_AND_DROP
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()
//----------------------------------------------------------------------
static 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;
}
//----------------------------------------------------------------------
// Constructor/Destructor
ScintillaWX::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
}
ScintillaWX::~ScintillaWX() {
Finalise();
}
//----------------------------------------------------------------------
// base class virtuals
void ScintillaWX::Initialise() {
//ScintillaBase::Initialise();
#if wxUSE_DRAG_AND_DROP
dropTarget = new wxSCIDropTarget;
dropTarget->SetScintilla(this);
sci->SetDropTarget(dropTarget);
#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
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();
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) {
bool modified = false;
int vertEnd = nMax;
if (!verticalScrollBarVisible)
vertEnd = 0;
// Check the vertical scrollbar
if (sci->m_vScrollBar == NULL) { // Use built-in scrollbar
int sbMax = sci->GetScrollRange(wxVERTICAL);
int sbThumb = sci->GetScrollThumb(wxVERTICAL);
int sbPos = sci->GetScrollPos(wxVERTICAL);
if (sbMax != vertEnd || sbThumb != nPage) {
sci->SetScrollbar(wxVERTICAL, sbPos, nPage, vertEnd+1);
modified = true;
}
}
else { // otherwise use the one that's been given to us
int sbMax = sci->m_vScrollBar->GetRange();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -