KDevelop API Documentation

qsourcecolorizer.cpp

Go to the documentation of this file.
00001 /* $Id: qsourcecolorizer.cpp,v 1.25 2003/02/08 23:05:45 cunz 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  *  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 #include "qsourcecolorizer.h"
00024 #include "qeditor_part.h"
00025 #include "paragdata.h"
00026 #include "qeditor.h"
00027 
00028 #include <qregexp.h>
00029 
00030 #include <kapplication.h>
00031 #include <kdebug.h>
00032 #include <kconfig.h>
00033 #include <kglobalsettings.h>
00034 
00035 using namespace std;
00036 
00037 
00038 QSourceColorizer::QSourceColorizer( QEditor* editor )
00039     : QTextPreProcessor(), m_editor( editor )
00040 {
00041     m_items.setAutoDelete( TRUE );
00042 
00043     QFont defaultFont = KGlobalSettings::fixedFont();
00044     KConfig* config = QEditorPartFactory::instance()->config();
00045     config->setGroup( "General" );  // or colorizer ?!?!?
00046 
00047     m_formats.clear();
00048 
00049     DECLARE_FORMAT_ITEM( Normal, "Normal", defaultFont, Qt::black );
00050     DECLARE_FORMAT_ITEM( PreProcessor, "PreProcessor", defaultFont, QColor( 0x80, 0x00, 0x80 ) ); //Qt::darkGreen
00051     DECLARE_FORMAT_ITEM( Keyword, "Keyword", defaultFont, QColor( 0x0e, 0x23, 0xad ) ); //QColor( 0xff, 0x77, 0x00 )
00052     DECLARE_FORMAT_ITEM( BuiltInClass, "Built-in Class", defaultFont, QColor( 0xff, 0x77, 0x00 ) );
00053     DECLARE_FORMAT_ITEM( Operator, "Operator", defaultFont, Qt::black );
00054     DECLARE_FORMAT_ITEM( Comment, "Comment", defaultFont, QColor( 0x06, 0x78, 0x17) ); //QColor( 0xdd, 0x00, 0x00 )
00055     DECLARE_FORMAT_ITEM( Constant, "Constant", defaultFont, QColor( 0x00, 0x00, 0xff ) ); //Qt::darkBlue
00056     DECLARE_FORMAT_ITEM( String, "String", defaultFont, QColor( 0xde, 0x19, 0x07 ) ); //QColor( 0x00, 0xaa, 0x00 )
00057 
00058     setSymbols( "{[(", "}])" );
00059 }
00060 
00061 QSourceColorizer::~QSourceColorizer()
00062 {
00063     KConfig* config = QEditorPartFactory::instance()->config();
00064     config->setGroup( "General" );  // or colorizer ?!?!?
00065 
00066     while( !m_formats.empty() ){
00067         QMap<int, QPair<QString, QTextFormat*> >::Iterator it = m_formats.begin();
00068         STORE_FORMAT_ITEM( it.key() );
00069         delete( (*it).second );
00070         m_formats.erase( it );
00071     }
00072 
00073     config->sync();
00074 }
00075 
00076 
00077 void QSourceColorizer::updateStyles( QMap<QString, QPair<QFont, QColor> >& values )
00078 {
00079     KConfig* config = QEditorPartFactory::instance()->config();
00080     config->setGroup( "General" );  // or colorizer ?!?!?
00081 
00082     QMap<QString, QPair<QFont, QColor> >::Iterator it = values.begin();
00083     while( it != values.end() ){
00084         QTextFormat* fmt = formatFromId( it.key() );
00085         if( fmt ){
00086             fmt->setFont( (*it).first );
00087             fmt->setColor( (*it).second );
00088         }
00089         ++it;
00090     }
00091 
00092     {
00093         QMap<int, QPair<QString, QTextFormat*> >::Iterator it = m_formats.begin();
00094         while( it != m_formats.end() ){
00095             STORE_FORMAT_ITEM( it.key() );
00096             ++it;
00097         }
00098     }
00099 
00100     config->sync();
00101 }
00102 
00103 
00104 void QSourceColorizer::process( QTextDocument* doc, QTextParagraph* parag, int,
00105                 bool invalidate )
00106 {
00107     int state = 0;
00108     int startLevel = 0;
00109     int startState = 0;
00110     
00111     if( parag->prev() ){
00112     if( parag->prev()->endState() == -1 )
00113         process( doc, parag->prev(), 0, FALSE );
00114     startState = parag->prev()->endState();
00115     startLevel = ((ParagData*) parag->prev()->extraData())->level();
00116     }
00117     state = startState;
00118     
00119     ParagData* extra = (ParagData*) parag->extraData();
00120     if( extra ){
00121     extra->clear();
00122     } else {
00123     extra = new ParagData();
00124     parag->setExtraData( extra );
00125     }
00126     
00127     HLItemCollection* ctx = m_items.at( state );
00128     QString s = m_editor->text( parag->paragId() );
00129     const QChar* buffer = s.unicode();
00130     int length = s.length();
00131     
00132     int pos = 0;
00133     while( pos < length ){
00134     int attr = 0;
00135     int next = state;
00136     
00137     int npos = ctx->checkHL( buffer, pos, s.length(), &attr, &next );
00138     if( npos > pos ){
00139         state = next;
00140         ctx = m_items.at( state );
00141         parag->setFormat( pos, npos, format(attr) );
00142         pos = npos;
00143     } else {
00144         const QChar& ch = buffer[ pos ];
00145         int a = ctx->attr();
00146         if( !a ){
00147         if( m_left.find(ch) != -1 ){
00148             extra->add( Symbol::Left, ch, pos );
00149         } else if( m_right.find(ch) != -1 ){
00150             extra->add( Symbol::Right, ch, pos );
00151         }
00152         }
00153         parag->setFormat( pos, pos+1, format(a) );
00154         ++pos;
00155     }
00156     }
00157     
00158     int oldState = parag->endState();
00159     
00160     if( state != oldState ){
00161     parag->setEndState( state );
00162     }
00163     
00164     int oldLevel = extra->level();
00165     int level = computeLevel( parag, startLevel );
00166     if( level != oldLevel ){
00167     extra->setLevel( level > 0 ? level : 0 );
00168     }
00169     
00170     parag->setFirstPreProcess( FALSE );
00171     
00172     QTextParagraph *p = parag->next();
00173     
00174     if( (oldLevel != level 
00175      || (oldState == -1 && parag->prev() && parag->endState() != parag->prev()->endState())
00176      || (oldState != -1 && oldState != state))
00177     && invalidate && p && !p->firstPreProcess() && p->endState() != -1 )
00178     {       
00179     //kdDebug(9032) << "invalidate!!! line = " << parag->paragId() << endl;
00180     int count = 0;
00181     while ( p ) {
00182         if ( p->endState() == -1 )
00183         return;
00184         
00185         ++count;
00186         p->setEndState( -1 );
00187         p = p->next();
00188     }
00189     //kdDebug(9032) << "invalidated " << count+1 << " lines" << endl;
00190     }
00191 }
00192 
00193 void QSourceColorizer::insertHLItem( int id, HLItemCollection* item )
00194 {
00195     m_items.insert( id, item );
00196 }
00197 
00198 void QSourceColorizer::setSymbols( const QString& l, const QString& r )
00199 {
00200     m_left = l;
00201     m_right = r;
00202 }
00203 
00204 QTextFormat* QSourceColorizer::formatFromId( const QString& id )
00205 {
00206     QMap<int, QPair<QString, QTextFormat*> >::Iterator it = m_formats.begin();
00207     while( it != m_formats.end() ){
00208         if( (*it).first == id ){
00209             return (*it).second;
00210         }
00211         ++it;
00212     }
00213     return 0;
00214 }
00215 
00216 QStringList QSourceColorizer::styleList() const
00217 {
00218     QStringList lst;
00219 
00220     QMap<int, QPair<QString, QTextFormat*> >::ConstIterator it = m_formats.begin();
00221     while( it != m_formats.end() ){
00222         lst << (*it).first;
00223         ++it;
00224     }
00225 
00226     return lst;
00227 }
00228 
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