MS_EDIT.C
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:9k
源码类别:

DVD

开发平台:

Others

  1. /* **************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: MS_EDIT.C $             
  6.  *
  7.  * Description:
  8.  * ============
  9.  * manipulate menu edit window
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 5 $
  14.  * Last Modified by $Author: Billt $ at $Modtime: 03-06-24 13:57 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /SourceCode/I64_Common/I64_Reference/UI/Menu_sys/MS_EDIT.C $
  19.  * 
  20.  * 5     03-06-24 14:01 Billt
  21.  * Added EDIT_INPUT_SHIFT_LEFT
  22.  * 
  23.  * 4     03-02-12 17:18 Royz
  24.  * add ESS style program support
  25.  * 
  26.  * 3     03-01-09 4:43 Leslie
  27.  * Unicode support
  28.  * 
  29.  * 9     23/04/02 9:39 Nirm
  30.  * - Added dependency in "Config.h".
  31.  * 
  32.  * 8     11/03/02 12:43 Nirm
  33.  * Debug message in case of memory allocation failure.
  34.  * 
  35.  * 7     2/27/02 7:02a Tomasp
  36.  * Changed get_blk/rel_blk to malloc,free.
  37.  * 
  38.  * 5     16/01/02 8:57 Nirm
  39.  * Fixed debug-messages.
  40.  * 
  41.  * 4     9/01/02 18:23 Nirm
  42.  * Corrected Include-Paths.
  43.  * 
  44.  * 3     30/12/01 10:00 Atai
  45.  * Add explicit casting
  46.  * 
  47.  * 2     25/12/01 10:38 Atai
  48.  * Code cleaning
  49.  **************************************************************************************** */
  50. #include "Config.h" // Global Configuration - do not remove!
  51. #ifdef _DEBUG
  52. #include "DebugDbgMain.h"
  53. #undef IFTRACE
  54. #define IFTRACE if (gTraceMenu)
  55. #endif //_DEBUG
  56. #include <stdio.h>
  57. #include <stdlib.h>
  58. #include <string.h>
  59. #include "Includesysdefs.h"
  60. #include "Decoderosdrendr.h"
  61. #include "UIMenu_Sysosd_drv.h"
  62. #include "UIMenu_Sysms_wdgt.h"
  63. #define MS_MAX_EDIT 8
  64. #define PEDIT(_widget_)   ( (MS_EDIT *) (_widget_) )
  65. void edit_display (MS_WIDGET *widget, char focus)
  66. {
  67. MS_EDIT *edit = PEDIT(widget);
  68. OSD_SetOrigin( (MS_WIDGET*)widget->parent );
  69. // First time focus, start from beginning of the field
  70. #ifdef D_MS_EXTENSIONS
  71. OSD_PutText(widget->pos.x, widget->pos.y, widget->pos.w, widget->pos.h, FORE_COLOR(widget, focus), BACK_COLOR(widget, focus), edit->present.text, MS_JUST(widget), C_ASCII);
  72. #else
  73. OSD_PutText(widget->pos.x, widget->pos.y, widget->pos.w, widget->pos.h, FG_COLOR(widget->color),BACK_COLOR(widget, focus), edit->present.text, MS_JUST(widget), C_ASCII);
  74. #endif
  75. }
  76. unsigned char edit_number_select(MS_EDIT *edit, unsigned char num) 
  77. {
  78. if (edit->current_num >= edit->max_width) {
  79. dbg_printf(("End of the edit arean"));
  80. #ifdef D_MS_EXTENSIONS
  81. {
  82. // Handle single-digit case
  83.   if ( edit->max_width > 1 )
  84. // Reversed first two parameters
  85. memmove( (wchar_t *) (edit->present.text), &((wchar_t *) (edit->present.text))[1], edit->max_width - 1 );
  86.   edit->current_num--;
  87. }
  88. #else
  89. // return 0;
  90. _wcsnset( ((wchar_t *) edit->present.text), L'-', edit->max_width );
  91. edit->current_num = 0;
  92. #endif
  93. }
  94. if (MS_IS_USE_SC(edit)) {
  95. // Need to be implemented !!!!
  96. }
  97. else {
  98. // Support MS_EDIT_HEX
  99. #ifdef D_MS_EXTENSIONS
  100. if ( num > 9 )
  101.   ((wchar_t *)(edit->present.text))[edit->current_num++] = 'A' + (num - 0x0A);
  102. else
  103. #endif // D_MS_EXTENSIONS
  104. #ifdef EDIT_INPUT_SHIFT_LEFT
  105. {
  106. BYTE i;
  107. for ( i = 0; i < (edit->max_width) - 1; i++ )
  108. ((wchar_t *)(edit->present.text))[i] = ((wchar_t *)(edit->present.text))[i+1];
  109. ((wchar_t *)(edit->present.text))[i] =  '0' + num;
  110. edit->current_num++;
  111. }
  112. #else //EDIT_INPUT_SHIFT_LEFT
  113.   ((wchar_t *)(edit->present.text))[edit->current_num++] = '0' + num;
  114. #endif //EDIT_INPUT_SHIFT_LEFT
  115. }
  116. #ifdef D_MS_EXTENSIONS
  117. // Terminate with null to forget old value
  118. ((wchar_t *)(edit->present.text))[edit->current_num] = '';
  119. #endif
  120. #ifdef D_EDIT_EXTENSIONS
  121. // Terminate with null to forget old value
  122. ((wchar_t *)(edit->present.text))[edit->current_num] = '';
  123. #endif
  124. return 1;
  125. }
  126. static unsigned char number_select(MS_EDIT *edit,unsigned char num) 
  127. {
  128. if ( edit_number_select(edit, num) )
  129. {
  130. #ifdef D_MS_EXTENSIONS
  131.   MS_SET_ACTION_PENDING(edit);
  132. #endif // D_MS_EXTENSIONS
  133.   OSD_SetOrigin( (MS_WIDGET*)((MS_WIDGET *) edit)->parent );
  134.   edit_display((MS_WIDGET *)edit, C_FOCUSED);  // Display the text with the new number;
  135. }
  136. return 1;
  137. }
  138. void edit_convert( MS_EDIT *pmse, DWORD *dw )
  139. {
  140. #ifdef D_MS_EXTENSIONS
  141. if ( MS_IS_EDIT_HEX( pmse ) )
  142. {
  143.   hex_to_num( pmse->present.text, dw );
  144. }
  145. else
  146. #endif // D_MS_EXTENSIONS
  147. {
  148.   text_to_num( pmse->present.text, (long*)dw );
  149. }
  150. }
  151. #ifdef D_MS_EXTENSIONS
  152. static void inc_dec_edit_value(MS_WIDGET *widget, MS_UOP uop, char param)
  153. {
  154. MS_EDIT *pmse = PEDIT(widget);
  155. BOOL bCanChangeValue = FALSE;
  156. DWORD dw;
  157. edit_convert( pmse, &dw );
  158. switch ( uop )
  159. {
  160.   case MS_UOP_LEFT:
  161.   case MS_UOP_DOWN:
  162. // edit value -- ( validate first )
  163. bCanChangeValue = ( dw > 0 );
  164. if ( bCanChangeValue )
  165.   dw--;
  166. break;
  167.   case MS_UOP_UP:
  168.   case MS_UOP_RIGHT:
  169. // edit value ++ ( validate first )
  170. {
  171.   DWORD dwMaxValue = 0;
  172.   int iMaxWidth = pmse->max_width;
  173.   if ( MS_IS_EDIT_HEX( pmse ) )
  174.   {
  175. while ( iMaxWidth-- )
  176. {
  177.   dwMaxValue <<= 4;
  178.   dwMaxValue += 0xF;
  179. }
  180.   }
  181.   else
  182.   {
  183. while ( iMaxWidth-- )
  184. {
  185.   dwMaxValue *= 10;
  186.   dwMaxValue += 9;
  187. }
  188.   }
  189.   bCanChangeValue = ( dw < dwMaxValue );
  190. }
  191. if ( bCanChangeValue )
  192.   dw++;
  193. break;
  194. }
  195. if ( bCanChangeValue )
  196. {
  197.   if ( MS_IS_EDIT_HEX( pmse ) )
  198.   {
  199. num_to_hex_str( dw, pmse->present.text, pmse->max_width );
  200.   }
  201.   else
  202.   {
  203. num_to_str( dw, pmse->present.text, pmse->max_width );
  204.   }
  205.   OSD_SetOrigin( widget->parent );
  206.   
  207.   edit_display( widget, C_FOCUSED );
  208.   if ( pmse->action )
  209. pmse->action(pmse->present.text);
  210. // Note we reset regardless of whether the action function is NULL
  211. #ifdef D_MS_EXTENSIONS
  212.   MS_RESET_ACTION_PENDING(pmse);
  213. #endif // D_MS_EXTENSIONS
  214. }
  215. }
  216. #endif // D_MS_EXTENSIONS
  217. MS_UOP edit_user_op(MS_WIDGET *widget,MS_UOP uop,char param) 
  218. {
  219. MS_EDIT *ms_edit = PEDIT(widget);
  220. switch (uop) {
  221. case MS_UOP_DELETE:
  222. return MS_UOP_NOP;
  223. case MS_UOP_CLEAR:
  224. _wcsnset( ((wchar_t *) ms_edit->present.text), L'-', ms_edit->max_width );
  225. //param = 1;
  226. // REMINDER see if the param assignment is really necessary
  227. if ( param == !C_FOCUSED )
  228.   param = ( (((MS_DIALOG *) widget->parent)->pwli_focus->widget == widget) ? C_FOCUSED : !C_FOCUSED );
  229. ms_edit->current_num = 0;
  230.   // Fall through!
  231. case MS_UOP_DISPLAY:
  232. edit_display(widget,param);
  233. #ifdef D_MS_EXTENSIONS
  234. #else
  235. ms_edit->current_num = 0;
  236. #endif
  237. return MS_UOP_NOP;
  238. case MS_UOP_0:
  239. case MS_UOP_1:
  240. case MS_UOP_2:
  241. case MS_UOP_3:
  242. case MS_UOP_4:
  243. case MS_UOP_5:
  244. case MS_UOP_6:
  245. case MS_UOP_7:
  246. case MS_UOP_8:
  247. case MS_UOP_9:
  248. {
  249.   number_select(ms_edit, (unsigned char)(uop - MS_UOP_0));
  250.   return MS_UOP_NOP;
  251. }
  252. //break;
  253. #ifdef D_MS_EXTENSIONS
  254. case MS_UOP_A:
  255. case MS_UOP_B:
  256. case MS_UOP_C:
  257. case MS_UOP_D:
  258. case MS_UOP_E:
  259. case MS_UOP_F:
  260.   if ( MS_IS_EDIT_HEX(ms_edit) )
  261.   {
  262. number_select(ms_edit, (unsigned char)(0x0A + uop - MS_UOP_A));
  263. return MS_UOP_NOP;
  264.   }
  265.   break;
  266. #endif // D_MS_EXTENSIONS
  267. #ifdef D_MS_EXTENSIONS
  268. case MS_UOP_LEFT:
  269. case MS_UOP_RIGHT:
  270.   if ( MS_IS_EDIT_LR(ms_edit) )
  271.   {
  272. inc_dec_edit_value(widget, uop, param);
  273. return MS_UOP_NOP;
  274.   }
  275.   break;
  276. case MS_UOP_UP:
  277. case MS_UOP_DOWN:
  278.   if ( MS_IS_EDIT_UD(ms_edit) )
  279.   {
  280. inc_dec_edit_value(widget, uop, param);
  281. return MS_UOP_NOP;
  282.   }
  283.   break;
  284. #endif // D_MS_EXTENSIONS
  285. }
  286. if (uop != MS_UOP_ENTER) {
  287. return uop;
  288. }
  289. if ( ms_edit->action )
  290.   ms_edit->action(ms_edit->present.text);
  291. #ifdef D_MS_EXTENSIONS
  292. MS_RESET_ACTION_PENDING(ms_edit);
  293. #endif // D_MS_EXTENSIONS
  294. ms_edit->current_num = 0;
  295. return MS_UOP_NOP;
  296. }
  297. static void init_edit(MS_EDIT *mse, MS_POS *pos,MS_COLOR color,void *text,void (* action)(void *), unsigned char max_width,unsigned char attr)
  298. {
  299. #ifdef _DEBUG
  300. if (NULL == mse) {
  301. tr_printf(("FATAL: init_edit() Failed: NULL control.n"));
  302. return;
  303. }
  304. #endif //_DEBUG
  305. ((MS_WIDGET *)mse)->pos = *pos;
  306. ((MS_WIDGET *)mse)->parent = NO_PARENT;
  307. mse->present.text = text;
  308. mse->action = action;
  309. mse->max_width = max_width;
  310. mse->current_num = 0;
  311. ((MS_WIDGET *)mse)->attr = attr | MS_ASCII;
  312. ((MS_WIDGET *)mse)->color = color;
  313. ((MS_WIDGET *)mse)->user_op = edit_user_op;
  314. ((MS_WIDGET *)mse)->attrh = ALIGN_CENTER;
  315. }
  316. // text must be a valid memory, size  "max_width" plus one , ended with '' 
  317. MS_EDIT *MS_create_edit(MS_POS *pos,MS_COLOR color,void *text,void (* action)(void *), unsigned char max_width,unsigned char attr)
  318. {
  319. MS_EDIT *mse;
  320. dbg_printf(("MS_create_editn"));
  321. mse = PEDIT(malloc(sizeof(MS_EDIT)));
  322. #ifdef _DEBUG
  323. if (NULL == mse) {
  324. tr_printf(("FATAL: MS_create_edit() Failed: Low system resources.n"));
  325. return NULL;
  326. }
  327. #endif //_DEBUG
  328. init_edit(mse, pos, color, text, action, max_width, attr);
  329. return mse;
  330. }