comparison win/dw.c @ 1872:eae36372d64d

Second Windows round of changes to split the data and string container functionality...
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 08 Aug 2013 18:26:46 +0000
parents 5a4d98cab9d3
children fb137f7f91e4
comparison
equal deleted inserted replaced
1871:3f571ad9b92e 1872:eae36372d64d
260 #define IS_VISTAPLUS (dwComctlVer >= PACKVERSION(6,10)) 260 #define IS_VISTAPLUS (dwComctlVer >= PACKVERSION(6,10))
261 261
262 #ifndef MIN 262 #ifndef MIN
263 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 263 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
264 #endif 264 #endif
265
266 #define _DW_DATA_TYPE_STRING 0
267 #define _DW_DATA_TYPE_POINTER 1
265 268
266 /* 269 /*
267 * For the dw*from_data() functions, a temporary file is required to write 270 * For the dw*from_data() functions, a temporary file is required to write
268 * the contents of the image to so it can be loaded by the Win32 API 271 * the contents of the image to so it can be loaded by the Win32 API
269 * We use _tempnam() which uses TMP env variable by default. It can be passed 272 * We use _tempnam() which uses TMP env variable by default. It can be passed
2010 memset(&lvi, 0, sizeof(LV_ITEM)); 2013 memset(&lvi, 0, sizeof(LV_ITEM));
2011 2014
2012 if(iItem > -1) 2015 if(iItem > -1)
2013 { 2016 {
2014 int (DWSIGNAL *treeselectfunc)(HWND, HWND, char *, void *, void *) = tmp->signalfunction; 2017 int (DWSIGNAL *treeselectfunc)(HWND, HWND, char *, void *, void *) = tmp->signalfunction;
2018 void **params;
2015 2019
2016 lvi.iItem = iItem; 2020 lvi.iItem = iItem;
2017 lvi.mask = LVIF_PARAM; 2021 lvi.mask = LVIF_PARAM;
2018 2022
2019 ListView_GetItem(tmp->window, &lvi); 2023 ListView_GetItem(tmp->window, &lvi);
2020 2024
2021 /* Seems to be having lParam as 1 which really sucks */ 2025 params = (void **)lvi.lParam;
2022 if(lvi.lParam < 100) 2026
2023 lvi.lParam = 0; 2027 treeselectfunc(tmp->window, 0, params ? (char *)params[_DW_DATA_TYPE_STRING] : NULL, tmp->data, params ? params[_DW_DATA_TYPE_POINTER] : NULL);
2024
2025 treeselectfunc(tmp->window, 0, (char *)lvi.lParam, tmp->data, 0);
2026 tmp = NULL; 2028 tmp = NULL;
2027 } 2029 }
2028 } 2030 }
2029 } 2031 }
2030 } 2032 }
2931 case WM_LBUTTONDBLCLK: 2933 case WM_LBUTTONDBLCLK:
2932 case WM_CHAR: 2934 case WM_CHAR:
2933 { 2935 {
2934 LV_ITEM lvi; 2936 LV_ITEM lvi;
2935 int iItem; 2937 int iItem;
2938 void **params = NULL;
2936 2939
2937 if(LOWORD(mp1) == '\t') 2940 if(LOWORD(mp1) == '\t')
2938 { 2941 {
2939 if(GetAsyncKeyState(VK_SHIFT) & 0x8000) 2942 if(GetAsyncKeyState(VK_SHIFT) & 0x8000)
2940 _shift_focus(hWnd, _DW_DIRECTION_BACKWARD); 2943 _shift_focus(hWnd, _DW_DIRECTION_BACKWARD);
2954 { 2957 {
2955 lvi.iItem = iItem; 2958 lvi.iItem = iItem;
2956 lvi.mask = LVIF_PARAM; 2959 lvi.mask = LVIF_PARAM;
2957 2960
2958 ListView_GetItem(hWnd, &lvi); 2961 ListView_GetItem(hWnd, &lvi);
2962 params = (void **)lvi.lParam;
2959 } 2963 }
2960 2964
2961 { 2965 {
2962 SignalHandler *tmp = Root; 2966 SignalHandler *tmp = Root;
2963 2967
2964 while(tmp) 2968 while(tmp)
2965 { 2969 {
2966 if(tmp->message == NM_DBLCLK && tmp->window == hWnd) 2970 if(tmp->message == NM_DBLCLK && tmp->window == hWnd)
2967 { 2971 {
2968 int (DWSIGNAL *containerselectfunc)(HWND, char *, void *) = tmp->signalfunction; 2972 int (DWSIGNAL *containerselectfunc)(HWND, char *, void *, void *) = tmp->signalfunction;
2969 2973
2970 /* Seems to be having lParam as 1 which really sucks */ 2974 containerselectfunc(tmp->window, params ? params[_DW_DATA_TYPE_STRING] : NULL, tmp->data, params ? params[_DW_DATA_TYPE_POINTER] : NULL);
2971 if(lvi.lParam < 100)
2972 lvi.lParam = 0;
2973
2974 containerselectfunc(tmp->window, (char *)lvi.lParam, tmp->data);
2975 tmp = NULL; 2975 tmp = NULL;
2976 } 2976 }
2977 if(tmp) 2977 if(tmp)
2978 tmp = tmp->next; 2978 tmp = tmp->next;
2979 } 2979 }
2991 int (DWSIGNAL *containercontextfunc)(HWND, char *, int, int, void *, void *) = tmp->signalfunction; 2991 int (DWSIGNAL *containercontextfunc)(HWND, char *, int, int, void *, void *) = tmp->signalfunction;
2992 LONG x,y; 2992 LONG x,y;
2993 LV_ITEM lvi; 2993 LV_ITEM lvi;
2994 int iItem; 2994 int iItem;
2995 LVHITTESTINFO lhi; 2995 LVHITTESTINFO lhi;
2996 TCHAR textbuf[1025] = {0};
2996 2997
2997 dw_pointer_query_pos(&x, &y); 2998 dw_pointer_query_pos(&x, &y);
2998 2999
2999 lhi.pt.x = x; 3000 lhi.pt.x = x;
3000 lhi.pt.y = y; 3001 lhi.pt.y = y;
3006 memset(&lvi, 0, sizeof(LV_ITEM)); 3007 memset(&lvi, 0, sizeof(LV_ITEM));
3007 3008
3008 if(iItem > -1) 3009 if(iItem > -1)
3009 { 3010 {
3010 lvi.iItem = iItem; 3011 lvi.iItem = iItem;
3011 lvi.mask = LVIF_PARAM; 3012 lvi.pszText = textbuf;
3013 lvi.cchTextMax = 1024;
3014 lvi.mask = LVIF_PARAM | LVIF_TEXT;
3012 3015
3013 ListView_GetItem(tmp->window, &lvi); 3016 ListView_GetItem(tmp->window, &lvi);
3014 ListView_SetSelectionMark(tmp->window, iItem); 3017 ListView_SetSelectionMark(tmp->window, iItem);
3015 } 3018 }
3016 3019
3017 /* Seems to be having lParam as 1 which really sucks */ 3020 containercontextfunc(tmp->window, lvi.pszText ? WideToUTF8(lvi.pszText) : NULL, x, y, tmp->data, (void *)lvi.lParam);
3018 if(lvi.lParam < 100)
3019 lvi.lParam = 0;
3020
3021 containercontextfunc(tmp->window, (char *)lvi.lParam, x, y, tmp->data, NULL);
3022 tmp = NULL; 3021 tmp = NULL;
3023 } 3022 }
3024 if(tmp) 3023 if(tmp)
3025 tmp = tmp->next; 3024 tmp = tmp->next;
3026 } 3025 }
9448 { 9447 {
9449 ListView_SetColumnWidth(handle, column, width); 9448 ListView_SetColumnWidth(handle, column, width);
9450 } 9449 }
9451 9450
9452 /* Internal version that handles both types */ 9451 /* Internal version that handles both types */
9453 void _dw_container_set_row_title(HWND handle, void *pointer, int row, char *title) 9452 void _dw_container_set_row_data(HWND handle, void *pointer, int row, int type, void *data)
9454 { 9453 {
9455 LV_ITEM lvi; 9454 LV_ITEM lvi;
9456 int item = 0; 9455 int item = 0;
9457 9456
9458 if(pointer) 9457 if(pointer)
9459 { 9458 {
9460 item = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_insertitem")); 9459 item = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_insertitem"));
9461 } 9460 }
9462 9461
9462 memset(&lvi, 0, sizeof(LV_ITEM));
9463
9463 lvi.iItem = row + item; 9464 lvi.iItem = row + item;
9464 lvi.iSubItem = 0;
9465 lvi.mask = LVIF_PARAM; 9465 lvi.mask = LVIF_PARAM;
9466 lvi.lParam = (LPARAM)title; 9466
9467 9467 if(ListView_GetItem(handle, &lvi))
9468 if(!ListView_SetItem(handle, &lvi) && lvi.lParam) 9468 {
9469 lvi.lParam = 0; 9469 void **params = (void **)lvi.lParam;
9470 9470 void *newparam = data;
9471
9472 /* Make sure we have our pointer array... */
9473 if(!params)
9474 {
9475 /* If not allocate it */
9476 params = (void **)calloc(2, sizeof(void *));
9477 lvi.lParam = (LPARAM)params;
9478 ListView_SetItem(handle, &lvi);
9479 }
9480 /* If type string, we need to duplicate the string...
9481 * freeing any existing string.
9482 */
9483 if(type == _DW_DATA_TYPE_STRING)
9484 {
9485 void *oldparam = params[type];
9486
9487 params[type] = NULL;
9488
9489 if(oldparam)
9490 free(oldparam);
9491 if(newparam)
9492 newparam = _strdup((char *)newparam);
9493 }
9494 /* Set the new data in the pointer array */
9495 params[type] = newparam;
9496 }
9471 } 9497 }
9472 9498
9473 /* 9499 /*
9474 * Sets the title of a row in the container. 9500 * Sets the title of a row in the container.
9475 * Parameters: 9501 * Parameters:
9477 * row: Zero based row of data being set. 9503 * row: Zero based row of data being set.
9478 * title: String title of the item. 9504 * title: String title of the item.
9479 */ 9505 */
9480 void API dw_container_set_row_title(void *pointer, int row, char *title) 9506 void API dw_container_set_row_title(void *pointer, int row, char *title)
9481 { 9507 {
9482 _dw_container_set_row_title(pointer, pointer, row, title); 9508 _dw_container_set_row_data(pointer, pointer, row, _DW_DATA_TYPE_STRING, title);
9483 } 9509 }
9484 9510
9485 /* 9511 /*
9486 * Changes the title of a row already inserted in the container. 9512 * Changes the title of a row already inserted in the container.
9487 * Parameters: 9513 * Parameters:
9489 * row: Zero based row of data being set. 9515 * row: Zero based row of data being set.
9490 * title: String title of the item. 9516 * title: String title of the item.
9491 */ 9517 */
9492 void API dw_container_change_row_title(HWND handle, int row, char *title) 9518 void API dw_container_change_row_title(HWND handle, int row, char *title)
9493 { 9519 {
9494 _dw_container_set_row_title(handle, NULL, row, title); 9520 _dw_container_set_row_data(handle, NULL, row, _DW_DATA_TYPE_STRING, title);
9521 }
9522
9523 /*
9524 * Sets the title of a row in the container.
9525 * Parameters:
9526 * pointer: Pointer to the allocated memory in dw_container_alloc().
9527 * row: Zero based row of data being set.
9528 * data: Data pointer.
9529 */
9530 void API dw_container_set_row_data(void *pointer, int row, void *data)
9531 {
9532 _dw_container_set_row_data(pointer, pointer, row, _DW_DATA_TYPE_POINTER, data);
9533 }
9534
9535 /*
9536 * Changes the data of a row already inserted in the container.
9537 * Parameters:
9538 * handle: Handle to the container window (widget).
9539 * row: Zero based row of data being set.
9540 * data: Data pointer.
9541 */
9542 void API dw_container_change_row_data(HWND handle, int row, void *data)
9543 {
9544 _dw_container_set_row_data(handle, NULL, row, _DW_DATA_TYPE_POINTER, data);
9495 } 9545 }
9496 9546
9497 /* 9547 /*
9498 * Sets the title of a row in the container. 9548 * Sets the title of a row in the container.
9499 * Parameters: 9549 * Parameters:
9568 */ 9618 */
9569 char * API dw_container_query_start(HWND handle, unsigned long flags) 9619 char * API dw_container_query_start(HWND handle, unsigned long flags)
9570 { 9620 {
9571 LV_ITEM lvi; 9621 LV_ITEM lvi;
9572 int _index = ListView_GetNextItem(handle, -1, flags); 9622 int _index = ListView_GetNextItem(handle, -1, flags);
9623 void **params;
9624 int type = _DW_DATA_TYPE_STRING;
9573 9625
9574 if(_index == -1) 9626 if(_index == -1)
9575 return NULL; 9627 return NULL;
9628
9629 if(flags & DW_CR_RETDATA)
9630 type = _DW_DATA_TYPE_POINTER;
9576 9631
9577 memset(&lvi, 0, sizeof(LV_ITEM)); 9632 memset(&lvi, 0, sizeof(LV_ITEM));
9578 9633
9579 lvi.iItem = _index; 9634 lvi.iItem = _index;
9580 lvi.mask = LVIF_PARAM; 9635 lvi.mask = LVIF_PARAM;
9581 9636
9582 ListView_GetItem(handle, &lvi); 9637 ListView_GetItem(handle, &lvi);
9638 params = (void **)lvi.lParam;
9583 9639
9584 dw_window_set_data(handle, "_dw_index", DW_INT_TO_POINTER(_index)); 9640 dw_window_set_data(handle, "_dw_index", DW_INT_TO_POINTER(_index));
9585 return (char *)lvi.lParam; 9641 return params ? (char *)params[type] : NULL;
9586 } 9642 }
9587 9643
9588 /* 9644 /*
9589 * Continues an existing query of a container. 9645 * Continues an existing query of a container.
9590 * Parameters: 9646 * Parameters:
9595 */ 9651 */
9596 char * API dw_container_query_next(HWND handle, unsigned long flags) 9652 char * API dw_container_query_next(HWND handle, unsigned long flags)
9597 { 9653 {
9598 LV_ITEM lvi; 9654 LV_ITEM lvi;
9599 int _index = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_index")); 9655 int _index = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_index"));
9656 void **params;
9657 int type = _DW_DATA_TYPE_STRING;
9600 9658
9601 _index = ListView_GetNextItem(handle, _index, flags); 9659 _index = ListView_GetNextItem(handle, _index, flags);
9602 9660
9603 if(_index == -1) 9661 if(_index == -1)
9604 return NULL; 9662 return NULL;
9605 9663
9664 if(flags & DW_CR_RETDATA)
9665 type = _DW_DATA_TYPE_POINTER;
9666
9606 memset(&lvi, 0, sizeof(LV_ITEM)); 9667 memset(&lvi, 0, sizeof(LV_ITEM));
9607 9668
9608 lvi.iItem = _index; 9669 lvi.iItem = _index;
9609 lvi.mask = LVIF_PARAM; 9670 lvi.mask = LVIF_PARAM;
9610 9671
9611 ListView_GetItem(handle, &lvi); 9672 ListView_GetItem(handle, &lvi);
9673 params = (void **)lvi.lParam;
9612 9674
9613 dw_window_set_data(handle, "_dw_index", DW_INT_TO_POINTER(_index)); 9675 dw_window_set_data(handle, "_dw_index", DW_INT_TO_POINTER(_index));
9614 return (char *)lvi.lParam; 9676 return params ? (char *)params[type] : NULL;
9615 } 9677 }
9616 9678
9617 /* 9679 /*
9618 * Cursors the item with the text speficied, and scrolls to that item. 9680 * Cursors the item with the text speficied, and scrolls to that item.
9619 * Parameters: 9681 * Parameters:
9621 * text: Text usually returned by dw_container_query(). 9683 * text: Text usually returned by dw_container_query().
9622 */ 9684 */
9623 void API dw_container_cursor(HWND handle, char *text) 9685 void API dw_container_cursor(HWND handle, char *text)
9624 { 9686 {
9625 int index = ListView_GetNextItem(handle, -1, LVNI_ALL); 9687 int index = ListView_GetNextItem(handle, -1, LVNI_ALL);
9626 int textcomp = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_textcomp"));
9627 9688
9628 while ( index != -1 ) 9689 while ( index != -1 )
9629 { 9690 {
9630 LV_ITEM lvi; 9691 LV_ITEM lvi;
9692 void **params;
9631 9693
9632 memset(&lvi, 0, sizeof(LV_ITEM)); 9694 memset(&lvi, 0, sizeof(LV_ITEM));
9633 9695
9634 lvi.iItem = index; 9696 lvi.iItem = index;
9635 lvi.mask = LVIF_PARAM; 9697 lvi.mask = LVIF_PARAM;
9636 9698
9637 ListView_GetItem( handle, &lvi ); 9699 ListView_GetItem( handle, &lvi );
9638 9700 params = (void **)lvi.lParam;
9639 if ( (textcomp && lvi.lParam && strcmp( (char *)lvi.lParam, text ) == 0) || (!textcomp && (char *)lvi.lParam == text) ) 9701
9702 if ( params && params[_DW_DATA_TYPE_STRING] && strcmp( (char *)params[_DW_DATA_TYPE_STRING], text ) == 0 )
9640 { 9703 {
9641 unsigned long width, height; 9704 unsigned long width, height;
9642 9705
9643 ListView_SetItemState( handle, index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED ); 9706 ListView_SetItemState( handle, index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED );
9644 dw_window_get_pos_size( handle, NULL, NULL, &width, &height); 9707 dw_window_get_pos_size( handle, NULL, NULL, &width, &height);
9651 index = ListView_GetNextItem( handle, index, LVNI_ALL ); 9714 index = ListView_GetNextItem( handle, index, LVNI_ALL );
9652 } 9715 }
9653 } 9716 }
9654 9717
9655 /* 9718 /*
9719 * Cursors the item with the text speficied, and scrolls to that item.
9720 * Parameters:
9721 * handle: Handle to the window (widget) to be queried.
9722 * text: Text usually returned by dw_container_query().
9723 */
9724 void API dw_container_cursor_by_data(HWND handle, void *data)
9725 {
9726 int index = ListView_GetNextItem(handle, -1, LVNI_ALL);
9727
9728 while ( index != -1 )
9729 {
9730 LV_ITEM lvi;
9731 void **params;
9732
9733 memset(&lvi, 0, sizeof(LV_ITEM));
9734
9735 lvi.iItem = index;
9736 lvi.mask = LVIF_PARAM;
9737
9738 ListView_GetItem( handle, &lvi );
9739 params = (void **)lvi.lParam;
9740
9741 if ( params && params[_DW_DATA_TYPE_POINTER] == data )
9742 {
9743 unsigned long width, height;
9744
9745 ListView_SetItemState( handle, index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED );
9746 dw_window_get_pos_size( handle, NULL, NULL, &width, &height);
9747 if(width < 10 || height < 10)
9748 dw_window_set_data( handle, "_dw_cursor", DW_INT_TO_POINTER(index) );
9749 ListView_EnsureVisible( handle, index, TRUE );
9750 return;
9751 }
9752
9753 index = ListView_GetNextItem( handle, index, LVNI_ALL );
9754 }
9755 }
9756
9757 /*
9656 * Deletes the item with the text speficied. 9758 * Deletes the item with the text speficied.
9657 * Parameters: 9759 * Parameters:
9658 * handle: Handle to the window (widget). 9760 * handle: Handle to the window (widget).
9659 * text: Text usually returned by dw_container_query(). 9761 * text: Text usually returned by dw_container_query().
9660 */ 9762 */
9661 void API dw_container_delete_row(HWND handle, char *text) 9763 void API dw_container_delete_row(HWND handle, char *text)
9662 { 9764 {
9663 int index = ListView_GetNextItem(handle, -1, LVNI_ALL); 9765 int index = ListView_GetNextItem(handle, -1, LVNI_ALL);
9664 int textcomp = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_textcomp")); 9766 void **params;
9665 9767
9666 while(index != -1) 9768 while(index != -1)
9667 { 9769 {
9668 LV_ITEM lvi; 9770 LV_ITEM lvi;
9771 void **params;
9669 9772
9670 memset(&lvi, 0, sizeof(LV_ITEM)); 9773 memset(&lvi, 0, sizeof(LV_ITEM));
9671 9774
9672 lvi.iItem = index; 9775 lvi.iItem = index;
9673 lvi.mask = LVIF_PARAM; 9776 lvi.mask = LVIF_PARAM;
9674 9777
9675 ListView_GetItem(handle, &lvi); 9778 ListView_GetItem(handle, &lvi);
9676 9779 params = (void **)lvi.lParam;
9677 if ( (textcomp && lvi.lParam && strcmp( (char *)lvi.lParam, text ) == 0) || (!textcomp && (char *)lvi.lParam == text) ) 9780
9781 if ( params && params[_DW_DATA_TYPE_STRING] && strcmp( (char *)params[_DW_DATA_TYPE_STRING], text ) == 0 )
9678 { 9782 {
9679 int _index = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_index")); 9783 int _index = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_index"));
9680 9784
9681 if(index < _index) 9785 if(index < _index)
9682 dw_window_set_data(handle, "_dw_index", DW_INT_TO_POINTER((_index - 1))); 9786 dw_window_set_data(handle, "_dw_index", DW_INT_TO_POINTER((_index - 1)));
9683 9787
9684 ListView_DeleteItem(handle, index); 9788 ListView_DeleteItem(handle, index);
9685 return; 9789 return;
9686 } 9790 }
9687 9791
9688 index = ListView_GetNextItem(handle, index, LVNI_ALL); 9792 index = ListView_GetNextItem(handle, index, LVNI_ALL);
9793 }
9794 }
9795
9796 /*
9797 * Deletes the item with the text speficied.
9798 * Parameters:
9799 * handle: Handle to the window (widget).
9800 * text: Text usually returned by dw_container_query().
9801 */
9802 void API dw_container_delete_row_by_data(HWND handle, void *data)
9803 {
9804 int index = ListView_GetNextItem(handle, -1, LVNI_ALL);
9805
9806 while(index != -1)
9807 {
9808 LV_ITEM lvi;
9809 void **params;
9810
9811 memset(&lvi, 0, sizeof(LV_ITEM));
9812
9813 lvi.iItem = index;
9814 lvi.mask = LVIF_PARAM;
9815
9816 ListView_GetItem(handle, &lvi);
9817 params = (void **)lvi.lParam;
9818
9819 if ( params && params[_DW_DATA_TYPE_POINTER] == data )
9820 {
9821 int _index = DW_POINTER_TO_INT(dw_window_get_data(handle, "_dw_index"));
9822
9823 if(index < _index)
9824 dw_window_set_data(handle, "_dw_index", DW_INT_TO_POINTER((_index - 1)));
9825
9826 ListView_DeleteItem(handle, index);
9827 return;
9828 }
9829
9830 index = ListView_GetNextItem(handle, index, LVNI_ALL);
9689 } 9831 }
9690 } 9832 }
9691 9833
9692 /* 9834 /*
9693 * Optimizes the column widths so that all data is visible. 9835 * Optimizes the column widths so that all data is visible.