Newer
Older
Import / projects / LGN-IP3870 / t / new / basemodel.py
import config
import baseui, ui
import runtime, utils, status
from setting import setting
from ui import PINInputUI

import uiconfig
#예외 발생 class raise StorageFullError, 'A' => .........StorageFullError:A
class StorageFullError(Exception):
	pass

class Stage:
	#__metaclass__ = checkdup.CheckDup
	name = ''
	agenda_forbidden = False
	domonitor_forbidden = False

	def set_name(self, name):
		self.name = name

	def get_name(self):
		return self.name

	def destroy(self):
		self.ui.destroy()
		self.ui = None

	def is_active(self):
		return self == runtime.manager.stage

	def show(self):
		self.ui.show()

	def hide(self):
		self.ui.hide()

	def handle_key(self, key):
		return False

	def handle_modem(self, *ev):
		return False

	def oninit(self):
		pass
		
	def SMS_Notify_show(self, msg=None):
		self.ui.SMS_Notify_show(msg)
	def SMS_Notify_free(self):
		self.ui.SMS_Notify_free()	

class TempStage(Stage):
	agenda_forbidden = True
	def __init__(self, cb):
		def run_cb():
			self.cb_tag = None
			cb()
			return False
		self.cb_tag = runtime.evas.idle_add(cb)
		self.ui = baseui.BaseUI('', '', '')
	def destroy(self):
		Stage.destroy(self)
		if self.cb_tag:
			runtime.evas.idle_remove(self.cb_tag)


class ListStage(Stage):
	# start shchun : add two additional option...  May-11
	#		in order to have good scan ui.
	#
	#	num_col : activate/deactivate numer icon in front of listitems.
	#	x : to specify x value of list items. 
#	def __init__(self,choice=None,title=None,icon=None,titleimage=None,left=_('OK'),right=_('BACK'),isactivate2=False, unselbarpos=[]):
	def __init__(self, choice=None, title=None, icon=None, titleimage=None, left=_('OK'), right='', menu3='', menu4=_('BACK'), isactivate2=False, unselbarpos=[], num_col=True, x=uiconfig.list_pos_x):
		self.num_col = num_col
		self.x = x
		# end shchun
		self.isactivate2 = isactivate2
	
		if title == None:
			try:
				title = self.title
			except:
				title = ''
		if choice == None:
			try:
				choice = self.choice
			except:
				choice = ''
				self.choice = ''
		if icon == None:
			try:
				icon = self.icon
			except:
				pass
		if titleimage == None:
			try:
				if self.titleimage and self.titleimage != None:
					titleimage = self.titleimage
				else:
					titleimage = uiconfig.gen_big_title
			except:
				titleimage = uiconfig.gen_big_title
		self.choice_updated = False
		# yylee modified to add new soft key
		# start shchun : add addition argument, x, numcol May-11
		self.ui = baseui.ListUI(left, right, title, menu3, menu4, titleimage, icon=icon, num_col = self.num_col,x = self.x)
		# self.ui = baseui.ListUI(left, right, title, titleimage=titleimage, icon=icon)
		# end shchun
		self.ui.set_list(choice, unselbarpos)


	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			if self.ui.get_focus() >= 0:
				self.activate(self.ui.get_focus())
			return True
		# yylee modified to add new soft key
		# elif key == config.Menu2:
		elif key == config.Menu4 or key == 'CLR':
			if self.isactivate2:
				self.activate2(self.ui.get_focus())
			else:
				runtime.manager.back_stage()
			return True
		elif key in ('Up', 'Down'):
			return self.ui.handle_key(key)
		elif key in '123456789':
			nkey = int(key)
			if nkey <= len(self.ui.list.labels):
				self.activate(nkey-1)
			return True
		'''
		elif key == '1':
			self.activate(0)
			return True
		elif key == '2':
			self.activate(1)
			return True
		elif key == '3':
			self.activate(2)
			return True	
		elif key == '4':
			self.activate(3)
			return True
		elif key == '5':
			self.activate(4)
			return True
		elif key == '6':
			self.activate(5)
			return True	
		elif key == '7':
			self.activate(6)
			return True
		elif key == '8':
			self.activate(7)
			return True
		elif key == '9':
			self.activate(8)
			return True
		'''
		return False

	def show(self):
		if self.choice_updated:
			self.ui.update_lists(self.choice)
			self.choice_updated = False
		Stage.show(self)

	def change_choice(self, choice):
		self.choice_updated = True
		self.choice = choice

	def set_focus(self, focus):
		self.ui.set_focus(focus)


class ListTimeStage(Stage):
	def __init__(self, choice=None, title=None, icon=None, titleimage=None, left='', right='', menu3='', menu4=_('BACK'), isactivate2=False, unselbarpos=[]):
		self.isactivate2 = isactivate2
		if title == None:
			title = self.title
		if choice == None:
			try:
				choice = self.choice
			except:
				choice = ''
				self.choice = ''
		if icon == None:
			try:
				icon = self.icon
			except:
				pass
		if titleimage == None:
			try:
				titleimage = self.titleimage
			except:
				pass
		self.choice_updated = False
		self.ui = baseui.TimeListUI(left, right, title, titleimage=titleimage, icon=icon)
		self.ui.set_list(choice, unselbarpos)

	def handle_key(self, key):
		if key == config.Menu1:
			if self.ui.get_focus() >= 0:
				self.activate(self.ui.get_focus())
			return True
		if key == config.Menu4 or key == 'CLR':
			if self.isactivate2:
				self.activate2(self.ui.get_focus())
			else:
				runtime.manager.back_stage()
			return True
		elif key in ('Up', 'Down'):
			return self.ui.handle_key(key)

		return False

	def show(self):
		if self.choice_updated:
			self.ui.update_lists(self.choice)
			self.choice_updated = False
		Stage.show(self)

	def change_choice(self, choice):
		self.choice_updated = True
		self.choice = choice
	

class ListCalendarStage(Stage):
	def __init__(self, choice=None, left='', right='', menu3='', menu4=_('BACK'), isactivate2=False, unselbarpos=[], title_image=uiconfig.calendar_title, list_icon=uiconfig.calendar_list_icon, x=uiconfig.list2_pos_x, title=''):
		self.isactivate2 = isactivate2		
		if choice == None:
			try:
				choice = self.choice
			except:
				choice = ''
				self.choice = ''		
		self.choice_updated = False
		self.ui = baseui.CalendarListUI(left, right, menu3, title_image=title_image, list_icon=list_icon, x=x, title=title)
		self.ui.set_list(choice, unselbarpos)
		self.current_pos = -1

	def handle_key(self, key):
		if key == config.Menu1:
			if self.ui.get_focus() >= 0:
				self.activate(self.ui.get_focus())
			return True
		if key == config.Menu4:
			if self.isactivate2:
				self.activate2(self.ui.get_focus())
			else:
				runtime.manager.back_stage()
			return True
		elif key in ('Up', 'Down'):
			return self.ui.handle_key(key)

		return False

	def show(self):
		if self.choice_updated:
			self.ui.update_lists(self.choice)
			self.choice_updated = False
			if self.current_pos != -1:
				self.ui.set_focus(self.current_pos)
		Stage.show(self)

	def change_choice(self, choice):
		self.choice_updated = True
		self.choice = choice

	def set_current_pos(self, pos):
		self.current_pos = pos

	def get_current_pos(self):
		return self.current_pos

