File: n_svc_lv.sru
Size: 41623
Date: Mon, 07 Apr 2008 21:31:15 +0200
$PBExportHeader$n_svc_lv.sru
$PBExportComments$Listview Service
forward
global type n_svc_lv from n_svc_base
end type
type struc_coldef from structure within n_svc_lv
end type
end forward

type struc_coldef from structure
   string      columnname
   string      datatype
   string      headertext
   integer     width
   integer     x
   integer     alignment
end type

global type n_svc_lv from n_svc_base
end type
global n_svc_lv n_svc_lv

type prototypes
FUNCTION long Header_GetSetItem(long hWnd, long uMsg, long wParam, ref hditem lpst) Library "user32" Alias For "SendMessageW"
end prototypes

type variables
Protected:

CONSTANT string VIEW_LARGE_ICON = "listviewlargeicon!"
CONSTANT string VIEW_SMALL_ICON = "listviewsmallicon!"
CONSTANT string VIEW_LIST = "listviewlist!"
CONSTANT string VIEW_DETAIL = "listviewreport!"

CONSTANT long LVM_FIRST = 4096
CONSTANT long LVN_FIRST = -100

CONSTANT long SORT_ASCENDING = 133
CONSTANT long SORT_DESCENDING = 134
CONSTANT long GWL_STYLE = -16

Constant long HDM_FIRST = 4608 //&H1200
Constant long HDM_GETITEMA = (HDM_FIRST + 3)
Constant long HDM_SETITEMA = (HDM_FIRST + 4)
Constant long HDM_GETITEMW = (HDM_FIRST + 11)
Constant long HDM_SETITEMW = (HDM_FIRST + 12)
Constant long HDM_GETITEM = HDM_GETITEMW
Constant long HDM_SETITEM = HDM_SETITEMW
Constant long HDM_SETIMAGELIST = (HDM_FIRST + 8)
Constant long HDM_GETITEMCOUNT = (HDM_FIRST + 0)
Constant long HDM_ORDERTOINDEX = (HDM_FIRST + 15)

CONSTANT long HDS_HOTTRACK = 4 //0x0004

Constant long HDI_FORMAT = 4
Constant long HDI_IMAGE = 32

Constant long HDF_LEFT = 0
Constant long HDF_RIGHT = 1
Constant long HDF_IMAGE = 2048 //&H800
Constant long HDF_BITMAP_ON_RIGHT = 4096 //&H1000
Constant long HDF_STRING = 16384 //&H4000
Constant long HDF_SORTDOWN = //&H200
Constant long HDF_SORTUP = //&H400
Constant long HDF_NOSORT = 61951
Constant long HDF_SORTED = 1536

Constant long HDI_WIDTH = 1
Constant long HDI_HEIGHT = HDI_WIDTH
Constant long HDI_TEXT = 2
Constant long HDI_LPARAM = 8
Constant long HDI_BITMAP = 16

CONSTANT long LVS_ICON                = 0 // 0x0000
CONSTANT long LVS_REPORT              = 1 // 0x0001
CONSTANT long LVS_SMALLICON           = 2 // 0x0002
CONSTANT long LVS_LIST                = 3 // 0x0003
CONSTANT long LVS_TYPEMASK            = 3 // 0x0003
CONSTANT long LVS_SINGLESEL           = 4 // 0x0004
CONSTANT long LVS_SHOWSELALWAYS       = 8 // 0x0008
CONSTANT long LVS_SORTASCENDING       = 16 // 0x0010
CONSTANT long LVS_SORTDESCENDING      = 32 // 0x0020
CONSTANT long LVS_SHAREIMAGELISTS     = 64 // 0x0040
CONSTANT long LVS_NOLABELWRAP         = 128 // 0x0080
CONSTANT long LVS_AUTOARRANGE         = 256 // 0x0100
CONSTANT long LVS_EDITLABELS          = 512 // 0x0200
CONSTANT long LVS_OWNERDATA           = 4096 // 0x1000
CONSTANT long LVS_NOSCROLL            = 8192 // 0x2000
CONSTANT long LVS_TYPESTYLEMASK       = 64512 // 0xfc00
CONSTANT long LVS_ALIGNTOP            = 0 // 0x0000
CONSTANT long LVS_ALIGNLEFT           = 2048 // 0x0800
CONSTANT long LVS_ALIGNMASK           = 3072 // 0x0c00
CONSTANT long LVS_OWNERDRAWFIXED      = 1024 // 0x0400
CONSTANT long LVS_NOCOLUMNHEADER      = 16384 // 0x4000
CONSTANT long LVS_NOSORTHEADER        = 32768 // 0x8000

CONSTANT long LVM_GETBKCOLOR          = (LVM_FIRST + 0)
CONSTANT long LVM_SETBKCOLOR          = (LVM_FIRST + 1)
CONSTANT long LVM_GETIMAGELIST        = (LVM_FIRST + 2)
CONSTANT long LVM_SETIMAGELIST        = (LVM_FIRST + 3)
CONSTANT long LVM_GETITEMCOUNT        = (LVM_FIRST + 4)

CONSTANT long LVSIL_NORMAL            = 0
CONSTANT long LVSIL_SMALL             = 1
CONSTANT long LVSIL_STATE             = 2

CONSTANT long LVIF_TEXT               = 1 // 0x0001
CONSTANT long LVIF_IMAGE              = 2 // 0x0002
CONSTANT long LVIF_PARAM              = 4 // 0x0004
CONSTANT long LVIF_STATE              = 8 // 0x0008
CONSTANT long LVIF_INDENT             = 16 // 0x0010
CONSTANT long LVIF_NORECOMPUTE        = 2048 // 0x0800

CONSTANT long LVIS_FOCUSED            = 1 // 0x0001
CONSTANT long LVIS_SELECTED           = 2 // 0x0002
CONSTANT long LVIS_CUT                = 4 // 0x0004
CONSTANT long LVIS_DROPHILITED        = 8 // 0x0008
CONSTANT long LVIS_ACTIVATING         = 32 // 0x0020
CONSTANT long LVIS_OVERLAYMASK        = 3840 // 0x0F00
CONSTANT long LVIS_STATEIMAGEMASK     = 61440 // 0xF000

