KDevelop API Documentation

editors/qeditor/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.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Oct 6 17:38:56 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003