# KA: [20080311] phonebook UI
class EA_SearchStage(Stage): # ListStage
	def __init__(self, group_index=-1, left=_('OK'), right=_('DELETE'), menu3=_('KOR'), menu4=_('BACK'), isactivate2=False, unselbarpos=[], myann_flag=False):
		from phonedb import phonedb
		if phonedb.is_empty():
			import uiconfig
			def back_cb():
				runtime.eaHandler.closePhonebook()
			runtime.manager.stack_stage(NotifyStage(_('Phonebook empty'), uiconfig.baloon_phonebook_icon, back_cb))
			return	

		self.group_index = group_index
		self.isactivate2 = isactivate2
		self.choose_move = 0
		self.myann_flag = myann_flag

		self.choice_updated = False
		self.ui = baseui.SearchUI(left, right, menu3, menu4)
		#self.ui.set_fixed_automata(None, False)
		self.ui.set_automata('hangul', False)

		self.phonedb_indexes, self.choice = self.get_list()
	
		if self.choice:
			self.ui.set_list(self.choice, unselbarpos)
			self.ui.set_focus(0)
			self.ui.update_info()
#		return self.ui.entry.handle_key(key)

	def handle_key(self, key):	
		if key in (config.Red, config.Menu4):
			runtime.manager.back_stage()
			#runtime.eaHandler.sendPhonebookData()
			runtime.eaHandler.closePhonebook()
			return True
			
		if key == config.Menu1 or key == 'OK':
			#phonebookList = []
			number = self.ui.get_priority_number()
			name = self.ui.item[0]
			name = unicode(name, 'utf-8').encode('euc-kr')
			phonebookList = (number, name)
			#phonebookList.append((sel_number, sel_name))												
			runtime.eaHandler.closePhonebook()
			runtime.eaHandler.sendPhonebookData(phonebookList)
			runtime.manager.back_stage()
			return True
		elif key == config.Menu2:
			# delete
			status.editing_phone_number_index = self.ui.get_focus()
			status.phone_item = self.ui.get_item()
			self.delete_item()
			'''
			if self.choose_move == 0:
				self.choose_move = 1
				self.ui.sel_number.file = uiconfig.image_dir  + uiconfig.PB_sel_number_file[1]
			else:				
				self.choose_move = 0
				self.ui.sel_number.file = uiconfig.image_dir  + uiconfig.PB_sel_number_file[0]
			return True
			'''
		elif key == config.Menu3:
			self.ui.automata_idx = utils.get_automata_idx(*self.ui.automata)		
			self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_hangul)	
			self.ui.automata = config.automata_list_hangul[self.ui.automata_idx]			
			self.ui.set_automata(*self.ui.automata)		
			return True		
				
		elif key == 'CLR':	
			self.ui.entry.handle_key(key)
			text_len = len(self.ui.entry.get_text())
			if text_len > 0:
				self.ui.entry.backspace(1)
				text_len = len(self.ui.entry.get_text()) # it's needed because of hangul
				if text_len:
					#self.sort()
					#if len(self.ui.entry.get_text()) == 0:self.ui.set_right('')
					self.sorting()
				else:
					'''
					self.phonedb_indexes, self.choice = self.get_list()
					print 'jun================================ self.phonedb_indexes=', self.phonedb_indexes
					print 'jun================================ self.choice=', self.choice
					if self.choice:
						unselbarpos = []
						self.ui.set_list(self.choice, unselbarpos)
						self.ui.set_focus(0)
						self.ui.update_info()
					self.sorting()
					'''
					runtime.manager.back_stage()
					from phonedb import phonedb
					if phonedb.is_empty():
						if self.ui.notify_timer:
							return
						self.ui.notify_msg_show(msg = _('Phonebook empty'))	
					else:
						runtime.manager.stack_stage(EA_SearchStage)
			else:
				runtime.manager.back_stage()
				runtime.eaHandler.closePhonebook()
			# 2008.04.25 TEST 
			#from phonedb import phonedb			
			#index = phonedb.find_by_name_near(self.ui.entry.get_text())
			#self.ui.set_focus(index)
			# 2008.04.25 TEST  ==
			return True					
		elif key in ('Up', 'Down') or ((self.choose_move ==1) and key in ('Left','Right')):
			#self.ui.set_right('DELETE')
			return self.ui.handle_key(key)
		elif key in ('Left','Right'):
			if len(self.ui.entry.get_text()) <= 0:
				return
			else:
				return self.ui.entry.handle_key(key)
		#elif key == config.Red:
		#	runtime.manager.back_stage()
		#	return True
		elif key in (config.Green, config.OffHook, config.Video):
			return True

		else:
			#self.ui.sel_number.file = uiconfig.image_dir  + uiconfig.PB_sel_number_file[0]			
			#self.ui.set_right('DELETE')
			result = self.ui.entry.handle_key(key)
			# KA:[20080331] NEW PHONEBOOK - search			
			#from phonedb import phonedb
			# 2008.04.25 TEST 
			#index = phonedb.find_by_name_near(self.ui.entry.get_text())
			#self.ui.set_focus(index)
			self.sorting()
			#self.sort()
			return result

	def sort(self):
		from phonedb import phonedb
		# 2008.04.25 TEST 
		#index = phonedb.find_by_name_near(self.ui.entry.get_text())
		#self.ui.set_focus(index)
		choice = phonedb.find_by_all_near(self.ui.entry.get_text())
		if choice:
			self.choice = choice
			#self.ui.set_left(_('MSG_SEND'))
			self.ui.set_right(_('DELETE'))
		else:
			self.choice = _('No result'),
			self.ui.set_left('')
			self.ui.set_right('')
		
		self.ui.update_lists(self.choice)
		self.choice_updated = True
		self.ui.set_focus(0)
		self.ui.update_info()
		Stage.show(self)
		# 2008.04.25 TEST ==
	
	def sorting(self):
		text = self.ui.entry.get_text()
		if len(text) == 0:
			self.choice = _('No result'),
			if self.myann_flag:
				self.ui.set_left(_('OK'))
				self.ui.set_right('')
			else:
				#self.ui.set_left(_('MSG_SEND'))
				self.ui.set_right(_('DELETE'))
		else:
			from phonedb import phonedb
			choice = phonedb.get_phonelist_by_text(text)
			if choice:
				self.choice = choice
				if self.myann_flag:
					self.ui.set_left(_('OK'))
					self.ui.set_right('')
				else:
					#self.ui.set_left(_('MSG_SEND'))
					self.ui.set_right(_('DELETE'))
			else:
				self.choice = _('No result'),
				self.ui.set_left('')
				self.ui.set_right('')

		self.ui.update_lists(self.choice)
		self.choice_updated = True
		self.ui.set_focus(0)
		self.ui.update_info()
		Stage.show(self)

	def activate_menu1(self):
		# 'Find'
		text = self.ui.get_text()
		self.update_phonelist(text)

	def update_phonelist(self, text):
		if len(self.choice) == 0:
			return
		# focus를 맨 위로 보내기위해서
		if type(text) == type(''):
			if text:
				from phonedb import phonedb
				focus = phonedb.find_by_name_near(text, self.phonedb_indexes)

			else:
				focus = 0
		self.ui.set_focus(0)
		self.ui.set_focus(focus)
		self.change_choice(self.choice)

	def get_list(self):
		from phonedb import phonedb
		#print 'ka............group_index=', self.group_index
		if self.group_index >= 0:
			phonedb.load_group_db(self.group_index)
			#print 'ka............phonedb.get_names_by_group()=', phonedb.get_names_by_group()
			return range(phonedb.count()), phonedb.get_names_by_group()
		else:
			#phonedb.load_db()
			#print 'ka....phonedb.get_names()=', phonedb.get_names()
			return range(phonedb.count()), phonedb.get_names()
	
	def show(self):
		self.phonedb_indexes, self.choice = self.get_list()
		self.ui.update_lists(self.choice)
		self.choice_updated = False
		self.ui.set_focus(0)
		self.ui.update_info()
		if self.ui.entry.get_text():
			self.sorting()
		Stage.show(self)
		#if self.call_flag or status.video_mode != status.VideoIdle:
		#	self.ui.set_left('')
		#	return		
		
	def hide(self):
		self.ui.hide()
		
	def destroy(self):
		Stage.destroy(self)
		status.editing_phone_number_index = -1
		status.phone_item = None
		if self.group_index >= 0:
			from phonedb import phonedb
			phonedb.load_db()

	def delete_item(self):
		def yes():
			# Delete This Item
			from phonedb import phonedb
			from speeddb import speeddb
			
			name = phonedb.get_sym_name(status.editing_phone_number_index)
			
			pb_item = phonedb.get_item(status.editing_phone_number_index)
			speeddb.clear_speed_num(pb_item[6])
			
			phonedb.remove(status.editing_phone_number_index)
			