CONSTANT long LVM_GETITEMA            = (LVM_FIRST + 5)
CONSTANT long LVM_GETITEMW            = (LVM_FIRST + 75)
CONSTANT long LVM_GETITEM             = LVM_GETITEMA
CONSTANT long LVM_SETITEMA            = (LVM_FIRST + 6)
CONSTANT long LVM_SETITEMW            = (LVM_FIRST + 76)
CONSTANT long LVM_SETITEM             = LVM_SETITEMA
CONSTANT long LVM_INSERTITEMA         = (LVM_FIRST + 7)
CONSTANT long LVM_INSERTITEMW         = (LVM_FIRST + 77)
CONSTANT long LVM_INSERTITEM          = LVM_INSERTITEMA
CONSTANT long LVM_DELETEITEM          = (LVM_FIRST + 8)
CONSTANT long LVM_DELETEALLITEMS      = (LVM_FIRST + 9)
CONSTANT long LVM_GETCALLBACKMASK     = (LVM_FIRST + 10)
CONSTANT long LVM_SETCALLBACKMASK     = (LVM_FIRST + 11)
CONSTANT long LVM_GETNEXTITEM         = (LVM_FIRST + 12)
CONSTANT long LVM_FINDITEMA           = (LVM_FIRST + 13)
CONSTANT long LVM_FINDITEMW           = (LVM_FIRST + 83)
CONSTANT long  LVM_FINDITEM           = LVM_FINDITEMA
CONSTANT long LVM_GETITEMRECT         = (LVM_FIRST + 14)
CONSTANT long LVM_SETITEMPOSITION     = (LVM_FIRST + 15)
CONSTANT long LVM_GETITEMPOSITION     = (LVM_FIRST + 16)
CONSTANT long LVM_GETSTRINGWIDTHA     = (LVM_FIRST + 17)
CONSTANT long LVM_GETSTRINGWIDTHW     = (LVM_FIRST + 87)
CONSTANT long  LVM_GETSTRINGWIDTH     = LVM_GETSTRINGWIDTHA
CONSTANT long LVM_HITTEST             = (LVM_FIRST + 18)
CONSTANT long LVM_ENSUREVISIBLE       = (LVM_FIRST + 19)
CONSTANT long LVM_SCROLL              = (LVM_FIRST + 20)
CONSTANT long LVM_REDRAWITEMS         = (LVM_FIRST + 21)
CONSTANT long LVM_ARRANGE             = (LVM_FIRST + 22)
CONSTANT long LVM_EDITLABELA          = (LVM_FIRST + 23)
CONSTANT long LVM_EDITLABELW          = (LVM_FIRST + 118)
CONSTANT long LVM_EDITLABEL           = LVM_EDITLABELA
CONSTANT long LVM_GETEDITCONTROL      = (LVM_FIRST + 24)
CONSTANT long LVM_GETCOLUMNA          = (LVM_FIRST + 25)
CONSTANT long LVM_GETCOLUMNW          = (LVM_FIRST + 95)
CONSTANT long  LVM_GETCOLUMN          = LVM_GETCOLUMNA
CONSTANT long LVM_SETCOLUMNA          = (LVM_FIRST + 26)
CONSTANT long LVM_SETCOLUMNW          = (LVM_FIRST + 96)
CONSTANT long  LVM_SETCOLUMN          = LVM_SETCOLUMNA
CONSTANT long LVM_INSERTCOLUMNA       = (LVM_FIRST + 27)
CONSTANT long LVM_INSERTCOLUMNW       = (LVM_FIRST + 97)
CONSTANT long LVM_INSERTCOLUMN        = LVM_INSERTCOLUMNA
CONSTANT long LVM_DELETECOLUMN        = (LVM_FIRST + 28)
CONSTANT long LVM_GETCOLUMNWIDTH      = (LVM_FIRST + 29)
CONSTANT long LVM_CREATEDRAGIMAGE     = (LVM_FIRST + 33)
CONSTANT long LVM_GETVIEWRECT         = (LVM_FIRST + 34)
CONSTANT long LVM_GETTEXTCOLOR        = (LVM_FIRST + 35)
CONSTANT long LVM_SETTEXTCOLOR        = (LVM_FIRST + 36)
CONSTANT long LVM_GETTEXTBKCOLOR      = (LVM_FIRST + 37)
CONSTANT long LVM_SETTEXTBKCOLOR      = (LVM_FIRST + 38)
CONSTANT long LVM_GETTOPINDEX         = (LVM_FIRST + 39)
CONSTANT long LVM_GETCOUNTPERPAGE     = (LVM_FIRST + 40)
CONSTANT long LVM_GETORIGIN           = (LVM_FIRST + 41)
CONSTANT long LVM_UPDATE              = (LVM_FIRST + 42)
CONSTANT long LVM_SETITEMSTATE        = (LVM_FIRST + 43)
CONSTANT long LVM_GETITEMSTATE        = (LVM_FIRST + 44)
CONSTANT long LVM_GETITEMTEXTA        = (LVM_FIRST + 45)
CONSTANT long LVM_GETITEMTEXTW        = (LVM_FIRST + 115)
CONSTANT long  LVM_GETITEMTEXT        = LVM_GETITEMTEXTA
CONSTANT long LVM_SETITEMTEXTA        = (LVM_FIRST + 46)
CONSTANT long LVM_SETITEMTEXTW        = (LVM_FIRST + 116)
CONSTANT long  LVM_SETITEMTEXT        = LVM_SETITEMTEXTA
CONSTANT long LVN_GETINFOTIPA          = (LVN_FIRST - 57)
CONSTANT long LVN_GETINFOTIPW          = (LVN_FIRST - 58)
CONSTANT long LVN_GETINFOTIP          = LVN_GETINFOTIPA

CONSTANT long LVNI_ALL                = 0 // 0x0000
CONSTANT long LVNI_FOCUSED            = 1 // 0x0001
CONSTANT long LVNI_SELECTED           = 2 // 0x0002
CONSTANT long LVNI_CUT                = 4 // 0x0004
CONSTANT long LVNI_DROPHILITED        = 16 // 0x0008
CONSTANT long LVNI_ABOVE              = 256 // 0x0100
CONSTANT long LVNI_BELOW              = 512 // 0x0200
CONSTANT long LVNI_TOLEFT             = 1024 // 0x0400
CONSTANT long LVNI_TORIGHT            = 2048 // 0x0800

CONSTANT long LVFI_PARAM              = 1 // 0x0001
CONSTANT long LVFI_STRING             = 2 // 0x0002
CONSTANT long LVFI_PARTIAL            = 8 // 0x0008
CONSTANT long LVFI_WRAP               = 32 // 0x0020
CONSTANT long LVFI_NEARESTXY          = 64 // 0x0040

CONSTANT long LVIR_BOUNDS             = 0
CONSTANT long LVIR_ICON               = 1
CONSTANT long LVIR_LABEL              = 2
CONSTANT long LVIR_SELECTBOUNDS       = 3

CONSTANT long LVHT_NOWHERE            = 1 // 0x0001
CONSTANT long LVHT_ONITEMICON         = 2 // 0x0002
CONSTANT long LVHT_ONITEMLABEL        = 4 // 0x0004
CONSTANT long LVHT_ONITEMSTATEICON    = 8 // 0x0008
CONSTANT long LVHT_ONITEM             = (LVHT_ONITEMICON + LVHT_ONITEMLABEL + LVHT_ONITEMSTATEICON)

CONSTANT long LVHT_ABOVE              = 8 // 0x0008
CONSTANT long LVHT_BELOW              = 16 // 0x0010
CONSTANT long LVHT_TORIGHT            = 32 // 0x0020
CONSTANT long LVHT_TOLEFT             = 64 // 0x0040

CONSTANT long LVA_DEFAULT             = 0 // 0x0000
CONSTANT long LVA_ALIGNLEFT           = 1 // 0x0001
CONSTANT long LVA_ALIGNTOP            = 2 // 0x0002
CONSTANT long LVA_SNAPTOGRID          = 5 // 0x0005

CONSTANT long LVCF_FMT                = 1 // 0x0001
CONSTANT long LVCF_WIDTH              = 2 // 0x0002
CONSTANT long LVCF_TEXT               = 4 // 0x0004
CONSTANT long LVCF_SUBITEM            = 8 // 0x0008
CONSTANT long LVCF_IMAGE              = 16 // 0x0010
CONSTANT long LVCF_ORDER              = 32 // 0x0020

CONSTANT long LVCFMT_LEFT             = 0 // 0x0000
CONSTANT long LVCFMT_RIGHT            = 1 // 0x0001
CONSTANT long LVCFMT_CENTER           = 2 // 0x0002
CONSTANT long LVCFMT_JUSTIFYMASK      = 3 // 0x0003
CONSTANT long LVCFMT_IMAGE            = 2048 // 0x0800
CONSTANT long LVCFMT_BITMAP_ON_RIGHT  = 4096 // 0x1000
CONSTANT long LVCFMT_COL_HAS_IMAGES   = 32768 // 0x8000

CONSTANT long LVSCW_AUTOSIZE              = -1
CONSTANT long LVSCW_AUTOSIZE_USEHEADER    = -2
CONSTANT long LVM_SETCOLUMNWIDTH          = (LVM_FIRST + 30)
CONSTANT long LVM_GETHEADER               = (LVM_FIRST + 31)

CONSTANT long LVSICF_NOINVALIDATEALL  = 1 // 0x00000001
CONSTANT long LVSICF_NOSCROLL         = 2 // 0x00000002

CONSTANT long LVM_SETITEMCOUNT        = (LVM_FIRST + 47)
CONSTANT long LVM_SORTITEMS           = (LVM_FIRST + 48)
CONSTANT long LVM_SETITEMPOSITION32   = (LVM_FIRST + 49)
CONSTANT long LVM_GETSELECTEDCOUNT    = (LVM_FIRST + 50)
CONSTANT long LVM_GETITEMSPACING      = (LVM_FIRST + 51)
CONSTANT long LVM_GETISEARCHSTRINGA   = (LVM_FIRST + 52)
CONSTANT long LVM_GETISEARCHSTRINGW   = (LVM_FIRST + 117)
CONSTANT long LVM_GETISEARCHSTRING    = LVM_GETISEARCHSTRINGW
CONSTANT long LVM_SETICONSPACING      = (LVM_FIRST + 53)
CONSTANT long LVM_SETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 54)   // optional wParam == mask
CONSTANT long LVM_GETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 55)

CONSTANT long LVS_EX_GRIDLINES        = 1 // 0x00000001
CONSTANT long LVS_EX_SUBITEMIMAGES    = 2 // 0x00000002
CONSTANT long LVS_EX_CHECKBOXES       = 4 // 0x00000004
CONSTANT long LVS_EX_TRACKSELECT      = 8 // 0x00000008
CONSTANT long LVS_EX_HEADERDRAGDROP   = 16 // 0x00000010
CONSTANT long LVS_EX_FULLROWSELECT    = 32 // 0x00000020 // applies to report mode only
CONSTANT long LVS_EX_ONECLICKACTIVATE = 64 // 0x00000040
CONSTANT long LVS_EX_TWOCLICKACTIVATE = 128 // 0x00000080

CONSTANT long LVS_EX_FLATSB           = 256 // 0x00000100
CONSTANT long LVS_EX_REGIONAL         = 512 // 0x00000200
CONSTANT long LVS_EX_INFOTIP          = 1024 // 0x00000400 // u_lv does InfoTips for you
CONSTANT long LVS_EX_UNDERLINEHOT     = 2048 // 0x00000800
CONSTANT long LVS_EX_UNDERLINECOLD    = 4096 // 0x00001000
CONSTANT long LVS_EX_MULTIWORKAREAS   = 8192 // 0x00002000

CONSTANT long LVM_GETSUBITEMRECT      = (LVM_FIRST + 56)
CONSTANT long LVM_SUBITEMHITTEST      = (LVM_FIRST + 57)
CONSTANT long LVM_SETCOLUMNORDERARRAY = (LVM_FIRST + 58)
CONSTANT long LVM_GETCOLUMNORDERARRAY = (LVM_FIRST + 59)
CONSTANT long LVM_SETHOTITEM  = (LVM_FIRST + 60)
CONSTANT long LVM_GETHOTITEM  = (LVM_FIRST + 61)
CONSTANT long LVM_SETHOTCURSOR  = (LVM_FIRST + 62)
CONSTANT long LVM_GETHOTCURSOR  = (LVM_FIRST + 63)
CONSTANT long LVM_APPROXIMATEVIEWRECT = (LVM_FIRST + 64)
CONSTANT long LV_MAX_WORKAREAS         = 16                          
CONSTANT long LVM_SETWORKAREAS         = (LVM_FIRST + 65)
CONSTANT long LVM_GETWORKAREAS        = (LVM_FIRST + 70)
CONSTANT long LVM_GETNUMBEROFWORKAREAS  = (LVM_FIRST + 73)
CONSTANT long LVM_GETSELECTIONMARK    = (LVM_FIRST + 66)
CONSTANT long LVM_SETSELECTIONMARK    = (LVM_FIRST + 67)
CONSTANT long LVM_SETHOVERTIME        = (LVM_FIRST + 71)
CONSTANT long LVM_GETHOVERTIME        = (LVM_FIRST + 72)
CONSTANT long LVM_SETTOOLTIPS       = (LVM_FIRST + 74)
CONSTANT long LVM_GETTOOLTIPS       = (LVM_FIRST + 78)

CONSTANT long LVBKIF_SOURCE_NONE      = 0 // 0x00000000
CONSTANT long LVBKIF_SOURCE_HBITMAP   = 1 // 0x00000001
CONSTANT long LVBKIF_SOURCE_URL       = 2 // 0x00000002
CONSTANT long LVBKIF_SOURCE_MASK      = 3 // 0x00000003
CONSTANT long LVBKIF_STYLE_NORMAL     = 0 // 0x00000000
CONSTANT long LVBKIF_STYLE_TILE       = 16 // 0x00000010
CONSTANT long LVBKIF_STYLE_MASK       = 16 // 0x00000010

CONSTANT long LVM_SETBKIMAGEA         = (LVM_FIRST + 68)
CONSTANT long LVM_SETBKIMAGEW         = (LVM_FIRST + 138)
CONSTANT long LVM_GETBKIMAGEA         = (LVM_FIRST + 69)
CONSTANT long LVM_GETBKIMAGEW         = (LVM_FIRST + 139)

CONSTANT long LVM_SETBKIMAGE          = LVM_SETBKIMAGEA
CONSTANT long LVM_GETBKIMAGE          = LVM_GETBKIMAGEA

