From f61409bf19731c8485aa29bae273cae090c77502 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 18 Feb 2009 13:13:55 +0000 Subject: [PATCH] 2009-02-18 14:18 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/rtl/listbox.prg * changed FindText() and FindData() LISTBOX method to work without _SET_EXACT modification --- harbour/ChangeLog | 5 ++ harbour/source/rtl/listbox.prg | 116 +++++++++++++-------------------- 2 files changed, 49 insertions(+), 72 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 4af8ef25c9..6f840ca56a 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,11 @@ 2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2009-02-18 14:18 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/rtl/listbox.prg + * changed FindText() and FindData() LISTBOX method to work without + _SET_EXACT modification + 2009-02-18 13:06 UTC+0100 Viktor Szakats (harbour.01 syenar hu) + source/rtl/mousehb.c + Added missing file from previous commit. diff --git a/harbour/source/rtl/listbox.prg b/harbour/source/rtl/listbox.prg index be93c96dd4..d7b3663bf3 100644 --- a/harbour/source/rtl/listbox.prg +++ b/harbour/source/rtl/listbox.prg @@ -319,10 +319,8 @@ METHOD display() CLASS LISTBOX METHOD findText( cText, nPos, lCaseSensitive, lExact ) CLASS LISTBOX LOCAL nPosFound - LOCAL nPass - LOCAL nPasses - LOCAL nSize - LOCAL lOldExact + LOCAL nLen + LOCAL bSearch IF !ISCHARACTER( cText ) RETURN 0 @@ -333,43 +331,31 @@ METHOD findText( cText, nPos, lCaseSensitive, lExact ) CLASS LISTBOX IF !ISLOGICAL( lCaseSensitive ) lCaseSensitive := .T. ENDIF - IF !lCaseSensitive - cText := Lower( cText ) - ENDIF - IF ISLOGICAL( lExact ) - lOldExact := Set( _SET_EXACT, lExact ) + IF !ISLOGICAL( lExact ) + lExact := Set( _SET_EXACT ) ENDIF - nSize := Len( ::aItems ) - nPos + 1 - nPasses := iif( nPos > 1, 2, 1 ) - - IF Set( _SET_EXACT ) - FOR nPass := 1 TO nPasses - IF ( nPosFound := AScan( ::aItems, iif( lCaseSensitive,; - { | aItem | aItem[ _ITEM_cTEXT ] == cText },; - { | aItem | Lower( aItem[ _ITEM_cTEXT ] ) == cText } ), nPos, nSize ) ) > 0 - EXIT - ENDIF - - nSize := nPos - 1 - nPos := 1 - NEXT + IF lExact + cText := RTrim( cText ) + IF lCaseSensitive + bSearch := { | aItem | RTrim( aItem[ _ITEM_cTEXT ] ) == cText } + ELSE + cText := Lower( cText ) + bSearch := { | aItem | Lower( RTrim( aItem[ _ITEM_cTEXT ] ) ) == cText } + ENDIF ELSE - FOR nPass := 1 TO nPasses - /* NOTE: Intentionally using "=" comparison to honor the _SET_EXACT setting. */ - IF ( nPosFound := AScan( ::aItems, iif( lCaseSensitive,; - { | aItem | aItem[ _ITEM_cTEXT ] = cText },; - { | aItem | Lower( aItem[ _ITEM_cTEXT ] ) = cText } ), nPos, nSize ) ) > 0 - EXIT - ENDIF - - nSize := nPos - 1 - nPos := 1 - NEXT + nLen := Len( cText ) + IF lCaseSensitive + bSearch := { | aItem | Left( aItem[ _ITEM_cTEXT ], nLen ) == cText } + ELSE + cText := Lower( cText ) + bSearch := { | aItem | Lower( Left( aItem[ _ITEM_cTEXT ], nLen ) ) == cText } + ENDIF ENDIF - IF lOldExact != NIL - Set( _SET_EXACT, lOldExact ) + nPosFound := AScan( ::aItems, bSearch, nPos, Len( ::aItems ) - nPos + 1 ) + IF nPosFound == 0 .AND. nPos > 1 + nPosFound := AScan( ::aItems, bSearch, 1, nPos - 1 ) ENDIF RETURN nPosFound @@ -377,10 +363,8 @@ METHOD findText( cText, nPos, lCaseSensitive, lExact ) CLASS LISTBOX METHOD findData( cData, nPos, lCaseSensitive, lExact ) CLASS LISTBOX LOCAL nPosFound - LOCAL nPass - LOCAL nPasses - LOCAL nSize - LOCAL lOldExact + LOCAL nLen + LOCAL bSearch IF !ISCHARACTER( cData ) RETURN 0 @@ -391,43 +375,31 @@ METHOD findData( cData, nPos, lCaseSensitive, lExact ) CLASS LISTBOX IF !ISLOGICAL( lCaseSensitive ) lCaseSensitive := .T. ENDIF - IF !lCaseSensitive - cData := Lower( cData ) - ENDIF - IF ISLOGICAL( lExact ) - lOldExact := Set( _SET_EXACT, lExact ) + IF !ISLOGICAL( lExact ) + lExact := Set( _SET_EXACT ) ENDIF - nSize := Len( ::aItems ) - nPos + 1 - nPasses := iif( nPos > 1, 2, 1 ) - - IF Set( _SET_EXACT ) - FOR nPass := 1 TO nPasses - IF ( nPosFound := AScan( ::aItems, iif( lCaseSensitive,; - { | aItem | _LISTBOX_ITEMDATA( aItem ) == cData },; - { | aItem | Lower( _LISTBOX_ITEMDATA( aItem ) ) == cData } ), nPos, nSize ) ) > 0 - EXIT - ENDIF - - nSize := nPos - 1 - nPos := 1 - NEXT + IF lExact + cData := RTrim( cData ) + IF lCaseSensitive + bSearch := { | aItem | RTrim( _LISTBOX_ITEMDATA( aItem ) ) == cData } + ELSE + cData := Lower( cData ) + bSearch := { | aItem | Lower( RTrim( _LISTBOX_ITEMDATA( aItem ) ) ) == cData } + ENDIF ELSE - FOR nPass := 1 TO nPasses - /* NOTE: Intentionally using "=" comparison to honor the _SET_EXACT setting. */ - IF ( nPosFound := AScan( ::aItems, iif( lCaseSensitive,; - { | aItem | _LISTBOX_ITEMDATA( aItem ) = cData },; - { | aItem | Lower( _LISTBOX_ITEMDATA( aItem ) ) = cData } ), nPos, nSize ) ) > 0 - EXIT - ENDIF - - nSize := nPos - 1 - nPos := 1 - NEXT + nLen := Len( cData ) + IF lCaseSensitive + bSearch := { | aItem | Left( _LISTBOX_ITEMDATA( aItem ), nLen ) == cData } + ELSE + cData := Lower( cData ) + bSearch := { | aItem | Lower( Left( _LISTBOX_ITEMDATA( aItem ), nLen ) ) = cData } + ENDIF ENDIF - IF lOldExact != NIL - Set( _SET_EXACT, lOldExact ) + nPosFound := AScan( ::aItems, bSearch, nPos, Len( ::aItems ) - nPos + 1 ) + IF nPosFound == 0 .AND. nPos > 1 + nPosFound := AScan( ::aItems, bSearch, 1, nPos - 1 ) ENDIF RETURN nPosFound