From db0dce456689ebe351849a368c38854d8501c05a Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Tue, 18 May 2010 07:09:40 +0000 Subject: [PATCH] 2010-15-17 23:59 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * contrib/hbqt/hbqt_hbqplaintextedit.cpp * contrib/hbqt/hbqt_hbqplaintextedit.h + Finalized: all the three modes of selection programatically. ::toggleStreamSelection() No Key ::toggleColumnSelection() No Key ::toggleLineSelection() == F11 ::clearSelection() == Sh+F11 If a selection mode is initiated by above three methods, it can only be exited by calling the same method again. During such selection process all other keys than navigable keys will remain disabled. Mouse-move will also not work. Mouch click will work. If Column selection mode is ON, caret will not show up. Toolbar icon will not respond to change such action. Once exited, previous normal behavior for stream and column selection will be available. Please test. --- harbour/ChangeLog | 19 ++ .../contrib/hbqt/hbqt_hbqplaintextedit.cpp | 322 ++++++++++++------ harbour/contrib/hbqt/hbqt_hbqplaintextedit.h | 4 + 3 files changed, 250 insertions(+), 95 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 14143cbe84..bbe1404f13 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,25 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-15-17 23:59 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + * contrib/hbqt/hbqt_hbqplaintextedit.cpp + * contrib/hbqt/hbqt_hbqplaintextedit.h + + Finalized: all the three modes of selection programatically. + ::toggleStreamSelection() No Key + ::toggleColumnSelection() No Key + ::toggleLineSelection() == F11 + ::clearSelection() == Sh+F11 + If a selection mode is initiated by above three methods, + it can only be exited by calling the same method again. + During such selection process all other keys than navigable + keys will remain disabled. Mouse-move will also not work. + Mouch click will work. If Column selection mode is ON, + caret will not show up. Toolbar icon will not respond to + change such action. Once exited, previous normal behavior + for stream and column selection will be available. + + Please test. + 2010-15-17 19:05 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * contrib/hbqt/hbqt_hbqplaintextedit.cpp * contrib/hbqt/hbqt_hbqplaintextedit.h diff --git a/harbour/contrib/hbqt/hbqt_hbqplaintextedit.cpp b/harbour/contrib/hbqt/hbqt_hbqplaintextedit.cpp index 176a666056..1eecc24b22 100644 --- a/harbour/contrib/hbqt/hbqt_hbqplaintextedit.cpp +++ b/harbour/contrib/hbqt/hbqt_hbqplaintextedit.cpp @@ -115,6 +115,8 @@ HBQPlainTextEdit::HBQPlainTextEdit( QWidget * parent ) : QPlainTextEdit( parent horzRuler = new HorzRuler( this ); caretState = 0; isSelectionByApplication = false; + hitTestRow = -1; + hitTestColumn = -1; connect( this, SIGNAL( blockCountChanged( int ) ) , this, SLOT( hbUpdateLineNumberAreaWidth( int ) ) ); connect( this, SIGNAL( updateRequest( const QRect &, int ) ), this, SLOT( hbUpdateLineNumberArea( const QRect &, int ) ) ); @@ -304,6 +306,18 @@ void HBQPlainTextEdit::hbClearSelection() /*----------------------------------------------------------------------*/ +void HBQPlainTextEdit::hbHitTest( const QPoint & pt ) +{ + QTextCursor ct = cursorForPosition( QPoint( 2,2 ) ); + int t = ct.blockNumber(); + int c = ct.columnNumber(); + + hitTestRow = t + ( pt.y() / fontMetrics().height() ); + hitTestColumn = c + ( pt.x() / fontMetrics().averageCharWidth() ); +} + +/*----------------------------------------------------------------------*/ + void HBQPlainTextEdit::hbGetViewportInfo() { if( block ) @@ -375,56 +389,66 @@ void HBQPlainTextEdit::hbSetSelectionMode( int mode, bool byApplication ) { if( byApplication ) { - if( isSelectionByApplication ) - isSelectionByApplication = ! isSelectionByApplication; + isSelectionByApplication = ! isSelectionByApplication; if( ! isSelectionByApplication ) { isStreamSelectionON = false; isColumnSelectionON = false; isLineSelectionON = false; + setCursorWidth( 1 ); } - - switch( mode ) + else { - case selectionMode_stream: + switch( mode ) { - setCursorWidth( 1 ); - - if( columnBegins >= 0 ) + case selectionMode_stream: { - hbToStream(); + setCursorWidth( 1 ); + if( columnBegins >= 0 ) + { + hbToStream(); + } + selectionMode = selectionMode_stream; + isStreamSelectionON = true; + isColumnSelectionON = false; + isLineSelectionON = false; + break; } - selectionMode = selectionMode_stream; - isStreamSelectionON = true; - isColumnSelectionON = false; - isLineSelectionON = false; - break; - } - case selectionMode_column: - { - selectionMode = selectionMode_column; - isStreamSelectionON = false; - isColumnSelectionON = true; - isLineSelectionON = false; - break; - } - case selectionMode_line: - { - setCursorWidth( 1 ); - selectionMode = selectionMode_line; - isStreamSelectionON = false; - isColumnSelectionON = false; - isLineSelectionON = true; + case selectionMode_column: + { + setCursorWidth( 0 ); - hbClearSelection(); + selectionMode = selectionMode_column; + isStreamSelectionON = false; + isColumnSelectionON = true; + isLineSelectionON = false; - QTextCursor c( textCursor() ); - rowBegins = c.blockNumber(); - rowEnds = rowBegins; - columnBegins = 0; - columnEnds = 0; - break; + QTextCursor c( textCursor() ); + + rowBegins = c.blockNumber(); + rowEnds = rowBegins; + columnBegins = c.columnNumber(); + columnEnds = columnBegins; + + break; + } + case selectionMode_line: + { + setCursorWidth( 1 ); + selectionMode = selectionMode_line; + isStreamSelectionON = false; + isColumnSelectionON = false; + isLineSelectionON = true; + + QTextCursor c( textCursor() ); + + rowBegins = c.blockNumber(); + rowEnds = rowBegins; + columnBegins = 0; + columnEnds = 0; + break; + } } } } @@ -459,54 +483,7 @@ void HBQPlainTextEdit::hbSetSelectionMode( int mode, bool byApplication ) emit selectionChanged(); repaint(); } -#if 0 -void HBQPlainTextEdit::hbSetSelectionMode( int mode, bool on ) -{ - switch( mode ) - { - case selectionMode_stream: - { - if( columnBegins >= 0 ) - { - hbToStream(); - } - selectionMode = selectionMode_stream; - isColumnSelectionON = false; - isLineSelectionON = false; - setCursorWidth( 1 ); - break; - } - case selectionMode_column: - { - selectionMode = selectionMode_column; - isColumnSelectionON = true; - isLineSelectionON = false; - break; - } - case selectionMode_line: - { - selectionMode = selectionMode_line; - isColumnSelectionON = false; - if( on ) - { - isLineSelectionON = true; - hbClearSelection(); - QTextCursor c( textCursor() ); - rowBegins = c.blockNumber(); - rowEnds = rowBegins; - columnBegins = 0; - columnEnds = 0; - } - else - { - isLineSelectionON = false; - } - break; - } - } - update(); -} -#endif + /*----------------------------------------------------------------------*/ void HBQPlainTextEdit::hbToStream() @@ -530,8 +507,9 @@ void HBQPlainTextEdit::hbToStream() c.movePosition( QTextCursor::Right , QTextCursor::MoveAnchor, columnEnds ); } else + { columnEnds = cce; - + } columnBegins = 0; rowBegins = rb; rowEnds = re; setTextCursor( c ); } @@ -550,6 +528,14 @@ void HBQPlainTextEdit::hbToStream() columnEnds = c.columnNumber(); rowBegins = rb; rowEnds = re; setTextCursor( c ); } + else if( selectionMode == selectionMode_stream ) + { + QTextCursor c = textCursor(); + rowBegins = c.blockNumber(); + rowEnds = rowBegins; + columnBegins = c.columnNumber(); + columnEnds = columnBegins; + } } /*----------------------------------------------------------------------*/ @@ -659,6 +645,19 @@ void HBQPlainTextEdit::mouseDoubleClickEvent( QMouseEvent *event ) void HBQPlainTextEdit::mousePressEvent( QMouseEvent *event ) { + if( isSelectionByApplication ) + { + if( isColumnSelectionON ) + { + event->accept(); + } + else + { + QPlainTextEdit::mousePressEvent( event ); + } + return; + } + if( event->modifiers() & Qt::ShiftModifier ) { QTextCursor c( textCursor() ); @@ -690,21 +689,43 @@ void HBQPlainTextEdit::mousePressEvent( QMouseEvent *event ) void HBQPlainTextEdit::mouseReleaseEvent( QMouseEvent *event ) { + if( isSelectionByApplication ) + { + if( isLineSelectionON ) + { + QPlainTextEdit::mouseReleaseEvent( event ); + rowEnds = textCursor().blockNumber(); + } + else if( isColumnSelectionON ) + { + event->accept(); + hbHitTest( event->pos() ); + rowEnds = hitTestRow; + columnEnds = hitTestColumn; + } + else if( isStreamSelectionON ) + { + QPlainTextEdit::mouseReleaseEvent( event ); + rowEnds = textCursor().blockNumber(); + columnEnds = textCursor().columnNumber(); + } + repaint(); + return; + } selectionState = 1; setCursorWidth( 1 ); - QPlainTextEdit::mouseReleaseEvent( event ); - if( isLineSelectionON ) - { - QTextCursor c( textCursor() ); - rowEnds = c.blockNumber(); - repaint(); - } } /*----------------------------------------------------------------------*/ void HBQPlainTextEdit::mouseMoveEvent( QMouseEvent *event ) { + if( isSelectionByApplication ) + { + event->accept(); + return; + } + if( selectionMode == selectionMode_line ) selectionMode = selectionMode_stream; @@ -771,6 +792,114 @@ void HBQPlainTextEdit::keyReleaseEvent( QKeyEvent * event ) /*----------------------------------------------------------------------*/ +bool HBQPlainTextEdit::hbKeyPressSelectionByApplication( QKeyEvent * event ) +{ + bool shift = event->modifiers() & Qt::ShiftModifier; + int k = event->key(); + + if( isNavableKey( k ) && shift ) + { + event->accept(); + QTextCursor c( textCursor() ); + c.clearSelection(); + setTextCursor( c ); + QKeyEvent * ev = new QKeyEvent( event->type(), event->key(), Qt::NoModifier, event->text() ); + keyPressEvent( ev ); + return true; + } + + if( isNavableKey( k ) ) + { + if( selectionMode == selectionMode_stream ) + { + QPlainTextEdit::keyPressEvent( event ); + + QTextCursor c( textCursor() ); + rowEnds = c.blockNumber(); + columnEnds = c.columnNumber(); + } + else if( selectionMode == selectionMode_column ) + { + switch( k ) + { + case Qt::Key_Right: + { + QTextCursor c( textCursor() ); + c.movePosition( QTextCursor::EndOfLine ); + if( c.columnNumber() <= columnEnds ) + { + setTextCursor( c ); + } + event->ignore(); + columnEnds++; + break; + } + case Qt::Key_Left: + { + QTextCursor c( textCursor() ); + int col = c.columnNumber(); + if( col < columnEnds - 1 ) + { + c.movePosition( QTextCursor::Left ); + columnEnds--; + } + else if( columnEnds - 1 >= 0 ) + { + columnEnds--; + } + event->ignore(); + break; + } + case Qt::Key_Home: + { + QPlainTextEdit::keyPressEvent( event ); + columnEnds = textCursor().columnNumber(); + break; + } + case Qt::Key_End: + { + QTextCursor c( textCursor() ); + c.movePosition( QTextCursor::EndOfLine, QTextCursor::MoveAnchor ); + if( c.columnNumber() <= columnEnds ) + { + QPlainTextEdit::keyPressEvent( event ); + columnEnds = textCursor().columnNumber();; + } + else + { + event->ignore(); + } + break; + } + case Qt::Key_Up: + case Qt::Key_PageUp: + case Qt::Key_Down: + case Qt::Key_PageDown: + QPlainTextEdit::keyPressEvent( event ); + rowEnds = textCursor().blockNumber(); + break; + default: + event->ignore(); + break; + } + } + else if( selectionMode == selectionMode_line ) + { + QPlainTextEdit::keyPressEvent( event ); + QTextCursor c( textCursor() ); + rowEnds = c.blockNumber(); + } + repaint(); + } + else + { + event->ignore(); + } + return true; +} + +/*----------------------------------------------------------------------*/ + bool HBQPlainTextEdit::hbKeyPressSelection( QKeyEvent * event ) { bool ctrl = event->modifiers() & Qt::ControlModifier; @@ -787,6 +916,11 @@ bool HBQPlainTextEdit::hbKeyPressSelection( QKeyEvent * event ) return true; } + if( isSelectionByApplication ) + { + return hbKeyPressSelectionByApplication( event ); + } + bool bClear = false; if( shift && isNavableKey( k ) && selectionMode == selectionMode_line ) @@ -912,7 +1046,6 @@ bool HBQPlainTextEdit::hbKeyPressSelection( QKeyEvent * event ) columnEnds = col; } update(); - //event->accept(); return true; } // if( shift && isNavableKey( k ) ) else if( selectionMode == selectionMode_column ) @@ -1011,7 +1144,6 @@ bool HBQPlainTextEdit::hbKeyPressSelection( QKeyEvent * event ) QPlainTextEdit::keyPressEvent( event ); QTextCursor c( textCursor() ); rowEnds = c.blockNumber(); - //event->accept(); repaint(); return true; } diff --git a/harbour/contrib/hbqt/hbqt_hbqplaintextedit.h b/harbour/contrib/hbqt/hbqt_hbqplaintextedit.h index 664cace0e1..5caf56cfa5 100644 --- a/harbour/contrib/hbqt/hbqt_hbqplaintextedit.h +++ b/harbour/contrib/hbqt/hbqt_hbqplaintextedit.h @@ -149,6 +149,8 @@ private: QTimer * timer; int caretState; bool isSelectionByApplication; + int hitTestRow; + int hitTestColumn; protected: @@ -209,6 +211,8 @@ private slots: bool hbKeyPressSelection( QKeyEvent * ); void hbClearSelection(); void hbUpdateCaret(); + void hbHitTest( const QPoint & ); + bool hbKeyPressSelectionByApplication( QKeyEvent * event ); };