CONSTANT long LVKF_ALT       = 1 // 0x0001
CONSTANT long LVKF_CONTROL   = 2 // 0x0002
CONSTANT long LVKF_SHIFT     = 4 // 0x0004

CONSTANT long LVN_ITEMCHANGING        = (LVN_FIRST - 0)
CONSTANT long LVN_ITEMCHANGED         = (LVN_FIRST - 1)
CONSTANT long LVN_INSERTITEM          = (LVN_FIRST - 2)
CONSTANT long LVN_DELETEITEM          = (LVN_FIRST - 3)
CONSTANT long LVN_DELETEALLITEMS      = (LVN_FIRST - 4)
CONSTANT long LVN_BEGINLABELEDITA     = (LVN_FIRST - 5)
CONSTANT long LVN_BEGINLABELEDITW     = (LVN_FIRST - 75)
CONSTANT long LVN_ENDLABELEDITA       = (LVN_FIRST - 6)
CONSTANT long LVN_ENDLABELEDITW       = (LVN_FIRST - 76)
CONSTANT long LVN_COLUMNCLICK         = (LVN_FIRST - 8)
CONSTANT long LVN_BEGINDRAG           = (LVN_FIRST - 9)
CONSTANT long LVN_BEGINRDRAG          = (LVN_FIRST - 11)

CONSTANT long LVN_ODCACHEHINT         = (LVN_FIRST - 13)
CONSTANT long LVN_ODFINDITEMA         = (LVN_FIRST - 52)
CONSTANT long LVN_ODFINDITEMW         = (LVN_FIRST - 79)

CONSTANT long LVN_ITEMACTIVATE        = (LVN_FIRST - 14)
CONSTANT long LVN_ODSTATECHANGED      = (LVN_FIRST - 15)

CONSTANT long LVN_ODFINDITEM          = LVN_ODFINDITEMA

CONSTANT long LVN_HOTTRACK            = (LVN_FIRST - 21)

CONSTANT long LVN_GETDISPINFOA        = (LVN_FIRST - 50)
CONSTANT long LVN_GETDISPINFOW        = (LVN_FIRST - 77)
CONSTANT long LVN_SETDISPINFOA        = (LVN_FIRST - 51)
CONSTANT long LVN_SETDISPINFOW        = (LVN_FIRST - 78)

CONSTANT long LVN_BEGINLABELEDIT      = LVN_BEGINLABELEDITW
CONSTANT long LVN_ENDLABELEDIT        = LVN_ENDLABELEDITW
CONSTANT long LVN_GETDISPINFO         = LVN_GETDISPINFOW
CONSTANT long LVN_SETDISPINFO         = LVN_SETDISPINFOW

CONSTANT long LVIF_DI_SETITEM         = 4096 // 0x1000

CONSTANT long LVN_KEYDOWN             = (LVN_FIRST - 55)
CONSTANT long LVN_MARQUEEBEGIN        = (LVN_FIRST - 56)

CONSTANT long LVGIT_UNFOLDED  = 1 // 0x0001

end variables

forward prototypes
protected function integer of_getcolumndefs (ref n_svc_mgr anv_svc, readonly datastore ads_source, ref struc_coldef astr[])
public function integer of_deleteselected (listview alv)
protected subroutine of_toggleselect (ref n_svc_mgr anv_svc, readonly listview alv, readonly integer ai_on)
public subroutine of_deselectall (ref n_svc_mgr anv_svc, readonly listview alv)
public function long of_selectall (ref n_svc_mgr anv_svc, readonly listview alv)
public subroutine of_ensurevisible (ref n_svc_mgr anv_svc, readonly listview alv, readonly long al_index)
public function integer of_finditem (ref n_svc_mgr anv_svc, readonly listview alv, ref listviewitem alvi_ret, readonly string as_searchstring, readonly boolean ab_scrolltoitem, readonly boolean ab_selectitem)
public function string of_getcolumnwidths (readonly listview alv)
public function long of_getfocuseditem (readonly listview alv)
public function long of_getselecteditem (readonly listview alv)
public function long of_insertrow (ref n_svc_mgr anv_svc, readonly listview alv, readonly datastore ads, readonly long alrow, readonly listviewitem alvi, readonly string as_datacolumn, readonly string as_iconcolumn)
public function long of_insertrow (ref n_svc_mgr anv_svc, readonly listview alv, readonly datastore ads, readonly long al_row)
public function long of_insertrow (ref n_svc_mgr anv_svc, readonly listview alv, readonly datastore ads, readonly long al_row, readonly listviewitem alvi)
public function long of_selectinverse (readonly listview alv)
public subroutine of_setbackgroundimage (ref n_svc_mgr anv_svc, readonly listview alv, readonly string as_fullpath)
public subroutine of_setcolumnwidths (ref n_svc_mgr anv_svc, readonly listview alv, string as_widths)
public function string of_viewtostring (readonly listviewview alvv)
public function listviewview of_stringtoview (readonly string as_view)
public function string of_tostring (ref n_svc_mgr anv_svc, readonly listview alv)
public function integer of_userdefinedsort (readonly listview alv, readonly integer ai_col, readonly string as_datatype, readonly boolean ab_ascending, readonly integer ai_index1, readonly integer ai_index2)
public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly listviewitem alvi_template, readonly string as_datacolumn, readonly string as_iconcolumn, readonly powerobject apo_callback, readonly string as_callbackeventname)
public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly powerobject apo_callback, readonly string as_callbackeventname)
public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly listviewitem alvi_template, readonly powerobject apo_callback, readonly string as_callbackeventname)
public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination)
public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly listviewitem alvi_template)
public subroutine of_sortcolumn (ref n_svc_mgr anv_svc, readonly u_lv alv, readonly integer ai_column, readonly boolean ab_ascending)
protected subroutine of_sortcolumnicon (ref n_svc_mgr anv_svc, readonly listview alv, readonly integer ai_column, readonly boolean ab_ascending)
protected subroutine of_sortcolumnxp (ref n_svc_mgr anv_svc, readonly listview alv, readonly integer ai_column, readonly boolean ab_ascending)
public function long of_getlargeimagelist (readonly listview alv)
public function long of_getsmallimagelist (readonly listview alv)
public subroutine of_setlargeimagelist (readonly u_lv alv, readonly long al_himl)
public subroutine of_setsmallimagelist (readonly u_lv alv, readonly long al_himl)
public subroutine of_loadstandardimages (ref n_svc_mgr anv_svc, readonly u_lv alv)
public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly listviewitem alvi_template, readonly string as_iconcolumn)
end prototypes

protected function integer of_getcolumndefs (ref n_svc_mgr anv_svc, readonly datastore ads_source, ref struc_coldef astr[]);n_svc_dw lnv_dw
string ls_colnames[]
long ll_count, n
CONSTANT string DOUBLE_QUOTE = '"'

anv_svc.of_LoadSvc(lnv_dw, CSvc.DW)

