X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/65ec6247df6af7b6489257b1ac04ca2242dc14ec..4eb1fe9da6dbf2a82876547b6f69836e086f22e7:/src/stc/ScintillaWX.cpp diff --git a/src/stc/ScintillaWX.cpp b/src/stc/ScintillaWX.cpp index 127c172a90..1effa1fe99 100644 --- a/src/stc/ScintillaWX.cpp +++ b/src/stc/ScintillaWX.cpp @@ -44,7 +44,7 @@ private: }; - +#if wxUSE_DRAG_AND_DROP bool wxSTCDropTarget::OnDropText(wxCoord x, wxCoord y, const wxString& data) { return swx->DoDropText(x, y, data); } @@ -60,6 +60,7 @@ wxDragResult wxSTCDropTarget::OnDragOver(wxCoord x, wxCoord y, wxDragResult def void wxSTCDropTarget::OnLeave() { swx->DoDragLeave(); } +#endif class wxSTCCallTip : public wxWindow { @@ -109,9 +110,11 @@ ScintillaWX::~ScintillaWX() { void ScintillaWX::Initialise() { //ScintillaBase::Initialise(); +#if wxUSE_DRAG_AND_DROP dropTarget = new wxSTCDropTarget; dropTarget->SetScintilla(this); stc->SetDropTarget(dropTarget); +#endif } @@ -121,16 +124,33 @@ void ScintillaWX::Finalise() { void ScintillaWX::StartDrag() { - wxDropSource source(wMain.GetID()); - wxTextDataObject data(dragChars); - wxDragResult result; - - source.SetData(data); - result = source.DoDragDrop(TRUE); - if (result == wxDragMove && dropWentOutside) - ClearSelection(); - inDragDrop = FALSE; - SetDragPosition(invalidPosition); +#if wxUSE_DRAG_AND_DROP + wxString dragText(drag.s, drag.len); + + // Send an event to allow the drag text to be changed + wxStyledTextEvent evt(wxEVT_STC_START_DRAG, stc->GetId()); + evt.SetEventObject(stc); + evt.SetDragText(dragText); + evt.SetDragAllowMove(TRUE); + evt.SetPosition(wxMin(stc->GetSelectionStart(), + stc->GetSelectionEnd())); + stc->GetEventHandler()->ProcessEvent(evt); + dragText = evt.GetDragText(); + + if (dragText.Length()) { + wxDropSource source(wMain.GetID()); + 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 } @@ -217,9 +237,10 @@ void ScintillaWX::NotifyParent(SCNotification scn) { void ScintillaWX::Copy() { if (currentPos != anchor) { - char* text = CopySelectionRange(); + SelectionText st; + CopySelectionRange(&st); wxTheClipboard->Open(); - wxTheClipboard->SetData(new wxTextDataObject(text)); + wxTheClipboard->SetData(new wxTextDataObject(wxString(st.s, st.len))); wxTheClipboard->Close(); } } @@ -230,12 +251,12 @@ void ScintillaWX::Paste() { ClearSelection(); wxTextDataObject data; - bool canPaste; + bool gotData; wxTheClipboard->Open(); - canPaste = wxTheClipboard->GetData(data); + gotData = wxTheClipboard->GetData(data); wxTheClipboard->Close(); - if (canPaste) { + if (gotData) { wxString str = data.GetText(); int len = str.Length(); pdoc->InsertString(currentPos, str.c_str(), len); @@ -249,11 +270,10 @@ void ScintillaWX::Paste() { bool ScintillaWX::CanPaste() { - wxTextDataObject data; bool canPaste; wxTheClipboard->Open(); - canPaste = wxTheClipboard->GetData(data); + canPaste = wxTheClipboard->IsSupported( wxDF_TEXT ); wxTheClipboard->Close(); return canPaste; @@ -421,37 +441,52 @@ void ScintillaWX::DoButtonMove(Point pt) { void ScintillaWX::DoAddChar(char ch) { - //bool acActiveBeforeCharAdded = ac.Active(); AddChar(ch); - //if (acActiveBeforeCharAdded) - // AutoCompleteChanged(ch); } int ScintillaWX::DoKeyDown(int key, bool shift, bool ctrl, bool alt, bool* consumed) { +#ifdef __WXGTK__ + // Ctrl chars (A-Z) end up with the wrong keycode on wxGTK... + if (ctrl && key >= 1 && key <= 26) + key += 'A' - 1; +#endif + switch (key) { - case WXK_DOWN: key = SCK_DOWN; break; - case WXK_UP: key = SCK_UP; break; - case WXK_LEFT: key = SCK_LEFT; break; - case WXK_RIGHT: key = SCK_RIGHT; break; - case WXK_HOME: key = SCK_HOME; break; - case WXK_END: key = SCK_END; break; - case WXK_PRIOR: key = SCK_PRIOR; break; - case WXK_NEXT: key = SCK_NEXT; break; - case WXK_DELETE: key = SCK_DELETE; break; - case WXK_INSERT: key = SCK_INSERT; break; - case WXK_ESCAPE: key = SCK_ESCAPE; break; - case WXK_BACK: key = SCK_BACK; break; - case WXK_TAB: key = SCK_TAB; break; - case WXK_RETURN: key = SCK_RETURN; break; - case WXK_ADD: key = SCK_ADD; break; - case WXK_SUBTRACT: key = SCK_SUBTRACT; break; - case WXK_DIVIDE: key = SCK_DIVIDE; break; - case WXK_CONTROL: key = 0; break; - case WXK_ALT: key = 0; break; - case WXK_SHIFT: key = 0; break; + case WXK_DOWN: key = SCK_DOWN; break; + case WXK_UP: key = SCK_UP; break; + case WXK_LEFT: key = SCK_LEFT; break; + case WXK_RIGHT: key = SCK_RIGHT; break; + case WXK_HOME: key = SCK_HOME; break; + case WXK_END: key = SCK_END; break; + case WXK_PRIOR: key = SCK_PRIOR; break; + case WXK_NEXT: key = SCK_NEXT; break; + case WXK_DELETE: key = SCK_DELETE; break; + case WXK_INSERT: key = SCK_INSERT; break; + case WXK_ESCAPE: key = SCK_ESCAPE; break; + case WXK_BACK: key = SCK_BACK; break; + case WXK_TAB: key = SCK_TAB; break; + case WXK_RETURN: key = SCK_RETURN; break; + case WXK_ADD: + case WXK_NUMPAD_ADD: + key = SCK_ADD; break; + case WXK_SUBTRACT: + case WXK_NUMPAD_SUBTRACT: + key = SCK_SUBTRACT; break; + case WXK_DIVIDE: + case WXK_NUMPAD_DIVIDE: + key = SCK_DIVIDE; break; + case WXK_CONTROL: key = 0; break; + case WXK_ALT: key = 0; break; + case WXK_SHIFT: key = 0; break; + case WXK_MENU: key = 0; break; } - return KeyDown(key, shift, ctrl, alt, consumed); + int rv = KeyDown(key, shift, ctrl, alt, consumed); + + if (key) + return rv; + else + return 1; } @@ -470,30 +505,59 @@ void ScintillaWX::DoOnListBox() { //---------------------------------------------------------------------- +#if wxUSE_DRAG_AND_DROP bool ScintillaWX::DoDropText(long x, long y, const wxString& data) { SetDragPosition(invalidPosition); - int movePos = PositionFromLocation(Point(x,y)); - DropAt(movePos, data, dragResult == wxDragMove, FALSE); // TODO: rectangular? - return TRUE; + + // Send an event to allow the drag details to be changed + wxStyledTextEvent evt(wxEVT_STC_DO_DROP, stc->GetId()); + evt.SetEventObject(stc); + evt.SetDragResult(dragResult); + evt.SetX(x); + evt.SetY(y); + evt.SetPosition(PositionFromLocation(Point(x,y))); + evt.SetDragText(data); + stc->GetEventHandler()->ProcessEvent(evt); + + dragResult = evt.GetDragResult(); + if (dragResult == wxDragMove || dragResult == wxDragCopy) { + DropAt(evt.GetPosition(), + evt.GetDragText(), + dragResult == wxDragMove, + FALSE); // TODO: rectangular? + return TRUE; + } + return FALSE; } wxDragResult ScintillaWX::DoDragEnter(wxCoord x, wxCoord y, wxDragResult def) { - return def; + dragResult = def; + return dragResult; } wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { SetDragPosition(PositionFromLocation(Point(x, y))); - dragResult = def; - return def; + + // Send an event to allow the drag result to be changed + wxStyledTextEvent evt(wxEVT_STC_DRAG_OVER, stc->GetId()); + evt.SetEventObject(stc); + evt.SetDragResult(def); + evt.SetX(x); + evt.SetY(y); + evt.SetPosition(PositionFromLocation(Point(x,y))); + stc->GetEventHandler()->ProcessEvent(evt); + + dragResult = evt.GetDragResult(); + return dragResult; } void ScintillaWX::DoDragLeave() { SetDragPosition(invalidPosition); } - +#endif //---------------------------------------------------------------------- // Redraw all of text area. This paint will not be abandoned.