Files
harbour-core/harbour/contrib/hbnf/tbwhile.prg
Viktor Szakats 31135713b8 2012-11-16 16:06 UTC+0100 Viktor Szakats (vszakats syenar.net)
* contrib/gtwvg/class.prg
  * contrib/gtwvg/paint.prg
  * contrib/gtwvg/parthdlr.prg
  * contrib/gtwvg/statbar.prg
  * contrib/gtwvg/tests/_dyndlgs.prg
  * contrib/gtwvg/tests/_modal.prg
  * contrib/gtwvg/tests/_tbrowse.prg
  * contrib/gtwvg/tests/_utils.prg
  * contrib/gtwvg/tests/_wvtcls.prg
  * contrib/gtwvg/tests/_xbp.prg
  * contrib/gtwvg/tests/demowvg.prg
  * contrib/gtwvg/tests/demowvg1.prg
  * contrib/gtwvg/tests/demoxbp.prg
  * contrib/gtwvg/toolbar.prg
  * contrib/gtwvg/wnd.prg
  * contrib/hbamf/issues.txt
  * contrib/hbamf/readme.txt
  * contrib/hbblink/hbblink.ch
  * contrib/hbct/ct.ch
  * contrib/hbct/ctcom.ch
  * contrib/hbct/ctrand.prg
  * contrib/hbct/cttime.prg
  * contrib/hbct/doc/en/addascii.txt
  * contrib/hbct/doc/en/ctmath2.txt
  * contrib/hbct/doc/en/ctstr.txt
  * contrib/hbct/doc/en/dattime2.txt
  * contrib/hbct/doc/en/finan.txt
  * contrib/hbct/doc/en/ftoc.txt
  * contrib/hbct/doc/en/misc1.txt
  * contrib/hbct/doc/en/trig.txt
  * contrib/hbct/fcopy.prg
  * contrib/hbct/getinfo.prg
  * contrib/hbct/getinput.prg
  * contrib/hbct/getsecrt.prg
  * contrib/hbct/keysave.prg
  * contrib/hbct/keysec.prg
  * contrib/hbct/keytime.prg
  * contrib/hbct/readme.txt
  * contrib/hbct/screen3.prg
  * contrib/hbct/scrmark.prg
  * contrib/hbct/showtime.prg
  * contrib/hbct/tempfile.prg
  * contrib/hbformat/utils/hbformat.prg
  * contrib/hbfship/isdb.prg
  * contrib/hbgd/gdimage.prg
  * contrib/hbgd/tests/gdtestcl.prg
  * contrib/hbgd/tests/test_out.prg
  * contrib/hbgd/tests/tostring.prg
  * contrib/hbgt/doc/en/hbgt.txt
  * contrib/hbgt/tests/test.prg
  * contrib/hbhpdf/tests/harupdf.prg
  * contrib/hbhttpd/tests/carts.dbf
  * contrib/hbhttpd/tests/items.dbf
  * contrib/hbhttpd/tests/users.dbf
  * contrib/hbmisc/doc/en/dates2.txt
  * contrib/hbmisc/fcomma.prg
  * contrib/hbmisc/stringp.prg
  * contrib/hbmisc/tests/testhbf.prg
  * contrib/hbmisc/udpds.prg
  * contrib/hbmxml/tests/custom.prg
  * contrib/hbmysql/diff-en.txt
  * contrib/hbmysql/diff-es.txt
  * contrib/hbmysql/tmysql.prg
  * contrib/hbnetio/netiomt.prg
  * contrib/hbnetio/utils/hbnetio/netiomgm.hb
  * contrib/hbnf/adapter.prg
  * contrib/hbnf/aredit.prg
  * contrib/hbnf/clrsel.prg
  * contrib/hbnf/default.prg
  * contrib/hbnf/dispmsg.prg
  * contrib/hbnf/floptst.prg
  * contrib/hbnf/ftint86.ch
  * contrib/hbnf/ftmenuto.ch
  * contrib/hbnf/lastday.prg
  * contrib/hbnf/linked.prg
  * contrib/hbnf/menuto.prg
  * contrib/hbnf/metaph.prg
  * contrib/hbnf/nwsem.prg
  * contrib/hbnf/ontick.prg
  * contrib/hbnf/pegs.prg
  * contrib/hbnf/popadder.prg
  * contrib/hbnf/savesets.prg
  * contrib/hbnf/sinkey.prg
  * contrib/hbnf/tbwhile.prg
  * contrib/hbnf/tempfile.prg
  * contrib/hbnf/vidcur.prg
  * contrib/hbnf/video2.prg
  * contrib/hbnf/woy.prg
  * contrib/hbodbc/tests/testodbc.prg
  * contrib/hbodbc/todbc.prg
  * contrib/hbpgsql/postgres.ch
  * contrib/hbtip/encoder.prg
  * contrib/hbtip/thtml.prg
  * contrib/hbtpathy/tests/testtp.prg
  * contrib/hbwin/tests/dlg.prg
  * contrib/hbwin/tests/olesrv1.prg
  * contrib/hbwin/tests/olesrv3.prg
  * contrib/hbwin/tests/olesrv4.prg
  * contrib/hbwin/tests/oletst4.prg
  * contrib/hbwin/tests/testprn.prg
  * contrib/hbwin/win_tbmp.prg
  * contrib/hbxpp/browdbx.prg
  * contrib/hbxpp/runshell.prg
  * contrib/hbxpp/tthreadx.prg
  * contrib/hbxpp/typefilx.prg
  * contrib/hbxpp/xppop.prg
  * contrib/rddads/doc/en/adsfuncs.txt
  * contrib/rddads/doc/en/readme.txt
  * contrib/rddads/tests/datad.prg
  * contrib/rddsql/readme.txt
  * contrib/xhb/cstruct.prg
  * contrib/xhb/dirrec.prg
  * contrib/xhb/diskhb.prg
  * contrib/xhb/hbcompat.ch
  * contrib/xhb/hbcomprs.prg
  * contrib/xhb/hterrsys.prg
  * contrib/xhb/htjlist.prg
  * contrib/xhb/htmutil.prg
  * contrib/xhb/stream.prg
  * contrib/xhb/tcgi.prg
  * contrib/xhb/thtm.prg
  * contrib/xhb/ttable.prg
  * contrib/xhb/txml.prg
  * contrib/xhb/xcstr.prg
  * contrib/xhb/xhberr.prg
  * contrib/xhb/xhbmemo.prg
  * contrib/xhb/xhbtedit.prg
  * contrib/xhb/xhbver.prg
  * doc/cmpopt.txt
  * extras/gfspell/spell.ng
  * extras/gfspell/spell.prg
  * extras/gfspell/words.dbf
  * extras/gtwvw/docs/funclist.txt
  * extras/gtwvw/docs/whatsnew.txt
  * extras/gtwvw/tests/_wvwmous.prg
  * extras/gtwvw/tests/cbtest6.prg
  * extras/gtwvw/tests/drawimg.prg
  * extras/gtwvw/tests/ebtest7.prg
  * extras/gtwvw/tests/inpfocus.prg
  * extras/gtwvw/tests/maximize.prg
  * extras/gtwvw/tests/prog0.prg
  * extras/gtwvw/tests/prog1.prg
  * extras/gtwvw/tests/prog2.prg
  * extras/gtwvw/tests/wvwtest9.prg
  * extras/gtwvw/wvt2wvw.ch
  * extras/guestbk/guestbk.prg
  * extras/hbdoc/tmplates.prg
  * extras/hbvpdf/core.prg
  * extras/httpsrv/cgifunc.prg
  * extras/httpsrv/cookie.prg
  * extras/httpsrv/session.prg
  * extras/httpsrv/uhttpd.prg
  * extras/rddado/adordd.ch
  * extras/rddado/adordd.prg
  * include/set.ch
  * src/debug/debugger.prg
  * src/rdd/dbfuncs.prg
  * src/rdd/dbjoin.prg
  * src/rdd/dblist.prg
  * src/rdd/dbsort.prg
  * src/rdd/dbstrux.prg
  * src/rdd/dbstruxu.prg
  * src/rdd/dbtotal.prg
  * src/rdd/dbupdat.prg
  * src/rdd/hbsix/sxcompat.prg
  * src/rdd/hbsix/sxini.prg
  * src/rdd/hbsix/sxtrig.prg
  * src/rdd/usrrdd/rdds/arrayrdd.prg
  * src/rdd/usrrdd/rdds/logrdd.prg
  * src/rdd/usrrdd/rdds/rlcdx.prg
  * src/rtl/achoice.prg
  * src/rtl/adir.prg
  * src/rtl/alert.prg
  * src/rtl/altd.prg
  * src/rtl/browdb.prg
  * src/rtl/dbedit.prg
  * src/rtl/devoutp.prg
  * src/rtl/dircmd.prg
  * src/rtl/hbi18n2.prg
  * src/rtl/input.prg
  * src/rtl/libname.prg
  * src/rtl/listbox.prg
  * src/rtl/memvarbl.prg
  * src/rtl/radiobhb.prg
  * src/rtl/readkey.prg
  * src/rtl/readvar.prg
  * src/rtl/setfunc.prg
  * src/rtl/setta.prg
  * src/rtl/tbrowse.prg
  * src/rtl/teditor.prg
  * src/rtl/text.prg
  * src/rtl/tget.prg
  * src/rtl/tgetlist.prg
  * src/rtl/tobject.prg
  * src/rtl/typefile.prg
  * src/rtl/valtoexp.prg
  * src/rtl/wait.prg
  * src/vm/harbinit.prg
  * tests/ac_test.prg
  * tests/ac_test2.prg
  * tests/adirtest.prg
  * tests/aliaslck.prg
  * tests/bldtest/bldtest.c
  * tests/clsnv.prg
  * tests/codebl.prg
  * tests/debugtst.prg
  * tests/devtest.prg
  * tests/disptest.prg
  * tests/gtcolors.prg
  * tests/gtkeys.prg
  * tests/gtwin.prg
  * tests/gtxfnt.prg
  * tests/inkeytst.prg
  * tests/linecont.prg
  * tests/mathtest.prg
  * tests/memvar.prg
  * tests/newrdd.prg
  * tests/output.prg
  * tests/readhrb.prg
  * tests/seconds.prg
  * tests/set_test.prg
  * tests/tb1.prg
  * tests/testdyn.prg
  * tests/testdyn1.prg
  * tests/testhrb.prg
  * tests/testhtml.prg
  * tests/testidle.prg
  * tests/testpre.prg
  * tests/testrdd2.prg
  * tests/testsha1.prg
  * tests/teststr.prg
  * tests/ticktime.prg
  * tests/transtst.prg
  * tests/tstcolor.prg
  * tests/tstdbi.prg
  * tests/tstmacro.prg
  * tests/uc16_gen.prg
  * tests/usrrdd/exarr.prg
  * tests/usrrdd/exlog.prg
  * tests/utf8at.prg
  * tests/version.prg
  * tests/videotst.prg
  * tests/vidtest.prg
  * tests/wvtext.prg
  * utils/hbmk2/hbmk2.prg
  * utils/hbtest/hbtest.prg
  * utils/hbtest/rt_class.prg
  * utils/hbtest/rt_date.prg
  * utils/hbtest/rt_hvm.prg
  * utils/hbtest/rt_hvma.prg
  * utils/hbtest/rt_math.prg
  * utils/hbtest/rt_misc.prg
  * utils/hbtest/rt_mt.prg
  * utils/hbtest/rt_str.prg
  * utils/hbtest/rt_stra.prg
  * utils/hbtest/rt_trans.prg
    * run case fixer script on all non-C file
      except some certain files, which I routinely
      skip when formatting.
    * minor manual cleanups along the way
