Ola!
#include "hwgui.ch"
Function Test()
Local oDlg, oBrw, oBtnOk, oStyle := HStyle():New( { 0xffffff, 0xbbbbbb }, 1 ), oPen
Local aSample := { {"Alex",17,12600}, {"Victor",42,1600}, {"Pyotr",56,45500}, ;
{"Sergei",28,14800}, {"Ivan",26,21300} }
Local bCol1 := {|o,h,x1,y1,x2,y2|
oStyle:Draw( h,x1,y1,x2,y2 )
RETURN Nil
}
Local bBack := {|o,h,x1,y1,x2,y2,n|
Local y := y1 + Int( (y2-y1)/2 )
// Draw a column header background
hwg_Fillrect( h, x1, y1, x2, y, oBrw:brush:handle )
oStyle:Draw( h, x1, y, x2, y2 )
IF n == 4
// While drawing the 4-th column header output a "Super header" for 3-th and 4-th columns
hwg_Settransparentmode( h, .T. )
hwg_Drawtext( h, "Some data", x1-oBrw:aColumns[3]:width, y1 + 2, x2, y-2, DT_CENTER )
hwg_Settransparentmode( h, .F. )
ENDIF
RETURN Nil
}
Local bDrawOrd := {|o,h,x1,y1,x2,y2|
IF o:cargo == 1
// if sorted ascending
hwg_Selectobject( h, oPen:handle )
hwg_DrawLine( h, x2-16, y2-14, x2-12, y2-8 )
hwg_DrawLine( h, x2-12, y2-8, x2-8, y2-14 )
ELSEIF o:cargo == 2
// if sorted descending
hwg_Selectobject( h, oPen:handle )
hwg_DrawLine( h, x2-16, y2-8, x2-12, y2-14 )
hwg_DrawLine( h, x2-12, y2-14, x2-8, y2-8 )
ENDIF
RETURN Nil
}
oPen := HPen():Add( BS_SOLID, 2, 0 )
INIT DIALOG oDlg TITLE "Browse" ;
AT 0, 0 SIZE 380, 300 BACKCOLOR 0xeeeeee;
FONT HFont():Add( "MS Sans Serif",0,-15 )
@ 20,16 SAY "Press on a column head to change order" SIZE 340,24 ;
TRANSPARENT STYLE DT_CENTER COLOR 8404992
@ 20,40 BROWSE oBrw ARRAY SIZE 340,200 STYLE WS_BORDER + WS_VSCROLL ;
ON SIZE ANCHOR_TOPABS + ANCHOR_LEFTABS + ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS
oBrw:oStyleHead := oStyle
oBrw:bcolorSel := 0xeeeeee
oBrw:tcolorSel := 0
oBrw:aArray := aSample
// Increase Left, top and bottom padding
oBrw:aPadding[1] := oBrw:aPadding[2] := oBrw:aPadding[4] := 8
oBrw:aHeadPadding[2] := oBrw:aHeadPadding[4] := 4
//First column we draw ourselves, using the nCol1 codeblock, so we may to not set the
// column codeblock.
oBrw:AddColumn( HColumn():New( "",,"C",2,0 ) )
oBrw:aColumns[1]:setPaintCB( PAINT_LINE_ALL, bCol1 )
oBrw:AddColumn( HColumn():New( "Name",{|v,o|o:aArray[o:nCurrent,1]},"C",16,0 ) )
oBrw:AddColumn( HColumn():New( ";Age",{|v,o|o:aArray[o:nCurrent,2]},"N",6,0 ) )
oBrw:AddColumn( HColumn():New( ";Salary",{|v,o|o:aArray[o:nCurrent,3]},"N",8,0 ) )
oBrw:aColumns[3]:cGrid := "W;WN"
oBrw:aColumns[4]:cGrid := "E;WEN"
// Add a codeblock to draw column hraders bacground
oBrw:aColumns[3]:setPaintCB( PAINT_HEAD_BACK, bBack )
oBrw:aColumns[4]:setPaintCB( PAINT_HEAD_BACK, bBack )
// Add a codeblock to draw the current order
oBrw:aColumns[2]:setPaintCB( PAINT_HEAD_ITEM, bDrawOrd )
oBrw:aColumns[3]:setPaintCB( PAINT_HEAD_ITEM, bDrawOrd )
oBrw:aColumns[4]:setPaintCB( PAINT_HEAD_ITEM, bDrawOrd )
// Set a codeblock to change order
oBrw:aColumns[2]:bHeadClick := oBrw:aColumns[3]:bHeadClick := ;
oBrw:aColumns[4]:bHeadClick := {|o,n|onHeadClick(o,n)}
// The :cargo variable exists in all HwGUI objects and isn't used by HwGUI itself.
// You may use it as you need in your programs.
// We use the column's :cargo here to keep info about the current order:
// 0 - not sorted by this column, 1 - sorted ascending, 2 - sorted descending
oBrw:aColumns[2]:cargo := oBrw:aColumns[3]:cargo := oBrw:aColumns[4]:cargo := 0
@ 128,260 OWNERBUTTON oBtnOk SIZE 100,32 ;
TEXT "Ok" ;
ON SIZE ANCHOR_LEFTABS + ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS ;
ON CLICK {||hwg_EndDialog()}
oBtnOk:aStyle := { HStyle():New( {0xffffff,0xdddddd}, 1,, 1 ), ;
HStyle():New( {0xffffff,0xdddddd}, 2,, 1 ), ;
HStyle():New( {0xffffff,0xdddddd}, 1,, 2, 8421440 ) }
ACTIVATE DIALOG oDlg
oPen:Release()
Return Nil
Function onHeadClick( oBrw, nCol )
Local no := Ascan( oBrw:aColumns, {|o|o:cargo>0}, 2 )
// no is an index of a column, used in sorting
IF no == 0
oBrw:aColumns[nCol]:cargo := 1
ELSEIF no == nCol
IF oBrw:aColumns[no]:cargo == 1
oBrw:aColumns[no]:cargo := 2
ELSE
oBrw:aColumns[no]:cargo := 1
ENDIF
ELSE
oBrw:aColumns[no]:cargo := 0
oBrw:aColumns[nCol]:cargo := 1
ENDIF
no := nCol
nCol --
IF oBrw:aColumns[no]:cargo == 1
oBrw:aArray := ASort( oBrw:aArray,,, {|z,y| z[nCol] < y[nCol] } )
ELSE
oBrw:aArray := ASort( oBrw:aArray,,, {|z,y| z[nCol] > y[nCol] } )
ENDIF
oBrw:Refresh()
Return Nil
Saudações,
Itamar M. Lins Jr.