Newer
Older
Import / projects / LGN-IP3870 / t / orig / images.py
from basemodel import Stage, ListStage, YesNoStage, OkNoStage, NotifyStage, EntryStage, SymbolSelectionStage,PhotoGalleryCheckListStage, ExtPhotoGalleryCheckListStage, SlideshowSelectCheckListStage
import runtime, baseui, config, status, utils, uiconfig
from baseui import BaseUI
from setting import setting
from model import StorageShortStage
import os,controls


#MMW
import stat
#end of MMW

class SortStage(ListStage):

	icon = uiconfig.image_image_sound_image_icon
	def __init__(self):
		self.title = _('SORT')
		self.choice = _('By name'), _('By size')
		ListStage.__init__(self)
		self.ui.set_focus(setting.photo_sort_rule)

	def activate(self, index):
		setting.photo_sort_rule = index
		stage = runtime.manager.find_stage('photo gallery')
		stage.sort()
		runtime.manager.back_stage('photo gallery')


class RenameStage(EntryStage):
	def __init__(self, from_gallery_list=False):
		self.from_gallery_list = from_gallery_list
		EntryStage.__init__(self, _('Name'), _('RENAME'))
		gallery = runtime.manager.find_stage('photo gallery')
		self.ui.entry.ascii_mode_case3 = True
		name = gallery.get_current_name()

		try:
			euc_kr_name = unicode(name, 'utf-8').encode('euc-kr')
		except:
			pass
		
		if len(euc_kr_name) > 16:
			euc_kr_name = euc_kr_name[:16]

		try:
			name = unicode(euc_kr_name,'euc-kr' ).encode('utf-8')
		except:
			pass
		self.ui.set_text(name)
		self.ui.set_max(16)
		# KA: [20070831] hangul lvp-2000
		#self.ui.set_fixed_automata(None, False)
		# shchun : global automata change
		if setting.lang == 'Korean':
			self.ui.set_automata('hangul', False)
		else:
			self.ui.set_automata('multitap', 'lower')
		# end shchun
				
#ka...hangul add 2007.01.25
#		self.ui.set_automata('multitap', 'lower')
#		self.ui.automata_idx = self.automata_idx = 3
#		if setting.lang == 'Korean':
#			self.ui.set_automata('hangul', False)
#		else:
#			self.ui.set_automata('multitap', 'lower')
	def show(self):
		EntryStage.show(self)
		if self.ui.menu3 == _('KOR'):
			if config.mmi_debug: print '## reset index'
			self.ui.automata_idx = 0
	
	def activate_menu1(self):
		self.new_name = self.ui.get_text()
		if not self.new_name:
			utils.player.play_effect(config.SETTING_FAILED)
			stage = NotifyStage(_('Empty image name'), uiconfig.baloon_photo_icon)
			runtime.manager.stack_stage(stage)
			return

		stage = runtime.manager.find_stage('photo gallery')

		old_name = stage.get_current_name()
		if old_name == self.new_name:
			utils.player.play_effect(config.SETTING_FAILED)
			runtime.manager.change_stage(NotifyStage(_('No change'), uiconfig.baloon_photo_icon))
			return

		if stage:
			if not stage.rename_is_ok(self.new_name):
				utils.player.play_effect(config.SETTING_FAILED)
				runtime.manager.stack_stage(NotifyStage(_('There exists same name'),  uiconfig.baloon_photo_icon))
				return
			for ch in self.new_name:
				if ch in '\/:*?"<>':
					utils.player.play_effect(config.SETTING_FAILED)
					#runtime.manager.stack_stage(NotifyStage(_('Please, do not use \/:*?"<> characters to make file name'),  uiconfig.baloon_photo_icon))
					msg = runtime.evas.pre_parse(_('Please, do not use %s characters to make file name')%('\/:*?"<>',))
					runtime.manager.stack_stage(NotifyStage(msg,  uiconfig.baloon_photo_icon))
					return
			stage.rename(self.new_name)
		try:
			old_name = unicode(old_name, 'utf-8').encode('euc-kr')
		except:
			pass
			
		ext = utils.get_ext(stage.get_current_file())
		try:
			self.new_name = unicode(self.new_name, 'utf-8').encode('euc-kr')
		except:
			pass
		self.new_name = self.new_name + '.' + ext
		
		def cb():
			#runtime.manager.back_stage('photo gallery')
			if self.from_gallery_list:
				stage = PhotoGalleryListStage('taken')
			else:
				
				stage = PhotoGalleryStage('taken', file=self.new_name)
			runtime.manager.stack_stage(stage)
		utils.player.play_effect(config.SETTING_SUCCEEDED)	
		stage = NotifyStage(_('Renamed!'), uiconfig.baloon_photo_icon, cb)
		runtime.manager.change_stage(stage)

	def handle_key(self, key):
		if key == config.Menu4:
			runtime.manager.back_stage()
			return True
			
		return EntryStage.handle_key(self, key)
# KA: [20070831] hangul lvp-2000
#		if key == 'SOFT4':
#			# 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)		
#			return True	
		

#			self.automata_idx = utils.get_automata_idx(*self.ui.automata)
#			self.automata_idx += 1
#			if setting.lang == 'Korean':
#				if self.automata_idx >=len(config.automata_list_hangul):
#					self.automata_idx = 0
#				name, casemode = config.automata_list_hangul[self.automata_idx]
#			else:
#				if self.automata_idx >=len(config.automata_list):
#					self.automata_idx = 3	
#				name, casemode = config.automata_list[self.automata_idx]		
#			self.ui.set_automata(name, casemode)
#			return True


# KA: [20070831] hangul lvp-2000 ==


class PhotoDetailUI(baseui.LargeWindowUI):
	show_bg_depth = True
	def __init__(self, file, date, filesize, imagesize):
		#self.bg_image = utils.put_image(uiconfig.depth_bg_image, (0, 0))
		#self.bg_image.show()
		baseui.LargeWindowUI.__init__(self, '', '', _('DETAILS'), _('DETAILS'), menu4=_('BACK'))

		pos = uiconfig.large_window_pos
		font = uiconfig.large_window_text_font

		def get_multiline_filename(file, width, font):
			buf_text = ''
			filename = []

			for i in range(len(file)):
				buf_text += file[i]

				t = runtime.evas.text(text=buf_text, font=font)
				w = t.geometry[2]
				if w >= width: # cut line
					filename.append(buf_text)
					buf_text = ''

				t.free()

			if len(buf_text) > 0:
				filename.append(buf_text)
			return filename

		file = _('File')+ ': ' + file
		detail_list = get_multiline_filename(file, uiconfig.large_window_text_width, font)
		detail_list.append(_('Date')+ ': ' + date)
		detail_list.append(_('File size')+ ': ' + filesize)
		detail_list.append(_('Image size')+ ': ' + imagesize)

		for i, text in enumerate(detail_list):
			x = pos[0] + uiconfig.large_window_text_pos_x
			y = pos[1] + uiconfig.large_window_text_pos_y[i]
			t = runtime.evas.text(text=text, pos=(x, y), \
				color=uiconfig.large_window_text_color, \
				font=font)
			self.add(t)

	def destroy(self):
		#self.bg_image.free()
		baseui.LargeWindowUI.destroy(self)


class PhotoDetailStage(Stage):
	def __init__(self):
		gallery = runtime.manager.find_stage('photo gallery')
		detail = gallery.get_detail()
		self.ui = PhotoDetailUI(*detail)

	def handle_key(self, key):
		if key == config.Menu4 or key == 'CLR':
			runtime.manager.back_stage()
			return True
		return False

def ImageAssignStage():
	import phonebook
	from phonedb import phonedb
	if phonedb.is_empty():
		return phonebook.PhoneBookTempEmptyStage()

	gallery = runtime.manager.find_stage('photo gallery')
	status.assign_image = gallery.get_current_file()

	def phonelist_activate(phonelist, index):
		item = phonelist.get_phonedb_item(index)
		phonedb.update_snapshot(item, status.assign_image)
		phonedb.save()
		def cb():
			runtime.manager.back_stage('photo gallery')
		stage = NotifyStage(_('Image assigned'), uiconfig.baloon_phonebook_icon, cb)
		runtime.manager.change_stage(stage)
	status.phonelist_activate = phonelist_activate
	return phonebook.FindStage()


