⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listmodel.h

📁 在ADS环境下MiniGUI的源码
💻 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 + -