aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/ScintillaDoc.html32
-rw-r--r--gtk/ScintillaGTK.cxx8
-rw-r--r--include/Scintilla.h3
-rw-r--r--include/Scintilla.iface9
-rw-r--r--src/Editor.cxx43
-rw-r--r--src/Editor.h17
-rw-r--r--src/KeyMap.cxx7
-rw-r--r--win32/ScintillaWin.cxx26
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 {
<h2 id="CutCopyAndPaste">Cut, copy and paste</h2>
+ <code><a class="message" href="#SCI_CUT">SCI_CUT</a><br />
+ <a class="message" href="#SCI_COPY">SCI_COPY</a><br />
+ <a class="message" href="#SCI_PASTE">SCI_PASTE</a><br />
+ <a class="message" href="#SCI_CLEAR">SCI_CLEAR</a><br />
+ <a class="message" href="#SCI_CANPASTE">SCI_CANPASTE</a><br />
+ <a class="message" href="#SCI_COPYRANGE">SCI_COPYRANGE(int start, int end)</a><br />
+ <a class="message" href="#SCI_COPYTEXT">SCI_COPYTEXT(int length,
+ const char *text)</a><br />
+ </code>
+
<p><b id="SCI_CUT">SCI_CUT</b><br />
<b id="SCI_COPY">SCI_COPY</b><br />
<b id="SCI_PASTE">SCI_PASTE</b><br />
@@ -762,6 +772,12 @@ struct TextToFind {
<p>GTK+ does not really support <code>SCI_CANPASTE</code> and always returns <code>TRUE</code>
unless the document is read-only.</p>
+ <b id="SCI_COPYRANGE">SCI_COPYRANGE(int start, int end)</b><br />
+ <b id="SCI_COPYTEXT">SCI_COPYTEXT(int length, const char *text)</b><br />
+ <p><code>SCI_COPYRANGE</code> copies a range of text from the document to
+ the system clipboard and <code>SCI_COPYTEXT</code> copies a supplied piece of
+ text to the system clipboard.</p>
+
<h2 id="ErrorHandling">Error handling</h2>
<p><b id="SCI_SETSTATUS">SCI_SETSTATUS(int status)</b><br />
@@ -3166,40 +3182,44 @@ struct TextToFind {
<tr>
<td><code>SCI_LINECUT</code></td>
+ <td><code>SCI_LINECOPY</code></td>
+
<td><code>SCI_LINEDELETE</code></td>
<td><code>SCI_LINETRANSPOSE</code></td>
-
- <td><code>SCI_LINEDUPLICATE</code></td>
</tr>
<tr>
+ <td><code>SCI_LINEDUPLICATE</code></td>
+
<td><code>SCI_LOWERCASE</code></td>
<td><code>SCI_UPPERCASE</code></td>
<td><code>SCI_WORDPARTLEFT</code></td>
-
- <td><code>SCI_WORDPARTLEFTEXTEND</code></td>
</tr>
<tr>
+ <td><code>SCI_WORDPARTLEFTEXTEND</code></td>
+
<td><code>SCI_WORDPARTRIGHT</code></td>
<td><code>SCI_WORDPARTRIGHTEXTEND</code></td>
<td><code>SCI_HOMEDISPLAY</code></td>
-
- <td><code>SCI_HOMEDISPLAYEXTEND</code></td>
</tr>
<tr>
+ <td><code>SCI_HOMEDISPLAYEXTEND</code></td>
+
<td><code>SCI_LINEENDDISPLAY</code></td>
<td><code>SCI_LINEENDDISPLAYEXTEND</code></td>
<td><code>SCI_VCHOMEWRAP</code></td>
+ </tr>
+ <tr>
<td><code>SCI_VCHOMEWRAPEXTEND</code></td>
</tr>
</tbody>
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(&copyText);
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 <neilh@scintilla.org>
@@ -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) {