class PhotoGalleryOptionStage(ListStage):
	name = 'photo gallery option'
	#icon = uiconfig.image_image_sound_image_icon
	def __init__(self, photo_type, multi_select=0, from_gallery_list=False): #False):
		self.title = _('OPTIONS')
		self.photo_type = photo_type
		if config.mm_debug:
			print 'photogallery option: photo type', photo_type
		self.multi_select = multi_select
		self.from_gallery_list = from_gallery_list
		choice1 = _('Set as background'), _('Send'), _('Delete'), _('Rename'), _('Assign to contact'), _('Sort'), _('Details')
		choice2 = _('Set as background'), _('Send'), _('Sort'), _('Details')
		if self.multi_select:
			#choice3 = _('Set as background'), _('Delete'), _('Delete selected'), _('Rename'), _('Assign to contact'), _('Sort'), _('Set Slideshow')
			choice3 = _('Set as background'), _('Set as default video'), _('Delete'), _('Rename'), _('Details'), _('Delete selected'), _('Set Slideshow')
			#choice3 = _('Set as background'), _('Delete'), _('Rename'), _('Details'), _('Delete selected'), _('Set Slideshow')
			#choice3 = _('Delete selected'), _('Set Slideshow')
		else:
			choice3 = _('Set as background'), _('Set as default video'), _('Delete'), _('Rename'), _('Details')
			#choice3 = _('Set as background'), _('Delete'), _('Rename'), _('Details')
		choice4 = _('Set as background'), _('Sort'), _('Details')
		from profile import profile
		if self.photo_type == 'vdc':
			if profile.get_profile()  == 0:
				self.choice = choice2
			else:
				self.choice = choice4
		else:
			if profile.get_profile() == 0:
				self.choice = choice1
			else:
				self.choice = choice3
		ListStage.__init__(self, self.choice)

	def activate(self, index):
		if self.choice[index] == _('Set as background'):
			gallery = runtime.manager.find_stage('photo gallery')
			imageFile = gallery.get_current_file()

			tmp_w, tmp_h = utils.get_img_size(imageFile)
			if tmp_w * tmp_h < 640 * 480 + 1:
				def cb():
					runtime.manager.back_stage('photo gallery')

				utils.player.play_effect(config.SETTING_SUCCEEDED)
				stage = NotifyStage(_('Background set.'), uiconfig.baloon_photo_icon, cb)
				runtime.manager.change_stage(stage)
				runtime.evas.render_now()
				gallery.set_background()
			else:
				utils.player.play_effect(config.SETTING_FAILED)
				stage = NotifyStage(_('Size too big.'), uiconfig.baloon_photo_icon)
				runtime.manager.change_stage(stage)
			return
		if self.choice[index] == _('Set as default video'):
			gallery = runtime.manager.find_stage('photo gallery')
			imageFile = gallery.get_current_file()
			if not imageFile.endswith('.jpg') and not imageFile.endswith('.JPG'):
				utils.player.play_effect(config.SETTING_FAILED)
				stage = NotifyStage(_('Wrong format for privacy image'), uiconfig.baloon_video_icon)
				runtime.manager.stack_stage(stage)
				self.focus = 0
				return False

			tmp_w, tmp_h = utils.get_img_size(imageFile)
			if tmp_w * tmp_h < 640 * 480 + 1:
				def cb():
					runtime.manager.back_stage('photo gallery')
				
				utils.player.play_effect(config.SETTING_SUCCEEDED)	
				stage = NotifyStage(_('Alternative video set'), uiconfig.baloon_video_icon, cb)
				runtime.manager.change_stage(stage)
				runtime.evas.render_now()
				gallery.set_privacy()
			else:
				utils.player.play_effect(config.SETTING_FAILED)			
				stage = NotifyStage(_('Size too big.'), uiconfig.baloon_photo_icon)
				runtime.manager.change_stage(stage)
			return
		elif self.choice[index] == _('Send'):
			from mmscomposestage import MMSCreateStage, MMSSize_excess
			import mmsconfig
			from mmsmanager import mmsmgr
			gallery_stage = runtime.manager.find_stage('photo gallery')
			if mmsmgr.setmedia(mmsconfig.MEDIA_IMAGE, gallery_stage.get_current_file()):
				runtime.manager.stack_stage(MMSCreateStage(addmedia_type=mmsconfig.MEDIA_IMAGE))
			else:
				MMSSize_excess()
			return
		elif self.choice[index] == _('Delete'):
			def yes():
				gallery_stage = runtime.manager.find_stage('photo gallery')
				gallery_stage.delete()
				def delete_done():
					if config.mmi_debug: print '## self.from_gallery_list=', self.from_gallery_list
					if self.from_gallery_list:
						if len(gallery_stage.lists) == 0:
							if runtime.manager.find_stage('my album'):
								runtime.manager.back_stage('my album')
							elif runtime.manager.find_stage('MMToolsStage'):
								runtime.manager.back_stage('MMToolsStage')
							else:
								runtime.manager.back_stage('idle')
						else:
							if runtime.manager.find_stage('my album'):
								runtime.manager.back_stage('my album')
								stage = PhotoGalleryListStage('taken')
								runtime.manager.stack_stage(stage)
							else:
								runtime.manager.queue_backward(3)
					else:
						if len(gallery_stage.lists) == 0:
							if runtime.manager.find_stage('my album'):
								runtime.manager.back_stage('my album')
							elif runtime.manager.find_stage('MMToolsStage'):
								runtime.manager.back_stage('MMToolsStage')
							else:
								runtime.manager.back_stage('idle')
						else:
							stage = PhotoGalleryStage('taken')
							runtime.manager.stack_stage(stage)
				utils.player.play_effect(config.SETTING_SUCCEEDED)	
				stage = NotifyStage(_('Photo deleted'), uiconfig.baloon_photo_icon, delete_done)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Do you want to delete photo?'), yes, no, '', uiconfig.baloon_photo_icon)
			runtime.manager.stack_stage(stage)
			return
		elif self.choice[index] == _('Delete selected'): # _('Delete selected')
			def yes():
				gallery_stage = runtime.manager.find_stage('photo gallery')
				gallery_stage.delete_selected()
				def delete_done():
					if self.from_gallery_list:
						if runtime.manager.find_stage('my album'):
							runtime.manager.back_stage('my album')
							stage = PhotoGalleryListStage('taken')
							runtime.manager.stack_stage(stage)
						else:
							runtime.manager.queue_backward(3)
					else:
						stage = PhotoGalleryStage('taken')
						runtime.manager.stack_stage(stage)
				utils.player.play_effect(config.SETTING_SUCCEEDED)	
				stage = NotifyStage(_('Selected images are deleted'), uiconfig.baloon_photo_icon, delete_done)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Delete selected images?'), yes, no, '', uiconfig.baloon_photo_icon)
			runtime.manager.stack_stage(stage)
			return
		elif self.choice[index] == _('Set Slideshow'): # _('Set slideshow')
			gallery = runtime.manager.find_stage('photo gallery')
			gallery.set_slide_file()
			setting.save()
			def slideshow_set_done():
				if self.multi_select:
					stage = PhotoGalleryListStage('taken')
				else:
					stage = PhotoGalleryStage('taken')
				runtime.manager.stack_stage(stage)
			utils.player.play_effect(config.SETTING_SUCCEEDED)	
			stage = NotifyStage(_('Slideshow image set'), uiconfig.baloon_phonebook_icon, slideshow_set_done)
			runtime.manager.change_stage(stage)
			return
		elif self.choice[index] == _('Rename'):
			# KA: [20070831] hangul lvp-2000
			#stage = RenameStage
			try:		
				gallery = runtime.manager.find_stage('photo gallery')
				try:
					unicode(gallery.get_current_name(),'utf-8')	
				except:
					pass
				stage = RenameStage(self.from_gallery_list)	
			except:
				utils.player.play_effect(config.SETTING_FAILED)	
				stage = NotifyStage(_('No change'), uiconfig.baloon_photo_icon)			
			# KA: [20070831] hangul lvp-2000==
			
		elif self.choice[index] == _('Assign to contact'):
			stage = ImageAssignStage()
		elif self.choice[index] == _('Sort'):
			stage = SortStage
		elif self.choice[index] == _('Details'):
			stage = PhotoDetailStage
		runtime.manager.stack_stage(stage)


def PhotoGalleryStage(photo_type, mms_mode=0, ipemailMessage = None, isshow=True, file=None):
	#status.supervision_not_allowed = 1
	dirname, lists = utils.get_image_gallery_list(photo_type)
	if len(lists) == 0:
		def cb():
			runtime.manager.back_stage( 'my album')
		return NotifyStage(_('Gallery empty!'), uiconfig.baloon_photo_icon,cb=cb)
	# KA: [20080509] slide show
	return _PhotoGalleryStage(photo_type, dirname, lists, mms_mode, ipemailMessage, isshow, file)
	# KA: [20080509] slide show ==


class USBMountStage(Stage):
	def __init__(self, message, cb=None):
		icon = uiconfig.baloon_video_icon
		self.ui = baseui.NotifyUI(message, icon)

	def show(self):
		self.ui.show()
		self.usb_mount_timer = utils.Timer(1000, self.next)
		#utils.usb_mount()
		#self.next()

	def check_usb_exist(self):
		chk_usb_dir = '/proc/bus/usb/001'
		import os 
		if not os.access(chk_usb_dir, os.R_OK):
			return False
			
		flist = os.listdir(chk_usb_dir)
		if len(flist) < 2:
			return False

		return True
		
	def next(self):
		import time
		
		utils.usb_mount_ready()
		time.sleep(2)
		if not self.check_usb_exist():
			utils.usb_umount()	
			stage = NotifyStage(_('USB storage is not inserted'), uiconfig.baloon_photo_icon)
			runtime.manager.change_stage(stage)
			return
			
		utils.usb_mount()
		
		time.sleep(1)
		self.usb_mount_timer = None
		photo_type = 'usb'
		
		#status.supervision_not_allowed = 1
		dirname, lists =  utils.get_ext_image_gallery_list(photo_type)
		if len(lists) == 0:
			utils.usb_mount(dev='/dev/sda')
			time.sleep(1)
			dirname, lists =  utils.get_ext_image_gallery_list(photo_type)
			if len(lists) == 0:
				utils.usb_mount()
				time.sleep(1)
				dirname, lists =  utils.get_ext_image_gallery_list(photo_type)
				if len(lists) == 0:
					utils.usb_mount(dev='/dev/sda')
					time.sleep(1)
					dirname, lists =  utils.get_ext_image_gallery_list(photo_type)
					if len(lists) == 0:
						utils.usb_umount()	
						stage = NotifyStage(_('Gallery empty!'), uiconfig.baloon_photo_icon)
						runtime.manager.change_stage(stage)
						return
		
		mms_mode=0
		ipemailMessage = None
		isshow=True
		stage = _ExtPhotoGalleryListStage(photo_type, dirname, lists, mms_mode, ipemailMessage, isshow, titleimage=uiconfig.title_usb_gallery)
		runtime.manager.stack_stage(stage)
		

def ExternalPhotoGalleryListStage(photo_type, mms_mode=0, ipemailMessage = None, isshow=True):
	import time
	if photo_type == 'usb':
		return USBMountStage(_('Please wait for a moment.'), uiconfig.baloon_photo_icon)
	elif photo_type == 'sdmmc':
		if not os.access(config.sdmmc_dir, os.R_OK):
			return NotifyStage(_('SD/MMC is not inserted.'), uiconfig.baloon_photo_icon)
		
	#status.supervision_not_allowed = 1
	dirname, lists =  utils.get_ext_image_gallery_list(photo_type)
	if len(lists) == 0:
		return NotifyStage(_('Gallery empty!'), uiconfig.baloon_photo_icon)
	return _ExtPhotoGalleryListStage(photo_type, dirname, lists, mms_mode, ipemailMessage, isshow, titleimage=uiconfig.title_sdmmc_gallery)
	