2012-11-16 15:23:20 +00:00

314 lines
7.2 KiB
Plaintext

/*
* $Id$
*/
/*
* Author....: Jim Orlowski
* CIS ID....: ?
*
* This is an original work by Jim Orlowski and is placed in the
* public domain.
*
* Modification history:
* ---------------------
*
* Rev 1.4 28 Sep 1991 02:56:56 GLENN
* Moved Jim's "Tricks used" comment out of the file header and
* into the source code area.
*
* Rev 1.3 28 Sep 1991 02:52:22 GLENN
* Jim's modifications:
*
* 1. Changed SAVESCREEN() and RESTSCREEN to use MaxRow(), MaxCol()
* instead of 24,79
*
* 2. Added Nantucket's cleaner code for:
* - Cleaned up logic around line 334 while loop section
* - Added refreshCurrent and another stabilize around line 349
* - TbSkipWhile was redone
* Note: Leo's line was changed to:
* ELSEIF n > 0 .AND. RecNo() != LastRec() + 1
*
* 3. Added DispBegin() and DispEnd() around both Stabilize sections
*
*
*
*
* Rev 1.2 15 Aug 1991 23:04:20 GLENN
* Forest Belt proofread/edited/cleaned up doc
*
* Rev 1.1 14 Jun 1991 19:53:08 GLENN
* Minor edit to file header
*
* Rev 1.0 01 Apr 1991 01:02:22 GLENN
* Nanforum Toolkit
*
*/
/* The tricks are:
*
* 1. Setting up functions for goTop() and goBottom() so that you can
* quickly move to the right record when the user presses the
* Ctrl-PgUp ( goTop() ) and Ctrl-PgDn ( goBottom() ) keys.
*
* 2. Passing and evaluating the block for the TbSkipWhil().
*/
#include "inkey.ch"
#include "setcurs.ch"
FUNCTION ft_BrwsWhl( aFields, bWhileCond, cKey, nFreeze, lSaveScrn, ;
cColorList, cColorShad, nTop, nLeft, nBottom, nRight )
LOCAL b, column, i
LOCAL cHead, bField, lKeepScrn, cScrnSave
LOCAL cColorSave, cColorBack, nCursSave
LOCAL lMore, nKey, nPassRec
__defaultNIL( @nFreeze, 0 )
__defaultNIL( @lSaveScrn, .T. )
__defaultNIL( @cColorList, "N/W, N/BG, B/W, B/BG, B/W, B/BG, R/W, B/R" )
__defaultNIL( @cColorShad, "N/N" )
__defaultNIL( @nTop, 2 )
__defaultNIL( @nLeft, 2 )
__defaultNIL( @nBottom, MaxRow() - 2 )
__defaultNIL( @nRight, MaxCol() - 2 )
lKeepScrn := PCount() > 6
dbSeek( cKey )
IF ! Found() .OR. LastRec() == 0
RETURN 0
ENDIF
/* make new browse object */
b := TBrowseDB( nTop, nLeft, nBottom, nRight )
/* default heading and column separators */
b:headSep := hb_UTF8ToStrBox( "═╤═" )
b:colSep := hb_UTF8ToStrBox( " │ " )
b:footSep := hb_UTF8ToStrBox( "═╧═" )
/* add custom 'TbSkipWhil' (to handle passed condition) */
b:skipBlock := {| x | TbSkipWhil( x, bWhileCond ) }
/* Set up substitute goto top and goto bottom */
/* with While's top and bottom records */
b:goTopBlock := {|| TbWhileTop( cKey ) }
b:goBottomBlock := {|| TbWhileBot( cKey ) }
/* colors */
b:colorSpec := cColorList
/* add a column for each field in the current workarea */
FOR i := 1 TO Len( aFields )
cHead := aFields[ i, 1 ]
bField := aFields[ i, 2 ]
/* make the new column */
column := TBColumnNew( cHead, bField )
/* these are color setups from tbdemo.prg from Nantucket */
// IF cType == "N"
// column:defColor := { 5, 6 }
// column:colorBlock := {| x | iif( x < 0, { 7, 8 }, { 5, 6 } ) }
// ELSE
// column:defColor := { 3, 4 }
// ENDIF
/* To simplify I just used 3rd and 4th colors from passed cColorList */
/* This way 1st is SAY, 2nd is GET, 3rd and 4th are used here,
/* 5th is Unselected Get, extras can be used as in tbdemo.prg */
column:defColor := { 3, 4 }
b:addColumn( column )
NEXT
/* freeze columns */
IF nFreeze != 0
b:freeze := nFreeze
ENDIF
/* save old screen and colors */
IF lSaveScrn
cScrnSave := SaveScreen( 0, 0, MaxRow(), MaxCol() )
ENDIF
cColorSave := SetColor()
/* Background Color Is Based On First Color In Passed cColorList */
cColorBack := iif( "," $ cColorList, ;
SubStr( cColorList, 1, At( ",", cColorList ) - 1 ), cColorList )
IF ! lKeepScrn
SetColor( cColorBack )
hb_Scroll()
ENDIF
/* make a window shadow */
hb_Scroll( nTop + 1, nLeft + 1, nBottom + 1, nRight + 1,,, cColorShad )
hb_Scroll( nTop, nLeft, nBottom, nRight,,, cColorBack )
SetColor( cColorSave )
nCursSave := SetCursor( SC_NONE )
lMore := .T.
DO WHILE lMore
/* stabilize the display */
nKey := 0
DispBegin()
DO WHILE nKey == 0 .AND. ! b:stable
b:stabilize()
nKey := Inkey()
ENDDO
DispEnd()
IF b:stable
/* display is stable */
IF b:hitTop .OR. b:hitBottom
Tone( 125, 0 )
ENDIF
// Make sure that the current record is showing
// up-to-date data in case we are on a network.
DispBegin()
b:refreshCurrent()
b:forceStable()
DispEnd()
/* everything's done. just wait for a key */
nKey := Inkey( 0 )
ENDIF
/* process key */
SWITCH nKey
CASE K_DOWN
b:down()
EXIT
CASE K_UP
b:up()
EXIT
CASE K_PGDN
b:pageDown()
EXIT
CASE K_PGUP
b:pageUp()
EXIT
CASE K_CTRL_PGUP
b:goTop()
EXIT
CASE K_CTRL_PGDN
b:goBottom()
EXIT
CASE K_RIGHT
b:Right()
EXIT
CASE K_LEFT
b:Left()
EXIT
CASE K_HOME
b:home()
EXIT
CASE K_END
b:end()
EXIT
CASE K_CTRL_LEFT
b:panLeft()
EXIT
CASE K_CTRL_RIGHT
b:panRight()
EXIT
CASE K_CTRL_HOME
b:panHome()
EXIT
CASE K_CTRL_END
b:panEnd()
EXIT
CASE K_ESC
nPassRec := 0
lMore := .F.
EXIT
CASE K_ENTER
nPassRec := RecNo()
lMore := .F.
EXIT
ENDSWITCH
ENDDO
/* restore old screen */
IF lSaveScrn
RestScreen( 0, 0, MaxRow(), MaxCol(), cScrnSave )
ENDIF
SetCursor( nCursSave )
SetColor( cColorSave )
RETURN nPassRec
STATIC FUNCTION TbSkipWhil( n, bWhileCond )
LOCAL i := 0
IF n == 0 .OR. LastRec() == 0
dbSkip( 0 ) // significant on a network
ELSEIF n > 0 .AND. RecNo() != LastRec() + 1
WHILE i < n
dbSkip()
IF Eof() .OR. ! Eval( bWhileCond )
dbSkip( -1 )
EXIT
ENDIF
i++
ENDDO
ELSEIF n < 0
DO WHILE i > n
dbSkip( -1 )
IF Bof()
EXIT
ELSEIF ! Eval( bWhileCond )
dbSkip()
EXIT
ENDIF
i--
ENDDO
ENDIF
RETURN i
STATIC FUNCTION TbWhileTop( cKey )
dbSeek( cKey )
RETURN NIL
// SeekLast: Finds Last Record For Matching Key
// Developed By Jon Cole
// With softseek set on, seek the first record after condition.
// This is accomplished by incrementing the right most character of the
// string cKey by one ascii character. After SEEKing the new string,
// back up one record to get to the last record which matches cKey.
STATIC FUNCTION TbWhileBot( cKey )
dbSeek( Left( cKey, Len( cKey ) - 1 ) + Chr( Asc( Right( cKey, 1 ) ) + 1 ), .T. )
dbSkip( -1 )
RETURN NIL