Newer
Older
Import / projects / LGN-IP3870 / t / orig / controls.py
import uiconfig,utils,config,runtime
from richtext import RichTextBase, pop, TAG_TEXT
from richtextedit import EditBase
from widget import Widget,ListLabel,CallbackWidget
from automata import Automata, Automata_ko, T9Automata, NumericAutomata, AddWordAutomata, LOWERCASE
from entry import EntryRichText

class Label_Control(Widget):
	def __init__(self, text, font, pos, color, align=uiconfig.ALIGN_LEFT):
		Widget.__init__(self)
		self.align = align
		self.pos = pos
		self.color = color
		self.font = font
		self.RealText = text
		self._text = utils.get_real_lang_str(text)
		self.text_width = 0
		self.set_text(text)

	def get_text_width(self):
		etext = runtime.evas.text(text=self._text, font=self.font, color=self.color)
		self.text_width = etext.geometry[2]
		etext.free()
		return self.text_width

	def set_text(self, text, with_punc = True):
		self.free()
		self.children = []

		x, y = self.pos

		lang_text = utils.get_real_lang_str(text)
		if with_punc:
			text = utils.cut_text_with_punc(lang_text, uiconfig.item_width_scroll, uiconfig.list_font)[0]
		else:
			text = utils.cut_text(lang_text, uiconfig.item_width_scroll, uiconfig.list_font)[0]

		etext = runtime.evas.text(text=text, font=self.font,color=self.color)
		geometry = etext.geometry
		etext.pos = x, y
		self.children.append(etext)
		y += etext.geometry[3]
		if etext and not self.hidden:
			self.show()
			
	def get_text(self):
		return self.text

	def set_font(self,font):
		self.font = font

	def get_font(self):
		return self.font
		
	def set_background(self,bgImage = None):
		self.bg.free()
		self.bg = utils.put_image(bgImage,self.pos)
		self.children.append(self.bg)
		
	def set_position(self,x,y):
		self.pos = x,y

	def get_position(self):
		return self.pos
		
	def set_color(self, color):
		self.color = color
		for w in self.children:
			w.color = color

	def get_color(self):
		return self.color