//get column defs from datastore including computed fields
//make sure it's sorted by x location
ll_count = lnv_dw.of_GetVisibleColumns(anv_svc, ads_source, ls_colnames, TRUE, TRUE)

FOR n = 1 to ll_count
   astr[n].columnname = ls_colnames[n]
   astr[n].headertext = TRIM(ads_source.Describe(ls_colnames[n] + "_t" + ".text"))
   IF LEFT(astr[n].headertext, 1) = DOUBLE_QUOTE AND &
      RIGHT(astr[n].headertext, 1) = DOUBLE_QUOTE THEN
         astr[n].headertext = &
            MID(astr[n].headertext, 2, LEN(astr[n].headertext) - 2)
   END IF
   astr[n].x = INTEGER(ads_source.Describe(ls_colnames[n] + ".X"))
   astr[n].width = INTEGER(ads_source.Describe(ls_colnames[n] + ".Width"))
   astr[n].datatype = lnv_dw.of_GetColumnDatatype(ads_source, ls_colnames[n])
   astr[n].alignment = INTEGER(ads_source.Describe(ls_colnames[n] + ".Alignment"))
NEXT

RETURN ll_count
end function

public function integer of_deleteselected (listview alv);long lc, n, ctr
listviewitem llvi

lc = alv.TotalItems()

FOR n = 1 to lc
   alv.GetItem(n, llvi)
   IF llvi.Selected THEN
      alv.DeleteItem(n)
      n --
      lc --
      ctr ++
   END IF
NEXT

RETURN ctr
end function

protected subroutine of_toggleselect (ref n_svc_mgr anv_svc, readonly listview alv, readonly integer ai_on);n_svc_win32 lnv_win32
lvitem lv

CONSTANT INTEGER ALL_ITEMS = -1

anv_svc.of_LoadSvc(lnv_win32, CSvc.WIN32)

lv.mask = LVIF_STATE
lv.statemask = LVIS_SELECTED
lv.state = ai_on

lnv_win32.Sendlv(Handle(alv), LVM_SETITEMSTATE, ALL_ITEMS, lv)
end subroutine

public subroutine of_deselectall (ref n_svc_mgr anv_svc, readonly listview alv);of_ToggleSelect(anv_svc, alv, 0)
end subroutine

public function long of_selectall (ref n_svc_mgr anv_svc, readonly listview alv);of_ToggleSelect(anv_svc, alv, 1)

RETURN alv.TotalSelected()
end function

public subroutine of_ensurevisible (ref n_svc_mgr anv_svc, readonly listview alv, readonly long al_index);n_svc_win32 lnv_win32

anv_svc.of_LoadSvc(lnv_win32, CSvc.WIN32)

//Win32 uses zero-based array
lnv_win32.SendBoolean(Handle(alv), LVM_ENSUREVISIBLE, al_index - 1, FALSE)
end subroutine

public function integer of_finditem (ref n_svc_mgr anv_svc, readonly listview alv, ref listviewitem alvi_ret, readonly string as_searchstring, readonly boolean ab_scrolltoitem, readonly boolean ab_selectitem);long ll_bytes, ll_index
n_svc_win32 lnv_win32
lvfindinfo lstr_info

anv_svc.of_loadsvc(lnv_win32, CSvc.WIN32)

ll_bytes = LEN(TRIM(as_searchstring)) + //add byte

//set flags and string
lstr_info.flags = LVFI_PARTIAL
lstr_info.psz = lnv_win32.LocalAlloc(0 , ll_bytes)
lnv_win32.lstrcpy(lstr_info.psz, LEFT(as_searchstring, ll_bytes))

ll_index = lnv_win32.SendlvFindInfo(Handle(alv), LVM_FINDITEM, -1,  lstr_info)

lnv_win32.LocalFree(lstr_info.psz) //free memory

IF ll_index = CRet.FAILURE THEN RETURN CRet.FAILURE

//win32 uses zero-based index
ll_index += 1

//scroll the item
IF ab_scrolltoitem THEN
   of_EnsureVisible(anv_svc, alv, ll_index)
END IF
   
//select the item
IF ab_selectitem THEN
   alv.GetItem(ll_index, alvi_ret)
   alvi_ret.Selected = TRUE
   alv.SetItem(ll_index, alvi_ret)
END IF

RETURN ll_index
end function

public function string of_getcolumnwidths (readonly listview alv);string ls_ret, ls_label
alignment la
long ll_totcols, n
integer li_width

ll_totcols = alv.TotalColumns()
IF ll_totcols > 0 THEN
   FOR n = 1 to ll_totcols
      alv.GetColumn(n, ls_label, la, li_width)
      ls_ret += STRING(li_width)
      IF n < ll_totcols THEN ls_ret += CString.TAB
   NEXT
END IF

RETURN ls_ret
end function

public function long of_getfocuseditem (readonly listview alv);long lc, n
listviewitem llvi
Boolean lb

lc = alv.TotalItems()
FOR n = 1 to lc
   alv.GetItem(n, llvi)
   IF llvi.HasFocus THEN
      lb = TRUE
      EXIT
   END IF
NEXT
IF lb THEN 
   RETURN n
ELSE
   RETURN CRet.FAILURE
END IF
end function

public function long of_getselecteditem (readonly listview alv);long lc, n
listviewitem llvi
Boolean lb

lc = alv.TotalItems()
FOR n = 1 to lc
   alv.GetItem(n, llvi)
   IF llvi.Selected THEN
      lb = TRUE
      EXIT
   END IF
NEXT
IF lb THEN 
   RETURN n
ELSE
   RETURN CRet.FAILURE
END IF
end function

public function long of_insertrow (ref n_svc_mgr anv_svc, readonly listview alv, readonly datastore ads, readonly long alrow, readonly listviewitem alvi, readonly string as_datacolumn, readonly string as_iconcolumn);struc_coldef lstr[]
long lc, n
alignment la
string ls_label, ls_tmp
n_svc_dw lnv_dw

lc = this.of_getcolumndefs(anv_svc, ads, lstr)

anv_svc.of_loadsvc(lnv_dw, CSvc.DW)

//populate listview
ls_label = ""
FOR n = 1 to lc
   //checkbox style
   IF ads.Describe(lstr[n].columnname + ".Edit.style") = CDwedit.CHKBOX THEN
      IF lower(STRING(lnv_dw.of_getitemany(ads, alrow, lstr[n].columnname))) = lower(ads.Describe(lstr[n].columnname + ".Checkbox.On")) THEN
         ls_tmp = "Yes"
      ELSE
         ls_tmp = "No"
      END IF
   ELSE
      //get the display text
      ls_tmp = ads.Describe("evaluate('lookupdisplay(" + lstr[n].columnname + ")'," + STRING(alrow) + ")")
   END IF
   IF ls_tmp = "!" THEN
      TRY
         ls_tmp = TRIM(lnv_dw.of_getitemany(ads, alrow, lstr[n].columnname))
      CATCH (Exception ex)
         ls_tmp = "!Error!"
      END TRY
   END IF
   IF ISNULL(ls_tmp) THEN ls_tmp = CString.EMPTY
   ls_label += ls_tmp + CString.TAB