def PhotoGalleryListStage(photo_type, mms_mode=0, ipemailMessage = None, isshow=True):
	#status.supervision_not_allowed = 1
	dirname, lists =  utils.get_image_gallery_list(photo_type)
	if len(lists) == 0:
		utils.player.play_effect(config.SETTING_FAILED)
		return NotifyStage(_('Gallery empty!'), uiconfig.baloon_video_icon)
		#def cb():
		#	runtime.manager.back_stage( 'my album')
	return _PhotoGalleryListStage(photo_type, dirname, lists, mms_mode, ipemailMessage, isshow)

def SlideshowSelectStage(photo_type, mms_mode=0, ipemailMessage = None, isshow=True):
	#status.supervision_not_allowed = 1
	dirname, lists =  utils.get_image_gallery_list(photo_type)
	if len(lists) == 0:
		def cb():
			if runtime.manager.find_stage('screensaver setting'):
				runtime.manager.back_stage('screensaver setting')
			elif runtime.manager.find_stage('screensaver'):
				runtime.manager.back_stage('screensaver')
			else:
				runtime.manager.back_stage()

		utils.player.play_effect(config.SETTING_FAILED)	
		return NotifyStage(_('Gallery empty!'), uiconfig.baloon_photo_icon, cb=cb)
	return _SlideshowSelectStage(photo_type, dirname, lists, mms_mode, ipemailMessage, isshow)

def PhotoGalleryMultiStage(photo_type, mms_mode=0, ipemailMessage = None, isshow=True):
	#status.supervision_not_allowed = 1
	dirname, lists =  utils.get_image_gallery_list(photo_type)
	if len(lists) == 0:
		return NotifyStage(_('Gallery empty!'), uiconfig.baloon_photo_icon)
	return _PhotoGalleryMultiStage(photo_type, dirname, lists, mms_mode, ipemailMessage, isshow)


class _PhotoGalleryMultiStage(Stage):
	#name = 'photo multi gallery'
	name = 'photo gallery'
	def __init__(self,photo_type, dirname, lists, mms_mode=0, ipemailMessage=None, isshow=True):
		self.ui = baseui.PhotoGalleryMultiUI(_('MENU') ,_('SELECT'), _('LARGE'), _('BACK'))
		self.photo_type = photo_type
		self.image_dir = dirname
		self.lists = lists
		self.choice = []
		self.photo_index = 0
		self.init_image()
		
	def get_current_file(self,i):
		return self.image_dir + self.lists[i][0]
		
	def init_image(self):
		self.images =  []
		self.checks =  []
		self.icons = []
		i = 0
		r = 0
		while i < len(self.lists):			
			x,y = uiconfig.image_mutil_pos_x[i%3], uiconfig.image_mutil_pos_y[r]			
			image = controls.Image_Control(self.get_current_file(i),(x,y),(110,80))
			self.ui.add(image)
			self.images.append(image)
			check = controls.Check_Control(0,'', font=uiconfig.pb_entry_font,pos = (x -30 ,y), color=uiconfig.list_text_color)
			self.ui.add(check)
			self.checks.append(check)			
			icon = controls.Icon_Control(uiconfig.image_list_icon,(x -30 ,y + 30))
			self.ui.add(icon)			
			self.icons.append(icon)			
			i += 1
			if i > 2: 
				if r == 0: r += 1
	
	def hide_image(self):
		i = 0
		while i < len(self.lists):			
			self.icons[i].hide()
			i += 1
			
	def show(self):
		Stage.show(self)
		self.hide_image()
		
	def handle_key(self, key):
		if key == config.Menu2:
			self.checks[self.ui.focus].handle_key(key)
			if self.checks[self.ui.focus].value == 0:
				self.icons[self.ui.focus].hide()				
			else:
				self.icons[self.ui.focus].show()				
			return True
		elif key == config.Menu3:
			stage =  PhotoGalleryStage(self.photo_type)
			runtime.manager.change_stage(stage)	
			return True
		if key == config.Menu4:
			runtime.manager.back_stage()
			return True
		elif key in ['Up','Down','Left','Right']:
			self.ui.handle_key(key)			
		return False


class _PhotoGalleryListStage(PhotoGalleryCheckListStage):	
	name = 'photo gallery'
	def __init__(self,photo_type, dirname, lists, mms_mode=0, ipemailMessage=None, isshow=True):
		#status.supervision_not_allowed = 1
		self.mms_mode=mms_mode
		self.ipemailMessage = ipemailMessage
		titles = {'taken':_('PHOTO GALLERY'), \
			'picture':_('PICTURES'),  'wallpaper':_('WALLPAPERS'), \
			'vdc': _("VIDEOPHONE'S IMAGES")}
		self.photo_type = photo_type
		self.title = titles[photo_type]
		self.image_dir = dirname
		self.lists = lists

 		self.init_list(self.lists)	# sort by date.
 
		self.choice = []
		self.preview_flag = 0
		for lst in self.lists:
			name = lst[0]
			dot = name.rfind('.')
			if dot >= 0:
				name = name[:dot]
				try:
					name = unicode(name, 'euc-kr').encode('utf-8')
				except:
					name = name
			self.choice.append(name)
		PhotoGalleryCheckListStage.__init__(self,self.choice)	
		self.photo_index = 0
		self.photo_number = len(self.lists)

		def preview_cb():
			self.ui.set_preview(self.get_current_file())
			self.get_slide_file()
			self._preview_tag = None

		self._preview_tag = utils.Timer(100, preview_cb)

		
	def init_list(self, lists, isshow=True):
		self.sort(isshow)
		self.photo_index = 0
		self.photo_number = len(lists)
		
	def change_photo(self, delta):		
		self.photo_index += delta
		if self.photo_index < 0:
			self.photo_index = self.photo_number - 1
		elif self.photo_index >= self.photo_number:
			self.photo_index = 0
		self.ui.set_preview(self.get_current_file())

	def get_current_file(self):
		return self.image_dir + self.lists[self.photo_index][0]

	# KA: [20080509] slide show
	def get_slide_file(self):
		files = setting.slideshow_list #now only taken folder --just write name
		#if not files:
		if not files or not self.lists:
			return
		select_index = []	# 현재 list에서 slideshow 로 지정된 파일의 index

		sel_idx = 0
		for lst in self.lists:
			name = self.image_dir + lst[0]
			try:
				index = files.index(name)
				select_index.append(sel_idx)
			except:
				pass
			sel_idx += 1
				
		if select_index:
			#for i in range(len(select_index)):
			for i in select_index:
				#self.ui.set_check(i, True)
				self.ui.set_slide_check(i, True)

	def is_slide_file(self, filename):
		for slide in setting.slideshow_list:
			if filename == slide:
				return True
		return False

	def remove_slide_file(self, filename):
		setting.slideshow_list.remove(filename)
		setting.save()
		return True

	def rename_slide_file(self, org_filename, new_filename):
		if self.is_slide_file(org_filename):
			self.remove_slide_file(org_filename)
			setting.slideshow_list.append(new_filename)
			setting.save()
		return True
		
	def set_slide_file(self):
		#/usr/local/lgvp/생략
		#for item in range(len(lists)):
		files = []
		for i in range(self.photo_number):
			if self.ui.list.checked[i]:
				name = self.image_dir + self.lists[i][0]
				try:
					name = unicode(name, 'utf-8').encode('euc-kr')
				except:
					pass
				files.append(name)
		setting.set_slideshow_list(files)
	# KA: [20080509] slide show ==

	def sort(self, isshow=True):
		'''
		if setting.photo_sort_rule == 0: # name
			def sort_func(x,y):
				return cmp(x[0].lower(), y[0].lower())
		elif setting.photo_sort_rule == 1: # size
			def sort_func(x,y,sort_col=setting.photo_sort_rule):
				return cmp(x[sort_col], y[sort_col])
		else: # date
			def sort_func(x,y,sort_col=setting.photo_sort_rule):
				return -(cmp(x[sort_col], y[sort_col]))
		'''
		# 최근 사진이 제일 위로 오도록 정렬.
		def sort_func(x, y, sort_col = setting.photo_sort_rule):
			return cmp(y[2], x[2])
		self.lists.sort(sort_func)

		'''
		self.photo_index = 0
		if isshow:
			self.ui.set_preview(self.get_current_file())
		'''

	def get_current_name(self):
		name = self.lists[self.photo_index][0]
		dot = name.rfind('.')
		if dot >= 0:
			name = name[:dot]
			try:
				name = unicode(name, 'euc-kr').encode('utf-8')
			except:
				pass
		return name
		
	def rename_is_ok(self, name):
		old = self.get_current_file()
		ext = utils.get_ext(old)
		name = name + '.' + ext
		new_name = self.image_dir + name
		try:
			new_name = unicode(new_name, 'utf-8').encode('euc-kr')
		except:
			pass
		
		import os.path
		if os.path.exists(new_name):
			return False
		return True

	def rename(self, name):
		old = self.get_current_file()
		ext = utils.get_ext(old)
		name = name + '.' + ext
		new_name = self.image_dir + name

		try:
			old_filename = unicode(old, 'utf-8').encode('euc-kr')
		except:
			old_filename = old
		try:
			new_filename = unicode(new_name , 'utf-8').encode('euc-kr')
		except:
			new_filename = new_name

		#print "[yylee debug] rename L %s : %s"%(old_filename, new_filename)
		#if utils.rename(old, new_name):
		if utils.rename(old_filename ,new_filename):
			self.lists[self.photo_index] = (name,) + self.lists[self.photo_index][1:]
			#self.ui.set_preview(self.get_current_file(),self.preview_flag)
			self.ui.set_preview(self.get_current_file())
			self.rename_slide_file(old_filename, new_filename)
		else:
			if config.mm_debug:
				print 'Rename failed'
		if config.mm_debug:
			print 'FIXME: Do Photo Rename: current index = ', self.photo_index

	def delete(self):
		name = self.get_current_file()
		try:
			name = unicode(name, 'utf-8').encode('euc-kr')
		except:
			pass
		
		#슬라이드쇼 지정 파일인 경우 슬라이드 리스트에서 제외
		if self.is_slide_file(name):
			self.remove_slide_file(name)
			
		if utils.remove(name):
			if name == setting.bg_image_file:
				def get_new_name():
					for lst in self.new_lists:
						name = lst[0]
						return name
				self.new_image_dir,self.new_lists = utils.get_image_gallery_list('vdc')
				setting.bg_image_file = config.image_bg_dir + get_new_name()
				baseui.change_bg(runtime.evas, setting.bg_image_file)
			del self.lists[self.photo_index]
			self.photo_number = len(self.lists)
			if self.photo_number > 0:
				if self.photo_index >= self.photo_number:
					self.photo_index = self.photo_number - 1
				self.ui.set_preview(self.get_current_file())
			else:
				pass
		if config.mm_debug:
			print 'FIXME: Do Photo Delete: current index = ', self.photo_index

	def delete_selected(self):
		#/usr/local/lgvp/생략
		#for item in range(len(lists)):
		for i in range(self.photo_number):
			if self.ui.list.checked[i]:
				name = self.image_dir + self.lists[i][0]
				try:
					name = unicode(name, 'utf-8').encode('euc-kr')
				except:
					pass
				#cmd = 'rm -f %s'%(
				#os.system(cmd)
				os.remove(name)

	def delete_all(self):
		for i in range(self.photo_number):
			name = self.image_dir + self.lists[i][0]

			try:
				name = unicode(name, 'utf-8').encode('euc-kr')
			except:
				pass

			if self.is_slide_file(name):
				self.remove_slide_file(name)

			utils.remove(name)

		if not os.path.exists(config.image_bg_dir + setting.bg_image_file):
			setting.bg_image_file = config.image_bg_dir + config.def_bg
			baseui.change_bg(runtime.evas, setting.bg_image_file)
			print 'new bg_file =', setting.bg_image_file

	def is_selected(self):
		selected = 0
		for i in range(self.photo_number):
			if self.ui.list.checked[i]:
				selected += 1
		return selected

	def get_detail(self):
		photo_file = self.get_current_file()
		import time, ntptime
		stat_image = os.stat(photo_file)

		atime = os.stat(photo_file)[stat.ST_ATIME]
		mtime = os.stat(photo_file)[stat.ST_MTIME]
		
		ctime = time.localtime(atime)
		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])
		
		ctime = time.localtime(mtime)
		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])

		size = (stat_image[6] + 1023) / 1024

		name = photo_file.split('/')[-1]
		try:
			name = unicode(name, 'euc-kr').encode('utf-8')
		except:
			pass
		w, h = utils.get_img_size(photo_file)
		return (name, date, '%dKB' % size, "%dx%d" % (w, h))

	def set_background(self):
		if config.mm_debug:
			print 'FIXME: Do Photo set background: current index = ', self.photo_index
		full_path = self.get_current_file()
		try:
			full_path = unicode(full_path, 'utf-8').encode('euc-kr')
		except:
			pass
		setting.bg_image_file = full_path
		import baseui
		baseui.change_bg(runtime.evas, full_path)	

	def set_privacy(self):
		if config.mm_debug:
			print 'FIXME: Do Photo set privacy: current index = ', self.photo_index
		full_path = self.get_current_file()
		setting.privacy_category = 2
		setting.privacy_image_file = full_path

		# 리부팅 시 rc.local에서 /usr/local/lgvp/images/private.jpg'를 '/mfs/ram/images/private.jpg로 복사함.
		#command = 'cp \"%s\" \"%s\"' % (full_path, '/usr/local/lgvp/images/private.jpg')
		#os.system(command)
		# 지금 설정한 것이 바로 다음 call 부터 적용 되게...
		#command = 'cp \"%s\" \"%s\"' % (full_path, '/mfs/ram/images/private.jpg')
		#os.system(command)
		import shutil
		shutil.copyfile(full_path, '/usr/local/lgvp/images/private.jpg')
		shutil.copyfile(full_path,'/mfs/ram/images/private.jpg')
		
		setting.save()
		
	def handle_key(self, key):
		if key == config.Menu1:
			if self.ipemailMessage:
				from ipemailstage import IpEmailAttachNotify
				runtime.manager.stack_stage(IpEmailAttachNotify(_('Photo attached'), \
					unicode(self.get_current_file())))
				return True
			if self.mms_mode:
				from mmsmanager import mmsmgr
				from mmscomposestage import MMSMessageNotify, MMSMessageNotify_cb, MMSSize_excess
				from mmsconfig import MEDIA_IMAGE
				mmsmessage = ''
				if self.mms_mode == 1:
					if self.photo_type == 'taken':
						mmsmessage = _('Photo')
					elif self.photo_type == 'picture':
						mmsmessage = _('Picture')
					elif self.photo_type == 'wallpaper':
						mmsmessage = _('Wallpaper')
					elif self.photo_type == 'vdc':
						mmsmessage = _('Image')
					mmsmessage = mmsmessage + ' ' + _('inserted')
				else:
					mmsmessage = _('Image modified')

				if mmsmgr.setmedia(MEDIA_IMAGE, self.get_current_file()):
					runtime.manager.change_stage(MMSMessageNotify(mmsmessage, MMSMessageNotify_cb))
				else:
					MMSSize_excess()
			else:
				if status.snapshot_editing:
					from phonedb import phonedb
					stage = runtime.manager.find_stage('modify kind')
					if stage:
						phonedb.set_snapshot(self.get_current_file())
						def cb():
							runtime.manager.back_stage('modify kind')
						utils.player.play_effect(config.SETTING_SUCCEEDED)	
						stage = NotifyStage(_('Image modified'), uiconfig.baloon_phonebook_icon, cb)
						runtime.manager.change_stage(stage)
					else:
						status.phone_item.snapshot = self.get_current_file()
						def cb():
							runtime.manager.back_stage('add last')
						utils.player.play_effect(config.SETTING_SUCCEEDED)	
						stage = NotifyStage(_('Image assigned'), uiconfig.baloon_phonebook_icon, cb)
						runtime.manager.change_stage(stage)
				else:
					#runtime.manager.stack_stage(PhotoGalleryOptionStage(self.photo_type, True))
					runtime.manager.stack_stage(PhotoGalleryOptionStage(self.photo_type, self.is_selected(), True))
					
		elif key == config.Menu4 or key == 'CLR':
			stage = runtime.manager.find_stage( 'my album')
			if stage != None:
				runtime.manager.back_stage( 'my album')
			else:
				stage = runtime.manager.find_stage('screensaver')
				if stage != None:
					runtime.manager.back_stage('screensaver')
				else:
					stage = runtime.manager.find_stage('MMToolsStage')
					if stage != None:
						runtime.manager.back_stage('MMToolsStage')
					else:
						untime.manager.back_stage()
			
		elif key == config.Menu3:
			#stage =  PhotoGalleryMultiStage(self.photo_type)
			photo_file = self.get_current_file()
			name = photo_file.split('/')[-1]
			stage =  PhotoGalleryStage(self.photo_type, file=name)
			runtime.manager.change_stage(stage)	

		elif key == 'Up':			
			self.change_photo(-1)
			return self.ui.handle_key(key)
			
		elif key == 'Down':			
			self.change_photo(+1)
			return self.ui.handle_key(key)
			
#		elif key == config.Menu2:
#			self.set_slide_file()
#			setting.save()
#			stage = NotifyStage(_('Slideshow image set'), uiconfig.baloon_phonebook_icon)
#			runtime.manager.change_stage(stage)
		elif key == config.Menu2 or key == 'OK':
			return PhotoGalleryCheckListStage.handle_key(self,key)
			
		else:
			return False
		return True

	
class _ExtPhotoGalleryListStage(ExtPhotoGalleryCheckListStage):	
	name = 'external photo gallery'
	def __init__(self,photo_type, dirname, lists, mms_mode=0, ipemailMessage=None, isshow=True, titleimage=None):
		#print "[yylee debug] _ExtPhotoGalleryListStage init"
		#status.supervision_not_allowed = 1
		self.mms_mode=mms_mode
		self.ipemailMessage = ipemailMessage
		self.photo_type = photo_type
		self.image_dir = dirname
		self.lists = lists
		self.choice = []
		self.preview_flag = 0
		for lst in self.lists:
			name = lst[0]
			dot = name.rfind('.')
			if dot >= 0:
				name = name[:dot]
				try:
					name = unicode(name, 'euc-kr').encode('utf-8')
				except:
					pass
			self.choice.append(name)
		#print "[yylee debug] _ExtPhotoGalleryListStage #1 titleimage=", titleimage
		ExtPhotoGalleryCheckListStage.__init__(self,self.choice, titleimage)	
		self.photo_index = 0
		self.photo_number = len(self.lists)
		#print "[yylee debug] _ExtPhotoGalleryListStage #2", self.get_current_file()
		#self.ui.set_preview(self.get_current_file())

		self.popup_image = None
		self.popup_icon = None
		self.popup_label = None
		self.popup_msg = None
		
		def preview_cb():
			self.ui.set_preview(self.get_current_file())
			self._preview_tag = None

		self._preview_tag = utils.Timer(100, preview_cb)

	def destroy(self):
		if self.photo_type == 'usb':
			utils.usb_umount()
		self.popup_free()
		Stage.destroy(self)

	
	def popup_init(self):
		# pop window image
		self.popup_image = utils.put_image(uiconfig.pop_window_image, uiconfig.pop_window_image_pos)
		self.popup_image.hide()

		# title icon
		self.popup_icon = utils.put_image(uiconfig.pop_window_icon, uiconfig.pop_window_icon_pos)
		self.popup_icon.hide()

		# title text
		font = uiconfig.pop_window_title_font
		color = uiconfig.pop_window_title_color
		import widget
		self.popup_label = widget.OutlineLabel(_('INFO'), font, uiconfig.pop_window_title_pos, color, align=uiconfig.ALIGN_LEFT)
		self.popup_label.hide()

		# message
		pos = uiconfig.pop_window_text1_pos
		self.popup_msg = runtime.evas.text(text=_('Copying...'), pos=pos, color=uiconfig.pop_window_text_color, font=uiconfig.pop_window_font)
		self.popup_msg.hide()
		self.align_center(self.popup_msg, pos)

	def align_center(self, l, pos):
		x, y = pos
		width, height = l.size
		l.move(x - width/2, y)

	def popup_free(self):
		if self.popup_image:
			self.popup_image.free()
		if self.popup_icon:
			self.popup_icon.free()
		if self.popup_label:
			self.popup_label.free()
		if self.popup_msg:
			self.popup_msg.free()

	def popup_show(self):
		self.popup_image.show()
		self.popup_icon.show()
		self.popup_label.show()
		self.popup_msg.show()

	def popup_hide(self):
		self.popup_image.hide()
		self.popup_icon.hide()
		self.popup_label.hide()
		self.popup_msg.hide()

	def init_list(self, lists, isshow=True):
		self.photo_index = 0
		self.photo_number = len(lists)
		self.sort(isshow)
		
	def change_photo(self, delta):		
		self.photo_index += delta
		if self.photo_index < 0:
			self.photo_index = self.photo_number - 1
		elif self.photo_index >= self.photo_number:
			self.photo_index = 0
		self.ui.set_preview(self.get_current_file())

	def get_current_file(self):
		return self.image_dir + self.lists[self.photo_index][0]

	def check_selected_any(self):
		for i in range(self.photo_number):
			if self.ui.list.checked[i]:
				return True
		return False
		
	def copy_selected_files(self):
		#/usr/local/lgvp/생략
		#for item in range(len(lists)):
		status.ext_gallery_copy_error = 0
		status.ext_gallery_copy_error_filename = ''
		sel_count = 0
		pass_count = 0
		for j in range(self.photo_number):
			if self.ui.list.checked[j]:
				sel_count += 1		
		for i in range(self.photo_number):
			if self.ui.list.checked[i]:
				name = self.image_dir + self.lists[i][0]
				
				slash =name.rfind('/')
				if slash >=0:
					last_name = name[slash+1:]
				else:
					last_name = name

				dot = last_name.rfind('.')
				if dot >= 0:
					last_name_except_ext = last_name[:dot]
					my_ext = last_name[dot:]
				else:
					last_name_except_ext = last_name
					my_ext = ''

				'''
				if len(last_name_except_ext) > 16:
					last_name = last_name_except_ext[:16]+my_ext
				'''

				dst_name = config.audio_root_dir + config.image_taken_dir + last_name

				# space check
				free_flash = utils.get_free_flash_memory()
				if free_flash < config.media_min_free_storage:
					status.ext_gallery_copy_error = -4
					status.ext_gallery_copy_error_filename = last_name_except_ext
					return False

				# duplication check
				if not os.access(dst_name , os.R_OK):	
					if not utils.image_isvalid(name):
						status.ext_gallery_copy_error = -3
						status.ext_gallery_copy_error_filename = last_name_except_ext
						return False
						
					tmp_w, tmp_h = utils.get_img_size(name)
					#print '### IMAGE SIZE', tmp_w, tmp_h
					if tmp_w * tmp_h > 640* 480:
						if self.image_dir == config.usb_dir:
							src_name = config.usb_dir+last_name
						else:
							src_name = config.sdmmc_dir+last_name

							#src_name = '\"' + src_name + '\"'
							#dst_name = '\"' + dst_name + '\"'
							
							try:
								src_name = unicode(src_name, 'euc-kr').encode('utf-8')
							except:
								print 'encoding error src'
								pass

						#dst_name = unicode(dst_name, 'euc-kr').encode('utf-8')
						res = utils.image_file_resize(src_name, dst_name, 640, 480)
						#print '### image_file_resize', src_name, dst_name, res
					
						# resize 실패 시 - unsupported format
						if res != 1:
							status.ext_gallery_copy_error = -3
							status.ext_gallery_copy_error_filename = last_name_except_ext
							return False	
					else:
						#cmd = 'cp %s %s'%(name, dst_name)
						#os.system(cmd)
						os.system('cp \"%s\" \"%s\"'%(name, dst_name))
						

					# copy 결과 파일 existance check
					if not os.access(dst_name , os.R_OK):	
						status.ext_gallery_copy_error = -2
						status.ext_gallery_copy_error_filename = last_name_except_ext
						return False
					else:
						# copy 파일의 size 가 0 인 경우.
						if utils.get_file_size(dst_name) == 0:
							utils.remove(dst_name)
							status.ext_gallery_copy_error = -2
							status.ext_gallery_copy_error_filename = last_name_except_ext
							return False
				else:
					pass_count += 1
					if sel_count == pass_count:
						status.ext_gallery_copy_error = -1
						status.ext_gallery_copy_error_filename = last_name_except_ext
						return False
		return True

	def sort(self, isshow=True):
		if setting.photo_sort_rule == 0: # name
			def sort_func(x,y):
				return cmp(x[0].lower(), y[0].lower())
		elif setting.photo_sort_rule == 1: # size
			def sort_func(x,y,sort_col=setting.photo_sort_rule):
				return cmp(x[sort_col], y[sort_col])
		else: # date
			def sort_func(x,y,sort_col=setting.photo_sort_rule):
				return -(cmp(x[sort_col], y[sort_col]))
		self.lists.sort(sort_func)

		self.photo_index = 0
		if isshow:
			self.ui.set_preview(self.get_current_file())

	def get_current_name(self):
		name = self.lists[self.photo_index][0]
		dot = name.rfind('.')
		if dot >= 0:
			name = name[:dot]
		return name

	def get_detail(self):
		photo_file = self.get_current_file()
		import time, ntptime
		stat_image = os.stat(photo_file)
		atime = os.stat(photo_file)[stat.ST_ATIME]
		mtime = os.stat(photo_file)[stat.ST_MTIME]
		ctime = time.localtime(atime)
		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])
		ctime = time.localtime(mtime)
		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])
		size = (stat_image[6] + 1023)/ 1024
		name = photo_file.split('/')[-1]
		w, h = utils.get_img_size(photo_file)
		return (name, date, '%dKB' % size, "%dx%d" % (w, h))
	
	def handle_key(self, key):
		if key == config.Menu1:
			if self.check_selected_any():
				self.popup_init()
				self.popup_show()
				runtime.evas.render_now()
				# flash memory full check
				free_flash = utils.get_free_flash_memory()
				#print "[yylee debug] free_flash", free_flash
				if free_flash < config.media_min_free_storage:
					self.popup_hide()
					utils.player.play_effect(config.SETTING_FAILED)
					stage = NotifyStage(_('Gallery is full!'), uiconfig.baloon_photo_icon)
					runtime.manager.change_stage(stage)
					return False
					
				def cb():
					runtime.manager.back_stage('select external album')
					return
				def cb_back():
					runtime.manager.back_stage()
					return

				if self.copy_selected_files() == True:
					self.popup_hide()
					stage = NotifyStage(_('Selected photo copied'), uiconfig.baloon_phonebook_icon, cb=cb)
					runtime.manager.change_stage(stage)
				else:
					msg = ''
					
					try:
						err_file = unicode(status.ext_gallery_copy_error_filename, 'euc-kr').encode('utf-8')
					except:
						err_file = status.ext_gallery_copy_error_filename
						
					err_file = utils.cut_text(err_file, 160, uiconfig.baloon_text_font[1], with_punc=True)[0]
					if status.ext_gallery_copy_error == -1:
						msg = '\"'+err_file+'\"'+_('already exist.')
					elif status.ext_gallery_copy_error == -2:
						msg = '\"'+err_file+'\"'+_('copy failed.')
					elif status.ext_gallery_copy_error == -3:
						msg = '\"'+err_file+'\"'+_('cannot be copied.')
					elif status.ext_gallery_copy_error == -4:
						msg = '\"'+err_file+'\"'+_('Not enough space to store data')

					self.popup_hide()
					stage = NotifyStage(msg, uiconfig.baloon_phonebook_icon, cb=cb_back)
					runtime.manager.stack_stage(stage)
			else:
				def cb():
					runtime.manager.back_stage()
					return
				stage = NotifyStage(_('No photo\n selected.'), uiconfig.baloon_phonebook_icon, cb=cb)
				runtime.manager.stack_stage(stage)
				
		elif key == config.Menu4 or key=='CLR':
			runtime.manager.back_stage('select external album')		
		elif key == 'Up':			
			self.change_photo(-1)
			return self.ui.handle_key(key)
		elif key == 'Down':			
			self.change_photo(+1)
			return self.ui.handle_key(key)
		elif key == config.ok or key == config.Menu2:
			return ExtPhotoGalleryCheckListStage.handle_key(self,key)
		else:
			return False
		return True

		
