diff options
Diffstat (limited to 'win32')
| -rw-r--r-- | win32/ScintillaWin.cxx | 49 | 
1 files changed, 38 insertions, 11 deletions
| diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 1ee30d444..fda84759d 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -157,6 +157,7 @@ class ScintillaWin :  	bool hasOKText;  	CLIPFORMAT cfColumnSelect; +	CLIPFORMAT cfLineSelect;  	HRESULT hrOle;  	DropSource ds; @@ -205,6 +206,7 @@ class ScintillaWin :  	virtual void NotifyParent(SCNotification scn);  	virtual void NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt);  	virtual void Copy(); +	virtual void CopyAllowLine();  	virtual bool CanPaste();  	virtual void Paste();  	virtual void CreateCallTipWindow(PRectangle rc); @@ -231,7 +233,7 @@ class ScintillaWin :  	virtual bool GetScrollInfo(int nBar, LPSCROLLINFO lpsi);  	void ChangeScrollPos(int barType, int pos); -	void InsertPasteText(const char *text, int len, int selStart, bool isRectangular); +	void InsertPasteText(const char *text, int len, int selStart, bool isRectangular, bool isLine);  public:  	// Public for benefit of Scintilla_DirectFunction @@ -298,6 +300,10 @@ ScintillaWin::ScintillaWin(HWND hwnd) {  	cfColumnSelect = static_cast<CLIPFORMAT>(  		::RegisterClipboardFormat(TEXT("MSDEVColumnSelect"))); +	// Likewise for line-copy (copies a full line when no text is selected) +	cfLineSelect = static_cast<CLIPFORMAT>( +		::RegisterClipboardFormat(TEXT("MSDEVLineSelect"))); +  	hrOle = E_FAIL;  	wMain = hwnd; @@ -1234,6 +1240,12 @@ void ScintillaWin::Copy() {  	}  } +void ScintillaWin::CopyAllowLine() { +	SelectionText selectedText; +	CopySelectionRange(&selectedText, true); +	CopyToClipboard(selectedText); +} +  bool ScintillaWin::CanPaste() {  	if (!Editor::CanPaste())  		return false; @@ -1283,22 +1295,32 @@ public:  	}  }; -void ScintillaWin::InsertPasteText(const char *text, int len, int selStart, bool isRectangular) { +void ScintillaWin::InsertPasteText(const char *text, int len, int selStart, bool isRectangular, bool isLine) {  	if (isRectangular) {  		PasteRectangular(selStart, text, len);  	} else { +		char *convertedText = 0;  		if (convertPastes) {  			// Convert line endings of the paste into our local line-endings mode -			char *convertedString = Document::TransformLineEnds(&len, text, len, pdoc->eolMode); -			if (pdoc->InsertString(currentPos, convertedString, len)) { -				SetEmptySelection(currentPos + len); +			convertedText = Document::TransformLineEnds(&len, text, len, pdoc->eolMode); +			text = convertedText; +		} +		if (isLine) { +			int insertPos = pdoc->LineStart(pdoc->LineFromPosition(currentPos)); +			pdoc->InsertString(insertPos, text, len); +			// add the newline if necessary +			if ((len > 0) && (text[len-1] != '\n' && text[len-1] != '\r')) { +				const char *endline = StringFromEOLMode(pdoc->eolMode); +				pdoc->InsertString(insertPos + len, endline, strlen(endline)); +				len += strlen(endline);  			} -			delete []convertedString; -		} else { -			if (pdoc->InsertString(currentPos, text, len)) { +			if (currentPos == insertPos) {  				SetEmptySelection(currentPos + len);  			} +		} else if (pdoc->InsertString(currentPos, text, len)) { +			SetEmptySelection(currentPos + len);  		} +		delete []convertedText;  	}  } @@ -1306,6 +1328,7 @@ void ScintillaWin::Paste() {  	if (!::OpenClipboard(MainHWND()))  		return;  	pdoc->BeginUndoAction(); +	bool isLine = SelectionEmpty() && (::IsClipboardFormatAvailable(cfLineSelect) != 0);  	ClearSelection();  	int selStart = SelectionStart();  	bool isRectangular = ::IsClipboardFormatAvailable(cfColumnSelect) != 0; @@ -1340,7 +1363,7 @@ void ScintillaWin::Paste() {  			}  			if (putf) { -				InsertPasteText(putf, len, selStart, isRectangular); +				InsertPasteText(putf, len, selStart, isRectangular, isLine);  				delete []putf;  			}  		} @@ -1375,11 +1398,11 @@ void ScintillaWin::Paste() {  					delete []uptr;  					if (putf) { -						InsertPasteText(putf, mlen, selStart, isRectangular); +						InsertPasteText(putf, mlen, selStart, isRectangular, isLine);  						delete []putf;  					}  				} else { -					InsertPasteText(ptr, len, selStart, isRectangular); +					InsertPasteText(ptr, len, selStart, isRectangular, isLine);  				}  			}  			memSelection.Unlock(); @@ -1871,6 +1894,10 @@ void ScintillaWin::CopyToClipboard(const SelectionText &selectedText) {  		::SetClipboardData(cfColumnSelect, 0);  	} +	if (selectedText.lineCopy) { +		::SetClipboardData(cfLineSelect, 0); +	} +  	::CloseClipboard();  } | 
