Warning, file /office/kile/src/scripting/kilescriptdocument.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /******************************************************************************
0002   Copyright (C) 2011-2012 by Holger Danielsson (holger.danielsson@versanet.de)
0003  ******************************************************************************/
0004 
0005 /**************************************************************************
0006 *                                                                         *
0007 *   This program is free software; you can redistribute it and/or modify  *
0008 *   it under the terms of the GNU General Public License as published by  *
0009 *   the Free Software Foundation; either version 2 of the License, or     *
0010 *   (at your option) any later version.                                   *
0011 *                                                                         *
0012 ***************************************************************************/
0013 
0014 #include "scripting/kilescriptdocument.h"
0015 
0016 #include "kileinfo.h"
0017 #include "kileactions.h"
0018 
0019 namespace KileScript {
0020 
0021 
0022 KileScriptDocument::KileScriptDocument(QObject *parent, KileInfo* kileInfo, KileDocument::EditorExtension *editor, const QMap<QString,QAction *> *scriptActions)
0023     : QObject(parent)
0024     , m_kileInfo(kileInfo)
0025     , m_view(Q_NULLPTR)
0026     , m_document(Q_NULLPTR)
0027     , m_editor(editor)
0028     , m_editingTransaction(Q_NULLPTR)
0029     , m_scriptActions(scriptActions)
0030 {
0031 }
0032 
0033 ////////////////////////////////// view/document //////////////////////////////////////
0034 
0035 void KileScriptDocument::setView(KTextEditor::View *view)
0036 {
0037     m_view = view;
0038     m_document = m_view->document();
0039 }
0040 
0041 ////////////////////////////////// insert/remove/replace //////////////////////////////////////
0042 
0043 void KileScriptDocument::insertText(const QString &s)
0044 {
0045     QString cursorpos =  ( s.indexOf("%C") >= 0 ) ? QString() : "%C";
0046     m_editor->insertTag(KileAction::TagData(QString(),s,cursorpos,0,0), m_view);
0047 }
0048 
0049 void KileScriptDocument::insertText(int line, int column, const QString &s)
0050 {
0051     insertText(KTextEditor::Cursor(line, column),s);
0052 }
0053 
0054 void KileScriptDocument::insertText(const KTextEditor::Cursor& cursor, const QString &s)
0055 {
0056     m_view->setCursorPosition(cursor);
0057     insertText(s);
0058 }
0059 
0060 bool KileScriptDocument::removeText(int fromLine, int fromColumn, int toLine, int toColumn)
0061 {
0062     return removeText(KTextEditor::Range(fromLine, fromColumn, toLine, toColumn));
0063 }
0064 
0065 bool KileScriptDocument::removeText(const KTextEditor::Cursor& from, const KTextEditor::Cursor& to)
0066 {
0067     return removeText(KTextEditor::Range(from, to));
0068 }
0069 
0070 bool KileScriptDocument::removeText(const KTextEditor::Range& range)
0071 {
0072     return m_document->removeText(range);
0073 }
0074 
0075 bool KileScriptDocument::replaceText(const KTextEditor::Range& range, const QString &text)
0076 {
0077     return m_document->replaceText(range,text);
0078 }
0079 
0080 /////////////////////////////// document //////////////////////////////
0081 
0082 int KileScriptDocument::lines()
0083 {
0084     return m_document->lines();
0085 }
0086 
0087 int KileScriptDocument::length()
0088 {
0089     return m_document->totalCharacters();
0090 }
0091 
0092 KTextEditor::Range KileScriptDocument::documentRange()
0093 {
0094     return m_document->documentRange();
0095 }
0096 
0097 KTextEditor::Cursor KileScriptDocument::documentEnd()
0098 {
0099     return m_document->documentEnd();
0100 }
0101 
0102 /////////////////////////////// text //////////////////////////////
0103 
0104 QString KileScriptDocument::text()
0105 {
0106     return m_document->text();
0107 }
0108 
0109 QString KileScriptDocument::text(int fromLine, int fromColumn, int toLine, int toColumn)
0110 {
0111     return text( KTextEditor::Range(fromLine, fromColumn, toLine, toColumn) );
0112 }
0113 
0114 QString KileScriptDocument::text(const KTextEditor::Cursor& from, const KTextEditor::Cursor& to)
0115 {
0116     return text( KTextEditor::Range(from, to) );
0117 }
0118 
0119 QString KileScriptDocument::text(const KTextEditor::Range& range)
0120 {
0121     return m_document->text(range);
0122 }
0123 
0124 bool KileScriptDocument::setText(const QString &s)
0125 {
0126     return m_document->setText(s);
0127 }
0128 
0129 bool KileScriptDocument::clear()
0130 {
0131     return m_document->clear();
0132 }
0133 
0134 /////////////////////////////// line //////////////////////////////
0135 
0136 QString KileScriptDocument::line(int line)
0137 {
0138     return m_document->line(line);
0139 }
0140 
0141 QString KileScriptDocument::line()
0142 {
0143     return line( m_view->cursorPosition().line() );
0144 }
0145 
0146 int KileScriptDocument::lineLength()
0147 {
0148     return lineLength( m_view->cursorPosition().line() );
0149 }
0150 
0151 int KileScriptDocument::lineLength(int line)
0152 {
0153     return m_document->lineLength(line);
0154 }
0155 
0156 bool KileScriptDocument::insertLine(const QString &s)
0157 {
0158     return insertLine(m_view->cursorPosition().line(), s);
0159 }
0160 
0161 bool KileScriptDocument::insertLine(int line, const QString &s)
0162 {
0163     return m_document->insertLine(line, s);
0164 }
0165 
0166 bool KileScriptDocument::removeLine()
0167 {
0168     return removeLine( m_view->cursorPosition().line() );
0169 }
0170 
0171 bool KileScriptDocument::removeLine(int line)
0172 {
0173     return m_document->removeLine(line);
0174 }
0175 
0176 bool KileScriptDocument::replaceLine(const QString &s)
0177 {
0178     return replaceLine( m_view->cursorPosition().line(),s );
0179 }
0180 
0181 bool KileScriptDocument::replaceLine(int line,const QString &s)
0182 {
0183     return m_editor->replaceLine(line,s,m_view);
0184 }
0185 
0186 bool KileScriptDocument::truncateLine()
0187 {
0188     return truncate( m_view->cursorPosition() );
0189 }
0190 
0191 bool KileScriptDocument::truncate(int line, int column)
0192 {
0193     QString textline = m_document->line(line);
0194     if ( textline.isEmpty() || textline.length()<column ) {
0195         return false;
0196     }
0197 
0198     return removeText( KTextEditor::Range(line,column,line,textline.length()) );
0199 }
0200 
0201 bool KileScriptDocument::truncate(const KTextEditor::Cursor& cursor)
0202 {
0203     return truncate(cursor.line(), cursor.column());
0204 }
0205 
0206 /////////////////////////////// word //////////////////////////////
0207 
0208 QString KileScriptDocument::word()
0209 {
0210     return getWord( m_view->cursorPosition() );
0211 }
0212 
0213 QString KileScriptDocument::wordAt(int line, int column)
0214 {
0215     return getWord( KTextEditor::Cursor(line, column) );
0216 }
0217 
0218 QString KileScriptDocument::wordAt(const KTextEditor::Cursor& cursor)
0219 {
0220     return getWord(cursor);
0221 }
0222 
0223 KTextEditor::Range KileScriptDocument::wordRange()
0224 {
0225     return m_editor->wordRange( m_view->cursorPosition(),false,m_view );
0226 }
0227 
0228 QString KileScriptDocument::getWord(const KTextEditor::Cursor &cursor)
0229 {
0230     return m_editor->word(cursor,false,m_view);
0231 }
0232 
0233 /////////////////////////////// latex command //////////////////////////////
0234 
0235 QString KileScriptDocument::latexCommand()
0236 {
0237     return getLatexCommand( m_view->cursorPosition() );
0238 }
0239 
0240 QString KileScriptDocument::latexCommandAt(int line, int column)
0241 {
0242     return getLatexCommand( KTextEditor::Cursor(line, column) );
0243 }
0244 
0245 QString KileScriptDocument::latexCommandAt(const KTextEditor::Cursor &cursor)
0246 {
0247     return getLatexCommand(cursor);
0248 }
0249 
0250 KTextEditor::Range KileScriptDocument::latexCommandRange()
0251 {
0252     return m_editor->wordRange( m_view->cursorPosition(),true,m_view );
0253 }
0254 
0255 QString KileScriptDocument::getLatexCommand(const KTextEditor::Cursor &cursor)
0256 {
0257     return m_editor->word(cursor,true,m_view);
0258 }
0259 
0260 /////////////////////////////// char //////////////////////////////
0261 
0262 QString KileScriptDocument::charAt(int line, int column)
0263 {
0264     return charAt(KTextEditor::Cursor(line,column));
0265 }
0266 
0267 QString KileScriptDocument::charAt(const KTextEditor::Cursor& cursor)
0268 {
0269     return QString(m_document->characterAt(cursor));
0270 }
0271 
0272 QString KileScriptDocument::firstChar(int line)
0273 {
0274     QString textline = m_document->line(line);
0275     int pos =  nextNonSpaceChar(textline,0);
0276     return ( pos >= 0 ) ? QString(textline.at(pos)) : QString();
0277 }
0278 
0279 QString KileScriptDocument::lastChar(int line)
0280 {
0281     QString textline = m_document->line(line);
0282     int pos = previousNonSpaceChar(textline,textline.length()-1);
0283     return ( pos >= 0 ) ? QString(textline.at(pos)) : QString();
0284 }
0285 
0286 bool KileScriptDocument::isSpace(int line, int column)
0287 {
0288     return isSpace(KTextEditor::Cursor(line,column));
0289 }
0290 
0291 bool KileScriptDocument::isSpace(const KTextEditor::Cursor& cursor)
0292 {
0293     return m_document->characterAt(cursor).isSpace();
0294 }
0295 
0296 /////////////////////////////// bullet //////////////////////////////
0297 
0298 void KileScriptDocument::insertBullet()
0299 {
0300     m_editor->insertBullet(m_view);
0301 }
0302 
0303 void KileScriptDocument::nextBullet()
0304 {
0305     m_editor->nextBullet(m_view);
0306 }
0307 
0308 void KileScriptDocument::previousBullet()
0309 {
0310     m_editor->prevBullet(m_view);
0311 }
0312 
0313 /////////////////////////////// environment //////////////////////////////
0314 
0315 bool KileScriptDocument::hasEnvironment()
0316 {
0317     return m_editor->hasEnvironment(m_view);
0318 }
0319 
0320 QString KileScriptDocument::environmentName()
0321 {
0322     return m_editor->environmentName(m_view);
0323 }
0324 
0325 QString KileScriptDocument::environment(bool inside)
0326 {
0327     return m_editor->environmentText(inside,m_view);
0328 }
0329 
0330 KTextEditor::Range KileScriptDocument::environmentRange(bool inside)
0331 {
0332     return m_editor->environmentRange(inside,m_view);
0333 }
0334 
0335 void KileScriptDocument::removeEnvironment(bool inside)
0336 {
0337     m_editor->deleteEnvironment(inside,m_view);
0338 }
0339 
0340 void KileScriptDocument::closeEnvironment()
0341 {
0342     m_editor->closeEnvironment(m_view);
0343 }
0344 
0345 void KileScriptDocument::closeAllEnvironments()
0346 {
0347     m_editor->closeAllEnvironments(m_view);
0348 }
0349 
0350 ////////////////////////////////// TexGroup //////////////////////////////////////
0351 
0352 bool KileScriptDocument::hasTexgroup()
0353 {
0354     return m_editor->hasTexgroup(m_view);
0355 }
0356 
0357 QString KileScriptDocument::texgroup(bool inside)
0358 {
0359     return m_editor->getTexgroupText(inside,m_view);
0360 }
0361 
0362 KTextEditor::Range KileScriptDocument::texgroupRange(bool inside)
0363 {
0364     return m_editor->texgroupRange(inside,m_view);
0365 }
0366 
0367 void KileScriptDocument::removeTexgroup(bool inside)
0368 {
0369     return m_editor->deleteTexgroup(inside,m_view);
0370 }
0371 
0372 ////////////////////////////////// MathGroup //////////////////////////////////////
0373 
0374 bool KileScriptDocument::hasMathgroup()
0375 {
0376     return m_editor->hasMathgroup(m_view);
0377 }
0378 
0379 QString KileScriptDocument::mathgroup()
0380 {
0381     return m_editor->getMathgroupText(m_view);
0382 }
0383 
0384 KTextEditor::Range KileScriptDocument::mathgroupRange()
0385 {
0386     return m_editor->mathgroupRange(m_view);
0387 }
0388 
0389 void KileScriptDocument::removeMathgroup()
0390 {
0391     m_editor->deleteMathgroup(m_view);
0392 }
0393 
0394 ////////////////////////////////// Paragraph //////////////////////////////////////
0395 
0396 QString KileScriptDocument::paragraph()
0397 {
0398     return m_editor->getParagraphText(m_view);
0399 }
0400 
0401 KTextEditor::Range KileScriptDocument::paragraphRange()
0402 {
0403     return m_editor->findCurrentParagraphRange(m_view);
0404 }
0405 
0406 void KileScriptDocument::removeParagraph()
0407 {
0408     m_editor->deleteParagraph(m_view);
0409 }
0410 
0411 ////////////////////////////////// matches //////////////////////////////////////
0412 
0413 bool KileScriptDocument::matchesAt(int line, int column, const QString &s)
0414 {
0415     return matchesAt(KTextEditor::Cursor(line,column),s);
0416 }
0417 
0418 bool KileScriptDocument::matchesAt(const KTextEditor::Cursor& cursor, const QString &s)
0419 {
0420     QString textline = m_document->line(cursor.line());
0421     return textline.mid(cursor.column()).startsWith(s);
0422 }
0423 
0424 bool KileScriptDocument::startsWith (int line, const QString &pattern, bool skipWhiteSpaces)
0425 {
0426     QString textline = m_document->line(line);
0427     if ( skipWhiteSpaces ) {
0428         textline = textline.trimmed();
0429     }
0430     return textline.startsWith(pattern);
0431 }
0432 
0433 bool KileScriptDocument::endsWith (int line, const QString &pattern, bool skipWhiteSpaces)
0434 {
0435     QString textline = m_document->line(line);
0436     if ( skipWhiteSpaces ) {
0437         textline = textline.trimmed();
0438     }
0439     return  textline.endsWith(pattern);
0440 }
0441 
0442 ////////////////////////////////// columns/lines //////////////////////////////////////
0443 
0444 int KileScriptDocument::firstColumn(int line)
0445 {
0446     QString textline = m_document->line(line);
0447     return ( textline.isEmpty() ) ? -1 : nextNonSpaceChar(textline,0);
0448 }
0449 
0450 int KileScriptDocument::lastColumn(int line)
0451 {
0452     QString textline = m_document->line(line);
0453     return ( textline.isEmpty() ) ? -1 : previousNonSpaceChar(textline,textline.length()-1);
0454 }
0455 
0456 int KileScriptDocument::prevNonSpaceColumn(int line, int column)
0457 {
0458     QString textline = m_document->line(line);
0459     return ( textline.isEmpty() || column==0 ) ? -1 : previousNonSpaceChar(textline,column-1);
0460 }
0461 
0462 int KileScriptDocument::prevNonSpaceColumn(const KTextEditor::Cursor& cursor)
0463 {
0464     return prevNonSpaceColumn(cursor.line(), cursor.column());
0465 }
0466 
0467 int KileScriptDocument::nextNonSpaceColumn(int line, int column)
0468 {
0469     QString textline = m_document->line(line);
0470     return ( textline.isEmpty() || column>=textline.length() ) ? -1 : nextNonSpaceChar(textline,column+1);
0471 }
0472 
0473 int KileScriptDocument::nextNonSpaceColumn(const KTextEditor::Cursor& cursor)
0474 {
0475     return nextNonSpaceColumn(cursor.line(), cursor.column());
0476 }
0477 
0478 int KileScriptDocument::prevNonEmptyLine(int line)
0479 {
0480     return m_editor->prevNonEmptyLine(line,m_view);
0481 }
0482 
0483 int KileScriptDocument::nextNonEmptyLine(int line)
0484 {
0485     return m_editor->nextNonEmptyLine(line,m_view);
0486 }
0487 
0488 int KileScriptDocument::previousNonSpaceChar(const QString &s, int pos) const
0489 {
0490     if ( pos >= s.length() ) {
0491         pos = s.length() - 1;
0492     }
0493 
0494     for (int i=pos; i>=0; --i ) {
0495         if ( !s[i].isSpace() ) {
0496             return i;
0497         }
0498     }
0499     return -1;
0500 }
0501 
0502 int KileScriptDocument::nextNonSpaceChar(const QString &s, int pos) const
0503 {
0504     if ( pos < 0 ) {
0505         pos = 0;
0506     }
0507 
0508     for ( int i=pos; i<s.length(); ++i ) {
0509         if ( !s[i].isSpace() ) {
0510             return i;
0511         }
0512     }
0513     return -1;
0514 }
0515 
0516 ////////////////////////////////// goto //////////////////////////////////////
0517 
0518 void KileScriptDocument::gotoBeginEnv()
0519 {
0520     m_editor->gotoEnvironment(true,m_view);
0521 }
0522 
0523 void KileScriptDocument::gotoEndEnv()
0524 {
0525     m_editor->gotoEnvironment(false,m_view);
0526 }
0527 
0528 void KileScriptDocument::gotoBeginTexgroup()
0529 {
0530     m_editor->gotoTexgroup(true,m_view);
0531 }
0532 
0533 void KileScriptDocument::gotoEndTexgroup()
0534 {
0535     m_editor->gotoTexgroup(false,m_view);
0536 }
0537 
0538 void KileScriptDocument::gotoNextParagraph()
0539 {
0540     m_editor->gotoNextParagraph(m_view);
0541 }
0542 
0543 void KileScriptDocument::gotoPrevParagraph()
0544 {
0545     m_editor->gotoPrevParagraph(m_view);
0546 }
0547 
0548 void KileScriptDocument::gotoNextSectioning()
0549 {
0550     m_editor->gotoSectioning(false,m_view);
0551 }
0552 
0553 void KileScriptDocument::gotoPrevSectioning()
0554 {
0555     m_editor->gotoSectioning(true,m_view);
0556 }
0557 
0558 void KileScriptDocument::gotoLine(int line)
0559 {
0560     m_editor->goToLine(line,m_view);
0561 }
0562 
0563 ////////////////////////////////// insert sectioning tags  //////////////////////////////////////
0564 
0565 void KileScriptDocument::insertChapter()
0566 {
0567     triggerAction("tag_chapter");
0568 }
0569 
0570 void KileScriptDocument::insertSection()
0571 {
0572     triggerAction("tag_section");
0573 }
0574 
0575 void KileScriptDocument::insertSubsection()
0576 {
0577     triggerAction("tag_subsection");
0578 }
0579 
0580 void KileScriptDocument::insertSubsubsection()
0581 {
0582     triggerAction("tag_subsubsection");
0583 }
0584 
0585 void KileScriptDocument::insertParagraph()
0586 {
0587     triggerAction("tag_paragraph");
0588 }
0589 
0590 void KileScriptDocument::insertSubparagraph()
0591 {
0592     triggerAction("tag_subparagraph");
0593 }
0594 
0595 ////////////////////////////////// insert reference tags  //////////////////////////////////////
0596 
0597 void KileScriptDocument::insertLabel()
0598 {
0599     triggerAction("tag_label");
0600 }
0601 
0602 void KileScriptDocument::insertReference()
0603 {
0604     triggerAction("tag_ref");
0605 }
0606 
0607 void KileScriptDocument::insertPageref()
0608 {
0609     triggerAction("tag_pageref");
0610 }
0611 
0612 void KileScriptDocument::insertIndex()
0613 {
0614     triggerAction("tag_index");
0615 }
0616 
0617 void KileScriptDocument::insertFootnote()
0618 {
0619     triggerAction("tag_footnote");
0620 }
0621 
0622 void KileScriptDocument::insertCitation()
0623 {
0624     triggerAction("tag_cite");
0625 }
0626 
0627 bool KileScriptDocument::triggerAction(const QString &name)
0628 {
0629     if ( m_scriptActions->contains(name) ) {
0630         m_scriptActions->value(name)->trigger();
0631         return true;
0632     }
0633     else {
0634         return false;
0635     }
0636 }
0637 
0638 ////////////////////////////////// actions with selections//////////////////////////////////////
0639 
0640 void KileScriptDocument::comment()
0641 {
0642     triggerSelectionAction("tools_comment");
0643 }
0644 
0645 void KileScriptDocument::uncomment()
0646 {
0647     triggerSelectionAction("tools_uncomment");
0648 }
0649 
0650 void KileScriptDocument::uppercase()
0651 {
0652     triggerSelectionAction("tools_uppercase");
0653 }
0654 
0655 void KileScriptDocument::lowercase()
0656 {
0657     triggerSelectionAction("tools_lowercase");
0658 }
0659 
0660 void KileScriptDocument::capitalize()
0661 {
0662     triggerSelectionAction("tools_capitalize");
0663 }
0664 
0665 void KileScriptDocument::joinLines()
0666 {
0667     triggerSelectionAction("tools_join_lines");
0668 }
0669 
0670 bool KileScriptDocument::triggerSelectionAction(const QString &name)
0671 {
0672     return ( m_view->selection() ) ? triggerAction(name) : false;
0673 }
0674 
0675 ////////////////////////////////// other  //////////////////////////////////////
0676 
0677 void KileScriptDocument::insertIntelligentNewline()
0678 {
0679     m_editor->insertIntelligentNewline(m_view);
0680 }
0681 
0682 void KileScriptDocument::insertIntelligentTabulator()
0683 {
0684     m_editor->insertIntelligentTabulator(m_view);
0685 }
0686 
0687 void KileScriptDocument::editBegin()
0688 {
0689     Q_ASSERT(!m_editingTransaction);
0690     if (m_editingTransaction) {
0691         KILE_DEBUG_MAIN << "editor editing transaction was active, forcefully closing it";
0692         m_editingTransaction->finish();
0693         delete m_editingTransaction;
0694     }
0695     m_editingTransaction = new KTextEditor::Document::EditingTransaction(m_document);
0696     m_editingTransaction->start();
0697 }
0698 
0699 void KileScriptDocument::editEnd()
0700 {
0701     Q_ASSERT(m_editingTransaction);
0702     if (!m_editingTransaction) {
0703         KILE_DEBUG_MAIN << "unexpectedly no editing transaction was active, aborting";
0704         return;
0705     }
0706 
0707     m_editingTransaction->finish();
0708     delete m_editingTransaction;
0709     m_editingTransaction = Q_NULLPTR;
0710 }
0711 
0712 ////////////////////////////////// Kile specific actions //////////////////////////////////////
0713 
0714 void KileScriptDocument::refreshStructure()
0715 {
0716     triggerAction("refreshstructure");
0717 }
0718 
0719 ////////////////////////////////// lists //////////////////////////////////////
0720 
0721 QStringList KileScriptDocument::labelList() const
0722 {
0723     return m_kileInfo->allLabels();
0724 }
0725 
0726 QStringList KileScriptDocument::bibitemList() const
0727 {
0728     return m_kileInfo->allBibItems();
0729 }
0730 
0731 
0732 
0733 
0734 
0735 }
0736