summaryrefslogtreecommitdiffstats
path: root/tools/designer/editor/markerwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/designer/editor/markerwidget.cpp')
-rw-r--r--tools/designer/editor/markerwidget.cpp491
1 files changed, 491 insertions, 0 deletions
diff --git a/tools/designer/editor/markerwidget.cpp b/tools/designer/editor/markerwidget.cpp
new file mode 100644
index 0000000..cabe39a
--- /dev/null
+++ b/tools/designer/editor/markerwidget.cpp
@@ -0,0 +1,491 @@
+ /**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "markerwidget.h"
+#include "viewmanager.h"
+#include <private/qrichtext_p.h>
+#include "editor.h"
+#include <qpainter.h>
+#include <qpopupmenu.h>
+#include "paragdata.h"
+
+static const char * error_xpm[] = {
+"15 15 35 1",
+" c None",
+". c #FF0000",
+"+ c #F50F0F",
+"@ c #BF5F5F",
+"# c #FF1010",
+"$ c #FF7878",
+"% c #FF0A0A",
+"& c #FF0606",
+"* c #FF1414",
+"= c #FFFFFF",
+"- c #FFA3A3",
+"; c #FF0707",
+"> c #FF0202",
+", c #FF9898",
+"' c #FF8888",
+") c #D04747",
+"! c #FFA7A7",
+"~ c #FF9D9D",
+"{ c #FFB1B1",
+"] c #FF0C0C",
+"^ c #F90A0A",
+"/ c #FFB5B5",
+"( c #FF0909",
+"_ c #A08F8F",
+": c #FFACAC",
+"< c #FF0303",
+"[ c #9F8F8F",
+"} c #FB0606",
+"| c #9F9090",
+"1 c #CE4949",
+"2 c #999999",
+"3 c #FF1919",
+"4 c #F70C0C",
+"5 c #A38A8A",
+"6 c #B37272",
+" .... ",
+" ........ ",
+" .........+@ ",
+" ..#$%..&$*.+ ",
+" ..$=-;>,='..) ",
+"...%-=!~={]..^ ",
+"....;!==/(...._",
+"....>~==:<....[",
+"...&,=/:=!;..}|",
+" ..$={(<!='..12",
+" ..*']..;'3.45 ",
+" +........462 ",
+" @+......462 ",
+" )^..}152 ",
+" _[|2 "};
+
+static const char * breakpoint_xpm[] = {
+"15 15 3 1",
+" c None",
+". c #8B0000",
+"+ c #FFFFFF",
+" ....... ",
+" ......... ",
+" ........... ",
+" ............. ",
+"..+.+++.+..++..",
+".+.+.+.+.+.+.+.",
+".+...+.+.+.+.+.",
+"..+..+.+.+.++..",
+"...+.+.+.+.+...",
+".+.+.+.+.+.+...",
+"..+..+..+..+...",
+" ............. ",
+" ........... ",
+" ......... ",
+" ....... " };
+
+static const char * step_xpm[] = {
+"16 16 128 2",
+" c None",
+". c #B4B6BF",
+"+ c #7893D8",
+"@ c #8D95BF",
+"# c #B8BFC1",
+"$ c #B6D1E6",
+"% c #7193E6",
+"& c #8893C2",
+"* c #B3BDC4",
+"= c #AAD2EC",
+"- c #9AD0FF",
+"; c #6690EF",
+"> c #8894C8",
+", c #AFBAC4",
+"' c #95BFEC",
+") c #99CBFF",
+"! c #8EC3FF",
+"~ c #6D95F0",
+"{ c #8792CA",
+"] c #9DA7C3",
+"^ c #8BA2E3",
+"/ c #809AE0",
+"( c #8398D1",
+"_ c #93A0CC",
+": c #ACB3CB",
+"< c #B4B9C4",
+"[ c #B6BAC4",
+"} c #93A4CC",
+"| c #82B0F5",
+"1 c #8BBCFF",
+"2 c #8EC0FF",
+"3 c #8FC1FF",
+"4 c #6594F4",
+"5 c #7381CC",
+"6 c #81A7E9",
+"7 c #D0F5FF",
+"8 c #C1EBFF",
+"9 c #AEDAFF",
+"0 c #A2D1FC",
+"a c #A3C8F3",
+"b c #AACAE6",
+"c c #B4CFE9",
+"d c #ADCCF9",
+"e c #84B2FF",
+"f c #82B4FF",
+"g c #86B7FF",
+"h c #88B7FF",
+"i c #83B4FF",
+"j c #5F8AF3",
+"k c #7585C8",
+"l c #77A4F3",
+"m c #ABDFFF",
+"n c #9CCAFF",
+"o c #96C7FF",
+"p c #97C8FF",
+"q c #95C5FF",
+"r c #9DCCFF",
+"s c #A0CDFF",
+"t c #90C0FF",
+"u c #82AFFF",
+"v c #7FAFFF",
+"w c #7DAEFF",
+"x c #79AAFF",
+"y c #6C9EFF",
+"z c #4366EB",
+"A c #6894F2",
+"B c #93C6FF",
+"C c #82B3FF",
+"D c #7AABFF",
+"E c #73A5FF",
+"F c #71A3FF",
+"G c #6C9DFF",
+"H c #699BFF",
+"I c #76A8FF",
+"J c #7EB0FF",
+"K c #7BADFF",
+"L c #74A5FF",
+"M c #608BFF",
+"N c #3462FF",
+"O c #2444E5",
+"P c #577AE0",
+"Q c #5D90FF",
+"R c #4C7AFF",
+"S c #3B66FF",
+"T c #335CF9",
+"U c #365AF1",
+"V c #3858E5",
+"W c #3959E0",
+"X c #416CF9",
+"Y c #75A5FF",
+"Z c #78A9FF",
+"` c #74A4FF",
+" . c #6191FF",
+".. c #3059FF",
+"+. c #1B37F1",
+"@. c #6A75C7",
+"#. c #828BC1",
+"$. c #4358D8",
+"%. c #374BDA",
+"&. c #4759CA",
+"*. c #636CC4",
+"=. c #8489C0",
+"-. c #9DA1C1",
+";. c #A3A6BF",
+">. c #7486CB",
+",. c #6E98F5",
+"'. c #719EFF",
+"). c #608DFF",
+"!. c #315EFF",
+"~. c #1432F4",
+"{. c #5C63C8",
+"]. c #B1B4B9",
+"^. c #B3BABB",
+"/. c #ABB4C3",
+"(. c #7299E9",
+"_. c #5486FF",
+":. c #224EFF",
+"<. c #1733F2",
+"[. c #7079C5",
+"}. c #5C7DE9",
+"|. c #2450FF",
+"1. c #1B39EC",
+"2. c #7077C5",
+"3. c #3A54E1",
+"4. c #1E36EA",
+"5. c #858CBF",
+"6. c #525FCB",
+"7. c #727CBC",
+" ",
+" . + @ ",
+" # $ % & ",
+" * = - ; > ",
+" , ' ) ! ~ { ",
+"] ^ / ( _ : < [ } | 1 2 3 4 5 ",
+"6 7 8 9 0 a b c d e f g h i j k ",
+"l m n o p q r s t u v u w x y z ",
+"A B C D E F G H I J K D L M N O ",
+"P Q R S T U V W X Y Z ` ...+.@.",
+"#.$.%.&.*.=.-.;.>.,.'.).!.~.{. ",
+" ].^. /.(._.:.<.[. ",
+" }.|.1.2. ",
+" 3.4.5. ",
+" 6.7. ",
+" "};
+
+static const char *stack_frame_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #00c000",
+"................",
+".###............",
+".#####..........",
+".#######........",
+".#########......",
+".###########....",
+".#############..",
+".##############.",
+".##############.",
+".#############..",
+".###########....",
+".#########......",
+".#######........",
+".#####..........",
+".###............",
+"................"};
+
+static QPixmap *errorPixmap = 0;
+static QPixmap *breakpointPixmap = 0;
+static QPixmap *stepPixmap = 0;
+static QPixmap *stackFrame = 0;
+
+MarkerWidget::MarkerWidget( ViewManager *parent, const char*name )
+ : QWidget( parent, name, WRepaintNoErase | WStaticContents | WResizeNoErase ), viewManager( parent )
+{
+ if ( !errorPixmap ) {
+ errorPixmap = new QPixmap( error_xpm );
+ breakpointPixmap = new QPixmap( breakpoint_xpm );
+ stepPixmap = new QPixmap( step_xpm );
+ stackFrame = new QPixmap( stack_frame_xpm );
+ }
+}
+
+void MarkerWidget::paintEvent( QPaintEvent * )
+{
+ buffer.fill( backgroundColor() );
+
+ QTextParagraph *p = ( (Editor*)viewManager->currentView() )->document()->firstParagraph();
+ QPainter painter( &buffer );
+ int yOffset = ( (Editor*)viewManager->currentView() )->contentsY();
+ while ( p ) {
+ if ( !p->isVisible() ) {
+ p = p->next();
+ continue;
+ }
+ if ( p->rect().y() + p->rect().height() - yOffset < 0 ) {
+ p = p->next();
+ continue;
+ }
+ if ( p->rect().y() - yOffset > height() )
+ break;
+ if ( !((p->paragId() + 1) % 10) ) {
+ painter.save();
+ painter.setPen( colorGroup().dark() );
+ painter.drawText( 0, p->rect().y() - yOffset, width() - 20, p->rect().height(),
+ Qt::AlignRight | Qt::AlignTop, QString::number( p->paragId() + 1 ) );
+ painter.restore();
+ }
+ ParagData *paragData = (ParagData*)p->extraData();
+ if ( paragData ) {
+ switch ( paragData->marker ) {
+ case ParagData::Error:
+ painter.drawPixmap( 3, p->rect().y() +
+ ( p->rect().height() - errorPixmap->height() ) / 2 -
+ yOffset, *errorPixmap );
+ break;
+ case ParagData::Breakpoint:
+ painter.drawPixmap( 3, p->rect().y() +
+ ( p->rect().height() - breakpointPixmap->height() ) / 2 -
+ yOffset, *breakpointPixmap );
+ break;
+ default:
+ break;
+ }
+ switch ( paragData->lineState ) {
+ case ParagData::FunctionStart:
+ painter.setPen( colorGroup().foreground() );
+ painter.setBrush( colorGroup().base() );
+ painter.drawLine( width() - 11, p->rect().y() - yOffset,
+ width() - 11, p->rect().y() + p->rect().height() - yOffset );
+ painter.drawRect( width() - 15, p->rect().y() + ( p->rect().height() - 9 ) / 2 - yOffset, 9, 9 );
+ painter.drawLine( width() - 13, p->rect().y() + ( p->rect().height() - 9 ) / 2 - yOffset + 4,
+ width() - 9, p->rect().y() +
+ ( p->rect().height() - 9 ) / 2 - yOffset + 4 );
+ if ( !paragData->functionOpen )
+ painter.drawLine( width() - 11,
+ p->rect().y() + ( p->rect().height() - 9 ) / 2 - yOffset + 2,
+ width() - 11,
+ p->rect().y() +
+ ( p->rect().height() - 9 ) / 2 - yOffset + 6 );
+ break;
+ case ParagData::InFunction:
+ painter.setPen( colorGroup().foreground() );
+ painter.drawLine( width() - 11, p->rect().y() - yOffset,
+ width() - 11, p->rect().y() + p->rect().height() - yOffset );
+ break;
+ case ParagData::FunctionEnd:
+ painter.setPen( colorGroup().foreground() );
+ painter.drawLine( width() - 11, p->rect().y() - yOffset,
+ width() - 11, p->rect().y() + p->rect().height() - yOffset );
+ painter.drawLine( width() - 11, p->rect().y() + p->rect().height() - yOffset,
+ width() - 7, p->rect().y() + p->rect().height() - yOffset );
+ break;
+ default:
+ break;
+ }
+ if ( paragData->step )
+ painter.drawPixmap( 3, p->rect().y() +
+ ( p->rect().height() - stepPixmap->height() ) / 2 -
+ yOffset, *stepPixmap );
+ if ( paragData->stackFrame )
+ painter.drawPixmap( 3, p->rect().y() +
+ ( p->rect().height() - stackFrame->height() ) / 2 -
+ yOffset, *stackFrame );
+ }
+ p = p->next();
+ }
+ painter.end();
+
+ bitBlt( this, 0, 0, &buffer );
+}
+
+void MarkerWidget::resizeEvent( QResizeEvent *e )
+{
+ buffer.resize( e->size() );
+ QWidget::resizeEvent( e );
+}
+
+void MarkerWidget::mousePressEvent( QMouseEvent *e )
+{
+ if ( e->button() != LeftButton )
+ return;
+ bool supports = ( (Editor*)viewManager->currentView() )->supportsBreakPoints();
+ QTextParagraph *p = ( (Editor*)viewManager->currentView() )->document()->firstParagraph();
+ int yOffset = ( (Editor*)viewManager->currentView() )->contentsY();
+ while ( p ) {
+ if ( e->y() >= p->rect().y() - yOffset && e->y() <= p->rect().y() + p->rect().height() - yOffset ) {
+ QTextParagraphData *d = p->extraData();
+ if ( !d )
+ return;
+ ParagData *data = (ParagData*)d;
+ if ( supports && ( e->x() < width() - 15 ) ) {
+ if ( data->marker == ParagData::Breakpoint ) {
+ data->marker = ParagData::NoMarker;
+ } else {
+ bool ok = TRUE;
+ isBreakpointPossible( ok, ( (Editor*)viewManager->currentView() )->text(), p->paragId() );
+ if ( ok )
+ data->marker = ParagData::Breakpoint;
+ else
+ emit showMessage( tr( "<font color=red>Can't set breakpoint here!</font>" ) );
+ }
+ } else {
+ if ( data->lineState == ParagData::FunctionStart ) {
+ if ( data->functionOpen )
+ emit collapseFunction( p );
+ else
+ emit expandFunction( p );
+ }
+ }
+ break;
+ }
+ p = p->next();
+ }
+ doRepaint();
+ emit markersChanged();
+}
+
+void MarkerWidget::contextMenuEvent( QContextMenuEvent *e )
+{
+ QPopupMenu m( 0, "editor_breakpointsmenu" );
+
+ int toggleBreakPoint = 0;
+// int editBreakpoints = 0;
+
+ QTextParagraph *p = ( (Editor*)viewManager->currentView() )->document()->firstParagraph();
+ int yOffset = ( (Editor*)viewManager->currentView() )->contentsY();
+ bool supports = ( (Editor*)viewManager->currentView() )->supportsBreakPoints();
+ while ( p && supports ) {
+ if ( e->y() >= p->rect().y() - yOffset && e->y() <= p->rect().y() + p->rect().height() - yOffset ) {
+ if ( ( (ParagData*)p->extraData() )->marker == ParagData::Breakpoint )
+ toggleBreakPoint = m.insertItem( tr( "Clear Breakpoint\tF9" ) );
+ else
+ toggleBreakPoint = m.insertItem( tr( "Set Breakpoint\tF9" ) );
+// editBreakpoints = m.insertItem( tr( "Edit Breakpoints..." ) );
+ m.insertSeparator();
+ break;
+ }
+ p = p->next();
+ }
+
+ const int collapseAll = m.insertItem( tr( "Collapse All" ) );
+ const int expandAll = m.insertItem( tr( "Expand All" ) );
+ const int collapseFunctions = m.insertItem( tr( "Collapse all Functions" ) );
+ const int expandFunctions = m.insertItem( tr( "Expand all Functions" ) );
+
+ int res = m.exec( e->globalPos() );
+ if ( res == -1)
+ return;
+
+ if ( res == collapseAll ) {
+ emit collapse( TRUE );
+ } else if ( res == collapseFunctions ) {
+ emit collapse( FALSE );
+ } else if ( res == expandAll ) {
+ emit expand( TRUE );
+ } else if ( res == expandFunctions ) {
+ emit expand( FALSE );
+ } else if ( res == toggleBreakPoint ) {
+ if ( ( (ParagData*)p->extraData() )->marker == ParagData::Breakpoint ) {
+ ( (ParagData*)p->extraData() )->marker = ParagData::NoMarker;
+ } else {
+ bool ok;
+ isBreakpointPossible( ok, ( (Editor*)viewManager->currentView() )->text(), p->paragId() );
+ if ( ok )
+ ( (ParagData*)p->extraData() )->marker = ParagData::Breakpoint;
+ else
+ emit showMessage( tr( "<font color=red>Can't set breakpoint here!</font>" ) );
+ }
+// } else if ( res == editBreakpoints ) {
+// emit editBreakPoints();
+ }
+ doRepaint();
+ emit markersChanged();
+}