// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
-#include <wx/wx.h>
-#include <wx/textbuf.h>
-#include <wx/dataobj.h>
-#include <wx/clipbrd.h>
-#include <wx/dnd.h>
+#include "wx/wx.h"
+#include "wx/textbuf.h"
+#include "wx/dataobj.h"
+#include "wx/clipbrd.h"
+#include "wx/dnd.h"
#include "ScintillaWX.h"
#include "ExternalLexer.h"
#ifdef __WXMSW__
// GetHwndOf()
- #include <wx/msw/private.h>
+ #include "wx/msw/private.h"
#endif
//----------------------------------------------------------------------
#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);
}
void wxSTCDropTarget::OnLeave() {
swx->DoDragLeave();
}
-#endif
+#endif // wxUSE_DRAG_AND_DROP
#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
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();
}
dropTarget = new wxSTCDropTarget;
dropTarget->SetScintilla(this);
stc->SetDropTarget(dropTarget);
-#endif
+#endif // wxUSE_DRAG_AND_DROP
#ifdef __WXMAC__
vs.extraFontFlag = false; // UseAntiAliasing
#else
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);
stc->GetEventHandler()->ProcessEvent(evt);
dragText = evt.GetDragText();
- if (dragText.Length()) {
+ if (dragText.length()) {
wxDropSource source(stc);
wxTextDataObject data(dragText);
wxDragResult result;
inDragDrop = false;
SetDragPosition(invalidPosition);
}
-#endif
+#endif // wxUSE_DRAG_AND_DROP
}
PRectangle rcClient = GetClientRectangle();
paintingAllText = rcPaint.Contains(rcClient);
- dc->BeginDrawing();
ClipChildren(*dc, rcPaint);
Paint(surfaceWindow, rcPaint);
FullPaint();
}
paintState = notPainting;
- dc->EndDrawing();
}
}
void ScintillaWX::DoLeftButtonUp(Point pt, unsigned int curTime, bool ctrl) {
+#if wxUSE_DRAG_AND_DROP
+ if (startDragTimer->IsRunning()) {
+ startDragTimer->Stop();
+ SetEmptySelection(PositionFromLocation(pt));
+ }
+#endif // wxUSE_DRAG_AND_DROP
ButtonUp(pt, curTime, ctrl);
}
void ScintillaWX::DoDragLeave() {
SetDragPosition(invalidPosition);
}
-#endif
+#endif // wxUSE_DRAG_AND_DROP
//----------------------------------------------------------------------
// Force the whole window to be repainted