class _PhotoGalleryStage(Stage):
	name = 'photo gallery'
	def __init__(self, photo_type, dirname, lists, mms_mode=0, ipemailMessage=None, isshow=True, file=None):
		#status.supervision_not_allowed = 1
		self.mms_mode=mms_mode
		self.ipemailMessage = ipemailMessage
		titles = {'taken':_('PHOTO GALLERY'), \
			'picture':_('PICTURES'),  'wallpaper':_('WALLPAPERS'), \
			'vdc': _("VIDEOPHONE'S IMAGES")}
		self.preview_flag = 0
		self.photo_type = photo_type
		self.image_dir = dirname
		if status.snapshot_editing:
			self.ui = baseui.GalleryUI(_('SET'), _('BACK'))
		else:
			if mms_mode or ipemailMessage:
				self.ui = baseui.GalleryUI(_('MENU'), _('WIDE SIZE'), _('LIST'), _('BACK'))
			else:
				self.ui = baseui.GalleryUI(_('MENU'), _('WIDE SIZE'), _('LIST'), _('BACK'))
				
		if file != None:
			isshow=False
			
		self.init_list(lists, isshow)

		if file != None:
			try:
				file = unicode(file, 'utf-8').encode('euc-kr')
			except:
				pass
			self.set_file(file)

	def set_file(self, file):
		for i, f in enumerate(self.lists):
			if f[0] == file:
				self.photo_index = i
				self.ui.set_preview(self.get_current_file())
				return

	def init_list(self, lists, isshow=True):
		self.photo_index = 0
		self.photo_number = len(lists)
		self.lists = lists
		self.sort(isshow)

	def handle_key(self, key):
		if key == config.Menu1:
			if self.ipemailMessage:
				from ipemailstage import IpEmailAttachNotify
				runtime.manager.stack_stage(IpEmailAttachNotify(_('Photo attached'), \
					unicode(self.get_current_file())))
				return True
			if self.mms_mode:
				from mmsmanager import mmsmgr
				from mmscomposestage import MMSMessageNotify, MMSMessageNotify_cb, MMSSize_excess
				from mmsconfig import MEDIA_IMAGE
				mmsmessage = ''
				if self.mms_mode == 1:
					if self.photo_type == 'taken':
						mmsmessage = _('Photo')
					elif self.photo_type == 'picture':
						mmsmessage = _('Picture')
					elif self.photo_type == 'wallpaper':
						mmsmessage = _('Wallpaper')
					elif self.photo_type == 'vdc':
						mmsmessage = _('Image')
					mmsmessage = mmsmessage + ' ' + _('inserted')
				else:
					mmsmessage = _('Image modified')

				if mmsmgr.setmedia(MEDIA_IMAGE, self.get_current_file()):
					runtime.manager.change_stage(MMSMessageNotify(mmsmessage, MMSMessageNotify_cb))
				else:
					MMSSize_excess()
			else:
				if status.snapshot_editing:
					from phonedb import phonedb
					stage = runtime.manager.find_stage('modify kind')
					if stage:
						phonedb.set_snapshot(self.get_current_file())
						def cb():
							runtime.manager.back_stage('modify kind')
						stage = NotifyStage(_('Image modified'), uiconfig.baloon_phonebook_icon, cb)
						runtime.manager.change_stage(stage)
					else:
						status.phone_item.snapshot = self.get_current_file()
						def cb():
							runtime.manager.back_stage('add last')
						stage = NotifyStage(_('Image assigned'), uiconfig.baloon_phonebook_icon, cb)
						runtime.manager.change_stage(stage)
				else:
					runtime.manager.stack_stage(PhotoGalleryOptionStage(self.photo_type))
		elif key == config.Menu4 or key == 'CLR':
			stage = runtime.manager.find_stage( 'my album')
			if stage != None:
				runtime.manager.back_stage( 'my album')
			else:
				stage = runtime.manager.find_stage('MMToolsStage')
				if stage != None:
					runtime.manager.back_stage('MMToolsStage')
				else:
					runtime.manager.back_stage()
		elif key == config.Menu3:
			stage =  PhotoGalleryListStage(self.photo_type)
			#runtime.manager.stack_stage(stage)
			runtime.manager.change_stage(stage)
		elif key == config.Menu2 or key == 'OK':
			if self.preview_flag == 0:
				self.preview_flag = 1
				runtime.rb.set_text(_('NORMAL SIZE'))
			else:
				self.preview_flag = 0
				runtime.rb.set_text(_('WIDE SIZE'))
			'''
			self.ui.small_arrow_left.hide()
			self.ui.small_arrow_right.hide()
			self.ui.large_arrow_left.hide()
			self.ui.large_arrow_right.hide()
			'''
			if len(self.lists) == 1:
				self.ui.small_arrow_left.hide()
				self.ui.small_arrow_right.hide()
				self.ui.large_arrow_left.hide()
				self.ui.large_arrow_right.hide()	
			elif self.preview_flag == 0:
				self.ui.small_arrow_left.show()
				self.ui.small_arrow_right.show()
				self.ui.large_arrow_left.hide()
				self.ui.large_arrow_right.hide()	
			else:
				self.ui.small_arrow_left.hide()
				self.ui.small_arrow_right.hide()
				self.ui.large_arrow_left.show()
				self.ui.large_arrow_right.show()
			self.ui.set_preview(self.get_current_file(), self.preview_flag)
			
		elif key == 'Left':
			if len(self.lists) == 1:
				self.ui.small_arrow_left.hide()
				self.ui.small_arrow_right.hide()
				self.ui.large_arrow_left.hide()
				self.ui.large_arrow_right.hide()	
			elif self.preview_flag == 0:
				self.ui.small_arrow_left.show()
				self.ui.small_arrow_right.show()
				self.ui.large_arrow_left.hide()
				self.ui.large_arrow_right.hide()	
			else:
				self.ui.small_arrow_left.hide()
				self.ui.small_arrow_right.hide()
				self.ui.large_arrow_left.show()
				self.ui.large_arrow_right.show()	
			self.change_photo(-1,self.preview_flag)
			
		elif key == 'Right':
			if len(self.lists) == 1:
				self.ui.small_arrow_left.hide()
				self.ui.small_arrow_right.hide()
				self.ui.large_arrow_left.hide()
				self.ui.large_arrow_right.hide()	
			elif self.preview_flag == 0:
				self.ui.small_arrow_left.show()
				self.ui.small_arrow_right.show()
				self.ui.large_arrow_left.hide()
				self.ui.large_arrow_right.hide()
			else:
				self.ui.small_arrow_left.hide()
				self.ui.small_arrow_right.hide()
				self.ui.large_arrow_left.show()
				self.ui.large_arrow_right.show()	
			self.change_photo(+1,self.preview_flag)
		else:
			return False
		return True

	def change_photo(self, delta, pre_flag=0):
		self.photo_index += delta
		if self.photo_index < 0:
			self.photo_index = self.photo_number - 1
		elif self.photo_index >= self.photo_number:
			self.photo_index = 0
		self.ui.set_preview(self.get_current_file(),pre_flag)

	def get_current_file(self):
		return self.image_dir + self.lists[self.photo_index][0]

	def sort(self, isshow=True):
		if setting.photo_sort_rule == 0: # name
			def sort_func(x,y):
				return cmp(x[0].lower(), y[0].lower())
		elif setting.photo_sort_rule == 1: # size
			def sort_func(x,y,sort_col=setting.photo_sort_rule):
				return cmp(x[sort_col], y[sort_col])
		else: # date
			def sort_func(x,y,sort_col=setting.photo_sort_rule):
				return -(cmp(x[sort_col], y[sort_col]))
		self.lists.sort(sort_func)

		self.photo_index = 0
		if isshow:
			self.ui.set_preview(self.get_current_file(),self.preview_flag)

	def get_current_name(self):
		name = self.lists[self.photo_index][0]
		dot = name.rfind('.')
		if dot >= 0:
			name = name[:dot]
			try:
				name = unicode(name, 'euc-kr').encode('utf-8')
			except:
				pass
		return name

	def rename_is_ok(self, name):
		old = self.get_current_file()
		ext = utils.get_ext(old)
		name = name + '.' + ext
		new_name = self.image_dir + name
		try:
			new_name = unicode(new_name , 'utf-8').encode('euc-kr')
		except:
			pass

		import os.path
		if os.path.exists(new_name):
			return False
		return True

	def is_slide_file(self, filename):
		for slide in setting.slideshow_list:
			if filename == slide:
				return True
		return False

	def remove_slide_file(self, filename):
		setting.slideshow_list.remove(filename)
		setting.save()
		return True

	def rename_slide_file(self, org_filename, new_filename):
		if self.is_slide_file(org_filename):
			self.remove_slide_file(org_filename)
			setting.slideshow_list.append(new_filename)
			setting.save()
		return True
		
	def rename(self, name):
		old = self.get_current_file()
		ext = utils.get_ext(old)
		name = name + '.' + ext
		new_name = self.image_dir + name

		try:
			old_filename = unicode(old, 'utf-8').encode('euc-kr')
		except:
			old_filename = old

		try:
			new_filename = unicode(new_name , 'utf-8').encode('euc-kr')
		except:
			new_filename = new_name
			
		#print "[yylee debug] rename B %s : %s"%(old_filename, new_filename)
		if utils.rename(old_filename, new_filename):
			self.lists[self.photo_index] = (name,) + self.lists[self.photo_index][1:]
			self.ui.set_preview(self.get_current_file(),self.preview_flag)
			self.rename_slide_file(old_filename, new_filename)
		else:
			if config.mm_debug:
				print 'Rename failed'
		if config.mm_debug:
			print 'FIXME: Do Photo Rename: current index = ', self.photo_index

	def delete(self):
		name = self.get_current_file()
		try:
			name = unicode(name , 'utf-8').encode('euc-kr')
		except:
			pass

		#슬라이드쇼 지정 파일인 경우 슬라이드 리스트에서 제외
		if self.is_slide_file(name):
			self.remove_slide_file(name)

		if utils.remove(name):
			del self.lists[self.photo_index]
			self.photo_number = len(self.lists)
			if self.photo_number > 0:
				if self.photo_index >= self.photo_number:
					self.photo_index = self.photo_number - 1
				self.ui.set_preview(self.get_current_file(), self.preview_flag)
			else:
				pass
		if config.mm_debug:
			print 'FIXME: Do Photo Delete: current index = ', self.photo_index

	def get_detail(self):
		photo_file = self.get_current_file()
		import time, ntptime
		stat_image = os.stat(photo_file)

		atime = os.stat(photo_file)[stat.ST_ATIME]
#		print 'atime**********************', atime
		mtime = os.stat(photo_file)[stat.ST_MTIME]
#		print 'atime**********************', mtime

		ctime = time.localtime(atime)

		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])

#		print 'atime', date 
		
		ctime = time.localtime(mtime)

		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])

#		print 'mtime', date 

		size = (stat_image[6] + 1023)/ 1024
