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