X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/819850ff060cc66221a14661a339f2c841fd4f0b..abb8764e32f03040cfa03353f2058a6b98a6e612:/src/stc/ScintillaWX.cpp diff --git a/src/stc/ScintillaWX.cpp b/src/stc/ScintillaWX.cpp index a45fc33fcd..8241114798 100644 --- a/src/stc/ScintillaWX.cpp +++ b/src/stc/ScintillaWX.cpp @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////// -// Name: ScintillaWX.cxx +// Name: src/stc/ScintillaWX.cpp // 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 @@ -11,7 +11,7 @@ // Created: 13-Jan-2000 // RCS-ID: $Id$ // Copyright: (c) 2000 by Total Control Software -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx.h". @@ -26,6 +26,7 @@ #ifndef WX_PRECOMP #include "wx/scrolbar.h" #include "wx/menu.h" + #include "wx/timer.h" #endif // WX_PRECOMP #include "wx/textbuf.h" @@ -33,9 +34,16 @@ #include "wx/clipbrd.h" #include "wx/dnd.h" +#if !wxUSE_STD_CONTAINERS && !wxUSE_STD_IOSTREAM && !wxUSE_STD_STRING + #include "wx/beforestd.h" + #include + #include "wx/afterstd.h" +#endif + #include "ScintillaWX.h" #include "ExternalLexer.h" #include "wx/stc/stc.h" +#include "wx/stc/private.h" #include "PlatWX.h" #ifdef __WXMSW__ @@ -49,60 +57,43 @@ class wxSTCTimer : public wxTimer { public: wxSTCTimer(ScintillaWX* swx) { - this->swx = swx; + m_swx = swx; } void Notify() { - swx->DoTick(); + m_swx->DoTick(); } private: - ScintillaWX* swx; + ScintillaWX* m_swx; }; #if wxUSE_DRAG_AND_DROP -class wxStartDragTimer : public wxTimer { -public: - wxStartDragTimer(ScintillaWX* swx) { - this->swx = swx; - } - - void Notify() { - swx->DoStartDrag(); - } - -private: - ScintillaWX* swx; -}; - - bool wxSTCDropTarget::OnDropText(wxCoord x, wxCoord y, const wxString& data) { - return swx->DoDropText(x, y, data); + return m_swx->DoDropText(x, y, data); } wxDragResult wxSTCDropTarget::OnEnter(wxCoord x, wxCoord y, wxDragResult def) { - return swx->DoDragEnter(x, y, def); + return m_swx->DoDragEnter(x, y, def); } wxDragResult wxSTCDropTarget::OnDragOver(wxCoord x, wxCoord y, wxDragResult def) { - return swx->DoDragOver(x, y, def); + return m_swx->DoDragOver(x, y, def); } void wxSTCDropTarget::OnLeave() { - swx->DoDragLeave(); + m_swx->DoDragLeave(); } #endif // wxUSE_DRAG_AND_DROP -#if wxUSE_POPUPWIN && wxSTC_USE_POPUP +#if wxUSE_POPUPWIN #include "wx/popupwin.h" #define wxSTCCallTipBase wxPopupWindow -#define param2 wxBORDER_NONE // popup's 2nd param is flags #else #include "wx/frame.h" #define wxSTCCallTipBase wxFrame -#define param2 -1 // wxWindow's 2nd param is ID #endif #include "wx/dcbuffer.h" @@ -110,7 +101,7 @@ void wxSTCDropTarget::OnLeave() { class wxSTCCallTip : public wxSTCCallTipBase { public: wxSTCCallTip(wxWindow* parent, CallTip* ct, ScintillaWX* swx) : -#if wxUSE_POPUPWIN && wxSTC_USE_POPUP +#if wxUSE_POPUPWIN wxSTCCallTipBase(parent, wxBORDER_NONE), #else wxSTCCallTipBase(parent, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, @@ -118,16 +109,17 @@ public: | wxFRAME_FLOAT_ON_PARENT | wxBORDER_NONE #ifdef __WXMAC__ - | wxPOPUP_WINDOW + | wxPOPUP_WINDOW #endif - ), + ), #endif m_ct(ct), m_swx(swx), m_cx(wxDefaultCoord), m_cy(wxDefaultCoord) { + SetBackgroundStyle(wxBG_STYLE_CUSTOM); } ~wxSTCCallTip() { -#if wxUSE_POPUPWIN && wxSTC_USE_POPUP && defined(__WXGTK__) +#if wxUSE_POPUPWIN && defined(__WXGTK__) wxRect rect = GetRect(); rect.x = m_cx; rect.y = m_cy; @@ -139,7 +131,7 @@ public: void OnPaint(wxPaintEvent& WXUNUSED(evt)) { - wxBufferedPaintDC dc(this); + wxAutoBufferedPaintDC dc(this); Surface* surfaceWindow = Surface::Allocate(); surfaceWindow->Init(&dc, m_ct->wDraw.GetID()); m_ct->PaintCT(surfaceWindow); @@ -177,7 +169,7 @@ public: wxSTCCallTipBase::DoSetSize(x, y, width, height, sizeFlags); } -#if wxUSE_POPUPWIN && wxSTC_USE_POPUP +#if wxUSE_POPUPWIN #else virtual bool Show( bool show = true ) { @@ -194,7 +186,7 @@ public: return rv; } #endif - + wxPoint GetMyPosition() { return wxPoint(m_cx, m_cy); @@ -259,16 +251,10 @@ ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) { sysCaretWidth = 0; sysCaretHeight = 0; #endif -#if wxUSE_DRAG_AND_DROP - startDragTimer = new wxStartDragTimer(this); -#endif // wxUSE_DRAG_AND_DROP } ScintillaWX::~ScintillaWX() { -#if wxUSE_DRAG_AND_DROP - delete startDragTimer; -#endif // wxUSE_DRAG_AND_DROP Finalise(); } @@ -283,11 +269,7 @@ void ScintillaWX::Initialise() { dropTarget->SetScintilla(this); stc->SetDropTarget(dropTarget); #endif // wxUSE_DRAG_AND_DROP -#ifdef __WXMAC__ - vs.extraFontFlag = false; // UseAntiAliasing -#else vs.extraFontFlag = true; // UseAntiAliasing -#endif } @@ -300,15 +282,6 @@ void ScintillaWX::Finalise() { 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 // wxUSE_DRAG_AND_DROP -} - -void ScintillaWX::DoStartDrag() { #if wxUSE_DRAG_AND_DROP wxString dragText = stc2wx(drag.s, drag.len); @@ -316,24 +289,25 @@ void ScintillaWX::DoStartDrag() { wxStyledTextEvent evt(wxEVT_STC_START_DRAG, stc->GetId()); evt.SetEventObject(stc); evt.SetDragText(dragText); - evt.SetDragAllowMove(true); + evt.SetDragFlags(wxDrag_DefaultMove); evt.SetPosition(wxMin(stc->GetSelectionStart(), stc->GetSelectionEnd())); stc->GetEventHandler()->ProcessEvent(evt); dragText = evt.GetDragText(); - if (dragText.length()) { + if ( !dragText.empty() ) { wxDropSource source(stc); wxTextDataObject data(dragText); wxDragResult result; source.SetData(data); dropWentOutside = true; - result = source.DoDragDrop(evt.GetDragAllowMove()); + inDragDrop = ddDragging; + result = source.DoDragDrop(evt.GetDragFlags()); if (result == wxDragMove && dropWentOutside) ClearSelection(); - inDragDrop = false; - SetDragPosition(invalidPosition); + inDragDrop = ddNone; + SetDragPosition(SelectionPosition(invalidPosition)); } #endif // wxUSE_DRAG_AND_DROP } @@ -343,11 +317,9 @@ bool ScintillaWX::SetIdle(bool on) { if (idler.state != on) { // connect or disconnect the EVT_IDLE handler if (on) - stc->Connect(wxID_ANY, wxEVT_IDLE, - (wxObjectEventFunction) (wxEventFunction) (wxIdleEventFunction) &wxStyledTextCtrl::OnIdle); + stc->Connect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(wxStyledTextCtrl::OnIdle)); else - stc->Disconnect(wxID_ANY, wxEVT_IDLE, - (wxObjectEventFunction) (wxEventFunction) (wxIdleEventFunction) &wxStyledTextCtrl::OnIdle); + stc->Disconnect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(wxStyledTextCtrl::OnIdle)); idler.state = on; } return idler.state; @@ -506,7 +478,7 @@ void ScintillaWX::CancelModes() { void ScintillaWX::Copy() { - if (currentPos != anchor) { + if (!sel.Empty()) { SelectionText st; CopySelectionRange(&st); CopyToClipboard(st); @@ -534,12 +506,13 @@ void ScintillaWX::Paste() { #if wxUSE_UNICODE // free up the old character buffer in case the text is real big - data.SetText(wxEmptyString); + data.SetText(wxEmptyString); text = wxEmptyString; #endif int len = strlen(buf); - pdoc->InsertString(currentPos, buf, len); - SetEmptySelection(currentPos + len); + int caretMain = sel.MainCaret(); + pdoc->InsertString(caretMain, buf, len); + SetEmptySelection(caretMain + len); } #endif // wxUSE_DATAOBJ @@ -551,6 +524,9 @@ void ScintillaWX::Paste() { void ScintillaWX::CopyToClipboard(const SelectionText& st) { #if wxUSE_CLIPBOARD + if ( !st.len ) + return; + wxTheClipboard->UsePrimarySelection(false); if (wxTheClipboard->Open()) { wxString text = wxTextBuffer::Translate(stc2wx(st.s, st.len-1)); @@ -611,7 +587,7 @@ void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) { void ScintillaWX::ClaimSelection() { #ifdef __WXGTK__ // Put the selected text in the PRIMARY selection - if (currentPos != anchor) { + if (!sel.Empty()) { SelectionText st; CopySelectionRange(&st); wxTheClipboard->UsePrimarySelection(true); @@ -633,7 +609,7 @@ void ScintillaWX::UpdateSystemCaret() { DestroySystemCaret(); CreateSystemCaret(); } - Point pos = LocationFromPosition(currentPos); + Point pos = PointMainCaret(); ::SetCaretPos(pos.x, pos.y); } #endif @@ -642,8 +618,8 @@ void ScintillaWX::UpdateSystemCaret() { bool ScintillaWX::HasCaretSizeChanged() { #ifdef __WXMSW__ - if (( (0 != vs.caretWidth) && (sysCaretWidth != vs.caretWidth) ) - || (0 != vs.lineHeight) && (sysCaretHeight != vs.lineHeight)) { + if ( (vs.caretWidth && (sysCaretWidth != vs.caretWidth)) + || (vs.lineHeight && (sysCaretHeight != vs.lineHeight)) ) { return true; } #endif @@ -705,12 +681,18 @@ sptr_t ScintillaWX::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) char* defn = reinterpret_cast(lParam); AutoCompleteCancel(); pt.y += vs.lineHeight; - PRectangle rc = ct.CallTipStart(currentPos, pt, + int ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT; + if (ct.UseStyleCallTip()) + { + ct.SetForeBack(vs.styles[STYLE_CALLTIP].fore, vs.styles[STYLE_CALLTIP].back); + } + int caretMain = sel.MainCaret(); + PRectangle rc = ct.CallTipStart(caretMain, pt, defn, - vs.styles[STYLE_DEFAULT].fontName, - vs.styles[STYLE_DEFAULT].sizeZoomed, + vs.styles[ctStyle].fontName, + vs.styles[ctStyle].sizeZoomed, CodePage(), - vs.styles[STYLE_DEFAULT].characterSet, + vs.styles[ctStyle].characterSet, wMain); // If the call-tip window would be out of the client // space, adjust so it displays above the text. @@ -877,14 +859,6 @@ void ScintillaWX::DoLeftButtonDown(Point pt, unsigned int curTime, bool shift, b void ScintillaWX::DoLeftButtonUp(Point pt, unsigned int curTime, bool ctrl) { ButtonUp(pt, curTime, ctrl); -#if wxUSE_DRAG_AND_DROP - if (startDragTimer->IsRunning()) { - startDragTimer->Stop(); - SetDragPosition(invalidPosition); - SetEmptySelection(PositionFromLocation(pt)); - ShowCaretAtCurrentPosition(); - } -#endif // wxUSE_DRAG_AND_DROP } void ScintillaWX::DoLeftButtonMove(Point pt) { @@ -896,7 +870,7 @@ void ScintillaWX::DoMiddleButtonUp(Point pt) { // Set the current position to the mouse click point and // then paste in the PRIMARY selection, if any. wxGTK only. int newPos = PositionFromLocation(pt); - MovePositionTo(newPos, noSel, true); + MovePositionTo(newPos, Selection::noSel, true); pdoc->BeginUndoAction(); wxTextDataObject data; @@ -912,8 +886,9 @@ void ScintillaWX::DoMiddleButtonUp(Point pt) { wxConvertEOLMode(pdoc->eolMode)); wxWX2MBbuf buf = (wxWX2MBbuf)wx2stc(text); int len = strlen(buf); - pdoc->InsertString(currentPos, buf, len); - SetEmptySelection(currentPos + len); + int caretMain = sel.MainCaret(); + pdoc->InsertString(caretMain, buf, len); + SetEmptySelection(caretMain + len); } pdoc->EndUndoAction(); NotifyChange(); @@ -944,6 +919,14 @@ void ScintillaWX::DoAddChar(int key) { int ScintillaWX::DoKeyDown(const wxKeyEvent& evt, bool* consumed) { int key = evt.GetKeyCode(); + if (key == WXK_NONE) { + // This is a Unicode character not representable in Latin-1 or some key + // without key code at all (e.g. dead key or VK_PROCESSKEY under MSW). + if ( consumed ) + *consumed = false; + return 0; + } + bool shift = evt.ShiftDown(), ctrl = evt.ControlDown(), alt = evt.AltDown(); @@ -1041,7 +1024,7 @@ void ScintillaWX::DoOnIdle(wxIdleEvent& evt) { #if wxUSE_DRAG_AND_DROP bool ScintillaWX::DoDropText(long x, long y, const wxString& data) { - SetDragPosition(invalidPosition); + SetDragPosition(SelectionPosition(invalidPosition)); wxString text = wxTextBuffer::Translate(data, wxConvertEOLMode(pdoc->eolMode)); @@ -1058,7 +1041,7 @@ bool ScintillaWX::DoDropText(long x, long y, const wxString& data) { dragResult = evt.GetDragResult(); if (dragResult == wxDragMove || dragResult == wxDragCopy) { - DropAt(evt.GetPosition(), + DropAt(SelectionPosition(evt.GetPosition()), wx2stc(evt.GetDragText()), dragResult == wxDragMove, false); // TODO: rectangular? @@ -1075,7 +1058,7 @@ wxDragResult ScintillaWX::DoDragEnter(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { - SetDragPosition(PositionFromLocation(Point(x, y))); + SetDragPosition(SelectionPosition(PositionFromLocation(Point(x, y)))); // Send an event to allow the drag result to be changed wxStyledTextEvent evt(wxEVT_STC_DRAG_OVER, stc->GetId()); @@ -1092,16 +1075,14 @@ wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { void ScintillaWX::DoDragLeave() { - SetDragPosition(invalidPosition); + SetDragPosition(SelectionPosition(invalidPosition)); } #endif // wxUSE_DRAG_AND_DROP //---------------------------------------------------------------------- // Force the whole window to be repainted void ScintillaWX::FullPaint() { -#ifndef __WXMAC__ stc->Refresh(false); -#endif stc->Update(); } @@ -1127,7 +1108,7 @@ void ScintillaWX::ClipChildren(wxDC& WXUNUSED(dc), PRectangle WXUNUSED(rect)) // if (ct.inCallTipMode) { // wxSTCCallTip* tip = (wxSTCCallTip*)ct.wCallTip.GetID(); // wxRect childRect = tip->GetRect(); -// #if wxUSE_POPUPWIN && wxSTC_USE_POPUP +// #if wxUSE_POPUPWIN // childRect.SetPosition(tip->GetMyPosition()); // #endif // rgn.Subtract(childRect); @@ -1142,7 +1123,7 @@ void ScintillaWX::SetUseAntiAliasing(bool useAA) { } bool ScintillaWX::GetUseAntiAliasing() { - return vs.extraFontFlag; + return vs.extraFontFlag != 0; } //----------------------------------------------------------------------