class ListBox_Control(Widget):
	def __init__(self, choose, index, font, pos, color, mode=uiconfig.LIST_MODE_LONG): #align=uiconfig.ALIGN_LEFT):
		Widget.__init__(self)
		#self.align = align
		self.mode = mode
		self.pos = pos
		self.color = color
		self.font = font
		
		self.do_scroll = False

		# for long file name
		self.org_label = None
		self.temp_text = None
		self.item_scroll_timer = None
		
		if self.mode == uiconfig.LIST_MODE_SMALL: # don't use (will be change)
			self.img = uiconfig.normal_icon_select
			self.center_pos = (pos[0]+92, pos[1]+16-self.font[1]/2-2)
			self.scroll_width = uiconfig.item_width_scroll_medium
		elif self.mode == uiconfig.LIST_MODE_MEDIUM:
			self.img = uiconfig.normal_icon_select
			self.center_pos = (pos[0]+92, pos[1]+16-self.font[1]/2-2)
			self.scroll_width = uiconfig.item_width_scroll_medium
		else:
			self.img = uiconfig.PB_select_list[0]
			self.center_pos = (pos[0]+128, pos[1]+16-self.font[1]/2-2)
			self.scroll_width = uiconfig.item_width_scroll
			
		if choose:
			self.choose = choose
		else:
			self.choose = []
		self.index = index
		self._text = utils.get_real_lang_str(self.choose[self.index])
		self.text_width = 0	
		self.setText(self.choose[self.index])
			
	def setPosition(self, position):
		self.position = position

	def addPostionItem(self, item):		
		self.choose.append(item)
	#I need this function, don't delete if merge
	def InsertItem(self, item):
		self.choose.append(item)

	def reset(self):
		self.choose = []
		
	def get_text_width(self):
		etext = runtime.evas.text(text=self._text, font=self.font, color=self.color)
		self.text_width = etext.geometry[2]
		etext.free()
		return self.text_width
		
	def align_center(self, l, pos):
		x, y = pos
		width,height = l.size
		l.move(x - width/2, y)

	# for long file name
	def scroll_item_timer_cb(self):
		try:
			# KA: [20070921] this conversion is required for Korean text
			#if ord(self.temp_text[0]) > 127:
			latin_char = True
			
			if type(self.temp_text) == type('abc'):
				self.temp_text = unicode(self.temp_text, 'utf-8')[1:]
			else:
				self.temp_text = self.temp_text[1:]
			self.temp_text = self.temp_text.encode('utf-8')				
		except:
			self.temp_text = ''

		if len(self.temp_text) == 0:
			self.temp_text = self.org_label

		abbr_text = self.set_scroll_text(self.temp_text, self.scroll_width)
		self.etext.text_set(abbr_text)
		runtime.evas.render()
		return True

	def set_scroll_text(self, item_text, abbr_width):
		if abbr_width > 0:
			abbr_text = utils.cut_text(item_text, abbr_width, uiconfig.alarm_font)[0]
			return abbr_text
		else:
			return item_text

	def is_scroll_item(self, item_text):
		etext = runtime.evas.text(text=item_text, font=uiconfig.alarm_font)
		text_width = etext.geometry[2]
		etext.free()

		if text_width > uiconfig.bell_width_scroll:
			return True
		else:
			return False
	
	def remove_item_scroll_timer(self):
		if self.item_scroll_timer:
			del(self.item_scroll_timer)
			self.item_scroll_timer = None
			self.scroll_text = None
			self.temp_text = None
		self.etext.text_set(self.check_scroll_text(self.org_label))

	def check_scroll_text(self, item_text):
		if self.is_scroll_item(item_text):
			text = utils.cut_text(item_text, self.scroll_width, uiconfig.list_font)[0]
			self.do_scroll = True
			self.org_label = self.temp_text = item_text
		else:
			self.do_scroll = False
			text = item_text

		return text

	def setText(self, text, with_punc = True):
		self.free()
		self.children = []
		x, y = self.pos
		self.image = utils.put_image(self.img,self.pos)#,uiconfig.pb_entry_size)
		self.children.append(self.image)
		# text = unicode(text, 'euc-kr').encode('utf-8')
		lang_text = utils.get_real_lang_str(text)

		self.etext = runtime.evas.text(text=self.check_scroll_text(lang_text), font=self.font,color=self.color)
		
		geometry = self.etext.geometry
		self.etext.pos = x + 30, y+16-self.font[1]/2-2
		self.children.append(self.etext)
		
		y += self.etext.geometry[3]
		if self.etext and not self.hidden:
			self.align_center(self.etext, self.center_pos)
			self.show()

	# KA: [20080412] change_choices
	def change_choice(self, choice):
		if choice:
			self.choose = choice
		else:
			self.choose = [_('None'),]
		self.index = 0
		
		#self.etext.text_set(self.choose[self.index])		
		self.etext.text_set(self.check_scroll_text(self.choose[self.index]))
		self.align_center(self.etext, self.center_pos)

			
	def handle_key(self,key):
		if key == 'Left':
			if self.item_scroll_timer:
				del(self.item_scroll_timer)
				self.item_scroll_timer = None
				self.scroll_text = None
				self.temp_text = None
			self.index -= 1
			if self.index < 0:self.index = len(self.choose) - 1
			text = self.choose[self.index]
			# text = unicode(text, 'euc-kr').encode('utf-8')
			self.etext.text_set(self.check_scroll_text(text))
			self.align_center(self.etext, self.center_pos)
			if self.do_scroll:
				self.item_scroll_timer = utils.Timer(1000, self.scroll_item_timer_cb)

			return True
		elif key == 'Right':
			if self.item_scroll_timer:
				del(self.item_scroll_timer)
				self.item_scroll_timer = None
				self.scroll_text = None
				self.temp_text = None
			self.index += 1
			if self.index > len(self.choose) - 1:self.index = 0
			text = self.choose[self.index]
			# text = unicode(text, 'euc-kr').encode('utf-8')
			self.etext.text_set(self.check_scroll_text(text))
			self.align_center(self.etext, self.center_pos)
			if self.do_scroll:
				self.item_scroll_timer = utils.Timer(1000, self.scroll_item_timer_cb)
			return True
		return False		
		
	def get_text(self):
		return self.choose[self.index]

	def get_index(self):
		return self.index

	def set_index(self, index):	
		if self.index < 0:
			self.index = 0
		elif self.index > (len(self.choose) - 1):
			self.index = len(self.choose) - 1
		else:
			self.index = index
		text = self.choose[self.index]
		self.etext.text_set(self.check_scroll_text(text))
		self.align_center(self.etext, self.center_pos)

	def set_text(self, text):
		index = 0
		for choice in self.choose:
			if choice == text:
				self.etext.text_set(self.check_scroll_text(text))
				self.align_center(self.etext, self.center_pos)
				self.index = index
				return
			index += 1
		return	

	def setFont(self,font):
		self.font = font
			
	def setBackground(self,bgImage = None):
		self.bg.free()
		self.bg = utils.put_image(bgImage,self.pos)
		self.children.append(self.bg)

	def showFocus(self):
		if self.mode == uiconfig.LIST_MODE_SMALL: # don't use (will be change)
			self.image.file =  uiconfig.image_dir + uiconfig.normal_icon_select_r	
		elif self.mode == uiconfig.LIST_MODE_MEDIUM:
			self.image.file =  uiconfig.image_dir + uiconfig.normal_icon_select_r	
		else:
			self.image.file =  uiconfig.image_dir + uiconfig.PB_select_list[1]

		if self.do_scroll:
			self.item_scroll_timer = utils.Timer(1000, self.scroll_item_timer_cb)
		
	def lostFocus(self):
		if self.mode == uiconfig.LIST_MODE_SMALL: # don't use (will be change)
			self.image.file =  uiconfig.image_dir + uiconfig.normal_icon_select	
		elif self.mode == uiconfig.LIST_MODE_MEDIUM:
			self.image.file =  uiconfig.image_dir + uiconfig.normal_icon_select	
		else:
			self.image.file =  uiconfig.image_dir + uiconfig.PB_select_list[0]

		if self.do_scroll:
			self.remove_item_scroll_timer()
		
	def setPosition(self,x,y):
		self.pos = x,y
		self.image.move(x,y)
		self.center_pos = (x + 128, y+16-self.font[1]/2-2)
		self.etext.hide()
		self.align_center(self.etext, self.center_pos)
		self.etext.show()
		#self.etext.pos = x + 30,y
		
	def getPosition(self):
		return self.pos
		
	def setColor(self, color):
		self.color = color
		for w in self.children:
			w.color = color

	def getColor(self):
		return self.color


