KDevelop API Documentation

editors/qeditor/qsourcecolorizer.h

Go to the documentation of this file.
00001 /* $Id: qsourcecolorizer.h,v 1.17 2003/04/23 01:07:51 harald Exp $ 00002 * 00003 * This file is part of Klint 00004 * Copyright (C) 2001 Roberto Raggi (roberto@kdevelop.org) 00005 * 00006 * This program is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2 of the License, or (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Library General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; see the file COPYING. If not, write to 00018 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00019 * Boston, MA 02111-1307, USA. 00020 * 00021 */ 00022 00023 #ifndef qsourcecolorizer_h 00024 #define qsourcecolorizer_h 00025 00026 #include <private/qrichtext_p.h> 00027 #include <qintdict.h> 00028 #include <qptrlist.h> 00029 #include <qmap.h> 00030 #include <qregexp.h> 00031 #include <qpair.h> 00032 #include <kdebug.h> 00033 00034 #define DECLARE_FORMAT_ITEM(type, id, f, c)\ 00035 {\ 00036 QFont font = f; \ 00037 QColor color = c; \ 00038 font = config->readFontEntry( QString("Font ") + id, &font ); \ 00039 color = config->readColorEntry( QString("Color ") + id, &color ); \ 00040 m_formats.insert( type, qMakePair(QString(id), new QTextFormat(font, color)) ); \ 00041 } 00042 00043 #define UPDATE_FORMAT_ITEM(type, f, c)\ 00044 m_formats[ type ].second->setFont( f ); \ 00045 m_formats[ type ].second->setColor( c ); 00046 00047 #define STORE_FORMAT_ITEM(type)\ 00048 {\ 00049 QString id = m_formats[ type ].first; \ 00050 QTextFormat* fmt = m_formats[ type ].second; \ 00051 config->writeEntry( QString("Font ") + id, fmt->font() ); \ 00052 config->writeEntry( QString("Color ") + id, fmt->color() ); \ 00053 } 00054 00055 class QEditor; 00056 00057 class HLItem{ 00058 public: 00059 HLItem( int state=0, int context=0 ) 00060 : m_state( state ), m_context( context ) {} 00061 virtual ~HLItem() {} 00062 00063 virtual int attr() const { return m_state; } 00064 virtual int context() const { return m_context; } 00065 00066 virtual int checkHL( const QChar* buffer, int pos, int length, int*, int* ) = 0; 00067 00068 private: 00069 int m_state; 00070 int m_context; 00071 }; 00072 00073 class NumberHLItem: public HLItem{ 00074 public: 00075 NumberHLItem( int state, int context ) 00076 : HLItem( state, context ) {} 00077 00078 int checkHL( const QChar* buffer, int pos, int length, int*, int* ){ 00079 //kdDebug(9032) << "NumberHLItem::checkHLItem" << endl; 00080 while( pos<length && buffer[pos].isNumber() ){ 00081 ++pos; 00082 } 00083 return pos; 00084 } 00085 }; 00086 00087 class WhiteSpacesHLItem: public HLItem{ 00088 public: 00089 WhiteSpacesHLItem( int state, int context ) 00090 : HLItem( state, context ) {} 00091 00092 int checkHL( const QChar* buffer, int pos, int length, int*, int* ){ 00093 //kdDebug(9032) << "WhiteSpacesHLItem::checkHLItem" << endl; 00094 while( (pos<length) && buffer[pos].isSpace() ){ 00095 ++pos; 00096 } 00097 return pos; 00098 } 00099 }; 00100 00101 class KeywordsHLItem: public HLItem{ 00102 public: 00103 KeywordsHLItem( const char** keywords, int state, int ide_state, int context, bool finalize = true, bool ignoreCase = false ) 00104 : HLItem( state, context ), m_ok(false), m_state(state), m_ide_state(ide_state), m_finalize(finalize), m_ignoreCase(ignoreCase) { 00105 int i = 1; 00106 if ( ignoreCase ) { 00107 while( *keywords ) 00108 m_keywords.insert( QString(*keywords++).lower(), i++ ); 00109 } else { 00110 while( *keywords ) 00111 m_keywords.insert( QString(*keywords++), i++ ); 00112 } 00113 } 00114 00115 KeywordsHLItem( const QMap<QString, int> keywords, int state, int ide_state, int context, bool finalize = true, bool ignoreCase = false ) 00116 : HLItem( state, context ), m_ok(false), m_state(state), m_ide_state(ide_state), m_finalize(finalize), m_ignoreCase(ignoreCase) { 00117 m_keywords = keywords; 00118 } 00119 00120 int attr() const { return m_ok ? m_state : m_ide_state; } 00121 00122 int checkHL( const QChar* buffer, int pos, int length, int*, int* ){ 00123 //kdDebug(9032) << "KeywordsHLItem::checkHLItem" << endl; 00124 00125 int start_pos = pos; 00126 00127 while( (pos<length) && (buffer[pos].isLetterOrNumber() || buffer[pos] == '_') ) 00128 ++pos; 00129 00130 if( start_pos != pos ) { 00131 if ( m_ignoreCase ) { 00132 m_ok = m_keywords.contains( QString(buffer+start_pos, pos-start_pos).lower() ); 00133 } else { 00134 m_ok = m_keywords.contains( QString(buffer+start_pos, pos-start_pos) ); 00135 } 00136 } 00137 00138 return ( m_ok || m_finalize ) ? pos : start_pos; 00139 } 00140 00141 private: 00142 QMap<QString, int> m_keywords; 00143 bool m_ok; 00144 int m_state; 00145 int m_ide_state; 00146 bool m_finalize; 00147 bool m_ignoreCase; 00148 }; 00149 00150 class StartsWithHLItem: public HLItem{ 00151 public: 00152 StartsWithHLItem( const QString& s, int state, int context ) 00153 : HLItem( state, context ), m_text(s) {} 00154 00155 int checkHL( const QChar* buffer, int pos, int length, int*, int* ){ 00156 //kdDebug(9032) << "StartsWithHLItem::checkHLItem" << endl; 00157 if( (length - pos) >= (int)m_text.length() && QString(buffer+pos, m_text.length()) == m_text ) 00158 return length; 00159 00160 return pos; 00161 } 00162 00163 private: 00164 QString m_text; 00165 }; 00166 00167 class StringHLItem: public HLItem{ 00168 public: 00169 StringHLItem( const QString& text, int state, int context ) 00170 : HLItem( state, context ), m_text(text) {} 00171 00172 int checkHL( const QChar* buffer, int pos, int length, int*, int* ){ 00173 //kdDebug(9032) << "StringHLItem::checkHLItem" << endl; 00174 if( (length - pos) >= (int)m_text.length() && QString(buffer+pos, m_text.length()) == m_text ) 00175 return pos + m_text.length(); 00176 00177 return pos; 00178 } 00179 00180 private: 00181 QString m_text; 00182 }; 00183 00184 class RegExpHLItem: public HLItem{ 00185 public: 00186 RegExpHLItem( QString pattern, int state, int context ) 00187 : HLItem( state, context ), m_rx( pattern ) {} 00188 00189 int checkHL( const QChar* buffer, int pos, int length, int*, int* ){ 00190 //kdDebug(9032) << "RegExpHLItem::checkHLItem" << endl; 00191 QString s( buffer, length ); 00192 00193 int idx = m_rx.search(s, pos); 00194 if( idx == pos ) 00195 return pos + m_rx.matchedLength(); 00196 00197 return pos; 00198 } 00199 00200 private: 00201 QRegExp m_rx; 00202 }; 00203 00204 class HexHLItem: public HLItem{ 00205 public: 00206 HexHLItem( int state, int context ) 00207 : HLItem( state, context ) {} 00208 00209 int checkHL( const QChar* buffer, int pos, int length, int*, int* ){ 00210 if( (length-pos) > 2 ){ 00211 QString s( buffer+pos,2 ); 00212 if( s == "0x" || s == "0X" ){ 00213 pos += 2; 00214 while( pos < length ){ 00215 const QChar& ch = buffer[ pos ]; 00216 if( ch.isNumber() || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F') ) 00217 ++pos; 00218 else 00219 break; 00220 } 00221 00222 } 00223 } 00224 return pos; 00225 } 00226 }; 00227 00228 class HLItemCollection: public HLItem{ 00229 public: 00230 HLItemCollection( int state=0, int context=0 ): HLItem( state, context ) 00231 { m_items.setAutoDelete( TRUE ); } 00232 00233 void appendChild( HLItem* item ) { m_items.append( item ); } 00234 00235 int checkHL( const QChar* buffer, int pos, int length, int* state, int* next ){ 00236 QPtrListIterator<HLItem> it( m_items ); 00237 00238 while( it.current() ){ 00239 HLItem* item = it.current(); 00240 00241 int npos = item->checkHL( buffer, pos, length, state, next ); 00242 00243 if( npos > pos ){ 00244 pos = npos; 00245 if( state ) 00246 *state = item->attr(); 00247 if( next ) 00248 *next = item->context(); 00249 break; 00250 } 00251 ++it; 00252 } 00253 00254 return pos; 00255 } 00256 00257 private: 00258 QPtrList<HLItem> m_items; 00259 }; 00260 00261 class QSourceColorizer: public QTextPreProcessor{ 00262 public: 00263 enum Type { 00264 Normal=0, 00265 PreProcessor, 00266 Keyword, 00267 BuiltInClass, 00268 Operator, 00269 Comment, 00270 Constant, 00271 String, 00272 00273 Custom = 1000 00274 }; 00275 00276 public: 00277 QSourceColorizer( QEditor* ); 00278 virtual ~QSourceColorizer(); 00279 00280 QEditor* editor() const { return m_editor; } 00281 00282 void insertHLItem( int, HLItemCollection* ); 00283 00284 void setSymbols( const QString&, const QString& ); 00285 QString leftSymbols() const { return m_left; } 00286 QString rightSymbols() const { return m_right; } 00287 00288 virtual QTextFormat* format( int key ) { return m_formats[ key ].second; } 00289 virtual QTextFormat* formatFromId( const QString& id ); 00290 00291 QStringList styleList() const; 00292 virtual void updateStyles( QMap<QString, QPair<QFont, QColor> >& values ); 00293 virtual void process( QTextDocument*, QTextParagraph*, int, bool=FALSE ); 00294 virtual int computeLevel( QTextParagraph*, int ) { return 0; } 00295 00296 protected: 00297 QEditor* m_editor; 00298 QMap<int, QPair<QString, QTextFormat*> > m_formats; 00299 QPtrList<HLItemCollection> m_items; 00300 QString m_left; 00301 QString m_right; 00302 }; 00303 00304 00305 #endif
KDE Logo
This file is part of the documentation for KDevelop Version 3.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Oct 19 08:01:38 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003