xref: /MusicPlayer2/scintilla/src/ScintillaBase.cxx (revision f9763b28e6d019e8b836e436b68c871dc5256bb4)
18af74909SZhong Yang // Scintilla source code edit control
28af74909SZhong Yang /** @file ScintillaBase.cxx
38af74909SZhong Yang  ** An enhanced subclass of Editor with calltips, autocomplete and context menu.
48af74909SZhong Yang  **/
58af74909SZhong Yang // Copyright 1998-2003 by Neil Hodgson <[email protected]>
68af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
78af74909SZhong Yang 
88af74909SZhong Yang #include <cstddef>
98af74909SZhong Yang #include <cstdlib>
108af74909SZhong Yang #include <cassert>
118af74909SZhong Yang #include <cstring>
128af74909SZhong Yang 
138af74909SZhong Yang #include <stdexcept>
148af74909SZhong Yang #include <string>
158af74909SZhong Yang #include <string_view>
168af74909SZhong Yang #include <vector>
178af74909SZhong Yang #include <map>
188af74909SZhong Yang #include <algorithm>
198af74909SZhong Yang #include <memory>
208af74909SZhong Yang 
218af74909SZhong Yang #include "Platform.h"
228af74909SZhong Yang 
238af74909SZhong Yang #include "ILoader.h"
248af74909SZhong Yang #include "ILexer.h"
258af74909SZhong Yang #include "Scintilla.h"
268af74909SZhong Yang 
278af74909SZhong Yang #include "SciLexer.h"
288af74909SZhong Yang 
298af74909SZhong Yang #include "PropSetSimple.h"
308af74909SZhong Yang #include "CharacterCategory.h"
318af74909SZhong Yang 
328af74909SZhong Yang #include "LexerModule.h"
338af74909SZhong Yang #include "Catalogue.h"
348af74909SZhong Yang 
358af74909SZhong Yang #include "Position.h"
368af74909SZhong Yang #include "UniqueString.h"
378af74909SZhong Yang #include "SplitVector.h"
388af74909SZhong Yang #include "Partitioning.h"
398af74909SZhong Yang #include "RunStyles.h"
408af74909SZhong Yang #include "ContractionState.h"
418af74909SZhong Yang #include "CellBuffer.h"
428af74909SZhong Yang #include "CallTip.h"
438af74909SZhong Yang #include "KeyMap.h"
448af74909SZhong Yang #include "Indicator.h"
458af74909SZhong Yang #include "LineMarker.h"
468af74909SZhong Yang #include "Style.h"
478af74909SZhong Yang #include "ViewStyle.h"
488af74909SZhong Yang #include "CharClassify.h"
498af74909SZhong Yang #include "Decoration.h"
508af74909SZhong Yang #include "CaseFolder.h"
518af74909SZhong Yang #include "Document.h"
528af74909SZhong Yang #include "Selection.h"
538af74909SZhong Yang #include "PositionCache.h"
548af74909SZhong Yang #include "EditModel.h"
558af74909SZhong Yang #include "MarginView.h"
568af74909SZhong Yang #include "EditView.h"
578af74909SZhong Yang #include "Editor.h"
588af74909SZhong Yang #include "AutoComplete.h"
598af74909SZhong Yang #include "ScintillaBase.h"
608af74909SZhong Yang 
618af74909SZhong Yang #include "ExternalLexer.h"
628af74909SZhong Yang 
638af74909SZhong Yang #undef max
648af74909SZhong Yang #undef min
658af74909SZhong Yang 
668af74909SZhong Yang using namespace Scintilla;
678af74909SZhong Yang 
ScintillaBase()688af74909SZhong Yang ScintillaBase::ScintillaBase() {
698af74909SZhong Yang 	displayPopupMenu = SC_POPUP_ALL;
708af74909SZhong Yang 	listType = 0;
718af74909SZhong Yang 	maxListWidth = 0;
728af74909SZhong Yang 	multiAutoCMode = SC_MULTIAUTOC_ONCE;
738af74909SZhong Yang #ifdef SCI_LEXER
748af74909SZhong Yang 	Scintilla_LinkLexers();
758af74909SZhong Yang #endif
768af74909SZhong Yang }
778af74909SZhong Yang 
~ScintillaBase()788af74909SZhong Yang ScintillaBase::~ScintillaBase() {
798af74909SZhong Yang }
808af74909SZhong Yang 
Finalise()818af74909SZhong Yang void ScintillaBase::Finalise() {
828af74909SZhong Yang 	Editor::Finalise();
838af74909SZhong Yang 	popup.Destroy();
848af74909SZhong Yang }
858af74909SZhong Yang 
AddCharUTF(const char * s,unsigned int len,bool)868af74909SZhong Yang void ScintillaBase::AddCharUTF(const char *s, unsigned int len, bool /*treatAsDBCS*/) {
878af74909SZhong Yang 	InsertCharacter(std::string_view(s, len), CharacterSource::directInput);
888af74909SZhong Yang }
898af74909SZhong Yang 
InsertCharacter(std::string_view sv,CharacterSource charSource)908af74909SZhong Yang void ScintillaBase::InsertCharacter(std::string_view sv, CharacterSource charSource) {
918af74909SZhong Yang 	const bool isFillUp = ac.Active() && ac.IsFillUpChar(sv[0]);
928af74909SZhong Yang 	if (!isFillUp) {
938af74909SZhong Yang 		Editor::InsertCharacter(sv, charSource);
948af74909SZhong Yang 	}
958af74909SZhong Yang 	if (ac.Active()) {
968af74909SZhong Yang 		AutoCompleteCharacterAdded(sv[0]);
978af74909SZhong Yang 		// For fill ups add the character after the autocompletion has
988af74909SZhong Yang 		// triggered so containers see the key so can display a calltip.
998af74909SZhong Yang 		if (isFillUp) {
1008af74909SZhong Yang 			Editor::InsertCharacter(sv, charSource);
1018af74909SZhong Yang 		}
1028af74909SZhong Yang 	}
1038af74909SZhong Yang }
1048af74909SZhong Yang 
Command(int cmdId)1058af74909SZhong Yang void ScintillaBase::Command(int cmdId) {
1068af74909SZhong Yang 
1078af74909SZhong Yang 	switch (cmdId) {
1088af74909SZhong Yang 
1098af74909SZhong Yang 	case idAutoComplete:  	// Nothing to do
1108af74909SZhong Yang 
1118af74909SZhong Yang 		break;
1128af74909SZhong Yang 
1138af74909SZhong Yang 	case idCallTip:  	// Nothing to do
1148af74909SZhong Yang 
1158af74909SZhong Yang 		break;
1168af74909SZhong Yang 
1178af74909SZhong Yang 	case idcmdUndo:
1188af74909SZhong Yang 		WndProc(SCI_UNDO, 0, 0);
1198af74909SZhong Yang 		break;
1208af74909SZhong Yang 
1218af74909SZhong Yang 	case idcmdRedo:
1228af74909SZhong Yang 		WndProc(SCI_REDO, 0, 0);
1238af74909SZhong Yang 		break;
1248af74909SZhong Yang 
1258af74909SZhong Yang 	case idcmdCut:
1268af74909SZhong Yang 		WndProc(SCI_CUT, 0, 0);
1278af74909SZhong Yang 		break;
1288af74909SZhong Yang 
1298af74909SZhong Yang 	case idcmdCopy:
1308af74909SZhong Yang 		WndProc(SCI_COPY, 0, 0);
1318af74909SZhong Yang 		break;
1328af74909SZhong Yang 
1338af74909SZhong Yang 	case idcmdPaste:
1348af74909SZhong Yang 		WndProc(SCI_PASTE, 0, 0);
1358af74909SZhong Yang 		break;
1368af74909SZhong Yang 
1378af74909SZhong Yang 	case idcmdDelete:
1388af74909SZhong Yang 		WndProc(SCI_CLEAR, 0, 0);
1398af74909SZhong Yang 		break;
1408af74909SZhong Yang 
1418af74909SZhong Yang 	case idcmdSelectAll:
1428af74909SZhong Yang 		WndProc(SCI_SELECTALL, 0, 0);
1438af74909SZhong Yang 		break;
1448af74909SZhong Yang 	}
1458af74909SZhong Yang }
1468af74909SZhong Yang 
KeyCommand(unsigned int iMessage)1478af74909SZhong Yang int ScintillaBase::KeyCommand(unsigned int iMessage) {
1488af74909SZhong Yang 	// Most key commands cancel autocompletion mode
1498af74909SZhong Yang 	if (ac.Active()) {
1508af74909SZhong Yang 		switch (iMessage) {
1518af74909SZhong Yang 			// Except for these
1528af74909SZhong Yang 		case SCI_LINEDOWN:
1538af74909SZhong Yang 			AutoCompleteMove(1);
1548af74909SZhong Yang 			return 0;
1558af74909SZhong Yang 		case SCI_LINEUP:
1568af74909SZhong Yang 			AutoCompleteMove(-1);
1578af74909SZhong Yang 			return 0;
1588af74909SZhong Yang 		case SCI_PAGEDOWN:
1598af74909SZhong Yang 			AutoCompleteMove(ac.lb->GetVisibleRows());
1608af74909SZhong Yang 			return 0;
1618af74909SZhong Yang 		case SCI_PAGEUP:
1628af74909SZhong Yang 			AutoCompleteMove(-ac.lb->GetVisibleRows());
1638af74909SZhong Yang 			return 0;
1648af74909SZhong Yang 		case SCI_VCHOME:
1658af74909SZhong Yang 			AutoCompleteMove(-5000);
1668af74909SZhong Yang 			return 0;
1678af74909SZhong Yang 		case SCI_LINEEND:
1688af74909SZhong Yang 			AutoCompleteMove(5000);
1698af74909SZhong Yang 			return 0;
1708af74909SZhong Yang 		case SCI_DELETEBACK:
1718af74909SZhong Yang 			DelCharBack(true);
1728af74909SZhong Yang 			AutoCompleteCharacterDeleted();
1738af74909SZhong Yang 			EnsureCaretVisible();
1748af74909SZhong Yang 			return 0;
1758af74909SZhong Yang 		case SCI_DELETEBACKNOTLINE:
1768af74909SZhong Yang 			DelCharBack(false);
1778af74909SZhong Yang 			AutoCompleteCharacterDeleted();
1788af74909SZhong Yang 			EnsureCaretVisible();
1798af74909SZhong Yang 			return 0;
1808af74909SZhong Yang 		case SCI_TAB:
1818af74909SZhong Yang 			AutoCompleteCompleted(0, SC_AC_TAB);
1828af74909SZhong Yang 			return 0;
1838af74909SZhong Yang 		case SCI_NEWLINE:
1848af74909SZhong Yang 			AutoCompleteCompleted(0, SC_AC_NEWLINE);
1858af74909SZhong Yang 			return 0;
1868af74909SZhong Yang 
1878af74909SZhong Yang 		default:
1888af74909SZhong Yang 			AutoCompleteCancel();
1898af74909SZhong Yang 		}
1908af74909SZhong Yang 	}
1918af74909SZhong Yang 
1928af74909SZhong Yang 	if (ct.inCallTipMode) {
1938af74909SZhong Yang 		if (
1948af74909SZhong Yang 		    (iMessage != SCI_CHARLEFT) &&
1958af74909SZhong Yang 		    (iMessage != SCI_CHARLEFTEXTEND) &&
1968af74909SZhong Yang 		    (iMessage != SCI_CHARRIGHT) &&
1978af74909SZhong Yang 		    (iMessage != SCI_CHARRIGHTEXTEND) &&
1988af74909SZhong Yang 		    (iMessage != SCI_EDITTOGGLEOVERTYPE) &&
1998af74909SZhong Yang 		    (iMessage != SCI_DELETEBACK) &&
2008af74909SZhong Yang 		    (iMessage != SCI_DELETEBACKNOTLINE)
2018af74909SZhong Yang 		) {
2028af74909SZhong Yang 			ct.CallTipCancel();
2038af74909SZhong Yang 		}
2048af74909SZhong Yang 		if ((iMessage == SCI_DELETEBACK) || (iMessage == SCI_DELETEBACKNOTLINE)) {
2058af74909SZhong Yang 			if (sel.MainCaret() <= ct.posStartCallTip) {
2068af74909SZhong Yang 				ct.CallTipCancel();
2078af74909SZhong Yang 			}
2088af74909SZhong Yang 		}
2098af74909SZhong Yang 	}
2108af74909SZhong Yang 	return Editor::KeyCommand(iMessage);
2118af74909SZhong Yang }
2128af74909SZhong Yang 
ListNotify(ListBoxEvent * plbe)2138af74909SZhong Yang void ScintillaBase::ListNotify(ListBoxEvent *plbe) {
2148af74909SZhong Yang 	switch (plbe->event) {
2158af74909SZhong Yang 	case ListBoxEvent::EventType::selectionChange:
2168af74909SZhong Yang 		AutoCompleteSelection();
2178af74909SZhong Yang 		break;
2188af74909SZhong Yang 	case ListBoxEvent::EventType::doubleClick:
2198af74909SZhong Yang 		AutoCompleteCompleted(0, SC_AC_DOUBLECLICK);
2208af74909SZhong Yang 		break;
2218af74909SZhong Yang 	}
2228af74909SZhong Yang }
2238af74909SZhong Yang 
AutoCompleteInsert(Sci::Position startPos,Sci::Position removeLen,const char * text,Sci::Position textLen)2248af74909SZhong Yang void ScintillaBase::AutoCompleteInsert(Sci::Position startPos, Sci::Position removeLen, const char *text, Sci::Position textLen) {
2258af74909SZhong Yang 	UndoGroup ug(pdoc);
2268af74909SZhong Yang 	if (multiAutoCMode == SC_MULTIAUTOC_ONCE) {
2278af74909SZhong Yang 		pdoc->DeleteChars(startPos, removeLen);
2288af74909SZhong Yang 		const Sci::Position lengthInserted = pdoc->InsertString(startPos, text, textLen);
2298af74909SZhong Yang 		SetEmptySelection(startPos + lengthInserted);
2308af74909SZhong Yang 	} else {
2318af74909SZhong Yang 		// SC_MULTIAUTOC_EACH
2328af74909SZhong Yang 		for (size_t r=0; r<sel.Count(); r++) {
2338af74909SZhong Yang 			if (!RangeContainsProtected(sel.Range(r).Start().Position(),
2348af74909SZhong Yang 				sel.Range(r).End().Position())) {
2358af74909SZhong Yang 				Sci::Position positionInsert = sel.Range(r).Start().Position();
2368af74909SZhong Yang 				positionInsert = RealizeVirtualSpace(positionInsert, sel.Range(r).caret.VirtualSpace());
2378af74909SZhong Yang 				if (positionInsert - removeLen >= 0) {
2388af74909SZhong Yang 					positionInsert -= removeLen;
2398af74909SZhong Yang 					pdoc->DeleteChars(positionInsert, removeLen);
2408af74909SZhong Yang 				}
2418af74909SZhong Yang 				const Sci::Position lengthInserted = pdoc->InsertString(positionInsert, text, textLen);
2428af74909SZhong Yang 				if (lengthInserted > 0) {
2438af74909SZhong Yang 					sel.Range(r).caret.SetPosition(positionInsert + lengthInserted);
2448af74909SZhong Yang 					sel.Range(r).anchor.SetPosition(positionInsert + lengthInserted);
2458af74909SZhong Yang 				}
2468af74909SZhong Yang 				sel.Range(r).ClearVirtualSpace();
2478af74909SZhong Yang 			}
2488af74909SZhong Yang 		}
2498af74909SZhong Yang 	}
2508af74909SZhong Yang }
2518af74909SZhong Yang 
AutoCompleteStart(Sci::Position lenEntered,const char * list)2528af74909SZhong Yang void ScintillaBase::AutoCompleteStart(Sci::Position lenEntered, const char *list) {
2538af74909SZhong Yang 	//Platform::DebugPrintf("AutoComplete %s\n", list);
2548af74909SZhong Yang 	ct.CallTipCancel();
2558af74909SZhong Yang 
2568af74909SZhong Yang 	if (ac.chooseSingle && (listType == 0)) {
2578af74909SZhong Yang 		if (list && !strchr(list, ac.GetSeparator())) {
2588af74909SZhong Yang 			const char *typeSep = strchr(list, ac.GetTypesep());
2598af74909SZhong Yang 			const Sci::Position lenInsert = typeSep ?
2608af74909SZhong Yang 				(typeSep-list) : strlen(list);
2618af74909SZhong Yang 			if (ac.ignoreCase) {
2628af74909SZhong Yang 				// May need to convert the case before invocation, so remove lenEntered characters
2638af74909SZhong Yang 				AutoCompleteInsert(sel.MainCaret() - lenEntered, lenEntered, list, lenInsert);
2648af74909SZhong Yang 			} else {
2658af74909SZhong Yang 				AutoCompleteInsert(sel.MainCaret(), 0, list + lenEntered, lenInsert - lenEntered);
2668af74909SZhong Yang 			}
2678af74909SZhong Yang 			ac.Cancel();
2688af74909SZhong Yang 			return;
2698af74909SZhong Yang 		}
2708af74909SZhong Yang 	}
2718af74909SZhong Yang 	ac.Start(wMain, idAutoComplete, sel.MainCaret(), PointMainCaret(),
2728af74909SZhong Yang 				lenEntered, vs.lineHeight, IsUnicodeMode(), technology);
2738af74909SZhong Yang 
2748af74909SZhong Yang 	const PRectangle rcClient = GetClientRectangle();
2758af74909SZhong Yang 	Point pt = LocationFromPosition(sel.MainCaret() - lenEntered);
2768af74909SZhong Yang 	PRectangle rcPopupBounds = wMain.GetMonitorRect(pt);
2778af74909SZhong Yang 	if (rcPopupBounds.Height() == 0)
2788af74909SZhong Yang 		rcPopupBounds = rcClient;
2798af74909SZhong Yang 
2808af74909SZhong Yang 	int heightLB = ac.heightLBDefault;
2818af74909SZhong Yang 	int widthLB = ac.widthLBDefault;
2828af74909SZhong Yang 	if (pt.x >= rcClient.right - widthLB) {
2838af74909SZhong Yang 		HorizontalScrollTo(static_cast<int>(xOffset + pt.x - rcClient.right + widthLB));
2848af74909SZhong Yang 		Redraw();
2858af74909SZhong Yang 		pt = PointMainCaret();
2868af74909SZhong Yang 	}
2878af74909SZhong Yang 	if (wMargin.Created()) {
2888af74909SZhong Yang 		pt = pt + GetVisibleOriginInMain();
2898af74909SZhong Yang 	}
2908af74909SZhong Yang 	PRectangle rcac;
2918af74909SZhong Yang 	rcac.left = pt.x - ac.lb->CaretFromEdge();
2928af74909SZhong Yang 	if (pt.y >= rcPopupBounds.bottom - heightLB &&  // Won't fit below.
2938af74909SZhong Yang 	        pt.y >= (rcPopupBounds.bottom + rcPopupBounds.top) / 2) { // and there is more room above.
2948af74909SZhong Yang 		rcac.top = pt.y - heightLB;
2958af74909SZhong Yang 		if (rcac.top < rcPopupBounds.top) {
2968af74909SZhong Yang 			heightLB -= static_cast<int>(rcPopupBounds.top - rcac.top);
2978af74909SZhong Yang 			rcac.top = rcPopupBounds.top;
2988af74909SZhong Yang 		}
2998af74909SZhong Yang 	} else {
3008af74909SZhong Yang 		rcac.top = pt.y + vs.lineHeight;
3018af74909SZhong Yang 	}
3028af74909SZhong Yang 	rcac.right = rcac.left + widthLB;
3038af74909SZhong Yang 	rcac.bottom = static_cast<XYPOSITION>(std::min(static_cast<int>(rcac.top) + heightLB, static_cast<int>(rcPopupBounds.bottom)));
3048af74909SZhong Yang 	ac.lb->SetPositionRelative(rcac, &wMain);
3058af74909SZhong Yang 	ac.lb->SetFont(vs.styles[STYLE_DEFAULT].font);
3068af74909SZhong Yang 	const unsigned int aveCharWidth = static_cast<unsigned int>(vs.styles[STYLE_DEFAULT].aveCharWidth);
3078af74909SZhong Yang 	ac.lb->SetAverageCharWidth(aveCharWidth);
3088af74909SZhong Yang 	ac.lb->SetDelegate(this);
3098af74909SZhong Yang 
3108af74909SZhong Yang 	ac.SetList(list ? list : "");
3118af74909SZhong Yang 
3128af74909SZhong Yang 	// Fiddle the position of the list so it is right next to the target and wide enough for all its strings
3138af74909SZhong Yang 	PRectangle rcList = ac.lb->GetDesiredRect();
3148af74909SZhong Yang 	const int heightAlloced = static_cast<int>(rcList.bottom - rcList.top);
3158af74909SZhong Yang 	widthLB = std::max(widthLB, static_cast<int>(rcList.right - rcList.left));
3168af74909SZhong Yang 	if (maxListWidth != 0)
3178af74909SZhong Yang 		widthLB = std::min(widthLB, static_cast<int>(aveCharWidth)*maxListWidth);
3188af74909SZhong Yang 	// Make an allowance for large strings in list
3198af74909SZhong Yang 	rcList.left = pt.x - ac.lb->CaretFromEdge();
3208af74909SZhong Yang 	rcList.right = rcList.left + widthLB;
3218af74909SZhong Yang 	if (((pt.y + vs.lineHeight) >= (rcPopupBounds.bottom - heightAlloced)) &&  // Won't fit below.
3228af74909SZhong Yang 	        ((pt.y + vs.lineHeight / 2) >= (rcPopupBounds.bottom + rcPopupBounds.top) / 2)) { // and there is more room above.
3238af74909SZhong Yang 		rcList.top = pt.y - heightAlloced;
3248af74909SZhong Yang 	} else {
3258af74909SZhong Yang 		rcList.top = pt.y + vs.lineHeight;
3268af74909SZhong Yang 	}
3278af74909SZhong Yang 	rcList.bottom = rcList.top + heightAlloced;
3288af74909SZhong Yang 	ac.lb->SetPositionRelative(rcList, &wMain);
3298af74909SZhong Yang 	ac.Show(true);
3308af74909SZhong Yang 	if (lenEntered != 0) {
3318af74909SZhong Yang 		AutoCompleteMoveToCurrentWord();
3328af74909SZhong Yang 	}
3338af74909SZhong Yang }
3348af74909SZhong Yang 
AutoCompleteCancel()3358af74909SZhong Yang void ScintillaBase::AutoCompleteCancel() {
3368af74909SZhong Yang 	if (ac.Active()) {
3378af74909SZhong Yang 		SCNotification scn = {};
3388af74909SZhong Yang 		scn.nmhdr.code = SCN_AUTOCCANCELLED;
3398af74909SZhong Yang 		scn.wParam = 0;
3408af74909SZhong Yang 		scn.listType = 0;
3418af74909SZhong Yang 		NotifyParent(scn);
3428af74909SZhong Yang 	}
3438af74909SZhong Yang 	ac.Cancel();
3448af74909SZhong Yang }
3458af74909SZhong Yang 
AutoCompleteMove(int delta)3468af74909SZhong Yang void ScintillaBase::AutoCompleteMove(int delta) {
3478af74909SZhong Yang 	ac.Move(delta);
3488af74909SZhong Yang }
3498af74909SZhong Yang 
AutoCompleteMoveToCurrentWord()3508af74909SZhong Yang void ScintillaBase::AutoCompleteMoveToCurrentWord() {
3518af74909SZhong Yang 	std::string wordCurrent = RangeText(ac.posStart - ac.startLen, sel.MainCaret());
3528af74909SZhong Yang 	ac.Select(wordCurrent.c_str());
3538af74909SZhong Yang }
3548af74909SZhong Yang 
AutoCompleteSelection()3558af74909SZhong Yang void ScintillaBase::AutoCompleteSelection() {
3568af74909SZhong Yang 	const int item = ac.GetSelection();
3578af74909SZhong Yang 	std::string selected;
3588af74909SZhong Yang 	if (item != -1) {
3598af74909SZhong Yang 		selected = ac.GetValue(item);
3608af74909SZhong Yang 	}
3618af74909SZhong Yang 
3628af74909SZhong Yang 	SCNotification scn = {};
3638af74909SZhong Yang 	scn.nmhdr.code = SCN_AUTOCSELECTIONCHANGE;
3648af74909SZhong Yang 	scn.message = 0;
3658af74909SZhong Yang 	scn.wParam = listType;
3668af74909SZhong Yang 	scn.listType = listType;
3678af74909SZhong Yang 	const Sci::Position firstPos = ac.posStart - ac.startLen;
3688af74909SZhong Yang 	scn.position = firstPos;
3698af74909SZhong Yang 	scn.lParam = firstPos;
3708af74909SZhong Yang 	scn.text = selected.c_str();
3718af74909SZhong Yang 	NotifyParent(scn);
3728af74909SZhong Yang }
3738af74909SZhong Yang 
AutoCompleteCharacterAdded(char ch)3748af74909SZhong Yang void ScintillaBase::AutoCompleteCharacterAdded(char ch) {
3758af74909SZhong Yang 	if (ac.IsFillUpChar(ch)) {
3768af74909SZhong Yang 		AutoCompleteCompleted(ch, SC_AC_FILLUP);
3778af74909SZhong Yang 	} else if (ac.IsStopChar(ch)) {
3788af74909SZhong Yang 		AutoCompleteCancel();
3798af74909SZhong Yang 	} else {
3808af74909SZhong Yang 		AutoCompleteMoveToCurrentWord();
3818af74909SZhong Yang 	}
3828af74909SZhong Yang }
3838af74909SZhong Yang 
AutoCompleteCharacterDeleted()3848af74909SZhong Yang void ScintillaBase::AutoCompleteCharacterDeleted() {
3858af74909SZhong Yang 	if (sel.MainCaret() < ac.posStart - ac.startLen) {
3868af74909SZhong Yang 		AutoCompleteCancel();
3878af74909SZhong Yang 	} else if (ac.cancelAtStartPos && (sel.MainCaret() <= ac.posStart)) {
3888af74909SZhong Yang 		AutoCompleteCancel();
3898af74909SZhong Yang 	} else {
3908af74909SZhong Yang 		AutoCompleteMoveToCurrentWord();
3918af74909SZhong Yang 	}
3928af74909SZhong Yang 	SCNotification scn = {};
3938af74909SZhong Yang 	scn.nmhdr.code = SCN_AUTOCCHARDELETED;
3948af74909SZhong Yang 	scn.wParam = 0;
3958af74909SZhong Yang 	scn.listType = 0;
3968af74909SZhong Yang 	NotifyParent(scn);
3978af74909SZhong Yang }
3988af74909SZhong Yang 
AutoCompleteCompleted(char ch,unsigned int completionMethod)3998af74909SZhong Yang void ScintillaBase::AutoCompleteCompleted(char ch, unsigned int completionMethod) {
4008af74909SZhong Yang 	const int item = ac.GetSelection();
4018af74909SZhong Yang 	if (item == -1) {
4028af74909SZhong Yang 		AutoCompleteCancel();
4038af74909SZhong Yang 		return;
4048af74909SZhong Yang 	}
4058af74909SZhong Yang 	const std::string selected = ac.GetValue(item);
4068af74909SZhong Yang 
4078af74909SZhong Yang 	ac.Show(false);
4088af74909SZhong Yang 
4098af74909SZhong Yang 	SCNotification scn = {};
4108af74909SZhong Yang 	scn.nmhdr.code = listType > 0 ? SCN_USERLISTSELECTION : SCN_AUTOCSELECTION;
4118af74909SZhong Yang 	scn.message = 0;
4128af74909SZhong Yang 	scn.ch = ch;
4138af74909SZhong Yang 	scn.listCompletionMethod = completionMethod;
4148af74909SZhong Yang 	scn.wParam = listType;
4158af74909SZhong Yang 	scn.listType = listType;
4168af74909SZhong Yang 	const Sci::Position firstPos = ac.posStart - ac.startLen;
4178af74909SZhong Yang 	scn.position = firstPos;
4188af74909SZhong Yang 	scn.lParam = firstPos;
4198af74909SZhong Yang 	scn.text = selected.c_str();
4208af74909SZhong Yang 	NotifyParent(scn);
4218af74909SZhong Yang 
4228af74909SZhong Yang 	if (!ac.Active())
4238af74909SZhong Yang 		return;
4248af74909SZhong Yang 	ac.Cancel();
4258af74909SZhong Yang 
4268af74909SZhong Yang 	if (listType > 0)
4278af74909SZhong Yang 		return;
4288af74909SZhong Yang 
4298af74909SZhong Yang 	Sci::Position endPos = sel.MainCaret();
4308af74909SZhong Yang 	if (ac.dropRestOfWord)
4318af74909SZhong Yang 		endPos = pdoc->ExtendWordSelect(endPos, 1, true);
4328af74909SZhong Yang 	if (endPos < firstPos)
4338af74909SZhong Yang 		return;
4348af74909SZhong Yang 	AutoCompleteInsert(firstPos, endPos - firstPos, selected.c_str(), selected.length());
4358af74909SZhong Yang 	SetLastXChosen();
4368af74909SZhong Yang 
4378af74909SZhong Yang 	scn.nmhdr.code = SCN_AUTOCCOMPLETED;
4388af74909SZhong Yang 	NotifyParent(scn);
4398af74909SZhong Yang 
4408af74909SZhong Yang }
4418af74909SZhong Yang 
AutoCompleteGetCurrent() const4428af74909SZhong Yang int ScintillaBase::AutoCompleteGetCurrent() const {
4438af74909SZhong Yang 	if (!ac.Active())
4448af74909SZhong Yang 		return -1;
4458af74909SZhong Yang 	return ac.GetSelection();
4468af74909SZhong Yang }
4478af74909SZhong Yang 
AutoCompleteGetCurrentText(char * buffer) const4488af74909SZhong Yang int ScintillaBase::AutoCompleteGetCurrentText(char *buffer) const {
4498af74909SZhong Yang 	if (ac.Active()) {
4508af74909SZhong Yang 		const int item = ac.GetSelection();
4518af74909SZhong Yang 		if (item != -1) {
4528af74909SZhong Yang 			const std::string selected = ac.GetValue(item);
4538af74909SZhong Yang 			if (buffer)
4548af74909SZhong Yang 				memcpy(buffer, selected.c_str(), selected.length()+1);
4558af74909SZhong Yang 			return static_cast<int>(selected.length());
4568af74909SZhong Yang 		}
4578af74909SZhong Yang 	}
4588af74909SZhong Yang 	if (buffer)
4598af74909SZhong Yang 		*buffer = '\0';
4608af74909SZhong Yang 	return 0;
4618af74909SZhong Yang }
4628af74909SZhong Yang 
CallTipShow(Point pt,const char * defn)4638af74909SZhong Yang void ScintillaBase::CallTipShow(Point pt, const char *defn) {
4648af74909SZhong Yang 	ac.Cancel();
4658af74909SZhong Yang 	// If container knows about STYLE_CALLTIP then use it in place of the
4668af74909SZhong Yang 	// STYLE_DEFAULT for the face name, size and character set. Also use it
4678af74909SZhong Yang 	// for the foreground and background colour.
4688af74909SZhong Yang 	const int ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT;
4698af74909SZhong Yang 	if (ct.UseStyleCallTip()) {
4708af74909SZhong Yang 		ct.SetForeBack(vs.styles[STYLE_CALLTIP].fore, vs.styles[STYLE_CALLTIP].back);
4718af74909SZhong Yang 	}
4728af74909SZhong Yang 	if (wMargin.Created()) {
4738af74909SZhong Yang 		pt = pt + GetVisibleOriginInMain();
4748af74909SZhong Yang 	}
4758af74909SZhong Yang 	PRectangle rc = ct.CallTipStart(sel.MainCaret(), pt,
4768af74909SZhong Yang 		vs.lineHeight,
4778af74909SZhong Yang 		defn,
4788af74909SZhong Yang 		vs.styles[ctStyle].fontName,
4798af74909SZhong Yang 		vs.styles[ctStyle].sizeZoomed,
4808af74909SZhong Yang 		CodePage(),
4818af74909SZhong Yang 		vs.styles[ctStyle].characterSet,
4828af74909SZhong Yang 		vs.technology,
4838af74909SZhong Yang 		wMain);
4848af74909SZhong Yang 	// If the call-tip window would be out of the client
4858af74909SZhong Yang 	// space
4868af74909SZhong Yang 	const PRectangle rcClient = GetClientRectangle();
4878af74909SZhong Yang 	const int offset = vs.lineHeight + static_cast<int>(rc.Height());
4888af74909SZhong Yang 	// adjust so it displays above the text.
4898af74909SZhong Yang 	if (rc.bottom > rcClient.bottom && rc.Height() < rcClient.Height()) {
4908af74909SZhong Yang 		rc.top -= offset;
4918af74909SZhong Yang 		rc.bottom -= offset;
4928af74909SZhong Yang 	}
4938af74909SZhong Yang 	// adjust so it displays below the text.
4948af74909SZhong Yang 	if (rc.top < rcClient.top && rc.Height() < rcClient.Height()) {
4958af74909SZhong Yang 		rc.top += offset;
4968af74909SZhong Yang 		rc.bottom += offset;
4978af74909SZhong Yang 	}
4988af74909SZhong Yang 	// Now display the window.
4998af74909SZhong Yang 	CreateCallTipWindow(rc);
5008af74909SZhong Yang 	ct.wCallTip.SetPositionRelative(rc, &wMain);
5018af74909SZhong Yang 	ct.wCallTip.Show();
5028af74909SZhong Yang }
5038af74909SZhong Yang 
CallTipClick()5048af74909SZhong Yang void ScintillaBase::CallTipClick() {
5058af74909SZhong Yang 	SCNotification scn = {};
5068af74909SZhong Yang 	scn.nmhdr.code = SCN_CALLTIPCLICK;
5078af74909SZhong Yang 	scn.position = ct.clickPlace;
5088af74909SZhong Yang 	NotifyParent(scn);
5098af74909SZhong Yang }
5108af74909SZhong Yang 
ShouldDisplayPopup(Point ptInWindowCoordinates) const5118af74909SZhong Yang bool ScintillaBase::ShouldDisplayPopup(Point ptInWindowCoordinates) const {
5128af74909SZhong Yang 	return (displayPopupMenu == SC_POPUP_ALL ||
5138af74909SZhong Yang 		(displayPopupMenu == SC_POPUP_TEXT && !PointInSelMargin(ptInWindowCoordinates)));
5148af74909SZhong Yang }
5158af74909SZhong Yang 
ContextMenu(Point pt)5168af74909SZhong Yang void ScintillaBase::ContextMenu(Point pt) {
517*f9763b28Slrisora     auto LoadText = [this](const std::wstring& key) -> std::wstring {
518*f9763b28Slrisora         if (menuStringTable != nullptr) {
519*f9763b28Slrisora             auto it = menuStringTable->find(key);
520*f9763b28Slrisora             if (it != menuStringTable->end()) {
521*f9763b28Slrisora                 return it->second;
522*f9763b28Slrisora             }
523*f9763b28Slrisora         }
524*f9763b28Slrisora         return L"";
525*f9763b28Slrisora     };  // 此方法依赖menuStringTable,不适合作为全局函数
5268af74909SZhong Yang 	if (displayPopupMenu) {
5278af74909SZhong Yang 		const bool writable = !WndProc(SCI_GETREADONLY, 0, 0);
5288af74909SZhong Yang 		popup.CreatePopUp();
529*f9763b28Slrisora         std::wstring temp;
530*f9763b28Slrisora         temp = LoadText(L"TXT_SCI_UNDO");
531*f9763b28Slrisora         AddToPopUp(((temp.empty() ? L"Undo" : temp) + L"\tCtrl+Z").c_str(), idcmdUndo, writable&& pdoc->CanUndo());
532*f9763b28Slrisora         temp = LoadText(L"TXT_SCI_REDO");
533*f9763b28Slrisora         AddToPopUp(((temp.empty() ? L"Redo" : temp) + L"\tCtrl+Y").c_str(), idcmdRedo, writable && pdoc->CanRedo());
534*f9763b28Slrisora         AddToPopUp(L"");
535*f9763b28Slrisora         temp = LoadText(L"TXT_SCI_CUT");
536*f9763b28Slrisora         AddToPopUp(((temp.empty() ? L"Cut" : temp) + L"\tCtrl+X").c_str(), idcmdCut, writable && !sel.Empty());
537*f9763b28Slrisora         temp = LoadText(L"TXT_SCI_COPY");
538*f9763b28Slrisora         AddToPopUp(((temp.empty() ? L"Copy" : temp) + L"\tCtrl+C").c_str(), idcmdCopy, !sel.Empty());
539*f9763b28Slrisora         temp = LoadText(L"TXT_SCI_PASTE");
540*f9763b28Slrisora         AddToPopUp(((temp.empty() ? L"Paste" : temp) + L"\tCtrl+V").c_str(), idcmdPaste, writable && WndProc(SCI_CANPASTE, 0, 0));
541*f9763b28Slrisora         temp = LoadText(L"TXT_SCI_DELETE");
542*f9763b28Slrisora         AddToPopUp((temp.empty() ? L"Clear" : temp).c_str(), idcmdDelete, writable && !sel.Empty());
543*f9763b28Slrisora         AddToPopUp(L"");
544*f9763b28Slrisora         temp = LoadText(L"TXT_SCI_SELECT_ALL");
545*f9763b28Slrisora         AddToPopUp(((temp.empty() ? L"Select All" : temp) + L"\tCtrl+A").c_str(), idcmdSelectAll);
5468af74909SZhong Yang         popup.Show(pt, wMain);
5478af74909SZhong Yang 	}
5488af74909SZhong Yang }
5498af74909SZhong Yang 
CancelModes()5508af74909SZhong Yang void ScintillaBase::CancelModes() {
5518af74909SZhong Yang 	AutoCompleteCancel();
5528af74909SZhong Yang 	ct.CallTipCancel();
5538af74909SZhong Yang 	Editor::CancelModes();
5548af74909SZhong Yang }
5558af74909SZhong Yang 
ButtonDownWithModifiers(Point pt,unsigned int curTime,int modifiers)5568af74909SZhong Yang void ScintillaBase::ButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers) {
5578af74909SZhong Yang 	CancelModes();
5588af74909SZhong Yang 	Editor::ButtonDownWithModifiers(pt, curTime, modifiers);
5598af74909SZhong Yang }
5608af74909SZhong Yang 
RightButtonDownWithModifiers(Point pt,unsigned int curTime,int modifiers)5618af74909SZhong Yang void ScintillaBase::RightButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers) {
5628af74909SZhong Yang 	CancelModes();
5638af74909SZhong Yang 	Editor::RightButtonDownWithModifiers(pt, curTime, modifiers);
5648af74909SZhong Yang }
5658af74909SZhong Yang 
5668af74909SZhong Yang namespace Scintilla {
5678af74909SZhong Yang 
5688af74909SZhong Yang class LexState : public LexInterface {
5698af74909SZhong Yang 	const LexerModule *lexCurrent;
5708af74909SZhong Yang 	void SetLexerModule(const LexerModule *lex);
5718af74909SZhong Yang 	PropSetSimple props;
5728af74909SZhong Yang 	int interfaceVersion;
5738af74909SZhong Yang public:
5748af74909SZhong Yang 	int lexLanguage;
5758af74909SZhong Yang 
5768af74909SZhong Yang 	explicit LexState(Document *pdoc_);
5778af74909SZhong Yang 	void SetInstance(ILexer5 *instance_);
5788af74909SZhong Yang 	// Deleted so LexState objects can not be copied.
5798af74909SZhong Yang 	LexState(const LexState &) = delete;
5808af74909SZhong Yang 	LexState(LexState &&) = delete;
5818af74909SZhong Yang 	LexState &operator=(const LexState &) = delete;
5828af74909SZhong Yang 	LexState &operator=(LexState &&) = delete;
5838af74909SZhong Yang 	~LexState() override;
5848af74909SZhong Yang 	void SetLexer(uptr_t wParam);
5858af74909SZhong Yang 	void SetLexerLanguage(const char *languageName);
5868af74909SZhong Yang 
5878af74909SZhong Yang 	const char *DescribeWordListSets();
5888af74909SZhong Yang 	void SetWordList(int n, const char *wl);
5898af74909SZhong Yang 	int GetIdentifier() const;
5908af74909SZhong Yang 	const char *GetName() const;
5918af74909SZhong Yang 	void *PrivateCall(int operation, void *pointer);
5928af74909SZhong Yang 	const char *PropertyNames();
5938af74909SZhong Yang 	int PropertyType(const char *name);
5948af74909SZhong Yang 	const char *DescribeProperty(const char *name);
5958af74909SZhong Yang 	void PropSet(const char *key, const char *val);
5968af74909SZhong Yang 	const char *PropGet(const char *key) const;
5978af74909SZhong Yang 	int PropGetInt(const char *key, int defaultValue=0) const;
5988af74909SZhong Yang 	size_t PropGetExpanded(const char *key, char *result) const;
5998af74909SZhong Yang 
6008af74909SZhong Yang 	int LineEndTypesSupported() override;
6018af74909SZhong Yang 	int AllocateSubStyles(int styleBase, int numberStyles);
6028af74909SZhong Yang 	int SubStylesStart(int styleBase);
6038af74909SZhong Yang 	int SubStylesLength(int styleBase);
6048af74909SZhong Yang 	int StyleFromSubStyle(int subStyle);
6058af74909SZhong Yang 	int PrimaryStyleFromStyle(int style);
6068af74909SZhong Yang 	void FreeSubStyles();
6078af74909SZhong Yang 	void SetIdentifiers(int style, const char *identifiers);
6088af74909SZhong Yang 	int DistanceToSecondaryStyles();
6098af74909SZhong Yang 	const char *GetSubStyleBases();
6108af74909SZhong Yang 	int NamedStyles();
6118af74909SZhong Yang 	const char *NameOfStyle(int style);
6128af74909SZhong Yang 	const char *TagsOfStyle(int style);
6138af74909SZhong Yang 	const char *DescriptionOfStyle(int style);
6148af74909SZhong Yang };
6158af74909SZhong Yang 
6168af74909SZhong Yang }
6178af74909SZhong Yang 
LexState(Document * pdoc_)6188af74909SZhong Yang LexState::LexState(Document *pdoc_) : LexInterface(pdoc_) {
6198af74909SZhong Yang 	lexCurrent = nullptr;
6208af74909SZhong Yang 	performingStyle = false;
6218af74909SZhong Yang 	interfaceVersion = lvRelease4;
6228af74909SZhong Yang 	lexLanguage = SCLEX_CONTAINER;
6238af74909SZhong Yang }
6248af74909SZhong Yang 
~LexState()6258af74909SZhong Yang LexState::~LexState() {
6268af74909SZhong Yang 	if (instance) {
6278af74909SZhong Yang 		instance->Release();
6288af74909SZhong Yang 		instance = nullptr;
6298af74909SZhong Yang 	}
6308af74909SZhong Yang }
6318af74909SZhong Yang 
SetInstance(ILexer5 * instance_)6328af74909SZhong Yang void LexState::SetInstance(ILexer5 *instance_) {
6338af74909SZhong Yang 	if (instance) {
6348af74909SZhong Yang 		instance->Release();
6358af74909SZhong Yang 		instance = nullptr;
6368af74909SZhong Yang 	}
6378af74909SZhong Yang 	instance = instance_;
6388af74909SZhong Yang 	pdoc->LexerChanged();
6398af74909SZhong Yang }
6408af74909SZhong Yang 
DocumentLexState()6418af74909SZhong Yang LexState *ScintillaBase::DocumentLexState() {
6428af74909SZhong Yang 	if (!pdoc->GetLexInterface()) {
6438af74909SZhong Yang 		pdoc->SetLexInterface(std::make_unique<LexState>(pdoc));
6448af74909SZhong Yang 	}
6458af74909SZhong Yang 	return dynamic_cast<LexState *>(pdoc->GetLexInterface());
6468af74909SZhong Yang }
6478af74909SZhong Yang 
SetLexerModule(const LexerModule * lex)6488af74909SZhong Yang void LexState::SetLexerModule(const LexerModule *lex) {
6498af74909SZhong Yang 	if (lex != lexCurrent) {
6508af74909SZhong Yang 		if (instance) {
6518af74909SZhong Yang 			instance->Release();
6528af74909SZhong Yang 			instance = nullptr;
6538af74909SZhong Yang 		}
6548af74909SZhong Yang 		interfaceVersion = lvRelease4;
6558af74909SZhong Yang 		lexCurrent = lex;
6568af74909SZhong Yang 		if (lexCurrent) {
6578af74909SZhong Yang 			instance = lexCurrent->Create();
6588af74909SZhong Yang 			interfaceVersion = instance->Version();
6598af74909SZhong Yang 		}
6608af74909SZhong Yang 		pdoc->LexerChanged();
6618af74909SZhong Yang 	}
6628af74909SZhong Yang }
6638af74909SZhong Yang 
SetLexer(uptr_t wParam)6648af74909SZhong Yang void LexState::SetLexer(uptr_t wParam) {
6658af74909SZhong Yang 	lexLanguage = static_cast<int>(wParam);
6668af74909SZhong Yang 	if (lexLanguage == SCLEX_CONTAINER) {
6678af74909SZhong Yang 		SetLexerModule(nullptr);
6688af74909SZhong Yang 	} else {
6698af74909SZhong Yang 		const LexerModule *lex = Catalogue::Find(lexLanguage);
6708af74909SZhong Yang 		if (!lex)
6718af74909SZhong Yang 			lex = Catalogue::Find(SCLEX_NULL);
6728af74909SZhong Yang 		SetLexerModule(lex);
6738af74909SZhong Yang 	}
6748af74909SZhong Yang }
6758af74909SZhong Yang 
SetLexerLanguage(const char * languageName)6768af74909SZhong Yang void LexState::SetLexerLanguage(const char *languageName) {
6778af74909SZhong Yang 	const LexerModule *lex = Catalogue::Find(languageName);
6788af74909SZhong Yang 	if (!lex)
6798af74909SZhong Yang 		lex = Catalogue::Find(SCLEX_NULL);
6808af74909SZhong Yang 	if (lex)
6818af74909SZhong Yang 		lexLanguage = lex->GetLanguage();
6828af74909SZhong Yang 	SetLexerModule(lex);
6838af74909SZhong Yang }
6848af74909SZhong Yang 
DescribeWordListSets()6858af74909SZhong Yang const char *LexState::DescribeWordListSets() {
6868af74909SZhong Yang 	if (instance) {
6878af74909SZhong Yang 		return instance->DescribeWordListSets();
6888af74909SZhong Yang 	} else {
6898af74909SZhong Yang 		return nullptr;
6908af74909SZhong Yang 	}
6918af74909SZhong Yang }
6928af74909SZhong Yang 
SetWordList(int n,const char * wl)6938af74909SZhong Yang void LexState::SetWordList(int n, const char *wl) {
6948af74909SZhong Yang 	if (instance) {
6958af74909SZhong Yang 		const Sci_Position firstModification = instance->WordListSet(n, wl);
6968af74909SZhong Yang 		if (firstModification >= 0) {
6978af74909SZhong Yang 			pdoc->ModifiedAt(firstModification);
6988af74909SZhong Yang 		}
6998af74909SZhong Yang 	}
7008af74909SZhong Yang }
7018af74909SZhong Yang 
GetIdentifier() const7028af74909SZhong Yang int LexState::GetIdentifier() const {
7038af74909SZhong Yang 	if (lexCurrent) {
7048af74909SZhong Yang 		return lexCurrent->GetLanguage();
7058af74909SZhong Yang 	}
7068af74909SZhong Yang 	if (instance) {
7078af74909SZhong Yang 		if (instance->Version() >= lvRelease5) {
7088af74909SZhong Yang 			return instance->GetIdentifier();
7098af74909SZhong Yang 		}
7108af74909SZhong Yang 	}
7118af74909SZhong Yang 	return SCLEX_CONTAINER;
7128af74909SZhong Yang }
7138af74909SZhong Yang 
GetName() const7148af74909SZhong Yang const char *LexState::GetName() const {
7158af74909SZhong Yang 	if (lexCurrent) {
7168af74909SZhong Yang 		return lexCurrent->languageName;
7178af74909SZhong Yang 	}
7188af74909SZhong Yang 	if (instance) {
7198af74909SZhong Yang 		if (instance->Version() >= lvRelease5) {
7208af74909SZhong Yang 			return instance->GetName();
7218af74909SZhong Yang 		}
7228af74909SZhong Yang 	}
7238af74909SZhong Yang 	return "";
7248af74909SZhong Yang }
7258af74909SZhong Yang 
PrivateCall(int operation,void * pointer)7268af74909SZhong Yang void *LexState::PrivateCall(int operation, void *pointer) {
7278af74909SZhong Yang 	if (pdoc && instance) {
7288af74909SZhong Yang 		return instance->PrivateCall(operation, pointer);
7298af74909SZhong Yang 	} else {
7308af74909SZhong Yang 		return nullptr;
7318af74909SZhong Yang 	}
7328af74909SZhong Yang }
7338af74909SZhong Yang 
PropertyNames()7348af74909SZhong Yang const char *LexState::PropertyNames() {
7358af74909SZhong Yang 	if (instance) {
7368af74909SZhong Yang 		return instance->PropertyNames();
7378af74909SZhong Yang 	} else {
7388af74909SZhong Yang 		return nullptr;
7398af74909SZhong Yang 	}
7408af74909SZhong Yang }
7418af74909SZhong Yang 
PropertyType(const char * name)7428af74909SZhong Yang int LexState::PropertyType(const char *name) {
7438af74909SZhong Yang 	if (instance) {
7448af74909SZhong Yang 		return instance->PropertyType(name);
7458af74909SZhong Yang 	} else {
7468af74909SZhong Yang 		return SC_TYPE_BOOLEAN;
7478af74909SZhong Yang 	}
7488af74909SZhong Yang }
7498af74909SZhong Yang 
DescribeProperty(const char * name)7508af74909SZhong Yang const char *LexState::DescribeProperty(const char *name) {
7518af74909SZhong Yang 	if (instance) {
7528af74909SZhong Yang 		return instance->DescribeProperty(name);
7538af74909SZhong Yang 	} else {
7548af74909SZhong Yang 		return nullptr;
7558af74909SZhong Yang 	}
7568af74909SZhong Yang }
7578af74909SZhong Yang 
PropSet(const char * key,const char * val)7588af74909SZhong Yang void LexState::PropSet(const char *key, const char *val) {
7598af74909SZhong Yang 	props.Set(key, val, strlen(key), strlen(val));
7608af74909SZhong Yang 	if (instance) {
7618af74909SZhong Yang 		const Sci_Position firstModification = instance->PropertySet(key, val);
7628af74909SZhong Yang 		if (firstModification >= 0) {
7638af74909SZhong Yang 			pdoc->ModifiedAt(firstModification);
7648af74909SZhong Yang 		}
7658af74909SZhong Yang 	}
7668af74909SZhong Yang }
7678af74909SZhong Yang 
PropGet(const char * key) const7688af74909SZhong Yang const char *LexState::PropGet(const char *key) const {
7698af74909SZhong Yang 	return props.Get(key);
7708af74909SZhong Yang }
7718af74909SZhong Yang 
PropGetInt(const char * key,int defaultValue) const7728af74909SZhong Yang int LexState::PropGetInt(const char *key, int defaultValue) const {
7738af74909SZhong Yang 	return props.GetInt(key, defaultValue);
7748af74909SZhong Yang }
7758af74909SZhong Yang 
PropGetExpanded(const char * key,char * result) const7768af74909SZhong Yang size_t LexState::PropGetExpanded(const char *key, char *result) const {
7778af74909SZhong Yang 	return props.GetExpanded(key, result);
7788af74909SZhong Yang }
7798af74909SZhong Yang 
LineEndTypesSupported()7808af74909SZhong Yang int LexState::LineEndTypesSupported() {
7818af74909SZhong Yang 	if (instance) {
7828af74909SZhong Yang 		return instance->LineEndTypesSupported();
7838af74909SZhong Yang 	}
7848af74909SZhong Yang 	return 0;
7858af74909SZhong Yang }
7868af74909SZhong Yang 
AllocateSubStyles(int styleBase,int numberStyles)7878af74909SZhong Yang int LexState::AllocateSubStyles(int styleBase, int numberStyles) {
7888af74909SZhong Yang 	if (instance) {
7898af74909SZhong Yang 		return instance->AllocateSubStyles(styleBase, numberStyles);
7908af74909SZhong Yang 	}
7918af74909SZhong Yang 	return -1;
7928af74909SZhong Yang }
7938af74909SZhong Yang 
SubStylesStart(int styleBase)7948af74909SZhong Yang int LexState::SubStylesStart(int styleBase) {
7958af74909SZhong Yang 	if (instance) {
7968af74909SZhong Yang 		return instance->SubStylesStart(styleBase);
7978af74909SZhong Yang 	}
7988af74909SZhong Yang 	return -1;
7998af74909SZhong Yang }
8008af74909SZhong Yang 
SubStylesLength(int styleBase)8018af74909SZhong Yang int LexState::SubStylesLength(int styleBase) {
8028af74909SZhong Yang 	if (instance) {
8038af74909SZhong Yang 		return instance->SubStylesLength(styleBase);
8048af74909SZhong Yang 	}
8058af74909SZhong Yang 	return 0;
8068af74909SZhong Yang }
8078af74909SZhong Yang 
StyleFromSubStyle(int subStyle)8088af74909SZhong Yang int LexState::StyleFromSubStyle(int subStyle) {
8098af74909SZhong Yang 	if (instance) {
8108af74909SZhong Yang 		return instance->StyleFromSubStyle(subStyle);
8118af74909SZhong Yang 	}
8128af74909SZhong Yang 	return 0;
8138af74909SZhong Yang }
8148af74909SZhong Yang 
PrimaryStyleFromStyle(int style)8158af74909SZhong Yang int LexState::PrimaryStyleFromStyle(int style) {
8168af74909SZhong Yang 	if (instance) {
8178af74909SZhong Yang 		return instance->PrimaryStyleFromStyle(style);
8188af74909SZhong Yang 	}
8198af74909SZhong Yang 	return 0;
8208af74909SZhong Yang }
8218af74909SZhong Yang 
FreeSubStyles()8228af74909SZhong Yang void LexState::FreeSubStyles() {
8238af74909SZhong Yang 	if (instance) {
8248af74909SZhong Yang 		instance->FreeSubStyles();
8258af74909SZhong Yang 	}
8268af74909SZhong Yang }
8278af74909SZhong Yang 
SetIdentifiers(int style,const char * identifiers)8288af74909SZhong Yang void LexState::SetIdentifiers(int style, const char *identifiers) {
8298af74909SZhong Yang 	if (instance) {
8308af74909SZhong Yang 		instance->SetIdentifiers(style, identifiers);
8318af74909SZhong Yang 		pdoc->ModifiedAt(0);
8328af74909SZhong Yang 	}
8338af74909SZhong Yang }
8348af74909SZhong Yang 
DistanceToSecondaryStyles()8358af74909SZhong Yang int LexState::DistanceToSecondaryStyles() {
8368af74909SZhong Yang 	if (instance) {
8378af74909SZhong Yang 		return instance->DistanceToSecondaryStyles();
8388af74909SZhong Yang 	}
8398af74909SZhong Yang 	return 0;
8408af74909SZhong Yang }
8418af74909SZhong Yang 
GetSubStyleBases()8428af74909SZhong Yang const char *LexState::GetSubStyleBases() {
8438af74909SZhong Yang 	if (instance) {
8448af74909SZhong Yang 		return instance->GetSubStyleBases();
8458af74909SZhong Yang 	}
8468af74909SZhong Yang 	return "";
8478af74909SZhong Yang }
8488af74909SZhong Yang 
NamedStyles()8498af74909SZhong Yang int LexState::NamedStyles() {
8508af74909SZhong Yang 	if (instance) {
8518af74909SZhong Yang 		return instance->NamedStyles();
8528af74909SZhong Yang 	} else {
8538af74909SZhong Yang 		return -1;
8548af74909SZhong Yang 	}
8558af74909SZhong Yang }
8568af74909SZhong Yang 
NameOfStyle(int style)8578af74909SZhong Yang const char *LexState::NameOfStyle(int style) {
8588af74909SZhong Yang 	if (instance) {
8598af74909SZhong Yang 		return instance->NameOfStyle(style);
8608af74909SZhong Yang 	} else {
8618af74909SZhong Yang 		return nullptr;
8628af74909SZhong Yang 	}
8638af74909SZhong Yang }
8648af74909SZhong Yang 
TagsOfStyle(int style)8658af74909SZhong Yang const char *LexState::TagsOfStyle(int style) {
8668af74909SZhong Yang 	if (instance) {
8678af74909SZhong Yang 		return instance->TagsOfStyle(style);
8688af74909SZhong Yang 	} else {
8698af74909SZhong Yang 		return nullptr;
8708af74909SZhong Yang 	}
8718af74909SZhong Yang }
8728af74909SZhong Yang 
DescriptionOfStyle(int style)8738af74909SZhong Yang const char *LexState::DescriptionOfStyle(int style) {
8748af74909SZhong Yang 	if (instance) {
8758af74909SZhong Yang 		return instance->DescriptionOfStyle(style);
8768af74909SZhong Yang 	} else {
8778af74909SZhong Yang 		return nullptr;
8788af74909SZhong Yang 	}
8798af74909SZhong Yang }
8808af74909SZhong Yang 
NotifyStyleToNeeded(Sci::Position endStyleNeeded)8818af74909SZhong Yang void ScintillaBase::NotifyStyleToNeeded(Sci::Position endStyleNeeded) {
8828af74909SZhong Yang 	if (DocumentLexState()->GetIdentifier() != SCLEX_CONTAINER) {
8838af74909SZhong Yang 		const Sci::Line lineEndStyled =
8848af74909SZhong Yang 			pdoc->SciLineFromPosition(pdoc->GetEndStyled());
8858af74909SZhong Yang 		const Sci::Position endStyled =
8868af74909SZhong Yang 			pdoc->LineStart(lineEndStyled);
8878af74909SZhong Yang 		DocumentLexState()->Colourise(endStyled, endStyleNeeded);
8888af74909SZhong Yang 		return;
8898af74909SZhong Yang 	}
8908af74909SZhong Yang 	Editor::NotifyStyleToNeeded(endStyleNeeded);
8918af74909SZhong Yang }
8928af74909SZhong Yang 
NotifyLexerChanged(Document *,void *)8938af74909SZhong Yang void ScintillaBase::NotifyLexerChanged(Document *, void *) {
8948af74909SZhong Yang 	vs.EnsureStyle(0xff);
8958af74909SZhong Yang }
8968af74909SZhong Yang 
WndProc(unsigned int iMessage,uptr_t wParam,sptr_t lParam)8978af74909SZhong Yang sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
8988af74909SZhong Yang 	switch (iMessage) {
8998af74909SZhong Yang 	case SCI_AUTOCSHOW:
9008af74909SZhong Yang 		listType = 0;
9018af74909SZhong Yang 		AutoCompleteStart(static_cast<Sci::Position>(wParam), ConstCharPtrFromSPtr(lParam));
9028af74909SZhong Yang 		break;
9038af74909SZhong Yang 
9048af74909SZhong Yang 	case SCI_AUTOCCANCEL:
9058af74909SZhong Yang 		ac.Cancel();
9068af74909SZhong Yang 		break;
9078af74909SZhong Yang 
9088af74909SZhong Yang 	case SCI_AUTOCACTIVE:
9098af74909SZhong Yang 		return ac.Active();
9108af74909SZhong Yang 
9118af74909SZhong Yang 	case SCI_AUTOCPOSSTART:
9128af74909SZhong Yang 		return ac.posStart;
9138af74909SZhong Yang 
9148af74909SZhong Yang 	case SCI_AUTOCCOMPLETE:
9158af74909SZhong Yang 		AutoCompleteCompleted(0, SC_AC_COMMAND);
9168af74909SZhong Yang 		break;
9178af74909SZhong Yang 
9188af74909SZhong Yang 	case SCI_AUTOCSETSEPARATOR:
9198af74909SZhong Yang 		ac.SetSeparator(static_cast<char>(wParam));
9208af74909SZhong Yang 		break;
9218af74909SZhong Yang 
9228af74909SZhong Yang 	case SCI_AUTOCGETSEPARATOR:
9238af74909SZhong Yang 		return ac.GetSeparator();
9248af74909SZhong Yang 
9258af74909SZhong Yang 	case SCI_AUTOCSTOPS:
9268af74909SZhong Yang 		ac.SetStopChars(ConstCharPtrFromSPtr(lParam));
9278af74909SZhong Yang 		break;
9288af74909SZhong Yang 
9298af74909SZhong Yang 	case SCI_AUTOCSELECT:
9308af74909SZhong Yang 		ac.Select(ConstCharPtrFromSPtr(lParam));
9318af74909SZhong Yang 		break;
9328af74909SZhong Yang 
9338af74909SZhong Yang 	case SCI_AUTOCGETCURRENT:
9348af74909SZhong Yang 		return AutoCompleteGetCurrent();
9358af74909SZhong Yang 
9368af74909SZhong Yang 	case SCI_AUTOCGETCURRENTTEXT:
9378af74909SZhong Yang 		return AutoCompleteGetCurrentText(CharPtrFromSPtr(lParam));
9388af74909SZhong Yang 
9398af74909SZhong Yang 	case SCI_AUTOCSETCANCELATSTART:
9408af74909SZhong Yang 		ac.cancelAtStartPos = wParam != 0;
9418af74909SZhong Yang 		break;
9428af74909SZhong Yang 
9438af74909SZhong Yang 	case SCI_AUTOCGETCANCELATSTART:
9448af74909SZhong Yang 		return ac.cancelAtStartPos;
9458af74909SZhong Yang 
9468af74909SZhong Yang 	case SCI_AUTOCSETFILLUPS:
9478af74909SZhong Yang 		ac.SetFillUpChars(ConstCharPtrFromSPtr(lParam));
9488af74909SZhong Yang 		break;
9498af74909SZhong Yang 
9508af74909SZhong Yang 	case SCI_AUTOCSETCHOOSESINGLE:
9518af74909SZhong Yang 		ac.chooseSingle = wParam != 0;
9528af74909SZhong Yang 		break;
9538af74909SZhong Yang 
9548af74909SZhong Yang 	case SCI_AUTOCGETCHOOSESINGLE:
9558af74909SZhong Yang 		return ac.chooseSingle;
9568af74909SZhong Yang 
9578af74909SZhong Yang 	case SCI_AUTOCSETIGNORECASE:
9588af74909SZhong Yang 		ac.ignoreCase = wParam != 0;
9598af74909SZhong Yang 		break;
9608af74909SZhong Yang 
9618af74909SZhong Yang 	case SCI_AUTOCGETIGNORECASE:
9628af74909SZhong Yang 		return ac.ignoreCase;
9638af74909SZhong Yang 
9648af74909SZhong Yang 	case SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR:
9658af74909SZhong Yang 		ac.ignoreCaseBehaviour = static_cast<unsigned int>(wParam);
9668af74909SZhong Yang 		break;
9678af74909SZhong Yang 
9688af74909SZhong Yang 	case SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR:
9698af74909SZhong Yang 		return ac.ignoreCaseBehaviour;
9708af74909SZhong Yang 
9718af74909SZhong Yang 	case SCI_AUTOCSETMULTI:
9728af74909SZhong Yang 		multiAutoCMode = static_cast<int>(wParam);
9738af74909SZhong Yang 		break;
9748af74909SZhong Yang 
9758af74909SZhong Yang 	case SCI_AUTOCGETMULTI:
9768af74909SZhong Yang 		return multiAutoCMode;
9778af74909SZhong Yang 
9788af74909SZhong Yang 	case SCI_AUTOCSETORDER:
9798af74909SZhong Yang 		ac.autoSort = static_cast<int>(wParam);
9808af74909SZhong Yang 		break;
9818af74909SZhong Yang 
9828af74909SZhong Yang 	case SCI_AUTOCGETORDER:
9838af74909SZhong Yang 		return ac.autoSort;
9848af74909SZhong Yang 
9858af74909SZhong Yang 	case SCI_USERLISTSHOW:
9868af74909SZhong Yang 		listType = static_cast<int>(wParam);
9878af74909SZhong Yang 		AutoCompleteStart(0, ConstCharPtrFromSPtr(lParam));
9888af74909SZhong Yang 		break;
9898af74909SZhong Yang 
9908af74909SZhong Yang 	case SCI_AUTOCSETAUTOHIDE:
9918af74909SZhong Yang 		ac.autoHide = wParam != 0;
9928af74909SZhong Yang 		break;
9938af74909SZhong Yang 
9948af74909SZhong Yang 	case SCI_AUTOCGETAUTOHIDE:
9958af74909SZhong Yang 		return ac.autoHide;
9968af74909SZhong Yang 
9978af74909SZhong Yang 	case SCI_AUTOCSETDROPRESTOFWORD:
9988af74909SZhong Yang 		ac.dropRestOfWord = wParam != 0;
9998af74909SZhong Yang 		break;
10008af74909SZhong Yang 
10018af74909SZhong Yang 	case SCI_AUTOCGETDROPRESTOFWORD:
10028af74909SZhong Yang 		return ac.dropRestOfWord;
10038af74909SZhong Yang 
10048af74909SZhong Yang 	case SCI_AUTOCSETMAXHEIGHT:
10058af74909SZhong Yang 		ac.lb->SetVisibleRows(static_cast<int>(wParam));
10068af74909SZhong Yang 		break;
10078af74909SZhong Yang 
10088af74909SZhong Yang 	case SCI_AUTOCGETMAXHEIGHT:
10098af74909SZhong Yang 		return ac.lb->GetVisibleRows();
10108af74909SZhong Yang 
10118af74909SZhong Yang 	case SCI_AUTOCSETMAXWIDTH:
10128af74909SZhong Yang 		maxListWidth = static_cast<int>(wParam);
10138af74909SZhong Yang 		break;
10148af74909SZhong Yang 
10158af74909SZhong Yang 	case SCI_AUTOCGETMAXWIDTH:
10168af74909SZhong Yang 		return maxListWidth;
10178af74909SZhong Yang 
10188af74909SZhong Yang 	case SCI_REGISTERIMAGE:
10198af74909SZhong Yang 		ac.lb->RegisterImage(static_cast<int>(wParam), ConstCharPtrFromSPtr(lParam));
10208af74909SZhong Yang 		break;
10218af74909SZhong Yang 
10228af74909SZhong Yang 	case SCI_REGISTERRGBAIMAGE:
10238af74909SZhong Yang 		ac.lb->RegisterRGBAImage(static_cast<int>(wParam), static_cast<int>(sizeRGBAImage.x), static_cast<int>(sizeRGBAImage.y),
10248af74909SZhong Yang 			ConstUCharPtrFromSPtr(lParam));
10258af74909SZhong Yang 		break;
10268af74909SZhong Yang 
10278af74909SZhong Yang 	case SCI_CLEARREGISTEREDIMAGES:
10288af74909SZhong Yang 		ac.lb->ClearRegisteredImages();
10298af74909SZhong Yang 		break;
10308af74909SZhong Yang 
10318af74909SZhong Yang 	case SCI_AUTOCSETTYPESEPARATOR:
10328af74909SZhong Yang 		ac.SetTypesep(static_cast<char>(wParam));
10338af74909SZhong Yang 		break;
10348af74909SZhong Yang 
10358af74909SZhong Yang 	case SCI_AUTOCGETTYPESEPARATOR:
10368af74909SZhong Yang 		return ac.GetTypesep();
10378af74909SZhong Yang 
10388af74909SZhong Yang 	case SCI_CALLTIPSHOW:
10398af74909SZhong Yang 		CallTipShow(LocationFromPosition(wParam),
10408af74909SZhong Yang 			ConstCharPtrFromSPtr(lParam));
10418af74909SZhong Yang 		break;
10428af74909SZhong Yang 
10438af74909SZhong Yang 	case SCI_CALLTIPCANCEL:
10448af74909SZhong Yang 		ct.CallTipCancel();
10458af74909SZhong Yang 		break;
10468af74909SZhong Yang 
10478af74909SZhong Yang 	case SCI_CALLTIPACTIVE:
10488af74909SZhong Yang 		return ct.inCallTipMode;
10498af74909SZhong Yang 
10508af74909SZhong Yang 	case SCI_CALLTIPPOSSTART:
10518af74909SZhong Yang 		return ct.posStartCallTip;
10528af74909SZhong Yang 
10538af74909SZhong Yang 	case SCI_CALLTIPSETPOSSTART:
10548af74909SZhong Yang 		ct.posStartCallTip = wParam;
10558af74909SZhong Yang 		break;
10568af74909SZhong Yang 
10578af74909SZhong Yang 	case SCI_CALLTIPSETHLT:
10588af74909SZhong Yang 		ct.SetHighlight(wParam, lParam);
10598af74909SZhong Yang 		break;
10608af74909SZhong Yang 
10618af74909SZhong Yang 	case SCI_CALLTIPSETBACK:
10628af74909SZhong Yang 		ct.colourBG = ColourDesired(static_cast<int>(wParam));
10638af74909SZhong Yang 		vs.styles[STYLE_CALLTIP].back = ct.colourBG;
10648af74909SZhong Yang 		InvalidateStyleRedraw();
10658af74909SZhong Yang 		break;
10668af74909SZhong Yang 
10678af74909SZhong Yang 	case SCI_CALLTIPSETFORE:
10688af74909SZhong Yang 		ct.colourUnSel = ColourDesired(static_cast<int>(wParam));
10698af74909SZhong Yang 		vs.styles[STYLE_CALLTIP].fore = ct.colourUnSel;
10708af74909SZhong Yang 		InvalidateStyleRedraw();
10718af74909SZhong Yang 		break;
10728af74909SZhong Yang 
10738af74909SZhong Yang 	case SCI_CALLTIPSETFOREHLT:
10748af74909SZhong Yang 		ct.colourSel = ColourDesired(static_cast<int>(wParam));
10758af74909SZhong Yang 		InvalidateStyleRedraw();
10768af74909SZhong Yang 		break;
10778af74909SZhong Yang 
10788af74909SZhong Yang 	case SCI_CALLTIPUSESTYLE:
10798af74909SZhong Yang 		ct.SetTabSize(static_cast<int>(wParam));
10808af74909SZhong Yang 		InvalidateStyleRedraw();
10818af74909SZhong Yang 		break;
10828af74909SZhong Yang 
10838af74909SZhong Yang 	case SCI_CALLTIPSETPOSITION:
10848af74909SZhong Yang 		ct.SetPosition(wParam != 0);
10858af74909SZhong Yang 		InvalidateStyleRedraw();
10868af74909SZhong Yang 		break;
10878af74909SZhong Yang 
10888af74909SZhong Yang 	case SCI_USEPOPUP:
10898af74909SZhong Yang 		displayPopupMenu = static_cast<int>(wParam);
1090*f9763b28Slrisora         menuStringTable = reinterpret_cast<std::map<std::wstring, std::wstring>*>(lParam);
10918af74909SZhong Yang 		break;
10928af74909SZhong Yang 
10938af74909SZhong Yang 	case SCI_SETLEXER:
10948af74909SZhong Yang 		DocumentLexState()->SetLexer(static_cast<int>(wParam));
10958af74909SZhong Yang 		break;
10968af74909SZhong Yang 
10978af74909SZhong Yang 	case SCI_GETLEXER:
10988af74909SZhong Yang 		return DocumentLexState()->GetIdentifier();
10998af74909SZhong Yang 
11008af74909SZhong Yang 	case SCI_SETILEXER:
11018af74909SZhong Yang 		DocumentLexState()->SetInstance(reinterpret_cast<ILexer5 *>(lParam));
11028af74909SZhong Yang 		return 0;
11038af74909SZhong Yang 
11048af74909SZhong Yang 	case SCI_COLOURISE:
11058af74909SZhong Yang 		if (DocumentLexState()->lexLanguage == SCLEX_CONTAINER) {
11068af74909SZhong Yang 			pdoc->ModifiedAt(static_cast<Sci::Position>(wParam));
11078af74909SZhong Yang 			NotifyStyleToNeeded((lParam == -1) ? pdoc->Length() : lParam);
11088af74909SZhong Yang 		} else {
11098af74909SZhong Yang 			DocumentLexState()->Colourise(static_cast<Sci::Position>(wParam), lParam);
11108af74909SZhong Yang 		}
11118af74909SZhong Yang 		Redraw();
11128af74909SZhong Yang 		break;
11138af74909SZhong Yang 
11148af74909SZhong Yang 	case SCI_SETPROPERTY:
11158af74909SZhong Yang 		DocumentLexState()->PropSet(ConstCharPtrFromUPtr(wParam),
11168af74909SZhong Yang 		          ConstCharPtrFromSPtr(lParam));
11178af74909SZhong Yang 		break;
11188af74909SZhong Yang 
11198af74909SZhong Yang 	case SCI_GETPROPERTY:
11208af74909SZhong Yang 		return StringResult(lParam, DocumentLexState()->PropGet(ConstCharPtrFromUPtr(wParam)));
11218af74909SZhong Yang 
11228af74909SZhong Yang 	case SCI_GETPROPERTYEXPANDED:
11238af74909SZhong Yang 		return DocumentLexState()->PropGetExpanded(ConstCharPtrFromUPtr(wParam),
11248af74909SZhong Yang 			CharPtrFromSPtr(lParam));
11258af74909SZhong Yang 
11268af74909SZhong Yang 	case SCI_GETPROPERTYINT:
11278af74909SZhong Yang 		return DocumentLexState()->PropGetInt(ConstCharPtrFromUPtr(wParam), static_cast<int>(lParam));
11288af74909SZhong Yang 
11298af74909SZhong Yang 	case SCI_SETKEYWORDS:
11308af74909SZhong Yang 		DocumentLexState()->SetWordList(static_cast<int>(wParam), ConstCharPtrFromSPtr(lParam));
11318af74909SZhong Yang 		break;
11328af74909SZhong Yang 
11338af74909SZhong Yang 	case SCI_SETLEXERLANGUAGE:
11348af74909SZhong Yang 		DocumentLexState()->SetLexerLanguage(ConstCharPtrFromSPtr(lParam));
11358af74909SZhong Yang 		break;
11368af74909SZhong Yang 
11378af74909SZhong Yang 	case SCI_GETLEXERLANGUAGE:
11388af74909SZhong Yang 		return StringResult(lParam, DocumentLexState()->GetName());
11398af74909SZhong Yang 
11408af74909SZhong Yang #ifdef SCI_LEXER
11418af74909SZhong Yang 	case SCI_LOADLEXERLIBRARY:
11428af74909SZhong Yang 		ExternalLexerLoad(ConstCharPtrFromSPtr(lParam));
11438af74909SZhong Yang 		break;
11448af74909SZhong Yang #endif
11458af74909SZhong Yang 
11468af74909SZhong Yang 	case SCI_PRIVATELEXERCALL:
11478af74909SZhong Yang 		return reinterpret_cast<sptr_t>(
11488af74909SZhong Yang 			DocumentLexState()->PrivateCall(static_cast<int>(wParam), reinterpret_cast<void *>(lParam)));
11498af74909SZhong Yang 
11508af74909SZhong Yang #ifdef INCLUDE_DEPRECATED_FEATURES
11518af74909SZhong Yang 	case SCI_GETSTYLEBITSNEEDED:
11528af74909SZhong Yang 		return 8;
11538af74909SZhong Yang #endif
11548af74909SZhong Yang 
11558af74909SZhong Yang 	case SCI_PROPERTYNAMES:
11568af74909SZhong Yang 		return StringResult(lParam, DocumentLexState()->PropertyNames());
11578af74909SZhong Yang 
11588af74909SZhong Yang 	case SCI_PROPERTYTYPE:
11598af74909SZhong Yang 		return DocumentLexState()->PropertyType(ConstCharPtrFromUPtr(wParam));
11608af74909SZhong Yang 
11618af74909SZhong Yang 	case SCI_DESCRIBEPROPERTY:
11628af74909SZhong Yang 		return StringResult(lParam,
11638af74909SZhong Yang 				    DocumentLexState()->DescribeProperty(ConstCharPtrFromUPtr(wParam)));
11648af74909SZhong Yang 
11658af74909SZhong Yang 	case SCI_DESCRIBEKEYWORDSETS:
11668af74909SZhong Yang 		return StringResult(lParam, DocumentLexState()->DescribeWordListSets());
11678af74909SZhong Yang 
11688af74909SZhong Yang 	case SCI_GETLINEENDTYPESSUPPORTED:
11698af74909SZhong Yang 		return DocumentLexState()->LineEndTypesSupported();
11708af74909SZhong Yang 
11718af74909SZhong Yang 	case SCI_ALLOCATESUBSTYLES:
11728af74909SZhong Yang 		return DocumentLexState()->AllocateSubStyles(static_cast<int>(wParam), static_cast<int>(lParam));
11738af74909SZhong Yang 
11748af74909SZhong Yang 	case SCI_GETSUBSTYLESSTART:
11758af74909SZhong Yang 		return DocumentLexState()->SubStylesStart(static_cast<int>(wParam));
11768af74909SZhong Yang 
11778af74909SZhong Yang 	case SCI_GETSUBSTYLESLENGTH:
11788af74909SZhong Yang 		return DocumentLexState()->SubStylesLength(static_cast<int>(wParam));
11798af74909SZhong Yang 
11808af74909SZhong Yang 	case SCI_GETSTYLEFROMSUBSTYLE:
11818af74909SZhong Yang 		return DocumentLexState()->StyleFromSubStyle(static_cast<int>(wParam));
11828af74909SZhong Yang 
11838af74909SZhong Yang 	case SCI_GETPRIMARYSTYLEFROMSTYLE:
11848af74909SZhong Yang 		return DocumentLexState()->PrimaryStyleFromStyle(static_cast<int>(wParam));
11858af74909SZhong Yang 
11868af74909SZhong Yang 	case SCI_FREESUBSTYLES:
11878af74909SZhong Yang 		DocumentLexState()->FreeSubStyles();
11888af74909SZhong Yang 		break;
11898af74909SZhong Yang 
11908af74909SZhong Yang 	case SCI_SETIDENTIFIERS:
11918af74909SZhong Yang 		DocumentLexState()->SetIdentifiers(static_cast<int>(wParam),
11928af74909SZhong Yang 						   ConstCharPtrFromSPtr(lParam));
11938af74909SZhong Yang 		break;
11948af74909SZhong Yang 
11958af74909SZhong Yang 	case SCI_DISTANCETOSECONDARYSTYLES:
11968af74909SZhong Yang 		return DocumentLexState()->DistanceToSecondaryStyles();
11978af74909SZhong Yang 
11988af74909SZhong Yang 	case SCI_GETSUBSTYLEBASES:
11998af74909SZhong Yang 		return StringResult(lParam, DocumentLexState()->GetSubStyleBases());
12008af74909SZhong Yang 
12018af74909SZhong Yang 	case SCI_GETNAMEDSTYLES:
12028af74909SZhong Yang 		return DocumentLexState()->NamedStyles();
12038af74909SZhong Yang 
12048af74909SZhong Yang 	case SCI_NAMEOFSTYLE:
12058af74909SZhong Yang 		return StringResult(lParam, DocumentLexState()->
12068af74909SZhong Yang 				    NameOfStyle(static_cast<int>(wParam)));
12078af74909SZhong Yang 
12088af74909SZhong Yang 	case SCI_TAGSOFSTYLE:
12098af74909SZhong Yang 		return StringResult(lParam, DocumentLexState()->
12108af74909SZhong Yang 				    TagsOfStyle(static_cast<int>(wParam)));
12118af74909SZhong Yang 
12128af74909SZhong Yang 	case SCI_DESCRIPTIONOFSTYLE:
12138af74909SZhong Yang 		return StringResult(lParam, DocumentLexState()->
12148af74909SZhong Yang 				    DescriptionOfStyle(static_cast<int>(wParam)));
12158af74909SZhong Yang 
12168af74909SZhong Yang 	default:
12178af74909SZhong Yang 		return Editor::WndProc(iMessage, wParam, lParam);
12188af74909SZhong Yang 	}
12198af74909SZhong Yang 	return 0;
12208af74909SZhong Yang }
1221