/********************************************************************** ** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. ** ** This file is part of TQt 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 TQt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing retquirements 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 TQt Commercial licenses may use this file in ** accordance with the TQt 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 "viewmanager.h" #include "editor.h" #include "markerwidget.h" #include #include #include "paragdata.h" #include #include #include ViewManager::ViewManager( TQWidget *parent, const char *name ) : TQWidget( parent, name ), curView( 0 ) { TQHBoxLayout *l = new TQHBoxLayout( this ); markerWidget = new MarkerWidget( this, "editor_markerwidget" ); connect( markerWidget, SIGNAL( markersChanged() ), this, SIGNAL( markersChanged() ) ); connect( markerWidget, SIGNAL( collapseFunction( TQTextParagraph * ) ), this, SIGNAL( collapseFunction( TQTextParagraph * ) ) ); connect( markerWidget, SIGNAL( expandFunction( TQTextParagraph * ) ), this, SIGNAL( expandFunction( TQTextParagraph * ) ) ); connect( markerWidget, SIGNAL( collapse( bool ) ), this, SIGNAL( collapse( bool ) ) ); connect( markerWidget, SIGNAL( expand( bool ) ), this, SIGNAL( expand( bool ) ) ); connect( markerWidget, SIGNAL( editBreakPoints() ), this, SIGNAL( editBreakPoints() ) ); connect( markerWidget, SIGNAL( isBreakpointPossible( bool&, const TQString &, int ) ), this, SIGNAL( isBreakpointPossible( bool&, const TQString &, int ) ) ); connect( markerWidget, SIGNAL( showMessage( const TQString & ) ), this, SLOT( showMessage( const TQString & ) ) ); messageTimer = new TQTimer( this ); connect( messageTimer, SIGNAL( timeout() ), this, SLOT( clearStatusBar() ) ); markerWidget->setFixedWidth( fontMetrics().width( "0000" ) + 20 ); l->addWidget( markerWidget ); layout = new TQVBoxLayout( l ); } void ViewManager::addView( TQWidget *view ) { layout->addWidget( view ); curView = view; connect( ( (Editor*)curView )->verticalScrollBar(), SIGNAL( valueChanged( int ) ), markerWidget, SLOT( doRepaint() ) ); connect( (Editor*)curView, SIGNAL( textChanged() ), markerWidget, SLOT( doRepaint() ) ); connect( (Editor*)curView, SIGNAL( clearErrorMarker() ), this, SLOT( clearErrorMarker() ) ); posLabel = new TQLabel( this, "editor_poslabel" ); posLabel->setAlignment( TQt::AlignVCenter | TQt::AlignRight ); posLabel->setText( " Line: 1 Col: 1" ); posLabel->setFrameStyle( TQFrame::Sunken | TQFrame::Panel ); posLabel->setLineWidth( 1 ); posLabel->setFixedHeight( posLabel->fontMetrics().height() ); layout->addWidget( posLabel ); connect( curView, SIGNAL( cursorPositionChanged( int, int ) ), this, SLOT( cursorPositionChanged( int, int ) ) ); } TQWidget *ViewManager::currentView() const { return curView; } void ViewManager::childEvent( TQChildEvent *e ) { if ( e->type() == TQEvent::ChildInserted && ::qt_cast(e->child()) ) addView( (TQWidget*)e->child() ); TQWidget::childEvent( e ); } void ViewManager::setError( int line ) { TQTextParagraph *p = ( (Editor*)curView )->document()->paragAt( line ); if ( p ) { ( (Editor*)curView )->setErrorSelection( line ); ( (Editor*)curView )->setCursorPosition( line, 0 ); ( (Editor*)curView )->viewport()->setFocus(); ( (Editor*)curView )->makeFunctionVisible( p ); ParagData *paragData = (ParagData*)p->extraData(); if ( !paragData ) paragData = new ParagData; paragData->marker = ParagData::Error; p->setExtraData( paragData ); markerWidget->doRepaint(); } } void ViewManager::setStep( int line ) { TQTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph(); while ( p ) { if ( p->extraData() ) ( (ParagData*)p->extraData() )->step = FALSE; p = p->next(); } p = ( (Editor*)curView )->document()->paragAt( line ); if ( p ) { ( (Editor*)curView )->setStepSelection( line ); ( (Editor*)curView )->setCursorPosition( line, 0 ); ( (Editor*)curView )->viewport()->setFocus(); ( (Editor*)curView )->makeFunctionVisible( p ); ParagData *paragData = (ParagData*)p->extraData(); if ( !paragData ) paragData = new ParagData; paragData->step = TRUE; p->setExtraData( paragData ); markerWidget->doRepaint(); } } void ViewManager::clearStep() { ( (Editor*)curView )->clearStepSelection(); TQTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph(); while ( p ) { if ( p->extraData() ) ( (ParagData*)p->extraData() )->step = FALSE; p = p->next(); } markerWidget->doRepaint(); } void ViewManager::setStackFrame( int line ) { TQTextParagraph *p = ( (Editor*)curView )->document()->paragAt( line ); if ( p ) { ( (Editor*)curView )->sync(); ( (Editor*)curView )->setCursorPosition( line, 0 ); ( (Editor*)curView )->ensureCursorVisible(); ( (Editor*)curView )->viewport()->setFocus(); ( (Editor*)curView )->makeFunctionVisible( p ); ParagData *paragData = (ParagData*)p->extraData(); if ( !paragData ) paragData = new ParagData; paragData->stackFrame = TRUE; p->setExtraData( paragData ); markerWidget->doRepaint(); } } void ViewManager::clearStackFrame() { TQTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph(); while ( p ) { if ( p->extraData() ) { ( (ParagData*)p->extraData() )->stackFrame = FALSE; if ( ( (ParagData*)p->extraData() )->marker == ParagData::Error ) ( (ParagData*)p->extraData() )->marker = ParagData::NoMarker; } p = p->next(); } markerWidget->doRepaint(); } void ViewManager::resizeEvent( TQResizeEvent *e ) { TQWidget::resizeEvent( e ); markerWidget->doRepaint(); } void ViewManager::clearErrorMarker() { TQTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph(); while ( p ) { if ( p->extraData() ) ( (ParagData*)p->extraData() )->marker = ParagData::NoMarker; p = p->next(); } markerWidget->doRepaint(); } void ViewManager::setBreakPoints( const TQValueList &l ) { TQTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph(); int i = 0; while ( p ) { if ( l.find( i ) != l.end() ) { if ( !p->extraData() ) { ParagData *data = new ParagData; p->setExtraData( data ); } ParagData *data = (ParagData*)p->extraData(); data->marker = ParagData::Breakpoint; } else if ( p->extraData() ) { ParagData *data = (ParagData*)p->extraData(); data->marker = ParagData::NoMarker; } p = p->next(); ++i; } markerWidget->doRepaint(); } TQValueList ViewManager::breakPoints() const { TQValueList l; int i = 0; TQTextParagraph *p = ( (Editor*)curView )->document()->firstParagraph(); while ( p ) { if ( p->extraData() && ( (ParagData*)p->extraData() )->marker == ParagData::Breakpoint ) l << i; p = p->next(); ++i; } return l; } void ViewManager::showMarkerWidget( bool b ) { if ( b ) markerWidget->show(); else markerWidget->hide(); } void ViewManager::emitMarkersChanged() { emit markersChanged(); } void ViewManager::cursorPositionChanged( int row, int col ) { posLabel->setText( TQString( " Line: %1 Col: %2" ).arg( row + 1 ).arg( col + 1 ) ); } void ViewManager::showMessage( const TQString &msg ) { int row; int col; ( (TQTextEdit*)currentView() )->getCursorPosition( &row, &col ); posLabel->setText( msg ); messageTimer->start( 1000, TRUE ); } void ViewManager::clearStatusBar() { int row; int col; ( (TQTextEdit*)currentView() )->getCursorPosition( &row, &col ); posLabel->setText( TQString( " Line: %1 Col: %2" ).arg( row + 1 ).arg( col + 1 ) ); }