#!/usr/bin/env python
# -*- coding: utf-8 -*-

__revision__ = '$Id: griffith 706 2007-01-11 18:06:50Z piotrek $'

# Copyright (c) 2005-2007 Vasco Nunes, Piotr Ożarowski

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA

# You may use and distribute this software under the terms of the
# GNU General Public License, version 2 or later

import sys, os.path
import gtk, gtk.glade
assert gtk.pygtk_version >= (2, 6, 0), 'PyGTK should be >= 2.6.0'
lib = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), 'lib'))
#lib = os.path.abspath(os.path.join(os.path.dirname(__file__), 'lib'))
if os.path.isdir(lib):
	sys.path.append(lib)
del lib
import add, config, gconsole, gdebug, gutils, initialize, main_treeview, quick_filter
from gettext import gettext as _

class Griffith:
	"""The main application class"""

	Image = gtk.Image()
	founded_results_id = None
	initialized = False
	lang = {}

	def __init__(self):
		"""main griffith application constructor"""	

		# debug object
		global debug
		debug = self.debug = gdebug.GriffithDebug()
		
		gconsole.check_args(self)
		initialize.locations(self)
		
		initialize.i18n(self, self.locations['i18n'])
		self.posix = (os.name == 'posix')
	
		# Configuration
		self.config = config.Config(file=os.path.join(self.locations['home'], 'griffith.conf'))
		initialize.location_posters(self.locations, self.config)

		# convert old database
		filename = os.path.join(self.locations['home'], self.config['default_db'])
		if self.config['default_db'].lower().endswith('.gri'):
			debug.show('Old database format detected. Converting...')
			from dbupgrade import convert_from_old_db
			if convert_from_old_db(self, filename, os.path.join(self.locations['home'], 'griffith.db')):
				self.config.save()
				initialize.location_posters(self.locations, self.config)
			else:
				print 'Cant convert old database, exiting.'
				sys.exit(4)
		
		# create/connect db
		from sql import GriffithSQL
		self.db = GriffithSQL(self.config, self.debug, self.locations['home'])

		# let's check any console arguments to parse
		gconsole.check_args_with_db(self)

		gtk.window_set_auto_startup_notification(True)
		self.Image = gtk.Image()
		self.filter_l = False
		initialize.gui(self)
		initialize.toolbar(self)
		initialize.treeview(self)
		initialize.loans_treeview(self)
		initialize.lang_treeview(self)
		initialize.dictionaries(self)
		initialize.combos(self)
		initialize.preferences(self)
		initialize.movie_plugins(self)
		initialize.export_plugins(self)
		initialize.people_treeview(self)
		initialize.web_results(self)
		self.initialized = True

		self.restore_state()
		self.clear_details()
		self.populate_treeview()
		self.count_statusbar()

		# adding some completion fields
		self.completion = gtk.EntryCompletion()
		self.widgets['add']['o_title'].set_completion(self.completion)
		self.completion.set_model(self.treemodel)
		self.completion.set_text_column(3)
		self.completion_t = gtk.EntryCompletion()
		self.widgets['add']['title'].set_completion(self.completion_t)
		self.completion_t.set_model(self.treemodel)
		self.completion_t.set_text_column(4)
		
		initialize.gtkspell(self)

		# add default folders to some select widgets
		if self.windows:
			fonts_dir = os.path.join(os.environ['SYSTEMROOT'],'fonts')
			self.widgets['preferences']['font'].set_current_folder(fonts_dir)
		elif self.mac:
			self.widgets['preferences']['font'].set_current_folder("/System/Library/Fonts/")
		else:
			self.widgets['preferences']['font'].set_current_folder("/usr/share/fonts/")

	def main(self):
		gtk.gdk.threads_init()
		gtk.gdk.threads_enter()
		gtk.main()
		gtk.gdk.threads_leave()
		return 0

	###########
	# callbacks
	###########		

	def on_export_activate(self, menu_iter, plugin_name):
		export_plugin = __import__('PluginExport%s' % plugin_name)
		export_plugin.ExportPlugin(self.db, self.locations, self.widgets['window'], self.debug)

	def on_import_activate(self, *args):
		if self.widgets.has_key('import'):
			self.widgets['import']['window'].show()
		else:
			initialize.import_plugins(self)

	def destroy(self, widget, data=None):
		self.save_state()
		gtk.main_quit()

	# about dialog	-------------------------------------------------------			

	def about_dialog(self, *args):
		from about import AboutDialog
		about_dialog = AboutDialog(self.locations['images'])

	# add movie -----------------------------------------------------------

	def clear_add_dialog(self, *args):
		add.clear(self)

	def edit_movie(self, *args):
		movie = self.db.Movie.get_by(movie_id=self._movie_id)
		if movie is not None:
			add.edit_movie(self, movie)
		else:
			gutils.error(self,_("You have no movies in your database"), self.widgets['window'])

	def hide_add_window(self, *args):
		#if self.widgets['add']['b_get_from_web'].is_sensitive() is True: # fetch from amazon is not working
		self.widgets['results']['window'].hide()
		self.widgets['add']['window'].hide()

	def get_from_web(self, *args):
		add.get_from_web(self)

	def show_search_results(self, results):
		add.show_websearch_results(self)

	def populate_dialog_with_results(self, *args):
		add.populate_with_results(self)

	def source_changed(self, *args):
		add.source_changed(self)

	# preferences ---------------------------------------------------------

	def show_preferences(self, *args):
		from preferences import show_preferences
		show_preferences(self)

	def hide_preferences(self, *args):
		self.widgets['preferences']['window'].hide()

	def save_preferences(self, *args):
		from preferences import save_preferences
		save_preferences(self)
		self.hide_preferences()

	def on_p_db_type_changed(self, widget):
		active = widget.get_active()
		if active == 0:
			self.widgets['preferences']['db_details'].set_sensitive(False)
		elif active == 1:
			# change port number IF previous one was MySQL's one
			if self.widgets['preferences']['db_port'].get_value() == 3306:
				self.widgets['preferences']['db_port'].set_value(5432)
			self.widgets['preferences']['db_details'].set_sensitive(True)
		elif active == 2:
			# change port number IF previous one was PostgreSQL's one
			if self.widgets['preferences']['db_port'].get_value() == 5432:
				self.widgets['preferences']['db_port'].set_value(3306)
			self.widgets['preferences']['db_details'].set_sensitive(True)

	# movie related operations --------------------------------------------

	def add_movie(self, *args):
		add.add_movie(self)

	def add_movie_db(self, *args):
		add.add_movie_db(self, 0)

	def add_movie_close_db(self, *args):
		add.add_movie_db(self, 1)

	def delete_movie(self, *args):
		from delete import delete_movie
		delete_movie(self)

	def update_movie(self, *args):
		add.update_movie(self)

	def clear_details(self):
		main_treeview.set_details(self)

	def loan_movie(self, *args):
		from loan import loan_movie
		loan_movie(self)

	def clone_movie(self, *args):
		add.clone_movie(self)

	# poster --------------------------------------------------------------

	def change_poster(self, *args):
		from edit import change_poster
		change_poster(self)

	def del_poster(self, *args):
		from edit import delete_poster
		delete_poster(self)

	def z_poster(self, *args):
		treeselection = self.widgets['treeview'].get_selection()
		(tmp_model, tmp_iter) = treeselection.get_selected()
		if tmp_iter is None:
			return
		number = tmp_model.get_value(tmp_iter, 0)
		movie = self.db.Movie.get_by(number=number)
		if movie is not None:
			tmp_dest = self.locations['posters']
			tmp_img = os.path.join(tmp_dest, str(movie.image)+".jpg")
			self.widgets['big_poster'].set_from_file(tmp_img)
			self.widgets['poster_window'].show()

	def z_poster_hide(self, *args):
		self.widgets['poster_window'].hide()

	def get_poster(self, *args):
		"""tries to fetch a new big poster from amazon"""
		from edit import fetch_bigger_poster
		fetch_bigger_poster(self)

	# rating --------------------------------------------------------------

	def scale_rating_change_add(self, *args):
		add.change_rating_from_slider(self)

	def toggle_seen(self, *args):
		m_number, m_iter = self.get_maintree_selection()
		movie = self.db.Movie.get_by(number=m_number)
		if movie.seen:
			movie.seen = False
		else:
			movie.seen = True
		movie.update()
		movie.flush()
		movie.refresh()
		self.treeview_clicked()

	def sugest_movie(self, *args):
		if not self.widgets['menu']['not_seen_movies'].get_active():
			self.widgets['menu']['not_seen_movies'].set_active(True)
		subtotal = len(self.widgets['treeview'].get_model())
		self.count_statusbar()
		if subtotal > 0:
			import random
			number = random.randrange(subtotal)
			self.widgets['treeview'].set_cursor(number)
			self.treeview_clicked()
		else:
			gutils.info(self, \
				_("You saw all movies in your collection!"), \
				self.widgets['window'])

	# volumes/collections ----------------------------------------------{{{
	def on_am_collection_combo_changed(self,widget):
		if widget.get_active()!=-1:
			self._selected_collection = self.collection_combo_ids[widget.get_active()]
	def on_am_volume_combo_changed(self,widget):
		if widget.get_active()!=-1:
			self._selected_volume = self.volume_combo_ids[widget.get_active()]

	def add_volume(self, widget):
		from update import update_volume_combo_ids
		name = self.widgets['add']['volume'].get_active_text()
		vol = self.db.Volume(name=name)
		if vol and vol.add_to_db():
			update_volume_combo_ids(self)
			initialize.fill_volumes_combo(self, id)

	def add_collection(self, widget):
		from update import update_collection_combo_ids
		name = self.widgets['add']['collection'].get_active_text()
		col = self.db.Collection(name=name)
		if col and col.add_to_db():
			update_collection_combo_ids(self)
			initialize.fill_collections_combo(self, id)

	def remove_volume(self, widget):
		from update import update_volume_combo_ids
		vol_id = self._selected_volume
		vol = self.db.Volume.get_by(volume_id=vol_id)
		if vol and vol.remove_from_db():
			update_volume_combo_ids(self)
			initialize.fill_volumes_combo(self, id)

	def remove_collection(self, widget):
		from update import update_collection_combo_ids
		col_id = self._selected_collection
		col = self.db.Collection.get_by(collection_id=col_id)
		if col and col.remove_from_db():
			update_collection_combo_ids(self)
			initialize.fill_collections_combo(self, id)

	def rename_volume(self, widget):
		vol_id = self._selected_volume
		if vol_id != 0:
			new_name = self.widgets['add']['volume'].get_active_text()
			vol = self.db.Volume.get_by(volume_id=vol_id)
			if vol:
				vol.name=new_name
				if vol.update_in_db():
					initialize.fill_volumes_combo(self, default=vol_id)

	def rename_collection(self, widget):
		col_id = self.e_selected_collection
		if col_id != 0:
			new_name = self.widgets['add']['collection'].get_active_text()
			col = self.db.Collection.get_by(collection_id=col_id)
			if col is not None:
				col.name=new_name
				if col.update_in_db():
					initialize.fill_collections_combo(self, default=col_id)

	def show_volume(self, widget):
		from view import filter_by_volume
		vol_id = self.db.Movie.get_by(movie_id=self._movie_id).volume_id
		filter_by_volume(self, vol_id)

	def show_collection(self, widget):
		col_id = self.db.Movie.get_by(movie_id=self._movie_id).collection_id
		pos = gutils.findKey(col_id, self.collection_combo_ids)
		self.widgets['filter']['collection'].set_active(pos)
	#}}}

	# languages -------------------------------------------------------{{{
	def on_lang_treeview_button_press_event(self, widget, event):
		"""add a right click menu to lang tree"""
		if event.button == 3:
			x = int(event.x)
			y = int(event.y)
			time = event.time
			pthinfo = self.widgets['add']['lang_treeview'].get_path_at_pos(x, y)
			if pthinfo is not None:
				path, col, cellx, celly = pthinfo
				self.widgets['add']['lang_treeview'].grab_focus()
				self.widgets['add']['lang_treeview'].set_cursor( path, col, 0)
			self.widgets['add']['lang_menu'].popup(None, None, None, event.button, time)
	
	def create_language_row(self, lang=None):
		if len(self.languages_ids) == 1:
			return False

		def get_text(model, id):
			if id == -1:
				return model[0][1]
			else:
				for i in model:
					if i[0] == id:
						return i[1]

		model = self.widgets['add']['lang_treeview'].get_model()
		myiter = model.append(None)
		if lang:
			model.set_value(myiter, 0, get_text(self.lang['lang'], lang.lang_id))
			model.set_value(myiter, 1, get_text(self.lang['type'], lang.type))
			model.set_value(myiter, 2, get_text(self.lang['acodec'], lang.acodec_id))
			model.set_value(myiter, 3, get_text(self.lang['achannel'], lang.achannel_id))
			model.set_value(myiter, 4, get_text(self.lang['subformat'], lang.subformat_id))
		else:
			model.set_value(myiter, 0, get_text(self.lang['lang'], -1))
	
	def on_tv_lang_combo_edited(self, widget, path, new_text, column):
		model = self.widgets['add']['lang_treeview'].get_model()
		model[path][column] = new_text
		mymodel = widget.get_property('model')
		if column == 1:	# type
			for i in mymodel:
				if i[1] == new_text:
					my_type = i[0]
			if my_type == 3:	# subtitles
				model[path][2] = ''
				model[path][3] = ''
			else:
				model[path][4] = ''
		if column == 4:	# subtitle format
			model[path][1] = _('subtitles')
			model[path][2] = ''
			model[path][3] = ''
		if column in (2,3):
			model[path][4] = ''
			if model[path][1] == _('subtitles'):
				model[path][1] = ''

	def on_am_lang_add_clicked(self, widget):
		self.create_language_row()
	def on_am_lang_remove_clicked(self, widget):
		treeselection = self.widgets['add']['lang_treeview'].get_selection()
		if treeselection:
			(tmp_model, tmp_iter) = treeselection.get_selected()
			if tmp_iter:
				tmp_model.remove(tmp_iter)

	# preferences
	def on_lang_add_clicked(self, widget):
		lang = self.db.Lang(name=self.widgets['preferences']['lang_name'].get_active_text())
		if lang and lang.add_to_db():
			initialize.language_combos(self)

	def on_lang_remove_clicked(self, widget):
		active = self.widgets['preferences']['lang_name'].get_active()
		if active>0:
			lang_id = self.languages_ids[active]
			lang = self.db.Lang.get_by(lang_id=lang_id)
			if lang and lang.remove_from_db():
				initialize.language_combos(self)
		else:
			self.debug.show("You have to select language first")

	def on_lang_rename_clicked(self, widget):
		try:
			active = self.lang_name_active
		except:
			return False
		lang_id = self.languages_ids[active]
		if lang_id>0:
			lang = self.db.Lang.get_by(lang_id=lang_id)
			if lang is not None:
				lang.name = self.widgets['preferences']['lang_name'].get_active_text()
				if lang.update_in_db():
					initialize.language_combos(self)

	def on_lang_name_combo_changed(self, widget):
		active = self.widgets['preferences']['lang_name'].get_active()
		if active>-1:
			self.lang_name_active = active
	#}}}

	# tags -------------------------------------------------------------{{{
	def on_tag_add_clicked(self, widget):
		tag = self.db.Tag(name=self.widgets['preferences']['tag_name'].get_active_text())
		if tag and tag.add_to_db():
			initialize.fill_preferences_tags_combo(self)
			initialize.create_tag_vbox(self, widget=self.widgets['add']['tag_vbox'], tab=self.am_tags)

	def on_tag_remove_clicked(self, widget):
		active = self.widgets['preferences']['tag_name'].get_active()
		if active>-1:
			tag_id = self.tags_ids[active]
			tag = self.db.Tag.get_by(tag_id=tag_id)
			if tag and tag.remove_from_db():
				initialize.fill_preferences_tags_combo(self)
				initialize.create_tag_vbox(self, widget=self.e_tag_vbox, tab=self.e_tags)
				initialize.create_tag_vbox(self, widget=self.widgets['add']['tag_vbox'], tab=self.am_tags)
		else:
			self.debug.show("You have to select tag first")

	def on_tag_rename_clicked(self, widget):
		try:
			active = self.tag_name_active
		except:
			return False
		tag_id = self.tags_ids[active]
		tag = self.db.Tag.get_by(tag_id=tag_id)
		if tag is not None:
			tag.name = self.widgets['preferences']['tag_name'].get_active_text()
			if tag.update_in_db():
				initialize.fill_preferences_tags_combo(self)
				initialize.create_tag_vbox(self, widget=self.e_tag_vbox, tab=self.e_tags)
				initialize.create_tag_vbox(self, widget=self.widgets['add']['tag_vbox'], tab=self.am_tags)

	def on_tag_name_combo_changed(self, widget):
		active = self.widgets['preferences']['tag_name'].get_active()
		if active>-1:
			self.tag_name_active = active
	# }}}

	# audio codecs ------------------------------------------------------{{{
	def on_acodec_add_clicked(self, widget):
		acodec = self.db.ACodec(name=self.widgets['preferences']['acodec_name'].get_active_text())
		if acodec and acodec.add_to_db():
			initialize.acodec_combos(self)

	def on_acodec_remove_clicked(self, widget):
		active = self.widgets['preferences']['acodec_name'].get_active()
		if active>0:
			acodec_id = self.acodecs_ids[active]
			acodec = self.db.ACodec.get_by(acodec_id=acodec_id)
			if acodec and acodec.remove_from_db():
				initialize.acodec_combos(self)
		else:
			self.debug.show("You have to select audio codec first")

	def on_acodec_rename_clicked(self, widget):
		try:
			active = self.acodec_name_active
		except:
			return False
		acodec_id = self.acodecs_ids[active]
		acodec = self.db.ACodec.get_by(acodec_id=acodec_id)
		if acodec is not None:
			acodec.name = self.widgets['preferences']['acodec_name'].get_active_text()
			if acodec.update_in_db():
				initialize.acodec_combos(self)

	def on_acodec_name_combo_changed(self, widget):
		active = self.widgets['preferences']['acodec_name'].get_active()
		if active>-1:
			self.acodec_name_active = active
	# }}}

	# audio channels ----------------------------------------------------{{{
	def on_achannel_add_clicked(self, widget):
		achannel = self.db.AChannel(name=self.widgets['preferences']['achannel_name'].get_active_text())
		if achannel and achannel.add_to_db():
			initialize.achannel_combos(self)

	def on_achannel_remove_clicked(self, widget):
		active = self.widgets['preferences']['achannel_name'].get_active()
		if active>0:
			achannel_id = self.achannels_ids[active]
			achannel = self.db.AChannel.get_by(achannel_id=achannel_id)
			if achannel and achannel.remove_from_db():
				initialize.achannel_combos(self)
		else:
			self.debug.show("You have to select audio channel first")

	def on_achannel_rename_clicked(self, widget):
		try:
			active = self.achannel_name_active
		except:
			return False
		achannel_id = self.achannels_ids[active]
		achannel = self.db.AChannel.get_by(achannel_id=achannel_id)
		if achannel is not None:
			achannel.name = self.widgets['preferences']['achannel_name'].get_active_text()
			if achannel.update_in_db():
				initialize.achannel_combos(self)

	def on_achannel_name_combo_changed(self, widget):
		active = self.widgets['preferences']['achannel_name'].get_active()
		if active>-1:
			self.achannel_name_active = active
	# }}}

	# subformats -------------------------------------------------------------{{{
	def on_subformat_add_clicked(self, widget):
		subformat = self.db.SubFormat(name=self.widgets['preferences']['subformat_name'].get_active_text())
		if subformat and subformat.add_to_db():
			initialize.subformat_combos(self)

	def on_subformat_remove_clicked(self, widget):
		active = self.widgets['preferences']['subformat_name'].get_active()
		if active>0:
			subformat_id = self.subformats_ids[active]
			subformat = self.db.SubFormat.get_by(subformat_id=subformat_id)
			if subformat and subformat.remove_from_db():
				initialize.subformat_combos(self)
		else:
			self.debug.show("You have to select subtitle format first")

	def on_subformat_rename_clicked(self, widget):
		try:
			active = self.subformat_name_active
		except:
			return False
		subformat_id = self.subformats_ids[active]
		subformat = self.db.SubFormat.get_by(subformat_id=subformat_id)
		if subformat is not None:
			subformat.name = self.widgets['preferences']['subformat_name'].get_active_text()
			if subformat.update_in_db():
				initialize.subformat_combos(self)

	def on_subformat_name_combo_changed(self, widget):
		active = self.widgets['preferences']['subformat_name'].get_active()
		if active>-1:
			self.subformat_name_active = active
	# }}}

	# media ------------------------------------------------------------{{{
	def on_medium_add_clicked(self, widget):
		medium = self.db.Medium(name=self.widgets['preferences']['medium_name'].get_active_text())
		if medium and medium.add_to_db():
			initialize.media_combos(self)

	def on_medium_remove_clicked(self, widget):
		active = self.widgets['preferences']['medium_name'].get_active()
		if active>-1:
			medium_id = self.media_ids[active]
			medium = self.db.Medium.get_by(medium_id=medium_id)
			if medium and medium.remove_from_db():
				initialize.media_combos(self)
		else:
			self.debug.show("You have to select medium first")

	def on_medium_rename_clicked(self, widget):
		try:
			active = self.medium_name_active
		except:
			return False
		medium_id = self.media_ids[active]
		medium = self.db.Medium.get_by(medium_id=medium_id)
		if medium is not None:
			medium.name = self.widgets['preferences']['medium_name'].get_active_text()
			if medium.update_in_db():
				initialize.media_combos(self)

	def on_medium_name_combo_changed(self, widget):
		active = self.widgets['preferences']['medium_name'].get_active()
		if active>-1:
			self.medium_name_active = active
	# }}}

	# vcodecs -------------------------------------------------------------{{{
	def on_vcodec_add_clicked(self, widget):
		vcodec = self.db.VCodec(name=self.widgets['preferences']['vcodec_name'].get_active_text())
		if vcodec and vcodec.add_to_db():
			initialize.vcodec_combos(self)

	def on_vcodec_remove_clicked(self, widget):
		active = self.widgets['preferences']['vcodec_name'].get_active()
		if active>-1:
			vcodec_id = self.vcodecs_ids[active]
			vcodec = self.db.VCodec.get_by(vcodec_id=vcodec_id)
			if vcodec and vcodec.remove_from_db():
				initialize.vcodec_combos(self)
		else:
			self.debug.show("You have to select video codec first")

	def on_vcodec_rename_clicked(self, widget):
		try:
			active = self.vcodec_name_active
		except:
			return False
		vcodec_id = self.vcodecs_ids[active]
		vcodec = self.db.VCodec.get_by(vcodec_id=vcodec_id)
		if vcodec is not None:
			vcodec.name = self.widgets['preferences']['vcodec_name'].get_active_text()
			if vcodec.update_in_db():
				initialize.vcodec_combos(self)

	def on_vcodec_name_combo_changed(self, widget):
		active = self.widgets['preferences']['vcodec_name'].get_active()
		if active>-1:
			self.vcodec_name_active = active
	# }}}

	# main treeview -------------------------------------------------------
	def treeview_clicked(self, *args):
		main_treeview.treeview_clicked(self)

	def populate_treeview(self, statement=None, where=None):
		main_treeview.populate(self, statement, where)

	def get_maintree_selection(self):
		treeselection = self.widgets['treeview'].get_selection()
		(tmp_model, tmp_iter) = treeselection.get_selected()
		if tmp_model and tmp_iter:
			return tmp_model.get_value(tmp_iter, 0), tmp_iter
		else:
			return None, None

	# backup/restore ------------------------------------------------------	

	def backup(self, *args):
		from backup import backup
		backup(self)

	def restore(self, *args):
		response = gutils.question(self, \
			_("""Are you sure you want to restore?
Your current movie collection will be replaced.
You can't undo this operation."""), \
			1, self.widgets['window'])
		if response == gtk.RESPONSE_YES:
			from backup import restore
			restore(self)

	def merge(self, *args):
		response = gutils.question(self, \
			_("""Are you sure you want to mix?
Your current movie collection will be mixed with a backup.
You can't undo this operation."""), \
			1, self.widgets['window'])
		if response == gtk.RESPONSE_YES:
			from backup import merge
			merge(self)

	# cover ---------------------------------------------------------------

	def print_cover_simple_show(self, *args):
		self.widgets['print_cover']['cs_size'].set_active(0)
		self.widgets['print_cover']['window_simple'].show()

	def print_cover_simple_hide(self, *args):
		self.widgets['print_cover']['window_simple'].hide()

	def print_cover_simple_process(self, *args):
		from cover import cover_simple
		movie_number, movie_iter = self.get_maintree_selection()
		if movie_number is not None:
			cover_simple(self, movie_number)
		else:
			gutils.error(self,_("You have no movies in your database"), self.widgets['window'])

	def print_cover_image(self, *args):
		self.widgets['print_cover']['ci_size'].set_active(0)
		self.widgets['print_cover']['window_image'].show()

	def print_cover_image_process(self, *args):
		from cover import cover_image
		self.widgets['print_cover']['window_image'].hide()
		movie_number, movie_iter = self.get_maintree_selection()
		cover_image(self, movie_number)

	def print_cover_image_hide(self, *args):
		self.widgets['print_cover']['window_image'].hide()

	# loans management ----------------------------------------------------	

	def show_people_window(self, *args):
		from people import show_people_window
		show_people_window(self)

	def hide_people_window(self, *args):
		from people import  hide_people_window
		hide_people_window(self)

	def add_person(self, *args):
		from people import add_person
		add_person(self)

	def add_person_cancel(self, *args):
		from people import add_person_cancel
		add_person_cancel(self)

	def add_person_db(self, *args):
		from people import add_person_db
		add_person_db(self)

	def delete_person(self, *args):
		from people import delete_person
		delete_person(self)

	def edit_person(self, *args):
		from people import edit_person
		edit_person(self)

	def update_person(self, *args):
		from people import update_person
		update_person(self)

	def edit_person_cancel(self, *args):
		from people import edit_person_cancel
		edit_person_cancel(self)

	def cancel_loan(self, *args):
		from loan import cancel_loan
		cancel_loan(self)

	def commit_loan(self, *args):
		from loan import commit_loan
		commit_loan(self)

	def return_loan(self, *args):
		from loan import return_loan
		return_loan(self)

	def email_reminder(self, *args):
		from gemail import send_email
		send_email(self)

	# statusbar -----------------------------------------------------------

	def count_statusbar(self):
		text = str(self.total)
		loaned = self.db.Movie.count_by(loaned=True)
		not_seen = self.db.Movie.count_by(seen=False)
		self.update_statusbar(str(text) + _(' movie(s) in collection. ')
			+ str(loaned) + _(' movie(s) loaned. ')
			+ _('You haven\'t seen ')+"%s"%str(not_seen)+ _(" movie(s)")
		)

	def update_statusbar(self, text):
		context_id = self.widgets['statusbar'].get_context_id(text)
		message_id = self.widgets['statusbar'].push(context_id, text)

	# quick filter operations ---------------------------------------------

	def filter_txt(self, *args):
		quick_filter.change_filter(self)

	def clear_filter(self, *args):
		quick_filter.clear_filter(self)

	# menu filter ---------------------------------------------------------

	def filter_loaned(self, *args):
		from view import filter_loaned
		filter_loaned(self)

	def filter_not_seen(self, *args):
		from view import filter_not_seen
		filter_not_seen(self)

	def filter_all(self, *args):
		from view import filter_all
		filter_all(self)

	def on_delete_event_am(self, *args):
		self.widgets['add']['window'].hide()
		return True

	def on_delete_event_pw(self, *args):
		self.widgets['poster_window'].hide()
		return True

	def filter_collection(self, *args):
		quick_filter.change_filter(self)

	# windows/dialogs -----------------------------------------------------

	def results_cancel_ck(self, *args):
		from widgets import reconnect_add_signals
		reconnect_add_signals(self)
		self.widgets['results']['window'].hide()

	def save_state(self):
		"""Saves main window state"""
		pos = self.widgets['window'].get_position()
		size = self.widgets['window'].get_size()
		self.config["width"] = size[0]
		self.config["height"] = size[1]
		self.config["left"] = pos[0]
		self.config["top"] = pos[1]
		self.config.save()

	def restore_state(self):
		"""Restores main window state"""
		if self.config.get("left") == "None":
			pass
		else:
			self.widgets['window'].move(int(self.config.get("left")), \
				int(self.config.get("top")))
			self.widgets['window'].resize(int(self.config.get("width")), \
				int(self.config.get("height")))
		self.widgets['window'].show()

	def on_delete_event_r(self, *args):
		self.widgets['results']['window'].hide()
		return True

	def on_delete_event_poster(self, *args):
		self.widgets['poster_window'].hide()
		return True

	def on_delete_event_wp(self, *args):
		self.widgets['people']['window'].hide()
		return True

	def on_delete_event_ap(self, *args):
		self.widgets['person']['window'].hide()
		return True

	def on_delete_event_ep(self, *args):
		self.widgets['person']['e_window'].hide()
		return True

	def on_delete_event_lt(self, *args):
		self.widgets['w_loan_to'].hide()
		return True

	def on_delete_event_pcs(self, *args):
		self.widgets['print_cover']['window_simple'].hide()
		return True

	def on_delete_event_pci(self, *args):
		self.widgets['print_cover']['window_image'].hide()
		return True

	def on_delete_event_p(self, *args):
		self.widgets['preferences']['window'].hide()
		return True

	def go_oficial_site(self, *args):
		if self._o_site_url:
			gutils.run_browser(self._o_site_url)

	def go_site(self, *args):
		if self._site_url:
			gutils.run_browser(self._site_url)

	def go_trailer_site(self, *args):
		if self._trailer_url:
			gutils.run_browser(self._trailer_url)

	def on_goto_homepage_activate(site, *args):
		gutils.run_browser("http://griffith.berlios.de/")
	def on_goto_forum_activate(site, *args):
		gutils.run_browser("http://griffith.berlios.de/forum/")
	def on_goto_report_bug_activate(site, *args):
		gutils.run_browser("http://developer.berlios.de/bugs/?group_id=4891")

	# toolbar -------------------------------------------------------------
	def toggle_toolbar(self, *args):
		state = self.widgets['menu']['toolbar'].get_active()
		if state == False:
			self.widgets['toolbar'].hide()
		else:
			self.widgets['toolbar'].show()
		self.config["view_toolbar"] = state
		self.config.save()

	def new_dbb(self, *args):
		"""initializes a new Griffith Database file"""
		response = gutils.question(self, \
			_('Are you sure you want to create a new database?\nYou will lose ALL your current data!'), \
			1, self.widgets['window'])
		if response == gtk.RESPONSE_YES:
			response_sec = gutils.question(self, \
				_('Last chance!\nDo you confirm that you want\nto lose your current data?'), \
				1, self.widgets['window'])
			if response_sec == gtk.RESPONSE_YES:
				from sqlalchemy import Select
				from sql import GriffithSQL
				# delete images
				posters_dir = self.locations['posters']
				# NOTE: only used images are removed (posters are shared between various db)
				debug.show('NEW DB: Removing old images...')
				
				movies = Select([self.db.Movie.c.image]).execute().fetchall()
				for movie in movies:
					if movie.image is not None:
						name = movie.image.encode('utf-8')
						p_file = os.path.join(posters_dir, name+'.jpg')
						m_file = os.path.join(posters_dir, 'm_'+name+'.jpg')
						t_file = os.path.join(posters_dir, 't_'+name+'jpg')
						try:
							os.remove(p_file)
							os.remove(m_file)
							os.remove(t_file)
						except:
							pass
				self.db.metadata.drop_all()
				from sqlalchemy.orm import clear_mappers
				clear_mappers()
				if self.config['db_type'] == 'sqlite':
					os.unlink(os.path.join(self.locations['home'],self.config.get('default_db')))
					if self.config['default_db'] == 'griffith.gri':
						self.config['default_db'] = 'griffith.db'
				# create/connect db
				self.db = GriffithSQL(self.config, debug, self.griffith_dir)
				self.clear_details()
				self.total = 0
				self.count_statusbar()
				self.treemodel.clear()
				from initialize	import dictionaries, people_treeview
				dictionaries(self)
				people_treeview(self)

	# key events ----------------------------------------------------------

	def on_key_press_event(self, widget, event):
		"""some key events actions"""
		keyname = gtk.gdk.keyval_name(event.keyval)
		if keyname == 'Delete' and self.widgets['treeview'].is_focus() == True:
			self.delete_movie()

	def on_p_tree_button_press_event(self, widget, event):
		"""add a double click event to people tree"""				
		if event.type == gtk.gdk._2BUTTON_PRESS:
			from people import edit_person
			edit_person(self)

	def on_maintree_button_press_event(self, widget, event):
		"""add a left click menu to main tree"""
		if event.button == 3:
			x = int(event.x)
			y = int(event.y)
			time = event.time
			pthinfo = self.widgets['treeview'].get_path_at_pos(x, y)
			if pthinfo is not None:
				path, col, cellx, celly = pthinfo
				self.widgets['treeview'].grab_focus()
				self.widgets['treeview'].set_cursor( path, col, 0)
				self.widgets['popups']['main'].popup( None, None, None, event.button, time)
			return 1
		elif event.type == gtk.gdk._2BUTTON_PRESS:
			self.edit_movie()

	def on_results_button_press_event(self, widget, event):
		"""add a double click event to add movie results"""
		if event.type == gtk.gdk._2BUTTON_PRESS:
			add.populate_with_results(self)

	def on_poster_results_button_press_event(self, widget, event):
		"""add a double click event to poster results"""
		if event.type == gtk.gdk._2BUTTON_PRESS:
			add.populate_with_results(self)
	
	# -=[ treeview ]=------------------------------------------------------
	def go_first(self, *args):
		self.click_on(self.widgets['treeview'], 'first')
	def go_last(self, *args):
		self.click_on(self.widgets['treeview'], 'last')
	def go_prev(self, *args):
		self.click_on(self.widgets['treeview'], 'prev')
	def go_next(self, *args):
		self.click_on(self.widgets['treeview'], 'next')
	# TODO: remove total_filter var.
	
	def click_on(self, treeview, direction):
		treeselection = treeview.get_selection()
		if not treeselection:
			treeview.set_cursor_on_cell(0)
			return 2 # no selection => selecting first movie
		(treemodel, treeiter) = treeselection.get_selected()
		if treemodel is None:
			return False
		if treeiter is None or direction=='first':
			treeview.set_cursor_on_cell(0)
		elif direction == 'next':
			nextiter = treemodel.iter_next(treeiter)
			if nextiter is None:
				direction = 'last'
			else:
				iterpath = treemodel.get_path(nextiter)
				treeview.set_cursor_on_cell(iterpath[0])
		elif direction == 'prev':
			iterpath = treemodel.get_path(treeiter)
			row = iterpath[0]
			if row>0:
				treeview.set_cursor_on_cell(row-1)
			else:
				treeview.set_cursor_on_cell(0)
		if direction == 'last':
			rows = len(treemodel)
			if rows>0:
				treeview.set_cursor_on_cell(rows-1)
			else:
				treeview.set_cursor_on_cell(0)

if __name__ == "__main__":
	griffith = Griffith()
	griffith.main()

# vim: fdm=marker
