summaryrefslogtreecommitdiffstats
path: root/languages/cpp/qtdesignercppintegration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'languages/cpp/qtdesignercppintegration.cpp')
-rw-r--r--languages/cpp/qtdesignercppintegration.cpp218
1 files changed, 218 insertions, 0 deletions
diff --git a/languages/cpp/qtdesignercppintegration.cpp b/languages/cpp/qtdesignercppintegration.cpp
new file mode 100644
index 00000000..76581003
--- /dev/null
+++ b/languages/cpp/qtdesignercppintegration.cpp
@@ -0,0 +1,218 @@
+/***************************************************************************
+* Copyright (C) 2004 by Alexander Dymo *
+* Portions Copyright (C) 2003 Roberto Raggi ([email protected]) *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with this program; if not, write to the *
+* Free Software Foundation, Inc., *
+* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+***************************************************************************/
+#include "qtdesignercppintegration.h"
+
+#include <qpair.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <ktexteditor/editinterface.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/viewcursorinterface.h>
+
+#include <domutil.h>
+#include <kdevpartcontroller.h>
+#include <kdevcreatefile.h>
+
+#include "backgroundparser.h"
+#include "cppsupportpart.h"
+#include "codemodel_utils.h"
+#include "implementationwidget.h"
+
+QtDesignerCppIntegration::QtDesignerCppIntegration( KDevLanguageSupport *part,
+ ImplementationWidget *impl )
+: QtDesignerIntegration( part, impl, true, 0 )
+{}
+
+void QtDesignerCppIntegration::addFunctionToClass( KInterfaceDesigner::Function function, ClassDom klass )
+{
+ m_part->partController() ->editDocument( KURL( klass->fileName() ) );
+ KTextEditor::EditInterface* editIface = dynamic_cast<KTextEditor::EditInterface*>( m_part->partController() ->activePart() );
+ if ( !editIface )
+ {
+ /// @todo show messagebox
+ // QDialog::accept();
+ return ;
+ }
+
+ int line, column;
+ klass->getEndPosition( &line, &column );
+
+ // compute the insertion point map
+ QMap<QString, QPair<int, int> > points;
+
+ const FunctionList functionList = 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 )
+ {
+ points[ access ] = funEndPoint;
+ }
+ }
+
+ int insertedLine = 0;
+
+ QString access = function.access + ( function.type == KInterfaceDesigner::ftQtSlot ? " slots" : "" );
+
+ QString str = function.returnType + " " + function.function;
+ if ( function.specifier == "virtual" )
+ str = "virtual " + str;
+ else if ( function.specifier == "pure virtual" )
+ str = "virtual " + str + " = 0";
+ else if ( function.specifier == "static" )
+ str = "static " + str;
+ str += ";\n";
+ str = " " + str;
+
+ QPair<int, int> pt;
+ if ( points.contains( access ) )
+ {
+ pt = points[ access ];
+ }
+ else
+ {
+ str.prepend( access + ":\n" );
+ points[ access ] = qMakePair( line - 1, 0 );
+ pt = points[ access ]; // end of class declaration
+ }
+
+ editIface->insertText( pt.first + insertedLine + 1, 0 /*pt.second*/, str );
+ insertedLine += str.contains( QChar( '\n' ) );
+
+ CppSupportPart *cppPart = dynamic_cast<CppSupportPart *>( m_part );
+ cppPart->backgroundParser() ->addFile( klass->fileName() );
+
+ if ( function.specifier == "pure virtual" )
+ return ;
+
+
+ //implementation
+ QString stri = function.returnType + " " + klass->name() + "::" + function.function;
+ if ( function.specifier == "static" )
+ stri = "static " + stri;
+ stri += "\n{\n}\n";
+ stri = "\n" + stri;
+
+ QFileInfo fi( klass->fileName() );
+ QString implementationFile = fi.absFilePath();
+ implementationFile.replace( ".h", ".cpp" );
+
+ QFileInfo fileInfo( implementationFile );
+ if ( !QFile::exists( fileInfo.absFilePath() ) )
+ {
+ if ( KDevCreateFile * createFileSupp = m_part->extension<KDevCreateFile>( "KDevelop/CreateFile" ) )
+ createFileSupp->createNewFile( fileInfo.extension(), fileInfo.dirPath( true ), fileInfo.fileName() );
+ }
+
+ m_part->partController() ->editDocument( KURL( implementationFile ) );
+ editIface = dynamic_cast<KTextEditor::EditInterface*>( m_part->partController() ->activePart() );
+ if ( !editIface )
+ return ;
+
+ int atLine = 0, atColumn = 0;
+ TranslationUnitAST *translationUnit = 0;
+ ParsedFilePointer p = cppPart->backgroundParser() ->translationUnit( implementationFile );
+ if( p ) translationUnit = *p;
+ if ( translationUnit )
+ {
+ translationUnit->getEndPosition( &atLine, &atColumn );
+ kdDebug() << "atLine: " << atLine << endl;
+ stri = "\n" + stri;
+ }
+ else
+ {
+ atLine = editIface->numLines();
+ line = editIface->numLines();
+ while ( line > 0 )
+ {
+ if ( editIface->textLine( line ).isEmpty() )
+ {
+ --line;
+ continue;
+ }
+ else
+ {
+ if ( editIface->textLine( line ).contains( QRegExp( ".*#include .*\\.moc.*" ) ) )
+ atLine = line;
+ break;
+ }
+ }
+ kdDebug() << "atLine (2): " << atLine << endl;
+ atColumn = 0;
+ }
+
+ // editIface->insertLine( atLine + 1, QString::fromLatin1("") );
+ kdDebug() << "at line in intg: " << atLine << " atCol: " << atColumn << endl;
+ kdDebug() << "text: " << stri << endl;
+ editIface->insertText( atLine, atColumn, stri );
+ KTextEditor::View *activeView = dynamic_cast<KTextEditor::View*>( m_part->partController() ->activePart() ->widget() );
+ if ( activeView )
+ {
+ KTextEditor::ViewCursorInterface * cursor = dynamic_cast<KTextEditor::ViewCursorInterface*>( activeView );
+ if ( cursor )
+ cursor->setCursorPositionReal( atLine + 3, 1 );
+ }
+
+ cppPart->backgroundParser() ->addFile( implementationFile );
+}
+
+QString QtDesignerCppIntegration::accessID( FunctionDom fun ) const
+{
+ if ( fun->isSignal() )
+ return QString::fromLatin1( "signals" );
+
+ switch ( fun->access() )
+ {
+ case CodeModelItem::Public:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "public slots" );
+ return QString::fromLatin1( "public" );
+
+ case CodeModelItem::Protected:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "protected slots" );
+ return QString::fromLatin1( "protected" );
+
+ case CodeModelItem::Private:
+ if ( fun->isSlot() )
+ return QString::fromLatin1( "private slots" );
+ return QString::fromLatin1( "private" );
+ }
+
+ return QString::null;
+}
+
+void QtDesignerCppIntegration::processImplementationName( QString &name )
+{
+ name.replace( ".h", ".cpp" );
+}
+
+#include "qtdesignercppintegration.moc"
+
+//kate: indent-mode csands; tab-width 4; space-indent off;