#			stage = runtime.manager.find_stage('phone list')
#			stage.refresh_lists()
			if phonedb.is_empty():
				'''
				if runtime.manager.find_stage('phonebook'):
					runtime.manager.back_stage('phonebook')
				else:
					runtime.manager.queue_backward(3)
				stage = NotifyStage(_('Entry deleted') + '\n' + _('Phonebook empty'), uiconfig.baloon_phonebook_icon)
				runtime.manager.stack_stage(stage)
				'''
				if runtime.manager.find_stage('phonebook'):
					runtime.manager.back_stage('phonebook')
				else:
					from model import IdleStage
					runtime.manager.change_stage(IdleStage, True)
				stage = NotifyStage(_('Phonebook empty'), uiconfig.baloon_phonebook_icon)
				runtime.manager.stack_stage(stage)
				stage = NotifyStage(_('Entry deleted'), uiconfig.baloon_phonebook_icon)
				runtime.manager.stack_stage(stage)
			else:
				stage = NotifyStage(_('Entry deleted'), uiconfig.baloon_phonebook_icon)
				runtime.manager.change_stage(stage)
			return

		def no():
			runtime.manager.back_stage()
			
		stage = YesNoStage(_('Delete this entry?'), yes, no, '', uiconfig.baloon_phonebook_icon)
		runtime.manager.stack_stage(stage)

	def handle_call(self, video_call=False):
		from runtime import mmiDebug as MD
		if status.video_mode != status.VideoIdle:
			MD.mmiTrace('PHONEBOOK dialing: cancel(CALL)')
			return
			
		status.dial_number = self.ui.get_priority_number()
		
		MD.mmiTrace('status.dial_number = ', status.dial_number)
		from mmiSoundPath import SP_State, Device, SP_Context
		from dectHandler import DectCallManager
		
		status.videocall_byuser = video_call
		
		dectStatus = runtime.dectCallManager.getDectStatus()
		if status.dial_number and dectStatus == DectCallManager.IDLE:
			spkOffHook = runtime.SP_context.SPK_OffHook(dialNumber=True)
		else:
			spkOffHook = runtime.SP_context.SPK_OffHook(dialNumber=False)
		if spkOffHook.next():
			if spkOffHook.next():
				if dectStatus == DectCallManager.IDLE:
					runtime.mmiDebug.mmiTrace('call start')
					#runtime.vdci_stop_tone()
					runtime.SP_context.stopTonePlay()
					if status.videocall_byuser:
						runtime.manager.start_call(number=status.dial_number, video_call=True)
					else:
						runtime.manager.start_call(number=status.dial_number, video_call=False)
				else:
					if dectStatus == DectCallManager.IDLE:
						runtime.SP_context.speaker.setTone(config.PLAY_DIAL_TONE)				
					else:
						runtime.SP_context.speaker.setTone(config.PLAY_BUSY_TONE)				
					runtime.SP_context.startTonePlay()								
			else:
				if spkOffHook.next():
					status.dial_number = ''
					status.dialed_by_user = False

					#runtime.vdci_stop_tone()
					runtime.SP_context.stopTonePlay()
					runtime.manager.stop_call(IdleStage)
				else:
					spkOffHook.next() # SP_HS_OffHook_SPK_OffHook 상태를 위한 것.
					if dectStatus == DectCallManager.IDLE:
						runtime.SP_context.speaker.setTone(config.PLAY_DIAL_TONE)				
					else:
						runtime.SP_context.speaker.setTone(config.PLAY_BUSY_TONE)				
					runtime.SP_context.startTonePlay()	

		
# KA: [20080311] phonebook UI
class SearchStage(Stage): # ListStage
	name = 'phonebook search stage'
	def __init__(self, group_index=-1, left='', right=_('DELETE'), menu3=_('KOR'), \
				menu4=_('BACK'), unselbarpos=[], myann_flag=False, call_flag=False, vm_flag=False):
		#choice=None, title=None, icon=None, titleimage=None,
		if config.mmi_debug: print 'left=%s, myann_flag=%s, call_flag=%s' %(left, myann_flag, call_flag)
		self.group_index = group_index
		self.choose_move = 0
		self.myann_flag = myann_flag
		self.vm_flag = vm_flag
		self.call_flag = call_flag
		if self.call_flag == True:
			left = ''
		self.choice_updated = False

		# shchun : global automata change		
		if setting.lang == 'Korean':
			menu3=_('KOR')
		else:
			menu3=_('abc')
		# end shchun
		
		self.ui = baseui.SearchUI(left, right, menu3, menu4)
		#self.ui.set_fixed_automata(None, False)
		
		# shchun : global automata change
		# self.ui.set_automata('hangul', False)
		#self.ui.set_fixed_automata(self.ui.list.entrys[0], None, False)
		if setting.lang == 'Korean':
			self.ui.set_automata('hangul', False)
		else:
			self.ui.set_automata('multitap', 'lower')
		#debugLogC('*__init__ automata_idx=', self.ui.automata_idx, ', automata=', self.ui.automata) 	
		#self.set_menu3()
		# end shchun
		
		self.phonedb_indexes, self.choice = self.get_list()

		if self.choice:
			self.ui.set_list(self.choice, unselbarpos)
			self.ui.set_focus(0)
			self.ui.update_info()
		#return self.ui.entry.handle_key(key)
		status.real_phonedb_index =[0]
		self.sortingTimer = None

	def handle_key(self, key):
		# not for general phonebook search but for web phonebook search
		if config.mmi_debug: 
			print '[basemodel.search.HK] key=', key
			print 'self.myann_flag=', self.myann_flag
		if self.myann_flag:
			if key == config.Menu1 or key == 'OK':
				if self.ui.left == _('OK'):
					import myannapp
					if config.myann_debug:
						print '## browser phonebook search is deactivated by', key

					from phonedb import phonedb
					sel_number = self.ui.get_priority_number()
						
					runtime.myannapp.send_mesg(config.EVT_APP_RESUME, 0, sel_number)
					runtime.manager.back_stage()
					myannapp.active_myann()
				return True	
			elif key == config.Menu2:
				return True
			elif key == config.Menu4:
				import myannapp
				if config.myann_debug:
					print '## browser phonebook search is deactivated by', key
					
				runtime.myannapp.send_mesg(config.EVT_APP_RESUME, 1)
				runtime.manager.back_stage()
				myannapp.active_myann()
				return True
			elif key == config.Red:
				import myannapp
				if config.myann_debug:
					print '## browser phonebook search is deactivated by', key
					
				runtime.myannapp.send_mesg(config.EVT_APP_RESUME, 1)
				myannstage = runtime.manager.find_stage('myann')
				myannstage.handle_key(key)
				return True
			elif key == config.OffHook or key == config.Green or key == config.Video:
				import myannapp
				if config.myann_debug:
					print '## browser phonebook search is deactivated by', key
					
				#runtime.myannapp.send_mesg(config.EVT_APP_RESUME, 1)
				myannstage = runtime.manager.find_stage('myann')
				myannstage.handle_key(key)
				return True
				
		if self.vm_flag:
			if key in (config.Red, config.Menu4):
				runtime.manager.back_stage('EaNotifyStage')
				#runtime.eaHandler.sendPhonebookData()
				runtime.eaHandler.closePhonebook()
				return True				
			if key == config.Menu1 or key == 'OK':
				#phonebookList = []
				number = self.ui.get_priority_number()
				name = self.ui.item[0]
				name = unicode(name, 'utf-8').encode('euc-kr')
				phonebookList = (number, name)
				#phonebookList.append((sel_number, sel_name))							
				runtime.eaHandler.closePhonebook()
				runtime.eaHandler.sendPhonebookData(phonebookList)	
				runtime.manager.back_stage('EaNotifyStage')
				return True					
			elif key in (config.Green, config.OffHook, config.Video, config.Menu2):
				return True


		from mmiSoundPath import SP_Context
		from dectHandler import DectCallManager			
		baseCallStatus, baseStatus, dectCallStatus, dectStatus = status.getCurrentCallStatus()
		# print 'ka...## baseCallStatus, baseStatus, dectCallStatus, dectStatus=', baseCallStatus, baseStatus, dectCallStatus, dectStatus
		# Base가 in use...
		if status.video_mode != status.VideoIdle: #and \
			if baseStatus == SP_Context.CONNECTED or (dectStatus == DectCallManager.CONNECTED and baseCallStatus in [SP_Context.OUTGOING_VIDEO, SP_Context.INCOMING_VIDEO]):
				if dectStatus == DectCallManager.CONNECTED:
					if key in (config.Green, config.OnHook):
						return True
				if key in (config.Green, config.Red, config.OffHook, config.OnHook):
					if runtime.manager.find_stage('AudioCallConnected'):
						CallConnetStage = runtime.manager.find_stage('AudioCallConnected')
					else:
						CallConnetStage = runtime.manager.find_stage('VideoCallConnected')
					CallConnetStage.handle_key(key)
					return True
				'''
				if key in (config.Green, config.OffHook):
					stage = NotifyStage(message=_('Change of the sound path is not supported in phonebook'), duration=3000,vm_flag=True )
					runtime.manager.stack_stage(stage)
					return True
				elif key in (config.OnHook, config.Red):
					runtime.SP_context.goIdleState()
					runtime.vdci_send_mesg(code1=config.MESG_HANGUP)
					return True
				'''					
		# Enblcokedit에서 호출된 경우
		if self.call_flag:
			if key in (config.OnHook, config.Red):
				runtime.SP_context.goIdleState()
				runtime.manager.back_stage('idle')
				return True
			elif key in (config.Menu1, config.Menu2, 'OK'):
				return True
				
		if key == 'OK':	# Edit phonebook
			if self.choice[0] == _('No result'):
				return True
			if 0 and config.mmi_debug: 
				print 'status.real_phonedb_index =', status.real_phonedb_index
				print 'len(status.real_phonedb_index) =', len(status.real_phonedb_index)
				print 'self.ui.get_focus()=', self.ui.get_focus()
			if len(status.real_phonedb_index) == 0 or \
				(len(status.real_phonedb_index) == 1 and status.real_phonedb_index[0] == 0):
				status.editing_phone_number_index = self.ui.get_focus()
				status.phone_item = self.ui.get_item()
			else:			
				try:
					index = status.real_phonedb_index[self.ui.get_focus()]	
				except:
					print '&&& status.real_phonedb_index db error'
					index = 0									
				from phonedb import phonedb
				if phonedb.count()<= index:
					index = 0
				if config.mmi_debug: 
					print '## phonedb.db=', phonedb.db
					print '## index=', index				
				status.editing_phone_number_index = index
				status.phone_item = phonedb.get_item(index)
				if config.mmi_debug: 
					print '## status.phone_item=', status.phone_item

			import phonebook 
			stage = phonebook.AddPhoneBookStage
			runtime.manager.stack_stage(stage)
				
		elif key == config.Menu1: # Send message
			# shchun : disable messaging for Telio version.
