📄 qsteeditor.cpp
字号:
#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 + -