void AddMethodDialog::accept() { m_cppSupport->partController() ->editDocument( KURL( m_klass->fileName() ) ); KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_cppSupport->partController() ->activePart() ); if ( !editIface ) { /// @todo show messagebox QDialog::accept(); return ; } int line, column; m_klass->getEndPosition( &line, &column ); // compute the insertion point map QMap<QString, QPair<int, int> > points; QStringList accessList; const FunctionList functionList = m_klass->functionList(); for ( FunctionList::ConstIterator it = functionList.begin(); it != functionList.end(); ++it ) { int funEndLine, funEndColumn; ( *it ) ->getEndPosition( &funEndLine, &funEndColumn ); QString access = accessID( *it ); QPair<int, int> funEndPoint = qMakePair( funEndLine, funEndColumn ); if ( !points.contains( access ) || points[ access ] < funEndPoint ) { accessList.remove( access ); accessList.push_back( access ); // move 'access' at the end of the list points[ access ] = funEndPoint; } } int insertedLine = 0; accessList += newAccessList( accessList ); for ( QStringList::iterator it = accessList.begin(); it != accessList.end(); ++it ) { QListViewItem* item = methods->firstChild(); while ( item ) { QListViewItem * currentItem = item; item = item->nextSibling(); if ( currentItem->text( 1 ) != *it ) continue; QString access = ( *it ).lower(); bool isInline = currentItem->text( 0 ) == "True"; QString str = isInline ? functionDefinition( currentItem ) : functionDeclaration( currentItem ); QPair<int, int> pt; if ( points.contains( *it ) ) { pt = points[ *it ]; } else { str.prepend( access + ":\n" ); points[ *it ] = qMakePair( line - 1, 0 ); pt = points[ *it ]; // end of class declaration } editIface->insertText( pt.first + insertedLine + 1, 0 /*pt.second*/, str ); insertedLine += str.contains( QChar( '\n' ) ); } } m_cppSupport->backgroundParser() ->addFile( m_klass->fileName() ); QString str; QListViewItem* item = methods->firstChild(); while ( item ) { QListViewItem * currentItem = item; item = item->nextSibling(); QString str = functionDefinition( currentItem ); if ( str.isEmpty() ) continue; QString implementationFile = currentItem->text( 5 ); if ( currentItem->text( 0 ) == "True" ) implementationFile = m_klass->fileName(); QFileInfo fileInfo( implementationFile ); if ( !QFile::exists( fileInfo.absFilePath() ) ) { if ( KDevCreateFile * createFileSupp = m_cppSupport->extension<KDevCreateFile>( "KDevelop/CreateFile" ) ) createFileSupp->createNewFile( fileInfo.extension(), fileInfo.dirPath( true ), fileInfo.baseName() ); } m_cppSupport->partController() ->editDocument( KURL( implementationFile ) ); editIface = dynamic_cast<KTextEditor::EditInterface*>( m_cppSupport->partController() ->activePart() ); if ( !editIface ) continue; bool isInline = currentItem->text( 0 ) == "True"; if ( !isInline ) { editIface->insertLine( editIface->numLines(), QString::fromLatin1( "" ) ); editIface->insertText( editIface->numLines() - 1, 0, str ); m_cppSupport->backgroundParser() ->addFile( implementationFile ); } } QDialog::accept(); }
/** * 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; }