comparison win/dw.c @ 1868:dc3260e1a915

Use the cached text from the tree on Windows instead of caching parameters... This also fixes a memory leak in the tree code.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 21 Mar 2013 21:14:04 +0000
parents c836603d3f14
children a2d556368be1
comparison
equal deleted inserted replaced
1867:a3e356948426 1868:dc3260e1a915
1932 { 1932 {
1933 if(tmp->window == tem->hdr.hwndFrom && !dw_window_get_data(tmp->window, "_dw_select_item")) 1933 if(tmp->window == tem->hdr.hwndFrom && !dw_window_get_data(tmp->window, "_dw_select_item"))
1934 { 1934 {
1935 int (DWSIGNAL *treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = tmp->signalfunction; 1935 int (DWSIGNAL *treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = tmp->signalfunction;
1936 TVITEM tvi; 1936 TVITEM tvi;
1937 void **ptrs; 1937 TCHAR textbuf[1025] = {0}, *textptr = textbuf;
1938 1938
1939 tvi.mask = TVIF_HANDLE | TVIF_PARAM; 1939 tvi.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT;
1940 tvi.hItem = tem->itemNew.hItem; 1940 tvi.hItem = tem->itemNew.hItem;
1941 tvi.pszText = textbuf;
1942 tvi.cchTextMax = 1024;
1941 1943
1942 TreeView_GetItem(tmp->window, &tvi); 1944 TreeView_GetItem(tmp->window, &tvi);
1943 1945
1944 ptrs = (void **)tvi.lParam; 1946 result = treeselectfunc(tmp->window, tem->itemNew.hItem, WideToUTF8(textptr), tmp->data, (void *)tvi.lParam);
1945 if(ptrs)
1946 result = treeselectfunc(tmp->window, tem->itemNew.hItem, (char *)ptrs[0], tmp->data, (void *)ptrs[1]);
1947 1947
1948 tmp = NULL; 1948 tmp = NULL;
1949 } 1949 }
1950 } 1950 }
1951 else if(tem->hdr.code == TVN_ITEMEXPANDED && tmp->message == TVN_ITEMEXPANDED) 1951 else if(tem->hdr.code == TVN_ITEMEXPANDED && tmp->message == TVN_ITEMEXPANDED)
1964 { 1964 {
1965 int (DWSIGNAL *containercontextfunc)(HWND, char *, int, int, void *, void *) = tmp->signalfunction; 1965 int (DWSIGNAL *containercontextfunc)(HWND, char *, int, int, void *, void *) = tmp->signalfunction;
1966 HTREEITEM hti; 1966 HTREEITEM hti;
1967 TVITEM tvi; 1967 TVITEM tvi;
1968 TVHITTESTINFO thi; 1968 TVHITTESTINFO thi;
1969 void **ptrs = NULL; 1969 void *itemdata = NULL;
1970 LONG x, y; 1970 LONG x, y;
1971 TCHAR textbuf[1025] = {0}, *textptr = textbuf;
1971 1972
1972 dw_pointer_query_pos(&x, &y); 1973 dw_pointer_query_pos(&x, &y);
1973 1974
1974 thi.pt.x = x; 1975 thi.pt.x = x;
1975 thi.pt.y = y; 1976 thi.pt.y = y;
1978 1979
1979 hti = TreeView_HitTest(tmp->window, &thi); 1980 hti = TreeView_HitTest(tmp->window, &thi);
1980 1981
1981 if(hti) 1982 if(hti)
1982 { 1983 {
1983 tvi.mask = TVIF_HANDLE | TVIF_PARAM; 1984 tvi.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT;
1984 tvi.hItem = hti; 1985 tvi.hItem = hti;
1986 tvi.pszText = textbuf;
1987 tvi.cchTextMax = 1024;
1985 1988
1986 TreeView_GetItem(tmp->window, &tvi); 1989 TreeView_GetItem(tmp->window, &tvi);
1987 TreeView_SelectItem(tmp->window, hti); 1990 TreeView_SelectItem(tmp->window, hti);
1988 1991
1989 ptrs = (void **)tvi.lParam; 1992 itemdata = (void *)tvi.lParam;
1990 } 1993 }
1991 containercontextfunc(tmp->window, ptrs ? (char *)ptrs[0] : NULL, x, y, tmp->data, ptrs ? ptrs[1] : NULL); 1994 containercontextfunc(tmp->window, WideToUTF8(textptr), x, y, tmp->data, itemdata);
1992 tmp = NULL; 1995 tmp = NULL;
1993 } 1996 }
1994 } 1997 }
1995 } 1998 }
1996 else if(_tcsnicmp(tmpbuf, WC_LISTVIEW, _tcslen(WC_LISTVIEW)+1)==0) 1999 else if(_tcsnicmp(tmpbuf, WC_LISTVIEW, _tcslen(WC_LISTVIEW)+1)==0)
8690 HTREEITEM API dw_tree_insert_after(HWND handle, HTREEITEM item, char *title, HICN icon, HTREEITEM parent, void *itemdata) 8693 HTREEITEM API dw_tree_insert_after(HWND handle, HTREEITEM item, char *title, HICN icon, HTREEITEM parent, void *itemdata)
8691 { 8694 {
8692 TVITEM tvi; 8695 TVITEM tvi;
8693 TVINSERTSTRUCT tvins; 8696 TVINSERTSTRUCT tvins;
8694 HTREEITEM hti; 8697 HTREEITEM hti;
8695 void **ptrs= malloc(sizeof(void *) * 2);
8696
8697 ptrs[0] = title;
8698 ptrs[1] = itemdata;
8699 8698
8700 tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; 8699 tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
8701 tvi.pszText = UTF8toWide(title); 8700 tvi.pszText = UTF8toWide(title);
8702 tvi.lParam = (LPARAM)ptrs; 8701 tvi.lParam = (LPARAM)itemdata;
8703 tvi.cchTextMax = (int)_tcslen(tvi.pszText); 8702 tvi.cchTextMax = (int)_tcslen(tvi.pszText);
8704 tvi.iSelectedImage = tvi.iImage = _lookup_icon(handle, (HICON)icon, 1); 8703 tvi.iSelectedImage = tvi.iImage = _lookup_icon(handle, (HICON)icon, 1);
8705 8704
8706 tvins.item = tvi; 8705 tvins.item = tvi;
8707 tvins.hParent = parent; 8706 tvins.hParent = parent;
8724 HTREEITEM API dw_tree_insert(HWND handle, char *title, HICN icon, HTREEITEM parent, void *itemdata) 8723 HTREEITEM API dw_tree_insert(HWND handle, char *title, HICN icon, HTREEITEM parent, void *itemdata)
8725 { 8724 {
8726 TVITEM tvi; 8725 TVITEM tvi;
8727 TVINSERTSTRUCT tvins; 8726 TVINSERTSTRUCT tvins;
8728 HTREEITEM hti; 8727 HTREEITEM hti;
8729 void **ptrs= malloc(sizeof(void *) * 2);
8730
8731 ptrs[0] = title;
8732 ptrs[1] = itemdata;
8733 8728
8734 tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; 8729 tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
8735 tvi.pszText = UTF8toWide(title); 8730 tvi.pszText = UTF8toWide(title);
8736 tvi.lParam = (LPARAM)ptrs; 8731 tvi.lParam = (LPARAM)itemdata;
8737 tvi.cchTextMax = (int)_tcslen(tvi.pszText); 8732 tvi.cchTextMax = (int)_tcslen(tvi.pszText);
8738 tvi.iSelectedImage = tvi.iImage = _lookup_icon(handle, (HICON)icon, 1); 8733 tvi.iSelectedImage = tvi.iImage = _lookup_icon(handle, (HICON)icon, 1);
8739 8734
8740 tvins.item = tvi; 8735 tvins.item = tvi;
8741 tvins.hParent = parent; 8736 tvins.hParent = parent;
8755 * icon: Handle to coresponding icon. 8750 * icon: Handle to coresponding icon.
8756 */ 8751 */
8757 void API dw_tree_item_change(HWND handle, HTREEITEM item, char *title, HICN icon) 8752 void API dw_tree_item_change(HWND handle, HTREEITEM item, char *title, HICN icon)
8758 { 8753 {
8759 TVITEM tvi; 8754 TVITEM tvi;
8760 void **ptrs;
8761 8755
8762 tvi.mask = TVIF_HANDLE; 8756 tvi.mask = TVIF_HANDLE;
8763 tvi.hItem = item; 8757 tvi.hItem = item;
8764 8758
8765 if(TreeView_GetItem(handle, &tvi)) 8759 if(TreeView_GetItem(handle, &tvi))
8766 { 8760 {
8767
8768 ptrs = (void **)tvi.lParam;
8769 ptrs[0] = title;
8770
8771 tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; 8761 tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
8772 tvi.pszText = UTF8toWide(title); 8762 tvi.pszText = UTF8toWide(title);
8773 tvi.cchTextMax = (int)_tcslen(tvi.pszText); 8763 tvi.cchTextMax = (int)_tcslen(tvi.pszText);
8774 tvi.iSelectedImage = tvi.iImage = _lookup_icon(handle, (HICON)icon, 1); 8764 tvi.iSelectedImage = tvi.iImage = _lookup_icon(handle, (HICON)icon, 1);
8775 tvi.hItem = (HTREEITEM)item; 8765 tvi.hItem = (HTREEITEM)item;