summaryrefslogtreecommitdiffstats
path: root/tools/designer/editor/viewmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/designer/editor/viewmanager.cpp')
-rw-r--r--tools/designer/editor/viewmanager.cpp276
1 files changed, 276 insertions, 0 deletions
diff --git a/tools/designer/editor/viewmanager.cpp b/tools/designer/editor/viewmanager.cpp
new file mode 100644
index 000000000..0e1028665
--- /dev/null
+++ b/tools/designer/editor/viewmanager.cpp
@@ -0,0 +1,276 @@
+ /**********************************************************************
+** 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 <qlayout.h>
+#include <private/qrichtext_p.h>
+#include "paragdata.h"
+#include <qobjectlist.h>
+#include <qlabel.h>
+#include <qtimer.h>
+
+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<Editor*>(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<uint> &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<uint> ViewManager::breakPoints() const
+{
+ TQValueList<uint> 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 ) );
+}