void EditorTabWidget::closeCurrentDocument() { if(count() == 0) return; m_closeGuard = true; int index = currentPageIndex(); QValueList<Document_t>::iterator it = m_docList.at(index); KTextEditor::Document* doc = (*it).view->document(); doc->closeURL(); KTextEditor::View* view = (*it).view; delete view; delete doc; QWidget* w = page(index); removePage(w); m_docList.remove(it); if(count() == 0) { disableEditorActions(); } m_closeGuard = false; }
bool EditorTabWidget::saveCurrentFile() { if(count() == 0) return false; KTextEditor::Document *doc = (*(m_docList.at(currentPageIndex()))).view->document(); return doc->save(); }
void TestShellDocumentOperation::testKateDocumentAndViewCreation() { //create one document IDocumentController *documentController = Core::self()->documentController(); documentController->openDocumentFromText(QLatin1String("")); QCOMPARE(documentController->openDocuments().count(), 1); //assure we have only one kate view for the newly created document KTextEditor::Document *doc = documentController->openDocuments().at(0)->textDocument(); QCOMPARE(doc->views().count(), 1); QCOMPARE(dynamic_cast<KTextEditor::MovingInterface*>(doc)->revision(), qint64(0)); //also assure the view's xmlgui is plugged in KParts::MainWindow *main = Core::self()->uiControllerInternal()->activeMainWindow(); QVERIFY(main); QVERIFY(main->guiFactory()->clients().contains(doc->views().at(0))); //KTextEditor::views is internally a QHash::keys() call: so the order of the views will vary const auto originalView = doc->views().at(0); //create the new view and activate it (using split action from mainwindow) QAction *splitAction = main->actionCollection()->action(QStringLiteral("split_vertical")); QVERIFY(splitAction); splitAction->trigger(); const auto viewList = doc->views(); QCOMPARE(viewList.count(), 2); const auto newlySplitView = originalView == viewList[0] ? viewList[1] : viewList[0]; //check that we did switch to the new xmlguiclient QVERIFY(!main->guiFactory()->clients().contains(originalView)); QVERIFY(main->guiFactory()->clients().contains(newlySplitView)); documentController->openDocuments().at(0)->close(IDocument::Discard); }
void Konsole::sync() { if(!KileConfig::syncConsoleDirWithTabs()) { return; } KTextEditor::Document *doc = m_ki->activeTextDocument(); KTextEditor::View *view = Q_NULLPTR; if(doc) { view = doc->views().first(); } if(view) { QString finame; QUrl url = view->document()->url(); if(url.path().isEmpty()) { return; } QFileInfo fic(url.adjusted(QUrl::RemoveFilename|QUrl::StripTrailingSlash).path()); if(fic.isReadable()) { setDirectory(url.adjusted(QUrl::RemoveFilename|QUrl::StripTrailingSlash).path()); } } }
KTextEditor::View* HtmlEditor::createView( QWidget* parent ) { KTextEditor::Document *document = mEditor->createDocument( parent ); bool result = document->setHighlightingMode( "html" ); if ( result ) { kDebug() << "Syntax highlighting enabled"; } KTextEditor::View *view = document->createView( parent ); QMenu *menu = view->defaultContextMenu(); KTextEditor::ConfigInterface *interface = qobject_cast< KTextEditor::ConfigInterface* >( view ); if ( interface ) { KAction *actWordWrap = new KAction( i18n( "Dynamic Word Wrap" ), view ); actWordWrap->setCheckable( true ); connect( actWordWrap, SIGNAL(triggered(bool)), this, SLOT(toggleWordWrap()) ); KAction *actLineNumber = new KAction( i18n("Show line numbers"), view ); actLineNumber->setCheckable( true ); connect( actLineNumber, SIGNAL(triggered(bool)), this, SLOT(toggleLineNumber()) ); QMenu *options = new QMenu( i18n( "Options" ), qobject_cast< QWidget* >( view ) ); options->addAction( actWordWrap ); options->addAction( actLineNumber ); menu->addSeparator(); menu->addMenu( options ); interface->setConfigValue( "dynamic-word-wrap", true ); actWordWrap->setChecked( true ); } view->setContextMenu( menu ); return view; }
void KateFileTree::slotFixOpenWithMenu() { QMenu *menu = (QMenu*)sender(); menu->clear(); KTextEditor::Document *doc = model()->data(m_indexContextMenu, KateFileTreeModel::DocumentRole).value<KTextEditor::Document *>(); if (!doc) return; // get a list of appropriate services. KMimeType::Ptr mime = KMimeType::mimeType(doc->mimeType()); //kDebug(13001) << "mime type: " << mime->name(); QAction *a = 0; KService::List offers = KMimeTypeTrader::self()->query(mime->name(), "Application"); // for each one, insert a menu item... for(KService::List::Iterator it = offers.begin(); it != offers.end(); ++it) { KService::Ptr service = *it; if (service->name() == "Kate") continue; a = menu->addAction(KIcon(service->icon()), service->name()); a->setData(service->entryPath()); } // append "Other..." to call the KDE "open with" dialog. a = menu->addAction(i18n("&Other...")); a->setData(QString()); }
void KateFileTree::slotOpenWithMenuAction(QAction* a) { KUrl::List list; KTextEditor::Document *doc = model()->data(m_indexContextMenu, KateFileTreeModel::DocumentRole).value<KTextEditor::Document *>(); if (!doc) return; list.append( doc->url() ); const QString openWith = a->data().toString(); if (openWith.isEmpty()) { // display "open with" dialog KOpenWithDialog dlg(list); if (dlg.exec()) KRun::run(*dlg.service(), list, this); return; } KService::Ptr app = KService::serviceByDesktopPath(openWith); if (app) { KRun::run(*app, list, this); } else { KMessageBox::error(this, i18n("Application '%1' not found.", openWith), i18n("Application not found")); } }
void KateFileTree::slotCopyFilename() { KTextEditor::Document *doc = model()->data(m_indexContextMenu, KateFileTreeModel::DocumentRole).value<KTextEditor::Document *>(); if (doc) { QApplication::clipboard()->setText(doc->url().url()); } }
void KDevelop::DocumentationController::doShowDocumentation() { IDocument* doc = ICore::self()->documentController()->activeDocument(); if(!doc) return; KTextEditor::Document* textDoc = doc->textDocument(); if(!textDoc) return; KTextEditor::View* view = textDoc->activeView(); if(!view) return; KDevelop::DUChainReadLocker lock( DUChain::lock() ); Declaration *dec = DUChainUtils::declarationForDefinition( DUChainUtils::itemUnderCursor( doc->url(), SimpleCursor(view->cursorPosition()) ) ); if(dec) { KSharedPtr< IDocumentation > documentation = documentationForDeclaration(dec); if(documentation) { showDocumentation(documentation); } } }
// Scan throughout the entire document for possible completions, // ignoring any dublets const QStringList KateWordCompletionModel::allMatches( KTextEditor::View *view, const KTextEditor::Range &range ) const { KTextEditor::Document *doc = view->document(); QString match_str = doc->text(range); QString s, m; QSet<QString> seen; QStringList l; int i( 0 ); int pos( 0 ); QRegExp re( "\\b(" + match_str + "\\w{1,})" ); while( i < doc->lines() ) { s = doc->line( i ); pos = 0; while ( pos >= 0 ) { pos = re.indexIn( s, pos ); if ( pos >= 0 ) { // typing in the middle of a word if ( ! ( i == range.start().line() && pos == range.start().column() ) ) { m = re.cap( 1 ); if ( ! seen.contains( m ) ) { seen.insert( m ); l << m; } } pos += re.matchedLength(); } } i++; } // Global completion // int db_area = KDebug::registerArea("ktuan-debug"); QMap<QString, QStringList>::const_iterator ci = doc_word_list.constBegin(); while (ci != doc_word_list.constEnd()) { if (ci.key() != doc->url().prettyUrl()) { QStringList list = ci.value(); foreach (QString word, list) { // kDebug(db_area) << "complete word " << word; if (word.startsWith(match_str) && !seen.contains(word)) { // kDebug(db_area) << "Global completion"; seen.insert(word); l << word; } } } ++ci; }
void KeywordItem::execute(KTextEditor::View* view, const KTextEditor::Range& word) { KTextEditor::Document *document = view->document(); if ( !m_replacement.isEmpty() ) { QString replacement = m_replacement; replacement = replacement.replace('\n', '\n' + getIndendation(document->line(word.start().line()))); replacement = replacement.replace(QLatin1String("%INDENT%"), indentString(document)); int cursorPos = replacement.indexOf(QStringLiteral("%CURSOR%")); int selectionEnd = -1; if ( cursorPos != -1 ) { replacement.remove(QStringLiteral("%CURSOR%")); } else { cursorPos = replacement.indexOf(QStringLiteral("%SELECT%")); if ( cursorPos != -1 ) { replacement.remove(QStringLiteral("%SELECT%")); selectionEnd = replacement.indexOf(QStringLiteral("%ENDSELECT%"), cursorPos + 1); if ( selectionEnd == -1 ) { selectionEnd = replacement.length(); } replacement.remove(QStringLiteral("%ENDSELECT%")); } } document->replaceText(word, replacement); if ( cursorPos != -1 ) { if (view) { replacement = replacement.left(cursorPos); KTextEditor::Cursor newPos( word.start().line() + replacement.count('\n'), word.start().column() + replacement.length() - replacement.lastIndexOf('\n') - 1 ); view->setCursorPosition(newPos); if ( selectionEnd != -1 ) { ///TODO: maybe we want to support multi-line selections in the future? view->setSelection( KTextEditor::Range( newPos, KTextEditor::Cursor( newPos.line(), newPos.column() + selectionEnd - cursorPos ) ) ); } } } } else { document->replaceText(word, m_keyword + ' '); } }
KTextEditor::View *KateViewManager::openUrlWithView (const KUrl &url, const QString& encoding) { KTextEditor::Document *doc = KateDocManager::self()->openUrl (url, encoding); if (!doc) return 0; if (!doc->url().isEmpty()) m_mainWindow->fileOpenRecent->addUrl( doc->url() ); activateView( doc ); return activeView (); }
KTextEditor::Document* PartController::createTextPart(const QString &encoding) { KTextEditor::Document* doc = editorPart()->createDocument(this); if ( !encoding.isNull() ) { KParts::OpenUrlArguments args = doc->arguments(); args.setMimeType( QString::fromLatin1( "text/plain;" ) + encoding ); doc->setArguments( args ); } doc->editor()->readConfig(); return doc; }
bool KateApp::openInput (const QString &text) { activeMainWindow()->viewManager()->openUrl( KUrl(), "", true ); if (!activeMainWindow()->viewManager()->activeView ()) return false; KTextEditor::Document *doc = activeMainWindow()->viewManager()->activeView ()->document(); if (!doc) return false; return doc->setText (text); }
virtual QString contents( const QString& fileName ) { QString contents = QString::null; if ( !m_readFromDisk ) { m_deadlock.unlock(); // GET LOCK kapp->lock (); //kdDebug(9007) << "-------> kapp locked" << endl; QPtrList<KParts::Part> parts( *m_cppSupport->partController() ->parts() ); QPtrListIterator<KParts::Part> it( parts ); while ( it.current() ) { KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( it.current() ); ++it; KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( doc ); if ( !doc || !editIface || doc->url().path() != fileName ) continue; contents = QString( editIface->text().ascii() ); // deep copy //kdDebug(9007) << "-------> kapp unlocked" << endl; break; } // RELEASE LOCK kapp->unlock(); m_deadlock.lock(); //kdDebug(9007) << "-------> kapp unlocked" << endl; } if( m_readFromDisk || contents == QString::null ) { QFile f( fileName ); if ( f.open( IO_ReadOnly ) ) { QTextStream stream( &f ); contents = stream.read(); f.close(); } } return contents; }
void ModelTest::testCompletionRangeSecondLine() { KTextEditor::Document* doc = KTextEditor::Editor::instance()->createDocument(0); doc->setText("body{color:red;}\nbody{font-w:normal;}"); // 01234567890123456789 KTextEditor::View* view = doc->createView(0); CodeCompletionModel* model = new CodeCompletionModel(doc); KTextEditor::Cursor position(1, 9); KTextEditor::Range range = model->completionRange(view, position); kDebug() << range << doc->text(range); QCOMPARE(range, KTextEditor::Range(1, 5, 1, 11)); QCOMPARE(doc->text(range), QString("font-w")); delete doc; }
virtual bool isModified( const QString& fileName ) { bool ret = false; m_deadlock.unlock(); kapp->lock (); KParts::ReadOnlyPart *part = m_cppSupport->partController()->partForURL( KURL(fileName) ); KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( part ); if ( doc ) ret = doc->isModified(); kapp->unlock(); m_deadlock.lock(); return ret; }
KTextEditor::Document *KateViewManager::openUrl (const KUrl &url, const QString& encoding, bool activate, bool isTempFile, const KateDocumentInfo& docInfo) { KTextEditor::Document *doc = KateDocManager::self()->openUrl (url, encoding, isTempFile, docInfo); if (!doc->url().isEmpty()) m_mainWindow->fileOpenRecent->addUrl( doc->url() ); if (activate) activateView( doc ); return doc; }
KWrite::~KWrite() { guiFactory()->removeClient(m_view); winList.removeAll(this); KTextEditor::Document *doc = m_view->document(); delete m_view; // kill document, if last view is closed if (doc->views().isEmpty()) { docList.removeAll(doc); delete doc; } KSharedConfig::openConfig()->sync(); }
void FunctionDeclarationCompletionItem::executed(KTextEditor::View* view, const KTextEditor::Range& word) { qCDebug(KDEV_PYTHON_CODECOMPLETION) << "FunctionDeclarationCompletionItem executed"; KTextEditor::Document* document = view->document(); auto resolvedDecl = Helper::resolveAliasDeclaration(declaration().data()); DUChainReadLocker lock; auto functionDecl = Helper::functionForCalled(resolvedDecl).declaration; lock.unlock(); if ( ! functionDecl && (! resolvedDecl || ! resolvedDecl->abstractType() || resolvedDecl->abstractType()->whichType() != AbstractType::TypeStructure) ) { qCritical(KDEV_PYTHON_CODECOMPLETION) << "ERROR: could not get declaration data, not executing completion item!"; return; } QString suffix = "()"; KTextEditor::Range checkPrefix(word.start().line(), 0, word.start().line(), word.start().column()); KTextEditor::Range checkSuffix(word.end().line(), word.end().column(), word.end().line(), document->lineLength(word.end().line())); if ( m_doNotCall || document->text(checkSuffix).trimmed().startsWith('(') || document->text(checkPrefix).trimmed().endsWith('@') || (functionDecl && Helper::findDecoratorByName(functionDecl, QLatin1String("property"))) ) { // don't insert brackets if they're already there, // the item is a decorator, or if it's an import item. suffix.clear(); } // place cursor behind bracktes by default int skip = 2; if ( functionDecl ) { bool needsArguments = false; int argumentCount = functionDecl->type<FunctionType>()->arguments().length(); if ( functionDecl->context()->type() == KDevelop::DUContext::Class ) { // it's a member function, so it has the implicit self // TODO static methods needsArguments = argumentCount > 1; } else { // it's a free function needsArguments = argumentCount > 0; } if ( needsArguments ) { // place cursor in brackets if there's parameters skip = 1; } } document->replaceText(word, declaration()->identifier().toString() + suffix); view->setCursorPosition( Cursor(word.end().line(), word.end().column() + skip) ); }
virtual QString contents( const QString& fileName ) { if( !m_readFromDisk ){ //kdDebug(9013) << "-------> kapp is locked = " << kapp->locked() << endl; bool needToLock = kapp->locked() == false; if( needToLock ) kapp->lock(); //kdDebug(9013) << "-------> kapp locked" << endl; QPtrList<KParts::Part> parts( *m_javaSupport->partController()->parts() ); QPtrListIterator<KParts::Part> it( parts ); while( it.current() ){ KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>( it.current() ); ++it; KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( doc ); if( !doc || !editIface || doc->url().path() != fileName ) continue; QString contents = QString( editIface->text().ascii() ); // deep copy if( needToLock ) kapp->unlock(); //kdDebug(9013) << "-------> kapp unlocked" << endl; return contents; } if( needToLock ) kapp->unlock(); //kdDebug(9013) << "-------> kapp unlocked" << endl; } QFile f( fileName ); QTextStream stream( &f ); if( f.open(IO_ReadOnly) ){ QString contents = stream.read(); f.close(); return contents; } return QString::null; }
void View::run() { KTextEditor::View *view = mw->activeView(); if (!view) { return; } if (m_global.saveBeforeRun) { view->document()->save(); } KTextEditor::Document *doc = view->document(); QString filename = doc->url().path(); QString directory = doc->url().directory(); kDebug() << filename << "-" << directory; QString cmd = txtCommand->text(); cmd = cmd.replace("%filename", filename).replace("%directory", directory); execute(cmd); }
// Return the range containing the word left of the cursor KTextEditor::Range KateWordCompletionModel::completionRange(KTextEditor::View* view, const KTextEditor::Cursor &position) { int line = position.line(); int col = position.column(); KTextEditor::Document *doc = view->document(); while ( col > 0 ) { QChar c = ( doc->character( KTextEditor::Cursor( line, col-1 ) ) ); if ( c.isLetterOrNumber() || c.isMark() || c == '_' ) { col--; continue; } break; } return KTextEditor::Range( KTextEditor::Cursor( line, col ), position ); }
QStringList PHPFile::readFromEditor() { QStringList contents; kapp->lock(); QPtrList<KParts::Part> parts( *m_part->partController()->parts() ); QPtrListIterator<KParts::Part> it( parts ); while( it.current() ){ KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>( it.current() ); ++it; KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( doc ); if ( !doc || !editIface || doc->url().path() != fileName() ) continue; contents = QStringList::split("\n", editIface->text().ascii(), true); break; } kapp->unlock(); return contents; }
// ### the code below is slightly modified from kdelibs/kate/part/katedialogs, // class KateModOnHdPrompt. void KateMwModOnHdDialog::slotDiff() { if ( !btnDiff->isEnabled()) // diff button already pressed, proc not finished yet return; if ( ! twDocuments->currentItem() ) return; KTextEditor::Document *doc = ((KateDocItem*)twDocuments->currentItem())->document; // don't try to diff a deleted file if ( KateDocManager::self()->documentInfo( doc )->modifiedOnDiscReason == KTextEditor::ModificationInterface::OnDiskDeleted ) return; if (m_diffFile) return; m_diffFile = new KTemporaryFile(); m_diffFile->open(); // Start a KProcess that creates a diff m_proc = new KProcess( this ); m_proc->setOutputChannelMode( KProcess::MergedChannels ); *m_proc << "diff" << "-ub" << "-" << doc->url().toLocalFile(); connect( m_proc, SIGNAL(readyRead()), this, SLOT(slotDataAvailable()) ); connect( m_proc, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotPDone()) ); setCursor( Qt::WaitCursor ); btnDiff->setEnabled(false); m_proc->start(); QTextStream ts(m_proc); int lastln = doc->lines(); for ( int l = 0; l < lastln; ++l ) ts << doc->line( l ) << '\n'; ts.flush(); m_proc->closeWriteChannel(); }
KTextEditor::View* EditorTabWidget::openKDocument(KURL url) { QWidget* tab = new QWidget(this); QVBoxLayout *lay = new QVBoxLayout(tab, 1, 1); KTextEditor::Document *doc = KTextEditor::EditorChooser::createDocument( 0L, "KTextEditor::Document"); if(!doc->openURL(url)) { delete tab; delete doc; return NULL; } KTextEditor::View * view = doc->createView(tab); lay->addWidget(view); insertTab(tab, url.fileName()); setCurrentPage(count()-1); return view; }
void ModelTest::completionItems() { KTextEditor::Document* doc = KTextEditor::Editor::instance()->createDocument(0); QFETCH(QString, text); QFETCH(QString, type); KTextEditor::Cursor position; QString textBeforeCursor = text.left(text.indexOf('|')); position.setLine(textBeforeCursor.count('\n')); position.setColumn(textBeforeCursor.mid(textBeforeCursor.lastIndexOf('\n')).length()); text.replace('|', ""); QTemporaryFile file("XXXXXXXXX."+type); file.open(); file.write(text.toUtf8()); file.close(); doc->openUrl(KUrl("file://"+QDir::current().absoluteFilePath(file.fileName()))); QCOMPARE(doc->mimeType(), QString("text/")+type); KTextEditor::View* view = doc->createView(0); CodeCompletionModel* model = new CodeCompletionModel(doc); QCOMPARE(model->rowCount(), 0); model->completionInvoked(view, model->completionRange(view, position), KTextEditor::CodeCompletionModel::ManualInvocation); QStringList completions; for (int i=0; i < model->rowCount(); ++i) { completions << model->data(model->index(i, CodeCompletionModel::Name), Qt::DisplayRole).toString(); } kDebug() << "completions" << completions; QFETCH(QStringList, result); foreach (const QString &i, result) { QVERIFY(completions.contains(i)); }
void EditorTabWidget::closeAllDocuments() { int i = 0; QWidget* w; KTextEditor::Document* doc; KTextEditor::View* view; QValueList<Document_t>::iterator it; for( it = m_docList.begin(); it != m_docList.end(); ++it, ++i ) { view = (*it).view; doc = (*it).view->document(); doc->closeURL(); delete view; delete doc; w = page(i); removePage(w); i++; } m_docList.clear(); disableEditorActions(); }
void NormalDeclarationCompletionItem::execute(KTextEditor::View* view, const KTextEditor::Range& word) { if( m_completionContext && m_completionContext->depth() != 0 ) return; //Do not replace any text when it is an argument-hint KTextEditor::Document* document = view->document(); QString newText; { KDevelop::DUChainReadLocker lock(KDevelop::DUChain::lock()); if(m_declaration) { newText = declarationName(); } else { qCDebug(LANGUAGE) << "Declaration disappeared"; return; } } document->replaceText(word, newText); KTextEditor::Range newRange = word; newRange.setEnd(KTextEditor::Cursor(newRange.end().line(), newRange.start().column() + newText.length())); executed(view, newRange); }
// Scan throughout the entire document for possible completions, // ignoring any dublets const QStringList KateWordCompletionModel::allMatches( KTextEditor::View *view, const KTextEditor::Range &range ) const { QStringList l; int i( 0 ); int pos( 0 ); KTextEditor::Document *doc = view->document(); QRegExp re( "\\b(" + doc->text( range ) + "\\w{1,})" ); QString s, m; QSet<QString> seen; while( i < doc->lines() ) { s = doc->line( i ); pos = 0; while ( pos >= 0 ) { pos = re.indexIn( s, pos ); if ( pos >= 0 ) { // typing in the middle of a word if ( ! ( i == range.start().line() && pos == range.start().column() ) ) { m = re.cap( 1 ); if ( ! seen.contains( m ) ) { seen.insert( m ); l << m; } } pos += re.matchedLength(); } } i++; } return l; }