#			# send SMS
#			if self.choice[0] == _('No result'):
#				return True
#			number= self.ui.get_priority_number()
#			name = self.ui.item[0]
#			from eaHandler import EaHandler				
#			runtime.eaHandler.sendMmsMessageInMmi(number, name)
			return True
		elif key == config.Menu2:
			# delete
			if self.choice[0] == _('No result'):
				return True
			if len(status.real_phonedb_index) == 0 or \
				(len(status.real_phonedb_index) == 1 and status.real_phonedb_index[0] == 0):
				status.editing_phone_number_index = self.ui.get_focus()
				status.phone_item = self.ui.get_item()
			else:				
				try:
					index = status.real_phonedb_index[self.ui.get_focus()]		
				except:
					index = 0
				from phonedb import phonedb
				if phonedb.count()<= index:
					index = 0
				status.editing_phone_number_index = index
				status.phone_item = phonedb.get_item(index)
				if config.mmi_debug: 
					print '## status.phone_item=', status.phone_item
					
			self.delete_item()
			'''
			if self.choose_move == 0:
				self.choose_move = 1
				self.ui.sel_number.file = uiconfig.image_dir  + uiconfig.PB_sel_number_file[1]
			else:				
				self.choose_move = 0
				self.ui.sel_number.file = uiconfig.image_dir  + uiconfig.PB_sel_number_file[0]
			return True
			'''
		elif key == config.Menu3:
			# shchun: global input change
			if setting.lang == 'Korean':
				self.ui.automata_idx = utils.get_automata_idx(*self.ui.automata)	
				self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_hangul)
				
				self.ui.automata = config.automata_list_hangul[self.ui.automata_idx]		
			else:	
				self.ui.automata_idx = utils.get_automata_idx(*self.ui.automata)	
				self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list)
				
				self.ui.automata = config.automata_list[self.ui.automata_idx]			
			self.ui.set_automata(*self.ui.automata)
			# end shchun
			return True		
		elif key == config.Menu4:	#options Menu(left key)
			runtime.manager.back_stage()
			return True
		elif key == 'CLR':	
			text_len = len(self.ui.entry.get_text())
			if text_len > 0:
				#self.ui.entry.backspace()
				self.ui.entry.handle_key('\b')
				text_len = len(self.ui.entry.get_text()) # it's needed because of hangul
				if text_len:
					# soring 속도 향상을 위해 1초 Timer를 둔다.
					self.sortingTimer = None
					self.sortingTimer = utils.Timer(500, self.sort)	
					#self.sorting()
				else:
					'''
					self.phonedb_indexes, self.choice = self.get_list()
					print 'jun================================ self.phonedb_indexes=', self.phonedb_indexes
					print 'jun================================ self.choice=', self.choice
					if self.choice:
						unselbarpos = []
						self.ui.set_list(self.choice, unselbarpos)
						self.ui.set_focus(0)
						self.ui.update_info()
					self.sorting()
					'''
					runtime.manager.back_stage()
					from phonedb import phonedb
					if phonedb.is_empty():
						if self.ui.notify_timer:
							return
						self.ui.notify_msg_show(msg = _('Phonebook empty'))	
					else:
						if self.myann_flag:
							runtime.manager.stack_stage(SearchStage(left=_('OK'), right='', myann_flag=True))
						elif self.vm_flag:
							runtime.manager.stack_stage(SearchStage(left=_('OK'), right='', vm_flag=True))
						else:
							runtime.manager.stack_stage(SearchStage(call_flag=self.call_flag))
			else:
				#self.ui.set_right('')
				if self.myann_flag:
					import myannapp
					if config.myann_debug:
						print '## browser phonebook search is deactivated by', key						
					runtime.myannapp.send_mesg(config.EVT_APP_RESUME, 1)
					runtime.manager.back_stage()
					myannapp.active_myann()
				elif self.vm_flag:
					runtime.manager.back_stage()
					runtime.eaHandler.closePhonebook()				
				else:
					runtime.manager.back_stage()
			# 2008.04.25 TEST 
			#from phonedb import phonedb			
			#index = phonedb.find_by_name_near(self.ui.entry.get_text())
			#self.ui.set_focus(index)
			# 2008.04.25 TEST  ==
			return True	
		elif key == config.LongMenu2:
			if config.mmi_debug: print 'Basemodel.search.handle_key(), pressed *LongMenu2*'
			self.ui.entry.handle_key(key)
			runtime.manager.back_stage()						
			from phonedb import phonedb
			if phonedb.is_empty():
				##CHECKME : IF open the below 3-line, no attribute error happen
				#if self.ui.notify_timer: 
				#	return
				#self.ui.notify_msg_show(msg = _('Phonebook empty'))	
				pass
			else:
				if self.myann_flag:
					runtime.manager.stack_stage(SearchStage(left=_('OK'), right='', myann_flag=True))
				elif self.vm_flag:
					runtime.manager.stack_stage(SearchStage(left=_('OK'), right='', vm_flag=True))
				else:
					runtime.manager.stack_stage(SearchStage(call_flag=self.call_flag))
			return True
		elif key in ('Up', 'Down') or ((self.choose_move ==1) and key in ('Left','Right')):
			#self.ui.set_right('DELETE')
			if self.choice[0] == _('No result'):
				return
			return self.ui.handle_key(key)
		elif key in ('Left','Right'):
			if len(self.ui.entry.get_text()) <= 0:
				return
			else:
				return self.ui.entry.handle_key(key)
		#elif key == config.Red:
		#	runtime.manager.back_stage()
		#	return True
		elif key == config.Green:
			#self.handle_call(False)
			#return True
			#jun -------------------------------- 0723 (QA 2-43)
			if len(status.real_phonedb_index) != 0:
				self.handle_call(False)
				return True
			pass
			#jun -------------------------------- 0723 (QA 2-43)
		elif key == config.Video:
			#self.handle_call(True)
			#return True
			#jun -------------------------------- 0723 (QA 2-43)
			if len(status.real_phonedb_index) != 0:	
				self.handle_call(True)
				return True
			pass
			#jun -------------------------------- 0723 (QA 2-43)
		#elif key == config.OffHook:
			#if self.call_flag or status.video_mode != status.VideoIdle:
			#	return True
		#	pass
		elif key == config.OnHook:
		#	if baseStatus == SP_Context.IDLE and dectStatus == DectCallManager.IDLE:
		#		#runtime.SP_context.goIdleState()
			runtime.manager.back_stage('idle')
			return True
		elif key == config.Red:
			#if baseStatus == SP_Context.IDLE and dectStatus == DectCallManager.IDLE:
			#	#runtime.SP_context.goIdleState()
			runtime.manager.back_stage('idle')
			return True
		elif key in (config.VideoMute, config.HookFlash, config.Transfer, config.MyAnn, config.Camera):
			return True
		
		else:
			result = self.ui.entry.handle_key(key)
			# soring 속도 향상을 위해 1초 Timer를 둔다.
			self.sortingTimer = None
			self.sortingTimer = utils.Timer(500, self.sort)			
			return result
			
	def sort(self):
		self.sortingTimer = None
		self.sorting()
		
	def sorting(self):
		initFlag = False
		text = self.ui.entry.get_text()
		no_result = False
		if config.mmi_debug: print '##len(text)=', len(text)
		if len(text) == 0:
			self.choice = _('No result'),
			initFlag = True
			if self.myann_flag or self.vm_flag:
				self.ui.set_left(_('OK'))
				self.ui.set_right('')
			else:
				#self.ui.set_left(_('MSG_SEND'))
				self.ui.set_right(_('DELETE'))
		else:
			#print 'ka........####### self.ui.entry.is_cursor_show=', self.ui.entry.is_cursor_show()
			from phonedb import phonedb
			choice = phonedb.get_phonelist_by_text(text)
			if 0 and config.mmi_debug: 
				print '## choice=', choice
				print '## status.real_phonedb_index=', status.real_phonedb_index
			if choice:
				self.choice = choice
				if self.myann_flag or self.vm_flag:
					self.ui.set_left(_('OK'))
					self.ui.set_right('')
				elif self.call_flag:
					self.ui.set_left('')
					self.ui.set_right('')				
				else:
					#self.ui.set_left(_('MSG_SEND'))
					self.ui.set_right(_('DELETE'))
			else:
				#initFlag = True
				self.choice = _('No result'),
				self.ui.set_left('')
				self.ui.set_right('')
				status.real_phonedb_index = []
				no_result = True

		self.ui.update_lists(self.choice)
		self.choice_updated = True
		#self.ui.set_focus(0)
		self.ui.update_info(initFlag, no_result)		
		Stage.show(self)

	def activate_menu1(self):
		# 'Find'
		text = self.ui.get_text()
		self.update_phonelist(text)

	def update_phonelist(self, text):
		if len(self.choice) == 0:
			return
		# focus를 맨 위로 보내기위해서
		if type(text) == type(''):
			if text:
				from phonedb import phonedb
				focus = phonedb.find_by_name_near(text, self.phonedb_indexes)

			else:
				focus = 0
		self.ui.set_focus(0)
		self.ui.set_focus(focus)
		self.change_choice(self.choice)

	def get_list(self):
		from phonedb import phonedb
		if config.mmi_debug:
			print '## group_index=', self.group_index
		if self.group_index >= 0:
			phonedb.load_group_db_new(self.group_index)
			status.real_phonedb_index = phonedb.group_db_index
			return phonedb.group_db_index, phonedb.get_names_by_group_new()
		else:
			#phonedb.load_db()
			#print 'ka....phonedb.get_names()=', phonedb.get_names()
			return range(phonedb.count()), phonedb.get_names()
	
	def show(self):
		self.phonedb_indexes, self.choice = self.get_list()
		if 0 and config.mmi_debug: 
			print '## self.phonedb_indexes=', self.phonedb_indexes
			print '## self.choice=', self.choice
		if len(self.phonedb_indexes) == 0:
			import phonebook 
			stage = phonebook.PhonebookNotifyStage(_('Group is empty'))
			runtime.manager.change_stage(stage)
			return
		self.ui.update_lists(self.choice)
		self.choice_updated = False
		#self.ui.set_focus(0)
		self.ui.update_info()

		if self.ui.entry.get_text():
			self.sorting()
		else:
			if self.group_index == -1:
				if config.mmi_debug: print '@@@@ initialize status.real_phonedb_index=[]'
				status.real_phonedb_index = [0]
		if 0 and config.mmi_debug: print '## status.real_phonedb_index =', status.real_phonedb_index 
		Stage.show(self)
		if self.call_flag:
			self.ui.set_left('')
			self.ui.set_right('')
		if self.vm_flag:
			self.ui.set_left(_('OK'))
			self.ui.set_right('')		
		
	def hide(self):
		self.ui.hide()
		self.sortingTimer = None
		
	def destroy(self):
		Stage.destroy(self)
		self.sortingTimer = None
		status.editing_phone_number_index = -1
		status.phone_item = None
		if self.group_index >= 0:
			from phonedb import phonedb
			phonedb.load_db()

	def delete_item(self):
		def yes():
			# Delete This Item
			from phonedb import phonedb
			from speeddb import speeddb
			
			name = phonedb.get_sym_name(status.editing_phone_number_index)
			
			pb_item = phonedb.get_item(status.editing_phone_number_index)
			speeddb.clear_speed_num(pb_item[6])
			
			phonedb.remove(status.editing_phone_number_index)
			