#MMW		
#		import stat
#		atime = os.stat(photo_file)[stat.ST_ATIME]
#		print 'photo_file', photo_file
#		print 'get_detail', atime
#		dtime = time.ctime(atime)
#		print 'dtime', dtime
#end of MMW


		name = photo_file.split('/')[-1]
		try:
			name = unicode(name, 'euc-kr').encode('utf-8')
		except:
			pass
		w, h = utils.get_img_size(photo_file)
		return (name, date, '%dKB' % size, "%dx%d" % (w, h))

	def set_background(self):
		if config.mm_debug:
			print 'FIXME: Do Photo set background: current index = ', self.photo_index
		full_path = self.get_current_file()
		try:
			full_path = unicode(full_path , 'utf-8').encode('euc-kr')
		except:
			pass
		setting.bg_image_file = full_path
		import baseui
		baseui.change_bg(runtime.evas, full_path)

	def set_privacy(self):
		if config.mm_debug:
			print 'FIXME: Do Photo set privacy: current index = ', self.photo_index
		full_path = self.get_current_file()
		setting.privacy_category = 2
		setting.privacy_image_file = full_path

		# 리부팅 시 rc.local에서 /usr/local/lgvp/images/private.jpg'를 '/mfs/ram/images/private.jpg로 복사함.
		#command = 'cp \"%s\" \"%s\"' % (full_path, '/usr/local/lgvp/images/private.jpg')
		#os.system(command)
		# 지금 설정한 것이 바로 다음 call 부터 적용 되게...
		#command = 'cp \"%s\" \"%s\"' % (full_path, '/mfs/ram/images/private.jpg')
		#os.system(command)
		import shutil
		shutil.copyfile(full_path, '/usr/local/lgvp/images/private.jpg')
		shutil.copyfile(full_path,'/mfs/ram/images/private.jpg')
		
		setting.save()

	def show(self):
		if len(self.lists) == 0:
			if config.mm_debug:
				print 'FIXME: list len = 0 in Photo Gallery'
			runtime.manager.back_stage()
			return
		# 이미지가 하나만 있을 경우에는 arrow 표시 안함
		#self.ui.show_arrow(len(self.lists) > 1)
		Stage.show(self)
		if len(self.lists) == 1:
			self.ui.small_arrow_left.hide()
			self.ui.small_arrow_right.hide()
			self.ui.large_arrow_left.hide()
			self.ui.large_arrow_right.hide()	
		elif self.preview_flag == 0:
			self.ui.small_arrow_left.show()
			self.ui.small_arrow_right.show()
			self.ui.large_arrow_left.hide()
			self.ui.large_arrow_right.hide()	
		else:
			self.ui.small_arrow_left.hide()
			self.ui.small_arrow_right.hide()
			self.ui.large_arrow_left.show()
			self.ui.large_arrow_right.show()

		if self.preview_flag == 0:
			runtime.rb.set_text(_('WIDE SIZE'))
		else:
			runtime.rb.set_text(_('NORMAL SIZE'))

class _SlideshowSelectStage(SlideshowSelectCheckListStage):	
	name = 'slideshow photo gallery'
	def __init__(self,photo_type, dirname, lists, mms_mode=0, ipemailMessage=None, isshow=True):
		#status.supervision_not_allowed = 1
		self.mms_mode=mms_mode
		self.ipemailMessage = ipemailMessage
		titles = {'taken':_('PHOTO GALLERY'), \
			'picture':_('PICTURES'),  'wallpaper':_('WALLPAPERS'), \
			'vdc': _("VIDEOPHONE'S IMAGES")}
		self.photo_type = photo_type
		self.image_dir = dirname
		self.lists = lists

		self.photo_index = 0
		self.photo_number = len(self.lists)
		self.sort(isshow=False)

		self.choice = []
		self.preview_flag = 0
		for lst in self.lists:
			name = lst[0]
			dot = name.rfind('.')
			if dot >= 0:
				name = name[:dot]
				try:
					name = unicode(name, 'euc-kr').encode('utf-8')
				except:
					name = name
			self.choice.append(name)

		titleimage = uiconfig.slideshow_select_title
		SlideshowSelectCheckListStage.__init__(self,self.choice, titleimage)	

		#self.ui.set_preview(self.get_current_file())
		#self.get_slide_file()

		def preview_cb():
			self.ui.set_preview(self.get_current_file())
			self.get_slide_file()
			self._preview_tag = None

		self._preview_tag = utils.Timer(100, preview_cb)
		
	def init_list(self, lists, isshow=True):
		self.photo_index = 0
		self.photo_number = len(lists)
		self.sort(isshow)
		
	def change_photo(self, delta):		
		self.photo_index += delta
		if self.photo_index < 0:
			self.photo_index = self.photo_number - 1
		elif self.photo_index >= self.photo_number:
			self.photo_index = 0
		self.ui.set_preview(self.get_current_file())

	def get_current_file(self):
		return self.image_dir + self.lists[self.photo_index][0]

	# KA: [20080509] slide show
	def get_slide_file(self):
		files = setting.slideshow_list #now only taken folder --just write name
		#if not files:
		if not files or not self.lists:
			return
		select_index = []	# 현재 list에서 slideshow 로 지정된 파일의 index

		sel_idx = 0
		for lst in self.lists:
			name = self.image_dir + lst[0]
			try:
				index = files.index(name)
				select_index.append(sel_idx)
			except:
				pass
			sel_idx += 1
				
		if select_index:
			#for i in range(len(select_index)):
			for i in select_index:
				self.ui.set_check(i, True) # choinhwa 20081017 기 설정된 리스트에 체크박스 표시된 상태로 시작.
				self.ui.set_slide_check(i, True)

	def is_slide_file(self, filename):
		for slide in setting.slideshow_list:
			if filename == slide:
				return True
		return False

	def remove_slide_file(self, filename):
		setting.slideshow_list.remove(filename)
		setting.save()
		return True

	def rename_slide_file(self, org_filename, new_filename):
		if self.is_slide_file(org_filename):
			self.remove_slide_file(org_filename)
			setting.slideshow_list.append(new_filename)
			setting.save()
		return True
		
	def set_slide_file(self):
		#/usr/local/lgvp/생략
		#for item in range(len(lists)):
		files = []
		sel_count = 0
		for i in range(self.photo_number):
			if self.ui.list.checked[i]:
				name = self.image_dir + self.lists[i][0]
				try:
					name = unicode(name, 'utf-8').encode('euc-kr')
				except:
					pass
				files.append(name)
				sel_count += 1
		if sel_count == 0:
			return 0
		setting.set_slideshow_list(files)
		return sel_count
		
	# KA: [20080509] slide show ==

	def sort(self, isshow=True):
		'''
		if setting.photo_sort_rule == 0: # name
			def sort_func(x,y):
				return cmp(x[0].lower(), y[0].lower())
		elif setting.photo_sort_rule == 1: # size
			def sort_func(x,y,sort_col=setting.photo_sort_rule):
				return cmp(x[sort_col], y[sort_col])
		else: # date
			def sort_func(x,y,sort_col=setting.photo_sort_rule):
				return -(cmp(x[sort_col], y[sort_col]))
		self.lists.sort(sort_func)
		'''


		print 'before', self.lists
		# 최근 사진이 제일 위로 오도록 정렬.
		def sort_func(x, y, sort_col = setting.photo_sort_rule):
			return cmp(y[2], x[2])
		self.lists.sort(sort_func)
		print 'after', self.lists

		self.photo_index = 0
		if isshow:
			self.ui.set_preview(self.get_current_file())

	def get_current_name(self):
		name = self.lists[self.photo_index][0]
		dot = name.rfind('.')
		if dot >= 0:
			name = name[:dot]
			try:
				name = unicode(name, 'euc-kr').encode('utf-8')
			except:
				pass
		return name
		
	def rename_is_ok(self, name):
		old = self.get_current_file()
		ext = utils.get_ext(old)
		name = name + '.' + ext
		new_name = self.image_dir + name
		try:
			new_name = unicode(new_name, 'utf-8').encode('euc-kr')
		except:
			pass
		
		import os.path
		if os.path.exists(new_name):
			return False
		return True

	def rename(self, name):
		old = self.get_current_file()
		ext = utils.get_ext(old)
		name = name + '.' + ext
		new_name = self.image_dir + name

		try:
			old_filename = unicode(old, 'utf-8').encode('euc-kr')
		except:
			old_filename = old
		try:
			new_filename = unicode(new_name , 'utf-8').encode('euc-kr')
		except:
			new_filename = new_name

		#print "[yylee debug] rename L %s : %s"%(old_filename, new_filename)
		#if utils.rename(old, new_name):
		if utils.rename(old_filename ,new_filename):
			self.lists[self.photo_index] = (name,) + self.lists[self.photo_index][1:]
			#self.ui.set_preview(self.get_current_file(),self.preview_flag)
			self.ui.set_preview(self.get_current_file())
			self.rename_slide_file(old_filename, new_filename)
		else:
			if config.mm_debug:
				print 'Rename failed'
		if config.mm_debug:
			print 'FIXME: Do Photo Rename: current index = ', self.photo_index

	def delete(self):
		name = self.get_current_file()
		try:
			name = unicode(name, 'utf-8').encode('euc-kr')
		except:
			pass
		
		#슬라이드쇼 지정 파일인 경우 슬라이드 리스트에서 제외
		if self.is_slide_file(name):
			self.remove_slide_file(name)
			
		if utils.remove(name):
			del self.lists[self.photo_index]
			self.photo_number = len(self.lists)
			if self.photo_number > 0:
				if self.photo_index >= self.photo_number:
					self.photo_index = self.photo_number - 1
				self.ui.set_preview(self.get_current_file())
			else:
				pass
		if config.mm_debug:
			print 'FIXME: Do Photo Delete: current index = ', self.photo_index

	def delete_selected(self):
		#/usr/local/lgvp/생략
		#for item in range(len(lists)):
		for i in range(self.photo_number):
			if self.ui.list.checked[i]:
				name = self.image_dir + self.lists[i][0]
				try:
					name = unicode(name, 'utf-8').encode('euc-kr')
				except:
					pass
				#cmd = 'rm -f %s'%(
				#os.system(cmd)
				os.remove(name)


	def is_selected(self):
		selected = 0
		for i in range(self.photo_number):
			if self.ui.list.checked[i]:
				selected += 1
		return selected

	def get_detail(self):
		photo_file = self.get_current_file()
		import time, ntptime
		stat_image = os.stat(photo_file)

		atime = os.stat(photo_file)[stat.ST_ATIME]
		mtime = os.stat(photo_file)[stat.ST_MTIME]
		
		ctime = time.localtime(atime)
		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])
		
		ctime = time.localtime(mtime)
		date = '%02d/%02d/%03d' % (ctime[2], ctime[1], ctime[0])

		size = (stat_image[6] + 1023) / 1024

		name = photo_file.split('/')[-1]
		try:
			name = unicode(name, 'euc-kr').encode('utf-8')
		except:
			pass
		w, h = utils.get_img_size(photo_file)
		return (name, date, '%dKB' % size, "%dx%d" % (w, h))

	def set_background(self):
		if config.mm_debug:
			print 'FIXME: Do Photo set background: current index = ', self.photo_index
		full_path = self.get_current_file()
		try:
			full_path = unicode(full_path, 'utf-8').encode('euc-kr')
		except:
			pass
		setting.bg_image_file = full_path
		import baseui
		baseui.change_bg(runtime.evas, full_path)	

	def set_privacy(self):
		if config.mm_debug:
			print 'FIXME: Do Photo set privacy: current index = ', self.photo_index
		full_path = self.get_current_file()
		setting.privacy_category = 2
		setting.privacy_image_file = full_path

		# 리부팅 시 rc.local에서 /usr/local/lgvp/images/private.jpg'를 '/mfs/ram/images/private.jpg로 복사함.
		#command = 'cp \"%s\" \"%s\"' % (full_path, '/usr/local/lgvp/images/private.jpg')
		#os.system(command)
		# 지금 설정한 것이 바로 다음 call 부터 적용 되게...
		#command = 'cp \"%s\" \"%s\"' % (full_path, '/mfs/ram/images/private.jpg')
		#os.system(command)
		import shutil
		shutil.copyfile(full_path, '/usr/local/lgvp/images/private.jpg')
		shutil.copyfile(full_path,'/mfs/ram/images/private.jpg')

		setting.save()
		
	def handle_key(self, key):
		if key == config.Menu1:
			if self.set_slide_file() > 0 :
				setting.save()
				#stage = NotifyStage(_('Slideshow image set'), uiconfig.baloon_phonebook_icon)
				utils.player.play_effect(config.SETTING_SUCCEEDED)
				stage = NotifyStage(_('Slideshow image set.'), uiconfig.baloon_phonebook_icon)
				runtime.manager.change_stage(stage)
			else:
				utils.player.play_effect(config.SETTING_FAILED)
				stage = NotifyStage(_('Select images for digital photo album.'), uiconfig.baloon_phonebook_icon)
				runtime.manager.stack_stage(stage)
		elif key == config.Menu4 or key == 'CLR':
			stage = runtime.manager.find_stage('screensaver setting')
			if stage != None:
				runtime.manager.back_stage('screensaver setting')
			else:
				runtime.manager.back_stage()		
		elif key == config.Menu3:
			pass
		elif key == 'Up':			
			self.change_photo(-1)
			return self.ui.handle_key(key)			
		elif key == 'Down':			
			self.change_photo(+1)
			return self.ui.handle_key(key)
		elif key == config.Menu2 or key == 'OK':
			return SlideshowSelectCheckListStage.handle_key(self,key)
			
		else:
			return False
		return True

