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

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_TIME.C $             
  6.  *
  7.  * Description:
  8.  * ============
  9.  * Menu system Time presentation
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 11 $
  14.  * Last Modified by $Author: Leonh $ at $Modtime: 12/23/03 12:54p $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/UI/Menu_sys/MS_TIME.C $
  19.  * 
  20.  * 11    12/23/03 1:02p Leonh
  21.  * Angieh:Support for the hidden group search.
  22.  * 
  23.  * 10    8/12/03 2:09p Mikex
  24.  * bug fix for that the input number will disappear in the time search
  25.  * menu after changing the focus to track menu.
  26.  * 
  27.  * 9     03-06-24 14:00 Billt
  28.  * Added EDIT_INPUT_SHIFT_LEFT
  29.  * 
  30.  * 8     03-05-19 23:08 Rogerl
  31.  * Time edit leading by '0'
  32.  * 
  33.  * 7     03-05-16 19:08 Rogerl
  34.  * Implement SUPPORT_TIME_EDIT_LEFT_TO_RIGHT
  35.  * 
  36.  * 6     03-04-21 17:50 Mikelv
  37.  * If the input time is nothing,ignore it  
  38.  * 
  39.  * 5     4/13/03 4:53p Rinata
  40.  * fix password ibehave on parental control n case it is 0000
  41.  * 
  42.  * 4     03-02-18 16:23 Royz
  43.  * fix time search bug
  44.  * 
  45.  * 3     03-01-09 4:43 Leslie
  46.  * Unicode support
  47.  * 
  48.  * 12    23/04/02 9:39 Nirm
  49.  * - Added dependency in "Config.h".
  50.  * 
  51.  * 11    11/03/02 12:58 Nirm
  52.  * Debug message in case of memory allocation failure.
  53.  * 
  54.  * 10    2/27/02 7:02a Tomasp
  55.  * Changed get_blk/rel_blk to malloc,free.
  56.  * 
  57.  * 9     12/02/02 11:09 Atai
  58.  * Optimize initalized array use
  59.  * 
  60.  * 7     16/01/02 8:57 Nirm
  61.  * Fixed debug-messages.
  62.  * 
  63.  * 6     1/15/02 3:36p Tomasp
  64.  * - fix compilation warning (a bug) - problem in case the time is > 10h
  65.  * 
  66.  * 5     13/01/02 16:39 Atai
  67.  * Remove old Defines
  68.  * 
  69.  * 4     9/01/02 18:23 Nirm
  70.  * Corrected Include-Paths.
  71.  * 
  72.  * 3     30/12/01 10:05 Atai
  73.  * Add explicit casting
  74.  * 
  75.  * 2     25/12/01 10:57 Atai
  76.  * Code cleaning
  77.  **************************************************************************************** */
  78. #include "Config.h" // Global Configuration - do not remove!
  79. #ifdef _DEBUG
  80. #include "DebugDbgMain.h"
  81. #undef IFTRACE
  82. #define IFTRACE if (gTraceMenu)
  83. #endif //_DEBUG
  84. #include <stdio.h>
  85. #include <stdlib.h>
  86. #include <string.h>
  87. #include "Includesysdefs.h"
  88. #include "Decoderosdrendr.h"
  89. #include "UIMenu_Sysosd_drv.h"
  90. #include "UIMenu_Sysms_wdgt.h"
  91. #include "UIMenu_Sysms_lib.h"
  92. #ifdef D_ONE_HOUR_DIGIT
  93. #define MS_TIME_STR_LENGTH   7
  94. #else
  95. #define MS_TIME_STR_LENGTH   8
  96. #endif // D_ONE_HOUR_DIGIT
  97. BOOL b_TIME_NULL = FALSE;
  98. // format text as a time string ( e.g., "2957" -> "00:29:57" )
  99. static void text_to_time_str(wchar_t *text, int iLength, wchar_t *time_str)
  100. {
  101. #ifdef D_ONE_HOUR_DIGIT
  102.   static CONST int iFirstChar[] = { 6, 5, 3, 2, 0 };
  103. #else
  104.   static CONST int iFirstChar[] = { 7, 6, 4, 3, 1, 0 };
  105. #endif // D_ONE_HOUR_DIGIT
  106.   int iFirstCharIndex;
  107.   int iCharIndex;
  108.   wcscpy(time_str, EMPTY_TIME);
  109.   if ( iLength == 0 )
  110. return;
  111.   iFirstCharIndex = iLength - 1; // e.g., 3
  112.   for ( iCharIndex = 0; iCharIndex < iLength; iCharIndex++ )
  113.   {
  114. time_str[iFirstChar[iFirstCharIndex--]] = text[iCharIndex];
  115. // e.g., [iFirstChar[3]] <- [0]
  116. // e.g., [iFirstChar[2]] <- [1]
  117. // e.g., [iFirstChar[1]] <- [2]
  118. // e.g., [iFirstChar[0]] <- [3]
  119.   }
  120. }
  121. BOOL text_to_num(wchar_t *text, long *pdw)
  122. {
  123.   long dw = 0;
  124.   int iLength = wcslen(text);
  125.   wchar_t c;
  126.   while (iLength && !isDigit(*text))
  127.   {
  128. iLength--;
  129. text++;
  130.   }
  131.   
  132.   if ( iLength )
  133.   {
  134. while ( isDigit(c = *text++) )
  135. {
  136. c = char_to_num(c);
  137. dw = dw * 10 + c;
  138. }
  139. *pdw = dw;
  140. return TRUE;
  141.   } // iLength
  142.   *pdw = dw;
  143.   return FALSE;
  144. }
  145. void text_to_BCDnum(wchar_t *text, DWORD *pdw)
  146. {
  147. long dw = 0;
  148. int iLength = wcslen(text);
  149. char c;
  150. while (iLength && !isHexDigit(*text))
  151. {
  152. iLength--;
  153. text++;
  154. }
  155. if ( iLength )
  156. {
  157. while ( isHexDigit(c = *text++) )
  158. {
  159. c = hex_char_to_num(c);
  160. dw |= c;
  161. if (wcslen(text))
  162. dw = dw<<4 ;
  163. }
  164. } // iLength
  165. *pdw = dw;
  166. }
  167. // Convert an unformatted time string to seconds
  168. void text_to_seconds(wchar_t *text, long *pSeconds)
  169. {
  170.   int iLength = wcslen(text);
  171.   long seconds = 0;
  172.   int iTextIndex;
  173.   wchar_t c;
  174.   static CONST long iMultiplier[] = { 36000L, 3600, 600, 60, 10, 1 };
  175.   int iMultiplierIndex = 5;
  176.   for ( iTextIndex = iLength - 1; iTextIndex >= 0 ; iTextIndex-- )
  177.   {
  178. if ( isDigit(c = text[iTextIndex]) )
  179. {
  180.   c = char_to_num(c);
  181.   seconds += ((long) c * iMultiplier[iMultiplierIndex--]);
  182.   b_TIME_NULL = TRUE;
  183. }
  184.   }
  185.   *pSeconds = seconds;
  186. }
  187. int get_num_digits(ULONG number)
  188. {
  189. int digits =1;
  190. while(number/10)
  191. {
  192. digits ++;
  193. number /= 10;
  194. }
  195. return digits;
  196. }
  197. int get_time_digits(ULONG number)
  198. {
  199.   static CONST long iMultiplier[] = { 36000L, 3600, 600, 60, 10, 1 };
  200. int digits =1;
  201. while(number>= iMultiplier[5-digits] && digits <6)
  202. {
  203. digits ++;
  204. }
  205. return digits;
  206. }
  207. #ifdef   SUPPORT_TIME_EDIT_LEFT_TO_RIGHT 
  208. // format text as a time string ( e.g., "2957" -> "00:29:57" )
  209. static void text_to_time_str2(wchar_t *text, int iLength, wchar_t *time_str, int max_digits)
  210. {
  211.   static CONST int iFirstChar[] = { 7, 6, 4, 3, 1, 0 };
  212. int iFirstCharIndex;
  213. int iCharIndex;
  214. // Maximum time digits is 6, RL051903
  215. if (6< max_digits) 
  216. max_digits =6; 
  217. wcscpy(time_str, EMPTY_TIME);
  218. if ( iLength == 0 )
  219. return;
  220. else
  221. // Fill leading zeros, Rl051903
  222. for(iCharIndex =0; iCharIndex < (6-max_digits);iCharIndex++)
  223. {
  224. time_str[iFirstChar[5-iCharIndex]]= '0';
  225. }
  226. // Find First Digit to fill , RL051603
  227. //iFirstCharIndex = iLength - 1; // e.g., 3
  228. iFirstCharIndex = max_digits - 1; // e.g., 3
  229. for ( iCharIndex = 0; iCharIndex < iLength; iCharIndex++ )
  230. {
  231. time_str[iFirstChar[iFirstCharIndex--]] = text[iCharIndex];
  232. // e.g., [iFirstChar[3]] <- [0]
  233. // e.g., [iFirstChar[2]] <- [1]
  234. // e.g., [iFirstChar[1]] <- [2]
  235. // e.g., [iFirstChar[0]] <- [3]
  236. }
  237. }
  238. // Convert an unformatted time string to seconds
  239. void text_to_seconds2(wchar_t *text, long *pSeconds,int max_digits)
  240. {
  241. int iLength = wcslen(text);
  242. long seconds = 0;
  243. int iTextIndex;
  244. wchar_t c;
  245. static CONST long iMultiplier[] = { 36000L, 3600, 600, 60, 10, 1 };
  246. int iMultiplierIndex = 5;
  247. // Find First Digit to fill , RL051603
  248. iMultiplierIndex = 6-max_digits;
  249. for ( iTextIndex = 0; iTextIndex < iLength ; iTextIndex++ )
  250. {
  251. if ( isDigit(c = text[iTextIndex]) )
  252. {
  253. c = char_to_num(c);
  254. seconds += ((long) c * iMultiplier[iMultiplierIndex++]);
  255. b_TIME_NULL = TRUE;
  256. }
  257. }
  258. *pSeconds = seconds;
  259. }
  260. #endif
  261. static void display (MS_WIDGET *widget, char focus)
  262. {
  263. MS_EDIT *edit = (MS_EDIT *)widget;
  264. wchar_t time_str[MS_TIME_STR_LENGTH+1];
  265. #ifdef  SUPPORT_TIME_EDIT_LEFT_TO_RIGHT
  266. if (MS_IS_TIME_EDIT_LEFT_TO_RIGHT(widget))
  267. text_to_time_str2(edit->present.text, (int) edit->current_num, time_str,(int )edit->max_width);
  268. else
  269. #endif
  270. #ifdef EDIT_INPUT_SHIFT_LEFT
  271. {
  272. BYTE i;
  273. BYTE j = (edit->max_width) - (edit->current_num);
  274. for ( i = 0; (i+j < (edit->max_width))&&j; i++ )
  275. {
  276. ((wchar_t *)(edit->present.text))[i] = ((wchar_t *)(edit->present.text))[i+j];
  277. }
  278. text_to_time_str(edit->present.text, (int) edit->current_num, time_str);
  279. for ( i = (edit->max_width); (i-j > 0)&&j; i-- )
  280. {
  281. ((wchar_t *)(edit->present.text))[i-1] = ((wchar_t *)(edit->present.text))[i-j-1];
  282. ((wchar_t *)(edit->present.text))[i-j-1] = '-';
  283. }
  284. }
  285. #else //EDIT_INPUT_SHIFT_LEFT
  286. text_to_time_str(edit->present.text, (int) edit->current_num, time_str);
  287. #endif //EDIT_INPUT_SHIFT_LEFT
  288. // First time focus, start from beginning of the field
  289. OSD_PutText(widget->pos.x,
  290. widget->pos.y,
  291. widget->pos.w,
  292. widget->pos.h,
  293. #ifdef D_MS_EXTENSIONS
  294. FORE_COLOR(widget, focus),
  295. #else
  296. FG_COLOR(widget->color),
  297. #endif
  298. BACK_COLOR(widget, focus),
  299. time_str,
  300. MS_JUST(widget),
  301. C_ASCII);
  302. }
  303. static unsigned char number_select(MS_EDIT *edit,unsigned char num) 
  304. {
  305. if ( edit_number_select( edit, num ) )
  306. {
  307. #ifdef D_MS_EXTENSIONS
  308.   MS_SET_ACTION_PENDING(edit);
  309. #endif // D_MS_EXTENSIONS
  310.   OSD_SetOrigin( ((MS_WIDGET *) edit)->parent );
  311.   display((MS_WIDGET *)edit, C_FOCUSED);  // Display the text with the new number;
  312. }
  313. return 1;
  314. }
  315. MS_UOP time_user_op(MS_WIDGET *widget,MS_UOP uop,char param)
  316. {
  317. switch (uop) {
  318. case MS_UOP_DELETE:
  319. return MS_UOP_NOP;
  320. // no break needed
  321. case MS_UOP_CLEAR:
  322.   wcscpy( ((wchar_t *)((MS_EDIT *) widget)->present.text), L"------");
  323.   //param = 1;
  324.   param = ( (((MS_DIALOG *) widget->parent)->pwli_focus->widget == widget) ? C_FOCUSED : !C_FOCUSED );
  325.   ((MS_EDIT *)widget)->current_num = 0;
  326.   // Fall through!
  327. case MS_UOP_DISPLAY:
  328. display(widget,param);
  329. #ifdef D_MS_EXTENSIONS
  330. #else
  331. //((MS_EDIT *)widget)->current_num = 0;
  332. #endif // D_MS_EXTENSIONS
  333. return MS_UOP_NOP;
  334. // no break needed
  335. case MS_UOP_0:
  336. case MS_UOP_1:
  337. case MS_UOP_2:
  338. case MS_UOP_3:
  339. case MS_UOP_4:
  340. case MS_UOP_5:
  341. case MS_UOP_6:
  342. case MS_UOP_7:
  343. case MS_UOP_8:
  344. case MS_UOP_9:
  345. {
  346.   number_select((MS_EDIT *)widget,(unsigned char)(uop-MS_UOP_0));
  347. #ifdef SUPPORT_TIME_EDIT_LEFT_TO_RIGHT
  348. //Take action when enter last digit, RL051603
  349. if(MS_IS_TIME_EDIT_LEFT_TO_RIGHT(widget))
  350. if(((MS_EDIT *)widget)->current_num ==( (MS_EDIT *)widget)->max_width)
  351. ((MS_EDIT *)widget)->action(((MS_EDIT *)widget)->present.text);
  352. #endif
  353.   return MS_UOP_NOP;
  354. }
  355.   // break;
  356. }
  357. if (uop != MS_UOP_ENTER) {
  358. return uop;
  359. }
  360. #ifdef D_MS_EXTENSIONS
  361. // reset action_pending because the user pressed ENTER
  362. // regardless of whether the action function is NULL
  363. MS_RESET_ACTION_PENDING(widget);
  364. #endif // D_MS_EXTENSIONS
  365. {
  366. wchar_t time_str[MS_TIME_STR_LENGTH+1];
  367. text_to_time_str(((MS_EDIT *)widget)->present.text, (int) ((MS_EDIT *)widget)->current_num, time_str);
  368. ((MS_EDIT *)widget)->current_num = 0;
  369. // Force action at last , RL051603
  370. ((MS_EDIT *)widget)->action(time_str);
  371. }
  372. return MS_UOP_NOP;
  373. }
  374. // text must be a valid memory, size  "max_width" plus one , ended with '' 
  375. MS_TIME *MS_create_time(MS_POS *pos,MS_COLOR color,void *text,void (* action)(void *), unsigned char max_width,unsigned char attr)
  376. {
  377. MS_TIME *time;
  378. dbg_printf(("MS_create_timen"));
  379. time = (MS_TIME *)malloc(sizeof(MS_TIME));
  380. #ifdef _DEBUG
  381. if (NULL == time) {
  382. tr_printf(("FATAL: MS_create_time() Failed: Low system resources.n"));
  383. return NULL;
  384. }
  385. #endif //_DEBUG
  386. ((MS_WIDGET *)time)->pos = *pos;
  387. ((MS_WIDGET *)time)->parent = NO_PARENT;
  388. ((MS_EDIT *)time)->present.text = text;
  389. ((MS_EDIT *)time)->action = action;
  390. ((MS_EDIT *)time)->max_width = max_width;
  391. ((MS_EDIT *)time)->current_num = 0;
  392. ((MS_WIDGET *)time)->attr = attr | MS_ASCII;
  393. ((MS_WIDGET *)time)->color = color;
  394. ((MS_WIDGET *)time)->user_op = time_user_op;
  395. ((MS_WIDGET *)time)->attrh = ALIGN_CENTER;
  396. return time;
  397. }