From 591ead2a919e892ca5253ab608ad91ab6abee030 Mon Sep 17 00:00:00 2001 From: cxl Date: Tue, 17 May 2011 11:21:55 +0000 Subject: [PATCH] CtrlLib: Improved selection in RichTextView tables git-svn-id: svn://ultimatepp.org/upp/trunk@3428 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/CtrlLib/RichTextView.cpp | 36 +++++++++------------------------ uppsrc/RichText/Txt.h | 2 +- uppsrc/RichText/TxtOp.cpp | 8 +++++--- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/uppsrc/CtrlLib/RichTextView.cpp b/uppsrc/CtrlLib/RichTextView.cpp index 207064d40..8b0dcccaa 100644 --- a/uppsrc/CtrlLib/RichTextView.cpp +++ b/uppsrc/CtrlLib/RichTextView.cpp @@ -96,14 +96,20 @@ Image RichTextView::CursorImage(Point p, dword keyflags) return Image::Arrow(); } - void RichTextView::Copy() { if(anchor == cursor) WriteClipboardUnicodeText(text.GetPlainText()); else { RefreshSel(); - WriteClipboardUnicodeText(text.Copy(sell, selh - sell).GetPlainText()); + WString h = text.GetPlainText(false).Mid(sell, selh - sell); + WString r; + for(const wchar *s = ~h; s < h.End(); s++) { + if(*s == '\n') + r.Cat('\r'); + r.Cat(*s); + } + WriteClipboardUnicodeText(r); } } @@ -156,30 +162,8 @@ void RichTextView::RefreshRange(int a, int b) void RichTextView::RefreshSel() { - int l = min(cursor, anchor); - int h = max(cursor, anchor); - if(l != h) { - for(;;) { - RichPos pl = text.GetRichPos(l); - if(!pl.table) - break; - l -= pl.posintab + 1; - if(l < 0) - break; - } - for(;;) { - RichPos ph = text.GetRichPos(h); - if(!ph.table) - break; - h += ph.tablen - ph.posintab + 1; - if(h >= text.GetLength()) - break; - } - if(l < 0) - l = 0; - if(h >= text.GetLength()) - h = text.GetLength(); - } + int l = minmax(min(cursor, anchor), 0, text.GetLength()); + int h = minmax(max(cursor, anchor), 0, text.GetLength()); if(sell == l && selh == h || sell == selh && l == h) return; RichPos pl = text.GetRichPos(l); diff --git a/uppsrc/RichText/Txt.h b/uppsrc/RichText/Txt.h index fd8e3b27c..a2cc402ef 100644 --- a/uppsrc/RichText/Txt.h +++ b/uppsrc/RichText/Txt.h @@ -227,7 +227,7 @@ public: void Normalize(); Vector GetAllLanguages() const; - WString GetPlainText() const; + WString GetPlainText(bool withcr = true) const; struct UpdateIterator { enum { CONTINUE = 0, STOP = 1, UPDATE = 2 }; diff --git a/uppsrc/RichText/TxtOp.cpp b/uppsrc/RichText/TxtOp.cpp index 286e95865..9cb85898f 100644 --- a/uppsrc/RichText/TxtOp.cpp +++ b/uppsrc/RichText/TxtOp.cpp @@ -285,11 +285,12 @@ void RichTxt::RestoreFormat(int pi, const Formating& info, int& ii, const RichSt } } -WString RichTxt::GetPlainText() const { +WString RichTxt::GetPlainText(bool withcr) const { WString clip; for(int pi = 0; pi < GetPartCount(); pi++) { if(pi) { - clip.Cat('\r'); + if(withcr) + clip.Cat('\r'); clip.Cat('\n'); } if(IsTable(pi)) { @@ -298,7 +299,8 @@ WString RichTxt::GetPlainText() const { for(int j = 0; j < tab.GetColumns(); j++) if(tab(i, j)) { if(i || j) { - clip.Cat('\r'); + if(withcr) + clip.Cat('\r'); clip.Cat('\n'); } clip << tab[i][j].text.GetPlainText();