#			stage = runtime.manager.find_stage('phone list')
#			stage.refresh_lists()
			if phonedb.is_empty():
				'''
				if runtime.manager.find_stage('phonebook'):
					runtime.manager.back_stage('phonebook')
				else:
					runtime.manager.queue_backward(3)
				stage = NotifyStage(_('Entry deleted') + '\n' + _('Phonebook empty'), uiconfig.baloon_phonebook_icon)
				runtime.manager.stack_stage(stage)
				'''
				if runtime.manager.find_stage('phonebook'):
					runtime.manager.back_stage('phonebook')
				else:
					from model import IdleStage
					runtime.manager.change_stage(IdleStage, True)
				stage = NotifyStage(_('Phonebook empty'), uiconfig.baloon_phonebook_icon)
				runtime.manager.stack_stage(stage)
				stage = NotifyStage(_('Entry deleted'), uiconfig.baloon_phonebook_icon)
				runtime.manager.stack_stage(stage)
			else:
				stage = NotifyStage(_('Entry deleted'),uiconfig.baloon_phonebook_icon)
				runtime.manager.change_stage(stage)
			return

		def no():
			runtime.manager.back_stage()
			
		stage = YesNoStage(_('Delete this entry?'), yes, no, '', uiconfig.baloon_phonebook_icon)
		runtime.manager.stack_stage(stage)

	def handle_call(self, video_call=False):
		from runtime import mmiDebug as MD
		if status.video_mode != status.VideoIdle:
			MD.mmiTrace('PHONEBOOK dialing: cancel(CALL)')
			return
			
		status.dial_number = self.ui.get_priority_number()
		if not status.dial_number:
			return
			
		runtime.mmedia.unload()		
		MD.mmiTrace('status.dial_number = ', status.dial_number)
		from mmiSoundPath import SP_State, Device, SP_Context
		from dectHandler import DectCallManager
		
		status.videocall_byuser = video_call
		
		dectStatus = runtime.dectCallManager.getDectStatus()
		if status.dial_number and dectStatus == DectCallManager.IDLE:
			spkOffHook = runtime.SP_context.SPK_OffHook(dialNumber=True)
		else:
			spkOffHook = runtime.SP_context.SPK_OffHook(dialNumber=False)
		if spkOffHook.next():
			if spkOffHook.next():
				if dectStatus == DectCallManager.IDLE:
					runtime.mmiDebug.mmiTrace('call start')
					#runtime.vdci_stop_tone()
					runtime.SP_context.stopTonePlay()
					runtime.SP_context.setBaseStatus(SP_Context.DIALING)
					if status.videocall_byuser:
						runtime.manager.start_call(number=status.dial_number, video_call=True)
					else:
						runtime.manager.start_call(number=status.dial_number, video_call=False)
				else:
					if dectStatus == DectCallManager.IDLE:
						runtime.SP_context.speaker.setTone(config.PLAY_DIAL_TONE)				
					else:
						runtime.SP_context.speaker.setTone(config.PLAY_BUSY_TONE)				
					runtime.SP_context.startTonePlay()								
			else:
				if spkOffHook.next():
					status.dial_number = ''
					status.dialed_by_user = False

					#runtime.vdci_stop_tone()
					runtime.SP_context.stopTonePlay()
					runtime.manager.stop_call(IdleStage)
				else:
					spkOffHook.next() # SP_HS_OffHook_SPK_OffHook 상태를 위한 것.
					if dectStatus == DectCallManager.IDLE:
						runtime.SP_context.speaker.setTone(config.PLAY_DIAL_TONE)				
					else:
						runtime.SP_context.speaker.setTone(config.PLAY_BUSY_TONE)				
					runtime.SP_context.startTonePlay()	
					