class Radio_Control(Widget):
	def __init__(self, value, text, font, pos, color, align=uiconfig.ALIGN_LEFT):
		Widget.__init__(self)
		self.value = value
		self.pos = pos
		self.color = color
		self.font = font	
		self._text = utils.get_real_lang_str(text)
		self.text_width = 0			
		self.setText(self._text)
		self.setValue(self.value)
	
	def setValue(self,values):
		if values == 1:
			self.radio.file = uiconfig.image_dir + uiconfig.radio_select
		else:
			self.radio.file = uiconfig.image_dir + uiconfig.radio_unselect
		self.value = values
			
	def getValue(self):
		return self.value
		
	def get_text_width(self):
		etext = runtime.evas.text(text=self._text, font=self.font, color=self.color)
		self.text_width = etext.geometry[2]
		etext.free()
		return self.text_width

	def setText(self, text, with_punc = True):
		self.free()
		self.children = []
		x, y = self.pos
		self.radio = utils.put_image(uiconfig.radio_select,self.pos)
		self.children.append(self.radio)
		self.radio_focus = utils.put_image(uiconfig.radio_focus,self.pos)
		self.children.append(self.radio_focus)
		self.radio_focus.hide()
		lang_text = utils.get_real_lang_str(text)
		if with_punc:
			text = utils.cut_text_with_punc(lang_text, uiconfig.item_width_scroll, uiconfig.list_font)[0]
		else:
			text = utils.cut_text(lang_text, uiconfig.item_width_scroll, uiconfig.list_font)[0]
		self.etext = runtime.evas.text(text=text, font=self.font,color=self.color)
		geometry = self.etext.geometry
		self.etext.pos = x + 35, y
		self.children.append(self.etext)
		y += self.etext.geometry[3]
		if self.etext and not self.hidden:
			self.show()
			
	def handle_key(self,key):
		if key == config.Menu2:
			if self.value == 1:
				self.value =0
			else:
				self.value = 1
			self.setValue(self.value)
			return True
		return False
		
	def setFont(self,font):
		self.font = font
		
	def setBackground(self,bgImage = None):
		self.bg.free()
		self.bg = utils.put_image(bgImage,self.pos)
		self.children.append(self.bg)

	def showFocus(self):
		self.radio_focus.show()
		
	def lostFocus(self):
		self.radio_focus.hide()
		
	def setPosition(self,x,y):
		self.pos = x,y
		self.radio.move(x,y)
		self.etext.pos = x + 35,y
		
	def getPosition(self):
		return self.pos
		
	def setColor(self, color):
		self.color = color
		for w in self.children:
			w.color = color

	def getColor(self):
		return self.color


