From adc33a661948e517e7d223ad8aa5fa5a45be3e6f Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Sun, 11 May 2003 01:25:28 +0000 Subject: Addition of CopyText, CopyRange, and LineCopy. --- doc/ScintillaDoc.html | 32 ++++++++++++++++++++++++++------ gtk/ScintillaGTK.cxx | 8 ++++++++ include/Scintilla.h | 3 +++ include/Scintilla.iface | 9 +++++++++ src/Editor.cxx | 43 ++++++++++++++++++++++++++++++++++++++----- src/Editor.h | 17 +++++++++++++++++ src/KeyMap.cxx | 7 ++++--- win32/ScintillaWin.cxx | 26 +++++++++++++------------- 8 files changed, 118 insertions(+), 27 deletions(-) diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index 66944ec97..daf9d6c11 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -747,6 +747,16 @@ struct TextToFind {

Cut, copy and paste

+ SCI_CUT
+ SCI_COPY
+ SCI_PASTE
+ SCI_CLEAR
+ SCI_CANPASTE
+ SCI_COPYRANGE(int start, int end)
+ SCI_COPYTEXT(int length, + const char *text)
+
+

SCI_CUT
SCI_COPY
SCI_PASTE
@@ -762,6 +772,12 @@ struct TextToFind {

GTK+ does not really support SCI_CANPASTE and always returns TRUE unless the document is read-only.

+ SCI_COPYRANGE(int start, int end)
+ SCI_COPYTEXT(int length, const char *text)
+

SCI_COPYRANGE copies a range of text from the document to + the system clipboard and SCI_COPYTEXT copies a supplied piece of + text to the system clipboard.

+

Error handling

SCI_SETSTATUS(int status)
@@ -3166,40 +3182,44 @@ struct TextToFind { SCI_LINECUT + SCI_LINECOPY + SCI_LINEDELETE SCI_LINETRANSPOSE - - SCI_LINEDUPLICATE + SCI_LINEDUPLICATE + SCI_LOWERCASE SCI_UPPERCASE SCI_WORDPARTLEFT - - SCI_WORDPARTLEFTEXTEND + SCI_WORDPARTLEFTEXTEND + SCI_WORDPARTRIGHT SCI_WORDPARTRIGHTEXTEND SCI_HOMEDISPLAY - - SCI_HOMEDISPLAYEXTEND + SCI_HOMEDISPLAYEXTEND + SCI_LINEENDDISPLAY SCI_LINEENDDISPLAYEXTEND SCI_VCHOMEWRAP + + SCI_VCHOMEWRAPEXTEND diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index e8f1626b3..11506abb0 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -137,6 +137,7 @@ private: void NotifyKey(int key, int modifiers); void NotifyURIDropped(const char *list); virtual int KeyDefault(int key, int modifiers); + virtual void CopyToClipboard(const SelectionText &selectedText); virtual void Copy(); virtual void Paste(); virtual void CreateCallTipWindow(PRectangle rc); @@ -910,6 +911,13 @@ int ScintillaGTK::KeyDefault(int key, int modifiers) { //Platform::DebugPrintf("SK-key: %d %x %x\n",key, modifiers); } +void ScintillaGTK::CopyToClipboard(const SelectionText &selectedText) { + copyText.Copy(selectedText.s, selectedText.len); + gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), + clipboard_atom, + GDK_CURRENT_TIME); +} + void ScintillaGTK::Copy() { if (currentPos != anchor) { CopySelectionRange(©Text); diff --git a/include/Scintilla.h b/include/Scintilla.h index 470425e76..250f79314 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -464,6 +464,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_LINEENDWRAPEXTEND 2452 #define SCI_VCHOMEWRAP 2453 #define SCI_VCHOMEWRAPEXTEND 2454 +#define SCI_LINECOPY 2455 #define SCI_MOVECARETINSIDEVIEW 2401 #define SCI_LINELENGTH 2350 #define SCI_BRACEHIGHLIGHT 2351 @@ -537,6 +538,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_PARAUPEXTEND 2416 #define SCI_POSITIONBEFORE 2417 #define SCI_POSITIONAFTER 2418 +#define SCI_COPYRANGE 2419 +#define SCI_COPYTEXT 2420 #define SCI_STARTRECORD 3001 #define SCI_STOPRECORD 3002 #define SCI_SETLEXER 4001 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 94c181379..2c2c092e7 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1231,6 +1231,9 @@ fun void LineEndWrapExtend=2452(,) fun void VCHomeWrap=2453(,) fun void VCHomeWrapExtend=2454(,) +# Copy the line containing the caret. +fun void LineCopy=2455(,) + # Move the caret inside current view if it's not there already. fun void MoveCaretInsideView=2401(,) @@ -1449,6 +1452,12 @@ fun position PositionBefore=2417(position pos,) # page into account. Maximum value returned is the last position in the document. fun position PositionAfter=2418(position pos,) +# Copy a range of text to the clipboard. Positions are clipped into the document. +fun void CopyRange=2419(position start, position end) + +# Copy argument text to the clipboard. +fun void CopyText=2420(int length, string text) + # Start notifying the container of all key presses and commands. fun void StartRecord=3001(,) diff --git a/src/Editor.cxx b/src/Editor.cxx index d4a0596dd..75139e19f 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -3441,6 +3441,7 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long case SCI_DELWORDRIGHT: case SCI_DELLINELEFT: case SCI_DELLINERIGHT: + case SCI_LINECOPY: case SCI_LINECUT: case SCI_LINEDELETE: case SCI_LINETRANSPOSE: @@ -3879,6 +3880,13 @@ int Editor::KeyCommand(unsigned int iMessage) { pdoc->DeleteChars(currentPos, end - currentPos); } break; + case SCI_LINECOPY: { + int lineStart = pdoc->LineFromPosition(SelectionStart()); + int lineEnd = pdoc->LineFromPosition(SelectionEnd()); + CopyRangeToClipboard(pdoc->LineStart(lineStart), + pdoc->LineStart(lineEnd + 1)); + } + break; case SCI_LINECUT: { int lineStart = pdoc->LineFromPosition(currentPos); int lineEnd = pdoc->LineFromPosition(anchor); @@ -3891,6 +3899,7 @@ int Editor::KeyCommand(unsigned int iMessage) { int end = pdoc->LineStart(lineEnd + 1); SetSelection(start, end); Cut(); + SetLastXChosen(); } break; case SCI_LINEDELETE: { @@ -4187,10 +4196,14 @@ char *Editor::CopyRange(int start, int end) { return text; } +void Editor::CopySelectionFromRange(SelectionText *ss, int start, int end) { + ss->Set(CopyRange(start, end), end - start, false); +} + void Editor::CopySelectionRange(SelectionText *ss) { - char *text = 0; - int size = 0; if (selType == selRectangle) { + char *text = 0; + int size = 0; int lineStart = pdoc->LineFromPosition(SelectionStart()); int lineEnd = pdoc->LineFromPosition(SelectionEnd()); int line; @@ -4215,11 +4228,22 @@ void Editor::CopySelectionRange(SelectionText *ss) { text[size] = '\0'; } } + ss->Set(text, size, true); } else { - size = SelectionEnd() - SelectionStart(); - text = CopyRange(SelectionStart(), SelectionEnd()); + CopySelectionFromRange(ss, SelectionStart(), SelectionEnd()); } - ss->Set(text, size, selType == selRectangle); +} + +void Editor::CopyRangeToClipboard(int start, int end) { + SelectionText selectedText; + selectedText.Set(CopyRange(start, end), end - start); + CopyToClipboard(selectedText); +} + +void Editor::CopyText(int length, const char *text) { + SelectionText selectedText; + selectedText.Copy(text, length); + CopyToClipboard(selectedText); } void Editor::SetDragPosition(int newPos) { @@ -5046,6 +5070,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { Copy(); break; + case SCI_COPYRANGE: + CopyRangeToClipboard(wParam, lParam); + break; + + case SCI_COPYTEXT: + CopyText(wParam, CharPtrFromSPtr(lParam)); + break; + case SCI_PASTE: Paste(); SetLastXChosen(); @@ -6187,6 +6219,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_DELWORDRIGHT: case SCI_DELLINELEFT: case SCI_DELLINERIGHT: + case SCI_LINECOPY: case SCI_LINECUT: case SCI_LINEDELETE: case SCI_LINETRANSPOSE: diff --git a/src/Editor.h b/src/Editor.h index f2a4c9ca9..bd4669192 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -133,6 +133,19 @@ public: len = 0; rectangular = rectangular_; } + void Copy(const char *s_, int len_, bool rectangular_=false) { + delete []s; + s = new char[len_]; + if (s) { + len = len_; + for (int i = 0; i < len_; i++) { + s[i] = s_[i]; + } + } else { + len = 0; + } + rectangular = rectangular_; + } }; /** @@ -416,8 +429,12 @@ protected: // ScintillaBase subclass needs access to much of Editor long SearchInTarget(const char *text, int length); void GoToLine(int lineNo); + virtual void CopyToClipboard(const SelectionText &selectedText) = 0; char *CopyRange(int start, int end); + void CopySelectionFromRange(SelectionText *ss, int start, int end); void CopySelectionRange(SelectionText *ss); + void CopyRangeToClipboard(int start, int end); + void CopyText(int length, const char *text); void SetDragPosition(int newPos); virtual void DisplayCursor(Window::Cursor c); virtual void StartDrag(); diff --git a/src/KeyMap.cxx b/src/KeyMap.cxx index 837cdd241..f15842af6 100644 --- a/src/KeyMap.cxx +++ b/src/KeyMap.cxx @@ -1,5 +1,5 @@ // Scintilla source code edit control -/** @file KeyMap.cxx +/** @file KeyMap.cxx ** Defines a mapping between keystrokes and commands. **/ // Copyright 1998-2001 by Neil Hodgson @@ -13,7 +13,7 @@ KeyMap::KeyMap() : kmap(0), len(0), alloc(0) { for (int i = 0; MapDefault[i].key; i++) { - AssignCmdKey(MapDefault[i].key, + AssignCmdKey(MapDefault[i].key, MapDefault[i].modifiers, MapDefault[i].msg); } @@ -113,7 +113,7 @@ const KeyToCommand KeyMap::MapDefault[] = { {SCK_BACK, SCI_SHIFT, SCI_DELETEBACK}, {SCK_BACK, SCI_CTRL, SCI_DELWORDLEFT}, {SCK_BACK, SCI_ALT, SCI_UNDO}, - {SCK_BACK, SCI_CSHIFT, SCI_DELLINELEFT}, + {SCK_BACK, SCI_CSHIFT, SCI_DELLINELEFT}, {'Z', SCI_CTRL, SCI_UNDO}, {'Y', SCI_CTRL, SCI_REDO}, {'X', SCI_CTRL, SCI_CUT}, @@ -130,6 +130,7 @@ const KeyToCommand KeyMap::MapDefault[] = { //'L', SCI_CTRL, SCI_FORMFEED, {'L', SCI_CTRL, SCI_LINECUT}, {'L', SCI_CSHIFT, SCI_LINEDELETE}, + {'T', SCI_CSHIFT, SCI_LINECOPY}, {'T', SCI_CTRL, SCI_LINETRANSPOSE}, {'D', SCI_CTRL, SCI_LINEDUPLICATE}, {'U', SCI_CTRL, SCI_LOWERCASE}, diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index d44769237..b26f7a1e6 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -220,7 +220,7 @@ class ScintillaWin : void AddCharBytes(char b0, char b1=0); void GetIntelliMouseParameters(); - void CopySelTextToClipboard(); + virtual void CopyToClipboard(const SelectionText &selectedText); void ScrollMessage(WPARAM wParam); void HorizontalScrollMessage(WPARAM wParam); void RealizeWindowPalette(bool inBackGround); @@ -1036,13 +1036,9 @@ void ScintillaWin::NotifyDoubleClick(Point pt, bool shift) { void ScintillaWin::Copy() { //Platform::DebugPrintf("Copy\n"); if (currentPos != anchor) { - ::OpenClipboard(MainHWND()); - ::EmptyClipboard(); - CopySelTextToClipboard(); - if (selType == selRectangle) { - ::SetClipboardData(cfColumnSelect, 0); - } - ::CloseClipboard(); + SelectionText selectedText; + CopySelectionRange(&selectedText); + CopyToClipboard(selectedText); } } @@ -1534,11 +1530,9 @@ void ScintillaWin::GetIntelliMouseParameters() { ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &linesPerScroll, 0); } -void ScintillaWin::CopySelTextToClipboard() { - SelectionText selectedText; - CopySelectionRange(&selectedText); - if (selectedText.len == 0) - return; +void ScintillaWin::CopyToClipboard(const SelectionText &selectedText) { + ::OpenClipboard(MainHWND()); + ::EmptyClipboard(); HGLOBAL hand = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, selectedText.len + 1); @@ -1562,6 +1556,12 @@ void ScintillaWin::CopySelTextToClipboard() { } ::SetClipboardData(CF_UNICODETEXT, uhand); } + + if (selectedText.rectangular) { + ::SetClipboardData(cfColumnSelect, 0); + } + + ::CloseClipboard(); } void ScintillaWin::ScrollMessage(WPARAM wParam) { -- cgit v1.2.3