aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Editor.cxx
diff options
context:
space:
mode:
authornyamatongwe <unknown>2001-06-11 11:31:26 +0000
committernyamatongwe <unknown>2001-06-11 11:31:26 +0000
commit1e8012568f397f9f59c729eed2d8a1ccee966519 (patch)
tree919a1244cb09819c9d9145b5d10951a420d07562 /src/Editor.cxx
parent11b107d831a9d9fddb3544fbe42439415eea00e9 (diff)
downloadscintilla-mirror-1e8012568f397f9f59c729eed2d8a1ccee966519.tar.gz
Patch from Shane Caraveo at ActiveState to notify containers of
Unicode code characters correctly.
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r--src/Editor.cxx55
1 files changed, 47 insertions, 8 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx
index b455376ae..52de15714 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -1350,6 +1350,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {
// Right column limit indicator
+
PRectangle rcBeyondEOF = rcClient;
rcBeyondEOF.left = vs.fixedColumnWidth;
rcBeyondEOF.right = rcBeyondEOF.right;
@@ -1549,6 +1550,7 @@ void Editor::SetScrollBarsTo(PRectangle) {
}
+
void Editor::SetScrollBars() {
PRectangle rsClient = GetClientRectangle();
SetScrollBarsTo(rsClient);
@@ -1577,7 +1579,38 @@ void Editor::AddCharUTF(char *s, unsigned int len) {
// Avoid blinking during rapid typing:
ShowCaretAtCurrentPosition();
SetLastXChosen();
- NotifyChar(s[0]);
+
+ int byte = static_cast<unsigned char>(s[0]);
+ if ((byte < 0xC0) || (1 == len)) {
+ // Handles UTF-8 characters between 0x01 and 0x7F and single byte
+ // characters when not in UTF-8 mode.
+ // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid
+ // characters representing themselves.
+ } else {
+ // Unroll 1 to 3 byte UTF-8 sequences. See reference data at:
+ // http://www.cl.cam.ac.uk/~mgk25/unicode.html
+ // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+ if (byte < 0xE0) {
+ int byte2 = static_cast<unsigned char>(s[1]);
+ if ((byte2 & 0xC0) == 0x80) {
+ // Two-byte-character lead-byte followed by a trail-byte.
+ byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F));
+ }
+ // A two-byte-character lead-byte not followed by trail-byte
+ // represents itself.
+ } else if (byte < 0xF0) {
+ int byte2 = static_cast<unsigned char>(s[1]);
+ int byte3 = static_cast<unsigned char>(s[2]);
+ if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) {
+ // Three-byte-character lead byte followed by two trail bytes.
+ byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) |
+ (byte3 & 0x3F));
+ }
+ // A three-byte-character lead-byte not followed by two trail-bytes
+ // represents itself.
+ }
+ }
+ NotifyChar(byte);
}
void Editor::ClearSelection() {
@@ -1753,7 +1786,7 @@ void Editor::NotifyStyleNeeded(Document*, void *, int endStyleNeeded) {
NotifyStyleToNeeded(endStyleNeeded);
}
-void Editor::NotifyChar(char ch) {
+void Editor::NotifyChar(int ch) {
SCNotification scn;
scn.nmhdr.code = SCN_CHARADDED;
scn.ch = ch;
@@ -1964,6 +1997,7 @@ void Editor::NotifyModified(Document*, DocModification mh, void *) {
}
+
SCNotification scn;
scn.nmhdr.code = SCN_MODIFIED;
scn.position = mh.position;
@@ -2059,6 +2093,7 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long
// printf("Filtered out %ld of macro recording\n", iMessage);
+
return ;
}
@@ -2262,7 +2297,7 @@ int Editor::KeyCommand(unsigned int iMessage) {
ShowCaretAtCurrentPosition();
NotifyUpdateUI();
break;
- case SCI_CANCEL: // Cancel any modes - handled in subclass
+ case SCI_CANCEL: // Cancel any modes - handled in subclass
// Also unselect text
CancelModes();
break;
@@ -2507,8 +2542,8 @@ void Editor::Indent(bool forwards) {
* @return The position of the found text, -1 if not found.
*/
long Editor::FindText(
- unsigned int iMessage, ///< Can be @c EM_FINDTEXT or @c EM_FINDTEXTEX or @c SCI_FINDTEXT.
- unsigned long wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+ unsigned int iMessage, ///< Can be @c EM_FINDTEXT or @c EM_FINDTEXTEX or @c SCI_FINDTEXT.
+ unsigned long wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
long lParam) { ///< @c TextToFind structure: The text to search for in the given range.
@@ -2550,8 +2585,8 @@ void Editor::SearchAnchor() {
* @return The position of the found text, -1 if not found.
*/
long Editor::SearchText(
- unsigned int iMessage, ///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV.
- unsigned long wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
+ unsigned int iMessage, ///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV.
+ unsigned long wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD,
///< @c SCFIND_WORDSTART or @c SCFIND_REGEXP.
long lParam) { ///< The text to search for.
@@ -2716,6 +2751,7 @@ void Editor::StartDrag() {
}
+
void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) {
//Platform::DebugPrintf("DropAt %d\n", inDragDrop);
if (inDragDrop)
@@ -2927,6 +2963,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b
}
+
SetDragPosition(invalidPosition);
SetMouseCapture(true);
selectionType = selLine;
@@ -3014,6 +3051,7 @@ void Editor::ButtonMove(Point pt) {
}
+
}
// Display regular (drag) cursor over selection
if (PointInSelection(pt))
@@ -3783,6 +3821,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
}
+
case EM_SELECTIONTYPE:
#ifdef SEL_EMPTY
if (currentPos == anchor)
@@ -4057,7 +4096,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
pdoc->SetStyleFor(wParam, static_cast<char>(lParam));
break;
- case SCI_SETSTYLINGEX: // Specify a complete styling buffer
+ case SCI_SETSTYLINGEX: // Specify a complete styling buffer
if (lParam == 0)
return 0;
pdoc->SetStyles(wParam, reinterpret_cast<char *>(lParam));