KDevelop API Documentation

qeditor_arghint.cpp

Go to the documentation of this file.
00001 /*
00002    Copyright (C) 2002 by Roberto Raggi <roberto@kdevelop.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    version 2, License as published by the Free Software Foundation.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public License
00014    along with this library; see the file COPYING.LIB.  If not, write to
00015    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00016    Boston, MA 02111-1307, USA.
00017 */
00018 
00019 #include "qeditor_arghint.h"
00020 #include "qeditor_view.h"
00021 #include "qeditor_part.h"
00022 
00023 #include <qlabel.h>
00024 #include <qintdict.h>
00025 #include <qlayout.h>
00026 #include <qregexp.h>
00027 #include <qapplication.h>
00028 
00029 #include <kdebug.h>
00030 
00031 struct QEditorArgHintData
00032 {
00033     QEditorView* editorView;
00034     QIntDict<QLabel> labelDict;
00035     QLayout* layout;
00036 };
00037 
00038 
00039 using namespace std;
00040 
00041 QEditorArgHint::QEditorArgHint( QEditorView* parent, const char* name )
00042     : QFrame( parent, name, WType_Popup )
00043 {
00044     setBackgroundColor( black );
00045 
00046     d = new QEditorArgHintData();
00047     d->labelDict.setAutoDelete( TRUE );
00048     d->layout = new QVBoxLayout( this, 1, 2 );
00049     d->layout->setAutoAdd( TRUE );
00050     d->editorView = parent;
00051 
00052     m_markCurrentFunction = true;
00053 
00054     setFocusPolicy( StrongFocus );
00055     setFocusProxy( parent );
00056     
00057     reset( -1, -1 );
00058 }
00059 
00060 QEditorArgHint::~QEditorArgHint()
00061 {
00062     delete( d );
00063     d = 0;
00064 }
00065 
00066 void QEditorArgHint::setArgMarkInfos( const QString& wrapping, const QString& delimiter )
00067 {
00068     m_wrapping = wrapping;
00069     m_delimiter = delimiter;
00070     m_markCurrentFunction = true;
00071 }
00072 
00073 void QEditorArgHint::reset( int line, int col )
00074 {
00075     m_functionMap.clear();
00076     m_currentFunction = -1;
00077     d->labelDict.clear();
00078 
00079     m_currentLine = line;
00080     m_currentCol = col - 1;
00081 }
00082 
00083 void QEditorArgHint::slotDone()
00084 {
00085     hide();
00086 
00087     m_currentLine = m_currentCol = -1;
00088 
00089     emit argHintHidden();
00090 }
00091 
00092 void QEditorArgHint::cursorPositionChanged( QEditorView* view, int line, int col )
00093 {
00094     if( m_currentCol == -1 || m_currentLine == -1 ){
00095         slotDone();
00096         return;
00097     }
00098 
00099     int nCountDelimiter = 0;
00100     int count = 0;
00101 
00102     QString currentTextLine = view->doc()->textLine( line );
00103     QString text = currentTextLine.mid( m_currentCol, col - m_currentCol );
00104     QRegExp strconst_rx( "\"[^\"]*\"" );
00105     QRegExp chrconst_rx( "'[^']*'" );
00106 
00107     text = text
00108         .replace( strconst_rx, "\"\"" )
00109         .replace( chrconst_rx, "''" );
00110 
00111     int index = 0;
00112     while( index < (int)text.length() ){
00113         if( text[index] == m_wrapping[0] ){
00114             ++count;
00115         } else if( text[index] == m_wrapping[1] ){
00116             --count;
00117         } else if( count > 0 && text[index] == m_delimiter[0] ){
00118             ++nCountDelimiter;
00119         }
00120         ++index;
00121     }
00122 
00123     if( (m_currentLine > 0 && m_currentLine != line) || (m_currentLine < col) || (count == 0) ){
00124         slotDone();
00125         return;
00126     }
00127 
00128     // setCurArg ( nCountDelimiter + 1 );
00129 
00130 }
00131 
00132 void QEditorArgHint::addFunction( int id, const QString& prot )
00133 {
00134     m_functionMap[ id ] = prot;
00135     QLabel* label = new QLabel( prot.stripWhiteSpace().simplifyWhiteSpace(), this );
00136     label->setBackgroundColor( QColor(255, 255, 238) );
00137     label->show();
00138     d->labelDict.insert( id, label );
00139 
00140     if( m_currentFunction < 0 )
00141         setCurrentFunction( id );
00142 }
00143 
00144 void QEditorArgHint::setCurrentFunction( int currentFunction )
00145 {
00146     if( m_currentFunction != currentFunction ){
00147 
00148         if( currentFunction < 0 )
00149             currentFunction = (int)m_functionMap.size() - 1;
00150 
00151         if( currentFunction > (int)m_functionMap.size()-1 )
00152             currentFunction = 0;
00153 
00154         if( m_markCurrentFunction && m_currentFunction >= 0 ){
00155             QLabel* label = d->labelDict[ m_currentFunction ];
00156             label->setFont( font() );
00157         }
00158 
00159         m_currentFunction = currentFunction;
00160 
00161         if( m_markCurrentFunction ){
00162             QLabel* label = d->labelDict[ currentFunction ];
00163             QFont fnt( font() );
00164             fnt.setBold( TRUE );
00165             label->setFont( fnt );
00166         }
00167 
00168         adjustSize();
00169     }
00170 }
00171 
00172 void QEditorArgHint::show()
00173 {
00174     QFrame::show();
00175     adjustSize();
00176 }
00177 
00178 bool QEditorArgHint::eventFilter( QObject*, QEvent* e )
00179 {
00180     if( isVisible() && e->type() == QEvent::KeyPress ){
00181         QKeyEvent* ke = static_cast<QKeyEvent*>( e );
00182         if( (ke->state() & ControlButton) && ke->key() == Key_Left ){
00183             setCurrentFunction( currentFunction() - 1 );
00184             ke->accept();
00185             return TRUE;
00186     } else if( ke->key() == Key_Escape ){
00187         slotDone();
00188         return FALSE;
00189         } else if( (ke->state() & ControlButton) && ke->key() == Key_Right ){
00190             setCurrentFunction( currentFunction() + 1 );
00191             ke->accept();
00192             return TRUE;
00193         }
00194     }
00195     
00196     return FALSE;
00197 }
00198 
00199 void QEditorArgHint::adjustSize( )
00200 {
00201     QRect screen = QApplication::desktop()->screenGeometry(
00202 #if QT_VERSION >= 0x030100
00203     pos() 
00204 #endif  
00205     );
00206 
00207     QFrame::adjustSize();
00208     if( width() > screen.width() )
00209     resize( screen.width(), height() );
00210     
00211     if( x() + width() > screen.width() )
00212     move( screen.width() - width(), y() );
00213 }
00214 
00215 #include "qeditor_arghint.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:42 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003