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

📄 qsteeditor.cpp

📁 porting scintilla to qt
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include <QtGui>#include <string.h>#include <qapplication.h>#include <qcolor.h>#include <qprinter.h>#include <qpainter.h>#include <qstack.h>#include "qsteeditor.h"#include "listboxqt.h"#include "stringlist.h"#include "PropSet.h"#include "Accessor.h"#include "WindowAccessor.h"#include "KeyWords.h"#include "Scintilla.h"#include "ScintillaWidget.h"#include "SciLexer.h"#include "qsteprint.h"QSteEditor::QSteEditor(QWidget *parent):QSteScintillaBase(parent),m_filename(QString("")),m_parent(parent){	QFont font("Times",24);	setFont(QApplication::font());	setFont(font);	sendMsgToSci(SCI_SETVISIBLEPOLICY,VISIBLE_STRICT | VISIBLE_SLOP,4);	m_global = NULL;	m_globalShowDegree = -1;	m_lexer = NULL;	m_lexerShowDegree = -1;	m_abbrev = NULL;	m_abbrevShowDegree = -1;	m_acType = acFromCurrentDoc | acFromKeyWords | acFromOpened;	m_acIgnoreCase = true;	m_acOnlyOne = false;	wordCharacters = "1234567890_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";	m_autoIndent = true;	m_indentMaintain = m_indentOpening = m_indentClosing = false;	m_statementLookBack  =10;	m_bracesCheck = m_bracesSloppy = m_bracesStyle = m_braceCount = 0;	m_lineNumWidth = 4;	m_marginWidth = 20;	m_foldMarginWidth = 14;	m_allowAlpha = true;	setUtf8(true);	//connect	connect(this,SIGNAL(qsteAddCharacter(char)),SLOT(handleAddChar(char)));	connect(this,SIGNAL(qsteUpdated()),SLOT(handleUpdateUi()));	connect(this,SIGNAL(qsteMarginClick(int,int,int)),SLOT(handleMarginClick(int,int,int)));}QSteEditor::~QSteEditor(){	if(m_global)		m_global->delEditorToList(this);}void QSteEditor::accept(QSteGlobalProper *proper){	m_globalShowDegree = -1;	m_global = proper;	if(m_global) {		m_global->addEditorToList(this);		setGlobalProper();		this->accept(m_global->getAbbvFromName(""));	}}void QSteEditor::accept(QSteLexProper *proper){	m_lexerShowDegree = -1;	m_lexer = proper;	if(m_lexer)		setLexProper();}void QSteEditor::accept(QSteAbbrevProper *abb_){	m_abbrevShowDegree = -1;	m_abbrev = abb_;}//set indentvoid QSteEditor::setIndentSetting(){	if(m_global == NULL || m_globalShowDegree == m_global->getShowDegree())		return;	int usetabs = m_global->GetInt("use.tabs",1);	int tabsize = m_global->GetInt("tabsize",1);	int indentsize = m_global->GetInt("indent.size");	sendMsgToSci(SCI_SETUSETABS,usetabs);	sendMsgToSci(SCI_SETTABWIDTH,tabsize);	sendMsgToSci(SCI_SETINDENT,indentsize);}//set style for window copy from scitevoid QSteEditor::setOneStyle(int style,const QSteStyleDefinition &sd){	if(sd.specified & QSteStyleDefinition::sdItalics)		sendMsgToSci(SCI_STYLESETITALIC,style, sd.italics ? 1 : 0);	if(sd.specified & QSteStyleDefinition::sdBold)		sendMsgToSci(SCI_STYLESETBOLD,style,sd.bold ? 1 : 0);	if(sd.specified & QSteStyleDefinition::sdFont)		sendMsgToSci(SCI_STYLESETFONT,style,const_cast<char *>(sd.font.c_str()));	if(sd.specified & QSteStyleDefinition::sdFore)		sendMsgToSci(SCI_STYLESETFORE,style,sd.foreAsLong());	if(sd.specified & QSteStyleDefinition::sdBack)		sendMsgToSci(SCI_STYLESETBACK,style,sd.backAsLong());	if(sd.specified & QSteStyleDefinition::sdSize)		sendMsgToSci(SCI_STYLESETSIZE,style,sd.size);	if(sd.specified & QSteStyleDefinition::sdEOLFilled)		sendMsgToSci(SCI_STYLESETEOLFILLED,style,sd.eolfilled ? 1 : 0);	if (sd.specified & QSteStyleDefinition::sdUnderlined)		sendMsgToSci(SCI_STYLESETUNDERLINE,style,sd.underlined ? 1 : 0);	if (sd.specified & QSteStyleDefinition::sdCaseForce)		sendMsgToSci(SCI_STYLESETCASE,style,sd.caseForce);	if (sd.specified & QSteStyleDefinition::sdVisible)		sendMsgToSci(SCI_STYLESETVISIBLE,style,sd.visible ? 1 : 0);	if (sd.specified & QSteStyleDefinition::sdChangeable)		sendMsgToSci(SCI_STYLESETCHANGEABLE,style,sd.changeable ? 1 : 0);	sendMsgToSci(SCI_STYLESETCHARACTERSET,style);}void QSteEditor::setStyleFor(const char *lang){	for (int style = 0; style <= STYLE_MAX; style++) {		if (style != STYLE_DEFAULT) {			char key[200];			sprintf(key, "style.%s.%0d", lang, style);			SString sval = m_lexer->GetExpanded(key);			if (sval.length()) {				setOneStyle(style,sval.c_str());			}		}	}}void QSteEditor::setGlobalProper(){	if(m_global == NULL || m_globalShowDegree == m_global->getShowDegree())		return;	//forward properties	fowardProperties();	//selection color	SString selfore = m_global->Get("selection.fore");	if(selfore.length()){		sendMsgToSci(SCI_SETSELFORE,1UL,ColourFromString(selfore));	}else{		sendMsgToSci(SCI_SETSELFORE);	}	SString selback = m_global->Get("selection.back");	if(selback.length()){		sendMsgToSci(SCI_SETSELBACK,1UL,ColourFromString(selback));	}else{		if(selfore.length())			sendMsgToSci(SCI_SETSELBACK);		else			sendMsgToSci(SCI_SETSELBACK,1UL,ColourDesired(0xC0, 0xC0, 0xC0).AsLong());	}//	sendMsgToSci(SCI_SETSELALPHA,m_allowAlpha?m_global->GetInt("selection.alpha",SC_ALPHA_NOALPHA) : SC_ALPHA_NOALPHA);	//fold margin color	SString foldColour = m_global->Get("fold.margin.colour");	if(foldColour.length()){		sendMsgToSci(SCI_SETFOLDMARGINCOLOUR,1UL,ColourFromString(foldColour));	}else{		sendMsgToSci(SCI_SETFOLDMARGINCOLOUR);	}	SString foldHiliteColour = m_global->Get("fold.margin.highlight.colour");	if(foldHiliteColour.length()){		sendMsgToSci(SCI_SETFOLDMARGINHICOLOUR,1UL,ColourFromString(foldHiliteColour));	}else{		sendMsgToSci(SCI_SETFOLDMARGINHICOLOUR);	}	//white space fore & back	SString whitespaceFore = m_global->Get("whitespace.fore");	if(whitespaceFore.length()) {		sendMsgToSci(SCI_SETWHITESPACEFORE,1UL,ColourFromString(whitespaceFore));	}else{		sendMsgToSci(SCI_SETWHITESPACEFORE);	}	SString whitespaceBack = m_global->Get("whitespace.back");	if(whitespaceBack.length()) {		sendMsgToSci(SCI_SETWHITESPACEBACK,1UL,ColourFromString(whitespaceBack));	}else{		sendMsgToSci(SCI_SETWHITESPACEBACK);	}	//margin left & right	int blankMarginLeft = m_global->GetInt("blank.margin.left", 1);	int blankMarginRight = m_global->GetInt("blank.margin.right", 1);	sendMsgToSci(SCI_SETMARGINLEFT,0UL,blankMarginLeft);	sendMsgToSci(SCI_SETMARGINRIGHT,0UL,blankMarginRight);	//fold & symbol	m_marginWidth =  m_global->GetInt("fold.margin.width");	m_foldMargin = m_marginWidth;	if(m_marginWidth == 0)		m_marginWidth = 14;	makeFoldSymbol();		//get indent	m_indentMaintain = m_global->GetInt("indent.maintain");	m_indentOpening = m_global->GetInt("indent.opening");	m_indentClosing = m_global->GetInt("indent.closing");	m_autoIndent =m_global->GetInt("indent.automatic");	//set font	char key[200];	SString sval;	sendMsgToSci(SCI_STYLERESETDEFAULT);	sprintf(key,"style.%s.%0d","*",STYLE_DEFAULT);	sval = m_global->GetNewExpand(key);	setOneStyle(STYLE_DEFAULT,sval.c_str());	//set indent		setIndentSetting();		//brace match	m_bracesCheck = m_global->GetInt("braces.check");	m_bracesSloppy = m_global->GetInt("braces.sloppy");	//line num & margin	showLineNum(false);	showMargin(false);	//fold & envole	//wrap mode	setWrapMode();	//eol mode	setEolMod();}void QSteEditor::setLexProper(){	if(m_lexer == NULL || m_lexerShowDegree == m_lexer->getShowDegree())		return;	if(m_lexerShowDegree != -1)		sendMsgToSci(SCI_STYLERESETDEFAULT);	m_lexerShowDegree = m_lexer->getShowDegree();	//set language	sendMsgToSci(SCI_SETLEXERLANGUAGE,m_lexer->getLanguageType());	//set keyword	for(int wl = 0;wl <= KEYWORDSET_MAX;wl++){		SString kw = m_lexer->getKeyWord(wl);		sendMsgToSci(SCI_SETKEYWORDS,wl,kw.c_str());	}	//set style	//set font	char key[200];	SString sval;	sendMsgToSci(SCI_STYLERESETDEFAULT);	sprintf(key,"style.%s.%0d","*",STYLE_DEFAULT);	sval = m_lexer->GetNewExpand(key);	setOneStyle(STYLE_DEFAULT,sval.c_str());	sprintf(key, "style.%s.%0d",m_lexer->getLanguageType(), STYLE_DEFAULT);	sval = m_lexer->GetNewExpand(key);	setOneStyle(STYLE_DEFAULT,sval.c_str());	sendMsgToSci(SCI_STYLECLEARALL);	setStyleFor("*");	setStyleFor(m_lexer->getLanguageType());	//indent	SString type(".");	type += m_lexer->getLanguageType();	SString lookback = m_lexer->GetNewExpand("statement.lookback.",type.c_str());	m_statementLookBack = lookback.value();	m_statementIndent = getStyleAndWords("statement.indent.");	m_statementEnd = getStyleAndWords("statement.end.");	m_blockStart = getStyleAndWords("block.start.");	m_blockEnd = getStyleAndWords("block.end.");}bool QSteEditor::isModified(){	return sendMsgToSci(SCI_GETMODIFY);}void QSteEditor::deleteText(){	sendMsgToSci(SCI_DELETEBACK);}void QSteEditor::selectAll(){	sendMsgToSci(SCI_SELECTALL);}int QSteEditor::getTextLength(){	return sendMsgToSci(SCI_GETTEXTLENGTH);}QString QSteEditor::convertTextToQString(char *str){    if(isUtf8())        return QString::fromUtf8(str);	else	    return QString::fromLatin1(str);}int QSteEditor::getLineLength(int line){	if(line < 0 || line >= sendMsgToSci(SCI_GETLINECOUNT))		return -1;	return sendMsgToSci(SCI_LINELENGTH,line);}void QSteEditor::clear(){	//version1	sendMsgToSci(SCI_BEGINUNDOACTION);	sendMsgToSci(SCI_CLEARALL);	sendMsgToSci(SCI_ENDUNDOACTION);}void QSteEditor::setText(const QString &text){    if (isUtf8()){        sendMsgToSci(SCI_SETTEXT,text.toUtf8().data());	}else        sendMsgToSci(SCI_SETTEXT,text.toLatin1().data());	sendMsgToSci(SCI_EMPTYUNDOBUFFER);}int QSteEditor::getCurrLineNum(){	return sendMsgToSci(SCI_LINEFROMPOSITION,sendMsgToSci(SCI_GETCURRENTPOS));}bool QSteEditor::loadFile(const QString &filename){	//version1	if(filename.isEmpty())		return false;	QFile file(filename);	if(!file.open(QFile::ReadOnly))		return false;	QTextStream in(&file);	QApplication::setOverrideCursor(Qt::WaitCursor);	setText(in.readAll());	QApplication::restoreOverrideCursor();	setFileName(filename);	return true;}SString QSteEditor::getRange(int selStart,int selEnd){	if(selEnd > sendMsgToSci(SCI_GETTEXTLENGTH))		selEnd = sendMsgToSci(SCI_GETTEXTLENGTH);	if(selStart < 0)		selStart = 0;	SBuffer sel(selEnd - selStart);	TextRange tr;	tr.chrg.cpMin = selStart;	tr.chrg.cpMax = selEnd;	tr.lpstrText = sel.ptr();	sendMsgToSci(SCI_GETTEXTRANGE,reinterpret_cast<const char*>(&tr));	return SString(sel);}void QSteEditor::getRange(int start,int end,char *text){		TextRange tr;		tr.chrg.cpMin = start;		tr.chrg.cpMax = end;		tr.lpstrText = text;		sendMsgToSci(SCI_GETTEXTRANGE, 0UL, reinterpret_cast<const char*>(&tr));}void QSteEditor::setFileName(QString filename){	m_filename = filename;}const QString QSteEditor::getFileName() const{	return m_filename;}bool QSteEditor::saveFile(const QString filename){	//version1	if(filename.isEmpty())		return false;	QFile file(filename);	if(!file.open(QFile::WriteOnly))		return false;	QTextStream out(&file);	QApplication::setOverrideCursor(Qt::WaitCursor);	out << getText();	QApplication::restoreOverrideCursor();	setFileName(filename);	return true;}bool QSteEditor::isUtf8(){    return (sendMsgToSci(SCI_GETCODEPAGE) == SC_CP_UTF8);}void QSteEditor::setUtf8(bool cp){    setAttribute(Qt::WA_InputMethodEnabled, cp);    sendMsgToSci(SCI_SETCODEPAGE, (cp ? SC_CP_UTF8 : 0));}QString QSteEditor::getText(){	int bufflen = getTextLength() + 1;	char *buf = new char[bufflen];	sendMsgToSci(SCI_GETTEXT,bufflen,buf);	QString text = convertTextToQString(buf);	delete[] buf;	return text;}QString QSteEditor::getText(int linenum){	int bufflen = getLineLength(linenum);	if(bufflen < 1)		return QString();	char *buf = new char[bufflen + 1];	sendMsgToSci(SCI_GETLINE,linenum,buf);	buf[bufflen] = '\0';	QString text = convertTextToQString(buf);	delete[] buf;	return text;}void QSteEditor::getText(char *text,int sizeText,int line){	if (line < 0)		line = getCurrentLinenum();	int lineStart = sendMsgToSci(SCI_POSITIONFROMLINE,line);	int lineEnd = sendMsgToSci(SCI_GETLINEENDPOSITION, line);	int lineMax = lineStart + sizeText - 1;	if (lineEnd > lineMax)		lineEnd = lineMax;	getRange(lineStart,lineEnd, text);	text[lineEnd - lineStart] = '\0';}int QSteEditor::getCaretInLine(){	int caret = sendMsgToSci(SCI_GETCURRENTPOS);	int line = sendMsgToSci(SCI_LINEFROMPOSITION,caret);	int linestart = sendMsgToSci(SCI_POSITIONFROMLINE,line);	return caret - linestart;}int QSteEditor::getCurrentLinenum()

⌨️ 快捷键说明

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