KDevelop API Documentation

editors/qeditor/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.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