# KA: [20080311] phonebook UI ==

#Thang: [20080502-1] phonebook UI

class ExtPhotoGalleryCheckListStage(Stage):
	def __init__(self,choice=None, titleimage=None):
		if choice == None:
			choice = self.choice		
		self.ui = baseui.PhotoGalleryCheckList(_('COPY'), _('SELECT'),'',_('BACK'), titleimage)
		self.ui.set_list(choice)

	def handle_key(self, key):
		if key == config.ok or key == config.Menu2:
			self.ui.toggle()
			return True
		elif key == config.Menu4:			
			runtime.manager.back_stage()
			return True
		return self.ui.handle_key(key)

class PhotoGalleryCheckListStage(Stage):
	def __init__(self,choice=None):
		if choice == None:
			choice = self.choice		
		self.ui = baseui.PhotoGalleryCheckList(_('MENU'), _('SELECT'),_('LARGE'),_('BACK'))
		self.ui.set_list(choice)

	def handle_key(self, key):
		if key == config.Menu2 or key == 'OK':
			self.ui.toggle()
			return True
		elif key == config.Menu4 or key == 'CLR':			
			runtime.manager.back_stage()
			return True
		return self.ui.handle_key(key)

class SlideshowSelectCheckListStage(Stage):
	def __init__(self,choice=None, titleimage=None):
		if choice == None:
			choice = self.choice		
		self.ui = baseui.PhotoGalleryCheckList(_('SET'), _('SELECT'),'',_('BACK'), titleimage)
		self.ui.set_list(choice)

	def handle_key(self, key):
		if key == config.Menu2 or key == 'OK':
			self.ui.toggle()
			return True
		elif key == config.Menu4 or key == 'CLR':		
			runtime.manager.back_stage()
			return True
		return self.ui.handle_key(key)

class GaugeStage(Stage):
	def __init__(self, value, title=None, titleimage=None):
		if title == None:
			title = self.title
		if titleimage == None:
			try:
				titleimage = self.titleimage
			except:
				titleimage = None
		self.ui = baseui.GaugeUI(_('SAVE'), '','',_('BACK'),titleimage, title=title)
		self.ui.set_value(value)

	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			self.activate(self.ui.get_value())
		elif key == config.Menu4 or key == 'CLR':
			# Back
			runtime.manager.back_stage()
		elif key in ('Up', 'Down', 'Right', 'Left'):
			self.ui.handle_key(key)
		else:
			return False
		return True

class YesNoStage(Stage):
	def __init__(self, message, yes_cb, no_cb, title, icon):
		self.ui = baseui.YesNoUI(title, message, icon)
		self.yes_cb = yes_cb
		self.no_cb = no_cb

	def handle_key(self, key):
		if key == config.Menu2: self.yes_cb()
		elif key == config.Menu3: self.no_cb()
		else: return False
		return True

class OkNoStage(YesNoStage):
	def __init__(self, message, yes_cb, no_cb, title, icon):
		self.ui = baseui.OkNoUI(title, message, icon)
		self.yes_cb = yes_cb
		self.no_cb = no_cb

class EntryStage(Stage):
	def __init__(self, sub_label, title, left=_('OK'), right='', ismms=False, menu3='', menu4=_('BACK'), need_hangul=True):
		self.ui = baseui.EntryUI(left, right, title, sub_label, ismms, menu3, menu4, need_hangul)
		self.set_fixed_automata(None, False)

	def show(self):
		status.editing = True
		Stage.show(self)

	def hide(self):
		status.editing = False
		Stage.hide(self)

	def destroy(self):
		status.editing = False
		Stage.destroy(self)

	def set_fixed_automata(self, name, casemode):
		self.ui.set_fixed_automata(name, casemode)

	def t9_add_word(self, word):
		self.ui.entry.t9_add_word(word)
		self.ui.update_entry_info()

	def insert_symbol(self, s):
		before_text = self.ui.get_text()
		self.ui.insert_text(s)
		after_text = self.ui.get_text()
		if before_text == after_text:
			runtime.manager.change_stage(NotifyStage(_('Max length exceeded'), uiconfig.baloon_message_icon))
		else:
			runtime.manager.back_stage()

	def is_valid_email(self):
		t = self.ui.get_text()
		if t.find('@') >= 0 and t.find('.') >= 0:
			return True
		return False

	def activate_menu2(self):
		runtime.manager.back_stage()

	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			if self.ui.is_t9_add_word_mode():
				runtime.manager.stack_stage(T9AddWordStage(self))
			else:
				self.ui.reset_automata()
				self.activate_menu1()
			return True
		elif key == config.Menu4:
			runtime.manager.back_stage()
			return True
		else:
			return self.ui.handle_key(key)
		return False