class Icon_Control(Widget):
	def __init__(self,filename,pos):
		Widget.__init__(self)
		self.filename = filename
		self.pos = pos
		self.icon = utils.put_image(filename,pos)
		self.icon.hide()
		self.children.append(self.icon)
	def showFocus(self):
		pass
		
	def lostFocus(self):
		pass
		
	def setIcon(self,filename):
		self.icon.file = filename	
		
	def setPosition(self,x,y):
		self.pos = x,y
		self.icon.move(x,y)		
		
	def getPosition(self):
		return self.pos
		
	def changeIcon(self, filename):
		self.icon.file = filename

		
class Image_Control(Widget):
	def __init__(self,filename,pos,size=None):
		Widget.__init__(self)
		self.filename = filename
		self.pos = pos
		self.size = size
		if size == None:
			self.image = utils.put_image(filename,pos)
		else:
			self.image = utils.put_image(filename,pos,size)
		self.image.hide()
		self.children.append(self.image)
		
	def showFocus(self):
		pass
		
	def lostFocus(self):
		pass
		
	def setPosition(self,x,y):
		self.pos = x,y
		self.image.move(x,y)		
		
	def setImage(self,filename):
		self.image.file = filename
		
	def getPosition(self):
		return self.pos

		
class Check_Control(Widget):
	def __init__(self, value, text, font, pos, color, align=uiconfig.ALIGN_LEFT):
		Widget.__init__(self)
		self.value = value
		self.pos = pos
		self.color = color
		self.font = font	
		self._text = utils.get_real_lang_str(text)
		self.text_width = 0			
		self.setText(self._text)
		self.setValue(self.value)
	
	def setValue(self,values):
		if values == 1:
			self.check.file = uiconfig.image_dir + uiconfig.check_select
		else:
			self.check.file = uiconfig.image_dir + uiconfig.check_unselect
		self.value = values
		
	def getValue(self):
		return self.value
		
	def get_text_width(self):
		etext = runtime.evas.text(text=self._text, font=self.font, color=self.color)
		self.text_width = etext.geometry[2]
		etext.free()
		return self.text_width

	def setText(self, text, with_punc = True):
		self.free()
		self.children = []
		x, y = self.pos
		self.check = utils.put_image(uiconfig.check_unselect,self.pos)
		self.children.append(self.check)
		self.check_focus = utils.put_image(uiconfig.check_focus,self.pos)
		self.children.append(self.check_focus)
		self.check_focus.hide()
		lang_text = utils.get_real_lang_str(text)
		if with_punc:
			text = utils.cut_text_with_punc(lang_text, uiconfig.item_width_scroll, uiconfig.list_font)[0]
		else:
			text = utils.cut_text(lang_text, uiconfig.item_width_scroll, uiconfig.list_font)[0]
		self.etext = runtime.evas.text(text=text, font=self.font,color=self.color)
		geometry = self.etext.geometry
		self.etext.pos = x + 35, y + 3
		self.children.append(self.etext)
		y += self.etext.geometry[3]
		if self.etext and not self.hidden:
			self.show()
			
	def handle_key(self,key):
		if key == config.Menu2:
			if self.value == 1:
				self.value =0
			else:
				self.value = 1
			self.setValue(self.value)
			return True
		return False
		
	def setFont(self,font):
		self.font = font
			
	def setBackground(self,bgImage = None):
		self.bg.free()
		self.bg = utils.put_image(bgImage,self.pos)
		self.children.append(self.bg)

	def showFocus(self):
		self.check_focus.show()
		
	def lostFocus(self):
		self.check_focus.hide()
		
	def setPosition(self,x,y):
		self.pos = x,y
		self.check.move(x,y)
		self.etext.pos = x + 35,y
		
	def getPosition(self):
		return self.pos
		
	def setColor(self, color):
		self.color = color
		for w in self.children:
			w.color = color

	def getColor(self):
		return self.color

		
class Input_Control(EditBase):
	def __init__(self, pos, size, hiddenset=0):
		EditBase.__init__(self, pos, size)
		
		self.richtext = EntryRichText(pos, hiddenset=hiddenset)
		self.richtext.set_clip(self.clip)
		self.children.append(self.richtext)		
		self._hscroll_offset = 2
		self._scroll = False
		self.pos = pos
		self.size = size
		self.hiddenset=hiddenset
		self.lostFocus()
		
	def free(self):
		EditBase.free(self)
		self.richtext = None

	def backspace(self, count=1):
		EditBase.backspace(self, count=count)
		self.check_hscroll_offset()
		
	def getPosition(self):
		return self.pos

	def setPosition(self,x,y):
		self.pos = x,y
		self.rounding.pos = x-1,y-1
		self.background.pos = x,y
		#textarea_pos = (self.pos[0] + self.margin, self.pos[1] + self.margin)	
		textarea_pos = (self.pos[0] + self.margin, self.pos[1] + self.size[1]/2 - 8) # 8 is depend on font size	
		#self.clip.pos = x,y
		self.clip.pos = textarea_pos
		self.richtext.x = x
		self.richtext.y = y
		self.richtext.set_clip(self.clip)
		
	def showFocus(self):
		#self.background.color = 140,215,56,255
		#self.clip.color = 140,215,56,255

		self.background.color = uiconfig.color_select
		self.clip.color = uiconfig.color_select
		
		self.richtext.set_clip(self.clip)
		EditBase.cursor_show(self)
		
	def lostFocus(self):
		self.background.color = 225,225,225,255
		self.clip.color = 225,225,225,255
		self.richtext.set_clip(self.clip)
		EditBase.cursor_hide(self)
		
	def cursor_backward(self):	
		EditBase.cursor_backward(self)
		self.check_hscroll_offset()

	def cursor_forward(self):
		EditBase.cursor_forward(self)
		self.check_hscroll_offset()

	def cursor_start(self):
		EditBase.cursor_start(self)
		self.check_hscroll_offset()

	def cursor_end(self):
		EditBase.cursor_end(self)
		self.check_hscroll_offset()

	def set_text(self, text):
		EditBase.set_text(self, text)
		self.check_hscroll_offset()

	def insert_unicode_text(self, text, ul=False):
		if text == '\n':
			return

		EditBase.insert_unicode_text(self, text, ul=ul)
		self.check_hscroll_offset()
	
	def check_hscroll_offset(self):
		cx, cy, ch = self.richtext.cursor_pos_height()
		w = self.richtext.width

		clip_pos = self.clip.geometry_get()
		if cx < clip_pos[0] + 2:
			self._hscroll_offset += clip_pos[0] - cx + 20 -2
			if abs(self._hscroll_offset)%11 != 0:
				if self._hscroll_offset < 0:
					self._hscroll_offset = -((abs(self._hscroll_offset)/11)*11 + 11)
				else:
					self._hscroll_offset = (abs(self._hscroll_offset)/11)*11 + 11
			self._hscroll_offset += 2
			if self._hscroll_offset > 2:
				self._hscroll_offset = 2
		elif cx  > clip_pos[0] + clip_pos[2]:
			#self._hscroll_offset -= cx - (clip_pos[2] + clip_pos[0]) -2
			self._hscroll_offset -= cx - (clip_pos[2] + clip_pos[0]) + 2
			if self._hscroll_offset <= 0:
				self._hscroll_offset = -(int(float(abs(self._hscroll_offset)/14)*14) + 14)
			else:
				self._hscroll_offset = int(float(abs(self._hscroll_offset)/14)*14) + 14

		'''
		elif cx  > clip_pos[0] + 2 + clip_pos[2]:
			self._hscroll_offset -= cx - (clip_pos[2] + clip_pos[0]) -2
			if abs(self._hscroll_offset)%11 != 0:
				if self._hscroll_offset < 0:
					self._hscroll_offset = -((abs(self._hscroll_offset)/11)*11 + 11)
				else:
					self._hscroll_offset = (abs(self._hscroll_offset)/11)*11 + 11
			self._hscroll_offset += 2
		'''
		self.richtext.move(clip_pos[0] + self._hscroll_offset, clip_pos[1])
		self.richtext.cursor.queue_update()


