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