# KA: [20070121] phonebook UI
class PhoneBookEntryStage(Stage):
	def __init__(self, sub_label, title, left=_('OK'), right=_('BACK'), menu3='', menu4=''):
		self.ui = baseui.PhoneBookUI(left, right, title, menu3, menu4)
		self.set_fixed_automata(None, False)

	def show(self):
		status.editing = True
		Stage.show(self)

	def hide(self):
		status.editing = False
		Stage.hide(self)

	def destroy(self):
		status.editing = False
		Stage.destroy(self)

	def set_fixed_automata(self, name, casemode):
		self.ui.set_fixed_automata(name, casemode)

	def t9_add_word(self, word):
		self.ui.entry.t9_add_word(word)
		self.ui.update_entry_info()

	def insert_symbol(self, s):
		before_text = self.ui.get_text()
		self.ui.insert_text(s)
		after_text = self.ui.get_text()
		if before_text == after_text:
			runtime.manager.change_stage(NotifyStage(_('Max length exceeded'), uiconfig.baloon_message_icon))
		else:
			runtime.manager.back_stage()

	def is_valid_email(self):
		t = self.ui.get_text()
		if t.find('@') >= 0 and t.find('.') >= 0:
			return True
		return False

	def activate_menu2(self):
		runtime.manager.back_stage()

	def set_focus(self):
		focus = 0
		max_entry = 2
		self.ui.entry = self.ui.entry_total[focus+1]

	def show_cursor(self, show):
		if show:
			if not self.cursor:
				import cursor
				self.cursor = cursor.Cursor(self)
				self.add(self.cursor)
		else:
			if self.cursor:
				self.remove(self.cursor)
				self.cursor.free()
				self.cursor = None

	def handle_key(self, key):
		if key == 'Up' or key == 'Down':
			self.set_focus()		

	
		if key == config.Menu1:
			if self.ui.is_t9_add_word_mode():
				runtime.manager.stack_stage(T9AddWordStage(self))
			else:
				self.ui.reset_automata()
				self.activate_menu1()
			return True
		elif key == config.Menu2:
			if self.ui.handle_key(key):
				return True
			if self.ui.right == _('BACK'):
				runtime.manager.back_stage()
				return True
			else:
				self.activate_menu2()
				return True
		else:
			return self.ui.handle_key(key)
		return False
# KA: [20070121] phonebook UI ==


#ka...phonebook 2006.10.12
class EntryNumberStage(Stage):
	def __init__(self, sub_label, title, left=_('OK'), right=_('PHONEBOOK'), ismms=False, org_stage=''):
		self.ui = baseui.EntryUI(left, right, title, sub_label, ismms)
		self.org_stage = org_stage
		
	def activate_menu2(self):
		runtime.manager.back_stage()
	
	def handle_key(self, key):
		if key == config.Menu1:
			self.ui.reset_automata()
			self.activate_menu1()
			return True
		elif key == config.Menu2:
			if self.ui.handle_key(key):
				return True
			if self.ui.right == _('PHONEBOOK'):
				from phonedb import phonedb
				if phonedb.is_empty():
					runtime.manager.stack_stage(NotifyStage(_('Phonebook empty'), uiconfig.baloon_phonebook_icon))
					return
				from phonebook import SearchPhoneBookStage
				runtime.manager.stack_stage(SearchPhoneBookStage(self.org_stage))
				return True
			else:
				self.activate_menu2()
		else:
			return self.ui.handle_key(key)
		
		return False


class NotifyStage(Stage):
	agenda_forbidden = True
	def __init__(self, message, icon=None, cb=None, duration=0, isred=True, vm_flag=False):
		status.supervision_not_allowed = 1
		self.isred = isred
		self.vm_flag = vm_flag
		self.ui = baseui.NotifyUI(message, icon)
		# 지정된 시간이 지나면 이전 화면으로 돌아감.
		def destroy():
			status.supervision_not_allowed = 0
			runtime.manager.back_stage()
			return False

		self.cb = cb or destroy
		self.duration = duration or uiconfig.notify_duration

	def show(self):
		# RHC / [20060925_1]
		status.supervision_not_allowed = 1
		# RHC / [20060925_1]--
		def run_cb():
			self.destroy_tag = 0
			self.cb()
		self.destroy_tag = utils.Timer(self.duration, run_cb)
		Stage.show(self)
		if self.duration == 1:
			runtime.evas.render_now()

	def hide(self):
		self.destroy_tag = None
		Stage.hide(self)

	def handle_key(self, key):
		if self.vm_flag:
			return True
		if key == config.Red or key == config.CLEAR:
			if not self.isred:
				return True
			self.destroy_tag = 0
			self.cb()
			return True
		return Stage.handle_key(self, key)

	def destroy(self):
		status.supervision_not_allowed = 0
		Stage.destroy(self)
		self.destroy_tag = 0


# KA: [20080403] snmp UI 
class FullNotifyStage(Stage):
	agenda_forbidden = True
	def __init__(self, message, icon, cb=None, duration=0, isred=True):
		status.supervision_not_allowed = 1
		self.isred = isred
		self.ui = baseui.FullNotifyUI(message, icon)
		# 지정된 시간이 지나면 이전 화면으로 돌아감.
		def destroy():
			status.supervision_not_allowed = 0
			runtime.manager.back_stage()
			return False

		self.cb = cb or destroy
		self.duration = duration or uiconfig.notify_duration

	def show(self):
		# RHC / [20060925_1]
		status.supervision_not_allowed = 1
		# RHC / [20060925_1]--
		def run_cb():
			self.destroy_tag = 0
			self.cb()
		self.destroy_tag = utils.Timer(self.duration, run_cb)
		Stage.show(self)
		if self.duration == 1:
			runtime.evas.render_now()

	def hide(self):
		self.destroy_tag = None
		Stage.hide(self)

	def handle_key(self, key):
		if key == config.Red:
			if not self.isred:
				return True
			self.destroy_tag = 0
			self.cb()
			return True
		return Stage.handle_key(self, key)

	def destroy(self):
		status.supervision_not_allowed = 0
		Stage.destroy(self)
		self.destroy_tag = 0
# KA: [20080403] snmp UI ==


class SetDateStage(Stage):
	def __init__(self, title, date, done_cb, icon=None):
		self.ui = ui.DateEditUI(title, _('Set date'), date, icon)
		self.done_cb = done_cb

	def handle_key(self, key):
		if key == config.Menu1:
			if self.ui.handle_key(key):
				year, mon, day = self.ui.date
				self.done_cb((year, mon, day))
				return True
		else:
			return self.ui.handle_key(key)


class TerminalNumberStage(Stage):
	def __init__(self, our_terminal, issetting=False):
		self.issetting = issetting

		self.ui = ui.DigitEditUI(' ', _('TERMINAL NUMBER'), _('Number')+ ': ')
		self.our_terminal = our_terminal
		if our_terminal:
			self.ui.handle_key(setting.terminal_number)
			self.ui.set_right(_('BACK'))
		else:
			if status.callee_terminal_number:
				self.ui.handle_key(status.callee_terminal_number)
				self.ui.set_right(_('DELETE'))
			else:
				self.ui.set_right(_('BACK'))

	def activate_menu1(self):
		if len(self.ui.get_text()) == 0 and not self.our_terminal:
			status.callee_terminal_number = self.ui.get_text()
			if self.issetting:
				icon = uiconfig.baloon_message_setting_icon
			else:
				icon = uiconfig.baloon_message_icon
			stage = NotifyStage(_('Terminal number not set!'), icon)
			runtime.manager.change_stage(stage)

		elif len(self.ui.get_text()) >= 1:
			if self.our_terminal:
				setting.terminal_number = self.ui.get_text()
			else:
				status.callee_terminal_number = self.ui.get_text()
			if self.issetting:
				icon = uiconfig.baloon_message_setting_icon
			else:
				icon = uiconfig.baloon_message_icon
			stage = NotifyStage(_('Terminal number set!'), icon)
			runtime.manager.change_stage(stage)

	def activate_menu2(self):
		runtime.manager.back_stage()

	def handle_key(self, key):
		if key in '123456789':
			self.ui.handle_key(key)
			if not self.our_terminal:
				self.ui.set_right(_('CLEAR'))
			else:
				self.ui.set_right(_('BACK'))
			return True
		elif key == config.Menu1:
			self.activate_menu1()
			return True
		elif key == config.Menu2:
			if self.ui.get_text() and not self.our_terminal:
				self.ui.delete_char()
				return True

			self.activate_menu2()
			return True
		return False


class SetTimeStage(Stage):
	def __init__(self, title, hourmin, done_cb):
		self.ui = ui.TimeEditUI(title, _('Set time'), hourmin)
		self.done_cb = done_cb

	def handle_key(self, key):
		if key == config.Menu1:
			self.done_cb(self.ui.time)
			return True
		else:
			return self.ui.handle_key(key)


class GalleryStage(Stage):
	def __init__(self, image_list, selected, done_cb):
		self.lists = image_list
		self.done_cb = done_cb
		self.current = selected
		self.ui = baseui.GalleryUI(_('OK'),_('BACK'),_('GALLERY - VIEW'))
		if self.current >= 0:
			self.ui.set_preview(self.get_current_file())

	def get_current_file(self):
		return self.base_dir + self.lists[self.current]

	def handle_key(self, key):
		if key == config.Menu1:
			self.done_cb(self.current)
		elif key == config.Menu2:
			runtime.manager.back_stage()
		elif key == 'Up':
			if self.current > 0:
				self.current -= 1
			else:
				self.current = len(self.lists) - 1
			self.ui.set_preview(self.get_current_file())
		elif key == 'Down':
			if self.current < len(self.lists) - 1:
				self.current += 1
			else:
				self.current = 0
			self.ui.set_preview(self.get_current_file())
		else:
			return False
		return True
	def show(self):
		self.ui._show_arrow = len(self.lists) > 1
		Stage.show(self)


class PINInputStage(Stage):
	def __init__(self, left, right, menu3, menu4):
		self.ui = ui.PINInputUI(_('OK'), '', '', _('BACK'))
		self.password_reset_password = '123456789012'
		self.input_key = ''
		
	def handle_key(self, key):
		if key == config.Menu1 or key == 'OK':
			self.activate(self.ui.pin)
			self.ui.reset()
		elif key == config.Menu2 or key == 'CLR':
			if len(self.ui.pin) > 0:
				self.ui.delete_backward()
			elif key == 'CLR':
				runtime.manager.back_stage()
		elif key == config.Menu4:
			runtime.manager.back_stage()
		else:
			self.input_key += key
			if self.input_key == self.password_reset_password:
				self.activate(self.input_key)
			else:
				self.ui.handle_key(key)
			
	def show(self):
		Stage.show(self)

		
class RichTextStage(Stage):
	def __init__(self, title, left=_('OK'), right=_('BACK'), text_font=uiconfig.richtext_font, text_color=uiconfig.richtext_color):
		self.ui = baseui.RichTextUI(left, right, title, '', text_font, text_color)

	def set_text(self, text):
		self.ui.set_text(text)

	def activate_menu1(self):
		pass

	def activate_menu2(self):
		pass

	def handle_key(self, key):
		if key == config.Menu1:
			self.activate_menu1()
		elif key == config.Menu2:
			self.activate_menu2()
		else:
			return self.ui.handle_key(key)
		return True


class T9MessageNotify(NotifyStage):
	def __init__(self, msg):
		NotifyStage.__init__(self, msg, uiconfig.baloon_message_icon)

class T9AddWordStage(EntryStage):
	def __init__(self, editstage):
		EntryStage.__init__(self,_('Add word'), '', left=_('OK'), right=_('BACK'))
		self.ui.set_max(32)
		self.set_fixed_automata('multitap_addword', 'lower')
		self.editstage = editstage

	def activate_menu1(self):
		if self.ui.get_text():
			try:
				self.editstage.t9_add_word(self.ui.get_text())
			except StorageFullError:
				runtime.manager.change_stage(T9MessageNotify(_('T9 Storage is full')))
				return
		runtime.manager.back_stage()


class RichTextEditStage(Stage):
	def __init__(self, title, small_title = '', left=_('OK'), right=_('BACK'), isenter=True):
		self.isenter = isenter
		self.ui = baseui.RichTextEditUI(left, right, title, small_title)
		self.ui.set_automata(*utils.get_def_automata())			#입력 방식 설정
		self.ui.automata_idx = utils.get_def_automata_idx()			#입력 방식 index

	def show(self):
		status.editing = True	#입력 중 show 상태인가 hide상태인가?
		Stage.show(self)

	def hide(self):
		status.editing = False
		Stage.hide(self)

	def destroy(self):
		status.editing = False
		Stage.destroy(self)

	def get_text(self):
		return self.ui.get_text()

	def activate_menu2(self):
		runtime.manager.back_stage()

	def t9_add_word(self, word):
		self.ui.edit.t9_add_word(word)

	def insert_symbol(self, s):
		before_text = self.ui.get_text()
		self.ui.insert_text(s)
		after_text = self.ui.get_text()
		if before_text == after_text:
			runtime.manager.change_stage(NotifyStage(_('Max length exceeded'), uiconfig.baloon_message_icon))
		else:
			runtime.manager.back_stage()

	def handle_key(self, key):
		if key == config.Menu1:	#options Menu(left key)
			if self.ui.is_t9_add_word_mode():
				runtime.manager.stack_stage(T9AddWordStage(self))
				return True
			self.ui.reset_automata()
			self.activate_menu1()
		elif key == config.Menu2:
			if self.ui.handle_key(key):
				return True
			if self.ui.right == _('BACK'):
				runtime.manager.back_stage()
				return True
			else:
				self.activate_menu2()
		elif key == config.Menu3 and not self.ui.is_t9_editing_mode():
			self.ui.reset_automata()
			runtime.manager.stack_stage(SymbolSelectionStage(self, True))
			return self.ui.handle_key(key) # Automata.handle_key에서 한글 입력후에 Editing mode를 0 으로 만든다. 
# KA: [20070831] hangul lvp-2000
		elif key == config.Menu4:
			if self.ui.is_t9_add_word_mode():
				return True
			# vpark 2006.08.28 automata
			self.ui.automata_idx = utils.get_automata_idx(*self.ui.automata)
			if setting.lang == 'Korean':
				self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_hangul)
				self.ui.automata = config.automata_list_hangul[self.ui.automata_idx]		
			else:	
				self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list)	
				self.ui.automata = config.automata_list[self.ui.automata_idx]		

			self.ui.set_automata(*self.ui.automata)		
# KA: [20070831] hangul  lvp-2000 ==
		else:
			return self.ui.handle_key(key)

		return True


class SymbolSelectionStage(Stage):
	def __init__(self, edit, isentry=False, case=-1):
		self.ui = baseui.SymbolSelectionUI(isentry, case)
		self.edit = edit

	def handle_key(self, key):
		if self.ui.handle_key(key):
			return True
		if key == config.Menu1 or key == 'OK':
			c = self.ui.get_symbol()
			self.edit.insert_symbol(c)
			return True
		elif key == config.Menu4 or key == config.Menu3:
			runtime.manager.back_stage()
			return True
		elif key == config.OnHook or key == config.Red:
			from mmiSoundPath import SP_State, Device, SP_Context
			from dectHandler import DectCallManager		
			baseCallStatus, baseStatus, dectCallStatus, dectStatus = status.getCurrentCallStatus()
			if baseStatus == SP_Context.CONNECTED or dectStatus == DectCallManager.CONNECTED:
				if runtime.manager.find_stage('AudioCallConnected'):
					runtime.manager.back_stage('AudioCallConnected')
				elif runtime.manager.find_stage('VideoCallConnected'):
					runtime.manager.back_stage('VideoCallConnected')
				else:
					return False
				runtime.SP_context.goIdleState()
				runtime.vdci_send_mesg(code1=config.MESG_HANGUP)
				return True
			else:
				if runtime.manager.find_stage( 'enblock edit'):
					runtime.manager.back_stage('enblock edit')
					return True
				else:
					return False
		return False