wgui_asyncdynamic_menuitems.c
上传用户:lqx1163
上传日期:2014-08-13
资源大小:9183k
文件大小:16k
源码类别:

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*******************************************************************************
  36.  * Filename:
  37.  * ---------
  38.  * wgui_asyncdynamic_menuitems.c
  39.  *
  40.  * Project:
  41.  * --------
  42.  *   PlutoMMI
  43.  *
  44.  * Description:
  45.  * ------------
  46.  *   In order to use limited memory (size decided in compile-time) to load unlimited items (size decide in run-time) 
  47.  *   to a category screen, a modification in MMI for dynamic item loading is required as the following.
  48.  *
  49.  *   Compared to dynamic list menu, 
  50.  *   1. it gets data of multiple menu items in one callback function,
  51.  *   2. it uses icontext-list menu item instead of icontext menu item.
  52.  *
  53.  * Author:
  54.  * -------
  55.  * -------
  56.  * -------
  57.  * -------
  58.  *
  59.  *============================================================================
  60.  *             HISTORY
  61.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  62.  *------------------------------------------------------------------------------
  63.  * removed!
  64.  *
  65.  * removed!
  66.  * removed!
  67.  * removed!
  68.  *
  69.  * removed!
  70.  * removed!
  71.  * removed!
  72.  *
  73.  *------------------------------------------------------------------------------
  74.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  75.  *============================================================================
  76.  ****************************************************************************/
  77. #include "wgui_fixed_menuitems.h"
  78. #include "wgui_asyncdynamic_menuitems.h"
  79. #include "gui_asyncdynamic_menus.h"
  80. #include "DebugInitDef.h"
  81. asyncdynamic_item_circular_buffer_t asyncdynamic_item_buffer;
  82. #if (MAX_FIXED_ICONTEXT_LIST_MENU_ITEMS < MAX_ASYNCDYNAMIC_ITEMS_BUFF)
  83. #error "Internal parameter error"
  84. #endif 
  85. #if (MAX_SUB_MENUS < MAX_ASYNCDYNAMIC_ITEMS_BUFF)
  86. #error "Internal parameter error"
  87. #endif 
  88. /*****************************************************************************
  89.  * FUNCTION
  90.  *  init_asyncdynamic_item_buffer
  91.  * DESCRIPTION
  92.  *  initialize the global dynamic item buffer
  93.  * PARAMETERS
  94.  *  total_items         [IN]        
  95.  *  get_item_func       [IN]        A call back function for filling in item text & image at run time
  96.  *  get_hint_func       [IN]        Callback funtion for filling hint data
  97.  *  h_item(?)           [IN]        Index of highlighted item
  98.  *  n_items(?)          [IN]        Total number of items
  99.  * RETURNS
  100.  *  S32
  101.  * REMARKS
  102.  *  a. If the icontext-list menu item has more than one string, it can not support hint callback
  103.  *  because hint and secnd string item use the same memory buffer.
  104.  *  b. If 'history' is not NULL, 'h_item' is ignored.
  105.  *****************************************************************************/
  106. S32 init_asyncdynamic_item_buffer(S32 total_items, GetAsyncItemFuncPtr get_item_func, GetAsyncHintFuncPtr get_hint_func)
  107. {
  108.     /*----------------------------------------------------------------*/
  109.     /* Local Variables                                                */
  110.     /*----------------------------------------------------------------*/
  111.     /*----------------------------------------------------------------*/
  112.     /* Code Body                                                      */
  113.     /*----------------------------------------------------------------*/
  114.     asyncdynamic_item_buffer.head_item_index = 0;
  115.     asyncdynamic_item_buffer.head = 0;
  116.     asyncdynamic_item_buffer.tail = 0;
  117.     asyncdynamic_item_buffer.count = 0;
  118.     asyncdynamic_item_buffer.n_total_items = total_items;
  119.     asyncdynamic_item_buffer.load_func = get_item_func;
  120.     asyncdynamic_item_buffer.hint_func = get_hint_func;
  121.     /* asyncdynamic_list_goto_item_no_redraw() will load the data */
  122.     return 1;
  123. }
  124. /*****************************************************************************
  125.  * FUNCTION
  126.  *  get_asyncdynamic_item_from_buffer
  127.  * DESCRIPTION
  128.  *  a convenient function to get the pointer of a item in the buffer
  129.  * PARAMETERS
  130.  *  index       [IN]        index of the item to be retrieved
  131.  * RETURNS
  132.  *  fixed_icontext_menuitem_type*
  133.  *****************************************************************************/
  134. fixed_icontext_list_menuitem_type *get_asyncdynamic_item_from_buffer(S32 index)
  135. {
  136.     /*----------------------------------------------------------------*/
  137.     /* Local Variables                                                */
  138.     /*----------------------------------------------------------------*/
  139.     S32 offset;
  140.     /*----------------------------------------------------------------*/
  141.     /* Code Body                                                      */
  142.     /*----------------------------------------------------------------*/
  143.     offset = index - asyncdynamic_item_buffer.head_item_index;
  144.     MMI_ASSERT(offset >= 0 && offset < asyncdynamic_item_buffer.count);
  145.     return &MMI_fixed_icontext_list_menuitems[(offset + asyncdynamic_item_buffer.head) & MASK_ASYNCDYNAMIC_ITEMS_BUFF];
  146. }
  147. /*****************************************************************************
  148.  * FUNCTION
  149.  *  in_asyncdynamic_item_buffer
  150.  * DESCRIPTION
  151.  *  a convenient function to check whether a item is loaded in buffer
  152.  * PARAMETERS
  153.  *  index       [IN]        index of the item to be checked
  154.  * RETURNS
  155.  *  pBOOL : TRUE / FALSE
  156.  *****************************************************************************/
  157. pBOOL in_asyncdynamic_item_buffer(S32 index)
  158. {
  159.     /*----------------------------------------------------------------*/
  160.     /* Local Variables                                                */
  161.     /*----------------------------------------------------------------*/
  162.     S32 count;
  163.     /*----------------------------------------------------------------*/
  164.     /* Code Body                                                      */
  165.     /*----------------------------------------------------------------*/
  166.     if (asyncdynamic_item_buffer.count == 0)
  167.     {
  168.         return FALSE;
  169.     }
  170.     count = index - asyncdynamic_item_buffer.head_item_index;
  171.     if (count < 0 || count >= asyncdynamic_item_buffer.count)
  172.     {
  173.         return FALSE;
  174.     }
  175.     return TRUE;
  176. }
  177. /*****************************************************************************
  178.  * FUNCTION
  179.  *  load_chunk_asyncdynamic_item_buffer
  180.  * DESCRIPTION
  181.  *  load a chunk of items, starting from [start_index] to [start_index+n_items-1], to buffer
  182.  *  the loading machnism will try to maintain the contiguous buffer as big as possible
  183.  * IMPACT
  184.  *  this function may unload some other items in the buffer
  185.  * PARAMETERS
  186.  *  start_index     [IN]        the starting index of requested items
  187.  *  n_items         [IN]        the number of items to be loaded
  188.  * RETURNS
  189.  *  1: success, 0: fail
  190.  *****************************************************************************/
  191. S32 load_chunk_asyncdynamic_item_buffer(S32 start_index, S32 n_items)
  192. {
  193.     /*----------------------------------------------------------------*/
  194.     /* Local Variables                                                */
  195.     /*----------------------------------------------------------------*/
  196.     S32 size;
  197.     S32 i;
  198.     S32 start;  /* Start index in queue */
  199.     S32 offset; /* Offset to queue head */
  200.     S32 count;  /* count of loaded menu item */
  201.     gui_iconlist_menu_item md[MAX_ASYNCDYNAMIC_ITEMS_BUFF];
  202.     /*----------------------------------------------------------------*/
  203.     /* Code Body                                                      */
  204.     /*----------------------------------------------------------------*/
  205.     /* Use two array subMenuData[] and hintData[] only. */
  206.     /* MMI_DBG_ASSERT(!asyncdynamic_item_buffer.hint_func || MMI_fixed_icontext_list_menuitem.n_text_columns <= 1); */
  207.     MMI_DBG_ASSERT(MMI_fixed_icontext_list_menuitem.n_text_columns <= 2);
  208.     /*
  209.      * FIXME. 
  210.      * 1. the algorithm is slightly different than load_chunk_dynamic_item_buffer() 
  211.      * it should be revised some day.
  212.      *
  213.      * 2. The performance can be improved if some data is already in the queue.
  214.      * This is okay because n_items is typically 1 or 2. However, n_items might be large
  215.      * with touch screen.
  216.      * 
  217.      */
  218.     /* 
  219.      * Compute the number of menu item to load 
  220.      */
  221.     if (asyncdynamic_item_buffer.count == 0)
  222.     {
  223.         offset = 0;
  224.     }
  225.     else    /* sometimes offset < 0 */
  226.     {
  227.         offset = start_index - asyncdynamic_item_buffer.head_item_index;
  228.     }
  229.     if (n_items > MAX_ASYNCDYNAMIC_ITEMS_BUFF)
  230.     {
  231.         n_items = MAX_ASYNCDYNAMIC_ITEMS_BUFF;
  232.     }
  233.     if (start_index + n_items > asyncdynamic_item_buffer.n_total_items)
  234.     {
  235.         n_items = asyncdynamic_item_buffer.n_total_items - start_index;
  236.     }
  237.     if (n_items <= 0)
  238.     {
  239.         return 0;
  240.     }
  241.     /* 
  242.      * Get the data 
  243.      */
  244.     for (i = 0; i < n_items; i++)   /* Use md[] to hold data temporarily */
  245.     {
  246.         /* We hold data in subMenuData[] and hintData[]. */
  247.         if (MMI_fixed_icontext_list_menuitem.n_text_columns >= 1)
  248.         {
  249.             md[i].item_list[0] = (UI_string_type) subMenuData[(i + start_index) & MASK_ASYNCDYNAMIC_ITEMS_BUFF];
  250.         }
  251.         if (MMI_fixed_icontext_list_menuitem.n_text_columns >= 2)
  252.         {
  253.             md[i].item_list[1] = (UI_string_type) hintData[(i + start_index) & MASK_ASYNCDYNAMIC_ITEMS_BUFF];
  254.         }
  255.     }
  256.     count = asyncdynamic_item_buffer.load_func(start_index, md, n_items);
  257.     if (count != n_items)
  258.     {
  259.         /* Data loaded fail */
  260.         return 0;
  261.     }
  262.     start = (offset + asyncdynamic_item_buffer.head) & MASK_ASYNCDYNAMIC_ITEMS_BUFF;
  263.     for (i = 0; i < n_items; i++)
  264.     {
  265.         S32 j;
  266.         S32 k = (i + start) & MASK_ASYNCDYNAMIC_ITEMS_BUFF;
  267.         for (j = 0; j < MMI_fixed_icontext_list_menuitem.n_icon_columns; j++)
  268.         {
  269.             MMI_fixed_icontext_list_menuitems[k].item_icons[j] = md[i].image_list[j];
  270.         }
  271.         for (j = 0; j < MMI_fixed_icontext_list_menuitem.n_text_columns; j++)
  272.         {
  273.             MMI_fixed_icontext_list_menuitems[k].item_texts[j] = md[i].item_list[j];
  274.         }
  275.         for (j = 0; j < FIXED_ICONTEXT_LIST_MAX_ICON_COLUMNS; j++)
  276.         {
  277.             /* Icon animation is not enabled, but it can be supported easily */
  278.             MMI_fixed_icontext_list_menuitems[k].item_icon_handles[j] = GDI_ERROR_HANDLE;
  279.         }
  280.         MMI_fixed_icontext_list_menuitems[k].flags = 0;
  281.     }
  282.     /* 
  283.      * Setup queue head & tail
  284.      */
  285.     if (asyncdynamic_item_buffer.count == 0 || (offset < 0 && offset + count < 0) ||
  286.         (offset > asyncdynamic_item_buffer.count))
  287.     {
  288.         /* Drop all old data */
  289.         asyncdynamic_item_buffer.head_item_index = start_index;
  290.         asyncdynamic_item_buffer.head = start;
  291.         asyncdynamic_item_buffer.tail = (start + count) & MASK_ASYNCDYNAMIC_ITEMS_BUFF;
  292.         asyncdynamic_item_buffer.count = count;
  293.     }
  294.     else if (offset < 0)
  295.     {
  296.         /* Move head backward */
  297.         asyncdynamic_item_buffer.head_item_index = start_index;
  298.         asyncdynamic_item_buffer.head = start;
  299.         size = asyncdynamic_item_buffer.count - offset;
  300.         if (size > MAX_ASYNCDYNAMIC_ITEMS_BUFF)
  301.         {
  302.             size = MAX_ASYNCDYNAMIC_ITEMS_BUFF;
  303.         }
  304.         else if (size < count)
  305.         {
  306.             size = count;
  307.         }
  308.         asyncdynamic_item_buffer.tail = (start + size) & MASK_ASYNCDYNAMIC_ITEMS_BUFF;
  309.         asyncdynamic_item_buffer.count = size;
  310.     }
  311.     else
  312.     {
  313.         size = count + offset;
  314.         if (size > MAX_ASYNCDYNAMIC_ITEMS_BUFF)
  315.         {
  316.             asyncdynamic_item_buffer.head = asyncdynamic_item_buffer.tail =
  317.                 (start + count) & MASK_ASYNCDYNAMIC_ITEMS_BUFF;
  318.             asyncdynamic_item_buffer.head_item_index = start_index + count - MAX_ASYNCDYNAMIC_ITEMS_BUFF;
  319.             MMI_DBG_ASSERT(asyncdynamic_item_buffer.head_item_index >= 0);
  320.             asyncdynamic_item_buffer.count = MAX_ASYNCDYNAMIC_ITEMS_BUFF;
  321.         }
  322.         else if (size > asyncdynamic_item_buffer.count)
  323.         {
  324.             asyncdynamic_item_buffer.tail = (asyncdynamic_item_buffer.head + size) & MASK_ASYNCDYNAMIC_ITEMS_BUFF;
  325.             asyncdynamic_item_buffer.count = size;
  326.         }
  327.     }
  328.     return 1;
  329. }
  330. /*****************************************************************************
  331.  * FUNCTION
  332.  *  resize_asyncdynamic_icontext_menuitems_to_list_width
  333.  * DESCRIPTION
  334.  *  adjust the menu width if needed
  335.  * PARAMETERS
  336.  *  void
  337.  * RETURNS
  338.  *  void
  339.  *****************************************************************************/
  340. void resize_asyncdynamic_icontext_menuitems_to_list_width(void)
  341. {
  342.     /*----------------------------------------------------------------*/
  343.     /* Local Variables                                                */
  344.     /*----------------------------------------------------------------*/
  345.     /*----------------------------------------------------------------*/
  346.     /* Code Body                                                      */
  347.     /*----------------------------------------------------------------*/
  348.     if (MMI_fixed_list_menu.flags & UI_LIST_MENU_AUTO_DISABLE_SCROLLBAR)
  349.     {
  350.         MMI_fixed_list_menu.flags |= UI_LIST_MENU_DISABLE_DRAW;
  351.         gui_show_asyncdynamic_list_menu(&MMI_fixed_list_menu);
  352.         MMI_fixed_list_menu.flags &= ~UI_LIST_MENU_DISABLE_DRAW;
  353.         if (MMI_fixed_list_menu.vbar.scale >= MMI_fixed_list_menu.vbar.range)
  354.         {
  355.             resize_fixed_icontext_list_menuitems(
  356.                 MMI_fixed_list_menu.width - 4,
  357.                 MMI_fixed_icontext_list_menuitem.height);
  358.         }
  359.     }
  360.     else if (MMI_fixed_list_menu.flags & UI_LIST_MENU_DISABLE_SCROLLBAR)
  361.     {
  362.         resize_fixed_icontext_list_menuitems(MMI_fixed_list_menu.width - 4, MMI_fixed_icontext_list_menuitem.height);
  363.     }
  364. }