class Date_Control(Widget):
	def __init__(self,date,pos):
		Widget.__init__(self)		
		self.date = date
		self.pos = pos
		self.cursor_pos = 0
		year, mon, day = self.date
		self.editing_text = [year/1000, (year/100)%10, (year%100)/10, year%10, mon/10, mon%10, day/10, day%10]

		#date = day,mon,year
		self.date_label = runtime.evas.text(text=self.get_text(),font=uiconfig.date_edit_font)
		self.date_label.color = uiconfig.date_edit_entry_color
		self.date_label.pos = pos
		self.children.append(self.date_label)
		self.underline = runtime.evas.text(text='_', font=uiconfig.date_edit_font)
		self.underline.color = uiconfig.date_edit_entry_color
		self.children.append(self.underline)
		self.update_underline()

	def update_underline(self):
		font_width = 9
		font_height = 6
		pos = self.pos
		xpos = (0, 1, 2, 3, 5, 6, 8, 9)[self.cursor_pos]
		x = pos[0] + xpos * font_width
		self.underline.pos = x, pos[1] + font_height

	def get_text(self):
		text = "%01d%01d%01d%01d/%01d%01d/%01d%01d" % tuple(self.editing_text)
		return text

	def update_date(self):		
		year = self.editing_text[0] * 1000 + self.editing_text[1] * 100 + self.editing_text[2] * 10 + self.editing_text[3]
		mon = self.editing_text[4] * 10 + self.editing_text[5]
		day = self.editing_text[6] * 10 + self.editing_text[7]
		self.date = (year, mon, day)
		#self.date_label.text = self.get_text()
		#text =  "%04d/%02d/%02d" %(year, mon, day)
		self.date_label.text_set(self.get_text())
		
	def showFocus(self):
		self.underline.show()
		self.cursor_pos = 0
		self.update_underline()
		
	def lostFocus(self):
		self.underline.hide()
		
	# KA: [20081007] date 유효한 범위 체크
   	def Max_Month(self,month,year):
		if month in [1,3,5,7,8,10,12]:
			return 31
		elif month in [4,6,9,11]:
			return 30
		elif (month == 2) and (year % 4 == 0):
			return 29
		elif (month == 2) and (year % 4 != 0):
			return 28

	def change_update(self):
		self.update_date()
		self.cursor_pos += 1
		if self.cursor_pos > 7:
			self.cursor_pos = 0
		self.update_underline()	
	# KA: [20081007] date 유효한 범위 체크 == 

	def handle_key(self, key):
		if key in "0123456789":
			if self.cursor_pos == 6:
				#day 10
				if not key in "0123":
					return True
				day = (ord(key)-ord('0')) * 10 + self.editing_text[7]
				mon = self.editing_text[4] * 10 + self.editing_text[5]
				# KA: [20081007] date 유효한 범위 체크, 자동으로 알맞은 값으로 변환
				date_max = self.Max_Month(self.date[1], self.date[0])
				if day == 0: 
					self.editing_text[7] = 1
				elif day > date_max:
					date_max = str(date_max)
					self.editing_text[6] = int(date_max[0])
					self.editing_text[7] = int(date_max[1])
					# 입력한 key값과 다른 값을 입력하므로 return True
					self.change_update()
					return True
					
			elif self.cursor_pos == 7:
				day = self.editing_text[6] * 10 + ord(key) - ord('0')
				mon = self.editing_text[4] * 10 + self.editing_text[5]
				# KA: [20081007] date 유효한 범위 체크, 입력을 무시
				date_max = self.Max_Month(self.date[1], self.date[0])
				if day > date_max or day == 0:
					return True
					
			elif self.cursor_pos == 4:
				#mon 10
				if not key in "01":
					return True
				mon = (ord(key)-ord('0')) * 10 + self.editing_text[5]
				day = self.editing_text[6] * 10 + self.editing_text[7]
				if mon == 0:
					self.editing_text[5] = 1
				elif mon > 12:
					self.editing_text[5] = 2
			elif self.cursor_pos == 5:
				#mon 1
				mon = self.editing_text[4] * 10 + ord(key) - ord('0')
				day = self.editing_text[6] * 10 + self.editing_text[7]
				if mon > 12 or mon == 0:
					return True
			elif self.cursor_pos == 0:
				# 2000 or 1900
				if not key in "12":
					return True
				if key == '1' and self.editing_text[1] != 9:
					self.editing_text[1] = 9
				elif key == '2' and self.editing_text[1] != 0:
					self.editing_text[1] = 0
					self.editing_text[2] = 0
					self.editing_text[3] = 0
			elif self.cursor_pos == 1:
				# 2000 or 1900
				if not key in "09":
					return True
				yy = self.editing_text[0] * 10 + ord(key) - ord('0')
				if yy < 19 or yy > 20:
					return True
			elif self.cursor_pos == 2:
				# 1970 ~ 2037
				if self.editing_text[1] == 9:
					if not key in "789":
						return True
				else:
					if not key in "0123":
						return True
			elif self.cursor_pos == 3:
				if self.editing_text[2] == 3:
					if not key in "01234567":
						return True
				#pass
			self.editing_text[self.cursor_pos] = ord(key) - ord('0')
			self.update_date()
			self.cursor_pos += 1
			if self.cursor_pos > 7:
				self.cursor_pos = 0
			self.update_underline()
			return True
		elif key == 'Right':
			self.cursor_pos += 1
			if self.cursor_pos > 7:
				self.cursor_pos = 0
			self.update_underline()
		elif key == 'Left':
			self.cursor_pos -= 1
			if self.cursor_pos < 0:
				self.cursor_pos = 7
			self.update_underline()
			return True			
		return False