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

MTK

开发平台:

C/C++

  1.     /* Menu rotation */
  2.     if ((m->flags & UI_MATRIX_MENU_VERTICAL_TRIGGER) && m->highlighted_row <= 0)
  3.     {
  4.         if (m->trigger_top_function)
  5.         {
  6.             m->trigger_top_function();
  7.         }
  8.         return; /* exit point */
  9.     }
  10.     else if (m->highlighted_row <= 0)
  11.     {
  12.         m->highlighted_row = m->n_rows - 1;
  13.         /* matrix mainmenu vertical loop 1<->4<->7<->2<->5<->8... */
  14.         if (m->flags & UI_MATRIX_MENU_VERTICAL_LOOP)
  15.         {
  16.             if (m->highlighted_column == 0)
  17.             {
  18.                 m->highlighted_column = m->displayed_columns - 1;
  19.             }
  20.             else
  21.             {
  22.                 m->highlighted_column -= 1;
  23.             }
  24.         }
  25.         /* To avoid the blcok cursor go to non-existed item. */
  26.         m->highlighted_item = (m->highlighted_row * m->n_columns) + m->highlighted_column;
  27.         /* To support that a row is not full of items */
  28.     #if 0
  29. /* under construction !*/
  30. /* under construction !*/
  31. /* under construction !*/
  32. /* under construction !*/
  33. /* under construction !*/
  34. /* under construction !*/
  35.     #endif /* 0 */ 
  36.         if (m->highlighted_item > (m->n_items - 1))
  37.         {
  38.             m->highlighted_row -= 1;
  39.             m->highlighted_item -= m->n_columns;
  40.         }
  41.         m->first_displayed_row = m->highlighted_row - m->displayed_rows + 1;
  42.         if (m->first_displayed_row < 0)
  43.         {
  44.             m->first_displayed_row = 0;
  45.         }
  46.     }
  47.     else
  48.     {
  49.         m->highlighted_row--;
  50.         if (m->highlighted_row < m->first_displayed_row)
  51.         {
  52.             m->first_displayed_row = m->highlighted_row;
  53.         }
  54.     }
  55.     m->highlighted_item = (m->highlighted_row * m->n_columns) + m->highlighted_column;
  56.     if (old_highlighted_item != m->highlighted_item)
  57.     {
  58.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  59.         {
  60.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  61.         }
  62.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  63.         {
  64.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  65.         }
  66.         m->item_unhighlighted(old_highlighted_item);
  67.         m->item_highlighted(m->highlighted_item);
  68.     }
  69. }
  70. /*****************************************************************************
  71.  * FUNCTION
  72.  *  gui_fixed_matrix_menu_goto_next_row
  73.  * DESCRIPTION
  74.  *  Highlights an item in the next row
  75.  *  
  76.  *  Does not redraw the fixed matrix menu
  77.  * PARAMETERS
  78.  *  m       [IN]        Is the fixed matrix menu object
  79.  * RETURNS
  80.  *  void
  81.  *****************************************************************************/
  82. void gui_fixed_matrix_menu_goto_next_row(fixed_matrix_menu *m)
  83. {
  84.     /*----------------------------------------------------------------*/
  85.     /* Local Variables                                                */
  86.     /*----------------------------------------------------------------*/
  87.     S32 old_highlighted_item;
  88.     S32 old_highlighted_row;
  89.     /*----------------------------------------------------------------*/
  90.     /* Code Body                                                      */
  91.     /*----------------------------------------------------------------*/
  92.     old_highlighted_row = m->highlighted_row;
  93.     old_highlighted_item = m->highlighted_item;
  94.     /* Menu rotation */
  95.     if ((m->flags & UI_MATRIX_MENU_VERTICAL_TRIGGER) && m->highlighted_row >= (m->n_rows - 1))
  96.     {
  97.         if (m->trigger_bottom_function)
  98.         {
  99.             m->trigger_bottom_function();
  100.         }
  101.         return; /* exit point */
  102.     }
  103.     else if (m->highlighted_row >= (m->n_rows - 1))
  104.     {
  105.         m->highlighted_row = 0;
  106.         m->first_displayed_row = 0;
  107.         /* matrix mainmenu vertical loop 1<->4<->7<->2<->5<->8... */
  108.         if (m->flags & UI_MATRIX_MENU_VERTICAL_LOOP)
  109.         {
  110.             m->highlighted_column += 1;
  111.             if (m->highlighted_column >= m->displayed_columns)
  112.             {
  113.                 m->highlighted_column = 0;
  114.             }
  115.         }
  116.     }
  117.     else
  118.     {
  119.         m->highlighted_row++;
  120.         if (m->highlighted_row > (m->first_displayed_row + m->displayed_rows - 1))
  121.         {
  122.             m->first_displayed_row = (m->highlighted_row - m->displayed_rows + 1);
  123.             if (m->first_displayed_row > (m->n_rows - m->displayed_rows))
  124.             {
  125.                 m->first_displayed_row = (m->n_rows - m->displayed_rows);
  126.             }
  127.         }
  128.     }
  129.     m->highlighted_item = (m->highlighted_row * m->n_columns) + m->highlighted_column;
  130.     /* to support that a row is not full of items */
  131. #if 0
  132. /* under construction !*/
  133. /* under construction !*/
  134. /* under construction !*/
  135. /* under construction !*/
  136. #endif /* 0 */ 
  137.     if (m->highlighted_item > (m->n_items - 1)) /* revert   */
  138.     {
  139.         m->highlighted_row = 0;
  140.         /* matrix mainmenu vertical loop 1<->4<->7<->2<->5<->8... */
  141.         if (m->flags & UI_MATRIX_MENU_VERTICAL_LOOP)
  142.         {
  143.             m->highlighted_column += 1;
  144.             if (m->highlighted_column >= m->displayed_columns)
  145.             {
  146.                 m->highlighted_column = 0;
  147.             }
  148.         }
  149.         m->highlighted_item = m->highlighted_column;
  150.         m->first_displayed_row = 0;
  151.     }
  152.     if (old_highlighted_item != m->highlighted_item)
  153.     {
  154.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  155.         {
  156.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  157.         }
  158.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  159.         {
  160.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  161.         }
  162.         m->item_unhighlighted(old_highlighted_item);
  163.         m->item_highlighted(m->highlighted_item);
  164.     }
  165. }
  166. /*****************************************************************************
  167.  * FUNCTION
  168.  *  gui_fixed_matrix_menu_goto_row
  169.  * DESCRIPTION
  170.  *  Highlights an row
  171.  *  
  172.  *  Does not redraw the fixed matrix menu
  173.  *  Used in touch screen
  174.  * PARAMETERS
  175.  *  m       [IN]        Is the fixed matrix menu object
  176.  *  r       [IN]        Row index
  177.  * RETURNS
  178.  *  void
  179.  *****************************************************************************/
  180. void gui_fixed_matrix_menu_goto_row(fixed_matrix_menu *m, S32 r)
  181. {
  182.     /*----------------------------------------------------------------*/
  183.     /* Local Variables                                                */
  184.     /*----------------------------------------------------------------*/
  185.     S32 old_highlighted_item = m->highlighted_item;
  186.     S32 highlighted_item;
  187.     /*----------------------------------------------------------------*/
  188.     /* Code Body                                                      */
  189.     /*----------------------------------------------------------------*/
  190.     if ((r < 0) || (r > (m->n_rows - 1)) || (r == m->highlighted_row))
  191.     {
  192.         return;
  193.     }
  194.     highlighted_item = m->highlighted_item;
  195.     highlighted_item += (r - m->highlighted_row) * m->n_columns;
  196.     if (highlighted_item >= m->n_items)
  197.     {
  198.         highlighted_item = m->n_items - 1;
  199.     }
  200.     m->highlighted_item = highlighted_item;
  201.     gui_fixed_matrix_menu_locate_highlighted_item(m);
  202.     if (old_highlighted_item != m->highlighted_item)
  203.     {
  204.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  205.         {
  206.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  207.         }
  208.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  209.         {
  210.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  211.         }
  212.         m->item_unhighlighted(old_highlighted_item);
  213.         m->item_highlighted(m->highlighted_item);
  214.     }
  215. }
  216. /*****************************************************************************
  217.  * FUNCTION
  218.  *  gui_fixed_matrix_menu_goto_previous_column
  219.  * DESCRIPTION
  220.  *  Highlights an item in the previous column
  221.  *  
  222.  *  Does not redraw the fixed matrix menu
  223.  * PARAMETERS
  224.  *  m       [IN]        Is the fixed matrix menu object
  225.  * RETURNS
  226.  *  void
  227.  *****************************************************************************/
  228. void gui_fixed_matrix_menu_goto_previous_column(fixed_matrix_menu *m)
  229. {
  230.     /*----------------------------------------------------------------*/
  231.     /* Local Variables                                                */
  232.     /*----------------------------------------------------------------*/
  233.     S32 old_highlighted_item = m->highlighted_item;
  234.     /*----------------------------------------------------------------*/
  235.     /* Code Body                                                      */
  236.     /*----------------------------------------------------------------*/
  237.     /* For menu rotation */
  238.     if (m->highlighted_column <= 0)
  239.     {
  240.         m->highlighted_column = m->n_columns - 1;
  241.         m->first_displayed_column = m->highlighted_column - m->displayed_columns + 1;
  242.     }
  243.     else
  244.     {
  245.         m->highlighted_column--;
  246.         if (m->highlighted_column < m->first_displayed_column)
  247.         {
  248.             m->first_displayed_column = m->highlighted_column;
  249.         }
  250.     }
  251.     m->highlighted_item = (m->highlighted_row * m->n_columns) + m->highlighted_column;
  252.     if (old_highlighted_item != m->highlighted_item)
  253.     {
  254.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  255.         {
  256.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  257.         }
  258.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  259.         {
  260.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  261.         }
  262.         m->item_unhighlighted(old_highlighted_item);
  263.         m->item_highlighted(m->highlighted_item);
  264.     }
  265. }
  266. /*****************************************************************************
  267.  * FUNCTION
  268.  *  gui_fixed_matrix_menu_goto_next_column
  269.  * DESCRIPTION
  270.  *  Highlights an item in the next column
  271.  *  
  272.  *  Does not redraw the fixed matrix menu
  273.  * PARAMETERS
  274.  *  m       [IN]        Is the fixed matrix menu object
  275.  * RETURNS
  276.  *  void
  277.  *****************************************************************************/
  278. void gui_fixed_matrix_menu_goto_next_column(fixed_matrix_menu *m)
  279. {
  280.     /*----------------------------------------------------------------*/
  281.     /* Local Variables                                                */
  282.     /*----------------------------------------------------------------*/
  283.     S32 old_highlighted_item;
  284.     S32 old_highlighted_column;
  285.     /*----------------------------------------------------------------*/
  286.     /* Code Body                                                      */
  287.     /*----------------------------------------------------------------*/
  288.     old_highlighted_column = m->highlighted_column;
  289.     old_highlighted_item = m->highlighted_item;
  290.     /* for menu rotation */
  291.     if (m->highlighted_column >= (m->n_columns - 1))
  292.     {
  293.         m->highlighted_column = 0;
  294.         m->first_displayed_column = 0;
  295.     }
  296.     else
  297.     {
  298.         m->highlighted_column++;
  299.         if (m->highlighted_column > (m->first_displayed_column + m->displayed_columns - 1))
  300.         {
  301.             m->first_displayed_column = (m->highlighted_column - m->displayed_columns + 1);
  302.             if (m->first_displayed_column > (m->n_columns - m->displayed_columns))
  303.             {
  304.                 m->first_displayed_column = (m->n_columns - m->displayed_columns);
  305.             }
  306.         }
  307.     }
  308.     m->highlighted_item = (m->highlighted_row * m->n_columns) + m->highlighted_column;
  309.     if (m->highlighted_item > (m->n_items - 1)) /* revert   */
  310.     {
  311.         m->highlighted_column = old_highlighted_column;
  312.         m->highlighted_item = old_highlighted_item;
  313.     }
  314.     if (old_highlighted_item != m->highlighted_item)
  315.     {
  316.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  317.         {
  318.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  319.         }
  320.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  321.         {
  322.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  323.         }
  324.         m->item_unhighlighted(old_highlighted_item);
  325.         m->item_highlighted(m->highlighted_item);
  326.     }
  327. }
  328. /*****************************************************************************
  329.  * FUNCTION
  330.  *  gui_fixed_matrix_menu_goto_column
  331.  * DESCRIPTION
  332.  *  Highlights an column
  333.  *  
  334.  *  Does not redraw the fixed matrix menu
  335.  *  Used in touch screen
  336.  * PARAMETERS
  337.  *  m       [IN]        Is the fixed matrix menu object
  338.  *  c       [IN]        Column index
  339.  * RETURNS
  340.  *  void
  341.  *****************************************************************************/
  342. void gui_fixed_matrix_menu_goto_column(fixed_matrix_menu *m, S32 c)
  343. {
  344.     /*----------------------------------------------------------------*/
  345.     /* Local Variables                                                */
  346.     /*----------------------------------------------------------------*/
  347.     S32 old_highlighted_item = m->highlighted_item;
  348.     S32 highlighted_item;
  349.     /*----------------------------------------------------------------*/
  350.     /* Code Body                                                      */
  351.     /*----------------------------------------------------------------*/
  352.     if ((c < 0) || (c > (m->n_columns - 1)) || (c == m->highlighted_column))
  353.     {
  354.         return;
  355.     }
  356.     highlighted_item = m->highlighted_item;
  357.     highlighted_item += c - m->highlighted_column;
  358.     if (highlighted_item >= m->n_items)
  359.     {
  360.         highlighted_item = m->n_items - 1;
  361.     }
  362.     m->highlighted_item = highlighted_item;
  363.     gui_fixed_matrix_menu_locate_highlighted_item(m);
  364.     if (old_highlighted_item != m->highlighted_item)
  365.     {
  366.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  367.         {
  368.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  369.         }
  370.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  371.         {
  372.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  373.         }
  374.         m->item_unhighlighted(old_highlighted_item);
  375.         m->item_highlighted(m->highlighted_item);
  376.     }
  377. }
  378. /*****************************************************************************
  379.  * FUNCTION
  380.  *  gui_fixed_matrix_menu_goto_first_item
  381.  * DESCRIPTION
  382.  *  Highlights the first item
  383.  *  
  384.  *  Does not redraw the fixed matrix menu
  385.  * PARAMETERS
  386.  *  m       [IN]        Is the fixed matrix menu object
  387.  * RETURNS
  388.  *  void
  389.  *****************************************************************************/
  390. void gui_fixed_matrix_menu_goto_first_item(fixed_matrix_menu *m)
  391. {
  392.     /*----------------------------------------------------------------*/
  393.     /* Local Variables                                                */
  394.     /*----------------------------------------------------------------*/
  395.     S32 old_highlighted_item = m->highlighted_item;
  396.     /*----------------------------------------------------------------*/
  397.     /* Code Body                                                      */
  398.     /*----------------------------------------------------------------*/
  399.     m->highlighted_column = 0;
  400.     m->highlighted_row = 0;
  401.     m->first_displayed_column = 0;
  402.     m->first_displayed_row = 0;
  403.     m->highlighted_item = 0;
  404.     if (old_highlighted_item != m->highlighted_item)
  405.     {
  406.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  407.         {
  408.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  409.         }
  410.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  411.         {
  412.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  413.         }
  414.         m->item_unhighlighted(old_highlighted_item);
  415.         m->item_highlighted(m->highlighted_item);
  416.     }
  417. }
  418. /*****************************************************************************
  419.  * FUNCTION
  420.  *  gui_fixed_matrix_menu_goto_last_item
  421.  * DESCRIPTION
  422.  *  Highlights the last item
  423.  *  
  424.  *  Does not redraw the fixed matrix menu
  425.  * PARAMETERS
  426.  *  m       [IN]        Is the fixed matrix menu object
  427.  * RETURNS
  428.  *  void
  429.  *****************************************************************************/
  430. void gui_fixed_matrix_menu_goto_last_item(fixed_matrix_menu *m)
  431. {
  432.     /*----------------------------------------------------------------*/
  433.     /* Local Variables                                                */
  434.     /*----------------------------------------------------------------*/
  435.     S32 old_highlighted_item = m->highlighted_item;
  436.     /*----------------------------------------------------------------*/
  437.     /* Code Body                                                      */
  438.     /*----------------------------------------------------------------*/
  439.     m->highlighted_item = m->n_items - 1;
  440.     gui_fixed_matrix_menu_locate_highlighted_item(m);
  441.     if (old_highlighted_item != m->highlighted_item)
  442.     {
  443.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  444.         {
  445.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  446.         }
  447.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  448.         {
  449.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  450.         }
  451.         m->item_unhighlighted(old_highlighted_item);
  452.         m->item_highlighted(m->highlighted_item);
  453.     }
  454. }
  455. /*****************************************************************************
  456.  * FUNCTION
  457.  *  gui_fixed_matrix_menu_goto_next_page
  458.  * DESCRIPTION
  459.  *  Highlights an item in the next page
  460.  *  
  461.  *  Does not redraw the fixed matrix menu
  462.  * PARAMETERS
  463.  *  m       [IN]        Is the fixed matrix menu object
  464.  * RETURNS
  465.  *  void
  466.  *****************************************************************************/
  467. void gui_fixed_matrix_menu_goto_next_page(fixed_matrix_menu *m)
  468. {
  469.     /*----------------------------------------------------------------*/
  470.     /* Local Variables                                                */
  471.     /*----------------------------------------------------------------*/
  472.     S32 old_highlighted_item;
  473.     S32 old_highlighted_row;
  474.     /*----------------------------------------------------------------*/
  475.     /* Code Body                                                      */
  476.     /*----------------------------------------------------------------*/
  477.     old_highlighted_row = m->highlighted_row;
  478.     old_highlighted_item = m->highlighted_item;
  479.     if (m->highlighted_row >= (m->n_rows - 1))
  480.     {
  481.         return;
  482.     }
  483.     m->first_displayed_row += m->displayed_rows;
  484.     if (m->first_displayed_row > (m->n_rows - m->displayed_rows))
  485.     {
  486.         m->first_displayed_row = (m->n_rows - m->displayed_rows);
  487.     }
  488.     m->highlighted_row = m->first_displayed_row + m->displayed_rows - 1;
  489.     m->highlighted_item = (m->highlighted_row * m->n_columns) + m->highlighted_column;
  490.     if (m->highlighted_item > (m->n_items - 1)) /* revert   */
  491.     {
  492.         m->highlighted_row = old_highlighted_row;
  493.         m->highlighted_item = old_highlighted_item;
  494.     }
  495.     if (old_highlighted_item != m->highlighted_item)
  496.     {
  497.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  498.         {
  499.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  500.         }
  501.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  502.         {
  503.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  504.         }
  505.         m->item_unhighlighted(old_highlighted_item);
  506.         m->item_highlighted(m->highlighted_item);
  507.     }
  508. }
  509. /*****************************************************************************
  510.  * FUNCTION
  511.  *  gui_fixed_matrix_menu_goto_previous_page
  512.  * DESCRIPTION
  513.  *  Highlights an item in the previous page
  514.  *  
  515.  *  Does not redraw the fixed matrix menu
  516.  * PARAMETERS
  517.  *  m       [IN]        Is the fixed matrix menu object
  518.  * RETURNS
  519.  *  void
  520.  *****************************************************************************/
  521. void gui_fixed_matrix_menu_goto_previous_page(fixed_matrix_menu *m)
  522. {
  523.     /*----------------------------------------------------------------*/
  524.     /* Local Variables                                                */
  525.     /*----------------------------------------------------------------*/
  526.     S32 old_highlighted_item;
  527.     /*----------------------------------------------------------------*/
  528.     /* Code Body                                                      */
  529.     /*----------------------------------------------------------------*/
  530.     old_highlighted_item = m->highlighted_item;
  531.     if (m->highlighted_row <= 0)
  532.     {
  533.         return;
  534.     }
  535.     m->first_displayed_row -= m->displayed_rows;
  536.     if (m->first_displayed_row < 0)
  537.     {
  538.         m->first_displayed_row = 0;
  539.     }
  540.     m->highlighted_row = m->first_displayed_row;
  541.     m->highlighted_item = (m->highlighted_row * m->n_columns) + m->highlighted_column;
  542.     if (old_highlighted_item != m->highlighted_item)
  543.     {
  544.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  545.         {
  546.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  547.         }
  548.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  549.         {
  550.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  551.         }
  552.         m->item_unhighlighted(old_highlighted_item);
  553.         m->item_highlighted(m->highlighted_item);
  554.     }
  555. }
  556. /*****************************************************************************
  557.  * FUNCTION
  558.  *  gui_fixed_matrix_menu_goto_item
  559.  * DESCRIPTION
  560.  *  Highlights a particular item
  561.  *  
  562.  *  Does not redraw the fixed matrix menu
  563.  * PARAMETERS
  564.  *  m       [IN]        Is the fixed matrix menu object
  565.  *  i       [IN]        Is the index of the item to be highlighted (zero based)
  566.  * RETURNS
  567.  *  void
  568.  *****************************************************************************/
  569. void gui_fixed_matrix_menu_goto_item(fixed_matrix_menu *m, S32 i)
  570. {
  571.     /*----------------------------------------------------------------*/
  572.     /* Local Variables                                                */
  573.     /*----------------------------------------------------------------*/
  574.     S32 old_highlighted_item = m->highlighted_item;
  575.     /*----------------------------------------------------------------*/
  576.     /* Code Body                                                      */
  577.     /*----------------------------------------------------------------*/
  578.     if ((i < 0) || (i > (m->n_items - 1)))
  579.     {
  580.         return;
  581.     }
  582.     m->highlighted_item = i;
  583.     gui_fixed_matrix_menu_locate_highlighted_item(m);
  584.     if (old_highlighted_item != m->highlighted_item)
  585.     {
  586.         if ((old_highlighted_item >= 0) && (old_highlighted_item < m->n_items))
  587.         {
  588.             m->item_remove_highlight_function(m->items[old_highlighted_item], m->common_item_data);
  589.         }
  590.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  591.         {
  592.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  593.         }
  594.         m->item_unhighlighted(old_highlighted_item);
  595.         m->item_highlighted(m->highlighted_item);
  596.     }
  597. }
  598. /*****************************************************************************
  599.  * FUNCTION
  600.  *  gui_reset_fixed_matrix_col_rows
  601.  * DESCRIPTION
  602.  *  
  603.  * PARAMETERS
  604.  *  m       [?]     
  605.  * RETURNS
  606.  *  void
  607.  *****************************************************************************/
  608. void gui_reset_fixed_matrix_col_rows(fixed_matrix_menu *m)
  609. {
  610.     /*----------------------------------------------------------------*/
  611.     /* Local Variables                                                */
  612.     /*----------------------------------------------------------------*/
  613.     /*----------------------------------------------------------------*/
  614.     /* Code Body                                                      */
  615.     /*----------------------------------------------------------------*/
  616.     /* m->n_columns=0; */
  617.     m->n_rows = 0;
  618. }
  619. /*****************************************************************************
  620.  * FUNCTION
  621.  *  gui_fixed_matrix_auto_disable_scrollbar
  622.  * DESCRIPTION
  623.  *  
  624.  * PARAMETERS
  625.  *  m       [?]     
  626.  * RETURNS
  627.  *  
  628.  *****************************************************************************/
  629. S32 gui_fixed_matrix_auto_disable_scrollbar(fixed_matrix_menu *m)
  630. {
  631.     /*----------------------------------------------------------------*/
  632.     /* Local Variables                                                */
  633.     /*----------------------------------------------------------------*/
  634.     /*----------------------------------------------------------------*/
  635.     /* Code Body                                                      */
  636.     /*----------------------------------------------------------------*/
  637.     if (!(m->flags & UI_MATRIX_MENU_DISABLE_SCROLLBAR))
  638.     {
  639.         if (m->flags & UI_MATRIX_MENU_AUTO_DISABLE_SCROLLBAR)
  640.         {
  641.             return 1;
  642.         }
  643.         else
  644.         {
  645.             return -1;
  646.         }
  647.     }
  648.     else
  649.     {
  650.         return -1;
  651.     }
  652. }
  653. /*****************************************************************************
  654.  * FUNCTION
  655.  *  mtk_UI_show_fixed_matrix_menu
  656.  * DESCRIPTION
  657.  *  Displays the fixed matrix menu
  658.  * PARAMETERS
  659.  *  m       [IN]        Is the fixed matrix menu object
  660.  * RETURNS
  661.  *  void
  662.  *****************************************************************************/
  663. void mtk_UI_show_fixed_matrix_menu(fixed_matrix_menu *m)
  664. {
  665.     /*----------------------------------------------------------------*/
  666.     /* Local Variables                                                */
  667.     /*----------------------------------------------------------------*/
  668.     S32 x1, y1, hilited_x1, hilited_x2, hilited_y1, hilited_y2;
  669.     S32 new_hilited_x1, new_hilited_y1, new_column, new_row;
  670.     S32 xoff, yoff, xoff2, yoff2, width, height;
  671.     S32 first_displayed_item, last_displayed_item;
  672.     U8 show_vbar = 0, show_hbar = 0;
  673.     S32 xPos, xPos2;
  674.     S32 yPos, yPos2;
  675.     S32 vbar_x = 0, vbar_button_x = 0;
  676.     /*----------------------------------------------------------------*/
  677.     /* Code Body                                                      */
  678.     /*----------------------------------------------------------------*/
  679.     first_displayed_item = m->first_displayed_row * m->n_columns;
  680.     last_displayed_item = first_displayed_item + (m->displayed_rows * m->n_columns);
  681.     width = m->width;
  682.     height = m->height;
  683.     if (m->flags & UI_MATRIX_MENU_SHOW_VERTICAL_SCROLLBAR)
  684.     {
  685.         show_vbar = 1;
  686.     }
  687.     if (m->flags & UI_MATRIX_MENU_SHOW_HORIZONTAL_SCROLLBAR)
  688.     {
  689.         show_hbar = 1;
  690.     }
  691.     if (show_vbar)
  692.     {
  693.         width -= m->vbar.width - 1;
  694.     }
  695.     if (show_hbar)
  696.     {
  697.         height -= m->hbar.height - 1;
  698.     }
  699.     xoff = (width - (m->item_width * m->displayed_columns)) / (m->displayed_columns + 1);
  700.     yoff = (height - (m->item_height * m->displayed_rows)) / (m->displayed_rows + 1);
  701.     new_row = ((m->last_highlighted_item) / m->n_columns);
  702.     new_column = m->last_highlighted_item - (new_row * m->n_rows);
  703.     x1 = m->x;
  704.     y1 = m->y;
  705.     if (show_vbar && r2lMMIFlag)
  706.     {
  707.         x1 += m->vbar.width;
  708.     }
  709.     new_hilited_x1 = x1 + xoff + (new_column - m->first_displayed_column) * (m->item_width + xoff);
  710.     new_hilited_y1 = y1 + yoff + (new_row - m->first_displayed_row) * (m->item_height + yoff);
  711.     /* if ( m->last_highlighted_item<first_displayed_item || m->last_highlighted_item>last_displayed_item ) */
  712.     if ((m->last_hilited_x != new_hilited_x1 && m->last_hilited_y != new_hilited_y1) ||
  713.         (m->highlighted_item - m->last_highlighted_item) >= (m->displayed_columns * m->displayed_rows))
  714.     {
  715.         m->last_highlighted_item = -1;
  716.         gui_show_fixed_matrix_menu(m);
  717.         return;
  718.     }
  719.     if (m->highlighted_item_width > m->item_width)
  720.     {
  721.         xoff2 = (m->highlighted_item_width - m->item_width);
  722.     }
  723.     else
  724.     {
  725.         xoff2 = 0;
  726.     }
  727.     if (m->highlighted_item_height > m->item_height)
  728.     {
  729.         yoff2 = (m->highlighted_item_height - m->item_height);
  730.     }
  731.     else
  732.     {
  733.         yoff2 = 0;
  734.     }
  735. #if 0
  736. /* under construction !*/
  737. /* under construction !*/
  738. /* under construction !*/
  739. /* under construction !*/
  740. /* under construction !*/
  741. /* under construction !*/
  742. /* under construction !*/
  743. /* under construction !*/
  744. /* under construction !*/
  745. /* under construction !*/
  746. /* under construction !*/
  747. /* under construction !*/
  748. /* under construction !*/
  749. /* under construction !*/
  750. /* under construction !*/
  751. /* under construction !*/
  752. /* under construction !*/
  753. /* under construction !*/
  754. /* under construction !*/
  755. /* under construction !*/
  756. /* under construction !*/
  757. /* under construction !*/
  758. /* under construction !*/
  759. /* under construction !*/
  760. /* under construction !*/
  761. /* under construction !*/
  762. #endif /* 0 */ 
  763.     gdi_layer_push_clip();
  764.     //gdi_layer_set_clip(m->last_hilited_x-xoff2, yPos,m->last_hilited_x+xoff2+m->highlighted_item_height, yPos2);
  765.     //gdi_image_cache_bmp_draw(m->last_hilited_x-xoff2, yPos, &m->buffer);
  766.     gdi_layer_set_clip(m->cache_bmp_x1, m->cache_bmp_y1, m->cache_bmp_x2, m->cache_bmp_y2);
  767. #ifdef __MMI_MATRIX_MAIN_MENU_FULL_BACKGROUND__
  768.     MMI_ASSERT((m->cache_bmp_x2 - m->cache_bmp_x1 + 1) * (m->cache_bmp_y2 - m->cache_bmp_y1 +
  769.                                                           1) * gdi_layer_get_bit_per_pixel() >> 3 <=
  770.                OPTIMIZE_MM_BUF_SIZE);
  771. #endif /* __MMI_MATRIX_MAIN_MENU_FULL_BACKGROUND__ */ 
  772.     gdi_image_cache_bmp_draw(m->cache_bmp_x1, m->cache_bmp_y1, &m->buffer);
  773.     gdi_layer_pop_clip();
  774.     hilited_x1 = x1 + xoff + (m->highlighted_column - m->first_displayed_column) * (m->item_width + xoff);
  775.     hilited_y1 = y1 + yoff + (m->highlighted_row - m->first_displayed_row) * (m->item_height + yoff);
  776.     hilited_x2 = hilited_x1 + m->highlighted_item_width;
  777.     hilited_y2 = hilited_y1 + m->highlighted_item_height;
  778.     xPos = hilited_x1 - (xoff2 >> 1);
  779.     xPos2 = xPos + m->highlighted_item_width - 1;
  780.     yPos = hilited_y1 - (yoff2 >> 1);
  781.     yPos2 = yPos + m->highlighted_item_height - 1;
  782.     if (xPos < m->x)
  783.     {
  784.         xPos = m->x;
  785.         xPos2 = xPos + m->highlighted_item_width - 1;
  786.     }
  787.     if (xPos2 > m->x + m->width - 1)
  788.     {
  789.         xPos2 = m->x + m->width - 1;
  790.         xPos = xPos2 - m->highlighted_item_width + 1;
  791.     }
  792.     if (yPos < m->y)
  793.     {
  794.         yPos = m->y;
  795.         yPos2 = yPos + m->highlighted_item_height - 1;
  796.     }
  797.     if (yPos2 > m->y + m->height - 1)
  798.     {
  799.         yPos2 = m->y + m->height - 1;
  800.         yPos = yPos2 - m->highlighted_item_height + 1;
  801.     }
  802. #if 0
  803. /* under construction !*/
  804. /* under construction !*/
  805. /* under construction !*/
  806. /* under construction !*/
  807. /* under construction !*/
  808. /* under construction !*/
  809. /* under construction !*/
  810. /* under construction !*/
  811. /* under construction !*/
  812. /* under construction !*/
  813. /* under construction !*/
  814. /* under construction !*/
  815. /* under construction !*/
  816. /* under construction !*/
  817. /* under construction !*/
  818. /* under construction !*/
  819. /* under construction !*/
  820. /* under construction !*/
  821. /* under construction !*/
  822. /* under construction !*/
  823. /* under construction !*/
  824. /* under construction !*/
  825. /* under construction !*/
  826. /* under construction !*/
  827. /* under construction !*/
  828. /* under construction !*/
  829. /* under construction !*/
  830. /* under construction !*/
  831. /* under construction !*/
  832. /* under construction !*/
  833. /* under construction !*/
  834. /* under construction !*/
  835. /* under construction !*/
  836. /* under construction !*/
  837. /* under construction !*/
  838. /* under construction !*/
  839. /* under construction !*/
  840. /* under construction !*/
  841. /* under construction !*/
  842. /* under construction !*/
  843. /* under construction !*/
  844. /* under construction !*/
  845. /* under construction !*/
  846. /* under construction !*/
  847. /* under construction !*/
  848. #endif /* 0 */ 
  849.     gdi_layer_push_clip();
  850.     //gdi_layer_set_clip(hilited_x1-xoff2, yPos, hilited_x2+xoff2, yPos2);
  851.     //gdi_image_cache_bmp_get(hilited_x1-xoff2, yPos, hilited_x2+xoff2, yPos2, &m->buffer);
  852.     gdi_layer_set_clip(xPos, yPos, xPos2, yPos2);
  853. #ifdef __MMI_MATRIX_MAIN_MENU_FULL_BACKGROUND__
  854.     MMI_ASSERT((xPos2 - xPos + 1) * (yPos2 - yPos + 1) * gdi_layer_get_bit_per_pixel() >> 3 <= OPTIMIZE_MM_BUF_SIZE);
  855. #endif 
  856.     gdi_image_cache_bmp_get(xPos, yPos, xPos2, yPos2, &m->buffer);
  857.     gdi_layer_pop_clip();
  858.     m->cache_bmp_x1 = xPos;
  859.     m->cache_bmp_x2 = xPos2;
  860.     m->cache_bmp_y1 = yPos;
  861.     m->cache_bmp_y2 = yPos2;
  862.     m->last_hilited_x = hilited_x1;
  863.     m->last_hilited_y = hilited_y1;
  864.     m->item_display_function(m->items[m->highlighted_item], m->common_item_data, hilited_x1, hilited_y1);
  865.     if (show_vbar)
  866.     {
  867.         gui_set_vertical_scrollbar_range(&m->vbar, m->n_rows);
  868.         gui_set_vertical_scrollbar_scale(&m->vbar, m->displayed_rows);
  869.         gui_set_vertical_scrollbar_value(&m->vbar, m->first_displayed_row);
  870.         if (r2lMMIFlag)
  871.         {
  872.             vbar_x = m->vbar.x;
  873.             vbar_button_x = m->vbar.scroll_button.x;
  874.             m->vbar.x = m->vbar.x + m->vbar.width - m->width;
  875.             m->vbar.scroll_button.x = m->vbar.scroll_button.x + m->vbar.scroll_button.width - m->width;
  876.             gui_show_vertical_scrollbar(&m->vbar);
  877.             m->vbar.x = vbar_x;
  878.             m->vbar.scroll_button.x = vbar_button_x;
  879.         }
  880.         else
  881.         {
  882.             gui_show_vertical_scrollbar(&m->vbar);
  883.         }
  884.     }
  885.     if (show_hbar)
  886.     {
  887.         gui_set_horizontal_scrollbar_range(&m->hbar, m->n_columns);
  888.         gui_set_horizontal_scrollbar_scale(&m->hbar, m->displayed_columns);
  889.         gui_set_horizontal_scrollbar_value(&m->hbar, m->first_displayed_column);
  890.         gui_show_horizontal_scrollbar(&m->hbar);
  891.     }
  892. }
  893. #ifdef __MMI_BI_DEGREE_MAIN_MENU_STYLE__
  894. /*****************************************************************************
  895.  * FUNCTION
  896.  *  gui_setup_fixed_matrix_menu_ind_area
  897.  * DESCRIPTION
  898.  *  
  899.  * PARAMETERS
  900.  *  ind_area        [?]         
  901.  *  x               [IN]        
  902.  *  y               [IN]        
  903.  *  string          [?]         
  904.  *  img_id          [IN]        
  905.  * RETURNS
  906.  *  void
  907.  *****************************************************************************/
  908. void gui_setup_fixed_matrix_menu_ind_area(gui_matrix_ind_area_struct *ind_area, S32 x, S32 y, U8 *string, U16 img_id)
  909. {
  910.     /*----------------------------------------------------------------*/
  911.     /* Local Variables                                                */
  912.     /*----------------------------------------------------------------*/
  913.     /*----------------------------------------------------------------*/
  914.     /* Code Body                                                      */
  915.     /*----------------------------------------------------------------*/
  916.     ind_area->x = x;
  917.     ind_area->y = y;
  918.     ind_area->string = string;
  919.     ind_area->img_id = img_id;
  920.     if (string != NULL && img_id != 0)
  921.     {
  922.         MMI_ASSERT(0);
  923.     }
  924. #if (0)
  925. /* under construction !*/
  926. /* under construction !*/
  927. /* under construction !*/
  928. /* under construction !*/
  929. #endif /* (0) */ 
  930.     ind_area->width = 20;
  931.     ind_area->height = 20;
  932. }
  933. #endif /* __MMI_BI_DEGREE_MAIN_MENU_STYLE__ */ 
  934. /*****************************************************************************
  935.  * FUNCTION
  936.  *  gui_show_fixed_matrix_menu
  937.  * DESCRIPTION
  938.  *  Displays the fixed matrix menu
  939.  * PARAMETERS
  940.  *  m       [IN]        Is the fixed matrix menu object
  941.  * RETURNS
  942.  *  void
  943.  *****************************************************************************/
  944. void gui_show_fixed_matrix_menu(fixed_matrix_menu *m)
  945. {
  946.     /*----------------------------------------------------------------*/
  947.     /* Local Variables                                                */
  948.     /*----------------------------------------------------------------*/
  949.     S32 x1, y1, x2, y2, xoff, yoff, width, height;
  950.     UI_filled_area *f;
  951.     S32 i, j, k, o;
  952.     S32 cx1, cy1, cx2, cy2;
  953.     S32 tx1, ty1, tx2, ty2;
  954.     S32 ix, iy, iwidth, iheight, ix2, iy2;
  955.     S32 vbar_x = 0, vbar_button_x = 0;
  956.     U8 show_vbar = 0, show_hbar = 0;
  957.     S32 highlite_x = 0, highlite_y = 0; /* Show selected item after all other items displayed //111605 warning Calvin */
  958. #ifdef __MMI_MATRIX_MAIN_MENU_OPTIMIZE__
  959.     S32 xoff2, yoff2;
  960.     S32 xPos, xPos2, yPos, yPos2;
  961. #endif /* __MMI_MATRIX_MAIN_MENU_OPTIMIZE__ */ 
  962. #ifdef __MMI_BI_DEGREE_MAIN_MENU_STYLE__
  963.     MMI_BOOL has_previous_page = MMI_FALSE, has_next_page = MMI_FALSE;
  964. #endif 
  965.     /*----------------------------------------------------------------*/
  966.     /* Code Body                                                      */
  967.     /*----------------------------------------------------------------*/
  968.     gui_get_clip(&cx1, &cy1, &cx2, &cy2);
  969.     gui_get_text_clip(&tx1, &ty1, &tx2, &ty2);
  970.     if (m->flags & UI_MATRIX_MENU_SHOW_VERTICAL_SCROLLBAR)
  971.     {
  972.         show_vbar = 1;
  973.     }
  974.     if (m->flags & UI_MATRIX_MENU_SHOW_HORIZONTAL_SCROLLBAR)
  975.     {
  976.         show_hbar = 1;
  977.     }
  978.     if (r2lMMIFlag)
  979.     {
  980.         if (show_vbar)
  981.         {
  982.             x1 = m->x + m->vbar.width;
  983.         }
  984.         else
  985.         {
  986.             x1 = m->x;
  987.         }
  988.         x2 = UI_device_width;
  989.     }
  990.     else
  991.     {
  992.         x1 = m->x;
  993.         x2 = x1 + m->width - 1;
  994.     }
  995.     y1 = m->y;
  996. #ifdef __MMI_BI_DEGREE_MAIN_MENU_STYLE__
  997.     if (m->flags & UI_MATRIX_MENU_SHOW_IND_AREA)
  998.     {
  999.         y2 = y1 + m->height - 1 - MMI_BI_DEGREE_MAIN_MENU_ARROW_BAR_HEIGHT;
  1000.     }
  1001.     else
  1002. #endif /* __MMI_BI_DEGREE_MAIN_MENU_STYLE__ */ 
  1003.         y2 = y1 + m->height - 1;
  1004.     if (m->flags & UI_LIST_MENU_STATE_FOCUSSED)
  1005.     {
  1006.         f = m->focussed_filler;
  1007.     }
  1008.     else
  1009.     {
  1010.         f = m->normal_filler;
  1011.     }
  1012.     if (m->flags & UI_MATRIX_MENU_DISABLE_BACKGROUND)
  1013.     {
  1014.         gdi_layer_push_clip();
  1015.         gdi_layer_set_clip(x1, y1, x2, y2);
  1016.         gdi_draw_solid_rect(x1, y1, x2, y2, GDI_COLOR_TRANSPARENT);
  1017.         gdi_layer_pop_clip();
  1018.     }
  1019.     else
  1020.     {
  1021.         gui_set_clip(x1, y1, x2, y2);
  1022.         if (wgui_is_wallpaper_on_bottom() == MMI_TRUE)
  1023.         {
  1024.             gdi_draw_solid_rect(x1, y1, x2, y2, GDI_COLOR_TRANSPARENT);
  1025.         #if defined (__MMI_UI_TRANSPARENT_EFFECT__) || defined (__MMI_UI_LIST_HIGHLIGHT_EFFECTS__)
  1026.             /* gui_set_transparent_source_layer(dm_get_scr_bg_layer());//should remove */
  1027.         #endif 
  1028.         }
  1029.         else
  1030.         {
  1031.             UI_filled_area tmp_f = *f;
  1032.             /* In current implementation, matrix menu does not support bordered background 
  1033.                very well because highlighted item is overlapped with border. */
  1034.             tmp_f.flags &= ~(UI_FILLED_AREA_SINGLE_BORDER | UI_FILLED_AREA_DOUBLE_BORDER);
  1035.             
  1036.             gui_draw_filled_area(x1, y1, x2, y2, &tmp_f);
  1037.         }
  1038.     }
  1039. #ifdef __MMI_BI_DEGREE_MAIN_MENU_STYLE__
  1040.     /* Start Draw Indication Arrows. */
  1041.     if (MMI_current_menu_type == LIST_MATRIX_MENU)
  1042.     {
  1043.         if (m->displayed_rows < m->n_rows)
  1044.         {
  1045.             S32 hor_gap = 0;
  1046.             has_previous_page = MMI_FALSE;
  1047.             has_next_page = MMI_FALSE;
  1048.             gdi_layer_push_clip();
  1049.             gdi_layer_reset_clip();
  1050.             if (m->first_displayed_row > 0) /* previous page exists */
  1051.             {
  1052.                 has_previous_page = MMI_TRUE;
  1053.             }
  1054.             if ((m->first_displayed_row + m->displayed_rows - 1) < m->n_rows - 1)       /* next page exists */
  1055.             {
  1056.                 has_next_page = MMI_TRUE;
  1057.             }
  1058.             if (has_previous_page && has_next_page)
  1059.             {
  1060.                 hor_gap = (m->width - MMI_BI_DEGREE_MAIN_MENU_NAVI_BAR_IND_BG_SIZE * 2) / 3;
  1061.                 gui_setup_fixed_matrix_menu_ind_area(
  1062.                     &(m->up_ind_area),
  1063.                     m->x + hor_gap,
  1064.                     y2 + 1,
  1065.                     (U8*) get_string(26000),
  1066.                     0);
  1067.                 gui_setup_fixed_matrix_menu_ind_area(
  1068.                     &(m->down_ind_area),
  1069.                     m->x + (hor_gap * 2) + MMI_BI_DEGREE_MAIN_MENU_ARROW_IND_SIZE,
  1070.                     y2 + 1,
  1071.                     (U8*) get_string(26004),
  1072.                     0);
  1073.                 gdi_draw_solid_rect(
  1074.                     m->x + hor_gap,
  1075.                     y2 + 1,
  1076.                     m->x + hor_gap + MMI_BI_DEGREE_MAIN_MENU_ARROW_IND_SIZE,
  1077.                     y2 + MMI_BI_DEGREE_MAIN_MENU_ARROW_BAR_HEIGHT,
  1078.                     GDI_COLOR_GREEN);
  1079.                 gdi_draw_solid_rect(
  1080.                     m->x + (hor_gap * 2) + MMI_BI_DEGREE_MAIN_MENU_ARROW_IND_SIZE,
  1081.                     y2 - MMI_BI_DEGREE_MAIN_MENU_ARROW_BAR_HEIGHT + 1,
  1082.                     m->x + ((hor_gap + MMI_BI_DEGREE_MAIN_MENU_ARROW_IND_SIZE) * 2),
  1083.                     y2,
  1084.                     GDI_COLOR_GREEN);
  1085.             }
  1086.             else if (has_previous_page)
  1087.             {
  1088.                 hor_gap = (m->width - MMI_BI_DEGREE_MAIN_MENU_NAVI_BAR_IND_BG_SIZE) >> 1;
  1089.                 gui_setup_fixed_matrix_menu_ind_area(
  1090.                     &(m->up_ind_area),
  1091.                     m->x + hor_gap,
  1092.                     y2 + 1,
  1093.                     (U8*) get_string(26000),
  1094.                     0);
  1095.                 gui_setup_fixed_matrix_menu_ind_area(&(m->down_ind_area), 0, 0, NULL, 0);
  1096.                 gdi_draw_solid_rect(
  1097.                     m->x + hor_gap,
  1098.                     y2 + 1,
  1099.                     m->x + hor_gap + MMI_BI_DEGREE_MAIN_MENU_NAVI_BAR_IND_BG_SIZE,
  1100.                     y2 + MMI_BI_DEGREE_MAIN_MENU_ARROW_BAR_HEIGHT /* MMI_BI_DEGREE_MAIN_MENU_NAVI_BAR_HEIGHT */ ,
  1101.                     GDI_COLOR_GREEN);
  1102.             }
  1103.             else if (has_next_page)
  1104.             {
  1105.                 hor_gap = (m->width - MMI_BI_DEGREE_MAIN_MENU_NAVI_BAR_IND_BG_SIZE) >> 1;
  1106.                 gui_setup_fixed_matrix_menu_ind_area(
  1107.                     &(m->down_ind_area),
  1108.                     m->x + hor_gap,
  1109.                     y2 + 1,
  1110.                     (U8*) get_string(26000),
  1111.                     0);
  1112.                 gui_setup_fixed_matrix_menu_ind_area(&(m->up_ind_area), 0, 0, NULL, 0);
  1113.                 gdi_draw_solid_rect(
  1114.                     m->x + hor_gap,
  1115.                     y2 + 1,
  1116.                     m->x + hor_gap + MMI_BI_DEGREE_MAIN_MENU_NAVI_BAR_IND_BG_SIZE,
  1117.                     y2 + MMI_BI_DEGREE_MAIN_MENU_ARROW_BAR_HEIGHT /* MMI_BI_DEGREE_MAIN_MENU_NAVI_BAR_HEIGHT */ ,
  1118.                     GDI_COLOR_RED);
  1119.             }
  1120.             gdi_layer_pop_clip();
  1121.         }
  1122.     }
  1123.     /* End Draw Indication Arrows. */
  1124. #endif /* __MMI_BI_DEGREE_MAIN_MENU_STYLE__ */ 
  1125.     if (m->flags & UI_MATRIX_MENU_SHOW_VERTICAL_SCROLLBAR)
  1126.     {
  1127.         show_vbar = 1;
  1128.     }
  1129.     if (m->flags & UI_MATRIX_MENU_SHOW_HORIZONTAL_SCROLLBAR)
  1130.     {
  1131.         show_hbar = 1;
  1132.     }
  1133.     if (m->n_items == 0)
  1134.     {
  1135.         return;
  1136.     }
  1137.     if (r2lMMIFlag)
  1138.     {
  1139.         if (show_hbar)
  1140.         {
  1141.             y2 -= m->hbar.height - 1;
  1142.         }
  1143.     }
  1144.     else
  1145.     {
  1146.         if (show_vbar)
  1147.         {
  1148.             x2 -= m->vbar.width - 1;
  1149.         }
  1150.         if (show_hbar)
  1151.         {
  1152.             y2 -= m->hbar.height - 1;
  1153.         }
  1154.     }
  1155.     width = x2 - x1 + 1;
  1156. #ifdef __MMI_BI_DEGREE_MAIN_MENU_STYLE__
  1157.     if (m->flags & UI_MATRIX_MENU_SHOW_IND_AREA)
  1158.     {
  1159.         y2 -= MMI_BI_DEGREE_MAIN_MENU_NAVI_BAR_IND_BG_SIZE;
  1160.     }
  1161. #endif /* __MMI_BI_DEGREE_MAIN_MENU_STYLE__ */ 
  1162.     height = y2 - y1 + 1;
  1163.     iwidth = m->item_width;
  1164.     iheight = m->item_height;
  1165.     gui_set_text_clip(x1, y1, x2, y2);
  1166.     gui_set_clip(x1, y1, x2, y2);
  1167.     /*
  1168.      * xoff=(width>>1)-((iwidth*m->displayed_columns)>>1);
  1169.      * yoff=(height>>1)-((iheight*m->displayed_rows)>>1);
  1170.      */
  1171.     xoff = (width - (iwidth * m->displayed_columns)) / (m->displayed_columns + 1);
  1172.     yoff = (height - (iheight * m->displayed_rows)) / (m->displayed_rows + 1);
  1173.     iy = y1 + yoff;
  1174.     for (j = 0; j < m->displayed_rows; j++)
  1175.     {
  1176.         ix = x1 + xoff;
  1177.         o = (m->first_displayed_row + j) * m->n_columns;
  1178.         for (i = 0; i < m->displayed_columns; i++)
  1179.         {
  1180.             k = o + (m->first_displayed_column + i);
  1181.             if (k > (m->n_items - 1))
  1182.             {
  1183.                 break;
  1184.             }
  1185.             ix2 = ix + iwidth - 1;
  1186.             iy2 = iy + iheight - 1;
  1187.             if (ix2 > x2)
  1188.             {
  1189.                 ix2 = x2;
  1190.             }
  1191.             if (iy2 > y2)
  1192.             {
  1193.                 iy2 = y2;
  1194.             }
  1195.             gdi_layer_push_clip();
  1196.             gui_set_clip(ix, iy, ix2, iy2);
  1197.             gui_set_text_clip(ix, iy, ix2, iy2);
  1198.             /* show selected item after all other items displayed */
  1199.             if (k == m->highlighted_item)
  1200.             {
  1201.                 m->item_remove_highlight_function(m->items[k], m->common_item_data);
  1202.                 m->item_display_function(m->items[k], m->common_item_data, ix, iy);
  1203.                 m->item_highlight_function(m->items[k], m->common_item_data);
  1204.                 highlite_x = ix;
  1205.                 highlite_y = iy;
  1206.             }
  1207.             else
  1208.             {
  1209.                 m->item_display_function(m->items[k], m->common_item_data, ix, iy);
  1210.             }
  1211.             gdi_layer_pop_clip();
  1212.             ix += iwidth + xoff;
  1213.         }
  1214.         iy += iheight + yoff;
  1215.     }
  1216.     /* EMS menu not optimized in current implementation, but it can be optimized */
  1217.     if (MMI_current_menu_type != MATRIX_MENU_EMS)
  1218.     {
  1219.     #ifdef __MMI_MATRIX_MAIN_MENU_OPTIMIZE__
  1220.         if (m->highlighted_item_width > m->item_width)
  1221.         {
  1222.             xoff2 = (m->highlighted_item_width - m->item_width);
  1223.         }
  1224.         else
  1225.         {
  1226.             xoff2 = 0;
  1227.         }
  1228.         if (m->highlighted_item_height > m->item_height)
  1229.         {
  1230.             yoff2 = (m->highlighted_item_height - m->item_height);
  1231.         }
  1232.         else
  1233.         {
  1234.             yoff2 = 0;
  1235.         }
  1236.         xPos = highlite_x - (xoff2 >> 1);
  1237.         xPos2 = xPos + m->highlighted_item_width - 1;
  1238.         yPos = highlite_y - (yoff2 >> 1);
  1239.         yPos2 = yPos + m->highlighted_item_height - 1;
  1240.         if (xPos < m->x)
  1241.         {
  1242.             xPos = m->x;
  1243.             xPos2 = xPos + m->highlighted_item_width - 1;
  1244.         }
  1245.         if (xPos2 > m->x + m->width - 1)
  1246.         {
  1247.             xPos2 = m->x + m->width - 1;
  1248.             xPos = xPos2 - m->highlighted_item_width + 1;
  1249.         }
  1250.         if (yPos < m->y)
  1251.         {
  1252.             yPos = m->y;
  1253.             yPos2 = yPos + m->highlighted_item_height - 1;
  1254.         }
  1255.         if (yPos2 > m->y + m->height - 1)
  1256.         {
  1257.             yPos2 = m->y + m->height - 1;
  1258.             yPos = yPos2 - m->highlighted_item_height + 1;
  1259.         }
  1260.     #if 0
  1261. /* under construction !*/
  1262. /* under construction !*/
  1263. /* under construction !*/
  1264. /* under construction !*/
  1265. /* under construction !*/
  1266. /* under construction !*/
  1267. /* under construction !*/
  1268. /* under construction !*/
  1269. /* under construction !*/
  1270. /* under construction !*/
  1271. /* under construction !*/
  1272. /* under construction !*/
  1273. /* under construction !*/
  1274. /* under construction !*/
  1275. /* under construction !*/
  1276. /* under construction !*/
  1277. /* under construction !*/
  1278. /* under construction !*/
  1279. /* under construction !*/
  1280. /* under construction !*/
  1281. /* under construction !*/
  1282. /* under construction !*/
  1283. /* under construction !*/
  1284. /* under construction !*/
  1285. /* under construction !*/
  1286. /* under construction !*/
  1287. /* under construction !*/
  1288. /* under construction !*/
  1289. /* under construction !*/
  1290. /* under construction !*/
  1291. /* under construction !*/
  1292. /* under construction !*/
  1293. /* under construction !*/
  1294. /* under construction !*/
  1295. /* under construction !*/
  1296. /* under construction !*/
  1297. /* under construction !*/
  1298. /* under construction !*/
  1299. /* under construction !*/
  1300. /* under construction !*/
  1301. /* under construction !*/
  1302. /* under construction !*/
  1303. /* under construction !*/
  1304.     #endif /* 0 */ 
  1305.         //if ( highlite_y-yoff2 < y1 )
  1306.         //        gdi_image_cache_bmp_get(highlite_x-xoff2, y1, highlite_x+m->highlighted_item_width+xoff2,highlite_y+m->highlighted_item_height+yoff2,&m->buffer);
  1307.         //else if ( highlite_y+m->highlighted_item_height+yoff2 > y2 )
  1308.         //        gdi_image_cache_bmp_get(highlite_x-xoff2, highlite_y-yoff2, highlite_x+m->highlighted_item_width+xoff2,y2,&m->buffer);          
  1309.         //else
  1310.         //        gdi_image_cache_bmp_get(highlite_x-xoff2, highlite_y-yoff2, highlite_x+m->highlighted_item_width+xoff2,highlite_y+m->highlighted_item_height+yoff2,&m->buffer);
  1311.         gdi_layer_push_clip();
  1312.         gdi_layer_set_clip(xPos, yPos, xPos2, yPos2);
  1313.     #ifdef __MMI_MATRIX_MAIN_MENU_FULL_BACKGROUND__
  1314.         MMI_ASSERT((xPos2 - xPos + 1) * (yPos2 - yPos + 1) * gdi_layer_get_bit_per_pixel() >> 3 <=
  1315.                    OPTIMIZE_MM_BUF_SIZE);
  1316.     #endif /* __MMI_MATRIX_MAIN_MENU_FULL_BACKGROUND__ */ 
  1317.         gdi_image_cache_bmp_get(xPos, yPos, xPos2, yPos2, &m->buffer);
  1318.         gdi_layer_pop_clip();
  1319.         m->cache_bmp_x1 = xPos;
  1320.         m->cache_bmp_x2 = xPos2;
  1321.         m->cache_bmp_y1 = yPos;
  1322.         m->cache_bmp_y2 = yPos2;
  1323.         m->last_hilited_x = highlite_x;
  1324.         m->last_hilited_y = highlite_y;
  1325.     #endif /* __MMI_MATRIX_MAIN_MENU_OPTIMIZE__ */ 
  1326.     }
  1327.     /* gui_set_clip(highlite_x,highlite_y,highlite_x+iwidth,highlite_y+iheight); */
  1328.     m->item_display_function(m->items[m->highlighted_item], m->common_item_data, highlite_x, highlite_y);
  1329.     gui_set_clip(cx1, cy1, cx2, cy2);
  1330.     gui_set_text_clip(tx1, ty1, tx2, ty2);
  1331.     if (show_vbar)
  1332.     {
  1333.         gui_set_vertical_scrollbar_range(&m->vbar, m->n_rows);
  1334.         gui_set_vertical_scrollbar_scale(&m->vbar, m->displayed_rows);
  1335.         gui_set_vertical_scrollbar_value(&m->vbar, m->first_displayed_row);
  1336.         if (r2lMMIFlag)
  1337.         {
  1338.             vbar_x = m->vbar.x;
  1339.             vbar_button_x = m->vbar.scroll_button.x;
  1340.             m->vbar.x = m->vbar.x + m->vbar.width - m->width;
  1341.             m->vbar.scroll_button.x = m->vbar.scroll_button.x + m->vbar.scroll_button.width - m->width;
  1342.             gui_show_vertical_scrollbar(&m->vbar);
  1343.             m->vbar.x = vbar_x;
  1344.             m->vbar.scroll_button.x = vbar_button_x;
  1345.         }
  1346.         else
  1347.         {
  1348.             gui_show_vertical_scrollbar(&m->vbar);
  1349.         }
  1350.     }
  1351.     if (show_hbar)
  1352.     {
  1353.         gui_set_horizontal_scrollbar_range(&m->hbar, m->n_columns);
  1354.         gui_set_horizontal_scrollbar_scale(&m->hbar, m->displayed_columns);
  1355.         gui_set_horizontal_scrollbar_value(&m->hbar, m->first_displayed_column);
  1356.         gui_show_horizontal_scrollbar(&m->hbar);
  1357.     }
  1358. }
  1359. /*****************************************************************************
  1360.  * FUNCTION
  1361.  *  gui_hide_fixed_matrix_menu_highlighted_item
  1362.  * DESCRIPTION
  1363.  *  Hides the highlighted item
  1364.  * PARAMETERS
  1365.  *  m       [IN]        Is the fixed matrix menu object
  1366.  * RETURNS
  1367.  *  void
  1368.  *****************************************************************************/
  1369. void gui_hide_fixed_matrix_menu_highlighted_item(fixed_matrix_menu *m)
  1370. {
  1371.     /*----------------------------------------------------------------*/
  1372.     /* Local Variables                                                */
  1373.     /*----------------------------------------------------------------*/
  1374.     S32 x1, y1, x2, y2, xoff, yoff, width, height;
  1375.     S32 i, j, k;
  1376.     S32 cx1, cy1, cx2, cy2;
  1377.     S32 tx1, ty1, tx2, ty2;
  1378.     S32 ix, iy, iwidth, iheight, ix2, iy2;
  1379.     U8 show_vbar = 0, show_hbar = 0;
  1380.     /*----------------------------------------------------------------*/
  1381.     /* Code Body                                                      */
  1382.     /*----------------------------------------------------------------*/
  1383.     gui_get_clip(&cx1, &cy1, &cx2, &cy2);
  1384.     gui_get_text_clip(&tx1, &ty1, &tx2, &ty2);
  1385.     x1 = m->x;
  1386.     y1 = m->y;
  1387.     x2 = x1 + m->width - 1;
  1388.     y2 = y1 + m->height - 1;
  1389.     if (m->flags & UI_MATRIX_MENU_SHOW_VERTICAL_SCROLLBAR)
  1390.     {
  1391.         show_vbar = 1;
  1392.     }
  1393.     if (m->flags & UI_MATRIX_MENU_SHOW_HORIZONTAL_SCROLLBAR)
  1394.     {
  1395.         show_hbar = 1;
  1396.     }
  1397.     if (m->n_items == 0)
  1398.     {
  1399.         return;
  1400.     }
  1401.     x1 += 3;
  1402.     x2 -= 3;
  1403.     y1 += 3;
  1404.     y2 -= 3;
  1405.     if (show_vbar)
  1406.     {
  1407.         x2 -= m->vbar.width - 1;
  1408.     }
  1409.     if (show_hbar)
  1410.     {
  1411.         y2 -= m->hbar.height - 1;
  1412.     }
  1413.     iwidth = m->item_width;
  1414.     iheight = m->item_height;
  1415.     width = x2 - x1 + 1;
  1416.     height = y2 - y1 + 1;
  1417.     gui_set_text_clip(x1, y1, x2, y2);
  1418.     gui_set_clip(x1, y1, x2, y2);
  1419.     xoff = (width >> 1) - ((iwidth * m->displayed_columns) >> 1);
  1420.     yoff = (height >> 1) - ((iheight * m->displayed_rows) >> 1);
  1421.     iy = y1 + yoff;
  1422.     for (j = 0; j < m->displayed_rows; j++)
  1423.     {
  1424.         ix = x1 + xoff;
  1425.         for (i = 0; i < m->displayed_columns; i++)
  1426.         {
  1427.             k = ((m->first_displayed_row + j) * m->n_columns) + (m->first_displayed_column + i);
  1428.             if (k > (m->n_items - 1))
  1429.             {
  1430.                 break;
  1431.             }
  1432.             ix2 = ix + iwidth - 1;
  1433.             iy2 = iy + iheight - 1;
  1434.             if (ix2 > x2)
  1435.             {
  1436.                 ix2 = x2;
  1437.             }
  1438.             if (iy2 > y2)
  1439.             {
  1440.                 iy2 = y2;
  1441.             }
  1442.             gui_set_clip(ix, iy, ix2, iy2);
  1443.             gui_set_text_clip(ix, iy, ix2, iy2);
  1444.             if (k == m->highlighted_item)
  1445.             {
  1446.                 m->item_hide_function(m->items[k], m->common_item_data, ix, iy);
  1447.             }
  1448.             ix += iwidth;
  1449.         }
  1450.         iy += iheight;
  1451.     }
  1452.     gui_set_clip(cx1, cy1, cx2, cy2);
  1453.     gui_set_text_clip(tx1, ty1, tx2, ty2);
  1454. }
  1455. /*****************************************************************************
  1456.  * FUNCTION
  1457.  *  gui_set_fixed_matrix_menu_item_functions
  1458.  * DESCRIPTION
  1459.  *  Sets the functions used to display generic menuitems
  1460.  * PARAMETERS
  1461.  *  m                                   [IN]        Is the fixed matrix menu object
  1462.  *  item_display_function               [IN]        Is the function used to display an item
  1463.  *  item_measure_function               [IN]        Is the function used to measure an item
  1464.  *  item_highlight_function             [OUT]       Is the function used to highlight an item
  1465.  *  item_remove_highlight_function      [IN]        Is the function used to remove highlight of an item
  1466.  *  item_hide_function                  [IN]        Is the function used to hide the menuitem
  1467.  *  width(?)                            [OUT]       Height      are the dimensions of the menuitem
  1468.  *  item(?)                             [IN]        Is the specific fixed menuitem
  1469.  *  x(?)                                [IN]        Position at which the menuitem was displayed
  1470.  *  y(?)                                [IN]        Position at which the menuitem was displayed
  1471.  *  common_item_data(?)                 [IN]        Common fixed menuitem
  1472.  * RETURNS
  1473.  *  void
  1474.  *****************************************************************************/
  1475. void gui_set_fixed_matrix_menu_item_functions(
  1476.         fixed_matrix_menu *m,
  1477.         void (*item_display_function) (void *item, void *common_item_data, S32 x, S32 y),
  1478.         void (*item_measure_function) (void *item, void *common_item_data, S32 *width, S32 *height),
  1479.         void (*item_highlight_function) (void *item, void *common_item_data),
  1480.         void (*item_remove_highlight_function) (void *item, void *common_item_data),
  1481.         void (*item_hide_function) (void *item, void *common_item_data, S32 x, S32 y))
  1482. {
  1483.     /*----------------------------------------------------------------*/
  1484.     /* Local Variables                                                */
  1485.     /*----------------------------------------------------------------*/
  1486.     /*----------------------------------------------------------------*/
  1487.     /* Code Body                                                      */
  1488.     /*----------------------------------------------------------------*/
  1489.     m->item_display_function = item_display_function;
  1490.     m->item_measure_function = item_measure_function;
  1491.     m->item_highlight_function = item_highlight_function;
  1492.     m->item_remove_highlight_function = item_remove_highlight_function;
  1493.     m->item_hide_function = item_hide_function;
  1494. }
  1495. /*****************************************************************************
  1496.  * FUNCTION
  1497.  *  gui_set_fixed_matrix_menu_common_item_data
  1498.  * DESCRIPTION
  1499.  *  Sets the common item data that the list of items should use
  1500.  * PARAMETERS
  1501.  *  m       [IN]        Is the fixed matrix menu object
  1502.  *  c       [IN]        Is the common item data
  1503.  * RETURNS
  1504.  *  void
  1505.  *****************************************************************************/
  1506. void gui_set_fixed_matrix_menu_common_item_data(fixed_matrix_menu *m, void *c)
  1507. {
  1508.     /*----------------------------------------------------------------*/
  1509.     /* Local Variables                                                */
  1510.     /*----------------------------------------------------------------*/
  1511.     /*----------------------------------------------------------------*/
  1512.     /* Code Body                                                      */
  1513.     /*----------------------------------------------------------------*/
  1514.     m->common_item_data = c;
  1515. }
  1516. #ifdef __MMI_TOUCH_SCREEN__
  1517. /*****************************************************************************
  1518.  * FUNCTION
  1519.  *  gui_fixed_matrix_menu_vertical_scroll_by_pen
  1520.  * DESCRIPTION
  1521.  *  draws the idle screen depending upon the pen event occured
  1522.  * PARAMETERS
  1523.  *  m                       [IN]        Is matrix menu object's description
  1524.  *  first_displayed_row     [IN]        
  1525.  *  menu_event              [OUT]       
  1526.  *  first_displayed(?)      [IN]        Tells the area of the scrollbar at which pen event has happened
  1527.  * RETURNS
  1528.  *  void
  1529.  *****************************************************************************/
  1530. static void gui_fixed_matrix_menu_vertical_scroll_by_pen(
  1531.                 fixed_matrix_menu *m,
  1532.                 S32 first_displayed_row,
  1533.                 gui_matrix_pen_enum *menu_event)
  1534. {
  1535.     /*----------------------------------------------------------------*/
  1536.     /* Local Variables                                                */
  1537.     /*----------------------------------------------------------------*/
  1538.     S32 last_displayed_row;
  1539.     /*----------------------------------------------------------------*/
  1540.     /* Code Body                                                      */
  1541.     /*----------------------------------------------------------------*/
  1542.     if (first_displayed_row > m->highlighted_row)
  1543.     {
  1544.         m->flags |= UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_ROW;
  1545.         gui_fixed_matrix_menu_goto_row(m, first_displayed_row);
  1546.         m->flags &= ~UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_ROW;
  1547.         *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1548.     }
  1549.     else
  1550.     {
  1551.         last_displayed_row = first_displayed_row + m->displayed_rows - 1;
  1552.         MMI_DBG_ASSERT(last_displayed_row <= m->n_rows - 1);
  1553.         if (last_displayed_row < m->highlighted_row)
  1554.         {
  1555.             m->flags |= UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_ROW;
  1556.             gui_fixed_matrix_menu_goto_row(m, last_displayed_row);
  1557.             m->flags &= ~UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_ROW;
  1558.             *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1559.         }
  1560.         else
  1561.         {
  1562.             /* Scrolling without changing highlight (this case only  happens with pen support) */
  1563.             m->first_displayed_row = first_displayed_row;
  1564.             /* Although highlighted item stays the same, we need to stop and restart the animation */
  1565.             m->item_remove_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  1566.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  1567.             *menu_event = GUI_MATRIX_PEN_NEED_REDRAW;
  1568.         }
  1569.     }
  1570. }
  1571. /*****************************************************************************
  1572.  * FUNCTION
  1573.  *  gui_fixed_matrix_menu_horizontal_scroll_by_pen
  1574.  * DESCRIPTION
  1575.  *  draws the idle screen depending upon the pen event occured
  1576.  * PARAMETERS
  1577.  *  m                           [IN]        Is matrix menu object's description
  1578.  *  first_displayed_column      [IN]        
  1579.  *  menu_event                  [OUT]       
  1580.  *  first_displayed(?)          [IN]        Tells the area of the scrollbar at which pen event has happened
  1581.  * RETURNS
  1582.  *  void
  1583.  *****************************************************************************/
  1584. static void gui_fixed_matrix_menu_horizontal_scroll_by_pen(
  1585.                 fixed_matrix_menu *m,
  1586.                 S32 first_displayed_column,
  1587.                 gui_matrix_pen_enum *menu_event)
  1588. {
  1589.     /*----------------------------------------------------------------*/
  1590.     /* Local Variables                                                */
  1591.     /*----------------------------------------------------------------*/
  1592.     S32 last_displayed_column;
  1593.     /*----------------------------------------------------------------*/
  1594.     /* Code Body                                                      */
  1595.     /*----------------------------------------------------------------*/
  1596.     if (first_displayed_column > m->highlighted_column)
  1597.     {
  1598.         m->flags |= UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_COL;
  1599.         gui_fixed_matrix_menu_goto_column(m, first_displayed_column);
  1600.         m->flags &= ~UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_COL;
  1601.         *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1602.     }
  1603.     else
  1604.     {
  1605.         last_displayed_column = first_displayed_column + m->displayed_columns - 1;
  1606.         MMI_DBG_ASSERT(last_displayed_column <= m->n_columns - 1);
  1607.         if (last_displayed_column < m->highlighted_column)
  1608.         {
  1609.             m->flags |= UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_COL;
  1610.             gui_fixed_matrix_menu_goto_column(m, last_displayed_column);
  1611.             m->flags &= ~UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_COL;
  1612.             *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1613.         }
  1614.         else
  1615.         {
  1616.             /* Scrolling without changing highlight (this case only  happens with pen support) */
  1617.             m->first_displayed_column = first_displayed_column;
  1618.             /* Although highlighted item stays the same, we need to stop and restart the animation */
  1619.             m->item_remove_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  1620.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  1621.             *menu_event = GUI_MATRIX_PEN_NEED_REDRAW;
  1622.         }
  1623.     }
  1624. }
  1625. /*****************************************************************************
  1626.  * FUNCTION
  1627.  *  gui_fixed_matrix_menu_handle_pen_position
  1628.  * DESCRIPTION
  1629.  *  Handle the pen event (down/move/up), go to the menu item, and set the menu event
  1630.  * PARAMETERS
  1631.  *  m               [IN]        Is matrix menu object's description
  1632.  *  x               [IN]        Co-ordinates of the pen down point
  1633.  *  y               [IN]        Co-ordinates of the pen down point
  1634.  *  pen_event       [IN]        Only MMI_PEN_EVENT_DOWN, MMI_PEN_EVENT_MOVE, MMI_PEN_EVENT_UP is supported
  1635.  *  menu_event      [OUT]       Menu event
  1636.  * RETURNS
  1637.  *  void
  1638.  *****************************************************************************/
  1639. static void gui_fixed_matrix_menu_handle_pen_position(
  1640.                 fixed_matrix_menu *m,
  1641.                 S32 x,
  1642.                 S32 y,
  1643.                 mmi_pen_event_type_enum pen_event,
  1644.                 gui_matrix_pen_enum *menu_event)
  1645. {
  1646.     /*----------------------------------------------------------------*/
  1647.     /* Local Variables                                                */
  1648.     /*----------------------------------------------------------------*/
  1649.     /*
  1650.      * Because the sampling rate of Pen Move events is not very high on hardware, 
  1651.      * * we might "jump" to a menu item aparted from the last highlighted menu item.
  1652.      */
  1653.     /* FIXME. we do not handle the case that hilighted menu item has bigger size, but it is usually okay */
  1654.     S32 xoff, yoff;
  1655.     S32 width, height;
  1656.     S32 iwidth, iheight;
  1657.     S32 new_row, new_column, item_index;
  1658.     /*----------------------------------------------------------------*/
  1659.     /* Code Body                                                      */
  1660.     /*----------------------------------------------------------------*/
  1661. #define COMPUTE_NEW_ROW()  do {                                            
  1662.       if (y < yoff)                                                           
  1663.          new_row = m->first_displayed_row;                                    
  1664.       else                                                                    
  1665.          new_row = m->first_displayed_row + ((y - yoff) / (iheight + yoff));  
  1666.       if (new_row > m->first_displayed_row + m->displayed_rows - 1)           
  1667.          new_row = m->first_displayed_row + m->displayed_rows - 1;            
  1668.    } while (0)
  1669. #define COMPUTE_NEW_COLUMN() do {                                                
  1670.       if (x < xoff)                                                                 
  1671.          new_column = m->first_displayed_column;                                    
  1672.       else                                                                          
  1673.          new_column = m->first_displayed_column + ((x - xoff) / (iwidth + xoff));   
  1674.       if (new_column > m->first_displayed_column + m->displayed_columns - 1)        
  1675.          new_column = m->first_displayed_column + m->displayed_columns - 1;         
  1676.    } while (0)
  1677.     y -= m->y;
  1678.     x -= m->x;
  1679.     iwidth = m->item_width;
  1680.     iheight = m->item_height;
  1681.     width = m->width;
  1682.     height = m->height;
  1683.     if (m->flags & UI_MATRIX_MENU_SHOW_VERTICAL_SCROLLBAR)
  1684.     {
  1685.         width -= m->vbar.width;
  1686.     }
  1687.     if (m->flags & UI_MATRIX_MENU_SHOW_HORIZONTAL_SCROLLBAR)
  1688.     {
  1689.         height -= m->hbar.height;
  1690.     }
  1691.     xoff = (width - (iwidth * m->displayed_columns)) / (m->displayed_columns + 1);
  1692.     yoff = (height - (iheight * m->displayed_rows)) / (m->displayed_rows + 1);
  1693.     MMI_DBG_ASSERT(pen_event == MMI_PEN_EVENT_DOWN || pen_event == MMI_PEN_EVENT_MOVE || pen_event == MMI_PEN_EVENT_UP);
  1694.     /* These asumptions are mandatory */
  1695.     MMI_DBG_ASSERT(m->first_displayed_row >= 0 &&
  1696.                    m->first_displayed_column >= 0 &&
  1697.                    m->first_displayed_row <= m->n_rows - m->displayed_rows &&
  1698.                    m->first_displayed_column <= m->n_columns - m->displayed_columns);
  1699.     if (y < 0)  /* Scroll up */
  1700.     {
  1701.         /* drag & scroll only applies to Pen Move event */
  1702.         if (pen_event != MMI_PEN_EVENT_MOVE || m->first_displayed_row == 0)
  1703.         {
  1704.             *menu_event = GUI_MATRIX_PEN_NONE;
  1705.         }
  1706.         else
  1707.         {
  1708.             new_row = m->first_displayed_row - 1;
  1709.             COMPUTE_NEW_COLUMN();
  1710.             item_index = new_row * m->n_columns + new_column;
  1711.             m->flags |= UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_ROW;
  1712.             gui_fixed_matrix_menu_goto_item(m, item_index);
  1713.             m->flags &= ~UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_ROW;
  1714.             *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1715.         }
  1716.     }
  1717.     else if (x < 0) /* Scroll left */
  1718.     {
  1719.         /* drag & scroll only applies to Pen Move event */
  1720.         if (pen_event != MMI_PEN_EVENT_MOVE || m->first_displayed_column == 0)
  1721.         {
  1722.             *menu_event = GUI_MATRIX_PEN_NONE;
  1723.         }
  1724.         else
  1725.         {
  1726.             new_column = m->first_displayed_column - 1;
  1727.             COMPUTE_NEW_ROW();
  1728.             item_index = new_row * m->n_columns + new_column;
  1729.             m->flags |= UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_COL;
  1730.             gui_fixed_matrix_menu_goto_item(m, item_index);
  1731.             m->flags &= ~UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_COL;
  1732.             *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1733.         }
  1734.     }
  1735.     else if (y >= height)   /* Scroll down */
  1736.     {
  1737.         /* drag & scroll only applies to Pen Move event */
  1738.         if (pen_event != MMI_PEN_EVENT_MOVE || m->first_displayed_row == m->n_rows - m->displayed_rows)
  1739.         {
  1740.             *menu_event = GUI_MATRIX_PEN_NONE;
  1741.         }
  1742.         else
  1743.         {
  1744.             new_row = m->first_displayed_row + m->displayed_rows;
  1745.             COMPUTE_NEW_COLUMN();
  1746.             item_index = new_row * m->n_columns + new_column;
  1747.             if (item_index < m->n_items)    /* when n_items is not multiple of displayed_columns */
  1748.             {
  1749.                 m->flags |= UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_ROW;
  1750.                 gui_fixed_matrix_menu_goto_item(m, item_index);
  1751.                 m->flags &= ~UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_ROW;
  1752.                 *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1753.             }
  1754.             else
  1755.             {
  1756.                 *menu_event = GUI_MATRIX_PEN_NONE;
  1757.             }
  1758.         }
  1759.     }
  1760.     else if (x >= width)    /* Scroll right */
  1761.     {
  1762.         /* drag & scroll only applies to Pen Move event */
  1763.         if (pen_event != MMI_PEN_EVENT_MOVE || m->first_displayed_column == m->n_columns - m->displayed_columns)
  1764.         {
  1765.             *menu_event = GUI_MATRIX_PEN_NONE;
  1766.         }
  1767.         else
  1768.         {
  1769.             new_column = m->first_displayed_column + m->displayed_columns;
  1770.             COMPUTE_NEW_ROW();
  1771.             item_index = new_row * m->n_columns + new_column;
  1772.             if (item_index < m->n_items)    /* when n_items is not multiple of displayed_columns */
  1773.             {
  1774.                 m->flags |= UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_COL;
  1775.                 gui_fixed_matrix_menu_goto_item(m, item_index);
  1776.                 m->flags &= ~UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_COL;
  1777.                 *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1778.             }
  1779.             else
  1780.             {
  1781.                 *menu_event = GUI_MATRIX_PEN_NONE;
  1782.             }
  1783.         }
  1784.     }
  1785. #ifdef __MMI_BI_DEGREE_MAIN_MENU_STYLE__
  1786.     else if (pen_event == MMI_PEN_EVENT_DOWN
  1787.              && (m->up_ind_area.string != NULL || m->up_ind_area.img_id != 0)
  1788.              && ((x + m->x) > m->up_ind_area.x && (x + m->x) < (m->up_ind_area.x + m->up_ind_area.width - 1))
  1789.              && ((y + m->y) > m->up_ind_area.y && (y + m->y) < (m->up_ind_area.y + m->up_ind_area.height - 1)))
  1790.     {
  1791.         new_row = m->first_displayed_row - m->displayed_rows;
  1792.         item_index = new_row * m->n_columns + m->first_displayed_column;
  1793.         m->flags |= UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_ROW;
  1794.         gui_fixed_matrix_menu_goto_item(m, item_index);
  1795.         m->flags &= ~UI_MATRIX_MENU_FIRST_SHIFT_HIGHLIGHTED_ROW;
  1796.         *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1797.     }
  1798.     else if (pen_event == MMI_PEN_EVENT_DOWN
  1799.              && (m->down_ind_area.string != NULL || m->down_ind_area.img_id != 0)
  1800.              && ((x + m->x) > m->down_ind_area.x && (x + m->x) < (m->down_ind_area.x + m->down_ind_area.width - 1))
  1801.              && ((y + m->y) > m->down_ind_area.y && (y + m->y) < (m->down_ind_area.y + m->down_ind_area.height - 1)))
  1802.     {
  1803.         new_row = m->first_displayed_row + m->displayed_rows;
  1804.         item_index = new_row * m->n_columns + m->first_displayed_column;
  1805.         if (item_index < m->n_items)    /* when n_items is not multiple of displayed_columns */
  1806.         {
  1807.             m->flags |= UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_ROW;
  1808.             gui_fixed_matrix_menu_goto_item(m, item_index);
  1809.             m->flags &= ~UI_MATRIX_MENU_LAST_SHIFT_HIGHLIGHTED_ROW;
  1810.             *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1811.         }
  1812.         else
  1813.         {
  1814.             *menu_event = GUI_MATRIX_PEN_NONE;
  1815.         }
  1816.     }
  1817. #endif /* __MMI_BI_DEGREE_MAIN_MENU_STYLE__ */ 
  1818.     else
  1819.     {
  1820.         S32 act_x = 0, act_y = 0;
  1821.         act_x = xoff * (m->displayed_columns) + (m->displayed_columns) * m->item_width;
  1822.         act_y = yoff * (m->displayed_rows) + (m->displayed_rows) * m->item_height;
  1823.         if (x > act_x || y > act_y)
  1824.         {
  1825.             *menu_event = GUI_MATRIX_PEN_NONE;
  1826.             return;
  1827.         }
  1828.         COMPUTE_NEW_ROW();
  1829.         COMPUTE_NEW_COLUMN();
  1830.         item_index = new_row * m->n_columns + new_column;
  1831.         if (item_index < m->n_items && item_index != m->highlighted_item)
  1832.         {
  1833.             gui_fixed_matrix_menu_goto_item(m, item_index);
  1834.             *menu_event = GUI_MATRIX_PEN_HIGHLIGHT_CHANGED;
  1835.         }
  1836.         else
  1837.         {
  1838.             if (pen_event == MMI_PEN_EVENT_UP)
  1839.             {
  1840.                 if (m->pen_state.highlight_changed || (item_index >= m->n_items))
  1841.                 {
  1842.                     *menu_event = GUI_MATRIX_PEN_NONE;
  1843.                 }
  1844.                 else
  1845.                 {
  1846.                     *menu_event = GUI_MATRIX_PEN_ITEM_SELECTED;
  1847.                 }
  1848.             }
  1849.             else
  1850.             {
  1851.                 *menu_event = GUI_MATRIX_PEN_NONE;
  1852.             }
  1853.         }
  1854.     }
  1855. }
  1856. /*****************************************************************************
  1857.  * FUNCTION
  1858.  *  gui_fixed_matrix_menu_translate_pen_event
  1859.  * DESCRIPTION
  1860.  *  Translate the pen events occured
  1861.  *  
  1862.  *  horizontal scrolling inside matrix menu is not supported
  1863.  * PARAMETERS
  1864.  *  m               [IN]        Is matrix menu object's description
  1865.  *  pen_event       [IN]        One of the pen events like pen_down,pen_up etc
  1866.  *  x               [IN]        Co-ordinates of the current pen position
  1867.  *  y               [IN]        Co-ordinates of the current pen position
  1868.  *  menu_event      [OUT]       
  1869.  * RETURNS
  1870.  * BOOL
  1871.  *****************************************************************************/
  1872. BOOL gui_fixed_matrix_menu_translate_pen_event(
  1873.         fixed_matrix_menu *m,
  1874.         mmi_pen_event_type_enum pen_event,
  1875.         S16 x,
  1876.         S16 y,
  1877.         gui_matrix_pen_enum *menu_event)
  1878. {
  1879.     /*----------------------------------------------------------------*/
  1880.     /* Local Variables                                                */
  1881.     /*----------------------------------------------------------------*/
  1882.     BOOL ret;
  1883.     gui_matrix_pen_state_struct *pen_state;
  1884.     gui_scrollbar_pen_enum scrollbar_event;
  1885.     gui_pen_event_param_struct scrollbar_param;
  1886.     /*----------------------------------------------------------------*/
  1887.     /* Code Body                                                      */
  1888.     /*----------------------------------------------------------------*/
  1889.     pen_state = &m->pen_state;
  1890.     ret = MMI_TRUE;
  1891.     *menu_event = GUI_MATRIX_PEN_NONE;
  1892.     if (m->flags & UI_MATRIX_MENU_DISABLE_PEN)
  1893.     {
  1894.         return MMI_FALSE;
  1895.     }
  1896.     if (pen_event != MMI_PEN_EVENT_DOWN && pen_state->pen_on_vertical_scrollbar)
  1897.     {
  1898.         gui_vertical_scrollbar_translate_pen_event(&m->vbar, pen_event, x, y, &scrollbar_event, &scrollbar_param);
  1899.         if (scrollbar_event == GUI_SCROLLBAR_PEN_JUMP_TO_I)
  1900.         {
  1901.             gui_fixed_matrix_menu_vertical_scroll_by_pen(m, scrollbar_param._u.i, menu_event);
  1902.         }
  1903.     }
  1904.     else if (pen_event != MMI_PEN_EVENT_DOWN && pen_state->pen_on_horizontal_scrollbar)
  1905.     {
  1906.         gui_horizontal_scrollbar_translate_pen_event(&m->hbar, pen_event, x, y, &scrollbar_event, &scrollbar_param);
  1907.         if (scrollbar_event == GUI_SCROLLBAR_PEN_JUMP_TO_I)
  1908.         {
  1909.             gui_fixed_matrix_menu_horizontal_scroll_by_pen(m, scrollbar_param._u.i, menu_event);
  1910.         }
  1911.     }
  1912.     else
  1913.     {
  1914.         switch (pen_event)
  1915.         {
  1916.             case MMI_PEN_EVENT_DOWN:
  1917.                 if (PEN_CHECK_BOUND(x, y, m->x, m->y, m->width, m->height))
  1918.                 {
  1919.                     if ((m->flags & UI_MATRIX_MENU_SHOW_VERTICAL_SCROLLBAR) &&
  1920.                         gui_vertical_scrollbar_translate_pen_event(
  1921.                             &m->vbar,
  1922.                             MMI_PEN_EVENT_DOWN,
  1923.                             x,
  1924.                             y,
  1925.                             &scrollbar_event,
  1926.                             &scrollbar_param))
  1927.                     {
  1928.                         pen_state->pen_on_vertical_scrollbar = 1;
  1929.                         pen_state->pen_on_horizontal_scrollbar = 0;
  1930.                         if (scrollbar_event == GUI_SCROLLBAR_PEN_JUMP_TO_I)
  1931.                         {
  1932.                             gui_fixed_matrix_menu_vertical_scroll_by_pen(m, scrollbar_param._u.i, menu_event);
  1933.                         }
  1934.                     }
  1935.                     else if ((m->flags & UI_MATRIX_MENU_SHOW_HORIZONTAL_SCROLLBAR) &&
  1936.                              gui_horizontal_scrollbar_translate_pen_event(
  1937.                                 &m->hbar,
  1938.                                 MMI_PEN_EVENT_DOWN,
  1939.                                 x,
  1940.                                 y,
  1941.                                 &scrollbar_event,
  1942.                                 &scrollbar_param))
  1943.                     {
  1944.                         pen_state->pen_on_vertical_scrollbar = 0;
  1945.                         pen_state->pen_on_horizontal_scrollbar = 1;
  1946.                         if (scrollbar_event == GUI_SCROLLBAR_PEN_JUMP_TO_I)
  1947.                         {
  1948.                             gui_fixed_matrix_menu_horizontal_scroll_by_pen(m, scrollbar_param._u.i, menu_event);
  1949.                         }
  1950.                     }
  1951.                     else
  1952.                     {
  1953.                         pen_state->pen_on_vertical_scrollbar = 0;
  1954.                         pen_state->pen_on_horizontal_scrollbar = 0;
  1955.                         gui_fixed_matrix_menu_handle_pen_position(m, x, y, MMI_PEN_EVENT_DOWN, menu_event);
  1956.                     }
  1957.                     pen_state->first_highlighed_item = m->highlighted_item;
  1958.                     pen_state->highlight_changed = 0;
  1959.                 }
  1960.                 else
  1961.                 {
  1962.                     ret = MMI_FALSE;
  1963.                 }
  1964.                 break;
  1965.             case MMI_PEN_EVENT_MOVE:
  1966.                 gui_fixed_matrix_menu_handle_pen_position(m, x, y, MMI_PEN_EVENT_MOVE, menu_event);
  1967.                 break;
  1968.             case MMI_PEN_EVENT_UP:
  1969.                 gui_fixed_matrix_menu_handle_pen_position(m, x, y, MMI_PEN_EVENT_UP, menu_event);
  1970.                 break;
  1971.             case MMI_PEN_EVENT_LONG_TAP:
  1972.                 /* Do nothing */
  1973.                 break;
  1974.             case MMI_PEN_EVENT_REPEAT:
  1975.                 /* Do nothing */
  1976.                 break;
  1977.             case MMI_PEN_EVENT_ABORT:
  1978.                 /* Do nothing */
  1979.                 break;
  1980.             default:
  1981.                 MMI_ASSERT(0);
  1982.         }
  1983.     }
  1984.     if (ret)
  1985.     {
  1986.         if (pen_state->first_highlighed_item != m->highlighted_item)
  1987.         {
  1988.             pen_state->highlight_changed = 1;
  1989.         }
  1990.     }
  1991.     return ret;
  1992. }
  1993. #endif /* __MMI_TOUCH_SCREEN__ */ 
  1994. /* GUI: drop down control functions */
  1995. UI_drop_down_control_theme *current_drop_down_control_theme = NULL;
  1996. /*****************************************************************************
  1997.  * FUNCTION
  1998.  *  gui_set_drop_down_control_current_theme
  1999.  * DESCRIPTION
  2000.  *  Sets the current theme of the drop down control
  2001.  * PARAMETERS
  2002.  *  o           [?]         
  2003.  *  m(?)        [IN]        Is the drop down control object
  2004.  * RETURNS
  2005.  *  void
  2006.  *****************************************************************************/
  2007. void gui_set_drop_down_control_current_theme(drop_down_control *o)
  2008. {
  2009.     /*----------------------------------------------------------------*/
  2010.     /* Local Variables                                                */
  2011.     /*----------------------------------------------------------------*/
  2012.     /*----------------------------------------------------------------*/
  2013.     /* Code Body                                                      */
  2014.     /*----------------------------------------------------------------*/
  2015.     o->normal_filler = current_drop_down_control_theme->normal_filler;
  2016.     o->disabled_filler = current_drop_down_control_theme->disabled_filler;
  2017.     o->focussed_filler = current_drop_down_control_theme->focussed_filler;
  2018.     o->clicked_filler = current_drop_down_control_theme->clicked_filler;
  2019.     o->normal_text_color = current_drop_down_control_theme->normal_text_color;
  2020.     o->disabled_text_color = current_drop_down_control_theme->disabled_text_color;
  2021.     o->focussed_text_color = current_drop_down_control_theme->focussed_text_color;
  2022.     o->clicked_text_color = current_drop_down_control_theme->clicked_text_color;
  2023.     o->text_font = current_drop_down_control_theme->text_font;
  2024.     o->flags |= current_drop_down_control_theme->flags;
  2025.     gui_set_icon_button_BG_theme(&o->down_button, current_drop_down_control_theme->down_button_theme);
  2026.     gui_icon_button_set_icon(
  2027.         &o->down_button,
  2028.         current_drop_down_control_theme->down_button_icon,
  2029.         UI_DEFAULT_TRANSPARENT_COLOR);
  2030. }
  2031. /*****************************************************************************
  2032.  * FUNCTION
  2033.  *  gui_set_drop_down_control_theme
  2034.  * DESCRIPTION
  2035.  *  Sets the given theme of the drop down control
  2036.  * PARAMETERS
  2037.  *  o           [?]         
  2038.  *  t           [IN]        Is the drop down control theme
  2039.  *  m(?)        [IN]        Is the drop down control object
  2040.  * RETURNS
  2041.  *  void
  2042.  *****************************************************************************/
  2043. void gui_set_drop_down_control_theme(drop_down_control *o, UI_drop_down_control_theme *t)
  2044. {
  2045.     /*----------------------------------------------------------------*/
  2046.     /* Local Variables                                                */
  2047.     /*----------------------------------------------------------------*/
  2048.     /*----------------------------------------------------------------*/
  2049.     /* Code Body                                                      */
  2050.     /*----------------------------------------------------------------*/
  2051.     o->normal_filler = t->normal_filler;
  2052.     o->disabled_filler = t->disabled_filler;
  2053.     o->focussed_filler = t->focussed_filler;
  2054.     o->clicked_filler = t->clicked_filler;
  2055.     o->normal_text_color = t->normal_text_color;
  2056.     o->disabled_text_color = t->disabled_text_color;
  2057.     o->focussed_text_color = t->focussed_text_color;
  2058.     o->clicked_text_color = t->clicked_text_color;
  2059.     o->text_font = t->text_font;
  2060.     o->flags |= t->flags;
  2061.     gui_set_icon_button_BG_theme(&o->down_button, t->down_button_theme);
  2062.     gui_icon_button_set_icon(&o->down_button, t->down_button_icon, UI_DEFAULT_TRANSPARENT_COLOR);
  2063. }
  2064. /*****************************************************************************
  2065.  * FUNCTION
  2066.  *  gui_create_drop_down_control
  2067.  * DESCRIPTION
  2068.  *  Creates a drop down control object
  2069.  * PARAMETERS
  2070.  *  o           [?]         
  2071.  *  x           [IN]        Are the co-ordinates
  2072.  *  y           [IN]        Are the co-ordinates
  2073.  *  width       [IN]        Are the dimensions
  2074.  *  height      [IN]        Are the dimensions
  2075.  *  m(?)        [IN]        Is the drop down control object
  2076.  * RETURNS
  2077.  *  void
  2078.  *****************************************************************************/
  2079. void gui_create_drop_down_control(drop_down_control *o, S32 x, S32 y, S32 width, S32 height)
  2080. {
  2081.     /*----------------------------------------------------------------*/
  2082.     /* Local Variables                                                */
  2083.     /*----------------------------------------------------------------*/
  2084.     /*----------------------------------------------------------------*/
  2085.     /* Code Body                                                      */
  2086.     /*----------------------------------------------------------------*/
  2087.     o->x = x;
  2088.     o->y = y;
  2089.     o->width = width;
  2090.     o->height = height;
  2091.     o->flags = 0;
  2092.     gui_create_icon_button(&o->down_button, x + width - height + 1, y + 1, height - 2, height - 2, NULL);
  2093.     gui_set_drop_down_control_current_theme(o);
  2094. }
  2095. /*****************************************************************************
  2096.  * FUNCTION
  2097.  *  gui_resize_drop_down_control
  2098.  * DESCRIPTION
  2099.  *  Resizes a drop down control object
  2100.  * PARAMETERS
  2101.  *  o           [?]         
  2102.  *  width       [IN]        Are the new dimensions
  2103.  *  height      [IN]        Are the new dimensions
  2104.  *  m(?)        [IN]        Is the drop down control object
  2105.  * RETURNS
  2106.  *  void
  2107.  *****************************************************************************/
  2108. void gui_resize_drop_down_control(drop_down_control *o, S32 width, S32 height)
  2109. {
  2110.     /*----------------------------------------------------------------*/
  2111.     /* Local Variables                                                */
  2112.     /*----------------------------------------------------------------*/
  2113.     /*----------------------------------------------------------------*/
  2114.     /* Code Body                                                      */
  2115.     /*----------------------------------------------------------------*/
  2116.     o->width = width;
  2117.     o->height = height;
  2118.     gui_resize_icon_button(&o->down_button, height - 2, height - 2);
  2119.     gui_move_icon_button(&o->down_button, o->x + width - height + 1, o->y + 1);
  2120. }
  2121. /*****************************************************************************
  2122.  * FUNCTION
  2123.  *  gui_move_drop_down_control
  2124.  * DESCRIPTION
  2125.  *  Moves a drop down control object
  2126.  * PARAMETERS
  2127.  *  o           [?]         
  2128.  *  x           [IN]        Are the new co-ordinates
  2129.  *  y           [IN]        Are the new co-ordinates
  2130.  *  m(?)        [IN]        Is the drop down control object
  2131.  * RETURNS
  2132.  *  void
  2133.  *****************************************************************************/
  2134. void gui_move_drop_down_control(drop_down_control *o, S32 x, S32 y)
  2135. {
  2136.     /*----------------------------------------------------------------*/
  2137.     /* Local Variables                                                */
  2138.     /*----------------------------------------------------------------*/
  2139.     /*----------------------------------------------------------------*/
  2140.     /* Code Body                                                      */
  2141.     /*----------------------------------------------------------------*/
  2142.     o->x = x;
  2143.     o->y = y;
  2144.     gui_move_icon_button(&o->down_button, o->x + o->width - o->height + 1, o->y + 1);
  2145. }
  2146. /*****************************************************************************
  2147.  * FUNCTION
  2148.  *  gui_show_drop_down_control
  2149.  * DESCRIPTION
  2150.  *  Displays a drop down control object
  2151.  * PARAMETERS
  2152.  *  o           [?]         
  2153.  *  m(?)        [IN]        Is the drop down control object
  2154.  * RETURNS
  2155.  *  void
  2156.  *****************************************************************************/
  2157. void gui_show_drop_down_control(drop_down_control *o)
  2158. {
  2159.     /*----------------------------------------------------------------*/
  2160.     /* Local Variables                                                */
  2161.     /*----------------------------------------------------------------*/
  2162.     S32 x1, y1, x2, y2;
  2163.     UI_filled_area *f;
  2164.     color text_color;
  2165.     S32 tx, ty, text_width, text_height;
  2166.     U32 flags = o->flags;
  2167.     U8 button_displayed = 0;
  2168.     /*----------------------------------------------------------------*/
  2169.     /* Code Body                                                      */
  2170.     /*----------------------------------------------------------------*/
  2171.     if (flags & UI_DROP_DOWN_CONTROL_DISABLE_DRAW)
  2172.     {
  2173.         return;
  2174.     }
  2175.     x1 = o->x;
  2176.     y1 = o->y;
  2177.     x2 = x1 + o->width - 1;
  2178.     y2 = y1 + o->height - 1;
  2179.     gui_push_clip();
  2180.     gui_push_text_clip();
  2181.     gui_set_clip(x1, y1, x2, y2);
  2182.     if (flags & UI_DROP_DOWN_CONTROL_STATE_FOCUSSED)
  2183.     {
  2184.         f = o->focussed_filler;
  2185.         text_color = o->focussed_text_color;
  2186.     }
  2187.     else if (flags & UI_DROP_DOWN_CONTROL_STATE_CLICKED)
  2188.     {
  2189.         f = o->clicked_filler;
  2190.         text_color = o->clicked_text_color;
  2191.     }
  2192.     else if (flags & UI_DROP_DOWN_CONTROL_STATE_DISABLED)
  2193.     {
  2194.         f = o->disabled_filler;
  2195.         text_color = o->disabled_text_color;
  2196.     }
  2197.     else
  2198.     {
  2199.         f = o->normal_filler;
  2200.         text_color = o->normal_text_color;
  2201.     }
  2202.     if (!(flags & UI_DROP_DOWN_CONTROL_DISABLE_BACKGROUND))
  2203.     {
  2204.         gui_draw_filled_area(x1, y1, x2, y2, f);
  2205.     }
  2206.     if (flags & UI_DROP_DOWN_CONTROL_SHOW_BUTTON_ON_FOCUS)
  2207.     {
  2208.         if ((flags & UI_DROP_DOWN_CONTROL_STATE_FOCUSSED) || (flags & UI_DROP_DOWN_CONTROL_STATE_CLICKED))
  2209.         {
  2210.             gui_show_icon_button(&o->down_button);
  2211.             button_displayed = 1;
  2212.         }
  2213.     }
  2214.     else
  2215.     {
  2216.         gui_show_icon_button(&o->down_button);
  2217.         button_displayed = 1;
  2218.     }
  2219.     if (o->text != NULL)
  2220.     {
  2221.         gui_set_font(o->text_font);
  2222.         gui_measure_string(o->text, &text_width, &text_height);
  2223.         ty = y1 + (o->height >> 1) - (text_height >> 1);
  2224.         if (flags & UI_DROP_DOWN_CONTROL_TEXT_RIGHT_JUSTIFY)
  2225.         {
  2226.             if (button_displayed)
  2227.             {
  2228.                 tx = x2 - 4 - text_width - o->down_button.width;
  2229.             }
  2230.             else
  2231.             {
  2232.                 tx = x2 - 4 - text_width;
  2233.             }
  2234.         }
  2235.         else if (flags & UI_DROP_DOWN_CONTROL_TEXT_CENTER_JUSTIFY)
  2236.         {
  2237.             if (button_displayed)
  2238.             {
  2239.                 tx = x1 + ((o->width - o->down_button.width) >> 1) - (text_width >> 1);
  2240.             }
  2241.             else
  2242.             {
  2243.                 tx = x1 + (o->width >> 1) - (text_width >> 1);
  2244.             }
  2245.         }
  2246.         else
  2247.         {
  2248.             tx = x1 + 5;
  2249.         }
  2250.         if (r2lMMIFlag)
  2251.         {
  2252.             gui_move_text_cursor(tx + text_width, ty);
  2253.         }
  2254.         else
  2255.         {
  2256.             gui_move_text_cursor(tx, ty);
  2257.         }
  2258.         gui_set_text_color(text_color);
  2259.         gui_set_line_height(text_height);
  2260.         gui_print_text(o->text);
  2261.     }
  2262.     gui_pop_text_clip();
  2263.     gui_pop_clip();
  2264. }
  2265. /* GUI: horizontal select menu functions              */
  2266. UI_horizontal_select_theme *current_horizontal_select_theme = NULL;
  2267. /*****************************************************************************
  2268.  * FUNCTION
  2269.  *  gui_set_horizontal_select_current_theme
  2270.  * DESCRIPTION
  2271.  *  Applies the current theme to a horizontal select menu
  2272.  * PARAMETERS
  2273.  *  m       [IN]        Is the horizontal select menu object
  2274.  * RETURNS
  2275.  *  void
  2276.  *****************************************************************************/
  2277. void gui_set_horizontal_select_current_theme(horizontal_select *m)
  2278. {
  2279.     /*----------------------------------------------------------------*/
  2280.     /* Local Variables                                                */
  2281.     /*----------------------------------------------------------------*/
  2282.     /*----------------------------------------------------------------*/
  2283.     /* Code Body                                                      */
  2284.     /*----------------------------------------------------------------*/
  2285.     m->flags |= current_horizontal_select_theme->flags;
  2286.     m->background_filler = current_horizontal_select_theme->background_filler;
  2287. }
  2288. /*****************************************************************************
  2289.  * FUNCTION
  2290.  *  gui_set_horizontal_select_theme
  2291.  * DESCRIPTION
  2292.  *  Applies the given theme to a horizontal select menu
  2293.  * PARAMETERS
  2294.  *  m       [IN]        Is the horizontal select menu object
  2295.  *  t       [IN]        Is the theme
  2296.  * RETURNS
  2297.  *  void
  2298.  *****************************************************************************/
  2299. void gui_set_horizontal_select_theme(horizontal_select *m, UI_horizontal_select_theme *t)
  2300. {
  2301.     /*----------------------------------------------------------------*/
  2302.     /* Local Variables                                                */
  2303.     /*----------------------------------------------------------------*/
  2304.     /*----------------------------------------------------------------*/
  2305.     /* Code Body                                                      */
  2306.     /*----------------------------------------------------------------*/
  2307.     m->flags |= t->flags;
  2308.     m->background_filler = t->background_filler;
  2309. }
  2310. /*****************************************************************************
  2311.  * FUNCTION
  2312.  *  gui_create_horizontal_select
  2313.  * DESCRIPTION
  2314.  *  Creates a horizontal select menu object
  2315.  * PARAMETERS
  2316.  *  m           [IN]        Is the horizontal select menu object   (pre-allocated)
  2317.  *  x           [IN]        Is the left-top corner position
  2318.  *  y           [IN]        Is the left-top corner position
  2319.  *  width       [IN]        Are the dimensions
  2320.  *  height      [IN]        Are the dimensions
  2321.  * RETURNS
  2322.  *  void
  2323.  *****************************************************************************/
  2324. void gui_create_horizontal_select(horizontal_select *m, S32 x, S32 y, S32 width, S32 height)
  2325. {
  2326.     /*----------------------------------------------------------------*/
  2327.     /* Local Variables                                                */
  2328.     /*----------------------------------------------------------------*/
  2329.     /*----------------------------------------------------------------*/
  2330.     /* Code Body                                                      */
  2331.     /*----------------------------------------------------------------*/
  2332.     m->x = x;
  2333.     m->y = y;
  2334.     m->width = width;
  2335.     m->height = height;
  2336.     m->n_items = 0;
  2337.     m->highlighted_item = 0;
  2338.     gui_set_horizontal_select_current_theme(m);
  2339.     m->clear_background_callback = NULL;
  2340.     m->item_highlighted = UI_dummy_function_s32;
  2341.     m->item_unhighlighted = UI_dummy_function_s32;
  2342.     m->item_display_function = UI_fixed_menuitem_dummy_display_function;
  2343.     m->item_hide_function = UI_fixed_menuitem_dummy_display_function;
  2344.     m->item_measure_function = UI_fixed_menuitem_dummy_measure_function;
  2345.     m->item_highlight_function = UI_fixed_menuitem_dummy_highlight_function;
  2346.     m->item_remove_highlight_function = UI_fixed_menuitem_dummy_remove_highlight_function;
  2347.     m->items = NULL;
  2348.     m->common_item_data = NULL;
  2349.     m->left_arrow_pressed = 0;
  2350.     m->right_arrow_pressed = 0;
  2351.     m->left_arrow_image = NULL;
  2352.     m->right_arrow_image = NULL;
  2353.     m->lx = 0;
  2354.     m->ly = 0;
  2355.     m->rx = 0;
  2356.     m->ry = 0;
  2357.     m->ix1 = 0;
  2358.     m->iy1 = 0;
  2359.     m->ix2 = m->width - 1;
  2360.     m->iy2 = m->height - 1;
  2361.     m->flags = UI_HORIZONTAL_SELECT_NO_ITEM_HIGHLIGHTED;
  2362.     m->item_displayed_callback = UI_dummy_menuitem_displayed_function;
  2363. #ifdef __MMI_TOUCH_SCREEN__
  2364.     memset(&m->pen_state, 0, sizeof(gui_horizontal_select_pen_state_struct));
  2365. #endif 
  2366. }
  2367. /*****************************************************************************
  2368.  * FUNCTION
  2369.  *  gui_resize_horizontal_select
  2370.  * DESCRIPTION
  2371.  *  Changes the size of a horizontal select menu
  2372.  * PARAMETERS
  2373.  *  m           [IN]        Is the horizontal select menu object
  2374.  *  width       [IN]        Is the new width
  2375.  *  height      [IN]        Is the new height
  2376.  * RETURNS
  2377.  *  void
  2378.  *****************************************************************************/
  2379. void gui_resize_horizontal_select(horizontal_select *m, S32 width, S32 height)
  2380. {
  2381.     /*----------------------------------------------------------------*/
  2382.     /* Local Variables                                                */
  2383.     /*----------------------------------------------------------------*/
  2384.     S32 iwidth, iheight;
  2385.     /*----------------------------------------------------------------*/
  2386.     /* Code Body                                                      */
  2387.     /*----------------------------------------------------------------*/
  2388.     m->width = width;
  2389.     m->height = height;
  2390.     m->lx = 0;
  2391.     m->ly = 0;
  2392.     m->rx = 0;
  2393.     m->ry = 0;
  2394.     m->ix1 = 0;
  2395.     m->iy1 = 0;
  2396.     m->ix2 = m->width - 1;
  2397.     m->iy2 = m->height - 1;
  2398.     if (m->left_arrow_image != NULL)
  2399.     {
  2400.         gui_measure_image(m->left_arrow_image, &iwidth, &iheight);
  2401.         m->lx = 2;
  2402.         m->ly = (m->height >> 1) - (iheight >> 1);
  2403.         m->ix1 = iwidth + 4;
  2404.     }
  2405.     if (m->right_arrow_image != NULL)
  2406.     {
  2407.         gui_measure_image(m->right_arrow_image, &iwidth, &iheight);
  2408.         m->rx = m->width - iwidth - 2;
  2409.         m->ry = (m->height >> 1) - (iheight >> 1);
  2410.         m->ix2 = m->width - iwidth - 4;
  2411.     }
  2412. }
  2413. /*****************************************************************************
  2414.  * FUNCTION
  2415.  *  gui_move_horizontal_select
  2416.  * DESCRIPTION
  2417.  *  Moves the horizontal select menu to a different co-ordinate
  2418.  * PARAMETERS
  2419.  *  m       [IN]        Is the horizontal select menu object
  2420.  *  x       [IN]        Is the new left-top corner position
  2421.  *  y       [IN]        Is the new left-top corner position
  2422.  * RETURNS
  2423.  *  void
  2424.  *****************************************************************************/
  2425. void gui_move_horizontal_select(horizontal_select *m, S32 x, S32 y)
  2426. {
  2427.     /*----------------------------------------------------------------*/
  2428.     /* Local Variables                                                */
  2429.     /*----------------------------------------------------------------*/
  2430.     /*----------------------------------------------------------------*/
  2431.     /* Code Body                                                      */
  2432.     /*----------------------------------------------------------------*/
  2433.     m->x = x;
  2434.     m->y = y;
  2435. }
  2436. /*****************************************************************************
  2437.  * FUNCTION
  2438.  *  gui_horizontal_select_goto_item
  2439.  * DESCRIPTION
  2440.  *  Highlights a particular item
  2441.  *  
  2442.  *  The fixed list is not redrawn
  2443.  * PARAMETERS
  2444.  *  m       [IN]        Is the horizontal select menu object
  2445.  *  i       [IN]        Is the index of the item to be highlighted (zero based)
  2446.  * RETURNS
  2447.  *  void
  2448.  *****************************************************************************/
  2449. void gui_horizontal_select_goto_item(horizontal_select *m, S32 i)
  2450. {
  2451.     /*----------------------------------------------------------------*/
  2452.     /* Local Variables                                                */
  2453.     /*----------------------------------------------------------------*/
  2454.     S32 last_highlighted_item;
  2455.     /*----------------------------------------------------------------*/
  2456.     /* Code Body                                                      */
  2457.     /*----------------------------------------------------------------*/
  2458.     if ((i < 0) || (i > m->n_items - 1))
  2459.     {
  2460.         return;
  2461.     }
  2462.     if (i == m->highlighted_item)
  2463.     {
  2464.         return;
  2465.     }
  2466.     last_highlighted_item = m->highlighted_item;
  2467.     m->highlighted_item = i;
  2468.     if (last_highlighted_item != m->highlighted_item)
  2469.     {
  2470.         if ((last_highlighted_item >= 0) && (last_highlighted_item < m->n_items))
  2471.         {
  2472.             m->item_remove_highlight_function(m->items[last_highlighted_item], m->common_item_data);
  2473.         }
  2474.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  2475.         {
  2476.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  2477.         }
  2478.         m->item_unhighlighted(last_highlighted_item);
  2479.         m->item_highlighted(m->highlighted_item);
  2480.     }
  2481. }
  2482. /*****************************************************************************
  2483.  * FUNCTION
  2484.  *  gui_horizontal_select_goto_next_item
  2485.  * DESCRIPTION
  2486.  *  Higlights the next item
  2487.  *  
  2488.  *  The fixed list is not redrawn
  2489.  * PARAMETERS
  2490.  *  m       [IN]        Is the horizontal select menu object
  2491.  * RETURNS
  2492.  *  void
  2493.  *****************************************************************************/
  2494. void gui_horizontal_select_goto_next_item(horizontal_select *m)
  2495. {
  2496.     /*----------------------------------------------------------------*/
  2497.     /* Local Variables                                                */
  2498.     /*----------------------------------------------------------------*/
  2499.     S32 last_highlighted_item;
  2500.     U8 loop_flag = 0;
  2501.     /*----------------------------------------------------------------*/
  2502.     /* Code Body                                                      */
  2503.     /*----------------------------------------------------------------*/
  2504.     if (m->highlighted_item >= (m->n_items - 1))
  2505.     {
  2506.         if (m->flags & UI_LIST_MENU_LOOP)
  2507.         {
  2508.             loop_flag = 1;
  2509.         }
  2510.         else
  2511.         {
  2512.             return;
  2513.         }
  2514.     }
  2515.     last_highlighted_item = m->highlighted_item;
  2516.     if (loop_flag)
  2517.     {
  2518.         m->highlighted_item = 0;
  2519.     }
  2520.     else
  2521.     {
  2522.         m->highlighted_item++;
  2523.     }
  2524.     if (last_highlighted_item != m->highlighted_item)
  2525.     {
  2526.         if ((last_highlighted_item >= 0) && (last_highlighted_item < m->n_items))
  2527.         {
  2528.             m->item_remove_highlight_function(m->items[last_highlighted_item], m->common_item_data);
  2529.         }
  2530.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  2531.         {
  2532.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  2533.         }
  2534.         m->item_unhighlighted(last_highlighted_item);
  2535.         m->item_highlighted(m->highlighted_item);
  2536.     }
  2537. }
  2538. /*****************************************************************************
  2539.  * FUNCTION
  2540.  *  gui_horizontal_select_goto_previous_item
  2541.  * DESCRIPTION
  2542.  *  Higlights the previous item
  2543.  *  
  2544.  *  The fixed list is not redrawn
  2545.  * PARAMETERS
  2546.  *  m       [IN]        Is the horizontal select menu object
  2547.  * RETURNS
  2548.  *  void
  2549.  *****************************************************************************/
  2550. void gui_horizontal_select_goto_previous_item(horizontal_select *m)
  2551. {
  2552.     /*----------------------------------------------------------------*/
  2553.     /* Local Variables                                                */
  2554.     /*----------------------------------------------------------------*/
  2555.     S32 last_highlighted_item;
  2556.     U8 loop_flag = 0;
  2557.     /*----------------------------------------------------------------*/
  2558.     /* Code Body                                                      */
  2559.     /*----------------------------------------------------------------*/
  2560.     if (m->highlighted_item <= 0)
  2561.     {
  2562.         if (m->flags & UI_LIST_MENU_LOOP)
  2563.         {
  2564.             loop_flag = 1;
  2565.         }
  2566.         else
  2567.         {
  2568.             return;
  2569.         }
  2570.     }
  2571.     last_highlighted_item = m->highlighted_item;
  2572.     if (loop_flag)
  2573.     {
  2574.         m->highlighted_item = m->n_items - 1;
  2575.     }
  2576.     else
  2577.     {
  2578.         m->highlighted_item--;
  2579.     }
  2580.     if (last_highlighted_item != m->highlighted_item)
  2581.     {
  2582.         if ((last_highlighted_item >= 0) && (last_highlighted_item < m->n_items))
  2583.         {
  2584.             m->item_remove_highlight_function(m->items[last_highlighted_item], m->common_item_data);
  2585.         }
  2586.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  2587.         {
  2588.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  2589.         }
  2590.         m->item_unhighlighted(last_highlighted_item);
  2591.         m->item_highlighted(m->highlighted_item);
  2592.     }
  2593. }
  2594. /*****************************************************************************
  2595.  * FUNCTION
  2596.  *  gui_horizontal_select_goto_first_item
  2597.  * DESCRIPTION
  2598.  *  Higlights the first item
  2599.  *  
  2600.  *  The fixed list is not redrawn
  2601.  * PARAMETERS
  2602.  *  m       [IN]        Is the horizontal select menu object
  2603.  * RETURNS
  2604.  *  void
  2605.  *****************************************************************************/
  2606. void gui_horizontal_select_goto_first_item(horizontal_select *m)
  2607. {
  2608.     /*----------------------------------------------------------------*/
  2609.     /* Local Variables                                                */
  2610.     /*----------------------------------------------------------------*/
  2611.     S32 last_highlighted_item;
  2612.     /*----------------------------------------------------------------*/
  2613.     /* Code Body                                                      */
  2614.     /*----------------------------------------------------------------*/
  2615.     if (m->highlighted_item == 0)
  2616.     {
  2617.         return;
  2618.     }
  2619.     last_highlighted_item = m->highlighted_item;
  2620.     m->highlighted_item = 0;
  2621.     if (last_highlighted_item != m->highlighted_item)
  2622.     {
  2623.         if ((last_highlighted_item >= 0) && (last_highlighted_item < m->n_items))
  2624.         {
  2625.             m->item_remove_highlight_function(m->items[last_highlighted_item], m->common_item_data);
  2626.         }
  2627.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  2628.         {
  2629.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  2630.         }
  2631.         m->item_unhighlighted(last_highlighted_item);
  2632.         m->item_highlighted(m->highlighted_item);
  2633.     }
  2634. }
  2635. /*****************************************************************************
  2636.  * FUNCTION
  2637.  *  gui_horizontal_select_goto_last_item
  2638.  * DESCRIPTION
  2639.  *  Higlights the last item
  2640.  *  
  2641.  *  The fixed list is not redrawn
  2642.  * PARAMETERS
  2643.  *  m       [IN]        Is the horizontal select menu object
  2644.  * RETURNS
  2645.  *  void
  2646.  *****************************************************************************/
  2647. void gui_horizontal_select_goto_last_item(horizontal_select *m)
  2648. {
  2649.     /*----------------------------------------------------------------*/
  2650.     /* Local Variables                                                */
  2651.     /*----------------------------------------------------------------*/
  2652.     S32 last_highlighted_item;
  2653.     /*----------------------------------------------------------------*/
  2654.     /* Code Body                                                      */
  2655.     /*----------------------------------------------------------------*/
  2656.     if (m->highlighted_item == (m->n_items - 1))
  2657.     {
  2658.         return;
  2659.     }
  2660.     last_highlighted_item = m->highlighted_item;
  2661.     m->highlighted_item = (m->n_items - 1);
  2662.     if (last_highlighted_item != m->highlighted_item)
  2663.     {
  2664.         if ((last_highlighted_item >= 0) && (last_highlighted_item < m->n_items))
  2665.         {
  2666.             m->item_remove_highlight_function(m->items[last_highlighted_item], m->common_item_data);
  2667.         }
  2668.         if ((m->highlighted_item >= 0) && (m->highlighted_item < m->n_items))
  2669.         {
  2670.             m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  2671.         }
  2672.         m->item_unhighlighted(last_highlighted_item);
  2673.         m->item_highlighted(m->highlighted_item);
  2674.     }
  2675. }
  2676. /*****************************************************************************
  2677.  * FUNCTION
  2678.  *  gui_show_horizontal_select
  2679.  * DESCRIPTION
  2680.  *  Displays the horizontal select menu
  2681.  * PARAMETERS
  2682.  *  m       [IN]        Is the horizontal select menu object
  2683.  * RETURNS
  2684.  *  void
  2685.  *****************************************************************************/
  2686. void gui_show_horizontal_select(horizontal_select *m)
  2687. {
  2688.     /*----------------------------------------------------------------*/
  2689.     /* Local Variables                                                */
  2690.     /*----------------------------------------------------------------*/
  2691.     S32 x1, y1, x2, y2;
  2692.     UI_filled_area *f = m->background_filler;
  2693.     S32 i;
  2694.     S32 cx1, cy1, cx2, cy2;
  2695.     S32 tx1, ty1, tx2, ty2;
  2696.     S32 iwidth, iheight;
  2697.     /*----------------------------------------------------------------*/
  2698.     /* Code Body                                                      */
  2699.     /*----------------------------------------------------------------*/
  2700. #ifdef __MMI_SUPPORT_DUMP_SCREEN_STRING__
  2701.     g_mmi_frm_cntx.dump_screen_info.hightlight_type = MMI_SCREEN_HIGHLIGHT_FOR_HOR_SELECT;
  2702. #endif
  2703.     gui_get_clip(&cx1, &cy1, &cx2, &cy2);
  2704.     gui_get_text_clip(&tx1, &ty1, &tx2, &ty2);
  2705.     x1 = m->x;
  2706.     y1 = m->y;
  2707.     x2 = x1 + m->width - 1;
  2708.     y2 = y1 + m->height - 1;
  2709.     gui_set_clip(x1, y1, x2 + 2, y2 + 2);
  2710.     if (!(m->flags & UI_LIST_MENU_DISABLE_BACKGROUND))
  2711.     {
  2712.         /* 20051012 HIMANSHU START INLINE SELECT */
  2713.         /* Now the inline item select will be shown with the reduced size of
  2714.            highlighted filler, so that only the text is shown as highlighted.
  2715.            Hence removing the check, for enabling it for all projects. */
  2716.         /* PMT  MANISH  START  20050722 */
  2717.         // #ifdef __MMI_UI_INLINE_EDIT_DEFAULT_TEXT_EFFECT__
  2718.         /* pass the modified parameters in case when the Defualt Text Effect is enabled
  2719.            so that there will be proper gap between the menu items. */
  2720.         /* if(IsInlineItemDefaultTextEnable()) */
  2721.         gui_draw_filled_area(x1 + m->ix1, y1, x1 + m->ix2 - 1, y2, f);
  2722.         //      else
  2723.         //      #endif  /* __MMI_UI_INLINE_EDIT_DEFAULT_TEXT_EFFECT__ */
  2724.         //              gui_draw_filled_area(x1,y1,x2,y2,f);
  2725.         //20051012 HIMANSHU END INLINE SELECT
  2726.     #ifdef __MMI_UI_DALMATIAN_FIXEDLIST__
  2727.         if (line_draw)
  2728.         {
  2729.             /* To draw the grid overlapped by the heilighter (filler) */
  2730.             if (y1 == MMI_fixed_list_menu.y + 1)    /* to draw line only for starting position */
  2731.             {
  2732.                 gui_draw_horizontal_line(x1, x2, y1, current_MMI_theme->list_background_filler->border_color);
  2733.             }
  2734.             gui_draw_horizontal_line(x1, x2, y2, current_MMI_theme->list_background_filler->border_color);
  2735.             gui_draw_vertical_line(y1, y2, x2, current_MMI_theme->list_background_filler->border_color);
  2736.         }
  2737.     #endif /* __MMI_UI_DALMATIAN_FIXEDLIST__ */ 
  2738.     }
  2739.     if (m->clear_background_callback)
  2740.     {
  2741.         m->clear_background_callback(x1, y1, x2, y2);
  2742.     }
  2743.     
  2744.     if ((m->n_items == 0) || (m->highlighted_item < 0) || (m->highlighted_item > (m->n_items - 1)))
  2745.     {
  2746.         gui_set_clip(cx1, cy1, cx2, cy2);
  2747.         gui_set_text_clip(tx1, ty1, tx2, ty2);
  2748.         return;
  2749.     }
  2750.     if (m->flags & UI_HORIZONTAL_SELECT_NO_ITEM_HIGHLIGHTED)
  2751.     {
  2752.         m->flags &= ~UI_HORIZONTAL_SELECT_NO_ITEM_HIGHLIGHTED;
  2753.         m->item_highlight_function(m->items[m->highlighted_item], m->common_item_data);
  2754.     }
  2755.     if (m->left_arrow_image != NULL)
  2756.     {
  2757.         gui_show_transparent_image(x1 + m->lx, y1 + m->ly + m->left_arrow_pressed, m->left_arrow_image, 0);
  2758.     }
  2759.     if (m->right_arrow_image != NULL)
  2760.     {
  2761.         gui_show_transparent_image(x1 + m->rx, y1 + m->ry + m->right_arrow_pressed, m->right_arrow_image, 0);
  2762.     }
  2763.     x1 = m->x + m->ix1;
  2764.     x2 = m->x + m->ix2;
  2765.     y1 = m->y + m->iy1;
  2766.     y2 = m->y + m->iy2;
  2767.     gui_set_text_clip(x1, y1, x2, y2);
  2768.     gui_set_clip(x1, y1, x2, y2);
  2769.     i = m->highlighted_item;
  2770.     {
  2771.         m->item_measure_function(m->items[i], m->common_item_data, &iwidth, &iheight);
  2772.         m->item_display_function(m->items[i], m->common_item_data, x1, y1);
  2773.         m->item_displayed_callback(i, x1, y1, x1 + iwidth - 1, y1 + iheight - 1);
  2774.     }
  2775. #ifdef __MMI_UI_DALMATIAN_FIXEDLIST__
  2776.     if (line_draw)
  2777.     {
  2778.         gui_push_clip();
  2779.         gui_set_clip(x1, y1, x2, y2);
  2780.         if (y1 == MMI_fixed_list_menu.y + 1)    /* To draw after the Text change. As text background again cross the line */
  2781.         {
  2782.             gui_draw_horizontal_line(x1, x2, y1, current_MMI_theme->list_background_filler->border_color);
  2783.         }
  2784.         gui_pop_clip();
  2785.     }
  2786. #endif /* __MMI_UI_DALMATIAN_FIXEDLIST__ */ 
  2787.     gui_set_clip(cx1, cy1, cx2, cy2);
  2788.     gui_set_text_clip(tx1, ty1, tx2, ty2);
  2789. }
  2790. #ifdef __MMI_TOUCH_SCREEN__
  2791. /*****************************************************************************
  2792.  * FUNCTION
  2793.  *  gui_redraw_horizontal_select
  2794.  * DESCRIPTION
  2795.  *  
  2796.  * PARAMETERS
  2797.  *  m       [?]     
  2798.  * RETURNS
  2799.  *  void
  2800.  *****************************************************************************/
  2801. static void gui_redraw_horizontal_select(horizontal_select *m)
  2802. {
  2803.     /*----------------------------------------------------------------*/
  2804.     /* Local Variables                                                */
  2805.     /*----------------------------------------------------------------*/
  2806.     /*----------------------------------------------------------------*/
  2807.     /* Code Body                                                      */
  2808.     /*----------------------------------------------------------------*/
  2809.     gui_lock_double_buffer();
  2810.     gui_show_horizontal_select(m);
  2811.     gui_unlock_double_buffer();
  2812.     gui_BLT_double_buffer(m->x, m->y, m->x + m->width - 1, m->y + m->height - 1);
  2813. }
  2814. /*****************************************************************************
  2815.  * FUNCTION
  2816.  *  gui_horizontal_select_translate_pen_event
  2817.  * DESCRIPTION
  2818.  *  
  2819.  * PARAMETERS
  2820.  *  m                   [?]         
  2821.  *  pen_event           [IN]        
  2822.  *  x                   [IN]        
  2823.  *  y                   [IN]        
  2824.  *  select_event        [?]         
  2825.  * RETURNS
  2826.  *  
  2827.  *****************************************************************************/
  2828. BOOL gui_horizontal_select_translate_pen_event(
  2829.         horizontal_select *m,
  2830.         mmi_pen_event_type_enum pen_event,
  2831.         S16 x,
  2832.         S16 y,
  2833.         gui_horizontal_select_pen_enum *select_event)
  2834. {
  2835.     /*----------------------------------------------------------------*/
  2836.     /* Local Variables                                                */
  2837.     /*----------------------------------------------------------------*/
  2838.     BOOL ret;
  2839.     S32 in_left_region = 0, in_right_region = 0;
  2840.     gui_horizontal_select_pen_state_struct *pen_state;
  2841.     /*----------------------------------------------------------------*/
  2842.     /* Code Body                                                      */
  2843.     /*----------------------------------------------------------------*/
  2844.     pen_state = &m->pen_state;
  2845.     ret = MMI_TRUE;
  2846.     *select_event = GUI_HORIZONTAL_SELECT_PEN_NONE;
  2847.     if (PEN_CHECK_BOUND(
  2848.             x,
  2849.             y,
  2850.             m->x + pen_state->left_region_x,
  2851.             m->y + pen_state->left_region_y,
  2852.             pen_state->left_region_width,
  2853.             pen_state->left_region_height))
  2854.     {
  2855.         in_left_region = 1;
  2856.     }
  2857.     else if (PEN_CHECK_BOUND(
  2858.                 x,
  2859.                 y,
  2860.                 m->x + pen_state->right_region_x,
  2861.                 m->y + pen_state->right_region_y,
  2862.                 pen_state->right_region_width,
  2863.                 pen_state->right_region_height))
  2864.     {
  2865.         in_right_region = 1;
  2866.     }
  2867.     switch (pen_event)
  2868.     {
  2869.         case MMI_PEN_EVENT_DOWN:
  2870.             MMI_DBG_ASSERT(!m->left_arrow_pressed && !m->right_arrow_pressed);
  2871.             pen_state->pen_down_left_arrow = 0;
  2872.             pen_state->pen_down_right_arrow = 0;
  2873.             if (in_left_region)
  2874.             {
  2875.                 pen_state->pen_down_left_arrow = 1;
  2876.                 m->left_arrow_pressed = 1;
  2877.                 gui_redraw_horizontal_select(m);
  2878.             }
  2879.             else if (in_right_region)
  2880.             {
  2881.                 pen_state->pen_down_right_arrow = 1;
  2882.                 m->right_arrow_pressed = 1;
  2883.                 gui_redraw_horizontal_select(m);
  2884.             }
  2885.             else if (!PEN_CHECK_BOUND(x, y, m->x, m->y, m->width, m->height))
  2886.             {
  2887.                 ret = MMI_FALSE;
  2888.             }
  2889.             break;
  2890.         case MMI_PEN_EVENT_UP:
  2891.             if (pen_state->pen_down_left_arrow)
  2892.             {
  2893.                 if (in_left_region)
  2894.                 {
  2895.                     *select_event = GUI_HORIZONTAL_SELECT_PEN_PREV;
  2896.                 }
  2897.             }
  2898.             else if (pen_state->pen_down_right_arrow)
  2899.             {
  2900.                 if (in_right_region)
  2901.                 {
  2902.                     *select_event = GUI_HORIZONTAL_SELECT_PEN_NEXT;
  2903.                 }
  2904.             }
  2905.             if (m->left_arrow_pressed)
  2906.             {
  2907.                 m->left_arrow_pressed = 0;
  2908.                 gui_redraw_horizontal_select(m);
  2909.             }
  2910.             else if (m->right_arrow_pressed)
  2911.             {
  2912.                 m->right_arrow_pressed = 0;
  2913.                 gui_redraw_horizontal_select(m);
  2914.             }
  2915.             break;
  2916.         case MMI_PEN_EVENT_MOVE:
  2917.             if (pen_state->pen_down_left_arrow)
  2918.             {
  2919.                 if (in_left_region)
  2920.                 {
  2921.                     if (!m->left_arrow_pressed)
  2922.                     {
  2923.                         m->left_arrow_pressed = 1;
  2924.                         gui_redraw_horizontal_select(m);
  2925.                     }
  2926.                 }
  2927.                 else
  2928.                 {
  2929.                     if (m->left_arrow_pressed)
  2930.                     {
  2931.                         m->left_arrow_pressed = 0;
  2932.                         gui_redraw_horizontal_select(m);
  2933.                     }
  2934.                 }
  2935.             }
  2936.             else if (pen_state->pen_down_right_arrow)
  2937.             {
  2938.                 if (in_right_region)
  2939.                 {
  2940.                     if (!m->right_arrow_pressed)
  2941.                     {
  2942.                         m->right_arrow_pressed = 1;
  2943.                         gui_redraw_horizontal_select(m);
  2944.                     }
  2945.                 }
  2946.                 else
  2947.                 {
  2948.                     if (m->right_arrow_pressed)
  2949.                     {
  2950.                         m->right_arrow_pressed = 0;
  2951.                         gui_redraw_horizontal_select(m);
  2952.                     }
  2953.                 }
  2954.             }
  2955.             break;
  2956.         case MMI_PEN_EVENT_LONG_TAP:
  2957.             /* FALLTHROUGH no break */
  2958.         case MMI_PEN_EVENT_REPEAT:
  2959.             break;
  2960.         case MMI_PEN_EVENT_ABORT:
  2961.             if (m->left_arrow_pressed)
  2962.             {
  2963.                 m->left_arrow_pressed = 0;
  2964.                 gui_redraw_horizontal_select(m);
  2965.             }
  2966.             else if (m->right_arrow_pressed)
  2967.             {
  2968.                 m->right_arrow_pressed = 0;
  2969.                 gui_redraw_horizontal_select(m);
  2970.             }
  2971.             break;
  2972.         default:
  2973.             MMI_ASSERT(0);
  2974.     }
  2975.     return ret;
  2976. }
  2977. #endif /* __MMI_TOUCH_SCREEN__ */ 
  2978. /*****************************************************************************
  2979.  * FUNCTION
  2980.  *  gui_hide_horizontal_select_highlighted_item
  2981.  * DESCRIPTION
  2982.  *  Hides the highlighted item in a horizontal select menu
  2983.  * PARAMETERS
  2984.  *  m       [IN]        Is the horizontal select menu object
  2985.  * RETURNS
  2986.  *  void
  2987.  *****************************************************************************/
  2988. void gui_hide_horizontal_select_highlighted_item(horizontal_select *m)
  2989. {
  2990.     /*----------------------------------------------------------------*/
  2991.     /* Local Variables                                                */
  2992.     /*----------------------------------------------------------------*/
  2993.     S32 x1, y1, x2, y2;
  2994.     S32 i;
  2995.     S32 cx1, cy1, cx2, cy2;
  2996.     S32 tx1, ty1, tx2, ty2;
  2997.     S32 iwidth, iheight;
  2998.     /*----------------------------------------------------------------*/
  2999.     /* Code Body                                                      */
  3000.     /*----------------------------------------------------------------*/
  3001.     if (m->n_items == 0)
  3002.     {
  3003.         return;
  3004.     }
  3005.     if ((m->highlighted_item < 0) || (m->highlighted_item > (m->n_items - 1)))
  3006.     {
  3007.         return;
  3008.     }
  3009.     gui_get_clip(&cx1, &cy1, &cx2, &cy2);
  3010.     gui_get_text_clip(&tx1, &ty1, &tx2, &ty2);
  3011.     x1 = m->x;
  3012.     y1 = m->y;
  3013.     x2 = x1 + m->width - 1;
  3014.     y2 = y1 + m->height - 1;
  3015.     gui_set_text_clip(x1, y1, x2, y2);
  3016.     gui_set_clip(x1, y1, x2, y2);
  3017.     i = m->highlighted_item;
  3018.     {
  3019.         m->item_measure_function(m->items[i], m->common_item_data, &iwidth, &iheight);
  3020.         m->item_hide_function(m->items[i], m->common_item_data, x1, y1);
  3021.     }
  3022.     gui_set_clip(cx1, cy1, cx2, cy2);
  3023.     gui_set_text_clip(tx1, ty1, tx2, ty2);
  3024. }
  3025. /*****************************************************************************
  3026.  * FUNCTION
  3027.  *  gui_set_horizontal_select_clear_background_function
  3028.  * DESCRIPTION
  3029.  *  Sets the function used to clear background, 
  3030.  *  The function is typically used when UI_LIST_MENU_DISABLE_BACKGROUND is set.
  3031.  * 
  3032.  *  (Set 'clear_bg_function' to NULL to disable the callback)
  3033.  * PARAMETERS
  3034.  *  m                                   [IN]        Is the horizontal select menu object
  3035.  *  clear_bg_function                   [IN]        Callback to clear background
  3036.  * RETURNS
  3037.  *  void
  3038.  *****************************************************************************/
  3039. void gui_set_horizontal_select_clear_background_function(
  3040.         horizontal_select *m,
  3041.         void (*clear_bg_function)(S32 x1, S32 y1, S32 x2, S32 y2))
  3042. {
  3043.     /*----------------------------------------------------------------*/
  3044.     /* Local Variables                                                */
  3045.     /*----------------------------------------------------------------*/
  3046.     /*----------------------------------------------------------------*/
  3047.     /* Code Body                                                      */
  3048.     /*----------------------------------------------------------------*/
  3049.     m->clear_background_callback = clear_bg_function;
  3050. }
  3051. /*****************************************************************************
  3052.  * FUNCTION
  3053.  *  gui_set_horizontal_select_item_functions
  3054.  * DESCRIPTION
  3055.  *  Sets the functions used to display generic menuitems
  3056.  * PARAMETERS
  3057.  *  m                                   [IN]        Is the horizontal select menu object
  3058.  *  item_display_function               [IN]        Is the function used to display an item
  3059.  *  item_measure_function               [IN]        Is the function used to measure an item
  3060.  *  item_highlight_function             [OUT]       Is the function used to highlight an item
  3061.  *  item_remove_highlight_function      [IN]        Is the function used to remove highlight of an item
  3062.  *  item_hide_function                  [IN]        Is the function used to hide the menuitem
  3063.  *  width(?)                            [OUT]       Height      are the dimensions of the menuitem
  3064.  *  item(?)                             [IN]        Is the specific fixed menuitem
  3065.  *  x(?)                                [IN]        Position at which the menuitem was displayed
  3066.  *  y(?)                                [IN]        Position at which the menuitem was displayed
  3067.  *  common_item_data(?)                 [IN]        Common fixed menuitem
  3068.  * RETURNS
  3069.  *  void
  3070.  *****************************************************************************/
  3071. void gui_set_horizontal_select_item_functions(
  3072.         horizontal_select *m,
  3073.         void (*item_display_function) (void *item, void *common_item_data, S32 x, S32 y),
  3074.         void (*item_measure_function) (void *item, void *common_item_data, S32 *width, S32 *height),
  3075.         void (*item_highlight_function) (void *item, void *common_item_data),
  3076.         void (*item_remove_highlight_function) (void *item, void *common_item_data),
  3077.         void (*item_hide_function) (void *item, void *common_item_data, S32 x, S32 y))
  3078. {
  3079.     /*----------------------------------------------------------------*/
  3080.     /* Local Variables                                                */
  3081.     /*----------------------------------------------------------------*/
  3082.     /*----------------------------------------------------------------*/
  3083.     /* Code Body                                                      */
  3084.     /*----------------------------------------------------------------*/
  3085.     m->item_display_function = item_display_function;
  3086.     m->item_measure_function = item_measure_function;
  3087.     m->item_highlight_function = item_highlight_function;
  3088.     m->item_remove_highlight_function = item_remove_highlight_function;
  3089.     m->item_hide_function = item_hide_function;
  3090. }
  3091. /*****************************************************************************
  3092.  * FUNCTION
  3093.  *  gui_set_horizontal_select_common_item_data
  3094.  * DESCRIPTION
  3095.  *  Sets the common item data that the list of items should use
  3096.  * PARAMETERS
  3097.  *  m       [IN]        Is the horizontal select menu object
  3098.  *  c       [IN]        Is the common item data
  3099.  * RETURNS
  3100.  *  void
  3101.  *****************************************************************************/
  3102. void gui_set_horizontal_select_common_item_data(horizontal_select *m, void *c)
  3103. {
  3104.     /*----------------------------------------------------------------*/
  3105.     /* Local Variables                                                */
  3106.     /*----------------------------------------------------------------*/
  3107.     /*----------------------------------------------------------------*/
  3108.     /* Code Body                                                      */
  3109.     /*----------------------------------------------------------------*/
  3110.     m->common_item_data = c;
  3111. }
  3112. /*****************************************************************************
  3113.  * FUNCTION
  3114.  *  gui_set_horizontal_select_images
  3115.  * DESCRIPTION
  3116.  *  
  3117.  * PARAMETERS
  3118.  *  m               [?]         
  3119.  *  left_arrow      [IN]        
  3120.  *  right_arrow     [IN]        
  3121.  * RETURNS
  3122.  *  void
  3123.  *****************************************************************************/
  3124. void gui_set_horizontal_select_images(horizontal_select *m, PU8 left_arrow, PU8 right_arrow)
  3125. {
  3126.     /*----------------------------------------------------------------*/
  3127.     /* Local Variables                                                */
  3128.     /*----------------------------------------------------------------*/
  3129.     S32 width, height;
  3130.     /*----------------------------------------------------------------*/
  3131.     /* Code Body                                                      */
  3132.     /*----------------------------------------------------------------*/
  3133.     m->left_arrow_image = left_arrow;
  3134.     m->right_arrow_image = right_arrow;
  3135.     if (m->left_arrow_image != NULL)
  3136.     {
  3137.         gui_measure_image(m->left_arrow_image, &width, &height);
  3138.     #ifdef __MMI_UI_INLINE_EDIT_DEFAULT_TEXT_EFFECT__
  3139.         m->lx = 0;
  3140.         m->ix1 = width + 2;
  3141.     #else /* __MMI_UI_INLINE_EDIT_DEFAULT_TEXT_EFFECT__ */ 
  3142.         m->lx = 2;
  3143.         m->ly = (m->height >> 1) - (height >> 1);
  3144.         m->ix1 = width + 4;
  3145.     #endif /* __MMI_UI_INLINE_EDIT_DEFAULT_TEXT_EFFECT__ */ 
  3146.         m->ly = (m->height >> 1) - (height >> 1);
  3147.     #ifdef __MMI_TOUCH_SCREEN__
  3148.         m->pen_state.left_region_x = m->lx - GUI_HORIZONTAL_SELECT_PEN_VALID_REGION;
  3149.         if (m->pen_state.left_region_x < 0)
  3150.         {
  3151.             m->pen_state.left_region_x = 0;
  3152.         }
  3153.         m->pen_state.left_region_y = m->ly - GUI_HORIZONTAL_SELECT_PEN_VALID_REGION;
  3154.         if (m->pen_state.left_region_y < 0)
  3155.         {
  3156.             m->pen_state.left_region_y = 0;
  3157.         }
  3158.         m->pen_state.left_region_width = width + (GUI_HORIZONTAL_SELECT_PEN_VALID_REGION * 2);
  3159.         if (m->pen_state.left_region_x + m->pen_state.left_region_width >= (m->width >> 1))
  3160.         {
  3161.             m->pen_state.left_region_width = (m->width >> 1) - m->pen_state.left_region_x - 1;
  3162.         }
  3163.         m->pen_state.left_region_height = height + (GUI_HORIZONTAL_SELECT_PEN_VALID_REGION * 2);
  3164.         if (m->pen_state.left_region_y + m->pen_state.left_region_height >= m->height)
  3165.         {
  3166.             m->pen_state.left_region_height = m->height - m->pen_state.left_region_y - 1;
  3167.         }
  3168.     #endif /* __MMI_TOUCH_SCREEN__ */ 
  3169.     }
  3170.     if (m->right_arrow_image != NULL)
  3171.     {
  3172.         gui_measure_image(m->right_arrow_image, &width, &height);
  3173.     #ifdef __MMI_UI_INLINE_EDIT_DEFAULT_TEXT_EFFECT__
  3174.         m->rx = m->width - width;
  3175.         m->ix2 = m->width - width - 2;
  3176.     #else /* __MMI_UI_INLINE_EDIT_DEFAULT_TEXT_EFFECT__ */ 
  3177.         m->rx = m->width - width - 2;
  3178.         m->ix2 = m->width - width - 4;
  3179.     #endif /* __MMI_UI_INLINE_EDIT_DEFAULT_TEXT_EFFECT__ */ 
  3180.         m->ry = (m->height >> 1) - (height >> 1);
  3181.     #ifdef __MMI_TOUCH_SCREEN__
  3182.         m->pen_state.right_region_x = m->rx - GUI_HORIZONTAL_SELECT_PEN_VALID_REGION;
  3183.         if (m->pen_state.right_region_x < (m->width >> 1))
  3184.         {
  3185.             m->pen_state.right_region_x = (m->width >> 1);
  3186.         }
  3187.         m->pen_state.right_region_y = m->ry - GUI_HORIZONTAL_SELECT_PEN_VALID_REGION;
  3188.         if (m->pen_state.right_region_y < 0)
  3189.         {
  3190.             m->pen_state.right_region_y = 0;
  3191.         }
  3192.         m->pen_state.right_region_width = width + (GUI_HORIZONTAL_SELECT_PEN_VALID_REGION * 2);
  3193.         if (m->pen_state.right_region_x + m->pen_state.right_region_width >= m->width)
  3194.         {
  3195.             m->pen_state.right_region_width = m->width - m->pen_state.right_region_x - 1;
  3196.         }
  3197.         m->pen_state.right_region_height = height + (GUI_HORIZONTAL_SELECT_PEN_VALID_REGION * 2);
  3198.         if (m->pen_state.right_region_y + m->pen_state.right_region_height >= m->height)
  3199.         {
  3200.             m->pen_state.right_region_height = m->height - m->pen_state.right_region_y - 1;
  3201.         }
  3202.     #endif /* __MMI_TOUCH_SCREEN__ */ 
  3203.     }
  3204. }
  3205. /*****************************************************************************
  3206.  * FUNCTION
  3207.  *  gui_set_fixed_menu_bg_id
  3208.  * DESCRIPTION
  3209.  *  set a specific image as fixed menu background instead of wallpaper
  3210.  * PARAMETERS
  3211.  *  image_id        [IN]        Image id
  3212.  * RETURNS
  3213.  *  void
  3214.  *****************************************************************************/
  3215. void gui_set_fixed_menu_bg_id(S32 image_id)
  3216. {
  3217.     /*----------------------------------------------------------------*/
  3218.     /* Local Variables                                                */
  3219.     /*----------------------------------------------------------------*/
  3220.     /*----------------------------------------------------------------*/
  3221.     /* Code Body                                                      */
  3222.     /*----------------------------------------------------------------*/
  3223.     mmi_fixed_menu_bg_id = image_id;
  3224. }
  3225. /*****************************************************************************
  3226.  * FUNCTION
  3227.  *  gui_reset_fiexed_menu_bg_id
  3228.  * DESCRIPTION
  3229.  *  reset a fixed menu background to default
  3230.  * PARAMETERS
  3231.  *  void
  3232.  * RETURNS
  3233.  *  void
  3234.  *****************************************************************************/
  3235. void gui_reset_fiexed_menu_bg_id(void)
  3236. {
  3237.     /*----------------------------------------------------------------*/
  3238.     /* Local Variables                                                */
  3239.     /*----------------------------------------------------------------*/
  3240.     /*----------------------------------------------------------------*/
  3241.     /* Code Body                                                      */
  3242.     /*----------------------------------------------------------------*/
  3243.     mmi_fixed_menu_bg_id = -1;
  3244. }