NEXT

alvi.Label = ls_label
IF as_datacolumn <> "" THEN 
   alvi.Data = ads.Describe("evaluate('lookupdisplay(" + as_datacolumn + ")'," + STRING(alrow) + ")")
ELSE
   //store row ID
   alvi.Data = ads.GetRowIDFromRow(alrow)
END IF   
IF as_iconcolumn <> "" THEN alvi.PictureIndex = INTEGER(ads.Describe("evaluate('lookupdisplay(" + as_datacolumn + ")'," + STRING(alrow) + ")"))

RETURN alv.AddItem(alvi)
end function

public function long of_insertrow (ref n_svc_mgr anv_svc, readonly listview alv, readonly datastore ads, readonly long al_row);listviewitem llvi

RETURN of_InsertRow(anv_svc, alv, ads, al_row, llvi, CString.EMPTY, CString.EMPTY)
end function

public function long of_insertrow (ref n_svc_mgr anv_svc, readonly listview alv, readonly datastore ads, readonly long al_row, readonly listviewitem alvi);RETURN of_InsertRow(anv_svc, alv, ads, al_row, alvi, CString.EMPTY, CString.EMPTY)
end function

public function long of_selectinverse (readonly listview alv);long ll_tot, n
listviewitem llvi

ll_tot = alv.TotalItems()

alv.SetRedraw(FALSE)

FOR n = 1 to ll_tot
   alv.GetItem(n, llvi)
   llvi.Selected = NOT llvi.Selected
   alv.SetItem(n, llvi)
NEXT

alv.SetRedraw(TRUE)

RETURN alv.TotalSelected()
end function

public subroutine of_setbackgroundimage (ref n_svc_mgr anv_svc, readonly listview alv, readonly string as_fullpath);lvbkimage lstr
n_svc_bit lnb
n_svc_win32 lnw
long hwnd

hwnd = Handle(alv)

anv_svc.of_loadsvc(lnb, CSvc.BIT)
anv_svc.of_loadsvc(lnw, CSvc.WIN32)

TRY
   lstr.ulflags = lnb.of_BitwiseOR({LVBKIF_SOURCE_URL, LVBKIF_STYLE_TILE})
   lstr.pszimage = as_fullpath
   lstr.cchimagemax = LEN(as_fullpath)
   lnw.SendMessageimage(hwnd, LVM_SETBKIMAGE, 0, lstr)
   Send(hwnd, LVM_SETTEXTBKCOLOR, 0, CWin32.CLR_NONE)
CATCH (Exception ex)
   
END TRY
end subroutine

public subroutine of_setcolumnwidths (ref n_svc_mgr anv_svc, readonly listview alv, string as_widths);string ls_label, ls_ret
alignment la
long ll_totcols, n
integer li_width
n_svc_string lnv_str

anv_svc.of_loadsvc(lnv_str, CSvc.STRING)

ls_ret = lnv_str.of_gettoken(as_widths, CString.TAB)
DO WHILE ls_ret <> ""
   n ++
   alv.GetColumn(n, ls_label, la, li_width)
   li_width = INTEGER(ls_ret)
   alv.SetColumn(n, ls_label, la, li_width)
   ls_ret = lnv_str.of_gettoken(as_widths, CString.TAB)
LOOP
end subroutine

public function string of_viewtostring (readonly listviewview alvv);string ls

CHOOSE CASE alvv
   CASE listviewlargeicon!
      ls = VIEW_LARGE_ICON
   CASE listviewsmallicon!
      ls = VIEW_SMALL_ICON
   CASE listviewlist!
      ls = VIEW_LIST
   CASE listviewreport!
      ls = VIEW_DETAIL
END CHOOSE

RETURN ls
end function

public function listviewview of_stringtoview (readonly string as_view);listviewview lv

CHOOSE CASE as_view
   CASE VIEW_LARGE_ICON
      lv = listviewlargeicon!
   CASE VIEW_SMALL_ICON
      lv = listviewsmallicon!
   CASE VIEW_LIST
      lv = listviewlist!
   CASE VIEW_DETAIL
      lv = listviewreport!
   CASE ELSE
      lv = listviewlargeicon!
END CHOOSE

RETURN lv
end function

public function string of_tostring (ref n_svc_mgr anv_svc, readonly listview alv);string ls_ret, ls_tmp
long ll_totrows, ll_totcols, r, c
n_svc_isempty lnv_check

ll_totcols = alv.TotalColumns()
ll_totrows = alv.TotalItems()

IF ll_totcols > 0 THEN
   
   anv_svc.of_LoadSvc(lnv_check, CSvc.ISEMPTY)
   
   FOR r = 1 to ll_totrows
      FOR c = 1 to ll_totcols
         alv.GetItem(r, c, ls_tmp)
         IF lnv_check.of_IsEmpty(ls_tmp) THEN ls_tmp = CString.EMPTY
         ls_ret += ls_tmp
         IF c < ll_totcols THEN ls_ret += CString.TAB
      NEXT
      IF r < ll_totrows THEN ls_ret += CString.CR_NEWLINE
   NEXT
END IF

RETURN ls_ret
end function

public function integer of_userdefinedsort (readonly listview alv, readonly integer ai_col, readonly string as_datatype, readonly boolean ab_ascending, readonly integer ai_index1, readonly integer ai_index2);string lsval1, lsval2
long ll_ret, ll_pos

//get string values
alv.GetItem(ai_index1, ai_col, lsval1)
alv.GetItem(ai_index2, ai_col, lsval2)

