File indexing completed on 2024-04-21 15:55:34
0001 /********************************************************************************************* 0002 copyright : (C) 2004-2007 by Holger Danielsson (holger.danielsson@versanet.de) 0003 2008-2011 by Michel Ludwig (michel.ludwig@kdemail.net) 0004 2012 by Holger Danielsson (holger.danielsson@versanet.de) 0005 *********************************************************************************************/ 0006 0007 /*************************************************************************** 0008 * * 0009 * This program is free software; you can redistribute it and/or modify * 0010 * it under the terms of the GNU General Public License as published by * 0011 * the Free Software Foundation; either version 2 of the License, or * 0012 * (at your option) any later version. * 0013 * * 0014 ***************************************************************************/ 0015 0016 #ifndef EDITOREXTENSION_H 0017 #define EDITOREXTENSION_H 0018 0019 #include <QObject> 0020 #include <QRegExp> 0021 #include <QString> 0022 #include <QStringList> 0023 0024 #include <KTextEditor/Document> 0025 0026 #include "widgets/structurewidget.h" 0027 #include "latexcmd.h" 0028 0029 class KileInfo; 0030 namespace KileAction { 0031 class TagData; 0032 } 0033 0034 namespace KileDocument 0035 { 0036 0037 class EditorExtension : public QObject 0038 { 0039 Q_OBJECT 0040 0041 public: 0042 explicit EditorExtension(KileInfo *); 0043 ~EditorExtension(); 0044 0045 enum EnvType {EnvNone, EnvList, EnvTab, EnvCrTab}; 0046 0047 enum SelectMode {smTex, smLetter, smWord, smNospace}; 0048 0049 void readConfig(); 0050 0051 void insertTag(const KileAction::TagData& data, KTextEditor::View *view); 0052 0053 QString getTextLineReal(KTextEditor::Document *doc, int row); 0054 void gotoBullet(bool backwards, KTextEditor::View *view = Q_NULLPTR); 0055 void selectLine(int line,KTextEditor::View *view = Q_NULLPTR); 0056 bool replaceLine(int line, const QString &s, KTextEditor::View *view = Q_NULLPTR); 0057 0058 void gotoEnvironment(bool backwards, KTextEditor::View *view = Q_NULLPTR); 0059 void matchEnvironment(KTextEditor::View *view = Q_NULLPTR); 0060 void closeEnvironment(KTextEditor::View *view = Q_NULLPTR); 0061 void closeAllEnvironments(KTextEditor::View *view = Q_NULLPTR); 0062 void selectEnvironment(bool inside, KTextEditor::View *view = Q_NULLPTR); 0063 void deleteEnvironment(bool inside, KTextEditor::View *view = Q_NULLPTR); 0064 QString autoIndentEnvironment() { 0065 return m_envAutoIndent; 0066 } 0067 0068 bool hasTexgroup(KTextEditor::View *view = Q_NULLPTR); 0069 void gotoTexgroup(bool backwards, KTextEditor::View *view = Q_NULLPTR); 0070 void selectTexgroup(bool inside, KTextEditor::View *view = Q_NULLPTR); 0071 void deleteTexgroup(bool inside, KTextEditor::View *view = Q_NULLPTR); 0072 KTextEditor::Range texgroupRange(bool inside=true, KTextEditor::View *view = Q_NULLPTR); 0073 QString getTexgroupText(bool inside=true, KTextEditor::View *view = Q_NULLPTR); 0074 0075 /** 0076 * Returns a (potentially) translated list of options for inserting double quotes 0077 */ 0078 const QStringList doubleQuotesListI18N() { 0079 return m_quoteListI18N; 0080 } 0081 0082 // get current word 0083 bool getCurrentWord(KTextEditor::Document *doc, int row, int col, SelectMode mode, QString &word, int &x1, int &x2); 0084 QString getEnvironmentText(int &row, int &col, QString &name, KTextEditor::View *view = Q_NULLPTR); 0085 bool hasEnvironment(KTextEditor::View *view = Q_NULLPTR); 0086 0087 KTextEditor::Range environmentRange(bool inside=false, KTextEditor::View *view = Q_NULLPTR); 0088 QString environmentName(KTextEditor::View *view = Q_NULLPTR); 0089 QString environmentText(bool inside=false, KTextEditor::View *view = Q_NULLPTR); 0090 0091 KTextEditor::Range wordRange(const KTextEditor::Cursor &cursor, bool latexCommand=false, KTextEditor::View *view = Q_NULLPTR); 0092 QString word(const KTextEditor::Cursor &cursor, bool latexCommand=false, KTextEditor::View *view = Q_NULLPTR); 0093 0094 KTextEditor::Range findCurrentParagraphRange(KTextEditor::View *view, bool wholeLines = true); 0095 QString getParagraphText(KTextEditor::View *view); 0096 int prevNonEmptyLine(int line, KTextEditor::View *view = Q_NULLPTR); 0097 int nextNonEmptyLine(int line, KTextEditor::View *view = Q_NULLPTR); 0098 0099 // complete environment 0100 bool eventInsertEnvironment(KTextEditor::View *view); 0101 0102 // mathgroup 0103 QString getMathgroupText(uint &row, uint &col, KTextEditor::View *view = Q_NULLPTR); 0104 QString getMathgroupText(KTextEditor::View *view = Q_NULLPTR); 0105 bool hasMathgroup(KTextEditor::View *view = Q_NULLPTR); 0106 KTextEditor::Range mathgroupRange(KTextEditor::View *view = Q_NULLPTR); 0107 0108 bool moveCursorRight(KTextEditor::View *view = Q_NULLPTR); 0109 bool moveCursorLeft(KTextEditor::View *view = Q_NULLPTR); 0110 bool moveCursorUp(KTextEditor::View *view = Q_NULLPTR); 0111 bool moveCursorDown(KTextEditor::View *view = Q_NULLPTR); 0112 0113 public Q_SLOTS: 0114 void insertIntelligentNewline(KTextEditor::View *view = Q_NULLPTR); 0115 0116 void selectEnvInside() { 0117 selectEnvironment(true); 0118 } 0119 void selectEnvOutside() { 0120 selectEnvironment(false); 0121 } 0122 void deleteEnvInside() { 0123 deleteEnvironment(true); 0124 } 0125 void deleteEnvOutside() { 0126 deleteEnvironment(false); 0127 } 0128 void gotoBeginEnv() { 0129 gotoEnvironment(true); 0130 } 0131 void gotoEndEnv() { 0132 gotoEnvironment(false); 0133 } 0134 void matchEnv() { 0135 matchEnvironment(); 0136 } 0137 void closeEnv() { 0138 closeEnvironment(); 0139 } 0140 void closeAllEnv() { 0141 closeAllEnvironments(); 0142 } 0143 0144 void selectTexgroupInside() { 0145 selectTexgroup(true); 0146 } 0147 void selectTexgroupOutside() { 0148 selectTexgroup(false); 0149 } 0150 void deleteTexgroupInside() { 0151 deleteTexgroup(true); 0152 } 0153 void deleteTexgroupOutside() { 0154 deleteTexgroup(false); 0155 } 0156 void gotoBeginTexgroup() { 0157 gotoTexgroup(true); 0158 } 0159 void gotoEndTexgroup() { 0160 gotoTexgroup(false); 0161 } 0162 void matchTexgroup(KTextEditor::View *view = Q_NULLPTR); 0163 void closeTexgroup(KTextEditor::View *view = Q_NULLPTR); 0164 0165 void selectParagraph(KTextEditor::View *view = Q_NULLPTR, bool wholeLines = true); 0166 void selectLine(KTextEditor::View *view = Q_NULLPTR); 0167 void selectLines(int from, int to, KTextEditor::View *view = Q_NULLPTR); 0168 void selectWord(SelectMode mode = smTex, KTextEditor::View *view = Q_NULLPTR); 0169 void deleteParagraph(KTextEditor::View *view = Q_NULLPTR); 0170 void deleteEndOfLine(KTextEditor::View *view = Q_NULLPTR); 0171 void deleteWord(SelectMode mode = smTex, KTextEditor::View *view = Q_NULLPTR); 0172 0173 void selectMathgroup(KTextEditor::View *view = Q_NULLPTR); 0174 void deleteMathgroup(KTextEditor::View *view = Q_NULLPTR); 0175 0176 void nextBullet(KTextEditor::View* view = Q_NULLPTR); 0177 void prevBullet(KTextEditor::View* view = Q_NULLPTR); 0178 void insertBullet(KTextEditor::View* view = Q_NULLPTR); 0179 0180 void gotoNextParagraph(KTextEditor::View *view = Q_NULLPTR); 0181 void gotoPrevParagraph(KTextEditor::View *view = Q_NULLPTR); 0182 0183 void gotoNextSectioning(); 0184 void gotoPrevSectioning(); 0185 void gotoSectioning(bool backwards, KTextEditor::View *view = Q_NULLPTR); 0186 void sectioningCommand(KileWidget::StructureViewItem *item, int id); 0187 0188 bool insertDoubleQuotes(KTextEditor::View *view = Q_NULLPTR); 0189 void initDoubleQuotes(); 0190 0191 bool insertLatexFromUnicode(unsigned short rep, KTextEditor::View *view); 0192 bool insertSpecialCharacter(const QString& texString, KTextEditor::View *view = Q_NULLPTR, const QString& dep = ""); 0193 0194 void insertIntelligentTabulator(KTextEditor::View *view = Q_NULLPTR); 0195 0196 void moveCursorToLastPositionInCurrentLine(KTextEditor::View *view = Q_NULLPTR); 0197 void keyReturn(KTextEditor::View *view = Q_NULLPTR); 0198 void commentLaTeX(KTextEditor::Document* document, const KTextEditor::Range &range); 0199 0200 void goToLine(int line, KTextEditor::View *view = Q_NULLPTR); 0201 0202 private: 0203 0204 enum EnvTag {EnvBegin, EnvEnd}; 0205 0206 enum EnvPos {EnvLeft, EnvInside, EnvRight}; 0207 0208 enum MathTag {mmNoMathMode, mmMathDollar, mmMathParen, mmDisplaymathParen, mmMathEnv, mmDisplaymathEnv}; 0209 0210 enum CursorMove {MoveCursorLeft, MoveCursorRight, MoveCursorUp, MoveCursorDown}; 0211 0212 struct EnvData { 0213 int row; 0214 int col; 0215 QString name; 0216 int len; 0217 EnvPos cpos; 0218 EnvTag tag; 0219 EnvType type; 0220 }; 0221 0222 struct MathData { 0223 int row; 0224 int col; 0225 int len; 0226 unsigned int numdollar; 0227 MathTag tag; 0228 QString envname; 0229 }; 0230 0231 struct BracketData { 0232 int row; 0233 int col; 0234 bool open; 0235 }; 0236 0237 QRegExp m_reg; 0238 bool m_overwritemode; 0239 QString m_envAutoIndent; 0240 0241 KileInfo *m_ki; 0242 0243 // complete environments 0244 QRegExp m_regexpEnter; 0245 0246 // double Quotes 0247 bool m_dblQuotes; 0248 QStringList m_quoteListI18N; 0249 QList<QPair<QString, QString> > m_quoteList; 0250 QString m_leftDblQuote, m_rightDblQuote; 0251 0252 // special chars 0253 bool m_specialCharacters; 0254 0255 // change cursor position 0256 bool increaseCursorPosition(KTextEditor::Document *doc, int &row, int &col); 0257 bool decreaseCursorPosition(KTextEditor::Document *doc, int &row, int &col); 0258 bool moveCursor(KTextEditor::View *view, CursorMove direction); 0259 0260 // check position 0261 bool isValidBackslash(KTextEditor::Document *doc, int row, int col); 0262 bool isCommentPosition(KTextEditor::Document *doc, int row, int col); 0263 bool isEnvironmentPosition(KTextEditor::Document *doc, int row, int col,EnvData &env); 0264 0265 // find environment tags 0266 bool findBeginEnvironment(KTextEditor::Document *doc, int row, int col, EnvData &env); 0267 bool findEndEnvironment(KTextEditor::Document *doc, int row, int col, EnvData &env); 0268 bool findEnvironmentTag(KTextEditor::Document *doc, int row, int col, EnvData &env, bool backwards = false); 0269 bool findOpenedEnvironment(int &row, int &col, QString &envname, KTextEditor::View *view); 0270 QStringList findOpenedEnvironmentList(KTextEditor::View *view, bool position = false); 0271 0272 // get current environment 0273 bool getEnvironment(bool inside, EnvData &envbegin, EnvData &envend,KTextEditor::View *view); 0274 bool expandSelectionEnvironment(bool inside, KTextEditor::View *view); 0275 0276 // find brackets 0277 bool isBracketPosition(KTextEditor::Document *doc, int row, int col, BracketData &bracket); 0278 bool findOpenBracket(KTextEditor::Document *doc, int row, int col, BracketData &bracket); 0279 bool findCloseBracket(KTextEditor::Document *doc, int row, int col, BracketData &bracket); 0280 bool findCloseBracketTag(KTextEditor::Document *doc, int row, int col,BracketData &bracket); 0281 bool findOpenBracketTag(KTextEditor::Document *doc, int row, int col, BracketData &bracket); 0282 0283 // find math tags 0284 bool isOpeningMathTagPosition(KTextEditor::Document *doc, uint row, uint col, MathData &mathdata); 0285 bool isClosingMathTagPosition(KTextEditor::Document *doc, uint row, uint col, MathData &mathdata); 0286 bool findOpenMathTag(KTextEditor::Document *doc, int row, int col, MathData &mathdata); 0287 bool findCloseMathTag(KTextEditor::Document *doc, int row, int col, MathData &mathdata); 0288 bool checkMathtags(const MathData &begin,const MathData &end); 0289 0290 // mathgroup 0291 bool getMathgroup(KTextEditor::View *view, int &row1, int &col1, int &row2, int &col2); 0292 0293 // get current Texgroup 0294 bool getTexgroup(bool inside, BracketData &open, BracketData &close, KTextEditor::View *view); 0295 0296 // find current paragraph 0297 bool findCurrentTexParagraph(int &startline, int &endline, KTextEditor::View *view); 0298 bool findCurrentTexParagraph(int &startline, int& startcolumn, int &endline, int& endcolumn, KTextEditor::View *view); 0299 0300 // sectioning commands 0301 bool findEndOfDocument(KTextEditor::Document *doc, int row, int col, int &rowFound, int &colFound); 0302 0303 // check environment type 0304 KileDocument::LatexCommands *m_latexCommands; 0305 bool shouldCompleteEnv(const QString &envname, KTextEditor::View *view); 0306 QString getWhiteSpace(const QString &s); 0307 0308 // verbatim text 0309 bool insideVerb(KTextEditor::View *view); 0310 bool insideVerbatim(KTextEditor::View *view); 0311 0312 // help 0313 void readHelpList(QString const &filename); 0314 0315 KTextEditor::View *determineView(KTextEditor::View *view); 0316 void deleteRange(KTextEditor::Range &range, KTextEditor::View *view); 0317 0318 QString extractIndentationString(KTextEditor::View *view, int line); 0319 }; 0320 0321 } 0322 0323 #endif