* contrib/gtwvg/class.prg
* contrib/gtwvg/menubar.prg
* contrib/gtwvg/paint.prg
* contrib/gtwvg/tests/_activex.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/hbhttpd/core.prg
* contrib/hbhttpd/tests/eshop.prg
* contrib/hbhttpd/widgets.prg
* contrib/hbtip/thtml.prg
* src/debug/dbgtobj.prg
* src/rdd/hbsix/sxini.prg
* src/rtl/hbi18n2.prg
* src/rtl/tbrowse.prg
* utils/hbtest/rt_array.prg
* sync with 3.4 fork (no change in functionality)
1001 lines
24 KiB
Plaintext
1001 lines
24 KiB
Plaintext
/* TBrowse Demonstration with GUI Elements
|
|
*
|
|
* This protocol can be clubbed with pure console implementation
|
|
* and can be called in a separate thread as well as modal to
|
|
* current window.
|
|
*
|
|
* Pritpal Bedi <bedipritpal@hotmail.com>
|
|
*/
|
|
|
|
#include "button.ch"
|
|
#include "dbstruct.ch"
|
|
#include "inkey.ch"
|
|
#include "setcurs.ch"
|
|
#include "hbgtinfo.ch"
|
|
#include "hbver.ch"
|
|
|
|
#define K_MOVING 1001
|
|
|
|
#define K_SBLINEUP 1051
|
|
#define K_SBLINEDOWN 1052
|
|
#define K_SBPAGEUP 1053
|
|
#define K_SBPAGEDOWN 1054
|
|
|
|
#define K_SBLINELEFT 1055
|
|
#define K_SBLINERIGHT 1056
|
|
#define K_SBPAGELEFT 1057
|
|
#define K_SBPAGERIGHT 1058
|
|
|
|
#define K_SBTHUMBTRACKVERT 1059
|
|
#define K_SBTHUMBTRACKHORZ 1060
|
|
|
|
PROCEDURE WvtMyBrowse()
|
|
|
|
IF hb_mtvm()
|
|
hb_threadStart( {| oCrt | oCrt := WvgCrt():new( , , { -1, -2 }, { 34, 69 }, , .T. ), ;
|
|
oCrt:resizeMode := HB_GTI_RESIZEMODE_ROWS, ;
|
|
oCrt:icon := GetResource( "dia_excl.ico" ), ;
|
|
oCrt:create(), ;
|
|
wvt_SetGUI( .T. ), ;
|
|
ExecBrowser( oCrt ), ;
|
|
oCrt:destroy() } )
|
|
|
|
ELSE
|
|
ExecBrowser()
|
|
ENDIF
|
|
|
|
RETURN
|
|
|
|
STATIC PROCEDURE ExecBrowser( oCrt )
|
|
|
|
LOCAL nKey, bBlock, oBrowse, aLastPaint, i, pGT
|
|
LOCAL cFileIndex, cFileDbf, cRDD, nIndex, oTBar, cScr, info_ // , oLB
|
|
LOCAL lEnd := .F.
|
|
LOCAL aBlocks := {}
|
|
LOCAL nTop := 4
|
|
LOCAL nLeft := 3
|
|
LOCAL nBottom := MaxRow() - 2
|
|
LOCAL nRight := MaxCol() - 3
|
|
LOCAL nCursor := SetCursor( 0 )
|
|
LOCAL nRow := Row()
|
|
LOCAL nCol := Col()
|
|
LOCAL cColor := SetColor( "N/W*,N/GR*,,,N/W*" )
|
|
LOCAL aObjects := WvtSetObjects( {} )
|
|
LOCAL hPopup := wvt_SetPopupMenu()
|
|
LOCAL oVBar, oHBar, oCom, oTre, oChk, oSLE, oLBx, aNvg, oIdx
|
|
|
|
STATIC s_nStyle := 0
|
|
|
|
THREAD STATIC t_nFactor := 200
|
|
THREAD STATIC t_lActiveX := .F.
|
|
|
|
IF oCrt == NIL
|
|
cScr := SaveScreen( 0, 0, MaxRow(), MaxCol() )
|
|
ENDIF
|
|
|
|
BrwBuildMenu( oCrt )
|
|
oTBar := BrwBuildToolBar( oCrt )
|
|
oTBar:buttonClick := {| oBtn | Vou_ExecTBarAction( oBtn ) }
|
|
|
|
SetMode( MaxRow() + 1, MaxCol() + 1 ) /* Necessary because adding menu has reduced the overall size of window */
|
|
|
|
pGT := SetGT( 2, hb_gtSelect() )
|
|
|
|
cRDD := "DBFCDX"
|
|
cFileDbf := hb_DirBase() + ".." + hb_ps() + ".." + hb_ps() + ".." + hb_ps() + "tests" + hb_ps() + "test.dbf"
|
|
cFileIndex := "test.z01"
|
|
|
|
USE ( cFileDbf ) NEW SHARED VIA ( cRDD )
|
|
IF NetErr()
|
|
RETURN
|
|
ENDIF
|
|
IF FLock()
|
|
INDEX ON Test->FIRST TAG "001" TO ( cFileIndex )
|
|
INDEX ON Test->LAST TAG "002" TO ( cFileIndex )
|
|
INDEX ON Test->CITY TAG "003" TO ( cFileIndex )
|
|
dbUnlock()
|
|
ENDIF
|
|
SET INDEX TO
|
|
SET INDEX TO ( cFileIndex )
|
|
SET ORDER TO 1
|
|
dbGoto( 50 )
|
|
|
|
info_ := dbStruct()
|
|
|
|
Popups( 2 )
|
|
|
|
oBrowse := TBrowseWvg():New( nTop + 2, nLeft + 12, nBottom - 1, nRight - 1 )
|
|
|
|
oBrowse:ColSep := " "
|
|
oBrowse:HeadSep := "__"
|
|
oBrowse:GoTopBlock := {|| dbGoTop() }
|
|
oBrowse:GoBottomBlock := {|| dbGoBottom() }
|
|
oBrowse:SkipBlock := {| nSkip | dbSkipBlock( nSkip, oBrowse ) }
|
|
|
|
FOR i := 1 TO Len( info_ )
|
|
bBlock := VouBlockField( i )
|
|
oBrowse:AddColumn( TBColumnNew( info_[ i,1 ], bBlock ) )
|
|
NEXT
|
|
oBrowse:configure()
|
|
|
|
IF s_nStyle > 5
|
|
s_nStyle := 0
|
|
ENDIF
|
|
wvt_SetPen( s_nStyle, 0, RGB( 210,1210,210 ) )
|
|
s_nStyle++
|
|
hb_gtInfo( HB_GTI_WINTITLE, "WVT GUI TBrowse()" )
|
|
|
|
AAdd( aBlocks, {|| wvt_DrawBoxRaised( oBrowse:nTop - 2, oBrowse:nLeft - 2, oBrowse:nBottom + 1, oBrowse:nRight + 2 ) } )
|
|
AAdd( aBlocks, {|| wvt_DrawBoxRecessed( oBrowse:nTop, oBrowse:nLeft, oBrowse:nBottom, oBrowse:nRight ) } )
|
|
AAdd( aBlocks, {|| wvt_DrawGridHorz( oBrowse:nTop + 3, oBrowse:nLeft, oBrowse:nRight, oBrowse:nBottom - oBrowse:nTop - 2 ) } )
|
|
AAdd( aBlocks, {|| wvt_DrawGridVert( oBrowse:nTop, oBrowse:nBottom, oBrowse:aColumnsSep, Len( oBrowse:aColumnsSep ) ) } )
|
|
|
|
Vou_BrwAddScrollBars( oCrt, oBrowse, @oVBar, @oHBar )
|
|
|
|
aLastPaint := WvtSetBlocks( aBlocks )
|
|
|
|
hb_DispBox( 0, 0, MaxRow(), MaxCol(), " ", "N/W" )
|
|
hb_DispOutAt( oBrowse:nTop - 2, oBrowse:nleft - 2, PadC( cFileDbf, oBrowse:nRight - oBrowse:nLeft + 5 ), "W+/B*" )
|
|
|
|
oCom := BrwBuildActiveX( oCrt, oBrowse )
|
|
oChk := BrwBuildCheckBox( oCrt, oBrowse, @t_lActiveX )
|
|
oSLE := BrwBuildSLE( oCrt, oBrowse )
|
|
aNvg := BrwBuildNvg( oCrt, oBrowse, oCom )
|
|
oLBx := BrwBuildListBox( oCrt, oBrowse )
|
|
oIdx := BrwBuildListBoxIdx( oCrt, oBrowse )
|
|
BrwBuildButtons( oCrt, oBrowse )
|
|
oTre := BrwBuildTree( oCrt, oBrowse )
|
|
|
|
wvt_Keyboard( HB_K_RESIZE ) /* Refresh All GUI Controls */
|
|
|
|
WHILE ! lEnd
|
|
DispBegin()
|
|
DO WHILE ( ( nKey := Inkey( , INKEY_ALL + HB_INKEY_GTEVENT ) ) == 0 .OR. nKey == K_MOVING ) .AND. ! oBrowse:stabilize()
|
|
ENDDO
|
|
DispEnd()
|
|
|
|
IF nKey == 0
|
|
oVBar:setData( ordKeyNo() )
|
|
oHBar:setData( oBrowse:colPos )
|
|
DO WHILE ( ( nKey := Inkey( , INKEY_ALL + HB_INKEY_GTEVENT ) ) == 0 .OR. nKey == K_MOVING )
|
|
ENDDO
|
|
ENDIF
|
|
|
|
DO CASE
|
|
CASE nKey == K_F12
|
|
t_nFactor--
|
|
hb_gtInfo( HB_GTI_SPEC, HB_GTS_FACTOR, t_nFactor )
|
|
|
|
CASE nKey == K_F11
|
|
t_nFactor++
|
|
hb_gtInfo( HB_GTI_SPEC, HB_GTS_FACTOR, t_nFactor )
|
|
|
|
CASE nKey == K_F6
|
|
hb_gtInfo( HB_GTI_RESIZABLE, .F. )
|
|
|
|
CASE nKey == K_F7
|
|
hb_gtInfo( HB_GTI_RESIZABLE, .T. )
|
|
|
|
CASE nKey == K_F2
|
|
nIndex := IndexOrd()
|
|
nIndex++
|
|
IF nIndex > 3
|
|
nIndex := 1
|
|
ENDIF
|
|
SET ORDER TO ( nIndex )
|
|
oBrowse:RefreshAll()
|
|
oBrowse:ForceStable()
|
|
|
|
CASE nKey == K_F3
|
|
DoModalWindow()
|
|
|
|
CASE nKey == K_F4
|
|
hb_gtInfo( HB_GTI_SPEC, HB_GTS_WNDSTATE, HB_GTS_WS_MAXIMIZED )
|
|
|
|
CASE BrwHandleKey( oBrowse, nKey, @lEnd )
|
|
|
|
CASE nKey == HB_K_RESIZE
|
|
BrwHandleResize( oCrt, oBrowse, oVBar, oHBar, oCom, oSLE, oLBx, oTre, oChk, aNvg, oIdx, t_lActiveX, cFileDbf )
|
|
|
|
ENDCASE
|
|
ENDDO
|
|
|
|
wvt_SetPen( 0 )
|
|
WvtSetBlocks( aLastPaint )
|
|
WvtSetObjects( aObjects )
|
|
|
|
DevPos( nRow, nCol )
|
|
SetColor( cColor )
|
|
SetCursor( nCursor )
|
|
|
|
dbCloseArea()
|
|
|
|
IF oCrt == NIL
|
|
RestScreen( 0, 0, MaxRow(), MaxCol(), cScr )
|
|
ENDIF
|
|
wvt_SetPopupMenu( hPopup )
|
|
SetGT( 2, pGT )
|
|
|
|
RETURN
|
|
|
|
STATIC FUNCTION BrwHandleResize( oCrt, oBrw, oVBar, oHBar, oCom, oSLE, oLBx, oTre, oChk, aNvg, oIdx, lActiveX, cFileDbf )
|
|
|
|
HB_SYMBOL_UNUSED( oSle )
|
|
HB_SYMBOL_UNUSED( oLBx )
|
|
HB_SYMBOL_UNUSED( oChk )
|
|
HB_SYMBOL_UNUSED( oIdx )
|
|
|
|
oCrt:setFocus()
|
|
|
|
oBrw:nBottom := iif( lActiveX, 20, MaxRow() - 3 )
|
|
oBrw:nRight := MaxCol() - 4
|
|
oBrw:configure()
|
|
|
|
hb_DispBox( 0, 0, MaxRow(), MaxCol(), " ", "N/W" )
|
|
hb_DispOutAt( oBrw:nTop - 2, oBrw:nleft - 2, PadC( cFileDbf, oBrw:nRight - oBrw:nLeft + 5 ), "W+/B*" )
|
|
|
|
oVBar:setPosAndSize()
|
|
oHBar:setPosAndSize()
|
|
oCom:setPosAndSize()
|
|
#if 0
|
|
oSLE:setPosAndSize()
|
|
oLBx:setPosAndSize()
|
|
oIdx:setPosAndSize()
|
|
#endif
|
|
|
|
oTre:setPosAndSize()
|
|
#if 0
|
|
oChk:setPosAndSize()
|
|
#endif
|
|
|
|
BrwReposButtons( oCrt ) /* Because we are repositioning at the center of console width */
|
|
|
|
IF lActiveX
|
|
aNvg[ 1 ]:show()
|
|
aNvg[ 2 ]:show()
|
|
oCom:show()
|
|
ELSE
|
|
aNvg[ 1 ]:hide()
|
|
aNvg[ 2 ]:hide()
|
|
oCom:hide()
|
|
ENDIF
|
|
|
|
/* Why this is needed if WvgActiveXControl is hosted on the GT console */
|
|
oCrt:hide()
|
|
oCrt:show()
|
|
|
|
RETURN .T.
|
|
|
|
STATIC PROCEDURE BrwShowColumn( oBrw, cHeading )
|
|
|
|
LOCAL i, j, nCur
|
|
|
|
nCur := oBrw:colPos
|
|
FOR i := 1 TO oBrw:colCount
|
|
IF oBrw:getColumn( i ):heading == cHeading
|
|
EXIT
|
|
ENDIF
|
|
NEXT
|
|
IF i < nCur
|
|
FOR j := nCur - 1 TO i STEP -1
|
|
oBrw:Left()
|
|
NEXT
|
|
ELSEIF i > nCur
|
|
FOR j := nCur + 1 TO i
|
|
oBrw:Right()
|
|
NEXT
|
|
ENDIF
|
|
oBrw:refreshCurrent()
|
|
oBrw:forceStable()
|
|
|
|
RETURN
|
|
|
|
STATIC FUNCTION BrwBuildTree( oCrt /*, oBrw*/ )
|
|
|
|
LOCAL oTree, oItem1, oItem2
|
|
|
|
oTree := WvgTreeView():new( oCrt )
|
|
oTree:hasLines := .T.
|
|
oTree:hasButtons := .T.
|
|
oTree:alwaysShowSelection := .T.
|
|
oTree:create( , , { -24, -1 }, { {|| -( MaxRow() - 1 - 24 ) }, -10 } )
|
|
oTree:setColorFG( "W+" )
|
|
oTree:setColorBG( "R*" )
|
|
oTree:itemSelected := {| oItem | wvg_MessageBox( , iif( oItem != NIL, oItem:caption, "Some Problem" ) ) }
|
|
|
|
oItem1 := oTree:rootItem:addItem( "First level A" )
|
|
|
|
oTree:rootItem:addItem( "First level B" )
|
|
|
|
oItem2 := oItem1:addItem( "Second level 1" )
|
|
oItem1:addItem( "Second level 2" )
|
|
|
|
oItem2:addItem( "Third level x" )
|
|
oItem2:addItem( "Third level y" )
|
|
oItem2:addItem( "Third level z" )
|
|
|
|
oTree:showExpanded( .T., 2 )
|
|
oTree:setData( oItem2 )
|
|
|
|
oTree:tooltipText := "Treeview embedded onto CUI window"
|
|
|
|
RETURN oTree
|
|
|
|
STATIC FUNCTION BrwBuildActiveX( oCrt, oBrw )
|
|
|
|
LOCAL oCom
|
|
|
|
HB_SYMBOL_UNUSED( oBrw )
|
|
|
|
oCom := WvgActiveXControl():new( oCrt, , { -24, -13 }, { {|| -( MaxRow() - 1 - 24 ) }, {|| -( MaxCol() - 1 - 13 ) } }, , .F. )
|
|
oCom:CLSID := "Shell.Explorer.2"
|
|
#if 0
|
|
oCom:mapEvent( 269, {|| uiDebug( "EXPLORER-269" ) } )
|
|
#endif
|
|
oCom:create()
|
|
oCom:navigate( hb_Version( HB_VERSION_URL_BASE ) )
|
|
|
|
RETURN oCom
|
|
|
|
STATIC FUNCTION BrwBuildListBox( oCrt, oBrw )
|
|
|
|
LOCAL oXbp, i
|
|
|
|
oXbp := WvgListBox():new( oCrt )
|
|
oXbp:create( , , { -4, -1 }, { -10, -10 }, , .T. )
|
|
oXbp:setColorFG( "W+" )
|
|
oXbp:setColorBG( "B*" )
|
|
oXbp:itemMarked := {| m1, m2, o | m1 := m1, m2 := m2, BrwShowColumn( oBrw, o:getCurItem() ) }
|
|
FOR i := 1 TO oBrw:colCount
|
|
oXbp:addItem( oBrw:getColumn( i ):heading )
|
|
NEXT
|
|
oXbp:setData( 1 )
|
|
oXbp:tooltipText := "Click on a field name to make it active!"
|
|
|
|
RETURN oXbp
|
|
|
|
STATIC PROCEDURE BrwSetThisOrder( oBrw, nOrd )
|
|
|
|
dbSetOrder( nOrd )
|
|
oBrw:refreshAll()
|
|
oBrw:forceStable()
|
|
|
|
RETURN
|
|
|
|
STATIC FUNCTION BrwBuildListBoxIdx( oCrt, oBrw )
|
|
|
|
LOCAL oXbp, i, cKey, aIdx := {}
|
|
|
|
FOR i := 1 TO 10
|
|
IF ( cKey := IndexKey( i ) ) == ""
|
|
EXIT
|
|
ENDIF
|
|
AAdd( aIdx, ordName( i ) + ": " + cKey )
|
|
NEXT
|
|
|
|
oXbp := WvgComboBox():new( oCrt )
|
|
oXbp:type := WVGCOMBO_DROPDOWN
|
|
oXbp:create( , , { -18, -1 }, { -5, -10 }, , .T. )
|
|
oXbp:setColorFG( "W+" )
|
|
oXbp:setColorBG( "B*" )
|
|
oXbp:itemMarked := {| m1, m2, o | m1 := m2, BrwSetThisOrder( oBrw, o:XbpListBox:getData() - 1 ) }
|
|
oXbp:addItem( "Natural Order" )
|
|
FOR i := 1 TO Len( aIdx )
|
|
oXbp:addItem( aIdx[ i ] )
|
|
NEXT
|
|
oXbp:tooltipText := "Click on an index to order database!"
|
|
|
|
RETURN oXbp
|
|
|
|
STATIC FUNCTION BrwBuildSLE( oCrt, oBrw )
|
|
|
|
LOCAL oXbp
|
|
|
|
oXbp := WvgStatic():new( oCrt )
|
|
oXbp:type := WVGSTATIC_TYPE_TEXT
|
|
oXbp:options := WVGSTATIC_TEXT_CENTER
|
|
oXbp:caption := "Field Name"
|
|
oXbp:create( , , { -15, -1 }, { -1, -10 } )
|
|
oXbp:setColorFG( "W+" )
|
|
oXbp:setColorBG( "BG" )
|
|
|
|
oXbp := WvgSLE():new( oCrt )
|
|
oXbp:create( , , { -16, -1 }, { -1, -10 } )
|
|
oXbp:setColorFG( "N" )
|
|
oXbp:setColorBG( "BG+" )
|
|
oXbp:returnPressed := {| m1, m2, o | m1 := m1, m2 := m2, BrwShowColumn( oBrw, Upper( RTrim( o:getData() ) ) ) }
|
|
oXbp:tooltipText := "Type in a field name and press ENTER"
|
|
|
|
RETURN oXbp
|
|
|
|
STATIC FUNCTION BrwBuildNvg( oCrt, oBrw, oCom )
|
|
|
|
LOCAL oLbl, oXbp
|
|
|
|
HB_SYMBOL_UNUSED( oBrw )
|
|
|
|
oLbl := WvgStatic():new( oCrt )
|
|
oLbl:type := WVGSTATIC_TYPE_TEXT
|
|
oLbl:options := WVGSTATIC_TEXT_LEFT
|
|
oLbl:caption := "Navigate"
|
|
oLbl:create( , , { -23, -13 }, { -1, -6 }, , .F. )
|
|
oLbl:setColorFG( "W+" )
|
|
oLbl:setColorBG( "BG" )
|
|
|
|
oXbp := WvgSLE():new( oCrt )
|
|
oXbp:bufferLength := 300
|
|
oXbp:create( , , { -23, -19 }, { -1, {|| -( MaxCol() - 1 - 19 ) } }, , .F. )
|
|
oXbp:setColorFG( "N" )
|
|
oXbp:setColorBG( "BG+" )
|
|
oXbp:returnPressed := {| m1, m2, o | m1 := m2, oCom:navigate( RTrim( o:getData() ) ) }
|
|
oXbp:tooltipText := "Type-in a web address and press ENTER"
|
|
oXbp:setData( hb_Version( HB_VERSION_URL_BASE ) )
|
|
|
|
RETURN { oLbl, oXbp }
|
|
|
|
STATIC FUNCTION BrwBuildCheckBox( oCrt, oBrw, lActiveX )
|
|
|
|
LOCAL oXbp
|
|
|
|
HB_SYMBOL_UNUSED( oBrw )
|
|
|
|
oXbp := WvgCheckBox():new( oCrt )
|
|
oXbp:pointerFocus := .F.
|
|
oXbp:caption := "ActiveX"
|
|
oXbp:selected := {| x, y, o | x := y, lActiveX := o:getData(), wvt_Keyboard( HB_K_RESIZE ) }
|
|
oXbp:selection := .F.
|
|
oXbp:create( , , { -23, -1 }, { -1, -10 } )
|
|
oXbp:setColorFG( "R+" )
|
|
oXbp:setColorBG( "W" )
|
|
oXbp:tooltipText := "Navigate: " + hb_Version( HB_VERSION_URL_BASE )
|
|
|
|
RETURN oXbp
|
|
|
|
STATIC PROCEDURE BrwReposButtons( oCrt )
|
|
|
|
LOCAL oXbp, nOff, nTtl, nG, i
|
|
LOCAL aW := { 10, 10, 10, 10, 10 }
|
|
|
|
nG := 2
|
|
nTtl := 0
|
|
AEval( aW, {| e | nTtl += e } )
|
|
nTtl += ( Len( aW ) - 1 ) * nG
|
|
|
|
nOff := ( ( MaxCol() + 1 ) - nTtl ) / 2
|
|
i := 0
|
|
FOR EACH oXbp IN oCrt:childList()
|
|
IF __objGetClsName( oXbp ) == "WVGPUSHBUTTON"
|
|
i++
|
|
oXbp:setPosAndSize( { -MaxRow(), -nOff }, { -1, -aW[ i ] } )
|
|
nOff += aW[ i ] + nG
|
|
ENDIF
|
|
NEXT
|
|
|
|
RETURN
|
|
|
|
STATIC PROCEDURE BrwBuildButtons( oCrt, oBrw )
|
|
|
|
LOCAL oPB, nOff, nTtl, nG, i
|
|
LOCAL aPmt := { "Modal Window", "Maximize", "Go Top", "Go Bottom", "Right Most" }
|
|
LOCAL aAct := { {|| wvt_Keyboard( K_F3 ) }, ;
|
|
{|| wvt_Keyboard( K_F4 ) }, ;
|
|
{|| oBrw:goTop(), oBrw:forceStable() }, ;
|
|
{|| oBrw:goBottom(), oBrw:forceStable() }, ;
|
|
{|| oBrw:panEnd(), oBrw:forceStable() } }
|
|
LOCAL aW := { 10, 10, 10, 10, 10 }
|
|
|
|
nG := 2
|
|
nTtl := 0
|
|
AEval( aW, {| e | nTtl += e } )
|
|
nTtl += ( Len( aW ) - 1 ) * nG
|
|
|
|
nOff := ( ( MaxCol() + 1 ) - nTtl ) / 2
|
|
|
|
FOR i := 1 TO Len( aPmt )
|
|
oPB := WvgPushButton():new( oCrt )
|
|
IF i == 3 /* We do not want this button to gain focus anytime */
|
|
oPB:pointerFocus := .F.
|
|
ENDIF
|
|
IF i == Len( aPmt )
|
|
oPB:caption := hb_DirBase() + "\" + "v_lock.bmp"
|
|
oPB:create( , , { {|| -MaxRow() }, -nOff }, { -1, -aW[ i ] } )
|
|
ELSE
|
|
oPB:caption := aPmt[ i ]
|
|
oPB:create( , , { {|| -MaxRow() }, -nOff }, { -1, -aW[ i ] } )
|
|
ENDIF
|
|
oPB:activate := aAct[ i ]
|
|
oPB:setColorFG( RGB( 0, 255, 0 ) )
|
|
oPB:tooltipText := aPmt[ i ]
|
|
|
|
nOff += aW[ i ] + nG
|
|
NEXT
|
|
|
|
RETURN
|
|
|
|
STATIC PROCEDURE Vou_BrwAddScrollBars( oCrt, oBrw, oVBar, oHBar )
|
|
|
|
oHBar := WvgScrollBar():new( oCrt, , { {|| -( oBrw:nBottom + 1 ) }, {|| -oBrw:nLeft } }, ;
|
|
{ -1, {|| -( oBrw:nRight - oBrw:nLeft + 1 ) } } )
|
|
oHBar:range := { 1, oBrw:colCount }
|
|
oHBar:type := WVGSCROLL_HORIZONTAL
|
|
oHBar:create()
|
|
oHBar:scroll := {| mp1 | oBrw:colPos := mp1[ 1 ], oBrw:refreshCurrent(), oBrw:forceStable() }
|
|
|
|
oVBar := WvgScrollBar():new( oCrt, , { {|| -oBrw:nTop }, {|| -( oBrw:nRight + 1 ) } }, ;
|
|
{ {|| -( oBrw:nBottom - oBrw:nTop + 1 ) }, {|| -2 } } )
|
|
oVBar:range := { 1, LastRec() }
|
|
oVBar:type := WVGSCROLL_VERTICAL
|
|
oVBar:create()
|
|
oVBar:scroll := {| mp1 | Vou_BrwSetVScroll( mp1, oBrw ) }
|
|
|
|
RETURN
|
|
|
|
STATIC FUNCTION BrwBuildMenu( oCrt )
|
|
|
|
LOCAL oMenu, oSMenu
|
|
|
|
oMenu := oCrt:menubar()
|
|
|
|
oSMenu := WvgMenu():new( oMenu ):create()
|
|
oSMenu:addItem( { "~First" , {|| Alert( "First" ) } } )
|
|
oSMenu:addItem( { "~Second", {|| Alert( "Second" ) } } )
|
|
oSMenu:addItem()
|
|
oSMenu:addItem( { "~Third" , {|| Alert( "Third" ) } } )
|
|
oMenu:addItem( { oSMenu, "~Hello" } )
|
|
|
|
oSMenu := WvgMenu():new( oMenu ):create()
|
|
oSMenu:addItem( { "~First" , {|| Alert( "First" ) } } )
|
|
oSMenu:addItem( "-" )
|
|
oSMenu:addItem( { "~Second", {|| Alert( "Second" ) } } )
|
|
oSMenu:addItem( { "~Third" , {|| Alert( "Third" ) } } )
|
|
oMenu:addItem( { oSMenu, "~MyFriends" } )
|
|
|
|
oSMenu := WvgMenu():new( oMenu ):create()
|
|
oSMenu:title := "~Procedural"
|
|
oSMenu:addItem( { "Procedure ~1", } )
|
|
oSMenu:addItem( { "Procedure ~2", } )
|
|
oSMenu:itemSelected := {| mp1 | MyMenuProcedure( 100 + mp1 ) }
|
|
oSMenu:checkItem( 2 )
|
|
oMenu:addItem( { oSMenu, NIL } )
|
|
|
|
RETURN oMenu
|
|
|
|
STATIC FUNCTION BrwBuildToolBar( oCrt )
|
|
|
|
LOCAL oTBar, nRGB := RGB( 172, 172, 172 )
|
|
|
|
oTBar := WvgToolBar():new( oCrt, , { -0.1, -0.1 }, { -3, {|| -( MaxCol() + 1 ) } } )
|
|
|
|
oTBar:style := WVGTOOLBAR_STYLE_FLAT
|
|
oTBar:borderStyle := WVGFRAME_RECT
|
|
|
|
oTBar:buttonWidth := 40 // 28
|
|
oTBar:buttonHeight := 26
|
|
|
|
oTBar:imageWidth := 26
|
|
oTBar:imageHeight := 24
|
|
|
|
oTBar:showToolTips := .T.
|
|
|
|
// After setting properties, create toolbar.
|
|
oTBar:create()
|
|
|
|
oTBar:addItem( "New" , hb_DirBase() + "v_new.bmp" , , , , , , nRGB )
|
|
oTBar:addItem( "Select" , hb_DirBase() + "v_selct1.bmp", , , , , , nRGB )
|
|
oTBar:addItem( "Calendar" , hb_DirBase() + "v_calend.bmp", , , , , , nRGB )
|
|
oTBar:addItem( "Tools" , hb_DirBase() + "v_lock.bmp" , , , , , , nRGB )
|
|
oTBar:addItem( "Index" , hb_DirBase() + "v_index.bmp" , , , , , , nRGB )
|
|
oTBar:addItem( "Show" , hb_DirBase() + "v_clclt.bmp" , , , , , , nRGB )
|
|
oTBar:addItem( "Hide" , hb_DirBase() + "v_notes1.bmp", , , , , , nRGB )
|
|
|
|
RETURN oTBar
|
|
|
|
// Key Handling
|
|
|
|
STATIC FUNCTION BrwHandleKey( oBrowse, nKey, lEnd )
|
|
|
|
LOCAL lVMove := .F.
|
|
LOCAL lHMove := .F.
|
|
LOCAL lRet := .T.
|
|
|
|
DO CASE
|
|
CASE nKey == K_ESC
|
|
lEnd := .T.
|
|
|
|
CASE nKey == K_ENTER
|
|
lEnd := .T.
|
|
|
|
CASE nKey == K_DOWN
|
|
lVMove := .T.
|
|
oBrowse:Down()
|
|
|
|
CASE nKey == K_UP
|
|
lVMove := .T.
|
|
oBrowse:Up()
|
|
|
|
CASE nKey == K_PGDN
|
|
lVMove := .T.
|
|
oBrowse:pageDown()
|
|
|
|
CASE nKey == K_PGUP
|
|
lVMove := .T.
|
|
oBrowse:pageUp()
|
|
|
|
CASE nKey == K_CTRL_PGUP
|
|
lVMove := .T.
|
|
oBrowse:goTop()
|
|
|
|
CASE nKey == K_CTRL_PGDN
|
|
lVMove := .T.
|
|
oBrowse:goBottom()
|
|
|
|
CASE nKey == K_LEFT
|
|
lHMove := .T.
|
|
oBrowse:Left()
|
|
|
|
CASE nKey == K_RIGHT
|
|
lHMove := .T.
|
|
oBrowse:Right()
|
|
|
|
CASE nKey == K_HOME
|
|
lHMove := .T.
|
|
oBrowse:home()
|
|
|
|
CASE nKey == K_END
|
|
lHMove := .T.
|
|
oBrowse:end()
|
|
|
|
CASE nKey == K_CTRL_LEFT
|
|
lHMove := .T.
|
|
oBrowse:panLeft()
|
|
|
|
CASE nKey == K_CTRL_RIGHT
|
|
lHMove := .T.
|
|
oBrowse:panRight()
|
|
|
|
CASE nKey == K_CTRL_HOME
|
|
lHMove := .T.
|
|
oBrowse:panHome()
|
|
|
|
CASE nKey == K_CTRL_END
|
|
lHMove := .T.
|
|
oBrowse:panEnd()
|
|
|
|
CASE nKey == K_MWBACKWARD
|
|
lVMove := .T.
|
|
oBrowse:down()
|
|
|
|
CASE nKey == K_MWFORWARD
|
|
lVMove := .T.
|
|
oBrowse:up()
|
|
|
|
CASE Vou_NavigateToCell( oBrowse, nKey )
|
|
|
|
OTHERWISE
|
|
lRet := .F.
|
|
|
|
ENDCASE
|
|
|
|
IF lHMove .OR. lVMove
|
|
oBrowse:forceStable()
|
|
ENDIF
|
|
|
|
RETURN lRet
|
|
|
|
STATIC FUNCTION Vou_NavigateToCell( oBrowse )
|
|
|
|
LOCAL nCount
|
|
|
|
IF LastKey() == K_LBUTTONUP
|
|
IF oBrowse:HitTest( MRow(), MCol() ) == -5121 // on a cell
|
|
oBrowse:deHilite()
|
|
oBrowse:refreshCurrent()
|
|
oBrowse:forceStable()
|
|
|
|
nCount := oBrowse:mRowPos - oBrowse:RowPos
|
|
|
|
DispBegin()
|
|
DO WHILE nCount < 0
|
|
nCount++
|
|
oBrowse:Up()
|
|
ENDDO
|
|
|
|
DO WHILE nCount > 0
|
|
nCount--
|
|
oBrowse:Down()
|
|
ENDDO
|
|
|
|
nCount := oBrowse:mColPos - oBrowse:ColPos
|
|
DO WHILE nCount < 0
|
|
nCount++
|
|
oBrowse:Left()
|
|
ENDDO
|
|
|
|
DO WHILE nCount > 0
|
|
nCount--
|
|
oBrowse:Right()
|
|
ENDDO
|
|
oBrowse:forceStable()
|
|
DispEnd()
|
|
oBrowse:hilite()
|
|
|
|
RETURN .T.
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN .F.
|
|
|
|
STATIC FUNCTION DbSkipBlock( n )
|
|
|
|
LOCAL nSkipped := 0
|
|
|
|
IF n == 0
|
|
dbSkip( 0 )
|
|
|
|
ELSEIF n > 0
|
|
DO WHILE nSkipped != n .AND. TBNext()
|
|
nSkipped++
|
|
ENDDO
|
|
ELSE
|
|
DO WHILE nSkipped != n .AND. TBPrev()
|
|
nSkipped--
|
|
ENDDO
|
|
ENDIF
|
|
|
|
RETURN nSkipped
|
|
|
|
STATIC FUNCTION TBNext()
|
|
|
|
LOCAL nSaveRecNum := RecNo()
|
|
LOCAL lMoved := .T.
|
|
|
|
IF Eof()
|
|
lMoved := .F.
|
|
ELSE
|
|
dbSkip()
|
|
IF Eof()
|
|
lMoved := .F.
|
|
dbGoto( nSaveRecNum )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN lMoved
|
|
|
|
STATIC FUNCTION TBPrev()
|
|
|
|
LOCAL nSaveRecNum := RecNo()
|
|
LOCAL lMoved := .T.
|
|
|
|
dbSkip( -1 )
|
|
|
|
IF Bof()
|
|
dbGoto( nSaveRecNum )
|
|
lMoved := .F.
|
|
ENDIF
|
|
|
|
RETURN lMoved
|
|
|
|
STATIC FUNCTION VouBlockField( i )
|
|
|
|
RETURN {|| FieldGet( i ) }
|
|
|
|
STATIC PROCEDURE Vou_ExecTBarAction( oBtn )
|
|
|
|
SWITCH oBtn:caption
|
|
CASE "New"
|
|
wvt_Keyboard( K_DOWN ); EXIT
|
|
CASE "Select"
|
|
wvt_Keyboard( K_UP ); EXIT
|
|
CASE "Calendar"
|
|
wvt_Keyboard( K_RIGHT ); EXIT
|
|
CASE "Tools"
|
|
wvt_Keyboard( K_LEFT ); EXIT
|
|
CASE "Index"
|
|
wvt_Keyboard( K_PGDN ); EXIT
|
|
CASE "Show"
|
|
wvt_Keyboard( K_PGUP ); EXIT
|
|
CASE "Hide"
|
|
wvt_Keyboard( K_CTRL_HOME ); EXIT
|
|
ENDSWITCH
|
|
|
|
RETURN
|
|
|
|
STATIC PROCEDURE Vou_BrwSetVScroll( mp1, oBrowse )
|
|
|
|
SWITCH mp1[ 2 ]
|
|
|
|
CASE WVGSB_TOP
|
|
oBrowse:goTop()
|
|
EXIT
|
|
|
|
CASE WVGSB_BOTTOM
|
|
oBrowse:goBottom()
|
|
EXIT
|
|
|
|
CASE WVGSB_NEXTPOS
|
|
oBrowse:down()
|
|
EXIT
|
|
|
|
CASE WVGSB_PREVPOS
|
|
oBrowse:up()
|
|
EXIT
|
|
|
|
CASE WVGSB_NEXTPAGE
|
|
ordKeyGoto( mp1[ 1 ] )
|
|
oBrowse:refreshAll()
|
|
EXIT
|
|
|
|
CASE WVGSB_PREVPAGE
|
|
ordKeyGoto( mp1[ 1 ] )
|
|
oBrowse:refreshAll()
|
|
EXIT
|
|
|
|
CASE WVGSB_ENDTRACK
|
|
ordKeyGoto( mp1[ 1 ] )
|
|
oBrowse:refreshAll()
|
|
EXIT
|
|
|
|
ENDSWITCH
|
|
|
|
oBrowse:forceStable()
|
|
|
|
RETURN
|
|
|
|
/* For brosers inside WvtDialog() */
|
|
|
|
STATIC FUNCTION BrwOnEvent( oWvtBrw, cPaintID, oBrowse, nKey )
|
|
|
|
LOCAL lRet := .T., lRefAll := .F.
|
|
|
|
HB_SYMBOL_UNUSED( cPaintID )
|
|
|
|
DO CASE
|
|
CASE nKey == K_DOWN
|
|
oBrowse:Down()
|
|
|
|
CASE nKey == K_UP
|
|
oBrowse:Up()
|
|
|
|
CASE nKey == K_LEFT
|
|
oBrowse:Left()
|
|
|
|
CASE nKey == K_RIGHT
|
|
oBrowse:Right()
|
|
|
|
CASE nKey == K_PGDN
|
|
oBrowse:pageDown()
|
|
lRefAll := .T.
|
|
|
|
CASE nKey == K_PGUP
|
|
oBrowse:pageUp()
|
|
lRefAll := .T.
|
|
|
|
CASE nKey == K_CTRL_PGUP
|
|
oBrowse:goTop()
|
|
lRefAll := .T.
|
|
|
|
CASE nKey == K_CTRL_PGDN
|
|
oBrowse:goBottom()
|
|
lRefAll := .T.
|
|
|
|
CASE nKey == K_HOME
|
|
oBrowse:home()
|
|
|
|
CASE nKey == K_END
|
|
oBrowse:end()
|
|
|
|
CASE nKey == K_CTRL_LEFT
|
|
oBrowse:panLeft()
|
|
|
|
CASE nKey == K_CTRL_RIGHT
|
|
oBrowse:panRight()
|
|
|
|
CASE nKey == K_CTRL_HOME
|
|
oBrowse:panHome()
|
|
|
|
CASE nKey == K_CTRL_END
|
|
oBrowse:panEnd()
|
|
|
|
CASE nKey == K_MWBACKWARD
|
|
oBrowse:down()
|
|
|
|
CASE nKey == K_MWFORWARD
|
|
oBrowse:up()
|
|
|
|
CASE nKey == K_SBTHUMBTRACKVERT
|
|
ordKeyGoto( oWvtBrw:oVBar:GetPos() )
|
|
lRefAll := .T.
|
|
|
|
CASE nKey == K_SBTHUMBTRACKHORZ
|
|
oBrowse:ColPos := oWvtBrw:oHBar:GetPos()
|
|
|
|
CASE nKey == K_SBLINEUP
|
|
oBrowse:up()
|
|
|
|
CASE nKey == K_SBLINEDOWN
|
|
oBrowse:down()
|
|
|
|
CASE nKey == K_SBPAGEUP
|
|
oBrowse:pageUp()
|
|
|
|
CASE nKey == K_SBPAGEDOWN
|
|
oBrowse:pageDown()
|
|
|
|
CASE nKey == K_SBLINELEFT
|
|
oBrowse:Left()
|
|
|
|
CASE nKey == K_SBLINERIGHT
|
|
oBrowse:Right()
|
|
|
|
CASE nKey == K_SBPAGELEFT
|
|
oBrowse:Left()
|
|
|
|
CASE nKey == K_SBPAGERIGHT
|
|
oBrowse:Right()
|
|
|
|
OTHERWISE
|
|
lRet := .F.
|
|
|
|
ENDCASE
|
|
|
|
IF lRet
|
|
IF lRefAll
|
|
oBrowse:refreshAll()
|
|
ENDIF
|
|
oBrowse:forceStable()
|
|
|
|
oWvtBrw:oVBar:SetPos( ordKeyCount(), ordKeyNo() )
|
|
oWvtBrw:oHBar:SetPos( oBrowse:ColCount, oBrowse:ColPos )
|
|
ENDIF
|
|
|
|
RETURN lRet
|
|
|
|
FUNCTION ConfigBrowser( aFields, cUseAlias, aTLBR, cDesc, oParent, cColorSpec, nID )
|
|
|
|
LOCAL info_, oWvtBrw, oBrowse, i, bBlock
|
|
LOCAL aPopup := {}
|
|
|
|
AAdd( aPopup, { "Down" , {|| oBrowse:Down() , oBrowse:ForceStable() } } )
|
|
AAdd( aPopup, { "Up" , {|| oBrowse:Up() , oBrowse:ForceStable() } } )
|
|
AAdd( aPopup, { "Page Down", {|| oBrowse:PageDown(), oBrowse:ForceStable() } } )
|
|
AAdd( aPopup, { "Page Up" , {|| oBrowse:PageUp() , oBrowse:ForceStable() } } )
|
|
AAdd( aPopup, { "Top" , {|| oBrowse:GoTop() , oBrowse:ForceStable() } } )
|
|
AAdd( aPopup, { "Bottom" , {|| oBrowse:GoBottom(), oBrowse:ForceStable() } } )
|
|
|
|
Select( cUseAlias )
|
|
info_ := dbStruct()
|
|
|
|
oBrowse := TBrowseWvg():New( aTLBR[ 1 ], aTLBR[ 2 ], aTLBR[ 3 ], aTLBR[ 4 ] )
|
|
|
|
oBrowse:ColSep := " "
|
|
oBrowse:HeadSep := "__"
|
|
oBrowse:ColorSpec := cColorSpec
|
|
oBrowse:GoTopBlock := {|| dbGoTop() }
|
|
oBrowse:GoBottomBlock := {|| dbGoBottom() }
|
|
oBrowse:SkipBlock := {| nSkip | dbSkipBlock( nSkip, oBrowse ) }
|
|
|
|
FOR i := 1 TO Len( aFields )
|
|
bBlock := VouBlockField( aFields[ i ] )
|
|
oBrowse:AddColumn( TBColumnNew( info_[ aFields[ i ], 1 ], bBlock ) )
|
|
NEXT
|
|
|
|
oBrowse:configure()
|
|
|
|
oWvtBrw := WvtBrowse():New( oParent, nID )
|
|
|
|
oWvtBrw:nTop := aTLBR[ 1 ]
|
|
oWvtBrw:nLeft := aTLBR[ 2 ]
|
|
oWvtBrw:nBottom := aTLBR[ 3 ]
|
|
oWvtBrw:nRight := aTLBR[ 4 ]
|
|
oWvtBrw:cAlias := cUseAlias
|
|
oWvtBrw:oBrw := oBrowse
|
|
oWvtBrw:cDesc := cDesc
|
|
oWvtBrw:nPointer := WVT_IDC_HAND
|
|
oWvtBrw:cColorHilite := "W+/B*"
|
|
oWvtBrw:Tooltip := cDesc
|
|
oWvtBrw:aPopup := aPopup
|
|
|
|
oWvtBrw:bHandleEvent := {| oWvtBrw, cPaintID, oBrowse, nKey | BrwOnEvent( oWvtBrw, cPaintID, oBrowse, nKey ) }
|
|
|
|
RETURN oWvtBrw
|