📄 multilist.c
字号:
*---------------------------------------------------------------------------*//* ARGSUSED */static void Toggle(mlw,event,params,num_params)XfwfMultiListWidget mlw;XEvent *event;String *params;Cardinal *num_params;{ int click_x,click_y; int status,item_index,row,column; click_x = event->xbutton.x; click_y = event->xbutton.y; PixelToRowColumn(mlw,click_x,click_y,&row,&column); status = RowColumnToItem(mlw,row,column,&item_index); if ((status == False) || (!MultiListItemSensitive(MultiListNthItem(mlw,item_index)))) { MultiListMostRecentAct(mlw) = XfwfMultiListActionHighlight; MultiListMostRecentItem(mlw) = -1; } else { MultiListMostRecentAct(mlw) = XfwfMultiListToggleItem(mlw,item_index); MultiListMostRecentItem(mlw) = item_index; }} /* End Toggle *//*---------------------------------------------------------------------------* Extend(mlw,event,params,num_params) This action handler implements the extension of a selection/ deselection region. The MultiListMostRecentAct(mlw) variable is used to determine if items are to be selected or unselected. This routine performs select or unselect actions on each item it is called on. *---------------------------------------------------------------------------*//* ARGSUSED */static void Extend(mlw,event,params,num_params)XfwfMultiListWidget mlw;XEvent *event;String *params;Cardinal *num_params;{ int click_x,click_y; int status,item_index,row,column; click_x = ((XMotionEvent*)event)->x; click_y = ((XMotionEvent*)event)->y; PixelToRowColumn(mlw,click_x,click_y,&row,&column); status = RowColumnToItem(mlw,row,column,&item_index); if ((status == True) && (MultiListItemSensitive(MultiListNthItem(mlw,item_index)))) { MultiListMostRecentItem(mlw) = item_index; if (MultiListMostRecentAct(mlw) == XfwfMultiListActionHighlight) XfwfMultiListHighlightItem(mlw,item_index); else XfwfMultiListUnhighlightItem(mlw,item_index); }} /* End Extend *//*---------------------------------------------------------------------------* Notify(mlw,event,params,num_params) This function performs the Notify action, which issues a callback after a selection/unselection has completed. All callbacks on the callback list are invoked, and a XfxfMultiListReturnStruct describing the selection state is returned. In addition, if the XtNpasteBuffer resource is true and at least one text item is selected, all the selected items are placed in the X cut buffer (buf(0)) separated by newlines. *---------------------------------------------------------------------------*//* ARGSUSED */static void Notify(mlw,event,params,num_params)XfwfMultiListWidget mlw;XEvent *event;String *params;Cardinal *num_params;{ char *buffer; String string; int i,byte_count,item_index; XfwfMultiListReturnStruct ret_value; if ((MultiListNumSelected(mlw) != 0) && MultiListPaste(mlw)) { byte_count = 0; for (i = 0; i < MultiListNumSelected(mlw); i++) { item_index = MultiListSelArray(mlw)[i]; string = MultiListItemString(MultiListNthItem(mlw, item_index)); byte_count = byte_count + strlen(string) + 1; } buffer = (char *)malloc(byte_count); buffer[0] = '\0'; for (i = 0; i < MultiListNumSelected(mlw); i++) { if (i != 0) strcat(buffer,"\n"); item_index = MultiListSelArray(mlw)[i]; string = MultiListItemString(MultiListNthItem(mlw, item_index)); strcat(buffer,string); } XStoreBytes(XtDisplay(mlw),buffer,byte_count); free(buffer); } ret_value.action = MultiListMostRecentAct(mlw); ret_value.item = MultiListMostRecentItem(mlw); if (ret_value.item == -1) ret_value.string = NULL; else ret_value.string = MultiListItemString(MultiListNthItem(mlw, ret_value.item)); ret_value.num_selected = MultiListNumSelected(mlw); ret_value.selected_items = MultiListSelArray(mlw); XtCallCallbacks((Widget)mlw,XtNcallback,(caddr_t)&ret_value);} /* End Notify *//*===========================================================================* U S E R C A L L A B L E U T I L I T Y R O U T I N E S *===========================================================================*//*---------------------------------------------------------------------------* Boolean XfwfMultiListHighlightItem(mlw,item_index) This routine selects an item with index <item_index> in the MultiList widget <mlw>. If a maximum number of selections is specified and exceeded, the earliest selection will be unselected. If <item_index> doesn't correspond to an item the most recently clicked item will be set to -1 and this routine will immediately return, otherwise the most recently clicked item will be set to the current item. If the clicked on item is not sensitive, or if the click is not on an item, False is returned, else True is returned. *---------------------------------------------------------------------------*/Boolean XfwfMultiListHighlightItem(mlw,item_index)XfwfMultiListWidget mlw;int item_index;{ XfwfMultiListItem *item; if (MultiListMaxSelectable(mlw) == 0) return(False); if (item_index < 0 || item_index >= MultiListNumItems(mlw)) { MultiListMostRecentItem(mlw) = -1; return(False); } item = MultiListNthItem(mlw,item_index); if (MultiListItemSensitive(item) == False) return(False); MultiListMostRecentItem(mlw) = item_index; if (MultiListItemHighlighted(item) == True) return(True); if (MultiListNumSelected(mlw) == MultiListMaxSelectable(mlw)) { XfwfMultiListUnhighlightItem(mlw,MultiListSelArray(mlw)[0]); } MultiListItemHighlighted(item) = True; MultiListSelArray(mlw)[MultiListNumSelected(mlw)] = item_index; ++ MultiListNumSelected(mlw); RedrawItem(mlw,item_index); return(True);} /* End XfwfMultiListHighlightItem *//*---------------------------------------------------------------------------* XfwfMultiListHighlightAll(mlw) This routine highlights all highlightable items in the MultiList widget <mlw>, up to the maximum number of allowed highlightable items; *---------------------------------------------------------------------------*/void XfwfMultiListHighlightAll(mlw)XfwfMultiListWidget mlw;{ int i; XfwfMultiListItem *item; MultiListNumSelected(mlw) = 0; for (i = 0; i < MultiListNumItems(mlw); i++) { item = MultiListNthItem(mlw,i); MultiListItemHighlighted(item) = False; } for (i = 0; i < MultiListNumItems(mlw); i++) { if (MultiListNumSelected(mlw) == MultiListMaxSelectable(mlw)) break; item = MultiListNthItem(mlw,i); if (MultiListItemSensitive(item) == False) continue; MultiListItemHighlighted(item) = True; MultiListSelArray(mlw)[MultiListNumSelected(mlw)] = i; ++ MultiListNumSelected(mlw); } RedrawAll(mlw);} /* End XfwfMultiListHighlightAll *//*---------------------------------------------------------------------------* XfwfMultiListUnhighlightItem(mlw,item_index) This routine unselects the item with index <item_index> in the MultiList widget <mlw>. If <item_index> doesn't correspond to a selected item, then nothing will happen. Otherwise, the item is unselected and the selection array and count are updated. *---------------------------------------------------------------------------*/void XfwfMultiListUnhighlightItem(mlw,item_index)XfwfMultiListWidget mlw;int item_index;{ int i; XfwfMultiListItem *item; if (MultiListMaxSelectable(mlw) == 0) return; if (item_index < 0 || item_index >= MultiListNumItems(mlw)) return; item = MultiListNthItem(mlw,item_index); if (MultiListItemHighlighted(item) == False) return; MultiListItemHighlighted(item) = False; for (i = 0; i < MultiListNumSelected(mlw); i++) if (MultiListSelArray(mlw)[i] == item_index) break; for (i = i + 1; i < MultiListNumSelected(mlw); i++) MultiListSelArray(mlw)[i - 1] = MultiListSelArray(mlw)[i]; -- MultiListNumSelected(mlw); RedrawItem(mlw,item_index);} /* End XfwfMultiListUnhighlightItem *//*---------------------------------------------------------------------------* XfwfMultiListUnhighlightAll(mlw) This routine unhighlights all items in the MultiList widget <mlw>. *---------------------------------------------------------------------------*/void XfwfMultiListUnhighlightAll(mlw)XfwfMultiListWidget mlw;{ int i; XfwfMultiListItem *item; for (i = 0; i < MultiListNumItems(mlw); i++) { item = MultiListNthItem(mlw,i); if (MultiListItemHighlighted(item)) XfwfMultiListUnhighlightItem(mlw,i); } MultiListNumSelected(mlw) = 0;} /* End XfwfMultiListUnhighlightAll *//*---------------------------------------------------------------------------* int XfwfMultiListToggleItem(mlw,item_index) This routine highlights the item with index <item_index> if it is unhighlighted and unhighlights it if it is already highlighted. The action performed by the toggle is returned (XfwfMultiListActionHighlight or XfwfMultiListActionUnhighlight). *---------------------------------------------------------------------------*/int XfwfMultiListToggleItem(mlw,item_index)XfwfMultiListWidget mlw;int item_index;{ XfwfMultiListItem *item; if (MultiListMaxSelectable(mlw) == 0) return(XfwfMultiListActionNothing); if (item_index < 0 || item_index >= MultiListNumItems(mlw)) return(XfwfMultiListActionNothing); item = MultiListNthItem(mlw,item_index); if (MultiListItemSensitive(item) == False) return(XfwfMultiListActionNothing); if (MultiListItemHighlighted(item)) { XfwfMultiListUnhighlightItem(mlw,item_index); return(XfwfMultiListActionUnhighlight); } else { XfwfMultiListHighlightItem(mlw,item_index); return(XfwfMultiListActionHighlight); }} /* End XfwfMultiListToggleItem *//*---------------------------------------------------------------------------* XfwfMultiListReturnStruct *XfwfMultiListGetHighlighted(mlw) This routine takes a MultiList widget <mlw> and returns a XfwfMultiListReturnStruct whose num_selected and selected_items fields contain the highlight information. The action field is set to MULTILIST_ACTION_STATUS, and the item_index and string fields are invalid. *---------------------------------------------------------------------------*/XfwfMultiListReturnStruct *XfwfMultiListGetHighlighted(mlw)XfwfMultiListWidget mlw;{ XfwfMultiListItem *item; static XfwfMultiListReturnStruct ret_value; ret_value.action = XfwfMultiListActionStatus; if (MultiListNumSelected(mlw) == 0) { ret_value.item = -1; ret_value.string = NULL; } else { ret_value.item = MultiListSelArray(mlw) [MultiListNumSelected(mlw) - 1]; item = MultiListNthItem(mlw,ret_value.item); ret_value.string = MultiListItemString(item); } ret_value.num_selected = MultiListNumSelected(mlw); ret_value.selected_items = MultiListSelArray(mlw); return(&ret_value);} /* End XfwfMultiListGetHighlighted *//*---------------------------------------------------------------------------* Boolean XfwfMultiListIsHighlighted(mlw,item_index) This routine checks if the item with index <item_index> is highlighted and returns True or False depending. If <item_index> is invalid, False is returned. *---------------------------------------------------------------------------*/Boolean XfwfMultiListIsHighlighted(mlw,item_index)XfwfMultiListWidget mlw;int item_index;{ XfwfMultiListItem *item; if (item_index < 0 || item_index >= MultiListNumItems(mlw)) return(False); item = MultiListNthItem(mlw,item_index); return(MultiListItemHighlighted(item));} /* End XfwfMultiListIsHighlighted *//*---------------------------------------------------------------------------* Boolean XfwfMultiListGetItemInfo(mlw,item_index,str_ptr,h_ptr,s_ptr) This routine returns the string, highlight status and sensitivity information for the item with index <item_index> via the pointers <str_ptr>, <h_ptr> and <s_ptr>. If the item index is invalid, False is returned, else True is returned. *---------------------------------------------------------------------------*/Boolean XfwfMultiListGetItemInfo(mlw,item_index,str_ptr,h_ptr,s_ptr)XfwfMultiListWidget mlw;int item_index;String *str_ptr;Boolean *h_ptr,*s_ptr;{ XfwfMultiListItem *item; if (item_index < 0 || item_index >= MultiListNumItems(mlw)) return(False); item = MultiListNthItem(mlw,item_index); *str_ptr = MultiListItemString(item); *h_ptr = MultiListItemHighlighted(item); *s_ptr = MultiListItemSensitive(item); return(True);} /* End XfwfMultiListGetItemInfo *//*---------------------------------------------------------------------------* XfwfMultiListSetNewData(mlw,list,nitems,longest,resize, sensitivity_array) This routine will set a new set of strings <list> into the MultiList widget <mlw>. If <resize> is True, the MultiList widget will try to resize itself. *---------------------------------------------------------------------------*/#if NeedFunctionPrototypesvoidXfwfMultiListSetNewData(XfwfMultiListWidget mlw, String *list, int nitems, int longest, int resize, Boolean *sensitivity_array)#elsevoidXfwfMultiListSetNewData(mlw,list,nitems,longest,resize,sensitivity_array)XfwfMultiListWidget mlw;String *list;int nitems,longest;int resize;Boolean *sensitivity_array;#endif{ DestroyOldData(mlw); MultiListList(mlw) = list; MultiListNumItems(mlw) = max(nitems,0); MultiListLongest(mlw) = max(longest,0); MultiListSensitiveArray(mlw) = sensitivity_array; InitializeNewData(mlw); RecalcCoords(mlw,resize,resize); if (XtIsRealized((Widget)mlw)) Redisplay(mlw,NULL,NULL);} /* End XfwfMultiListSetNewData */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -