Page 1 of 1

dcbrowse autorefresh

Posted: Tue Jan 22, 2013 11:49 am
by bwolfsohn
Roger,

In the autorefresh clause of dcbrowse, is it possible to add an inactive nSeconds clause i.e. don't consider refreshing the browse unless there has been inactivity for nSeconds ?

Re: dcbrowse autorefresh

Posted: Tue Jan 22, 2013 1:40 pm
by rdonnay
I'm assuming you mean inactivity in the workstation in which the browse is displayed.

I think you can use the WHEN clause of AUTOREFRESH to do this and a variable that gets updated in a custom handler loop. I'll see if I can write a sample.

Re: dcbrowse autorefresh

Posted: Tue Jan 22, 2013 4:43 pm
by rdonnay
Here's the sample program:

Code: Select all

#INCLUDE "dcdialog.CH"
#INCLUDE "appevent.CH"

STATIC snLastUpdate := 0

FUNCTION Main()

LOCAL GetList[0], oBrowse, aDir, i

aDir := Directory()

@ 0,0 DCBROWSE oBrowse DATA aDir SIZE 100, 20 ;
      AUTOREFRESH 1000 ;
        REFRESHBLOCK {|o|UpdateDirectory(o)} ;
        WHEN {||Seconds()-snLastUpdate < 15 }

DCBROWSECOL ELEMENT 1 HEADER 'File Name' WIDTH 10 PARENT oBrowse
DCBROWSECOL ELEMENT 2 HEADER 'File Size' WIDTH 10 PARENT oBrowse
DCBROWSECOL ELEMENT 3 HEADER 'File Date' WIDTH 10 PARENT oBrowse
DCBROWSECOL ELEMENT 4 HEADER 'File Time' WIDTH 10 PARENT oBrowse

DCREAD GUI FIT TITLE 'Browse Auto-Refresh Test' ;
   HANDLER myHandler

RETURN nil

* -----------

STATIC FUNCTION myHandler( nEvent, mp1 )

IF nEvent == xbeM_Motion
  snLastUpdate := Seconds()
ENDIF

RETURN DCGUI_NONE

* -----------

PROC appsys ; return

* -----------

STATIC FUNCTION UpdateDirectory( oBrowse )

wtf 'refreshing'

oBrowse:dataSource := Directory()
oBrowse:refresh()

RETURN nil

Re: dcbrowse autorefresh

Posted: Wed Jan 23, 2013 9:48 am
by bwolfsohn
Works great...

I made some changes to more easliy implement across all browses

Code: Select all

here's my autorefresh clause
AUTOREFRESH m->nBrowseRefresh WHEN {||myautorefresh() .AND. browse_not_active(snLastUpdate) }  

my handler clause
   HANDLER mybrowsehandler REFERENCE @snLastUpdate


**********************
function myautorefresh(aGetlist)
**********************
static slIsRefreshOn
IF slIsRefreshOn==nil
  slIsRefreshOn:=.t.
ENDIF
IF !aGetlist==nil
  slIsRefreshon:=!slIsRefreshOn
  DC_GetObject(aGetList,'REFRESHBUTTON'):setcaption('Turn Autorefresh '+IIF( slIsRefreshOn,"Off" ,"On" ))
ENDIF
return(slIsRefreshOn)

************************
FUNCTION myBrowseHandler( nEvent, mp1)
************************
IF nEvent == xbeM_Motion .OR. nEvent == xbeP_Keyboard
  snLastUpdate := Seconds()
ENDIF

RETURN DCGUI_NONE


**************************
function browse_not_active(snLastUpdate)
**************************
IF fexists('browsedebug.ovl')
  wtf Seconds()-snLastUpdate
ENDIF
return(Seconds()-snLastUpdate > m->nBrowseRefresh/100 )

Re: dcbrowse autorefresh

Posted: Wed Jan 23, 2013 8:43 pm
by rdonnay
Excellent!! :dance: