⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mso_item_access.c

📁 ZORAN 962/966 SOURCE CODE,DVD chip
💻 C
字号:
/* **************************************************************************************
*  Copyright (c) 2006 ZORAN Corporation, All Rights Reserved
*  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
*
*  File: $Workfile: mso_item_access.c $
*
* Description:
* ============
* Project definition of the MSO_ITEM_ACCESS functions
*
****************************************************************************************/
#include "Config.h"		// Global Configuration - do not remove!

#ifdef DEBUG_UI_TRACE
#undef IFTRACE
#define IFTRACE if (gTraceUI)
#include "Debug\DbgMain.h"
#endif //DEBUG_UI_TRACE

#include "Include\SysDefs.h"

/////////////////////////////////////////////////////////////////////////////
// Include files
#include <stdio.h>
#include <string.h>

#include "GUI\Menu_system\ms_object.h"
#include "gui\menu_system\osd_rendering.h"
#include "gui\menu_system\ms_display.h"
#include "GUI\Menu_system\ms_screen.h"
#include "gui\menu_system\ms_send_op.h"

#include "GUI\Object_class\ItemAccess\mso_item_access.h"
#include "GUI\Resource\Bitmap\bitmap.h"
#include "Menu\menu_operation_def.h"
#include "Font\fonts.h"
#include "Library\String_generate.h"
#include "Library\Container_misc.h"


#ifndef DEBUG_UI_TRACE
#undef dbg_printf(sMsg)
#define dbg_printf(sMsg)
#undef	dbgm_printf(sMsg, mode)
#define dbgm_printf(sMsg, mode)
#endif

// TODO: Replace ((MSO_ITEM_ACCESS __NEAR*)pThis) with pObjectItemAccess
#define pObjectItemAccess ((MSO_ITEM_ACCESS __NEAR*)pThis)
#define pDescriptorItemAccess ((MS_DESCRIPTOR_ITEM_ACCESS*)(pThis->mpDescriptor))

#pragma argsused
MS_OP OITEMACCESS_Operation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
	switch(MsOp)
	{
		case MS_OP_DEFROST:
		case MS_OP_INIT:
			{
				MS_DESCRIPTOR_ITEM_ACCESS* pItemAccessDescriptor =  (MS_DESCRIPTOR_ITEM_ACCESS*)pThis->mpDescriptor;
				UINT16 Item;
				UINT16 ItemType;
				UINT16 TotalItems;
				pItemAccessDescriptor->mpfGetDisplayItem(&Item, &TotalItems, &ItemType);
				//Init total items for runtime
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal = TotalItems;
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser = MS_OP_NONE;
#ifdef D_10P_KEY
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mw10PFlag= 0;
#endif
			}
			break;
			
		case MS_OP_ITEM_ACCESS_GET_EDIT_ITEM:
			{
				if (MS_IsFocused(pThis))  //Edit item just focused have edit item
				{
				if (((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent < 
					((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal)
					(*(UINT16 *)lParam) = ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent;
				else
						(*(UINT16 *)lParam) = NULL_INDEX;
				}
				else
					(*(UINT16 *)lParam) = NULL_INDEX;
			}
			return MS_OP_NONE;
			
		case MS_OP_TICK:
			{
				UINT16 Item;
				UINT16 ItemType;
				UINT16 TotalItems;
				MS_DESCRIPTOR_ITEM_ACCESS* pItemAccessDescriptor =  (MS_DESCRIPTOR_ITEM_ACCESS*)pThis->mpDescriptor;

				if (MS_IsFocused(pThis))
				{
					if (NULL_INDEX == ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent
#ifdef D_10P_KEY
						&& (((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mw10PFlag==0)
#endif
                                            )
						break;

					if (0 != ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwTimeout)
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwTimeout--;
					
					if (0 == ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwTimeout)
					{
#ifdef D_10P_KEY
						if(((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mw10PFlag)
						{
							//MSO_OBJECT __NEAR* 			pList ;
							//pList = MS_FindDescendant((MSO_CONTAINER __NEAR*)gpScreen, pItemAccessDescriptor->mpDescriptorList);
							//if (NULL != pList)
								//MS_ScreenSetFocusObject(MS_ScreenGetPrevFocusObjectInMenu(pThis));
								//MS_ScreenSetFocusObject(MS_ContainerGetPrevFocusObject((MSO_CONTAINER __NEAR*) pList));
//modified by Tranmin D_10P_TIMEOUT_CANCEL
#if 1
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;	
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser = MS_OP_MENU_ITEM_ACCESS_TIMEOUT;					
#else
							if (((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent >= 
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal)
								((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;	
#endif
//modified by Tranmin D_10P_TIMEOUT_CANCEL
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mw10PFlag= 0;
							break;
						}	
#endif
						if (((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent >= 
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal)
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;
						
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser = MS_OP_MENU_ITEM_ACCESS_TIMEOUT;					
					}
						
				}
				else
				{
					pItemAccessDescriptor->mpfGetDisplayItem(&Item, &TotalItems, &ItemType);
				
					if (Item != ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent
						||TotalItems !=  ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal
						||ItemType != ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemType)
					{
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = Item;
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal = TotalItems;
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemType = ItemType;
						MS_DisplayAddObject(pThis);
					} 
					
				}
			}
			break;
#ifdef D_10P_KEY
		case MS_OP_10P:
			{
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwTimeout = ITEM_ACCESS_TIMEOUT;  //ITEM_ACCESS_TIMEOUT;

				if(0!=((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent %10)
					((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = 0;
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent += 10;
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mw10PFlag= 1;
			
				if(((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent >((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal )
				{
					((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent =  10;
				}
				MS_DisplayAddObject(pThis);	
			}
			return MS_OP_NONE;
#endif
		case MS_OP_0: // Fall Through
		case MS_OP_1: // Fall Through
		case MS_OP_2: // Fall Through
		case MS_OP_3: // Fall Through
		case MS_OP_4: // Fall Through
		case MS_OP_5: // Fall Through
		case MS_OP_6: // Fall Through
		case MS_OP_7: // Fall Through
		case MS_OP_8: // Fall Through
		case MS_OP_9:
			{
				UINT8 cValue = MS_OperationDigitKeyToValue(MsOp);
#ifdef D_10P_KEY
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwTimeout = 0;  //directly for number key
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mw10PFlag= 0;
#else
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwTimeout = ITEM_ACCESS_TIMEOUT;
#endif
					
				if (PARAM_ITEM_ACCESS_START_NEW_EDITION == lParam
					|| NULL_INDEX == ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent)
				{
					if (0 == cValue)
					{
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;
					}
					else
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent =_ItemNumUserToSystem(cValue);
//add by Tranmin D_PROHIBIT_0_INPUT
					if(!(((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mw10PFlag) && (0 == cValue))
					{
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;	
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser = MS_OP_MENU_ITEM_ACCESS_INVALID_DIGITAL_INPUT;					
					}
//add by Tranmin D_PROHIBIT_0_INPUT
				}
				else
				{
#ifdef D_10P_KEY
					((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent =((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent+ _ItemNumUserToSystem(cValue);
#else
					((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = (_ItemNumSystemToUser(((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent ) * 10) + _ItemNumUserToSystem(cValue);
#endif
					if (((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal < 10)
					{
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent %= 10;
						if (9 == ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent )
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;
					}
					else if (((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal < 100)
					{
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent %= 100;
						if (99 ==  ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent)
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;
					}
					else
					{
						((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent %= 1000;
						if (999 == ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent)
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;
					}
				}
				
				MS_DisplayAddObject(pThis);
			}
			return MS_OP_NONE;
		
		case MS_OP_CLEAR:
			if (NULL_INDEX != ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent)
			{
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;
				MS_DisplayAddObject(pThis);
			}
			return MS_OP_NONE;
		
		case MS_OP_FOCUS_CHANGE:
			{
				((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser = MS_OP_NONE;
			MS_DisplayAddObject(pThis);
			}
			break;

		case MS_OP_PLAY:
		case MS_OP_ENTER:
			{

						if (((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent >= 
							((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal)
						{
					((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent = NULL_INDEX;	
					//((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser = MS_OP_NONE;
					((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser = MsOp;
							MS_DisplayAddObject(pThis);
						}
				else
					((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser = MsOp;
			}
							return MS_OP_NONE;
						
		case MS_OP_ITEM_ACCESS_GET_MS_OP:
			(*(MS_OP *)lParam) = ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mMsOpUser;
								return MS_OP_NONE;
			
		default:
			break;
	}
	return MsOp;
}


BOOL OITEMACCESS_FillOSDSeg(MSO_OBJECT __NEAR* pThis, MS_AREA __NEAR* pAbsArea)
{
	FORMATED_UNICODE_STRING oFormUniStr;
	UINT16 szBuffer[12]; // If one day support 12345/23245
	
	
	UINT16 wColor = (!MS_IsFocused(pThis) && (ITEM_ACCESS_TYPE_PLAY ==((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemType)) ? CIDX_ITEM_ACCESS_PLAY : CIDX_ITEM_ACCESS_FOCUS;
	oFormUniStr.mtFontIndex = pDescriptorItemAccess->mtFontIndex;
	
	// display bitmap underneath text
	OSDR_FillOsdSegBitmapFitArea(OTEXT_GetBitmapFromSet(pThis, pDescriptorItemAccess->mpBmpSetBg), pAbsArea);

	if(MS_IsFocused(pThis) && (NULL != pDescriptorItemAccess->mpBmpSetBg))
		OSDR_FillOsdSegBitmapFitArea(pDescriptorItemAccess->mpBmpSetBg->mpFocused, pAbsArea);

	
	if (NULL_INDEX == ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent)
	{
		STR_GeneratItemAccessNumeric(L'-', 0, ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal,
										szBuffer, 0, sizeof(szBuffer));
	}
	else
	{
#ifdef D_10P_KEY
		if(((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mw10PFlag) //Process 10P key 
		{
			UINT16 wItem10P = ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent;
			
			wItem10P=wItem10P/10;
			wItem10P|=0x8000;
			if (MS_IsFocused(pThis))
				STR_GeneratItemAccessNumeric(L'-', wItem10P,
											((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal,szBuffer, 0, sizeof(szBuffer));
			else
				STR_GeneratItemAccessNumeric(L'0', wItem10P,
											((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal, szBuffer, 0, sizeof(szBuffer));
		}
		else
#endif
	{
		UINT16 wItemCurrent = ((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemCurrent + 1;
		if (MS_IsFocused(pThis))
			STR_GeneratItemAccessNumeric(L'-', wItemCurrent,
											((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal,szBuffer, 0, sizeof(szBuffer));
		else
			STR_GeneratItemAccessNumeric(L'0', wItemCurrent,
											((MSO_ITEM_ACCESS __NEAR* )pThis) ->moParam.mwItemTotal, szBuffer, 0, sizeof(szBuffer));
	}
	}
		


	OSDR_GetFormUniStr_Ram((FORMATED_UNICODE_STRING __NEAR*)&oFormUniStr, (UINT32)szBuffer);

	OSDR_FillOsdSegUniString((FORMATED_UNICODE_STRING __NEAR*)&oFormUniStr,
							pAbsArea,
							
							TEXT_GetAlignXPosition(pDescriptorItemAccess->mpXYAlignText, oFormUniStr.mwPixelWidth, pAbsArea->mwW),
							TEXT_GetAlignYPosition(pDescriptorItemAccess->mpXYAlignText, oFormUniStr.mcPixelHeight,pAbsArea->mwH),
							TEXT_GetAlignHorizontal(pDescriptorItemAccess->mpXYAlignText), 
							TEXT_GetAlignVertical(pDescriptorItemAccess->mpXYAlignText), 
							wColor
							);
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -