/********************************************************************** ** ** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. ** ** This file is part of TQt Designer. ** ** This file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free ** Software Foundation and appearing in the files LICENSE.GPL2 ** and LICENSE.GPL3 included in the packaging of this file. ** Alternatively you may (at your option) use any later version ** of the GNU General Public License if such license has been ** publicly approved by Trolltech ASA (or its successors, if any) ** and the KDE Free TQt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** Licensees holding valid TQt Commercial licenses may use this file in ** accordance with the TQt Commercial License Agreement provided with ** the Software. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted ** herein. ** **********************************************************************/ #include "cppcompletion.h" #include #include #include #include CppEditorCompletion::CppEditorCompletion( Editor *e ) : EditorCompletion( e ) { } bool CppEditorCompletion::doObjectCompletion( const TQString &objName ) { if ( !ths ) return FALSE; TQString object( objName ); int i = -1; if ( ( i = object.tqfindRev( "->" ) ) != -1 ) object = object.mid( i + 2 ); if ( ( i = object.tqfindRev( "." ) ) != -1 ) object = object.mid( i + 1 ); object = object.simplifyWhiteSpace(); TQObject *obj = 0; if ( ths->name() == object || object == "this" ) { obj = ths; } else { obj = ths->child( object ); } if ( !obj ) return FALSE; TQValueList lst; if ( !obj->childrenListObject().isEmpty() ) { for ( TQObjectListIt cit( obj->childrenListObject() ); cit.current(); ++cit ) { TQString s( cit.current()->name() ); if ( s.tqfind( " " ) == -1 && s.tqfind( "qt_" ) == -1 && s.tqfind( "unnamed" ) == -1 ) { CompletionEntry c; c.type = "variable"; c.text = s; c.prefix = ""; lst << c; } } } TQStrList props = obj->tqmetaObject()->propertyNames( TRUE ); for ( TQPtrListIterator pit( props ); pit.current(); ++pit ) { TQString f( pit.current() ); TQChar c = f[ 0 ]; f.remove( (uint)0, 1 ); f.prepend( c.upper() ); f.prepend( "set" ); CompletionEntry ce; ce.type = "property"; ce.text = f; ce.postfix = "()"; if ( lst.tqfind( ce ) == lst.end() ) lst << ce; } TQStrList slts = obj->tqmetaObject()->slotNames( TRUE ); for ( TQPtrListIterator sit( slts ); sit.current(); ++sit ) { TQString f( sit.current() ); f = f.left( f.tqfind( "(" ) ); CompletionEntry c; c.type = "slot"; c.text = f; c.postfix = "()"; if ( lst.tqfind( c ) == lst.end() ) lst << c; } if ( lst.isEmpty() ) return FALSE; showCompletion( lst ); return TRUE; } TQValueList CppEditorCompletion::functionParameters( const TQString &expr, TQChar &separator, TQString &prefix, TQString &postfix ) { TQ_UNUSED( prefix ); TQ_UNUSED( postfix ); separator = ','; if ( !ths ) return TQValueList(); TQString func; TQString objName; int i = -1; i = expr.tqfindRev( "->" ); if ( i == -1 ) i = expr.tqfindRev( "." ); else ++i; if ( i == -1 ) { i = expr.tqfindRev( " " ); if ( i == -1 ) i = expr.tqfindRev( "\t" ); else objName = ths->name(); if ( i == -1 && expr[ 0 ] != ' ' && expr[ 0 ] != '\t' ) objName = ths->name(); } if ( !objName.isEmpty() ) { func = expr.mid( i + 1 ); func = func.simplifyWhiteSpace(); } else { func = expr.mid( i + 1 ); func = func.simplifyWhiteSpace(); TQString ex( expr ); ex.remove( i, 0xFFFFFF ); if ( ex[ (int)ex.length() - 1 ] == '-' ) ex.remove( ex.length() - 1, 1 ); int j = -1; j = ex.tqfindRev( "->" ); if ( j == -1 ) j = ex.tqfindRev( "." ); else ++j; if ( j == -1 ) { j = ex.tqfindRev( " " ); if ( j == -1 ) j = ex.tqfindRev( "\t" ); else objName = ths->name(); if ( j == -1 ) objName = ths->name(); } objName = ex.mid( j + 1 ); objName = objName.simplifyWhiteSpace(); } TQObject *obj = 0; if ( ths->name() == objName || objName == "this" ) { obj = ths; } else { obj = ths->child( objName ); } if ( !obj ) return TQValueList(); TQStrList slts = obj->tqmetaObject()->slotNames( TRUE ); for ( TQPtrListIterator sit( slts ); sit.current(); ++sit ) { TQString f( sit.current() ); f = f.left( f.tqfind( "(" ) ); if ( f == func ) { f = TQString( sit.current() ); f.remove( (uint)0, f.tqfind( "(" ) + 1 ); f = f.left( f.tqfind( ")" ) ); TQStringList lst = TQStringList::split( ',', f ); if ( !lst.isEmpty() ) { TQValueList l; l << lst; return l; } } } const TQMetaProperty *prop = obj->tqmetaObject()-> property( obj->tqmetaObject()->tqfindProperty( func[ 3 ].lower() + func.mid( 4 ), TRUE ), TRUE ); if ( prop ) { TQValueList l; l << TQStringList( prop->type() ); return l; } return TQValueList(); } void CppEditorCompletion::setContext( TQObject *this_ ) { ths = this_; }