class TakenPhotoStage(ListStage):
	icon = uiconfig.image_image_sound_image_icon
	def __init__(self):
		self.title = _('TAKEN PHOTOS')
		self.choice = _('Add new'), _('Photo gallery')
		ListStage.__init__(self, self.choice)
		status.supervision_not_allowed = 1

	def activate(self, index):
		if index == 0:
			if status.phonebook_in_calling:
				stage = NotifyStage(_('Taking photo is not allowed during conversation.'), icon=uiconfig.baloon_image_sound_image_icon)
				runtime.manager.stack_stage(stage)
				return
			# 남은 공간 체크
			if not utils.check_free_storage():
				runtime.manager.stack_stage(StorageShortStage(uiconfig.baloon_photo_icon))
				return
			if config.snap_shot_max <= utils.get_file_count(config.image_taken_dir):
				runtime.manager.stack_stage(NotifyStage(_('Gallery is full!'), uiconfig.baloon_photo_icon))
				return

			if config.mm_debug:
				print 'photo capturer'
			if status.videocall_mode == status.VideoCallConnected:
				import videosetting
				stage = videosetting.SnapshotStage(from_phonebook=True)
			else:
				import mmtools
				stage = mmtools.PhotoPreviewStage
			runtime.manager.stack_stage(stage)
		elif index == 1:
			stage = PhotoGalleryStage('taken')
			runtime.manager.stack_stage(stage)

	def destroy(self):
		ListStage.destroy(self)
		status.supervision_not_allowed = 0


class ReceivedImagesStage(ListStage):
	icon = uiconfig.image_image_sound_image_icon
	def __init__(self):
		self.title = _('RECEIVED IMAGES')
		self.choice = _('Wallpapers'), _('Pictures')
	
		ListStage.__init__(self)
	def activate(self, index):
		if index == 0:
			stage = PhotoGalleryStage('wallpaper')
		else:
			stage = PhotoGalleryStage('picture')
		runtime.manager.stack_stage(stage)


class ImagesStage(ListStage):
	icon = uiconfig.image_image_sound_image_icon
	def __init__(self):
		self.title = _('IMAGES')
		self.choice = _('Taken photos'), _("Videophone's images"), _('Received images')
	
		ListStage.__init__(self)

	def activate(self, index):
		if index == 1:
			stage = PhotoGalleryStage('vdc')
		else:
			stage = (TakenPhotoStage, None, ReceivedImagesStage)[index]
		runtime.manager.stack_stage(stage)


class ImagesForPhonebookStage(ListStage):
	icon = uiconfig.image_image_sound_image_icon
	def __init__(self):
		self.title = _('ASSIGN IMAGE')
		self.choice = _('Taken photos'), _("Videophone images")

		status.snapshot_editing = True
		ListStage.__init__(self)
		status.supervision_not_allowed = 1

	def activate(self, index):
		if index == 1:
			stage = PhotoGalleryStage('vdc')
		else:
			stage = (TakenPhotoStage, None, ReceivedImagesStage)[index]
		runtime.manager.stack_stage(stage)

	def destroy(self):
		status.snapshot_editing = False
		ListStage.destroy(self)
		status.supervision_not_allowed = 0


class DeleteReceivedImageStage(ListStage):
	icon = uiconfig.image_image_sound_image_delete_icon
	def __init__(self):
		self.title = _('DELETE')
		self.choice = _('Wallpapers'), _('Pictures')
	
		ListStage.__init__(self)

	def activate(self, index):
		if index == 0:
			dirname, lists =  utils.get_image_gallery_list('wallpaper')
			if len(lists) == 0:
				runtime.manager.stack_stage(NotifyStage(_('No wallpapers'), uiconfig.baloon_photo_icon))
				return
			message = _('Delete all wallpapers?')
		else:
			dirname, lists =  utils.get_image_gallery_list('picture')
			if len(lists) == 0:
				runtime.manager.stack_stage(NotifyStage(_('No pictures'), uiconfig.baloon_photo_icon))
				return
			message = _('Delete all pictures?')
		def yes():
			if index == 0:
				utils.remove_dir(utils.get_image_dir('wallpaper'))
				stage = NotifyStage(_('All wallpapers deleted'), uiconfig.baloon_image_delete_icon)
			else:
				utils.remove_dir(utils.get_image_dir('picture'))
				stage = NotifyStage(_('All pictures deleted'), uiconfig.baloon_image_delete_icon)
			runtime.manager.change_stage(stage)
		def no():
			runtime.manager.back_stage()
		stage = OkNoStage(message, yes, no, '', uiconfig.baloon_image_delete_icon)
		runtime.manager.change_stage(stage)


class ImageDeleteStage(ListStage):
	icon = uiconfig.image_image_sound_image_delete_icon

	def __init__(self):
		self.title = _('DELETE')
		self.choice = _('Taken photos'), _('All images')
	
		ListStage.__init__(self)

	def activate(self, index):
		if index == 0:
			dirname, lists =  utils.get_image_gallery_list('taken')
			if len(lists) == 0:
				runtime.manager.stack_stage(NotifyStage(_('No taken photos'), uiconfig.baloon_photo_icon))
				return
			message = _('Delete all taken photos?')
			def yes():
				utils.remove_dir(utils.get_image_dir('taken'))
				stage = NotifyStage(_('All taken photos deleted'),uiconfig.baloon_image_delete_icon)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = OkNoStage(message, yes, no, '', uiconfig.baloon_image_delete_icon)
			runtime.manager.stack_stage(stage)
#ka...3800 malaga 2007.04.02
#		elif index == 1:
#			stage = DeleteReceivedImageStage()
#			runtime.manager.stack_stage(stage)
		else:
			dirname, lists1 =  utils.get_image_gallery_list('taken')
			dirname, lists2 =  utils.get_image_gallery_list('wallpaper')
			dirname, lists3 =  utils.get_image_gallery_list('picture')
			if len(lists1)+len(lists2)+len(lists3) == 0:
				runtime.manager.stack_stage(NotifyStage(_('No images'), uiconfig.baloon_photo_icon))
				return
			message = _('Delete all images?')
			def yes():
				if config.mm_debug:
					print 'FIXME: delete all images!!'
				utils.remove_dir(utils.get_image_dir('taken'))
				utils.remove_dir(utils.get_image_dir('picture'))
				utils.remove_dir(utils.get_image_dir('wallpaper'))
				stage = NotifyStage(_('All images deleted'), uiconfig.baloon_image_delete_icon)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = OkNoStage(message, yes, no, '', uiconfig.baloon_image_delete_icon)
			runtime.manager.stack_stage(stage)