📄 listmodel.h
字号:
/*
** $Id: listmodel.h,v 1.5 2004/10/18 00:49:28 snig Exp $
**
** listmodel.h: header file of item data model.
**
** Copyright (C) 2004 Feynman Software.
*/
#ifndef _LISTMODEL_H
#define _LISTMODEL_H
#include "../list.h"
#include "scrolled.h"
#ifdef __cplusplus
extern "C"
{
#endif
/* ---------------------------------------------------------------- */
typedef GHANDLE HITEM;
typedef SVITEM_CMP MGITEM_CMP;
typedef struct _MgList MgList;
typedef struct _MgItem MgItem;
typedef int (*MGITEM_CMP_EX) (MgList *mglst, HITEM hsvi1, HITEM hsvi2);
typedef int (*MGITEM_GETRECT) (HWND hWnd, HITEM hitem, RECT *rcItem, BOOL bConv);
typedef int (*MGITEM_ISIN) (MgList *mglst, int mouseX, int mouseY, MgItem**pRet, int *item_y);
typedef struct _mgitem_operations
{
SVITEM_INITFUNC initItem; /** called when an scrollview item is created */
SVITEM_DESTROYFUNC destroyItem; /** called when an item is destroied */
SVITEM_DRAWFUNC drawItem; /** call this to draw an item */
MGITEM_GETRECT getRect; /** call this to get item rect */
MGITEM_ISIN isInItem; /** call this to decides whether a position is in an item rect */
} MGITEMOPS;
typedef MGITEMOPS* PMGITEMOPS;
/* ---------------------------------------------------------------- */
#define CF_AUTOSORT 0x00000001 /* auto sort style */
/* item status flags */
#define CTST_NORMAL 0x0000 //normal status
#define CTST_SELECTED 0x0001L //selected status
//#define MGLIST_ST_NORMAL 0x00000000L
#define MGLIST_ST_FROZEN 0x00000010L
#define MG_CMP_TYPE_NORMAL 0
#define MG_CMP_TYPE_EX 1
/* item struct */
struct _MgItem
{
list_t list; // list pointer
list_t sel_list; // selected list pointer
DWORD flags; // item flags
DWORD addData; // item additional data
};
struct _MgList
{
/* current list item number */
int nItemNr;
/* total item height */
int nTotalItemH;
/* ptr of the hilighted item */
MgItem* pItemHilighted;
/* item list queue */
list_t queue;
/* selected item list queue */
list_t sel_queue;
//FIXME, should has only one copy for a class
/* item compare function */
MGITEM_CMP itemCmp;
MGITEMOPS iop;
/* mglist window */
HWND hLst;
DWORD flags;
};
/* ------------------------- external api -------------------------- */
int DefaultItemViewProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam,
PSCRDATA pscrdata, MgList *mglst);
SVITEM_DRAWFUNC mglist_set_itemdraw (MgList *mglst, SVITEM_DRAWFUNC draw_func);
int mglist_init (MgList *mglst, HWND hWnd);
void mglist_destroy (MgList *mglst);
int mglist_add_item (MgList *mglst, MgItem* hitem, MgItem* hprev, MgItem *hnext,
int nItem, int *idx);
int mglist_del_item (MgList *mglst, MgItem* hitem);
DWORD mglist_get_item_adddata (HITEM hitem);
DWORD mglist_set_item_adddata (HITEM hitem, DWORD adddata);
void mglist_hilight_item (MgList *mglst, MgItem* hitem);
void mglist_refresh_item (MgList *mglst, HITEM hivi);
void mglist_set_itemops (MgList *mglst, PMGITEMOPS iop);
MgItem* mglist_get_item_by_index (MgList *mglst, int nItem);
MgItem* mglist_get_next_item (MgList *mglst, MgItem* hitem);
MgItem* mglist_get_prev_item (MgList *mglst, MgItem* hitem);
int mglist_move_item (MgList *mglst, MgItem* pci, MgItem* preitem);
MgItem* mglist_getitem_byindex (MgList *mglst, int index);
int mglist_get_item_index (MgList *mglst, MgItem *item);
int mglist_sort_items (MgList *mglst, void* pfn, int fn_type);
BOOL mglist_make_item_visible (MgList *mglst, PSCRDATA pscrdata, HITEM hitem);
void mglist_freeze (HWND hWnd, MgList *mglst, BOOL lock);
int mglist_adjust_items_height(HWND hWnd, MgList *mglst, PSCRDATA pscrdata, int diff);
void mglist_redraw_item (MgList *mglst, HITEM hivi);
#define mglist_for_each(pos, list) \
list_for_each(pos, &((MgList *)list)->queue)
#define mglist_entry(ptr) \
list_entry(ptr, MgItem, list)
#define mglist_empty(mglst) \
list_empty(&(mglst)->queue)
#define mglist_first_item(mglst) \
list_entry((mglst)->queue.next, MgItem, list)
static inline int mglist_is_item_hilight (MgList *mglst, MgItem* hitem)
{
return mglst->pItemHilighted == hitem;
}
static inline int mglist_is_item_selected (MgItem* pci)
{
return pci->flags & CTST_SELECTED;
}
static inline MgItem* mglist_get_hilighted_item (MgList *mglst)
{
return mglst->pItemHilighted;
}
static inline MgItem* mglist_set_hilighted_item (MgList *mglst, MgItem *item)
{
MgItem *old;
old = mglst->pItemHilighted;
mglst->pItemHilighted = item;
return old;
}
static inline void mglist_select_item (MgList *mglst, MgItem* pci, BOOL bSel)
{
if (bSel) {
if (!(pci->flags & CTST_SELECTED)) {
pci->flags |= CTST_SELECTED;
list_add_tail (&pci->sel_list, &mglst->sel_queue);
}
}
else {
if (pci->flags & CTST_SELECTED) {
pci->flags &= ~CTST_SELECTED;
list_del (&pci->sel_list);
}
}
}
static inline void mglist_unselect_all (MgList *mglst)
{
MgItem* pci;
while (!list_empty (&mglst->sel_queue)) {
pci = list_entry (mglst->sel_queue.next, MgItem, sel_list);
if (pci->flags & CTST_SELECTED) {
pci->flags &= ~CTST_SELECTED;
list_del (mglst->sel_queue.next);
}
}
}
/* unselect all and select this one */
static inline void mglist_select_one_item (MgList *mglst, MgItem* hitem)
{
MgItem* pci = (MgItem*)hitem;
if (!pci) return;
mglist_unselect_all (mglst);
mglist_select_item (mglst, pci, TRUE);
}
static inline void mglist_select_all (MgList *mglst)
{
MgItem* pci;
list_t *me;
list_for_each (me, &mglst->queue) {
pci = list_entry (me, MgItem, list);
mglist_select_item (mglst, pci, TRUE);
}
}
static inline int mglist_get_item_count (MgList *mglst)
{
return mglst->nItemNr;
}
static inline void mglist_set_autosort (MgList *mglst)
{
mglst->flags |= CF_AUTOSORT;
}
static inline BOOL mglist_is_frozen (MgList *mglst)
{
return mglst->flags & MGLIST_ST_FROZEN;
}
static inline int mglist_get_total_item_height (MgList *mglst)
{
return mglst->nTotalItemH;
}
/* -------------------------------------------------------------------------- */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _LISTMODEL_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -