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

📄 scrollview.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
** $Id: scrollview.c,v 1.67 2004/10/19 07:53:32 snig Exp $
**
** scrollview.c: a scrollview control
**
** Copyright (C) 2004 Feynman Software.
** 
** Current maintainer: Zhong Shuyi (zhongsy@minigui.org).
**
** Create date: 2004/03/01
*/

/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "common.h"
#include "minigui.h"
#include "gdi.h"
#include "window.h"
#include "control.h"
#include "cliprect.h"
#include "internals.h"
#include "ctrlclass.h"


#ifdef _CTRL_SCROLLVIEW

#include "ctrlmisc.h"
#include "scrolled.h"
#include "scrollview.h"


/* ------------------------------------ svlist --------------------------- */

static PSVITEMDATA svlistItemAdd (PSVLIST psvlist, PSVITEMDATA preitem, 
                PSVITEMDATA nextitem, PSVITEMINFO pii, int *idx)
{
    PSVITEMDATA ci;
    int ret;

    ci = (PSVITEMDATA) malloc (sizeof(SVITEMDATA));
    if (!ci)
        return NULL;

    if (pii) {
        ci->nItemHeight = pii->nItemHeight;
        ((MgItem *)ci)->addData = pii->addData;
    }
    else {
        ci->nItemHeight = psvlist->nDefItemHeight;
        ((MgItem *)ci)->addData = 0;
    }

    ret = mglist_add_item ( (MgList *)psvlist, (MgItem *)ci, (MgItem *)preitem, 
                      (MgItem *)nextitem, pii->nItem, idx );
    if (ret < 0) {
        free (ci);
        return NULL;
    }

    return ci;
}

static int svlistItemDel (PSVLIST psvlist, PSVITEMDATA pci)
{
    mglist_del_item ((MgList *)psvlist, (MgItem *)pci);
    free (pci);
    return 0;
}

static void svlist_reset_content (HWND hWnd, PSVLIST psvlist)
{
    PSVITEMDATA pci;

    while (!mglist_empty((MgList *)psvlist)) {
        pci = (PSVITEMDATA)mglist_first_item ((MgList *)psvlist);
        svlistItemDel (psvlist, pci);
    }
    ((MgList *)psvlist)->nTotalItemH = 0;
}

//FIXME, to be moved to listmodel.c
static int isInItem (MgList *mglst, int mouseX, int mouseY, 
                     MgItem **pRet, int *item_y)
{
    //PSVLIST psvlist = (PSVLIST)mglst;
    int ret = 0;
    PSVITEMDATA pci = NULL;
    int h = 0;
    list_t *me;

    if (mouseY < 0 || mouseY >= mglst->nTotalItemH)
        return -1;

    mglist_for_each (me, mglst) {
        pci = (PSVITEMDATA)mglist_entry (me);
        h += pci->nItemHeight;
        if (h > mouseY)
            break;
        ret++;
    }

    if (pRet)
        *pRet = (MgItem *)pci;
    if (item_y)
        *item_y = h - pci->nItemHeight;

    return ret;
}

int scrollview_is_in_item (PSVDATA psvdata, int mousey, HSVITEM *phsvi, int *itemy)
{
    return isInItem ((MgList *)&psvdata->svlist, 0, mousey, (MgItem **)phsvi, itemy);
}

/* ---------------------------------------------------------------------------- */

HSVITEM scrollview_add_item (HWND hWnd, PSVDATA psvdata, HSVITEM prehsvi, PSVITEMINFO pii, int *idx)
{
    PSVLIST psvlist = &psvdata->svlist;
    PSVITEMDATA pci;
    int index;

    if ( (pci =svlistItemAdd (psvlist, (PSVITEMDATA)prehsvi, NULL, pii, &index)) ) {
        mglist_adjust_items_height (hWnd, (MgList *)psvlist, psvscr, pci->nItemHeight);
    }

    if (idx)
        *idx = index;

    return (HSVITEM)pci;
}

//FIXME
HSVITEM scrollview_add_item_ex (HWND hWnd, PSVDATA psvdata, HSVITEM prehsvi, 
                HSVITEM nexthsvi, PSVITEMINFO pii, int *idx)
{
    PSVLIST psvlist = &psvdata->svlist;
    PSVITEMDATA pci;
    int index;

    if ( (pci =svlistItemAdd (psvlist, (PSVITEMDATA)prehsvi, 
                      (PSVITEMDATA)nexthsvi, pii, &index)) ) {
        mglist_adjust_items_height (hWnd, (MgList *)psvlist, psvscr, pci->nItemHeight);
    }

    if (idx)
        *idx = index;

    return (HSVITEM)pci;
}

int scrollview_move_item (PSVDATA psvdata, HSVITEM hsvi, HSVITEM prehsvi)
{
    PSVITEMDATA pci, preitem;

    if (!hsvi)
        return -1;
    pci = (PSVITEMDATA)hsvi;
    preitem = (PSVITEMDATA)prehsvi;

    mglist_move_item ((MgList *)&psvdata->svlist, (MgItem *)pci, (MgItem *)preitem);
    scrollview_refresh_content (psvdata);
    return 0;
}

int scrollview_del_item (HWND hWnd, PSVDATA psvdata, int nItem, HSVITEM hsvi)
{
    PSVLIST psvlist = &psvdata->svlist;
    PSVITEMDATA pci;
    int del_h;

    if (hsvi)
        pci = (PSVITEMDATA)hsvi;
    else {
        if ( !(pci=(PSVITEMDATA)mglist_getitem_byindex((MgList *)&psvlist, nItem)) )
            return -1;
    }
    del_h = pci->nItemHeight;

    if (svlistItemDel (psvlist, pci) >= 0) {
        mglist_adjust_items_height (hWnd, (MgList *)psvlist, psvscr, -del_h);
    }
    return 0;
}

DWORD scrollview_get_item_adddata (HSVITEM hsvi)
{
    return mglist_get_item_adddata (hsvi);
}   

int scrollview_get_item_index (HWND hWnd, HSVITEM hsvi)
{
    PSVDATA psvdata = (PSVDATA)GetWindowAdditionalData2(hWnd);
    return mglist_get_item_index ((MgList *)&psvdata->svlist, (MgItem *)hsvi);
}

int scrollview_is_item_hilight (HWND hWnd, HSVITEM hsvi)
{
    PSVDATA psvdata = (PSVDATA)GetWindowAdditionalData2(hWnd);
    return (int)mglist_is_item_hilight ((MgList *)&psvdata->svlist, (MgItem *)hsvi);
}

int scrollview_is_item_selected (HSVITEM hsvi)
{
    return mglist_is_item_selected ((MgItem *)hsvi);
}

static int svGetItemRect (PSVDATA psvdata, HSVITEM hsvi, RECT *rcItem, BOOL bConv)
{
    PSVITEMDATA pci = (PSVITEMDATA)hsvi;

    if (!rcItem || !hsvi)
        return -1;

    rcItem->top = scrollview_get_item_ypos (psvdata, hsvi);
    if (bConv)
        scrolled_content_to_window ((PSCRDATA)psvdata, NULL, &rcItem->top);
    rcItem->bottom = rcItem->top + pci->nItemHeight;

    //rcItem->left = psvscr->leftMargin;
    rcItem->left = 0;
    if (bConv)
        scrolled_content_to_window ((PSCRDATA)psvdata, &rcItem->left, NULL);
//FIXME
    //rcItem->right = rcItem->left + psvscr->visibleWidth;
    rcItem->right = rcItem->left + psvscr->nContWidth;

    /* only y position is important */
    return 1;
}

int scrollview_get_item_rect (HWND hWnd, HITEM hsvi, RECT *rcItem, BOOL bConv)
{
    PSVDATA psvdata = (PSVDATA)GetWindowAdditionalData2(hWnd);
    return svGetItemRect (psvdata, hsvi, rcItem, bConv);
}

int scrollview_get_item_ypos (PSVDATA psvdata, HSVITEM hsvi)
{
    PSVLIST psvlist = &psvdata->svlist;
    PSVITEMDATA ci = (PSVITEMDATA)hsvi, pci;
    list_t *me;
    int h = 0;

    mglist_for_each (me, psvlist) {
        pci = (PSVITEMDATA)mglist_entry (me);
        if (pci == ci)
            return h;
        h += pci->nItemHeight;
    }
    return -1;
}

int scrollview_set_item_height (HWND hWnd, HSVITEM hsvi, int height)
{
    PSVDATA psvdata = (PSVDATA)GetWindowAdditionalData2(hWnd);
    PSVITEMDATA pci = (PSVITEMDATA)hsvi;
    int diff;

    if (!psvdata || !pci || height < 0 || height == pci->nItemHeight) return -1;

    diff = height - pci->nItemHeight;
    pci->nItemHeight = height;

    mglist_adjust_items_height (hWnd, (MgList *)&psvdata->svlist, psvscr, diff);

    return height - diff;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -