void RubySupportPart::slotRunTestUnderCursor() { // if we can't save all parts, then the user canceled if ( partController()->saveAllFiles() == false ) return; KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(partController()->activePart()); QString prog; if (ro_part != 0) { prog = ro_part->url().path(); } else return; KTextEditor::ViewCursorInterface* activeViewCursor = dynamic_cast<KTextEditor::ViewCursorInterface*>( ro_part->widget() ); if (!activeViewCursor) return; unsigned int line, column; activeViewCursor->cursorPositionReal(&line, &column); CodeModelUtils::CodeModelHelper hlp(codeModel(), codeModel()->fileByName(prog)); FunctionDom fun = hlp.functionAt(line, column); if (fun == 0) return; QFileInfo program(prog); QString cmd = QString("%1 -K%2 -C\"%3\" -I\"%4\" \"%5\" %6") .arg(interpreter()) .arg(characterCoding()) .arg(runDirectory()) .arg(program.dirPath()) .arg(program.fileName()) .arg(" -n " + fun->name()); startApplication(cmd); }
void AStylePart::setCursorPos( KParts::Part *part, uint line, uint col ) { if (!part || !part->inherits("KTextEditor::Document")) return; KTextEditor::ViewCursorInterface *iface = dynamic_cast<KTextEditor::ViewCursorInterface*>(part->widget()); if (iface) { iface->setCursorPositionReal( line, col ); } }
/** * Returns a the complete word defined by the current cursor position. * Attempts to extract a valid C symbol from the location of the cursor, by * starting at the current line and column, and looking forward and backward * for non-symbol characters. * @return A C symbol under the cursor, if any, or QString::null otherwise */ QString EditorPage::getWordUnderCursor(uint* pPosInWord) { KTextEditor::ViewCursorInterface* pCursor; KTextEditor::EditInterface* pEditIf; QString sLine; uint nLine, nCol, nFrom, nTo, nLast, nLength; QChar ch; // Get a cursor object pCursor = dynamic_cast<KTextEditor::ViewCursorInterface*>(m_pView); if (pCursor == NULL) return QString::null; // Get a pointer to the edit interface pEditIf = dynamic_cast<KTextEditor::EditInterface*>(m_pDoc); if (!pEditIf) return QString::null; // Get the line on which the cursor is positioned pCursor->cursorPositionReal(&nLine, &nCol); sLine = pEditIf->textLine(nLine); // Find the beginning of the current word for (nFrom = nCol; nFrom > 0;) { ch = sLine.at(nFrom - 1); if (!ch.isLetter() && !ch.isDigit() && ch != '_') break; nFrom--; } // Find the end of the current word nLast = sLine.length(); for (nTo = nCol; nTo < nLast;) { ch = sLine.at(nTo); if (!ch.isLetter() && !ch.isDigit() && ch != '_') break; nTo++; } // Mark empty words nLength = nTo - nFrom; if (nLength == 0) return QString::null; // Return the in-word position, if required if (pPosInWord != NULL) *pPosInWord = nCol - nFrom; // Extract the word under the cursor from the entire line return sLine.mid(nFrom, nLength); }
void RubyDebuggerPart::slotRunToCursor() { KParts::ReadWritePart *rwpart = dynamic_cast<KParts::ReadWritePart*>(partController()->activePart()); KTextEditor::ViewCursorInterface *cursorIface = dynamic_cast<KTextEditor::ViewCursorInterface*>(partController()->activeWidget()); if (!rwpart || !rwpart->url().isLocalFile() || !cursorIface) return; uint line, col; cursorIface->cursorPosition(&line, &col); controller->slotRunUntil(rwpart->url().path(), line); }
/** * Returns the current position of the cursor. * @param nLine Holds the line on which the cursor is currently located * @param nCol Holds the column on which the cursor is currently located * @return true if successful, false otherwise (cursor interface was not * obtained) */ bool EditorPage::getCursorPos(uint& nLine, uint& nCol) { KTextEditor::ViewCursorInterface* pCursorIf; // Acquire the view cursor pCursorIf = dynamic_cast<KTextEditor::ViewCursorInterface*>(m_pView); if (pCursorIf == NULL) return false; // Get the cursor position (adjusted to 1-based counting) pCursorIf->cursorPosition(&nLine, &nCol); nLine++; nCol++; return true; }
int EditorTabWidget::currentDocumentLine() { int index; uint line, col; KTextEditor::View* view; KTextEditor::ViewCursorInterface *vci; if((index = currentPageIndex()) == -1) return 0; Document_t d; d = *(m_docList.at(index)); view = d.view; vci = dynamic_cast<KTextEditor::ViewCursorInterface*>(view); vci->cursorPosition(&line, &col); return line+1; }
void EditorTabWidget::gotoLineAtFile(const QString& filePath, int line) { int index; KTextEditor::View* view; KTextEditor::ViewCursorInterface *vci; setCurrentDocument(filePath, true); if((index = currentPageIndex()) == -1) return; Document_t d; d = *(m_docList.at(index)); view = d.view; vci = dynamic_cast<KTextEditor::ViewCursorInterface*>(view); vci->setCursorPosition(line, 0); }
/*! \fn SnippetWidget::insertIntoActiveView(QString text) Inserts the parameter text into the activ view */ void SnippetWidget::insertIntoActiveView(QString text) { //get the interfaces for the KTexteditor parts KTextEditor::ViewCursorInterface *cursorIface = dynamic_cast<KTextEditor::ViewCursorInterface*>(m_part->partController()->activeWidget()); if (!cursorIface) return; KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_part->partController()->activePart() ); if (!editIface) return; uint line, col; cursorIface->cursorPositionReal(&line, &col); editIface->insertText( line, col , text ); }
/** * Moves the cursor to a given position. * @param nLine The cursor's new line number * @param nCol The cursor's new column number * @return true if successful, false otherwise (cursor interface was not * obtained) */ bool EditorPage::setCursorPos(uint nLine, uint nCol) { Kate::View* pKateView; KTextEditor::ViewCursorInterface* pCursorIf; // Cannot accept line 0 if (nLine == 0) return false; // Adjust to 0-based counting nLine--; nCol--; // Acquire the view cursor pCursorIf = dynamic_cast<KTextEditor::ViewCursorInterface*>(m_pView); if (pCursorIf == NULL) return false; // NOTE: The following code is a fix to a bug in Kate, which wrongly // calculates the column number in setCursorPosition. pKateView = dynamic_cast<Kate::View*>(m_pView); if (pKateView != NULL) { KTextEditor::EditInterface* pEditIf; const char* szLine; uint nRealCol; uint nTabAdjust; // Get a pointer to the edit interface pEditIf = dynamic_cast<KTextEditor::EditInterface*>(m_pDoc); if (!pEditIf) return false; nRealCol = 0; // Check for out of bound line numbers if (nLine < pEditIf->numLines()) { // Get the contents of the requested line szLine = pEditIf->textLine(nLine).latin1(); // Check for empty line if (szLine != NULL) { // The number of columns which a tab character adds nTabAdjust = pKateView->tabWidth() - 1; // Calculate the real column, based on the tab width for (; nRealCol < nCol && szLine[nRealCol] != 0; nRealCol++) { if (szLine[nRealCol] == '\t') nCol -= nTabAdjust; } } } else { // Marker set beyond end of file, move to the last line nLine = pEditIf->numLines() - 1; } // Set the cursor position pCursorIf->setCursorPositionReal(nLine, nRealCol); } else { // Non-Kate editors: set the cursor position normally pCursorIf->setCursorPosition(nLine, nCol); } return true; }
//--------------------------------------------------------------------------- bool ProjectSession::saveToFile( const QString & sessionFileName, const QValueList< KDevPlugin * > plugins ) { QString section, keyword; QDomElement session = domdoc.documentElement(); int nDocs = 0; QString docIdStr; //// // read the information about the mainframe widget //// QDomElement mainframeEl = session.namedItem("Mainframe").toElement(); //// if(mainframeEl.isNull()){ //// mainframeEl=domdoc.createElement("Mainframe"); //// session.appendChild( mainframeEl); //// } //// bool bMaxMode = ((QextMdiMainFrm*)m_pDocViewMan->parent())->isInMaximizedChildFrmMode(); //// mainframeEl.setAttribute("MaximizeMode", bMaxMode); // read the information about the documents QDomElement docsAndViewsEl = session.namedItem("DocsAndViews").toElement(); if (docsAndViewsEl.isNull()) { docsAndViewsEl = domdoc.createElement("DocsAndViews"); session.appendChild( docsAndViewsEl); } else { // we need to remove the old ones before memorizing the current ones (to avoid merging) QDomNode n = docsAndViewsEl.firstChild(); while ( !n.isNull() ) { QDomNode toBeRemoved = n; n = n.nextSibling(); docsAndViewsEl.removeChild(toBeRemoved); } } QPtrListIterator<KParts::Part> it( *PartController::getInstance()->parts() ); for ( ; it.current(); ++it ) { KParts::ReadOnlyPart* pReadOnlyPart = dynamic_cast<KParts::ReadOnlyPart*>(it.current()); if (!pReadOnlyPart) continue; QString url = pReadOnlyPart->url().url(); docIdStr.setNum(nDocs); QDomElement docEl = domdoc.createElement("Doc" + docIdStr); docEl.setAttribute( "URL", url); docsAndViewsEl.appendChild( docEl); nDocs++; docEl.setAttribute( "NumberOfViews", 1); QDomElement viewEl = domdoc.createElement( "View0"); docEl.appendChild( viewEl); if ( dynamic_cast<HTMLDocumentationPart*>(pReadOnlyPart) ) { viewEl.setAttribute("Type", "Documentation"); } else if ( pReadOnlyPart->inherits("KTextEditor::Document") ) { viewEl.setAttribute("Type", "Source"); KTextEditor::ViewCursorInterface *iface = dynamic_cast<KTextEditor::ViewCursorInterface*>(pReadOnlyPart->widget()); if (iface) { unsigned int line, col; iface->cursorPosition(&line, &col); viewEl.setAttribute( "line", line ); } if ( KTextEditor::EncodingInterface * ei = dynamic_cast<KTextEditor::EncodingInterface*>( pReadOnlyPart ) ) { QString encoding = ei->encoding(); if ( !encoding.isNull() ) { viewEl.setAttribute( "Encoding", encoding ); } } } else { viewEl.setAttribute("Type", "Other"); } } /* QPtrListIterator<KParts::Part> it( *PartController::getInstance()->parts() ); for ( ; it.current(); ++it ) { //// QString partName = it.current()->name(); //// QMessageBox::information(0L,"",partName); KParts::ReadOnlyPart* pReadOnlyPart = dynamic_cast<KParts::ReadOnlyPart*>(it.current()); if (!pReadOnlyPart) continue; // note: read-write parts are also a read-only part, they inherit from it HTMLDocumentationPart* pDocuPart = dynamic_cast<HTMLDocumentationPart*>(pReadOnlyPart); /// @todo Save relative path for project sharing? QString url = pReadOnlyPart->url().url(); docIdStr.setNum(nDocs); QDomElement docEl = domdoc.createElement("Doc" + docIdStr); docEl.setAttribute( "URL", url); docsAndViewsEl.appendChild( docEl); nDocs++; //// docEl.setAttribute( "Type", "???"); //// // get the view list //// QPtrList<KWpEditorPartriteView> viewList = pDoc->viewList(); //// // write the number of views //// docEl.setAttribute( "NumberOfViews", viewList.count()); docEl.setAttribute( "NumberOfViews", 1); // loop over all views of this document int nView = 0; //// KWriteView* pView = 0L; QString viewIdStr; //// for (viewList.first(), nView = 0; viewList.current() != 0; viewList.next(), nView++) { //// pView = viewList.current(); //// if (pView != 0L) { viewIdStr.setNum( nView); QDomElement viewEl = domdoc.createElement( "View"+viewIdStr); docEl.appendChild( viewEl); // focus? //// viewEl.setAttribute("Focus", (((CEditWidget*)pView->parentWidget()) == m_pDocViewMan->currentEditView())); viewEl.setAttribute("Type", "???"); QDomElement viewPropertiesEl = domdoc.createElement("AdditionalSettings"); viewEl.appendChild(viewPropertiesEl); emit sig_saveAdditionalViewProperties(url, &viewPropertiesEl); if (pReadOnlyPart->inherits("KTextEditor::Document")) { KTextEditor::ViewCursorInterface *iface = dynamic_cast<KTextEditor::ViewCursorInterface*>(pReadOnlyPart->widget()); if (iface) { unsigned int line, col; iface->cursorPosition(&line, &col); viewEl.setAttribute( "line", line ); } } if (pDocuPart) { docEl.setAttribute( "context", pDocuPart->context() ); } } */ docsAndViewsEl.setAttribute("NumberOfDocuments", nDocs); // now also let the project-related plugins save their session stuff // read the information about the documents QDomElement pluginListEl = session.namedItem("pluginList").toElement(); if (pluginListEl.isNull()) { pluginListEl = domdoc.createElement("pluginList"); session.appendChild( pluginListEl); } else { // we need to remove the old ones before memorizing the current ones (to avoid merging) QDomNode n = pluginListEl.firstChild(); while ( !n.isNull() ) { QDomNode toBeRemoved = n; n = n.nextSibling(); pluginListEl.removeChild(toBeRemoved); } } QValueList<KDevPlugin*>::ConstIterator itt = plugins.begin(); while( itt != plugins.end() ) { KDevPlugin* pPlugin = (*itt); QString pluginName = pPlugin->instance()->instanceName(); QDomElement pluginEl = domdoc.createElement(pluginName); // now plugin, save what you have! pPlugin->savePartialProjectSession(&pluginEl); // if the plugin wrote anything, accept itt for the session, otherwise forget itt if (pluginEl.hasChildNodes() || pluginEl.hasAttributes()) { pluginListEl.appendChild(pluginEl); } ++itt; } // Write it out to the session file on disc QFile f(sessionFileName); if ( f.open(IO_WriteOnly) ) { // file opened successfully QTextStream t( &f ); // use a text stream t << domdoc.toCString(); f.close(); } initXMLTree(); // clear and initialize the tree again return true; }
void KDataToolPluginView::aboutToShow() { kdDebug()<<"KTextEditor::KDataToolPluginView::aboutToShow"<<endl; QString word; m_singleWord = false; m_wordUnderCursor = QString::null; // unplug old actions, if any: KAction *ac; for ( ac = m_actionList.first(); ac; ac = m_actionList.next() ) { m_menu->remove(ac); } if (m_notAvailable) { m_menu->remove(m_notAvailable); delete m_notAvailable; m_notAvailable=0; } if ( selectionInterface(m_view->document())->hasSelection() ) { word = selectionInterface(m_view->document())->selection(); if ( word.find(' ') == -1 && word.find('\t') == -1 && word.find('\n') == -1 ) m_singleWord = true; else m_singleWord = false; } else { // No selection -> use word under cursor KTextEditor::EditInterface *ei; KTextEditor::ViewCursorInterface *ci; KTextEditor::View *v = (KTextEditor::View*)m_view; ei = KTextEditor::editInterface(v->document()); ci = KTextEditor::viewCursorInterface(v); uint line, col; ci->cursorPositionReal(&line, &col); QString tmp_line = ei->textLine(line); m_wordUnderCursor = ""; // find begin of word: m_singleWord_start = 0; for(int i = col; i >= 0; i--) { QChar ch = tmp_line.at(i); if( ! (ch.isLetter() || ch == '-' || ch == '\'') ) { m_singleWord_start = i+1; break; } m_wordUnderCursor = ch + m_wordUnderCursor; } // find end of word: m_singleWord_end = tmp_line.length(); for(uint i = col+1; i < tmp_line.length(); i++) { QChar ch = tmp_line.at(i); if( ! (ch.isLetter() || ch == '-' || ch == '\'') ) { m_singleWord_end = i; break; } m_wordUnderCursor += ch; } if( ! m_wordUnderCursor.isEmpty() ) { m_singleWord = true; m_singleWord_line = line; } else { m_notAvailable = new KAction(i18n("(not available)"), QString::null, 0, this, SLOT(slotNotAvailable()), actionCollection(),"dt_n_av"); m_menu->insert(m_notAvailable); return; } } KInstance *inst=instance(); QValueList<KDataToolInfo> tools; tools += KDataToolInfo::query( "QString", "text/plain", inst ); if( m_singleWord ) tools += KDataToolInfo::query( "QString", "application/x-singleword", inst ); m_actionList = KDataToolAction::dataToolActionList( tools, this, SLOT( slotToolActivated( const KDataToolInfo &, const QString & ) ) ); for ( ac = m_actionList.first(); ac; ac = m_actionList.next() ) { m_menu->insert(ac); } if( m_actionList.isEmpty() ) { m_notAvailable = new KAction(i18n("(not available)"), QString::null, 0, this, SLOT(slotNotAvailable()), actionCollection(),"dt_n_av"); m_menu->insert(m_notAvailable); } }