📄 scrollview.c
字号:
/*
** $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 + -