CHOOSE CASE as_datatype
   CASE CDWDataType.CHAR
      IF lsval1 < lsval2 THEN
         ll_ret = CRet.FAILURE
      ELSEIF lsval1 > lsval2 THEN
         ll_ret = CRet.SUCCESS
      ELSE
         ll_ret = CRet.NO_ACTION
      END IF
   CASE CDWDataType.DECIMAL
      decimal ld1, ld2
      ld1 = DEC(lsval1)
      ld2 = DEC(lsval2)
      IF ld1 < ld2 THEN
         ll_ret = CRet.FAILURE
      ELSEIF ld1 > ld2 THEN
         ll_ret = CRet.SUCCESS
      ELSE
         ll_ret = CRet.NO_ACTION
      END IF      
   CASE CDWDataType.INT, CDWDataType.LONG, CDWDataType.NUMBER, CDWDataType.REAL, CDWDataType.ULONG
      long ll1, ll2
      ll1 = LONG(lsval1)
      ll2 = LONG(lsval2)
      IF ll1 < ll2 THEN
         ll_ret = CRet.FAILURE
      ELSEIF ll1 > ll2 THEN
         ll_ret = CRet.SUCCESS
      ELSE
         ll_ret = CRet.NO_ACTION
      END IF            
   CASE CDWDataType.DATE
      date ldt1, ldt2
      ldt1 = DATE(lsval1)
      ldt2 = DATE(lsval2)
      IF ldt1 < ldt2 THEN
         ll_ret = CRet.FAILURE
      ELSEIF ldt1 > ldt2 THEN
         ll_ret = CRet.SUCCESS
      ELSE
         ll_ret = CRet.NO_ACTION
      END IF
   CASE CDWDataType.DATETIME, CDWDataType.TIMESTAMP
      datetime ldtm1, ldtm2
      ll_pos = POS(lsval1, CString.SPACE)
      ldtm1 = DATETIME(DATE(MID(lsval1, 1, ll_pos - 1)), TIME(MID(lsval1, ll_pos + 2)))
      ll_pos = POS(lsval2, CString.SPACE)
      ldtm2 = DATETIME(DATE(MID(lsval2, 1, ll_pos - 1)), TIME(MID(lsval2, ll_pos + 2)))
      IF ldtm1 < ldtm2 THEN
         ll_ret = CRet.FAILURE
      ELSEIF ldtm1 > ldtm2 THEN
         ll_ret = CRet.SUCCESS
      ELSE
         ll_ret = CRet.NO_ACTION
      END IF
   CASE CDWDataType.TIME
      time lt1, lt2
      lt1 = TIME(lsval1)
      lt2 = TIME(lsval2)
      IF lt1 < lt2 THEN
         ll_ret = CRet.FAILURE
      ELSEIF lt1 > lt2 THEN
         ll_ret = CRet.SUCCESS
      ELSE
         ll_ret = CRet.NO_ACTION
      END IF
   CASE ELSE
      //sort as is
      IF lsval1 < lsval2 THEN
         ll_ret = CRet.FAILURE
      ELSEIF lsval1 > lsval2 THEN
         ll_ret = CRet.SUCCESS
      ELSE
         ll_ret = CRet.NO_ACTION
      END IF
END CHOOSE

IF NOT ab_ascending THEN
   CHOOSE CASE ll_ret
      CASE CRet.SUCCESS
         ll_ret = CRet.FAILURE
      CASE CRet.FAILURE
         ll_ret = CRet.SUCCESS
   END CHOOSE
END IF

RETURN ll_ret
end function

public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly listviewitem alvi_template, readonly string as_datacolumn, readonly string as_iconcolumn, readonly powerobject apo_callback, readonly string as_callbackeventname);n_svc_dw lnv_dw
n_svc_isempty lnv_check
n_svc_resource lnv_res
string ls_colnames[], ls_type, ls_label, ls_tmp
long ll_count, ll_colcount, n, m, ll_percent, ll_lastpercent
boolean lb_callback
alignment la
struc_coldef lstr_coldef[]
CONSTANT string DOUBLE_QUOTE = '"'
CONSTANT string YES = "Yes"
CONSTANT string NO = "No"

//get column defs from datastore including computed fields
//make sure it's sorted by x location
ll_colcount = of_GetColumnDefs(anv_svc, ads_source, lstr_coldef)

//load service
anv_svc.of_LoadSvc(lnv_dw, CSvc.DW)
anv_svc.of_LoadSvc(lnv_res, CSvc.RESOURCE)

//create columns
IF alv_destination.TotalColumns() <> ll_colcount THEN
   alv_destination.DeleteColumns()
   FOR n = 1 to ll_colcount
      CHOOSE CASE lstr_coldef[n].alignment
         CASE 0
            la = Left!
         CASE 1
            la = Right!
         CASE 2
            la = Center!         
         CASE 3
            la = Justify!        
         CASE ELSE
            la = Left!
      END CHOOSE
      alv_destination.AddColumn(lstr_coldef[n].headertext, la, lstr_coldef[n].width)
      //add user defined sort for non-string datatypes
      ls_type = lnv_dw.of_GetColumnDatatype(ads_source, lstr_coldef[n].columnname)
      IF ls_type <> CDWDataType.CHAR THEN
         alv_destination.of_adduserdefinedsort(n, ls_type)
      END IF
   NEXT
END IF

alv_destination.DeleteItems()
ll_count = ads_source.RowCount()
lb_callback = ISVALID(apo_callback)

//load service
anv_svc.of_LoadSvc(lnv_check, CSvc.ISEMPTY)

FOR n = 1 to ll_count
   IF lb_callback THEN
      ll_percent = (n / ll_count) * 100
      IF ll_percent <> ll_lastpercent THEN
         ll_lastpercent = ll_percent
         apo_callback.TriggerEvent(as_callbackeventname, 0, ll_percent)
      END IF
   END IF
   
   ls_label = CString.EMPTY
   
   FOR m = 1 to ll_colcount
      //checkbox style
      IF lnv_dw.of_GetColumnEditStyle(ads_source, lstr_coldef[m].columnname) = CDWEdit.CHKBOX THEN
         IF lower(STRING(lnv_dw.of_GetItemAny(ads_source, n, lstr_coldef[m].columnname))) = lower(ads_source.Describe(lstr_coldef[m].columnname + ".Checkbox.On")) THEN
            ls_tmp = YES
         ELSE
            ls_tmp = NO
         END IF
      ELSE
         //for any other style, just get the display text
         ls_tmp = ads_source.Describe("evaluate('lookupdisplay(" + lstr_coldef[m].columnname + ")'," + STRING(n) + ")")
      END IF
      
      //just in case evaluate fails, get the actual value
      IF lnv_dw.of_IsErrorString(ls_tmp) THEN
         ls_tmp = TRIM(STRING(lnv_dw.of_GetItemAny(ads_source, n, lstr_coldef[m].columnname)))
      END IF
      
      IF lnv_check.of_IsEmpty(ls_tmp) THEN ls_tmp = CString.EMPTY
      ls_label += ls_tmp + "~t"
   NEXT
   
   //use the passed listviewitem as template
   alvi_template.Label = ls_label
   IF NOT lnv_check.of_IsEmpty(as_datacolumn) THEN
      alvi_template.Data = ads_source.Describe("evaluate('lookupdisplay(" + as_datacolumn + ")'," + STRING(n) + ")")
   ELSE
      //store row ID
      alvi_template.Data = ads_source.GetRowIDFromRow(n)
   END IF
   
   //icon column
   IF NOT lnv_check.of_IsEmpty(as_iconcolumn) THEN
      ls_tmp = lnv_dw.of_GetItemAny(ads_source, n, as_iconcolumn)
      IF ISNUMBER(ls_tmp) THEN
         alvi_template.PictureIndex = INTEGER(ls_tmp)
      ELSE
         alvi_template.PictureIndex = lnv_res.of_standardimageindexfromstring(ls_tmp)
      END IF
   END IF
   
   //add the listviewitem
   alv_destination.AddItem(alvi_template)
NEXT
end subroutine

public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly powerobject apo_callback, readonly string as_callbackeventname);listviewitem llvi

of_ConvertDatastore(anv_svc, ads_source, alv_destination, llvi, CString.EMPTY, CString.EMPTY, apo_callback, as_callbackeventname)
end subroutine

public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly listviewitem alvi_template, readonly powerobject apo_callback, readonly string as_callbackeventname);of_ConvertDatastore(anv_svc, ads_source, alv_destination, alvi_template, CString.EMPTY, CString.EMPTY, apo_callback, as_callbackeventname)
end subroutine

public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination);powerobject lpo
listviewitem llvi

of_ConvertDatastore(anv_svc, ads_source, alv_destination, llvi, CString.EMPTY, CString.EMPTY, lpo, CString.EMPTY)
end subroutine

public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly listviewitem alvi_template);powerobject lpo

of_ConvertDatastore(anv_svc, ads_source, alv_destination, alvi_template, CString.EMPTY, CString.EMPTY, lpo, CString.EMPTY)
end subroutine

public subroutine of_sortcolumn (ref n_svc_mgr anv_svc, readonly u_lv alv, readonly integer ai_column, readonly boolean ab_ascending);n_svc_system lnv_sys

anv_svc.of_LoadSvc(lnv_sys, CSvc.SYS)

IF lnv_sys.of_IsXP() AND lnv_sys.of_IsSysThemed() THEN
   of_SortColumnXP(anv_svc, alv, ai_column, ab_ascending)
ELSE
   of_SortColumnIcon(anv_svc, alv, ai_column, ab_ascending)
END IF
end subroutine

protected subroutine of_sortcolumnicon (ref n_svc_mgr anv_svc, readonly listview alv, readonly integer ai_column, readonly boolean ab_ascending);long ll_hwnd, ll_fmt, lc, n, ll_and, ll_img
hditem lstr, lstre
//n_svc_sysimages lni
n_svc_bit lnv_bit
boolean AlignRight

//anv_svc.of_loadsvc(lni, CSvc.SYSIMAGES)
anv_svc.of_loadsvc(lnv_bit, CSvc.BIT)

ll_hwnd = Send(Handle(alv), LVM_GETHEADER, 0, 0)
//ll_img = lni.of_getsorticons()

///////////////////////////////////////////////////
//bug fix, must call twice to get 
//correct imagelist placement
//might be pooling problem - ang labo nito!!! :p
//ll_img = lni.of_getsorticons()
///////////////////////////////////////////////////

//set header imagelist
Send(ll_hwnd, HDM_SETIMAGELIST, 0, ll_img)

//remove all sort arrows
lc = alv.TotalColumns() - 1
FOR n = 0 to lc
   
   lstr.mask = lnv_bit.of_BitwiseOR({HDI_FORMAT, HDI_IMAGE})
   //get header column
   Header_GetSetItem(ll_hwnd, HDM_GETITEM, n, lstr)
   
   ll_and = lnv_bit.of_BitwiseAND({lstr.fmt, HDF_RIGHT})
   AlignRight = lstr.fmt = ll_and
   lstr.fmt = lnv_bit.of_BITWISEOR({HDF_STRING, ll_and})
   
   IF (ai_column - 1) = n THEN
      IF NOT AlignRight THEN
         ll_and = HDF_BITMAP_ON_RIGHT
      ELSE
         ll_and = 0
      END IF
      lstr.fmt = lnv_bit.of_BitwiseOR({lstr.fmt, HDF_IMAGE, ll_and})

      IF ab_ascending THEN
         lstr.iImage = 0
      ELSE
         lstr.iImage = 1
      END IF         
   END IF
   
   Header_GetSetItem(ll_hwnd, HDM_SETITEM, n, lstr)
   
   lstr = lstre      
NEXT
end subroutine

protected subroutine of_sortcolumnxp (ref n_svc_mgr anv_svc, readonly listview alv, readonly integer ai_column, readonly boolean ab_ascending);long ll_hwnd, ll_fmt, lc, n
hditem lstr, lstre

ll_hwnd = Send(Handle(alv), LVM_GETHEADER, 0, 0)

IF ab_ascending THEN
   ll_fmt = HDF_SORTUP
ELSE
   ll_fmt = HDF_SORTDOWN
END IF

//remove all sort arrows
lc = alv.TotalColumns() - 1
FOR n = 0 to lc
   Header_GetSetItem(ll_hwnd, HDM_GETITEM, n, lstr)
   lstr.mask = HDI_FORMAT
   lstr.fmt += // + HDF_STRING
   Header_GetSetItem(ll_hwnd, HDM_SETITEM, n, lstr)

   lstr = lstre
   Header_GetSetItem(ll_hwnd, HDM_GETITEM, n, lstr)
   lstr.mask = HDI_FORMAT
   lstr.fmt += HDF_STRING  
   Header_GetSetItem(ll_hwnd, HDM_SETITEM, n, lstr)
   lstr = lstre
   
NEXT

//set sort arrow
Header_GetSetItem(ll_hwnd, HDM_GETITEM, ai_column, lstr)

lstr.mask = HDI_FORMAT
lstr.fmt += ll_fmt + HDF_STRING

Header_GetSetItem(ll_hwnd, HDM_SETITEM, ai_column - 1, lstr)
end subroutine

public function long of_getlargeimagelist (readonly listview alv);RETURN Send(Handle(alv), LVM_GETIMAGELIST, LVSIL_NORMAL, 0)
end function

public function long of_getsmallimagelist (readonly listview alv);RETURN Send(Handle(alv), LVM_GETIMAGELIST, LVSIL_SMALL, 0)
end function

public subroutine of_setlargeimagelist (readonly u_lv alv, readonly long al_himl);Send(Handle(alv), LVM_SETIMAGELIST, LVSIL_NORMAL, al_himl)
//tell the listview to swap dummy on destruct
alv.of_imagelistassigned()
end subroutine

public subroutine of_setsmallimagelist (readonly u_lv alv, readonly long al_himl);Send(Handle(alv), LVM_SETIMAGELIST, LVSIL_SMALL, al_himl)
//tell the listview to swap dummy on destruct
alv.of_imagelistassigned()
end subroutine

public subroutine of_loadstandardimages (ref n_svc_mgr anv_svc, readonly u_lv alv);n_svc_resource lnv_res
long ll_himl

anv_svc.of_LoadSvc(lnv_res, CSvc.RESOURCE)
//large
ll_himl = lnv_res.of_GetStandardImageList24(anv_svc)
of_SetLargeImagelist(alv, ll_himl)
//small
ll_himl = lnv_res.of_GetStandardImageList16(anv_svc)
of_SetSmallImagelist(alv, ll_himl)
end subroutine

public subroutine of_convertdatastore (ref n_svc_mgr anv_svc, readonly datastore ads_source, readonly u_lv alv_destination, readonly listviewitem alvi_template, readonly string as_iconcolumn);powerobject lpo

of_ConvertDatastore(anv_svc, ads_source, alv_destination, alvi_template, CString.EMPTY, as_iconcolumn, lpo, CString.EMPTY)
end subroutine

on n_svc_lv.create
call super::create
end on

on n_svc_lv.destroy
call super::destroy
end on