📄 scrollview.c
字号:
/*** $Id: scrollview.c,v 1.71 2005/02/05 03:36:10 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 "ctrl/ctrlhelper.h"#include "ctrl/scrollview.h"#include "cliprect.h"#include "internals.h"#include "ctrlclass.h"#ifdef _CTRL_SCROLLVIEW#include "ctrlmisc.h"#include "scrolled.h"#include "scrollview_impl.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.cstatic 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;}//FIXMEHSVITEM 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;}SVITEM_DRAWFUNC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -