⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qsteeditor.cpp

📁 porting scintilla to qt
💻 CPP
📖 第 1 页 / 共 4 页
字号:
{	int caret = sendMsgToSci(SCI_GETCURRENTPOS);	return sendMsgToSci(SCI_LINEFROMPOSITION,caret);}CharacterRange QSteEditor::getSelection(){	CharacterRange crange;	crange.cpMin = sendMsgToSci(SCI_GETSELECTIONSTART);	crange.cpMax = sendMsgToSci(SCI_GETSELECTIONEND);	return crange;}void QSteEditor::setSelection(int anchor, int currentpos){	sendMsgToSci(SCI_SETSEL,anchor,currentpos);}StyleAndWords QSteEditor::getStyleAndWords(const char *base){	StyleAndWords sw;	if(m_lexer == NULL)		return sw;	SString type(".");	type += m_lexer->getLanguageType();	SString sAndW = m_lexer->GetNewExpand(base,type.c_str());	sw.styleNumber = sAndW.value();	const char *space = strchr(sAndW.c_str(), ' ');	if (space)		sw.words = space + 1;	return sw;}bool QSteEditor::rangeIsAllWhitespace(int start, int end){	char ch;	for (int i = start;i < end;i++) {		ch = getCharacter(start);		if ((ch != ' ') && (ch != '\t'))			return false;	}	return true;}unsigned int QSteEditor::getLinePartsInStyle(int line, int style1, int style2, SString sv[], int len){	if(m_global == NULL)		return 0;	for (int i = 0; i < len; i++)		sv[i] = "";	SString s;	int part = 0;	int thisLineStart = sendMsgToSci(SCI_POSITIONFROMLINE, line);	int nextLineStart = sendMsgToSci(SCI_POSITIONFROMLINE, line + 1);	for (int pos = thisLineStart; pos < nextLineStart; pos++) {		if ((sendMsgToSci(SCI_GETSTYLEAT,pos) == style1) || (sendMsgToSci(SCI_GETSTYLEAT,pos) == style2)) {			char c[2];			c[0] = getCharacter(pos);			c[1] = '\0';			s += c;		} else if (s.length() > 0) {			if (part < len) {				sv[part++] = s;			}			s = "";		}	}	if ((s.length() > 0) && (part < len)) {		sv[part++] = s;	}	return part;}void QSteEditor::ensureRangeVisible(int posStart,int posEnd,bool enforcePolicy){	int lineStart = sendMsgToSci(SCI_LINEFROMPOSITION,Platform::Minimum(posStart, posEnd));	int lineEnd = sendMsgToSci(SCI_LINEFROMPOSITION,Platform::Maximum(posStart, posEnd));	for (int line = lineStart; line <= lineEnd; line++) {		sendMsgToSci(enforcePolicy ? SCI_ENSUREVISIBLEENFORCEPOLICY : SCI_ENSUREVISIBLE, line);	}}void QSteEditor::fowardProperties(){	for (size_t i=0; propertiesToForward[i]; i++) {		SString value = m_global->Get(propertiesToForward[i]);		sendMsgToSci(SCI_SETPROPERTY,reinterpret_cast<uptr_t>(propertiesToForward[i]),value.c_str());	}}void QSteEditor::handleAddChar(char ch){	printf("ch  =%d\n",ch);	//deal calltip	if(sendMsgToSci(SCI_CALLTIPACTIVE)){	}	//deal autoindent	else if(sendMsgToSci(SCI_AUTOCACTIVE)){		sendMsgToSci(SCI_AUTOCCANCEL);		startAutoComplete();		return;	}	//deal brace match	else if(0){	}else{		if(m_indentMaintain){			maintainIndent(ch);		}else if(m_autoIndent){			automaticIndentation(ch);		}	}	}void QSteEditor::handleUpdateUi(){//	braceMatch();}void QSteEditor::handleMarginClick(int position,int modifiers,int margin){	int lineClick = sendMsgToSci(SCI_LINEFROMPOSITION,position);	if ((modifiers & SCMOD_SHIFT) && (modifiers & SCMOD_CTRL)) {		foldAll();	} else {		int levelClick = sendMsgToSci(SCI_GETFOLDLEVEL,lineClick);		if (levelClick & SC_FOLDLEVELHEADERFLAG) {			if (modifiers & SCMOD_SHIFT) {				ensureAllChildrenVisible(lineClick, levelClick);			} else if (modifiers & SCMOD_CTRL) {				toggleFoldRecursive(lineClick, levelClick);			} else {				// Toggle this line				sendMsgToSci(SCI_TOGGLEFOLD,lineClick);			}		}	}}//undo redovoid QSteEditor::beginUndo(){	sendMsgToSci(SCI_BEGINUNDOACTION);}void QSteEditor::endUndo(){	sendMsgToSci(SCI_ENDUNDOACTION);}void QSteEditor::undo(){	sendMsgToSci(SCI_UNDO);}void QSteEditor::redo(){	sendMsgToSci(SCI_REDO);}bool QSteEditor::canUndo(){	return sendMsgToSci(SCI_CANUNDO);}bool QSteEditor::canRedo(){	return sendMsgToSci(SCI_CANREDO);}//copy & cut & pastevoid QSteEditor::copy(){	sendMsgToSci(SCI_COPY);}void QSteEditor::cut(){	sendMsgToSci(SCI_CUT);}void QSteEditor::paste(){	sendMsgToSci(SCI_PASTE);}//insert/remove tabvoid QSteEditor::insertTab(){	sendMsgToSci(SCI_TAB);}void QSteEditor::removeTab(){	sendMsgToSci(SCI_BACKTAB);}//auto completevoid QSteEditor::startAutoComplete(){	if(m_acType == acFromNone)		return;	int linenum = getCurrentLinenum();	SString line(getText(linenum).toStdString().c_str());	int current = getCaretInLine();	if(current == 0)		return;	int startword = current;	while(startword > 0 && wordCharacters.contains(line[startword - 1])){		startword--;	}	SString acword = line.substr(startword,current - startword);	if(acword.length() == 0 || !wordCharacters.contains(acword[acword.length() -1])){		sendMsgToSci(SCI_AUTOCCANCEL);		return;	}	TextToFind ft = {{0,0},0,{0,0}};	const int flags = SCFIND_WORDSTART | (m_acIgnoreCase? 0 : SCFIND_MATCHCASE);	int posCurrentWord = sendMsgToSci(SCI_GETCURRENTPOS) - acword.length();	unsigned int minWordLength = 0;	unsigned int nwords = 0;	SString wordsNear;	wordsNear.setsizegrowth(1000);	wordsNear.append(" ");	//search keyword	if(m_acType & acFromKeyWords && m_lexer){		for(int wl = 0;wl <= KEYWORDSET_MAX;wl++){			SString kw = m_lexer->getKeyWord(wl);			if(kw.length() <= 1)				continue;			int start,end;			char *words = strdup(kw.c_str());			if(words == NULL)				continue;			int len = strlen(words);			for(start = end = 0;start < len;end++){				if(*(words + end) == ' '){					*(words + end) = '\0';					SString word = (words + start);					if(strlen(words + start) > acword.length() && strncmp(acword.c_str(),(words + start),acword.length()) == 0){						word.insert(0," ");						word.append(" ");						if(!wordsNear.contains(word.c_str())){//add a new entry							wordsNear += word.c_str() + 1;							nwords++;						}					}					start = ++end;					while(*(words + start) == ' ')						start++;				}			}			free(words);		}	}	//serach current doc	if(m_acType & acFromCurrentDoc){		int doclen = getTextLength();		ft.lpstrText = const_cast<char*>(acword.c_str());		ft.chrg.cpMin = 0;		ft.chrg.cpMax = doclen;		ft.chrgText.cpMin = 0;		ft.chrgText.cpMax = 0;		int posFind = sendMsgToSci(SCI_FINDTEXT, flags, reinterpret_cast<char *>(&ft));		while (posFind >= 0 && posFind < doclen) {	// search all the document			int wordEnd = posFind + acword.length();			if (posFind != posCurrentWord) {				while(wordCharacters.contains(getCharacter(wordEnd))){					wordEnd++;				}				size_t wordLength = wordEnd - posFind;				if (wordLength > acword.length()) {					SString word = getRange(posFind, wordEnd);					word.insert(0," ");					word.append(" ");					if (!wordsNear.contains(word.c_str())) {	// add a new entry						wordsNear += word.c_str() + 1;						if (minWordLength < wordLength)							minWordLength = wordLength;							nwords++;						if (m_acOnlyOne && nwords > 1) {							return;						}					}				}			}			ft.chrg.cpMin = wordEnd;			posFind = sendMsgToSci(SCI_FINDTEXT, flags, reinterpret_cast<char *>(&ft));		}	}	//serach opened doc	if(m_acType & acFromOpened){		if(m_global){			m_global->addAutoCompleteWords(acword,&wordsNear,this);		}	}	//serach project	if(m_acType & acFromProject){	}	//search api	if(m_acType & acFromAPI){	}	size_t length = wordsNear.length();	if((length > 2) && (!m_acOnlyOne || (minWordLength > acword.length()))){		StringList wl;		wl.Set(wordsNear.c_str());		char *words = wl.GetNearestWords("",0,m_acIgnoreCase);		sendMsgToSci(SCI_AUTOCSHOW,acword.length(),words);		delete []words;	}else{		sendMsgToSci(SCI_AUTOCCANCEL);	}}// indentint QSteEditor::getLineIndentation(int line){	return sendMsgToSci(SCI_GETLINEINDENTATION, line);}int QSteEditor::getLineIndentPosition(int line){	return sendMsgToSci(SCI_GETLINEINDENTPOSITION, line);}void QSteEditor::setLineIndentation(int line, int indent){	if(indent < 0)		return;	CharacterRange crange = getSelection();	int posbefore = getLineIndentPosition(line);	sendMsgToSci(SCI_SETLINEINDENTATION,line,indent);	int posafter = getLineIndentPosition(line);	int posdifference = posafter - posbefore;	if(posafter > posbefore){		// move selection on		if(crange.cpMin >= posbefore)			crange.cpMin += posdifference;		if(crange.cpMax >= posbefore)			crange.cpMax += posdifference;	}else if(posafter < posbefore){		// move selection back		if(crange.cpMin >= posafter){			if(crange.cpMin >= posafter)				crange.cpMin += posdifference;			else				crange.cpMin = posafter;		}		if(crange.cpMax >= posafter){			if(crange.cpMax >= posafter)				crange.cpMax += posdifference;			else				crange.cpMax = posafter;		}	}	setSelection(crange.cpMin,crange.cpMax);}void QSteEditor::maintainIndent(char ch){	int eolmode = sendMsgToSci(SCI_GETEOLMODE);	int curline = getCurrLineNum();	int lastline = curline - 1;	int indentamount = 0;	if(((eolmode == SC_EOL_CRLF || eolmode == SC_EOL_LF) && ch == '\n') || (eolmode == SC_EOL_CR && ch == '\r')){		if(m_autoIndent){			while(lastline >= 0 && getLineLength(lastline) == 0)				lastline--;		}		if(lastline >= 0){			indentamount = getLineIndentation(lastline); 		}		if(indentamount > 0)			setLineIndentation(curline,indentamount);	}}void QSteEditor::automaticIndentation(char ch){	CharacterRange crange = getSelection();	int selstart = crange.cpMin;	int curline = getCurrLineNum();	int indentsize = sendMsgToSci(SCI_GETINDENT);	int thislinestart = sendMsgToSci(SCI_POSITIONFROMLINE,curline);	int indentblock = indentOfBlock(curline - 1);	if(m_blockEnd.IsSingleChar() && ch == m_blockEnd.words[0]){		if(!m_indentClosing){			if(rangeIsAllWhitespace(thislinestart,selstart - 1)){				setLineIndentation(curline,indentblock - indentsize);			}		}	}else if(!m_blockEnd.IsSingleChar() && (ch == ' ')){	}else if(m_blockStart.IsSingleChar() && (ch == m_blockStart.words[0])){		if(!m_indentOpening && (getIndentState(curline - 1) == isKeyWordStart)){			if(rangeIsAllWhitespace(thislinestart,selstart - 1)){				setLineIndentation(curline,indentblock - indentsize);			}		}	}else if((ch == '\r' || ch == '\n') && (selstart == thislinestart)){		if(!m_indentClosing && !m_blockEnd.IsSingleChar()){			SString controlwords[1];			if(getLinePartsInStyle(curline - 1,m_blockEnd.styleNumber,-1,controlwords, ELEMENTS(controlwords))){				if(includes(m_blockEnd,controlwords[0])){					setLineIndentation(curline - 1,indentOfBlock(curline - 2) - indentsize);					indentblock = indentOfBlock(curline - 1); 				}			}		}		setLineIndentation(curline,indentblock);	}}int QSteEditor::indentOfBlock(int line){	if(line < 0)		return 0;	int indentsize = sendMsgToSci(SCI_GETINDENT);	int indentblock = getLineIndentation(line);	int backline = line;	IndentationStatus indentstate = isNone;	if(m_statementIndent.IsEmpty() && m_blockStart.IsEmpty() && m_blockEnd.IsEmpty()){		indentstate = isBlockStart;	// Don't bother searching backwards	}	int linelimit = line - m_statementLookBack;	if(linelimit < 0)		linelimit = 0;	while((backline >= linelimit) && (indentstate == 0)){		indentstate = getIndentState(backline);		if(indentstate != 0){			indentblock = getLineIndentation(backline);			if(indentstate == isBlockStart){				if(!m_indentOpening)					indentblock += indentsize;			}			if(indentstate == isBlockEnd){				if(m_indentClosing)					indentblock -= indentsize;				if(indentblock < 0)					indentblock = 0;			}			if((indentstate == isKeyWordStart) && (backline == line))				indentblock += indentsize;		}		backline--;	}	return indentblock;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -