diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 8cde2d9e9e..b3660f88f8 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,31 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-12-20 09:11 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + * contrib/hbqt/hbqt_slots.cpp + * contrib/hbqt/hbqt_slots.h + + Added more signal/slots. + + * contrib/hbide/hbide.ch + * contrib/hbide/hbide.prg + ! Improved Find/Replace functionality. Now it is usable feature + though I have to tweak it a little more. The current functionality is as: + + CTRL+F or "Find" icon => Opens dialog. + CTRL+N finds next occurance of current "Find" string - always + shown in one of the panels of status-bar. + This invocation is equivalent to if you click pushbutton + of the dialog. + CTRL+R Replaces the current selection with current "Replace" string + previously entered or selected with push button. + This invocation is equivalent to if you click pushbutton + of the dialog. + + History of / strings is maintained and is populated + in drop-down list of respective combo-boxes. + + TODO: and features. + 2009-12-20 16:15 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbwin/tests/testdll.prg * contrib/hbwin/win_dll.c diff --git a/harbour/contrib/hbide/hbide.ch b/harbour/contrib/hbide/hbide.ch index 1e014da2c2..b42444d273 100644 --- a/harbour/contrib/hbide/hbide.ch +++ b/harbour/contrib/hbide/hbide.ch @@ -60,6 +60,8 @@ #define INI_HBIDE 1 #define INI_PROJECTS 2 #define INI_FILES 3 +#define INI_FIND 4 +#define INI_REPLACE 5 /* INI_HBIDE */ diff --git a/harbour/contrib/hbide/hbide.prg b/harbour/contrib/hbide/hbide.prg index b9a22e4dc3..ef4d09de0e 100644 --- a/harbour/contrib/hbide/hbide.prg +++ b/harbour/contrib/hbide/hbide.prg @@ -233,6 +233,7 @@ CLASS HbIde METHOD find() METHOD replace() METHOD findReplace() + METHOD updateFindReplaceData() METHOD manageFocusInEditor() METHOD convertSelection() @@ -324,6 +325,8 @@ METHOD HbIde:create( cProjIni ) ::setPosAndSizeByIni( ::oProjTree:oWidget, ProjectTreeGeometry ) + ::findReplace( .f. ) + ::oDlg:Show() ::loadSources() @@ -366,7 +369,15 @@ METHOD HbIde:create( cProjIni ) CASE ::mp1 == xbeK_CTRL_F IF !empty( ::qCurEdit ) - ::findReplace() + ::findReplace( .t. ) + ENDIF + CASE ::mp1 == xbeK_CTRL_N + IF !empty( ::qCurEdit ) + ::find() + ENDIF + CASE ::mp1 == xbeK_CTRL_R + IF !empty( ::qCurEdit ) + ::replace() ENDIF ENDCASE @@ -421,6 +432,7 @@ METHOD HbIde:saveConfig() aadd( txt_, "CurrentProject = " + "" ) aadd( txt_, "GotoDialogGeometry = " + ::aIni[ INI_HBIDE, GotoDialogGeometry ] ) aadd( txt_, "PropsDialogGeometry = " + ::aIni[ INI_HBIDE, PropsDialogGeometry ] ) + aadd( txt_, "FindDialogGeometry = " + ::aIni[ INI_HBIDE, FindDialogGeometry ] ) aadd( txt_, " " ) // Projects @@ -448,6 +460,20 @@ METHOD HbIde:saveConfig() NEXT aadd( txt_, " " ) + // Find + aadd( txt_, "[FIND]" ) + FOR n := 1 TO len( ::aIni[ INI_FIND ] ) + aadd( txt_, ::aIni[ INI_FIND, n ] ) + NEXT + aadd( txt_, " " ) + + // Replace + aadd( txt_, "[REPLACE]" ) + FOR n := 1 TO len( ::aIni[ INI_REPLACE ] ) + aadd( txt_, ::aIni[ INI_REPLACE, n ] ) + NEXT + aadd( txt_, " " ) + RETURN CreateTarget( ::cProjIni, txt_ ) /*----------------------------------------------------------------------*/ @@ -473,7 +499,7 @@ METHOD HbIde:loadConfig( cHbideIni ) ::cProjIni := cHbideIni - ::aIni := { afill( array( INI_HBIDE_VRBLS ), "" ), {}, {} } + ::aIni := { afill( array( INI_HBIDE_VRBLS ), "" ), {}, {}, {}, {} } IF file( ::cProjIni ) aElem := ReadSource( ::cProjIni ) @@ -488,6 +514,10 @@ METHOD HbIde:loadConfig( cHbideIni ) nPart := INI_PROJECTS CASE s == "[FILES]" nPart := INI_FILES + CASE s == "[FIND]" + nPart := INI_FIND + CASE s == "[REPLACE]" + nPart := INI_REPLACE OTHERWISE DO CASE CASE nPart == INI_HBIDE @@ -517,6 +547,10 @@ METHOD HbIde:loadConfig( cHbideIni ) a_[ 4 ] := val( a_[ 4 ] ) aadd( ::aIni[ nPart ], a_ ) + CASE nPart == INI_FIND + aadd( ::aIni[ nPart ], s ) + CASE nPart == INI_REPLACE + aadd( ::aIni[ nPart ], s ) ENDCASE ENDCASE ENDIF @@ -1140,8 +1174,9 @@ METHOD HbIde:buildStatusBar() ::oSBar:addItem( "", , , , "Misc" ):oWidget:setMinimumWidth( 30 ) ::oSBar:addItem( "", , , , "State" ):oWidget:setMinimumWidth( 50 ) ::oSBar:addItem( "", , , , "Misc_2" ):oWidget:setMinimumWidth( 30 ) - ::oSBar:addItem( "", , , , "Misc_3" ):oWidget:setMinimumWidth( 20 ) - ::oSBar:addItem( "", , , , "Misc_4" ):oWidget:setMinimumWidth( 20 ) + ::oSBar:addItem( "", , , , "Stream" ):oWidget:setMinimumWidth( 20 ) + ::oSBar:addItem( "", , , , "Edit" ):oWidget:setMinimumWidth( 20 ) + ::oSBar:addItem( "", , , , "Search" ):oWidget:setMinimumWidth( 20 ) RETURN Self @@ -1501,7 +1536,7 @@ METHOD HbIde:executeAction( cKey ) ENDIF CASE cKey == "Find" IF !empty( ::qCurEdit ) - ::findReplace() + ::findReplace( .t. ) ENDIF CASE cKey == "SetMark" CASE cKey == "GotoMark" @@ -1911,20 +1946,75 @@ METHOD HbIde:readProcessInfo( nMode, iBytes ) /*----------------------------------------------------------------------*/ METHOD HbIde:replace() + LOCAL cReplWith, nB, nL, cBuffer - RETURN QLineEdit():configure( ::oRepl:oWidget:lineEdit() ):text() + IF !empty( ::qCurEdit ) + ::qCursor := QTextCursor():configure( ::qCurEdit:textCursor() ) + IF ::qCursor:hasSelection() .and. !empty( cBuffer := ::qCursor:selectedText() ) + cReplWith := QLineEdit():configure( ::oFindRepl:qObj[ "comboReplaceWith" ]:lineEdit() ):text() -/*----------------------------------------------------------------------*/ + nL := len( cBuffer ) + nB := ::qCursor:position() - nL -METHOD HbIde:find() + ::qCursor:beginEditBlock() + ::qCursor:removeSelectedText() + ::qCursor:insertText( cReplWith ) + ::qCursor:setPosition( nB ) + ::qCursor:movePosition( QTextCursor_NextCharacter, QTextCursor_KeepAnchor, len( cReplWith ) ) + ::qCurEdit:setTextCursor( ::qCursor ) + ::qCursor:endEditBlock() + ENDIF - ::qCurEdit:find( QLineEdit():configure( ::oFindRepl:qObj[ "comboFindWhat" ]:lineEdit() ):text() ) + ::find() + ENDIF RETURN Self /*----------------------------------------------------------------------*/ -METHOD HbIde:findReplace() +METHOD HbIde:find() + LOCAL nFlags + LOCAL cText := QLineEdit():configure( ::oFindRepl:qObj[ "comboFindWhat" ]:lineEdit() ):text() + + IF !empty( cText ) + nFlags := 0 + nFlags += iif( ::oFindRepl:qObj[ "checkMatchCase" ]:isChecked(), QTextDocument_FindCaseSensitively, 0 ) + nFlags += iif( ::oFindRepl:qObj[ "radioUp" ]:isChecked(), QTextDocument_FindBackward, 0 ) + + ::qCurEdit:find( cText, nFlags ) + ENDIF + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD HbIde:updateFindReplaceData( cMode ) + LOCAL cData + + IF cMode == "find" + cData := QLineEdit():configure( ::oFindRepl:qObj[ "comboFindWhat" ]:lineEdit() ):text() + IF !empty( cData ) + IF ascan( ::aIni[ INI_FIND ], {|e| cData = e } ) == 0 + hb_ains( ::aIni[ INI_FIND ], 1, cData, .t. ) + ::oFindRepl:qObj[ "comboFindWhat" ]:insertItem( 0, cData ) + ENDIF + ENDIF + // + ::oSBar:getItem( 11 ):caption := "FIND: " + cData + ELSE + cData := QLineEdit():configure( ::oFindRepl:qObj[ "comboReplaceWith" ]:lineEdit() ):text() + IF !empty( cData ) + IF ascan( ::aIni[ INI_REPLACE ], cData ) == 0 + hb_ains( ::aIni[ INI_REPLACE ], 1, cData, .t. ) + ::oFindRepl:qObj[ "comboReplaceWith" ]:insertItem( 0, cData ) + ENDIF + ENDIF + ENDIF + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD HbIde:findReplace( lShow ) IF empty( ::oFindRepl ) ::oFindRepl := XbpQtUiLoader():new( ::oDlg ) @@ -1932,16 +2022,26 @@ METHOD HbIde:findReplace() ::oFindRepl:create() ::oFindRepl:setWindowFlags( Qt_Sheet ) - ::oFindRepl:signal( "buttonFind" , "clicked()", {|| ::find() } ) - ::oFindRepl:signal( "buttonReplace", "clicked()", {|| ::replace() } ) + aeval( ::aIni[ INI_FIND ], {|e| ::oFindRepl:qObj[ "comboFindWhat" ]:addItem( e ) } ) + aeval( ::aIni[ INI_REPLACE ], {|e| ::oFindRepl:qObj[ "comboReplaceWith" ]:addItem( e ) } ) + + ::oFindRepl:signal( "buttonFind" , "clicked()", {|| ::updateFindReplaceData( "find" ), ::find() } ) + ::oFindRepl:signal( "buttonReplace", "clicked()", {|| ::updateFindReplaceData( "replace" ), ::replace() } ) ::oFindRepl:signal( "buttonClose" , "clicked()", ; {|| ::aIni[ INI_HBIDE, FindDialogGeometry ] := PosAndSize( ::oFindRepl:oWidget ), ::oFindRepl:hide() } ) + + ::oFindRepl:signal( "comboFindWhat" , "currentIndexChanged(text)", {|o,p| o := o, ::oSBar:getItem( 11 ):caption := "FIND: " + p } ) + #if 0 + ::oFindRepl:signal( "comboFindWhat" , "editTextChanged(text)" , {|o,p| o := o, ::updateFindReplaceData( "find", p ) } ) + ::oFindRepl:signal( "comboReplaceWith", "editTextChanged(text)" , {|o,p| o := o, ::updateFindReplaceData( "replace", p ) } ) + #endif ENDIF - ::setPosByIni( ::oFindRepl:oWidget, FindDialogGeometry ) - ::oFindRepl:qObj[ "comboFindWhat" ]:setFocus() - ::oFindRepl:show() - + IF lShow + ::setPosByIni( ::oFindRepl:oWidget, FindDialogGeometry ) + ::oFindRepl:qObj[ "comboFindWhat" ]:setFocus() + ::oFindRepl:show() + ENDIF RETURN Nil /*----------------------------------------------------------------------*/ @@ -1956,7 +2056,7 @@ METHOD HbIde:goto() qGo:setIntMinimum( 1 ) qGo:setIntMaximum( ::qCurDocument:blockCount() ) qGo:setIntValue( nLine + 1 ) - qGo:setLabelText( "Goto Line Number ?" ) + qGo:setLabelText( "Goto Line Number [1-" + hb_ntos( ::qCurDocument:blockCount() ) + "]" ) qGo:setWindowTitle( "Harbour-Qt" ) ::setPosByIni( qGo, GotoDialogGeometry ) diff --git a/harbour/contrib/hbqt/hbqt_slots.cpp b/harbour/contrib/hbqt/hbqt_slots.cpp index 9071760891..012a0be83e 100644 --- a/harbour/contrib/hbqt/hbqt_slots.cpp +++ b/harbour/contrib/hbqt/hbqt_slots.cpp @@ -489,8 +489,12 @@ void Slots::readyReadStandardError() void Slots::readyReadStandardOutput() { hbqt_SlotsExec( qobject_cast( sender() ), "readyReadStandardOutput()" ); } void Slots::started() { hbqt_SlotsExec( qobject_cast( sender() ), "started()" ); } void Slots::stateChanged( QProcess::ProcessState newState ) { hbqt_SlotsExecInt( qobject_cast( sender() ), "stateChanged(int)", newState ); } -/* */ - +/* QComboBox */ +void Slots::activated( const QString & text ) { hbqt_SlotsExecString( qobject_cast( sender() ), "activated(text)", text ); } +void Slots::currentIndexChanged( const QString & text ) { hbqt_SlotsExecString( qobject_cast( sender() ), "currentIndexChanged(text)", text ); } +void Slots::editTextChanged( const QString & text ) { hbqt_SlotsExecString( qobject_cast( sender() ), "editTextChanged(text)", text ); } +void Slots::highlighted( const QString & text ) { hbqt_SlotsExecString( qobject_cast( sender() ), "highlighted(text)", text ); } +/**/ /*----------------------------------------------------------------------*/ /* @@ -617,6 +621,11 @@ HB_FUNC( QT_CONNECT_SIGNAL ) else if( signal == ( QString ) "readyReadStandardOutput()" ) ret = object->connect( object, SIGNAL( readyReadStandardOutput() ) , t_slots, SLOT( readyReadStandardOutput() ) , Qt::AutoConnection ); else if( signal == ( QString ) "started()" ) ret = object->connect( object, SIGNAL( started() ) , t_slots, SLOT( started() ) , Qt::AutoConnection ); else if( signal == ( QString ) "stateChanged(int)" ) ret = object->connect( object, SIGNAL( stateChanged( int ) ) , t_slots, SLOT( stateChanged( int ) ) , Qt::AutoConnection ); + /* QComboBox */ + else if( signal == ( QString ) "activated(text)" ) ret = object->connect( object, SIGNAL( activated( const QString & ) ) , t_slots, SLOT( activated( const QString & ) ) , Qt::AutoConnection ); + else if( signal == ( QString ) "currentIndexChanged(text)" ) ret = object->connect( object, SIGNAL( currentIndexChanged( const QString & ) ) , t_slots, SLOT( currentIndexChanged( const QString & ) ) , Qt::AutoConnection ); + else if( signal == ( QString ) "editTextChanged(text)" ) ret = object->connect( object, SIGNAL( editTextChanged( const QString & ) ) , t_slots, SLOT( editTextChanged( const QString & ) ) , Qt::AutoConnection ); + else if( signal == ( QString ) "highlighted(text)" ) ret = object->connect( object, SIGNAL( highlighted( const QString & ) ) , t_slots, SLOT( highlighted( const QString & ) ) , Qt::AutoConnection ); else ret = false; if( ret == true ) @@ -735,6 +744,11 @@ static bool disconnect_signal( QObject * object, const char * signal ) else if( signal == ( QString ) "readyReadStandardOutput()" ) return object->disconnect( SIGNAL( readyReadStandardOutput() ) ); else if( signal == ( QString ) "started()" ) return object->disconnect( SIGNAL( started() ) ); else if( signal == ( QString ) "stateChanged(int)" ) return object->disconnect( SIGNAL( stateChanged( int ) ) ); + /* QComboBox */ + else if( signal == ( QString ) "activated(text)" ) return object->disconnect( SIGNAL( activated( const QString & ) ) ); + else if( signal == ( QString ) "currentIndexChanged(text)" ) return object->disconnect( SIGNAL( currentIndexChanged( const QString & ) ) ); + else if( signal == ( QString ) "editTextChanged(text)" ) return object->disconnect( SIGNAL( editTextChanged( const QString & ) ) ); + else if( signal == ( QString ) "highlighted(text)" ) return object->disconnect( SIGNAL( highlighted( const QString & ) ) ); return false; } diff --git a/harbour/contrib/hbqt/hbqt_slots.h b/harbour/contrib/hbqt/hbqt_slots.h index 423a41eec7..053278b5c7 100644 --- a/harbour/contrib/hbqt/hbqt_slots.h +++ b/harbour/contrib/hbqt/hbqt_slots.h @@ -213,7 +213,12 @@ public slots: void readyReadStandardOutput(); void started(); void stateChanged( QProcess::ProcessState newState ); - /* */ + /* QComboBox */ + void activated( const QString & text ); + void currentIndexChanged( const QString & text ); + void editTextChanged( const QString & text ); + void highlighted( const QString & text ); + /* */ }; /*----------------------------------------------------------------------*/