KDevelop API Documentation

levelwidget.cpp

Go to the documentation of this file.
00001 /* $Id: levelwidget.cpp,v 1.10 2002/12/19 22:02:39 raggi Exp $
00002  *
00003  *  Copyright (C) 2002 Roberto Raggi (roberto@kdevelop.org)
00004  *
00005  *  This program is free software; you can redistribute it and/or
00006  *  modify it under the terms of the GNU General Public
00007  *  License as published by the Free Software Foundation; either
00008  *  version 2 of the License, or (at your option) any later version.
00009  *
00010  *  This program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  *  General Public License for more details.
00014  *
00015  *  You should have received a copy of the GNU General Public License
00016  *  along with this program; see the file COPYING.  If not, write to
00017  *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018  *  Boston, MA 02111-1307, USA.
00019  *
00020  */
00021 
00022 /**********************************************************************
00023 ** Copyright (C) 2000 Trolltech AS.  All rights reserved.
00024 **
00025 ** This file is part of Qt Designer.
00026 **
00027 ** This file may be distributed and/or modified under the terms of the
00028 ** GNU General Public License version 2 as published by the Free Software
00029 ** Foundation and appearing in the file COPYING included in the
00030 ** packaging of this file.
00031 **
00032 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00033 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00034 **
00035 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
00036 **
00037 ** Contact info@trolltech.com if any conditions of this licensing are
00038 ** not clear to you.
00039 **
00040 **********************************************************************/
00041 
00042 #include "levelwidget.h"
00043 #include "qeditor.h"
00044 #include "paragdata.h"
00045 
00046 #include <private/qrichtext_p.h>
00047 #include <kdebug.h>
00048 
00049 using namespace std;
00050 
00051 const char * plus_xpm[] = {
00052 "12 12 3 1",
00053 "       c None",
00054 ".      c #000000",
00055 "+      c #FFFFFF",
00056 " .........  ",
00057 " .+++++++.  ",
00058 " .+++++++.  ",
00059 " .+++++++.  ",
00060 " .+++.+++.  ",
00061 " .+++.+++.  ",
00062 " .+.....+.  ",
00063 " .+++.+++.  ",
00064 " .+++.+++.  ",
00065 " .+++++++.  ",
00066 " .+++++++.  ",
00067 " .........  " };
00068 
00069 const  char * minus_xpm[] = {
00070 "12 12 3 1",
00071 "       c None",
00072 ".      c #000000",
00073 "+      c #FFFFFF",
00074 " .........  ",
00075 " .+++++++.  ",
00076 " .+++++++.  ",
00077 " .+++++++.  ",
00078 " .+++++++.  ",
00079 " .+++++++.  ",
00080 " .+.....+.  ",
00081 " .+++++++.  ",
00082 " .+++++++.  ",
00083 " .+++++++.  ",
00084 " .+++++++.  ",
00085 " .........  "};
00086 
00087 static QPixmap *plusPixmap = 0;
00088 static QPixmap *minusPixmap = 0;
00089 
00090 
00091 LevelWidget::LevelWidget( QEditor* editor, QWidget* parent, const char* name )
00092     : QWidget( parent, name, WRepaintNoErase | WStaticContents | WResizeNoErase ),
00093       m_editor( editor )
00094 {
00095     if( !plusPixmap ){
00096         plusPixmap = new QPixmap( plus_xpm );
00097         minusPixmap = new QPixmap( minus_xpm );
00098     }
00099 
00100     setFixedWidth( 16 );
00101 
00102     connect( m_editor->verticalScrollBar(), SIGNAL( valueChanged( int ) ),
00103          this, SLOT( doRepaint() ) );
00104     connect( m_editor, SIGNAL( textChanged() ),
00105          this, SLOT( doRepaint() ) );
00106     connect( m_editor, SIGNAL( parsed() ),
00107          this, SLOT( doRepaint() ) );
00108     doRepaint();
00109 }
00110 
00111 LevelWidget::~LevelWidget()
00112 {
00113 }
00114 
00115 void LevelWidget::paintEvent( QPaintEvent* /*e*/ )
00116 {
00117     buffer.fill( /*backgroundColor()*/ );
00118 
00119     QTextParagraph *p = m_editor->document()->firstParagraph();
00120     QPainter painter( &buffer );
00121     int yOffset = m_editor->contentsY();
00122     while ( p ) {
00123     if ( !p->isVisible() ) {
00124         p = p->next();
00125         continue;
00126     }
00127     if ( p->rect().y() + p->rect().height() - yOffset < 0 ) {
00128         p = p->next();
00129         continue;
00130     }
00131     if ( p->rect().y() - yOffset > height() )
00132         break;
00133 
00134     ParagData* data = (ParagData*) p->extraData();
00135     if( data ){
00136 
00137         int prevLevel = 0;
00138         if( p->prev() ){
00139         prevLevel = ((ParagData*) p->prev()->extraData())->level();
00140         }
00141 
00142         if( data->isBlockStart() ){
00143         if( data->isOpen() ){
00144                     painter.drawLine( minusPixmap->width() / 2 + 2,
00145                                       p->rect().y() + p->rect().height() - yOffset,
00146                                       minusPixmap->width() / 2 - 2,
00147                                       p->rect().y() + p->rect().height() - yOffset );
00148 
00149             painter.drawPixmap( 0, p->rect().y() +
00150                     ( p->rect().height() - minusPixmap->height() ) / 2 -
00151                     yOffset, *minusPixmap );
00152         } else {
00153             painter.drawPixmap( 0, p->rect().y() +
00154                     ( p->rect().height() - plusPixmap->height() ) / 2 -
00155                     yOffset, *plusPixmap );
00156         }
00157         } else if( data->level() < prevLevel ){
00158         painter.drawLine( plusPixmap->width() / 2, p->rect().y() - yOffset,
00159                   plusPixmap->width() / 2, p->rect().y() + p->rect().height() - yOffset );
00160 
00161         painter.drawLine( plusPixmap->width() / 2 + 2,
00162                   p->rect().y() + p->rect().height() - yOffset,
00163                   plusPixmap->width() / 2 - 2,
00164                   p->rect().y() + p->rect().height() - yOffset );
00165         } else if( data->level() != 0 ){
00166         painter.drawLine( plusPixmap->width() / 2, p->rect().y() - yOffset,
00167                   plusPixmap->width() / 2, p->rect().y() + p->rect().height() - yOffset );
00168         }
00169     }
00170     p = p->next();
00171     }
00172 
00173     painter.end();
00174     bitBlt( this, 0, 0, &buffer );
00175 }
00176 
00177 void LevelWidget::resizeEvent( QResizeEvent *e )
00178 {
00179     buffer.resize( e->size() );
00180     QWidget::resizeEvent( e );
00181 }
00182 
00183 void LevelWidget::mousePressEvent( QMouseEvent* e )
00184 {
00185     QTextParagraph *p = m_editor->document()->firstParagraph();
00186     int yOffset = m_editor->contentsY();
00187     while ( p ) {
00188     if ( e->y() >= p->rect().y() - yOffset && e->y() <= p->rect().y() + p->rect().height() - yOffset ) {
00189         ParagData *data = (ParagData*) p->extraData();
00190             if( data && data->isBlockStart() ){
00191 
00192                 if( data->isOpen() ){
00193                     emit collapseBlock( p );
00194                 } else {
00195                     emit expandBlock( p );
00196                 }
00197         }
00198         break;
00199     }
00200     p = p->next();
00201     }
00202 
00203     doRepaint();
00204 }
00205 #include "levelwidget.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:41 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003