#!/usr/bin/env python

#================================================
#
#    Comix 1.6 - GTK Comic Book Viewer
#    Copyright (C) 2005 Pontus Ekberg <herrekberg@users.sourceforge.net>
#
#================================================
#
#    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 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
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#================================================


import pygtk
pygtk.require('2.0')
import gtk, os, sys, gc, shutil, stat, commands, zipfile, tarfile, urllib, locale

class Comic:
	
	screen = gtk.gdk.screen_get_default() # The default screen. Get resolution from this.
	file = [] # Array for the filenames to be stored in.
	file_number = 0 # The image in file[] currently viewed.
	old_file_number = -1
	comments = []
	comment_number = 0
	show_comments = 0
	
	# Optionlist, all the options are saved here.
	# 0 = fullscreen
	# 1 = default fullscreen
	# 2 = scaling quality
	# 3 = hide bars in fullscreen
	# 4 = double page mode
	# 5 = default double page mode
	# 6 = saturation
	# 7 = Cache next page
	# 8 = flip double page
	# 9 = stretch image
	# 10 = window width
	# 11 = window height
	# 12 = window x position
	# 13 = window y position
	# 14 = save screen size/position
	# 15 = Default path
	# 16 = Fit to screen as default
	# 17 = Zooming scale
	# 18 = Fit to screen
	# 19 = bg red value
	# 20 = bg green value
	# 21 = bg blue value
	# 22 = hide scrollbars
	# 23 = Go to next archive after last page
	# 24 = Hide cursor
	# 25 = Show menubar
	# 26 = Show toolbar
	# 27 = Show statusbar
	# 28 = Show comments
	# 29 = Comment extensions
	optionlist = [0, 0, gtk.gdk.INTERP_TILES, 1, 0, 0, 10, 0, 0, 0, screen.get_width() / 2, screen.get_height() * 3 / 4,
	0, 0, 0, os.environ["HOME"], 1, 100, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 'txt nfo']
	bookmarks = [] # Stores the bookmark paths
	bookmark_numbers = [] # Stores the bookmark page numbers
	temp_optionlist = [0] # Used in the option window.
	old_optionlist = [0]
	file_exist = 0 # If no valid files were selected.
	archive_type = "" # The type of archive being viewed if any.
	path = "" # Path to the archive or image opened.
	filetype_error = 0
	x_motion = -1
	y_motion = -1
	motion_number = 0
	file_removed = 0
	mouse_moved = 0
	
	stored_pixbuf = 0
	stored_pixbuf2 = 0
	stored_double = 0
	cached_pixbuf = 0
	cached_pixbuf2 = 0
	cached = 0
	
	# Stores sizes of images, used for the file info window.
	image1_width = 0
	image1_height = 0
	image2_width = 0
	image2_height = 0
	image1_scaled_width = 0
	image1_scaled_height = 0
	image2_scaled_width = 0
	image2_scaled_height = 0
	
	# Create all the windows.
	window = gtk.Window(gtk.WINDOW_TOPLEVEL)
	options_window = gtk.Dialog("Preferences", window, 0, ())
	file_dialog = gtk.Dialog("Properties", window, 0, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
	invalid_filename_dialog = gtk.Dialog("Invalid filename", window, 0, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
	permission_dialog = gtk.Dialog("Could not alter file", window, 0, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
	about_dialog = gtk.Dialog("About", window, 0, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
	page_dialog = gtk.Dialog("Go to page #", window, 0, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
	convert_dialog = gtk.Dialog("Convert archive", window, 0, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
	overwrite_dialog = gtk.Dialog("Overwrite", window, 0, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
	
	button_fullscreen = gtk.CheckButton("Fullscreen as default")
	button_page = gtk.CheckButton("Double page view as default")
	button_fit = gtk.CheckButton("Fit to screen mode as default")
	button_stretch = gtk.CheckButton("Also stretch small images to fit the screen")
	button_comment = gtk.CheckButton("Always view comments when opening a new file")
	button_hide_bars = gtk.CheckButton("Hide menubar etc. in fullscreen")
	button_cache_next = gtk.CheckButton("Cache next page for faster forward page flipping")
	button_flip_page = gtk.CheckButton("Flip position of pages in double page mode")
	button_save_size = gtk.CheckButton("Save window position and size to future sessions")
	button_no_scrollbar = gtk.CheckButton("Hide scrollbars even when not in fit to screen mode")
	button_next_archive = gtk.CheckButton("Go to next archive in directory after last page.")
	button_hide_cursor = gtk.CheckButton("Hide cursor in fullscreen mode")
	colorbutton = gtk.ColorButton(color=gtk.gdk.Color(0,0,0))
	adjustment = gtk.Adjustment(1.0, 0, 3, 0.1, 0.1, page_size=0)
	button_spin = gtk.SpinButton(adjustment, climb_rate=0.0, digits=1)
	adjustment = gtk.Adjustment(100, 10, 500, 1, 1, page_size=0)
	button_zoom = gtk.SpinButton(adjustment, climb_rate=0.0, digits=0)
	adjustment = gtk.Adjustment(1, 1, 1000, 1, 1, page_size=0)
	button_page_spin = gtk.SpinButton(adjustment, climb_rate=0.0, digits=0)
	button_1 = gtk.RadioButton(None, "Nearest (quickest, worst quality)")
	button_2 = gtk.RadioButton(button_1, "Tiles")
	button_3 = gtk.RadioButton(button_2, "Bilinear")
	button_4 = gtk.RadioButton(button_3, "Hyper (slowest, best quality)")
	file_select = gtk.FileChooserDialog(title="File Chooser",action=gtk.FILE_CHOOSER_ACTION_OPEN,
	buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
	file_select.set_default_response(gtk.RESPONSE_OK)
	default_path_entry = gtk.Entry(max=100)
	comment_extensions_entry = gtk.Entry(max=100)
	go_to_page_label = gtk.Label()
	file_info_label = gtk.Label()
	file_info_label2 = gtk.Label()
	invalid_filename_info_label = gtk.Label()
	permission_label = gtk.Label()
	image = gtk.Image()
	image2 = gtk.Image()
	image_box = gtk.HBox(False, 2)
	image_box.show()
	image_box.add(image)
	image_box.add(image2)
	button_zin = gtk.ToolButton(gtk.STOCK_ZOOM_IN)
	button_zout = gtk.ToolButton(gtk.STOCK_ZOOM_OUT)
	button_z100 = gtk.ToolButton(gtk.STOCK_ZOOM_100)
	button_zfit = gtk.ToolButton(gtk.STOCK_ZOOM_FIT)
	button_previous = gtk.ToolButton(gtk.STOCK_GO_BACK)
	button_next = gtk.ToolButton(gtk.STOCK_GO_FORWARD)
	button_first = gtk.ToolButton(gtk.STOCK_GOTO_FIRST)
	button_last = gtk.ToolButton(gtk.STOCK_GOTO_LAST)
	button_go = gtk.ToolButton(gtk.STOCK_JUMP_TO)
	button_apply = gtk.Button("Apply", gtk.STOCK_APPLY)
	combobox_convert = gtk.combo_box_new_text()
	filename_entry = gtk.Entry(max=100)
	button_delete_archive = gtk.CheckButton("Delete old archive/directory")
	overwrite_label = gtk.Label()
	comment_label = gtk.Label()
	
	layout = gtk.Layout()
	layout.show()
	layout.put(image_box, 0, 0)
	layout.put(comment_label, 0, 0)

	vadjust = layout.get_vadjustment()
	hadjust = layout.get_hadjustment()
	vadjust.step_increment = 15
	vadjust.page_increment = 1
	hadjust.step_increment = 15
	hadjust.page_increment = 1
	old_vadjust_value = 0
	old_hadjust_value = 0
	vadjust_upper = 0
	hadjust_upper = 0
	
	hscroll = gtk.HScrollbar(None)
	hscroll.set_adjustment(hadjust)
	hscroll.show()
	vscroll = gtk.VScrollbar(None)
	vscroll.set_adjustment(vadjust)
	vscroll.show()
	
	ui = gtk.UIManager()
	ui_menu = gtk.UIManager()
	accelgroup = ui_menu.get_accel_group()
	window.add_accel_group(accelgroup)
	actiongroup = gtk.ActionGroup('test')
	merge_id = -1
	merge_id_menu = -1
	toolbar = gtk.Toolbar()
	statusbar = gtk.Statusbar()
	
	table = gtk.Table(2, 2, False)
	table.attach(layout, 0, 1, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0)
	table.attach(vscroll,1, 2, 2, 3, gtk.FILL|gtk.SHRINK, gtk.FILL|gtk.SHRINK, 0, 0)
	table.attach(hscroll, 0, 1, 4, 5, gtk.FILL|gtk.SHRINK, gtk.FILL|gtk.SHRINK, 0, 0)
	window.add(table)
	table.show()
	
	def create_windows(self, event):
		
		# Options window
		self.options_window.set_has_separator(False)
		self.options_window.action_area.set_size_request(0, 0)
		notebook = gtk.Notebook()
		notebook.show()
		self.options_window.set_title("Preferences")
		self.options_window.vbox.pack_start(notebook, False, False, 2)
		vbox = gtk.VBox(False, 2)
		vbox.set_border_width(10)
		
		self.button_fullscreen.connect("toggled", self.options, 0)
		vbox.pack_start(self.button_fullscreen, True, True, 2)
		self.button_fullscreen.show()
		
		self.button_page.connect("toggled", self.options, 1)
		vbox.pack_start(self.button_page, True, True, 2)
		self.button_page.show()
		
		self.button_fit.connect("toggled", self.options, 11)
		vbox.pack_start(self.button_fit, True, True, 2)
		self.button_fit.show()

		label = gtk.Label("")
		label.set_alignment(0, 0)
		vbox.pack_start(label, False, False, 0)
		label.show()
		
		self.button_comment.connect("toggled", self.options, 16)
		vbox.pack_start(self.button_comment, True, True, 2)
		self.button_comment.show()
		
		label = gtk.Label("\nTreat files with these extensions as comments:")
		label.set_alignment(0, 0)
		vbox.pack_start(label, False, False, 0)
		label.show()
		vbox.pack_start(self.comment_extensions_entry, True, True, 0)
		self.comment_extensions_entry.show()
		
		label = gtk.Label("")
		label.set_alignment(0, 0)
		vbox.pack_start(label, False, False, 0)
		label.show()
		
		self.button_cache_next.connect("toggled", self.options, 7)
		vbox.pack_start(self.button_cache_next, True, True, 2)
		self.button_cache_next.show()
		
		self.button_save_size.connect("toggled", self.options, 10)
		vbox.pack_start(self.button_save_size, True, True, 2)
		self.button_save_size.show()
		
		self.button_next_archive.connect("toggled", self.options, 14)
		vbox.pack_start(self.button_next_archive, True, True, 2)
		self.button_next_archive.show()
		
		label = gtk.Label("\n")
		label.set_alignment(0, 0)
		vbox.pack_start(label, False, False, 0)
		label.show()
		
		label = gtk.Label("Always open this directory when selecting new file:")
		label.set_alignment(0, 0)
		vbox.pack_start(label, False, False, 0)
		label.show()
		vbox.pack_start(self.default_path_entry, False, False, 0)
		self.default_path_entry.show()
		
		notebook.insert_page(vbox, gtk.Label("Behaviour"))
		
		vbox_scaling = gtk.VBox(False, 2)
		vbox_scaling.set_border_width(10)
		vbox_scaling.show()
		hbox = gtk.HBox(False, 2)
		hbox.show()
		label_box = gtk.VBox(False, 2)
		label_box.show()
		entry_box = gtk.VBox(False, 2)
		entry_box.show()
		hbox.pack_start(label_box, True, True, 0)
		hbox.pack_start(entry_box, True, True, 0)
		
		label = gtk.Label("Saturation (default 1.0):")
		label.set_alignment(0, 0)
		label_box.pack_start(label, True, True, 0)
		label.show()
		entry_box.pack_start(self.button_spin, True, True, 2)
		self.button_spin.show()
		
		label = gtk.Label("Background colour: ")
		label.set_alignment(0, 0)
		label_box.pack_start(label, True, True, 0)
		label.show()
		self.colorbutton.set_title("Background colour")
		entry_box.pack_start(self.colorbutton, True, True, 2)
		self.colorbutton.show()
		
		label = gtk.Label("Zoom (%):")
		label.set_alignment(0, 0)
		label_box.pack_start(label, True, True, 0)
		label.show()
		entry_box.pack_start(self.button_zoom, True, True, 2)
		self.button_zoom.show()
		vbox_scaling.pack_start(hbox, False, False, 2)
		
		label = gtk.Label("")
		label.set_alignment(0, 0)
		vbox_scaling.pack_start(label, False, False, 0)
		label.show()
		
		self.button_hide_cursor.connect("toggled", self.options, 15)
		vbox_scaling.pack_start(self.button_hide_cursor, True, True, 2)
		self.button_hide_cursor.show()
		
		self.button_flip_page.connect("toggled", self.options, 8)
		vbox_scaling.pack_start(self.button_flip_page, True, True, 2)
		self.button_flip_page.show()
		
		self.button_stretch.connect("toggled", self.options, 9)
		vbox_scaling.pack_start(self.button_stretch, True, True, 2)
		self.button_stretch.show()
		
		self.button_hide_bars.connect("toggled", self.options, 12)
		vbox_scaling.pack_start(self.button_hide_bars, True, True, 2)
		self.button_hide_bars.show()
		
		label = gtk.Label("")
		label.set_alignment(0, 0)
		vbox_scaling.pack_start(label, False, False, 0)
		label.show()
		
		aspect_frame = gtk.Frame("Image scaling quality")
		
		vbox_scaling.pack_start(aspect_frame)
		button_box = gtk.VBox(True, 5)
		button_box.set_border_width(5)
		aspect_frame.add(button_box)
		
		self.button_1.connect("toggled", self.options, 2)
		button_box.pack_start(self.button_1, False, False, 0)
		self.button_1.show()
		
		self.button_2.connect("toggled", self.options, 3)
		button_box.pack_start(self.button_2, False, False, 0)
		self.button_2.show()
		
		self.button_3.connect("toggled", self.options, 4)
		button_box.pack_start(self.button_3, False, False, 0)
		self.button_3.show()
		
		self.button_4.connect("toggled", self.options, 5)
		button_box.pack_start(self.button_4, False, False, 0)
		self.button_4.show()
		
		button_box.show()
		aspect_frame.show()
		
		notebook.insert_page(vbox_scaling, gtk.Label("Display"))
		
		hbox = gtk.HBox(True, 2)
		self.options_window.vbox.pack_start(hbox, True, True, 2)
		hbox.show()
		
		self.button_apply.connect_object("clicked", self.save_and_close_options, None)
		hbox.pack_start(self.button_apply, False, True, 0)
		self.button_apply.show()
		
		alignment = gtk.Alignment(0.0, 0.0, 1.0, 0.0)
		hbox.pack_start(alignment, True, True, 0)
		alignment.show()
		
		button = gtk.Button("Cancel", gtk.STOCK_CANCEL)
		button.connect_object("clicked", self.close_options, None, None)
		hbox.pack_start(button, False, True, 0)
		button.show()
		
		button = gtk.Button("Ok", gtk.STOCK_OK)
		button.connect_object("clicked", self.save_and_close_options, 'close')
		hbox.pack_start(button, False, True, 0)
		button.show()
		
		vbox.show()
		
		# Go-to-page window		
		hbox = gtk.HBox(False, 2)
		hbox.set_border_width(10)
		self.page_dialog.vbox.pack_start(hbox)
		self.page_dialog.set_has_separator(False)
		hbox.show()
		hbox.pack_start(self.button_page_spin)
		self.button_page_spin.show()
		self.go_to_page_label.set_alignment(0, 1)
		hbox.pack_start(self.go_to_page_label, False, False, 0)
		self.go_to_page_label.show()
		
		# About window
		self.about_dialog.set_border_width(10)
		self.about_dialog.set_has_separator(False)
		
		if os.path.exists(os.getenv('XDG_DATA_DIRS', '') + '/pixmaps/comix.png'):
			icon_path = os.getenv('XDG_DATA_DIRS','') + '/pixmaps/comix.png'
		elif os.path.exists(os.getenv('XDG_DATA_DIRS','') + 'pixmaps/comix.png'):
			icon_path = os.getenv('XDG_DATA_DIRS','') + 'pixmaps/comix.png'				
		elif os.path.exists('/usr/local/share/pixmaps/comix.png'):
			icon_path = '/usr/local/share/pixmaps/comix.png'
		elif os.path.exists('/usr/share/pixmaps/comix.png'):
			icon_path = '/usr/share/pixmaps/comix.png'
		
		try:
			icon_pixbuf = gtk.gdk.pixbuf_new_from_file(icon_path)
			icon_image = gtk.Image()
			icon_image.set_from_pixbuf(icon_pixbuf)
			self.about_dialog.vbox.pack_start(icon_image, False, False, 10)
			icon_image.show()
		except:
			pass
		
		label = gtk.Label()
		label.set_markup('<big><big><big><b>Comix 1.6</b></big></big></big>\n' + 
		"\n" + 
		"Comix is a comic book viewer that reads normal image files\n" +
		"e.g. JPEG, PNG etc. as well as compressed zip, rar, tar, tar.gz\n" +
		"and tar.bz2 archives (often called .cbz, .cbr and .cbt).\n" +
		"\n" +
		"Comix is licensed under the GNU General Public License\n" +
		"\n" +
		"<small>Copyright (C) 2005 Pontus Ekberg - herrekberg@users.sourceforge.net</small>\n" +
		"<small>http://comix.sourceforge.net</small>\n")
		label.set_alignment(0, 0)
		self.about_dialog.vbox.pack_start(label, False, False, 0)
		label.set_justify(gtk.JUSTIFY_CENTER)
		label.show()
		
		# File info window
		vbox = gtk.VBox(True, 2)
		vbox.show()
		hbox = gtk.HBox(False, 10)
		hbox.show()
		vbox.pack_start(hbox, True, True, 0)
		hbox.pack_start(self.file_info_label, True, True, 0)
		hbox.pack_start(self.file_info_label2, True, True, 0)
		self.file_dialog.set_border_width(10)
		self.file_dialog.set_has_separator(False)
		self.file_dialog.vbox.pack_start(vbox, True, True, 2)
		self.file_info_label.show()
		self.file_info_label2.show()
		self.file_info_label.set_justify(gtk.JUSTIFY_RIGHT)
		
		# Invalid filename window
		self.invalid_filename_dialog.set_border_width(10)
		self.invalid_filename_dialog.set_has_separator(False)
		hbox = gtk.HBox(False, 10)
		hbox.show()
		self.invalid_filename_dialog.vbox.pack_start(hbox, True, True, 0)
		stock = gtk.image_new_from_stock(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_DIALOG)
		hbox.pack_start(stock, 2)
		stock.show()
		hbox.pack_start(self.invalid_filename_info_label, False, False, 2)
		self.invalid_filename_info_label.show()
		
		# Wrong permissions window
		self.permission_dialog.set_border_width(10)
		self.permission_dialog.set_has_separator(False)
		hbox = gtk.HBox(False, 10)
		hbox.show()
		self.permission_dialog.vbox.pack_start(hbox, True, True, 0)
		stock = gtk.image_new_from_stock(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_DIALOG)
		hbox.pack_start(stock, 2)
		stock.show()
		hbox.pack_start(self.permission_label, False, False, 2)
		self.permission_label.show()
		
		# Convert window
		self.convert_dialog.set_border_width(10)
		self.convert_dialog.set_has_separator(False)
		self.combobox_convert.append_text('Select new archive type:')
		self.convert_dialog.vbox.pack_start(self.combobox_convert)
		self.combobox_convert.show()
		label = gtk.Label('\nNew filename:')
		label.set_alignment(0, 0)
		self.convert_dialog.vbox.pack_start(label)
		label.show()
		self.convert_dialog.vbox.pack_start(self.filename_entry)
		self.filename_entry.show()
		self.convert_dialog.vbox.pack_start(self.button_delete_archive)
		self.button_delete_archive.connect("toggled", self.options, None)
		self.button_delete_archive.show()
		label = gtk.Label('\n')
		self.convert_dialog.vbox.pack_start(label)
		label.show()
		
		# Overwrite window
		self.overwrite_dialog.set_border_width(10)
		self.overwrite_dialog.set_has_separator(False)
		hbox = gtk.HBox(False, 10)
		hbox.show()
		self.overwrite_dialog.vbox.pack_start(hbox, True, True, 0)
		stock = gtk.image_new_from_stock(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG)
		hbox.pack_start(stock, 2)
		stock.show()
		hbox.pack_start(self.overwrite_label)
		self.overwrite_label.show()
	
	def close_application(self, widget, event):
		
		self.window.show()
		self.optionlist[12], self.optionlist[13] = self.window.get_position()
		gtk.main_quit()
		return False
		
	def short_close_application(self, event):
		
		self.window.show()
		self.optionlist[12], self.optionlist[13] = self.window.get_position()
		gtk.main_quit()
		return False
	
	def key_press_event(self, widget, event, data=None):
		
		if self.optionlist[0]:
			menu_size = abs(self.optionlist[3] - 1) * self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
			tool_size = abs(self.optionlist[3] - 1) * self.optionlist[26] * self.toolbar.size_request()[1]
			status_size = abs(self.optionlist[3] - 1) * self.optionlist[27] * self.statusbar.size_request()[1]
			
		else:
			menu_size = self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
			tool_size = self.optionlist[26] * self.toolbar.size_request()[1]
			status_size = self.optionlist[27] * self.statusbar.size_request()[1]
		
		if event.keyval == gtk.keysyms.Escape:
			
			if self.optionlist[0] == 1:
				
				self.actiongroup.get_action('Fullscreen').set_active(False)	
			
		elif event.keyval == gtk.keysyms.Down:
			
			if self.optionlist[18] == 0 or self.show_comments:
				
				height = self.layout.get_size()[1]
				
				if (self.vadjust.get_value() + 20 > height - self.window.get_size()[1] + self.hscroll.size_request()[1]
				- self.hscroll.size_request()[1] * self.optionlist[22] + menu_size + tool_size + status_size):
					
					self.vadjust.set_value(height - self.window.get_size()[1] + self.hscroll.size_request()[1] - self.hscroll.size_request()[1] 
					* self.optionlist[22] + menu_size + tool_size + status_size)
					
				else:
					
					self.vadjust.set_value(self.vadjust.get_value() + 20)
			
		elif event.keyval == gtk.keysyms.Up:
			
			if self.optionlist[18] == 0 or self.show_comments:
				
				if self.vadjust.get_value() - 20 < 0:
					
					self.vadjust.set_value(0)
					
				else:
					
					self.vadjust.set_value(self.vadjust.get_value() - 20)	
					
		elif event.keyval == gtk.keysyms.Right:
			
			if self.optionlist[18] == 0 or self.show_comments:
				
				if self.optionlist[22] == 1:
					
					if self.hadjust.get_value() + 20 > self.layout.get_size()[0] - self.window.get_size()[0]:
						
						self.hadjust.set_value(self.layout.get_size()[0] - self.window.get_size()[0])
						
					else:
						
						self.hadjust.set_value(self.hadjust.get_value() + 20)
					
				else:
					
					if self.hadjust.get_value() + 20 > self.layout.get_size()[0] - self.window.get_size()[0] + self.vscroll.size_request()[0]:
						
						self.hadjust.set_value(self.layout.get_size()[0] - self.window.get_size()[0] + self.vscroll.size_request()[0])
						
					else:
						
						self.hadjust.set_value(self.hadjust.get_value() + 20)
					
		elif event.keyval == gtk.keysyms.Left:
			
			if self.optionlist[18] == 0 or self.show_comments:
				
				if self.hadjust.get_value() - 20 < 0:
					
					self.hadjust.set_value(0)
					
				else:
					
					self.hadjust.set_value(self.hadjust.get_value() - 20)
					
		elif event.keyval == gtk.keysyms.space:
			
			if self.optionlist[18] == 1 and not self.show_comments:
				
				self.next_page(None)
				
			else:
				
				height = self.layout.get_size()[1]
				
				if (self.vadjust.get_value() + 20 > height - self.window.get_size()[1] + self.hscroll.size_request()[1] 
				- self.hscroll.size_request()[1] * self.optionlist[22] + menu_size + tool_size + status_size):
						
					self.vadjust.set_value(height - self.window.get_size()[1] + self.hscroll.size_request()[1] - self.hscroll.size_request()[1] *
					self.optionlist[22] + menu_size + tool_size + status_size)
				
				if (self.vadjust.get_value() >= height - self.window.get_size()[1] + self.hscroll.size_request()[1] - self.hscroll.size_request()[1] 
				* self.optionlist[22] + menu_size + tool_size + status_size):
					
					self.next_page(None)
					
				else:
					
					if (self.vadjust.get_value() + self.window.get_size()[1] - self.hscroll.size_request()[1] + self.hscroll.size_request()[1] * self.optionlist[22]
					- menu_size - tool_size > 
					height - self.window.get_size()[1] + self.hscroll.size_request()[1] - self.hscroll.size_request()[1] * self.optionlist[22]
					+ menu_size + tool_size + status_size):
						
						self.vadjust.set_value(height - self.window.get_size()[1] + self.hscroll.size_request()[1] - self.hscroll.size_request()[1] 
						* self.optionlist[22] + menu_size + tool_size + status_size)
						
					else:
						
						self.vadjust.set_value(self.vadjust.get_value() + self.window.get_size()[1] - self.hscroll.size_request()[1] + self.hscroll.size_request()[1] 
						* self.optionlist[22] - menu_size 
						- tool_size - status_size)	
	
	def scroll_wheel_event(self, view, event, data=None):
		
		if self.optionlist[0]:
			menu_size = abs(self.optionlist[3] - 1) * self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
			tool_size = abs(self.optionlist[3] - 1) * self.optionlist[26] * self.toolbar.size_request()[1]
			status_size = abs(self.optionlist[3] - 1) * self.optionlist[27] * self.statusbar.size_request()[1]
			
		else:
			menu_size = self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
			tool_size = self.optionlist[26] * self.toolbar.size_request()[1]
			status_size = self.optionlist[27] * self.statusbar.size_request()[1]
		
		if event.direction == gtk.gdk.SCROLL_UP:
			
			if self.optionlist[18] == 1 and not self.show_comments:
				
				self.previous_page(None)
				
			else:
				
				if self.vadjust.get_value() - 40 < 0:
					
					self.vadjust.set_value(0)
					
				else:
					
					self.vadjust.set_value(self.vadjust.get_value() - 40)	
			
		elif event.direction == gtk.gdk.SCROLL_DOWN:
			
			if self.optionlist[18] == 1 and not self.show_comments:
				
				self.next_page(None)
				
			else:
				
				height = self.layout.get_size()[1]
					
				if (self.vadjust.get_value() + 40 > height - self.window.get_size()[1] + self.hscroll.size_request()[1] - self.hscroll.size_request()[1] * self.optionlist[22]
				+ menu_size + tool_size + status_size):
					
					self.vadjust.set_value(height - self.window.get_size()[1] + self.hscroll.size_request()[1] - self.hscroll.size_request()[1] * self.optionlist[22]
					+ menu_size + tool_size + status_size)
					
				else:
					
					self.vadjust.set_value(self.vadjust.get_value() + 40)
					
		elif event.direction == gtk.gdk.SCROLL_LEFT:
			
			self.previous_page(None)
		
		elif event.direction == gtk.gdk.SCROLL_RIGHT:
			
			self.next_page(None)			

	def area_resize_event(self, widget, allocation):
		
		if allocation.width != self.optionlist[10] or allocation.height != self.optionlist[11]:
			
			self.optionlist[10] = allocation.width
			self.optionlist[11] = allocation.height
			self.refresh_image()
			
	def drag_image(self, widget, event):		
		
		self.mouse_moved = 1
		
		for x in gtk.gdk.window_get_toplevels():
			x.set_cursor(gtk.gdk.Cursor(gtk.gdk.FLEUR))
		
		if self.optionlist[18] == 0 or self.show_comments:
			
			self.motion_number += 1
			
			if self.motion_number > 1:
				
				if self.old_vadjust_value - event.y_root + self.y_motion > self.vadjust_upper:
				
					self.vadjust.set_value(self.vadjust_upper)
					self.y_motion = event.y_root
					self.old_vadjust_value = self.vadjust.value
					
				elif self.old_vadjust_value - event.y_root + self.y_motion < 0:
					
					self.vadjust.set_value(0)
					self.y_motion = event.y_root
					self.old_vadjust_value = self.vadjust.value
					
				else:
					
					self.vadjust.set_value(self.old_vadjust_value - event.y_root + self.y_motion)
					
				if self.old_hadjust_value - event.x_root + self.x_motion > self.hadjust_upper:
					
					self.hadjust.set_value(self.hadjust_upper)
					self.x_motion = event.x_root
					self.old_hadjust_value = self.hadjust.value
					
				elif self.old_hadjust_value - event.x_root + self.x_motion < 0:
					
					self.hadjust.set_value(0)
					self.x_motion = event.x_root
					self.old_hadjust_value = self.hadjust.value
				
				else:
					
					self.hadjust.set_value(self.old_hadjust_value - event.x_root + self.x_motion)
					
				self.motion_number = 0
		
	def button_release(self, widget, event):
		
		if self.optionlist[24] and self.optionlist[0]:
			
			pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
			color = gtk.gdk.Color()
			cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
			for x in gtk.gdk.window_get_toplevels():
				x.set_cursor(None)
			gtk.gdk.window_get_toplevels()[1].set_cursor(cursor)
			
			
		else:
			
			for x in gtk.gdk.window_get_toplevels():
				x.set_cursor(None)
				
		if self.mouse_moved == 0:
			
			self.next_page(None)
		
	def fullscreen_switch(self, event):
		
		if self.optionlist[0]:
			
			self.optionlist[0] = 0
			self.window.unfullscreen()
			
		else:
			
			self.optionlist[0] = 1
			self.window.fullscreen()			
			
	def double_page_switch(self, event):
		
		if self.optionlist[4] == 1:
			
			self.optionlist[4] = 0
			
		else:
			
			self.optionlist[4] = 1
			
		self.refresh_image()
		
	def fit_to_screen_switch(self, event):
		
		if self.optionlist[18] == 1:
			
			self.optionlist[18] = 0
			self.actiongroup.get_action('Zin').set_sensitive(True)
			self.actiongroup.get_action('Zout').set_sensitive(True)
			self.actiongroup.get_action('Zoriginal').set_sensitive(True)
			self.actiongroup.get_action('Zwidth').set_sensitive(True)
			self.actiongroup.get_action('Zheight').set_sensitive(True)
			self.actiongroup.get_action('Zfit').set_sensitive(True)
			self.actiongroup.get_action('Scrollbars').set_sensitive(True)
			self.button_zin.set_sensitive(True)
			self.button_zout.set_sensitive(True)
			self.button_z100.set_sensitive(True)
			self.button_zfit.set_sensitive(True)
			
		else:
			
			self.optionlist[18] = 1
			self.actiongroup.get_action('Zin').set_sensitive(False)
			self.actiongroup.get_action('Zout').set_sensitive(False)
			self.actiongroup.get_action('Zoriginal').set_sensitive(False)
			self.actiongroup.get_action('Zwidth').set_sensitive(False)
			self.actiongroup.get_action('Zheight').set_sensitive(False)
			self.actiongroup.get_action('Zfit').set_sensitive(False)
			self.actiongroup.get_action('Scrollbars').set_sensitive(False)
			self.button_zin.set_sensitive(False)
			self.button_zout.set_sensitive(False)
			self.button_z100.set_sensitive(False)
			self.button_zfit.set_sensitive(False)
			
		self.refresh_image()
		
	def menubar_switch(self, event):
		
		if self.optionlist[25] == 1:
			
			self.optionlist[25] = 0
			self.show_menu = 0
			
		else:
			
			self.optionlist[25] = 1
			self.show_menu = 1
			
		self.refresh_image()
		
	def toolbar_switch(self, event):
		
		if self.optionlist[26] == 1:
			
			self.optionlist[26] = 0
			self.show_tool = 0
			
		else:
			
			self.optionlist[26] = 1
			self.show_tool = 1
			
		self.refresh_image()
		
	def statusbar_switch(self, event):
		
		if self.optionlist[27] == 1:
			
			self.optionlist[27] = 0
			self.show_status = 0
			
		else:
			
			self.optionlist[27] = 1
			self.show_status = 1
			
		self.refresh_image()
		
	def scrollbars_switch(self, event):
		
		if self.optionlist[22] == 1:
			
			self.optionlist[22] = 0
			
		else:
			
			self.optionlist[22] = 1
			
		self.refresh_image()
		
	def comments_switch(self, event):
		
		if len(self.comments) > 0:
			
			if self.show_comments:
				
				self.show_comments = 0
				
			else:
				
				self.show_comments = 1
				self.comment_number = 0
				
			self.refresh_image()
		
	def zoom_in(self, event):
		
		if self.optionlist[18] == 0:
			
			if self.optionlist[17] * 1.15 > 500:
				
				self.optionlist[17] = 500
				
			else:
				
				self.optionlist[17] = self.optionlist[17] * 1.15
				
			self.refresh_image()
			
	def zoom_out(self, event):
		
		if self.optionlist[18] == 0:
			
			if self.optionlist[17] * 0.85 < 10:
				
				self.optionlist[17] = 10
				
			else:
				
				self.optionlist[17] = self.optionlist[17] * 0.85
				
			self.refresh_image()
			
	def zoom_original(self, event):
		
		if self.optionlist[18] == 0:
			
			self.optionlist[17] = 100
			self.refresh_image()
			
	def zoom_width(self, event):
		
		if self.optionlist[18] == 0 and self.file_exist == 1:
			
			if self.optionlist[4] == 0:
				
				self.optionlist[17] = 100.0 * (self.window.get_size()[0] - self.vscroll.size_request()[0] + self.optionlist[22] * self.vscroll.size_request()[0]) / self.image1_width
				
			else:
				
				self.optionlist[17] = 100.0 * (self.window.get_size()[0] - self.vscroll.size_request()[0] + self.optionlist[22] * self.vscroll.size_request()[0]) / (self.image1_width + self.image2_width)
				
			self.refresh_image()
			
	def zoom_height(self, event):
		
		if self.optionlist[18] == 0 and self.file_exist == 1:
			
			if self.optionlist[0]:
				menu_size = abs(self.optionlist[3] - 1) * self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
				tool_size = abs(self.optionlist[3] - 1) * self.optionlist[26] * self.toolbar.size_request()[1]
				status_size = abs(self.optionlist[3] - 1) * self.optionlist[27] * self.statusbar.size_request()[1]
				
			else:
				menu_size = self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
				tool_size = self.optionlist[26] * self.toolbar.size_request()[1]
				status_size = self.optionlist[27] * self.statusbar.size_request()[1]
			
			if self.optionlist[4] == 0:
				
				self.optionlist[17] = (100.0 * (self.window.get_size()[1] - self.hscroll.size_request()[1] + self.optionlist[22] 
				* self.hscroll.size_request()[1] - menu_size - tool_size - status_size) / self.image1_height)
				
			else:
				
				if self.image1_height > self.image2_height:
					
					height = self.image1_height
					
				else:
					
					height = self.image2_height
					
				self.optionlist[17] = (100.0 * (self.window.get_size()[1] - self.hscroll.size_request()[1] + self.optionlist[22] 
				* self.hscroll.size_request()[1] - menu_size
				- tool_size - status_size) / height)
				
			self.refresh_image()
			
	def zoom_fit(self, event):
		
		if self.optionlist[18] == 0 and self.file_exist == 1:
			
			if self.optionlist[0]:
				menu_size = abs(self.optionlist[3] - 1) * self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
				tool_size = abs(self.optionlist[3] - 1) * self.optionlist[26] * self.toolbar.size_request()[1]
				status_size = abs(self.optionlist[3] - 1) * self.optionlist[27] * self.statusbar.size_request()[1]
				
			else:
				menu_size = self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
				tool_size = self.optionlist[26] * self.toolbar.size_request()[1]
				status_size = self.optionlist[27] * self.statusbar.size_request()[1]
			
			if self.optionlist[4] == 0:
				
				if (100.0 * (self.window.get_size()[0] - self.vscroll.size_request()[0] + self.optionlist[22] * self.vscroll.size_request()[0]) / self.image1_width 
				< 100.0 * (self.window.get_size()[1] - self.hscroll.size_request()[1] + self.optionlist[22] * self.hscroll.size_request()[1] 
				- menu_size - tool_size - status_size) / self.image1_height):
					
					self.optionlist[17] = 100.0 * (self.window.get_size()[0] - self.vscroll.size_request()[0] + self.optionlist[22] * self.vscroll.size_request()[0]) / self.image1_width
					
				else:
					
					self.optionlist[17] = (100.0 * (self.window.get_size()[1] - self.hscroll.size_request()[1] + self.optionlist[22] * self.hscroll.size_request()[1]
					- menu_size - tool_size - status_size) / self.image1_height)
					
			else:
				
				if self.image1_height > self.image2_height:
					
					height = self.image1_height
					
				else:
					
					height = self.image2_height
				
				if (100.0 * (self.window.get_size()[0] - self.vscroll.size_request()[0] + self.optionlist[22] * self.vscroll.size_request()[0]) 
				/ (self.image1_width + self.image2_width) < 100.0 * (self.window.get_size()[1] - self.hscroll.size_request()[1] 
				+ self.optionlist[22] * self.hscroll.size_request()[1] - menu_size - tool_size - status_size) / height):
					
					self.optionlist[17] = (100.0 * (self.window.get_size()[0] - self.vscroll.size_request()[0] + self.optionlist[22] 
					* self.vscroll.size_request()[0]) / (self.image1_width + self.image2_width))
					
				else:
					
					self.optionlist[17] = (100.0 * (self.window.get_size()[1] - self.hscroll.size_request()[1] + self.optionlist[22] 
					* self.hscroll.size_request()[1] - menu_size - tool_size - status_size) / height)
					
			self.refresh_image()
				
	def next_page(self, event):
		
		if self.show_comments:
			
			if self.comment_number < len(self.comments) - 1:
				
				self.comment_number = self.comment_number + 1
				self.refresh_image()
				
			else:
				
				self.show_comments = 0
				self.refresh_image()
		
		else:
			
			if self.optionlist[4] == 0:
				
				if self.file_number < len(self.file) - 1:
					
					self.file_number = self.file_number + 1
					self.refresh_image()
					self.vadjust.set_value(0)
					self.hadjust.set_value(0)
					
				elif self.archive_type != "" and self.optionlist[23] == 1:
					
					temp_list = os.listdir(os.path.dirname(self.path))
					directory_list = []
					
					for file in temp_list:
						
						if os.path.isfile(os.path.dirname(self.path) + '/' + file):
							
							if (zipfile.is_zipfile(os.path.dirname(self.path) + '/' + file) or tarfile.is_tarfile(os.path.dirname(self.path) + '/' + file)
							or self.archive_mime_type(os.path.dirname(self.path) + '/' + file) == 'rar'):
								
								directory_list.append(file)
						
					directory_list.sort(locale.strcoll)
					
					if directory_list.count(os.path.basename(self.path)) > 0:
						
						while(True):
							
							if directory_list.index(os.path.basename(self.path)) < len(directory_list) - 1:
								
								if os.path.isfile(os.path.dirname(self.path) + '/' + directory_list[directory_list.index(os.path.basename(self.path)) + 1]):
									
									self.load_file(os.path.dirname(self.path) + '/' + directory_list[directory_list.index(os.path.basename(self.path)) + 1])
									
									if self.file_exist == 1:
										
										self.refresh_image()
										break
								
							else:
								
								break
							
			else:
				
				if self.file_number < len(self.file) - 2:
					
					self.file_number = self.file_number + 2
					self.refresh_image()
					self.vadjust.set_value(0)
					self.hadjust.set_value(0)
					
				elif self.archive_type != "" and self.optionlist[23] == 1:
					
					temp_list = os.listdir(os.path.dirname(self.path))
					directory_list = []
					
					for file in temp_list:
						
						if os.path.isfile(os.path.dirname(self.path) + '/' + file):
							
							if (zipfile.is_zipfile(os.path.dirname(self.path) + '/' + file) or tarfile.is_tarfile(os.path.dirname(self.path) + '/' + file)
							or self.archive_mime_type(os.path.dirname(self.path) + '/' + file) == 'rar'):
								
								directory_list.append(file)
						
					directory_list.sort(locale.strcoll)
					
					if directory_list.count(os.path.basename(self.path)) > 0:
						
						while(True):
							
							if directory_list.index(os.path.basename(self.path)) < len(directory_list) - 1:
								
								if os.path.isfile(os.path.dirname(self.path) + '/' + directory_list[directory_list.index(os.path.basename(self.path)) + 1]):
									
									self.load_file(os.path.dirname(self.path) + '/' + directory_list[directory_list.index(os.path.basename(self.path)) + 1])
									
									if self.file_exist == 1:
										
										self.refresh_image()
										break
								
							else:
								
								break
		
	def previous_page(self, event):
		
		if self.show_comments:
			
			if self.comment_number > 0:
				
				self.comment_number = self.comment_number - 1
				self.refresh_image()
		
		else:
			
			if self.optionlist[4] == 0:
				
				if self.file_number > 0:
					
					self.file_number = self.file_number - 1
					self.refresh_image()
					self.vadjust.set_value(0)
					self.hadjust.set_value(0)
					
				elif self.archive_type != "" and self.optionlist[23] == 1:
					
					temp_list = os.listdir(os.path.dirname(self.path))
					directory_list = []
					
					for file in temp_list:
						
						if os.path.isfile(os.path.dirname(self.path) + '/' + file):
							
							if (zipfile.is_zipfile(os.path.dirname(self.path) + '/' + file) or tarfile.is_tarfile(os.path.dirname(self.path) + '/' + file)
							or self.archive_mime_type(os.path.dirname(self.path) + '/' + file) == 'rar'):
								
								directory_list.append(file)
						
					directory_list.sort(locale.strcoll)
					directory_list.reverse()
					
					if directory_list.count(os.path.basename(self.path)) > 0:
						
						while(True):
							
							if directory_list.index(os.path.basename(self.path)) < len(directory_list) - 1:
								
								if os.path.isfile(os.path.dirname(self.path) + '/' + directory_list[directory_list.index(os.path.basename(self.path)) + 1]):
									
									self.load_file(os.path.dirname(self.path) + '/' + directory_list[directory_list.index(os.path.basename(self.path)) + 1])
									
									if self.file_exist == 1:
										
										self.file_number = len(self.file) - 1
										self.refresh_image()
										break
								
							else:
								
								break
					
			else:
				
				if self.file_number > 1:
					
					self.file_number = self.file_number - 2
					self.refresh_image()
					self.vadjust.set_value(0)
					self.hadjust.set_value(0)
					
				else:
					
					if self.file_number > 0:
					
						self.file_number = self.file_number - 1
						self.refresh_image()
						
					elif self.archive_type != "" and self.optionlist[23] == 1:
						
						temp_list = os.listdir(os.path.dirname(self.path))
						directory_list = []
						
						for file in temp_list:
							
							if os.path.isfile(os.path.dirname(self.path) + '/' + file):
								
								if (zipfile.is_zipfile(os.path.dirname(self.path) + '/' + file) or tarfile.is_tarfile(os.path.dirname(self.path) + '/' + file)
								or self.archive_mime_type(os.path.dirname(self.path) + '/' + file) == 'rar'):
									
									directory_list.append(file)
							
						directory_list.sort(locale.strcoll)
						directory_list.reverse()
						
						if directory_list.count(os.path.basename(self.path)) > 0:
							
							while(True):
								
								if directory_list.index(os.path.basename(self.path)) < len(directory_list) - 1:
									
									if os.path.isfile(os.path.dirname(self.path) + '/' + directory_list[directory_list.index(os.path.basename(self.path)) + 1]):
										
										self.load_file(os.path.dirname(self.path) + '/' + directory_list[directory_list.index(os.path.basename(self.path)) + 1])
										
										if self.file_exist == 1:
											
											if len(self.file) > 1:
												
												self.file_number = len(self.file) - 2
												
											else:
												
												self.file_number = len(self.file) - 1
												
											self.refresh_image()
											break
									
								else:
									
									break
			
	def first_page(self, event):
		
		self.file_number = 0
		self.refresh_image()
		self.vadjust.set_value(0)
		self.hadjust.set_value(0)
		
	def last_page(self, event):
		
		self.file_number = len(self.file) - 1
		self.refresh_image()
		self.vadjust.set_value(0)
		self.hadjust.set_value(0)
		
	def open_go_to_page(self, event):
		
		self.button_page_spin.set_range(1, len(self.file))
		self.button_page_spin.set_value(self.file_number + 1)
		command = "of " + str(len(self.file))
		self.go_to_page_label.set_text(command)		
		self.page_dialog.show()
		self.page_dialog.present()
		
	def save_and_close_go_to_page(self, event, data):
		
		self.page_dialog.hide()
		
		if data == -5:
			
			if int(self.button_page_spin.get_value()) > 0 and int(self.button_page_spin.get_value()) <= len(self.file):
				
				self.show_comments = 0
				self.file_number = int(self.button_page_spin.get_value()) - 1
				self.refresh_image()
				self.vadjust.set_value(0)
				self.hadjust.set_value(0)
		
	def close_go_to_page(self, event, data=None):
		
		self.page_dialog.hide()
		return True
		
	def open_convert(self, event):
		
		while len(self.combobox_convert.get_model()) > 1:
			
			for i in range(len(self.combobox_convert.get_model()) - 1):
				
				self.combobox_convert.remove_text(i + 1)
				break
			
		if self.archive_type in ['', 'RAR archive']:
			
			self.combobox_convert.append_text('Zip archive')
			self.combobox_convert.append_text('Tar archive')
			self.combobox_convert.append_text('Gzip compressed tar archive')
			self.combobox_convert.append_text('Bzip2 compressed tar archive')
			
		elif self.archive_type in ['Zip archive']:
			
			self.combobox_convert.append_text('Tar archive')
			self.combobox_convert.append_text('Gzip compressed tar archive')
			self.combobox_convert.append_text('Bzip2 compressed tar archive')
			
		elif self.archive_type in ['Tar archive']:
			
			self.combobox_convert.append_text('Zip archive')
			self.combobox_convert.append_text('Gzip compressed tar archive')
			self.combobox_convert.append_text('Bzip2 compressed tar archive')
			
		elif self.archive_type in ['Gzip compressed tar archive']:
			
			self.combobox_convert.append_text('Zip archive')
			self.combobox_convert.append_text('Tar archive')
			self.combobox_convert.append_text('Bzip2 compressed tar archive')
			
		elif self.archive_type in ['Bzip2 compressed tar archive']:
			
			self.combobox_convert.append_text('Zip archive')
			self.combobox_convert.append_text('Tar archive')
			self.combobox_convert.append_text('Gzip compressed tar archive')
			
		self.combobox_convert.set_active(0)
		self.filename_entry.set_sensitive(False)
		self.convert_dialog.show()
		self.convert_dialog.present()
		self.filename_entry.set_text('')
		self.dir_removed = 0
		
	def save_and_close_convert(self, event, data):
		
		self.convert_dialog.hide()
		
		if data == -5:
			
			if ('/' in self.filename_entry.get_text() or len(self.filename_entry.get_text()) <= 0
			or self.filename_entry.get_text() == '.' or self.filename_entry.get_text() == '..'):
				
				self.open_invalid_filename(self.filename_entry.get_text())
				return 0
			
			if not os.path.exists('/tmp/comix'):
				os.mkdir('/tmp/comix')
			
			if self.combobox_convert.get_active() >= 0:
				
				if self.file_removed == 0:
					
					if os.path.exists('/tmp/comix/convert'):
						shutil.rmtree('/tmp/comix/convert')
					
					if self.archive_type == '':
						
						shutil.copytree(os.path.dirname(self.path), '/tmp/comix/convert/')
					
					else:
						
						os.mkdir('/tmp/comix/convert')
						
						if zipfile.is_zipfile(self.path):
							
							zip = zipfile.ZipFile(self.path)
							zipfiles = zip.namelist()
							
							for x in zipfiles:
								if zip.getinfo(x).file_size > 0:
									if not os.path.exists(os.path.dirname('/tmp/comix/convert/' + x)):
										os.makedirs(os.path.dirname('/tmp/comix/convert/' + x))
									new = open('/tmp/comix/convert/' + x, 'w')
									new.write(zip.read(x))
									new.close()
								
							zip.close()
							
						elif tarfile.is_tarfile(self.path):
							
							tar = tarfile.open(self.path, 'r')
							tarfiles = tar.getmembers()
							
							for x in tarfiles:
								tar.extract(x, '/tmp/comix/convert/')
								
							tar.close()
							
						elif self.archive_mime_type(self.path) == 'rar':
							
							os.popen('unrar x "' + self.path + '" /tmp/comix/convert')
					
				if self.archive_type == '':
					
					if os.path.exists(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text()):
						
						if (self.button_delete_archive.get_active() and os.path.dirname(os.path.dirname(self.path))
						+ '/' + self.filename_entry.get_text() == os.path.dirname(self.path)):
							
							try:
								
								if os.path.isdir(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text()):
									shutil.rmtree(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text())
									
								else:
									os.remove(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text())
								
							except:
								
								self.open_permission_dialog(os.path.dirname(os.path.dirname(self.path)))
								return 0
							
						else:
							
							self.overwrite_label.set_text(self.filename_entry.get_text() + ' already exists.\nOverwrite?')
							self.overwrite_dialog.show()
							return 0
				
				else:
					
					if os.path.exists(os.path.dirname(self.path) + '/' + self.filename_entry.get_text()):
						
						if (self.button_delete_archive.get_active() and os.path.dirname(self.path) 
						+ '/' + self.filename_entry.get_text() == self.path):
							
							try:
								
								if os.path.isdir(os.path.dirname(self.path) + '/' + self.filename_entry.get_text()):
									shutil.rmtree(os.path.dirname(self.path) + '/' + self.filename_entry.get_text())
									
								else:
									os.remove(os.path.dirname(self.path) + '/' + self.filename_entry.get_text())
									
							except:
								
								self.open_permission_dialog(os.path.dirname(self.path) + '/' + self.filename_entry.get_text())
								return 0
							
						else:
							
							self.overwrite_label.set_text(self.filename_entry.get_text() + ' already exists.\nOverwrite?')
							self.overwrite_dialog.show()
							return 0
							
				for x in gtk.gdk.window_get_toplevels():
					x.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
				
				if self.combobox_convert.get_model()[self.combobox_convert.get_active()][0] == 'Zip archive':
					
					if self.archive_type != '' and self.dir_removed == 0:
						new_zip = zipfile.ZipFile(os.path.dirname(self.path) + '/' + self.filename_entry.get_text().encode(sys.getfilesystemencoding()), 'w')
					else:
						new_zip = zipfile.ZipFile(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text().encode(sys.getfilesystemencoding()), 'w')
					
					dir = os.getcwd()
					os.chdir('/tmp/comix/convert')
					files = os.listdir('.')
					
					loop = 1
					
					while loop:
						
						loop = 0
						
						for i, file in enumerate(files):
							
							if os.path.isdir(file):
								
								files.pop(i)
								temp_files = os.listdir(file)
								
								for temp_file in temp_files:
									
									temp_file = file + '/' + temp_file
									files.append(temp_file)
									
								loop = 1
								break
					
					for file in files:
						
						file = unicode(file, sys.getfilesystemencoding())
						new_zip.write(file, file.encode('cp437'))
					
					new_zip.close()
					os.chdir(dir)
					
				elif (self.combobox_convert.get_model()[self.combobox_convert.get_active()][0] in 
				['Tar archive', 'Gzip compressed tar archive', 'Bzip2 compressed tar archive']):
					
					if self.combobox_convert.get_model()[self.combobox_convert.get_active()][0] == 'Tar archive':
						type = 'w'
					elif self.combobox_convert.get_model()[self.combobox_convert.get_active()][0] == 'Gzip compressed tar archive':
						type = 'w:gz'
					else:
						type = 'w:bz2'
					
					if self.archive_type != '' and self.dir_removed == 0:
						new_tar = tarfile.open(os.path.dirname(self.path) + '/' + self.filename_entry.get_text().encode(sys.getfilesystemencoding()), type)
					else:
						new_tar = tarfile.open(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text().encode(sys.getfilesystemencoding()), type)
					
					dir = os.getcwd()
					os.chdir('/tmp/comix/convert')
					files = os.listdir('.')
					
					loop = 1
					
					while loop:
						
						loop = 0
						
						for i, file in enumerate(files):
							
							if os.path.isdir(file):
								
								files.pop(i)
								temp_files = os.listdir(file)
								
								for temp_file in temp_files:
									
									temp_file = file + '/' + temp_file
									files.append(temp_file)
									
								loop = 1
								break
					
					for file in files:
						
						new_tar.add(file)
					
					new_tar.close()
					os.chdir(dir)
					
				if os.path.exists('/tmp/comix/convert'):
					shutil.rmtree('/tmp/comix/convert')
					
				if self.archive_type != '':
					
					if os.path.exists(self.path) and self.button_delete_archive.get_active() and os.path.dirname(self.path) + '/' + self.filename_entry.get_text() != self.path:
						
						try:
							
							os.remove(self.path)
							
						except:
							
							self.open_permission_dialog(self.path)
							return 0
						
				else:
					
					if (os.path.exists(os.path.dirname(self.path)) and self.button_delete_archive.get_active() and os.path.dirname(os.path.dirname(self.path)) 
					+ '/' + self.filename_entry.get_text() != os.path.dirname(self.path)):
						
						try:
							
							shutil.rmtree(os.path.dirname(self.path))
						
						except:
							
							self.open_permission_dialog(os.path.dirname(self.path))
							return 0
						
				if self.archive_type != '':
					
					if self.button_delete_archive.get_active() or os.path.dirname(self.path) + '/' + self.filename_entry.get_text() == self.path:
						
						self.archive_type = self.combobox_convert.get_model()[self.combobox_convert.get_active()][0]
						self.path = os.path.dirname(self.path) + '/' + self.filename_entry.get_text()
						self.refresh_image()
						
				else:
					
					if self.button_delete_archive.get_active() or os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text() == os.path.dirname(self.path):
						
						temp = self.file_number
						self.load_file(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text())
						self.file_number = temp
						self.refresh_image()
					
				if self.optionlist[24] and self.optionlist[0]:
					
					pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
					color = gtk.gdk.Color()
					cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
					for x in gtk.gdk.window_get_toplevels():
						x.set_cursor(None)
					gtk.gdk.window_get_toplevels()[1].set_cursor(cursor)
					
				else:
					
					for x in gtk.gdk.window_get_toplevels():
						x.set_cursor(None)
						
				self.file_removed = 0
		
	def close_convert(self, event, data=None):
		
		self.convert_dialog.hide()
		return True
		
	def change_convert(self, event, data=None):
		
		if self.combobox_convert.get_active() >=0:
			
			if self.combobox_convert.get_model()[self.combobox_convert.get_active()][0] == 'Zip archive':
				
				suffix = '.cbz'
				
			elif self.combobox_convert.get_model()[self.combobox_convert.get_active()][0] in ['Tar archive', 'Gzip compressed tar archive', 'Bzip2 compressed tar archive']:
				
				suffix = '.cbt'
				
			else:
				
				suffix = ''
			
		if suffix != '':
			
			if self.archive_type != '':
				
				self.filename_entry.set_text(os.path.splitext(os.path.basename(self.path))[0] + suffix)
				self.filename_entry.set_sensitive(True)
				
			else:
				
				self.filename_entry.set_text(os.path.basename(os.path.dirname(self.path)) + suffix)
				self.filename_entry.set_sensitive(True)
			
		else:
			
			self.filename_entry.set_text('')
			self.filename_entry.set_sensitive(False)
		
	def close_overwrite(self, event, data=None):
		
		self.overwrite_dialog.hide()
		self.overwrite = 0
		return True
		
	def save_and_close_overwrite(self, event, data):
		
		self.overwrite_dialog.hide()
		
		if data == -5:
			
			if self.archive_type != '':
				
				try:
					
					if os.path.isdir(os.path.dirname(self.path) + '/' + self.filename_entry.get_text()):
						shutil.rmtree(os.path.dirname(self.path) + '/' + self.filename_entry.get_text())
						
					else:
						os.remove(os.path.dirname(self.path) + '/' + self.filename_entry.get_text())
					
				except:
					
					self.open_permission_dialog(os.path.dirname(self.path) + '/' + self.filename_entry.get_text())
					return 0
				
			else:
				
				try:
					
					if os.path.isdir(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text()):
						shutil.rmtree(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text())
						
					else:
						os.remove(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text())
						
				except:
					
					self.open_permission_dialog(os.path.dirname(os.path.dirname(self.path)) + '/' + self.filename_entry.get_text())
					return 0
				
			self.file_removed = 1
			self.save_and_close_convert(self, -5)
				
	def open_options(self, event):
		
		self.temp_optionlist = []
		self.old_optionlist = []
		
		for x in self.optionlist:
			
			self.temp_optionlist.append(x)
			self.old_optionlist.append(x)
		
		self.button_fullscreen.set_active(self.optionlist[1])
			
		self.button_page.set_active(self.optionlist[5])
			
		self.button_cache_next.set_active(self.optionlist[7])
			
		self.button_flip_page.set_active(self.optionlist[8])
			
		self.button_stretch.set_active(self.optionlist[9])
		
		self.button_save_size.set_active(self.optionlist[14])	
		
		self.button_fit.set_active(self.optionlist[16])	
		
		self.button_comment.set_active(self.optionlist[28])	
		
		self.button_no_scrollbar.set_active(self.optionlist[22])	
		
		self.button_next_archive.set_active(self.optionlist[23])
		
		self.button_hide_cursor.set_active(self.optionlist[24])
		
		self.button_hide_bars.set_active(self.optionlist[3])
			
		if self.optionlist[2] == gtk.gdk.INTERP_NEAREST:
			self.button_1.set_active(True)
		
		if self.optionlist[2] == gtk.gdk.INTERP_TILES:
			self.button_2.set_active(True)
		
		if self.optionlist[2] == gtk.gdk.INTERP_BILINEAR:
			self.button_3.set_active(True)
		
		if self.optionlist[2] == gtk.gdk.INTERP_HYPER:
			self.button_4.set_active(True)
		
		self.button_spin.set_value(self.optionlist[6] / 10.0)
		self.button_zoom.set_value(self.optionlist[17])
		self.default_path_entry.set_text(unicode(self.optionlist[15], sys.getfilesystemencoding()))
		self.comment_extensions_entry.set_text(unicode(self.optionlist[29], sys.getfilesystemencoding()))
		
		self.colorbutton.set_color(gtk.gdk.colormap_get_system().alloc_color(gtk.gdk.Color(self.optionlist[19], self.optionlist[20], self.optionlist[21]), False, True))
		
		self.options_window.show()
		self.options_window.present()
		
	def save_and_close_options(self, data):
		
		if data == 'close':
			self.options_window.hide()
		
		fullscreen = self.optionlist[0]
		x_res = self.optionlist[10]
		y_res = self.optionlist[11]
			
		for i in range(len(self.optionlist)):
			self.optionlist.pop()
		
		for x in self.temp_optionlist:
			self.optionlist.append(x)
			
		self.optionlist[0] = fullscreen
		self.optionlist[10] = x_res
		self.optionlist[11] = y_res
			
		self.optionlist[6] = self.button_spin.get_value() * 10
		self.optionlist[17] = self.button_zoom.get_value()
		
		if os.path.exists(self.default_path_entry.get_text().encode(sys.getfilesystemencoding())):
			
			self.optionlist[15] = self.default_path_entry.get_text().encode(sys.getfilesystemencoding())
		
		self.optionlist[19] = self.colorbutton.get_color().red
		self.optionlist[20] = self.colorbutton.get_color().green
		self.optionlist[21] = self.colorbutton.get_color().blue
		
		self.layout.modify_bg(gtk.STATE_NORMAL, gtk.gdk.colormap_get_system().alloc_color(gtk.gdk.Color(self.optionlist[19], self.optionlist[20], self.optionlist[21]), False, True))
		
		if self.optionlist[29] != self.comment_extensions_entry.get_text():
			
			self.optionlist[29] = self.comment_extensions_entry.get_text()
			
			self.comments = []
			
			if self.file_exist:
				
				comment_extensions_temp = self.optionlist[29]
				comment_extensions = []
				
				while comment_extensions_temp.count(' '):
					
					if comment_extensions_temp.index(' ') > 0:
						
						comment_extensions.append('.' + comment_extensions_temp[:comment_extensions_temp.index(' ')])
					
					comment_extensions_temp = comment_extensions_temp[comment_extensions_temp.index(' ') + 1:]
				
				if len(comment_extensions_temp) > 0:
					
					comment_extensions.append('.' + comment_extensions_temp)
					
				if self.archive_type != '':
					comment_dir = '/tmp/comix'
				else:
					comment_dir = os.path.dirname(self.path)
					
				for infile in os.listdir(comment_dir):
					
					infile = comment_dir + '/' + infile
					
					if not os.path.isdir(infile):
						
						if gtk.gdk.pixbuf_get_file_info(infile) == None and os.path.splitext(infile)[1].lower() in comment_extensions:
							
							self.comments.append(infile)
							
				if self.comment_number > len(self.comments) - 1:
					
					self.comment_number = 0
					
				if len(self.comments) > 0:
					
					self.actiongroup.get_action('Comments').set_sensitive(True)
					
				else:
					
					self.show_comments = 0
					self.actiongroup.get_action('Comments').set_sensitive(False)
		
		self.refresh_image()
		
	def close_options(self, event, data=None):
		
		self.options_window.hide()
		
		fullscreen = self.optionlist[0]
		x_res = self.optionlist[10]
		y_res = self.optionlist[11]
		
		for i in range(len(self.optionlist)):
			self.optionlist.pop()
			
		for x in self.old_optionlist:
			self.optionlist.append(x)
			
		self.optionlist[0] = fullscreen
		self.optionlist[10] = x_res
		self.optionlist[11] = y_res
		
		self.layout.modify_bg(gtk.STATE_NORMAL, gtk.gdk.colormap_get_system().alloc_color(gtk.gdk.Color(self.optionlist[19], self.optionlist[20], self.optionlist[21]), False, True))
			
		self.refresh_image()
		return True
		
	def options(self, widget, data):
		
		if data == 0:
			
			if self.button_fullscreen.get_active():
				
				self.temp_optionlist[1] = 1
				
			else:
				
				self.temp_optionlist[1] = 0
			
		elif data == 1:
			
			if self.button_page.get_active():
				
				self.temp_optionlist[5] = 1
				
			else:
				
				self.temp_optionlist[5] = 0
				
		elif data == 7:
			
			if self.button_cache_next.get_active():
				
				self.temp_optionlist[7] = 1
				
			else:
				
				self.temp_optionlist[7] = 0
			
		elif data == 8:
			
			if self.button_flip_page.get_active():
				
				self.temp_optionlist[8] = 1
				
			else:
				
				self.temp_optionlist[8] = 0
				
		elif data == 9:
			
			if self.button_stretch.get_active():
				
				self.temp_optionlist[9] = 1
				
			else:
				
				self.temp_optionlist[9] = 0
				
		elif data == 10:
			
			if self.button_save_size.get_active():
				
				self.temp_optionlist[14] = 1
				
			else:
				
				self.temp_optionlist[14] = 0
				
		elif data == 11:
			
			if self.button_fit.get_active():
				
				self.temp_optionlist[16] = 1
				
			else:
				
				self.temp_optionlist[16] = 0
		
		elif data == 12:
			
			if self.button_hide_bars.get_active():
				
				self.temp_optionlist[3] = 1
				
			else:
				
				self.temp_optionlist[3] = 0
				
		elif data == 13:
			
			if self.button_no_scrollbar.get_active():
				
				self.temp_optionlist[22] = 1
				
			else:
				
				self.temp_optionlist[22] = 0
				
		elif data == 14:
			
			if self.button_next_archive.get_active():
				
				self.temp_optionlist[23] = 1
				
			else:
				
				self.temp_optionlist[23] = 0
				
		elif data == 15:
			
			if self.button_hide_cursor.get_active():
				
				self.temp_optionlist[24] = 1
				
			else:
				
				self.temp_optionlist[24] = 0
				
		elif data == 16:
			
			if self.button_comment.get_active():
				
				self.temp_optionlist[28] = 1
				
			else:
				
				self.temp_optionlist[28] = 0
				
		elif data == 2:
			
			self.temp_optionlist[2] = gtk.gdk.INTERP_NEAREST
			
		elif data == 3:
			
			self.temp_optionlist[2] = gtk.gdk.INTERP_TILES
			
		elif data == 4:
			
			self.temp_optionlist[2] = gtk.gdk.INTERP_BILINEAR
			
		elif data == 5:
			
			self.temp_optionlist[2] = gtk.gdk.INTERP_HYPER
	
	def open_about(self, data=None):
		
		self.about_dialog.show()
		self.about_dialog.present()
		
	def close_about(self, event, data=None):
		
		self.about_dialog.hide()
		return True
		
	def open_file_info(self, data=None):
		
		if self.file_exist == 1:
			
			self.file_dialog.resize(100, 100)
			
			if self.archive_type != "":
				
				command = '<b>Filename:\nPage:\nArchive type:\nArchive size:\n'
				
			elif self.optionlist[4] == 1 and len(self.file) != self.file_number + 1:
				
				command = '<b>Filename #1:\nFilename #2:\nPage:\n'
				
			else:
				
				command = '<b>Filename:\nPage:\n'
				
			if self.optionlist[4] == 1 and len(self.file) != self.file_number + 1:
				
				command = (command + 'Image #1 type:\nImage #2 type:\nImage #1 size:\nImage ' +
				'#2 size:\nImage #1 dimensions:\nImage #2 dimensions:\nImage #1 scaling:\nImage #2 scaling:\n</b>')
				
			else:
				
				command = command + 'Image type:\nImage size:\nImage dimensions:\nImage scaling:\n</b>'
				
			if self.archive_type != "":
				
				command2 = os.path.basename(self.path) + '\n' + str(self.file_number + 1) + ' of ' + str(len(self.file)) + '\n' + self.archive_type + '\n' + str('%.1f' % (os.stat(self.path)[stat.ST_SIZE] / 1048576.0)) + ' MiB\n'
				
			elif self.optionlist[4] == 1 and len(self.file) != self.file_number + 1:
				
				command2 = os.path.basename(self.file[self.file_number]) + '\n' + os.path.basename(self.file[self.file_number + 1]) + '\n' + str(self.file_number + 1) + ' and ' + str(self.file_number + 2) + ' of ' + str(len(self.file)) + '\n'
				
			else:
				
				command2 = os.path.basename(self.file[self.file_number]) + '\n' + str(self.file_number + 1) + ' of ' + str(len(self.file)) + '\n'
				
			if self.optionlist[4] == 1 and len(self.file) != self.file_number + 1:
				
				command2 = (command2 + gtk.gdk.pixbuf_get_file_info(self.file[self.file_number])[0]['mime_types'][0][6:].upper() + "\n" + gtk.gdk.pixbuf_get_file_info(self.file[self.file_number + 1])[0]['mime_types'][0][6:].upper() + "\n"
				+ str('%.1f' % (os.stat(self.file[self.file_number])[stat.ST_SIZE] / 1024.0)) + " kiB\n" + str('%.1f' % (os.stat(self.file[self.file_number + 1])[stat.ST_SIZE] / 1024.0)) + " kiB\n" +
				str(self.image1_width) + " x " + str(self.image1_height) + " px\n" + str(self.image2_width) + " x " + str(self.image2_height) + " px\n")
				
				if self.image1_scaled_width / self.image1_width < self.image1_scaled_height / self.image1_height:
					
					scale1 = 100 * self.image1_scaled_width / self.image1_width
					
				else:
					
					scale1 = 100 * self.image1_scaled_height / self.image1_height
					
				if self.image2_scaled_width / self.image2_width < self.image2_scaled_height / self.image2_height:
					
					scale2 = 100 * self.image2_scaled_width / self.image2_width
					
				else:
					
					scale2 = 100 * self.image2_scaled_height / self.image2_height
					
				command2 = command2 + str(self.image1_scaled_width) + " x " + str(self.image1_scaled_height) + " px (" + str(scale1) + " %)\n" + str(self.image2_scaled_width) + " x " + str(self.image2_scaled_height) + " px (" + str(scale2) + " %)\n"
				
			else:
				
				command2 = (command2 + gtk.gdk.pixbuf_get_file_info(self.file[self.file_number])[0]['mime_types'][0][6:].upper() + "\n" + str('%.1f' % (os.stat(self.file[self.file_number])[stat.ST_SIZE] / 1024.0)) + " kiB\n"
				+ str(self.image1_width) + " x " + str(self.image1_height) + " px\n")
				
				if self.image1_scaled_width / self.image1_width < self.image1_scaled_height / self.image1_height:
					
					scale = 100 * self.image1_scaled_width / self.image1_width
					
				else:
					
					scale = 100 * self.image1_scaled_height / self.image1_height
					
				command2 = command2 + str(self.image1_scaled_width) + " x " + str(self.image1_scaled_height) + " px (" + str(scale) + " %)\n"
			
			self.file_info_label.set_markup(unicode(command, sys.getfilesystemencoding()))
			self.file_info_label2.set_markup(unicode(command2, sys.getfilesystemencoding()))
			self.file_dialog.show()
			self.file_dialog.present()
		
	def open_invalid_filename(self, data):
		
		self.invalid_filename_info_label.set_markup('"' + data + '" is an invalid filename.\nFile was not created.')
		self.invalid_filename_dialog.show()
		
	def close_file_info(self, event, data=None):
		
		self.file_dialog.hide()
		return True
		
	def close_invalid_filename(self, event, data=None):
		
		self.invalid_filename_dialog.hide()
		return True
		
	def open_permission_dialog(self, path):
		
		if self.optionlist[24] and self.optionlist[0]:
			
			pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
			color = gtk.gdk.Color()
			cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
			for x in gtk.gdk.window_get_toplevels():
				x.set_cursor(None)
			gtk.gdk.window_get_toplevels()[1].set_cursor(cursor)
			
		else:
			
			for x in gtk.gdk.window_get_toplevels():
				x.set_cursor(None)
		
		self.file_removed = 0
		self.permission_label.set_text('Could not delete "' + path + '"\nPlease check your permissions.')
		self.permission_dialog.show()
		
	def close_permission_dialog(self, event, data=None):
		
		self.permission_dialog.hide()
		return True
		
	def open_file(self, event, data=None):
		
		if self.optionlist[15][-1:] != '/':
			
			self.optionlist[15] = self.optionlist[15] + '/'
			
		self.file_select.set_current_folder(self.optionlist[15])
		self.file_select.show()
		self.file_select.present()
		
		response = self.file_select.run()
		
		if int(response) == int(gtk.RESPONSE_OK):
			
			self.file_select_ok(None)
			
		else:
			
			self.file_select_cancel(None)
		
	def file_select_ok(self, event, data=None):
		
		self.file_select.hide()
		self.load_file(self.file_select.get_filename())
		self.refresh_image()
		
	def file_select_cancel(self, event, data=None):
		
		self.file_select.hide()
		return True
		
	def mouse_click_event(self, view, event, data=None):
		
		if event.button == 3:
			
			self.ui.remove_ui(self.merge_id)
			
			ui_description = """<ui>
			<popup name="Pop">
				<menuitem action="Next" />
				<menuitem action="Previous" />
				<menuitem action="First" />
				<menuitem action="Last" />
				<menuitem action="Go" />
				<menu action="menu_view">
					<menuitem action="Fullscreen" />
					<menuitem action="Double" />
					<menuitem action="Fit" />
					<menuitem action="Menubar" />
					<menuitem action="Toolbar" />
					<menuitem action="Statusbar" />
					<menuitem action="Scrollbars" />
				</menu>
				<menu action="Zoom">
					<menuitem action="Zin" />
					<menuitem action="Zout" />
					<menuitem action="Zoriginal" />
					<menuitem action="Zwidth" />
					<menuitem action="Zheight" />
					<menuitem action="Zfit" />
				</menu>
				<menu action="Book">
					<menuitem action="Save_book" />
					<menuitem action="Clear_book" />"""
			
			for i, bookmark in enumerate(self.bookmarks):
				
				dir = 0
				
				if not os.path.isdir(bookmark):
					if gtk.gdk.pixbuf_get_file_info(bookmark) != None:
						if (gtk.gdk.pixbuf_get_file_info(bookmark)[0]['mime_types'][0] in 
						['image/jpeg', 'image/bmp', 'image/gif', 'image/png', 'image/tiff']):
							
							dir = 1
							
							if len(os.path.basename(os.path.dirname(bookmark))) <= 30:
								name = unicode(os.path.basename(os.path.dirname(bookmark)), sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
								
							else:
								name = unicode(os.path.basename(os.path.dirname(bookmark))[:13], sys.getfilesystemencoding()) + ' ... ' + unicode(os.path.basename(os.path.dirname(bookmark))[-12:], sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
							
				if dir == 0:
					if len(os.path.basename(bookmark)) <= 30:
						name = unicode(os.path.basename(bookmark), sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
						
					else:
						name = unicode(os.path.basename(bookmark)[:13], sys.getfilesystemencoding()) + ' ... ' + unicode(os.path.basename(bookmark)[-12:], sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
				
				self.actiongroup.add_actions([('Book' + str(i+1), gtk.STOCK_FILE, name, '', None, self.open_bookmark)])
				ui_description = ui_description + '\n<menuitem action="Book' + str(i+1) + '" />'
			
			ui_description = ui_description + """
				</menu>
				<menuitem action="Options" />
				<menuitem action="About" />
				<menuitem action="File" />
				<menuitem action="Comments" />
				<menuitem action="Open" />
				<menuitem action="Convert" />
				<menuitem action="Close" />
				<menuitem action="Quit" />
			</popup>
			</ui>"""
			self.merge_id = self.ui.add_ui_from_string(ui_description)
			
			if len(self.bookmarks) == 0:
				
				self.actiongroup.get_action('Clear_book').set_sensitive(False)
				
			else:
				
				self.actiongroup.get_action('Clear_book').set_sensitive(True)
			
			pop = self.ui.get_widget('/Pop')
			pop.popup(None, None, None, event.button, event.time)
			
		elif event.button == 1:
			
			self.x_motion = event.x_root
			self.y_motion = event.y_root
			self.mouse_moved = 0
			self.old_vadjust_value = self.vadjust.value
			self.old_hadjust_value = self.hadjust.value
		
	def open_bookmark(self, event):
		
		self.load_file(self.bookmarks[int(event.get_name()[4:]) - 1])
			
		if self.bookmark_numbers[int(event.get_name()[4:]) - 1] <= len(self.file) and self.bookmark_numbers[int(event.get_name()[4:]) - 1] > 0:
			
			self.file_number = self.bookmark_numbers[int(event.get_name()[4:]) - 1] - 1
			
		self.vadjust.set_value(0)
		self.hadjust.set_value(0)
		self.refresh_image()
		
	def save_bookmark(self, event):
		
		if self.file_exist == 1:
			
			self.ui_menu.remove_ui(self.merge_id_menu)
			
			self.bookmarks.insert(0, self.path)
			self.bookmark_numbers.insert(0, self.file_number + 1)
			
			ui_description = """
			<ui>
				<menubar name="Menu">
					<menu action="menu_file">
						<menuitem action="Open" />
						<menuitem action="Convert" />
						<separator />
						<menuitem action="File" />
						<menuitem action="Comments" />
						<menuitem action="Options" />
						<separator />
						<menuitem action="Close" />
						<menuitem action="Quit" />
					</menu>
					<menu action="menu_view">
						<menuitem action="Fullscreen" />
						<menuitem action="Double" />
						<menuitem action="Fit" />
						<separator />
						<menuitem action="Zin" />
						<menuitem action="Zout" />
						<menuitem action="Zoriginal" />
						<menuitem action="Zwidth" />
						<menuitem action="Zheight" />
						<menuitem action="Zfit" />
						<separator />
						<menuitem action="Menubar" />
						<menuitem action="Toolbar" />
						<menuitem action="Statusbar" />
						<menuitem action="Scrollbars" />
					</menu>
					<menu action="menu_go">
						<menuitem action="Next" />
						<menuitem action="Previous" />
						<menuitem action="First" />
						<menuitem action="Last" />
						<separator />
						<menuitem action="Go" />
					</menu>
					<menu action="Book">
						<menuitem action="Save_book" />
						<menuitem action="Clear_book" />"""
						
			for i,bookmark in enumerate(self.bookmarks):
				
				dir = 0
				
				if not os.path.isdir(bookmark):
					if gtk.gdk.pixbuf_get_file_info(bookmark) != None:
						if (gtk.gdk.pixbuf_get_file_info(bookmark)[0]['mime_types'][0] in 
						['image/jpeg', 'image/bmp', 'image/gif', 'image/png', 'image/tiff']):
							
							dir = 1
							
							if len(os.path.basename(os.path.dirname(bookmark))) <= 30:
								name = unicode(os.path.basename(os.path.dirname(bookmark)), sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
								
							else:
								name = unicode(os.path.basename(os.path.dirname(bookmark))[:13], sys.getfilesystemencoding()) + ' ... ' + unicode(os.path.basename(os.path.dirname(bookmark))[-12:], sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
							
				if dir == 0:
					if len(os.path.basename(bookmark)) <= 30:
						name = unicode(os.path.basename(bookmark), sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
						
					else:
						name = unicode(os.path.basename(bookmark)[:13], sys.getfilesystemencoding()) + ' ... ' + unicode(os.path.basename(bookmark)[-12:], sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
				
				self.actiongroup.add_actions([('Book' + str(i+1), gtk.STOCK_FILE, name, '', None, self.open_bookmark)])
				ui_description = ui_description + '\n<menuitem action="Book' + str(i+1) + '" />'
					
			ui_description = ui_description + """</menu>
				<menu action="menu_help">
					<menuitem action="About" />
				</menu>
			</menubar>
			</ui>"""
			
			self.merge_id_menu = self.ui_menu.add_ui_from_string(ui_description)
			
			self.actiongroup.get_action('Clear_book').set_sensitive(True)
		
	def clear_bookmarks(self, event):
		
		for x in range(len(self.bookmarks)):
			
			self.bookmarks.pop()
			
		for x in range(len(self.bookmark_numbers)):
			
			self.bookmark_numbers.pop()
			
			self.ui_menu.remove_ui(self.merge_id_menu)
			
			ui_description = """
			<ui>
				<menubar name="Menu">
					<menu action="menu_file">
						<menuitem action="Open" />
						<menuitem action="Convert" />
						<separator />
						<menuitem action="File" />
						<menuitem action="Comments" />
						<menuitem action="Options" />
						<separator />
						<menuitem action="Close" />
						<menuitem action="Quit" />
					</menu>
					<menu action="menu_view">
						<menuitem action="Fullscreen" />
						<menuitem action="Double" />
						<menuitem action="Fit" />
						<separator />
						<menuitem action="Zin" />
						<menuitem action="Zout" />
						<menuitem action="Zoriginal" />
						<menuitem action="Zwidth" />
						<menuitem action="Zheight" />
						<menuitem action="Zfit" />
						<separator />
						<menuitem action="Menubar" />
						<menuitem action="Toolbar" />
						<menuitem action="Statusbar" />
						<menuitem action="Scrollbars" />
					</menu>
					<menu action="menu_go">
						<menuitem action="Next" />
						<menuitem action="Previous" />
						<menuitem action="First" />
						<menuitem action="Last" />
						<separator />
						<menuitem action="Go" />
					</menu>
					<menu action="Book">
						<menuitem action="Save_book" />
						<menuitem action="Clear_book" />
						<separator />
					</menu>
				<menu action="menu_help">
					<menuitem action="About" />
				</menu>
			</menubar>
			</ui>"""
			
			self.merge_id_menu = self.ui_menu.add_ui_from_string(ui_description)
			
			self.actiongroup.get_action('Clear_book').set_sensitive(False)
			
	def blank_page(self, data=None):
		
		if os.path.exists("/tmp/comix"):
			shutil.rmtree("/tmp/comix/")
		
		for i in range(len(self.file)):
			self.file.pop()
		
		self.file_number = 0
		self.file_exist = 0
		self.refresh_image()
		self.actiongroup.get_action('File').set_sensitive(False)
		self.actiongroup.get_action('Save_book').set_sensitive(False)
		self.actiongroup.get_action('Convert').set_sensitive(False)
		self.actiongroup.get_action('Close').set_sensitive(False)
		self.actiongroup.get_action('Go').set_sensitive(False)
		self.actiongroup.get_action('Next').set_sensitive(False)
		self.actiongroup.get_action('Previous').set_sensitive(False)
		self.actiongroup.get_action('First').set_sensitive(False)
		self.actiongroup.get_action('Last').set_sensitive(False)
		self.button_previous.set_sensitive(False)
		self.button_next.set_sensitive(False)
		self.button_first.set_sensitive(False)
		self.button_last.set_sensitive(False)
		self.button_go.set_sensitive(False)
		
	def archive_mime_type(self, path):
		
		file = open(path, 'rb')
			
		if file.read(3) == 'BZh':
			
			file.close()
			return 'bzip2'
			
		file.seek(0)
			
		if file.read(2) == '\037\213':
			
			file.close()
			return 'gzip'
			
		file.seek(0)	
			
		if file.read(4) == 'Rar!':
			
			file.close()
			return 'rar'
			
		file.close()
		return None
		
		
	def drag_motion(self, wid, context, x, y, time):
		
		context.drag_status(gtk.gdk.ACTION_COPY, time)
		return True
		
	def drag_data(self, widget, drag_context, x, y, selection, info, time):
		
		uri = selection.data.strip()
		path = urllib.url2pathname(uri)
		
		if path.startswith('file://'): # Nautilus etc.
			path = path[7:]
		elif path.startswith('file:'): # Xffm etc.
			path = path[5:]
		
		self.load_file(path)
		self.refresh_image()
		
	def load_file(self, path):
		
		for x in gtk.gdk.window_get_toplevels():
			x.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
			
		self.path = path		
		self.file = []
		self.file_number = 0
		self.old_file_number = -1
		self.cached = 0
		self.comments = []
		self.comment_number = 0
		self.show_comments = 0
		
		if os.path.exists("/tmp/comix"):
			
			shutil.rmtree("/tmp/comix/")
			
		if not os.path.exists(path):
			
			self.file_exist = 0
			self.statusbar.push(0, unicode('"' + os.path.basename(path) + '" does not exist.', sys.getfilesystemencoding()))		
			self.filetype_error = 1
			self.actiongroup.get_action('File').set_sensitive(False)
			self.actiongroup.get_action('Save_book').set_sensitive(False)
			self.actiongroup.get_action('Convert').set_sensitive(False)
			self.actiongroup.get_action('Close').set_sensitive(False)
			self.actiongroup.get_action('Go').set_sensitive(False)
			self.actiongroup.get_action('Next').set_sensitive(False)
			self.actiongroup.get_action('Previous').set_sensitive(False)
			self.actiongroup.get_action('First').set_sensitive(False)
			self.actiongroup.get_action('Last').set_sensitive(False)
			self.button_previous.set_sensitive(False)
			self.button_next.set_sensitive(False)
			self.button_first.set_sensitive(False)
			self.button_last.set_sensitive(False)
			self.button_go.set_sensitive(False)
			
			if self.optionlist[24] and self.optionlist[0]:
				
				pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
				color = gtk.gdk.Color()
				cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
				for x in gtk.gdk.window_get_toplevels():
					x.set_cursor(None)
				gtk.gdk.window_get_toplevels()[1].set_cursor(cursor)
				
			else:
				
				for x in gtk.gdk.window_get_toplevels():
					x.set_cursor(None)
			
			return 0
			
		if os.path.isdir(path):
			
			if path[-1:] != '/':
				path = path + '/'
				
			directory_list = os.listdir(path)
			directory_list.sort(locale.strcoll)
			
			for file in directory_list:
				
				if os.path.isfile(path + file):
					
					self.load_file(path + file)
					break
			
		else:
			
			comment_extensions_temp = self.optionlist[29]
			comment_extensions = []
			
			while comment_extensions_temp.count(' '):
				
				if comment_extensions_temp.index(' ') > 0:
					
					comment_extensions.append('.' + comment_extensions_temp[:comment_extensions_temp.index(' ')])
				
				comment_extensions_temp = comment_extensions_temp[comment_extensions_temp.index(' ') + 1:]
			
			if len(comment_extensions_temp) > 0:
				
				comment_extensions.append('.' + comment_extensions_temp)
			
			if zipfile.is_zipfile(path):
				
				os.mkdir('/tmp/comix')
				zip = zipfile.ZipFile(path)
				zipfiles = zip.namelist()
				
				for x in zipfiles:
					if zip.getinfo(x).file_size > 0:
						if not os.path.exists(os.path.dirname('/tmp/comix/' + x)):
							os.makedirs(os.path.dirname('/tmp/comix/' + x))
						new = open('/tmp/comix/' + x, 'w')
						new.write(zip.read(x))
						new.close()
					
				zip.close()			
				self.archive_type = "Zip archive"
			
			elif tarfile.is_tarfile(path):
				
				os.mkdir('/tmp/comix')
				
				tar = tarfile.open(path, 'r')
				tarfiles = tar.getmembers()
				
				for x in tarfiles:
					tar.extract(x, '/tmp/comix/')
					
				tar.close()
				
				if self.archive_mime_type(path) == 'gzip':
					self.archive_type = "Gzip compressed tar archive"
				elif self.archive_mime_type(path) == 'bzip2':
					self.archive_type = "Bzip2 compressed tar archive"
				else:
					self.archive_type = "Tar archive"
				
			elif self.archive_mime_type(path) == 'rar':
				
				os.mkdir('/tmp/comix')
				os.popen('unrar x "' + path + '" /tmp/comix')
					
				self.archive_type = "RAR archive"
			
			if os.path.exists("/tmp/comix"):
				
				dir = 1
				
				while (dir):
					
					dir = 0
					
					temp = os.listdir("/tmp/comix")
					
					for infile in temp:
						
						infile = "/tmp/comix/" + infile
						
						if os.path.isdir(infile):
							
							for x in os.listdir(infile):
								
								src = infile + "/" + x
								dst = os.path.dirname(infile) + "/" + os.path.basename(infile) + x
								
								while (True):
									
									if os.path.exists(dst):
										
										dst = dst[:-len(x)] + "z" +  x
										
									else:
										
										break
									
								shutil.move(src, dst)
								
							shutil.rmtree(infile)
							temp.remove(infile[11:])
							dir = 1
							self.file = []
							break
							
						elif zipfile.is_zipfile(infile):
							
							i = 1
							
							while(1):
								
								temp_dir = infile + 'z' * i + '/'
								
								if os.path.exists(temp_dir):
									
									i = i + 1
									
								else:
									
									break
									
							os.mkdir(temp_dir)
							zip = zipfile.ZipFile(infile)
							zipfiles = zip.namelist()
							
							for x in zipfiles:
								if zip.getinfo(x).file_size > 0:
									if not os.path.exists(os.path.dirname(temp_dir + x)):
										os.makedirs(os.path.dirname(temp_dir + x))
									new = open(temp_dir + x, 'w')
									new.write(zip.read(x))
									new.close()
								
							zip.close()
							os.remove(infile)
							dir = 1
							
						elif tarfile.is_tarfile(infile):
							
							i = 1
							
							while(1):
								
								temp_dir = infile + 'z' * i + '/'
								
								if os.path.exists(temp_dir):
									
									i = i + 1
									
								else:
									
									break
							
							os.mkdir(temp_dir)
							tar = tarfile.open(infile, 'r')
							tarfiles = tar.getmembers()
							
							for x in tarfiles:
								tar.extract(x, temp_dir)
								
							tar.close()
							os.remove(infile)
							dir = 1
							
						elif self.archive_mime_type(infile) == 'rar':
							
							i = 1
							
							while(1):
								
								temp_dir = infile + 'z' * i + '/'
								
								if os.path.exists(temp_dir):
									
									i = i + 1
									
								else:
									
									break
							
							os.mkdir(temp_dir)
							os.popen('unrar x "' + infile + '" "' + temp_dir + '"')				
							os.remove(infile)
							dir = 1
							
						else:
							
							if gtk.gdk.pixbuf_get_file_info(infile) != None:
								
								if (gtk.gdk.pixbuf_get_file_info(infile)[0]['mime_types'][0] in
								['image/jpeg', 'image/bmp', 'image/gif', 'image/png', 'image/tiff']):
									
									self.file.append(infile)
									
							elif os.path.splitext(infile)[1].lower() in comment_extensions:
								
								self.comments.append(infile)
				
				self.file.sort(locale.strcoll)
				
			else:
				
				# Normal image files
				self.archive_type = ""
				temp = os.listdir(os.path.dirname(path))
				
				for infile in temp:
					
					infile = os.path.dirname(path) + '/' + infile
					
					if not os.path.isdir(infile):
						
						if gtk.gdk.pixbuf_get_file_info(infile) != None:
							
							if (gtk.gdk.pixbuf_get_file_info(infile)[0]['mime_types'][0] in
							['image/jpeg', 'image/bmp', 'image/gif', 'image/png', 'image/tiff']):
								
								self.file.append(infile)
						
						elif os.path.splitext(infile)[1].lower() in comment_extensions:
								
								self.comments.append(infile)
				
				if self.file.count(path) == 0:
					
					for i in range(len(self.file)):
						
						self.file.pop()
						
					self.statusbar.push(0, unicode('Filetype of "' + os.path.basename(path) + '" not recognized.', sys.getfilesystemencoding()))		
					self.filetype_error = 1
					
				else:
					
					self.file.sort(locale.strcoll)
					self.file_number = self.file.index(path)
					
		if len(self.file) == 0:
			
			if self.archive_type != '':
				
				self.statusbar.push(0, unicode('No viewable files in "' + os.path.basename(path) + '".', sys.getfilesystemencoding()))		
				self.filetype_error = 1
			
			self.file_exist = 0
			self.actiongroup.get_action('File').set_sensitive(False)
			self.actiongroup.get_action('Save_book').set_sensitive(False)
			self.actiongroup.get_action('Convert').set_sensitive(False)
			self.actiongroup.get_action('Close').set_sensitive(False)
			self.actiongroup.get_action('Go').set_sensitive(False)
			self.actiongroup.get_action('Next').set_sensitive(False)
			self.actiongroup.get_action('Previous').set_sensitive(False)
			self.actiongroup.get_action('First').set_sensitive(False)
			self.actiongroup.get_action('Last').set_sensitive(False)
			self.button_previous.set_sensitive(False)
			self.button_next.set_sensitive(False)
			self.button_first.set_sensitive(False)
			self.button_last.set_sensitive(False)
			self.button_go.set_sensitive(False)
			
		else:
			
			self.file_exist = 1
			self.filetype_error = 0
			self.actiongroup.get_action('File').set_sensitive(True)
			self.actiongroup.get_action('Save_book').set_sensitive(True)
			self.actiongroup.get_action('Convert').set_sensitive(True)
			self.actiongroup.get_action('Close').set_sensitive(True)
			self.actiongroup.get_action('Go').set_sensitive(True)
			self.actiongroup.get_action('Next').set_sensitive(True)
			self.actiongroup.get_action('Previous').set_sensitive(True)
			self.actiongroup.get_action('First').set_sensitive(True)
			self.actiongroup.get_action('Last').set_sensitive(True)
			self.button_previous.set_sensitive(True)
			self.button_next.set_sensitive(True)
			self.button_first.set_sensitive(True)
			self.button_last.set_sensitive(True)
			self.button_go.set_sensitive(True)
			
		if len(self.comments) > 0:
			
			self.actiongroup.get_action('Comments').set_sensitive(True)
			
		else:
			
			self.actiongroup.get_action('Comments').set_sensitive(False)
			
		self.vadjust.set_value(0)
		self.hadjust.set_value(0)
		
		if self.optionlist[24] and self.optionlist[0]:
			
			pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
			color = gtk.gdk.Color()
			cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
			for x in gtk.gdk.window_get_toplevels():
				x.set_cursor(None)
			gtk.gdk.window_get_toplevels()[1].set_cursor(cursor)
			
			
		else:
			
			for x in gtk.gdk.window_get_toplevels():
				x.set_cursor(None)
			
		if self.optionlist[28] and len(self.comments) > 0:
			
			self.show_comments = 1
	
	def refresh_image(self):
		
		if self.optionlist[22] or self.optionlist[18]:
			
			self.hscroll.hide()
			self.vscroll.hide()
			
		else:
			
			self.hscroll.show()
			self.vscroll.show()
		
		if self.optionlist[3] and self.optionlist[0]:
			
			self.actiongroup.get_action('Menubar').set_sensitive(False)
			self.actiongroup.get_action('Toolbar').set_sensitive(False)
			self.actiongroup.get_action('Statusbar').set_sensitive(False)
			
			self.ui_menu.get_widget('/Menu').hide()
			self.toolbar.hide()
			self.statusbar.hide()
			
		else:
			
			self.actiongroup.get_action('Menubar').set_sensitive(True)
			self.actiongroup.get_action('Toolbar').set_sensitive(True)
			self.actiongroup.get_action('Statusbar').set_sensitive(True)
			
			if self.optionlist[25] == 0:
				
				self.ui_menu.get_widget('/Menu').hide()
				
			else:
				
				self.ui_menu.get_widget('/Menu').show()
				
			if self.optionlist[26] == 0:
				
				self.toolbar.hide()
				
			else:
				
				self.toolbar.show()
				
			if self.optionlist[27] == 0:
				
				self.statusbar.hide()
				
			else:
				
				self.statusbar.show()
		
		if self.optionlist[0]:
			
			x = gtk.gdk.screen_get_default().get_monitor_geometry(gtk.gdk.screen_get_default().get_monitor_at_window(gtk.gdk.window_get_toplevels()[0])).width
			y = gtk.gdk.screen_get_default().get_monitor_geometry(gtk.gdk.screen_get_default().get_monitor_at_window(gtk.gdk.window_get_toplevels()[0])).height
		
		else:
			
			x = self.optionlist[10]
			y = self.optionlist[11]
			self.window.resize(x, y)
			
		if self.optionlist[0]:
			menu_size = abs(self.optionlist[3] - 1) * self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
			tool_size = abs(self.optionlist[3] - 1) * self.optionlist[26] * self.toolbar.size_request()[1]
			status_size = abs(self.optionlist[3] - 1) * self.optionlist[27] * self.statusbar.size_request()[1]
			
		else:
			menu_size = self.optionlist[25] * self.ui_menu.get_widget('/Menu').size_request()[1]
			tool_size = self.optionlist[26] * self.toolbar.size_request()[1]
			status_size = self.optionlist[27] * self.statusbar.size_request()[1]
		
		self.window.show()
		
		if self.show_comments:
			
			self.image.hide()
			self.image2.hide()
			self.hscroll.show()
			self.vscroll.show()
			
			if self.optionlist[19] + self.optionlist[20] + self.optionlist[21] < 80000:
				self.comment_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#FFFFFF'))
			else:
				self.comment_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#000000'))
			
			try:
				
				comment_file = open(self.comments[self.comment_number], 'r')
				comment = unicode('--- Comment file ' + str(self.comment_number + 1) + ' of ' + str(len(self.comments)) + 
				' - ' + os.path.basename(self.comments[self.comment_number]) + ' ---\n\n' + comment_file.read(), sys.getfilesystemencoding())
				comment_file.close()
				self.comment_label.set_text(comment)
				
			except:
				
				comment = unicode('Could not read "' + os.path.basename(self.comments[self.comment_number]) + '"', sys.getfilesystemencoding())
				self.comment_label.set_text(comment)
				
			self.comment_label.show()
			self.comment_label.set_padding(10, 10)
			self.layout.set_size(self.comment_label.get_layout().get_pixel_size()[0] + 20, self.comment_label.get_layout().get_pixel_size()[1] + 20)
			
			self.vadjust_upper = (self.vadjust.upper - self.window.get_size()[1] + self.hscroll.size_request()[1] 
			* (1 - self.optionlist[22]) + status_size + tool_size + menu_size)
			self.hadjust_upper = self.hadjust.upper - self.window.get_size()[0] + self.vscroll.size_request()[0]  * (1 - self.optionlist[22]) 
			
			if self.archive_type != "":
				
				title = os.path.basename(self.path) + ' --- Comment ' + str(self.comment_number + 1) + ' of ' + str(len(self.comments)) + ''
				
			else:
				
				title = os.path.basename(os.path.dirname(self.path)) + ' --- Comment ' + str(self.comment_number + 1) + ' of ' + str(len(self.comments)) + ''
				
			self.window.set_title(unicode(title, sys.getfilesystemencoding()))
			
			if self.archive_type == '':
				
				status = 'Comment ' + str(self.comment_number + 1) + ' of ' + str(len(self.comments)) + '    ---    ' + os.path.basename(os.path.dirname(self.path))
				
			else:
				
				status = 'Comment ' + str(self.comment_number + 1) + ' of ' + str(len(self.comments)) + '    ---    ' + os.path.basename(self.path) 
			
			self.statusbar.push(0, unicode(status, sys.getfilesystemencoding()))
			
		else:
			
			self.comment_label.hide()
			
			if self.file_exist == 1:
				
				if self.optionlist[4] == 0 or len(self.file) == self.file_number + 1:
					
					self.stored_double = 0
					
					try:
						del self.stored_pixbuf2
						del self.cached_pixbuf2
						gc.collect()
					except:
						pass
					
					if self.file_number == self.old_file_number:
						
						pixbuf = self.stored_pixbuf
						set_new_old_file_number = 0
						
					elif self.file_number == self.old_file_number + 1 and self.cached == 1 and self.optionlist[7]:
						
						pixbuf = self.cached_pixbuf
						self.stored_pixbuf = pixbuf
						set_new_old_file_number = 1
						
					else:
						
						if self.old_file_number != -1:
							
							del self.stored_pixbuf
							gc.collect()
						
						try:
							pixbuf = gtk.gdk.pixbuf_new_from_file(self.file[self.file_number])
							self.stored_pixbuf = pixbuf
							set_new_old_file_number = 1
						except:
							if os.path.exists("/tmp/comix"):
								shutil.rmtree("/tmp/comix/")
							print ''
							print 'ERROR:'
							print 'Could not load image "' + os.path.basename(self.file[self.file_number]) + '" in ' + os.path.dirname(self.file[self.file_number]) + '.'
							print ''
							print 'Either "' + os.path.basename(self.file[self.file_number]) + '" is not readable, corrupt'
							print 'or "' + os.path.basename(self.file[self.file_number]) + '" is incorrectly identified as an image file.'
							print 'The application has been terminated, please check the image file and/or'
							print 'read and write permissions in ' + os.path.dirname(self.file[self.file_number]) + '.'
							print ''
							sys.exit(1)
					
					self.image1_width = pixbuf.get_width()
					self.image1_height = pixbuf.get_height()
					
					if ((pixbuf.get_width() > x or pixbuf.get_height() > y - menu_size - tool_size - status_size
					or self.optionlist[9] == 1) and self.optionlist[18] == 1 or (self.optionlist[17] != 100 and self.optionlist[18] == 0)):
						
						if self.optionlist[18] == 1:
							
							if ((1.0 * pixbuf.get_width() / x) > (1.0 * pixbuf.get_height() / (y - menu_size - tool_size))):
								
								pixbuf = pixbuf.scale_simple(x, pixbuf.get_height() * x / pixbuf.get_width(), self.optionlist[2])
								
							else:
								
								pixbuf = (pixbuf.scale_simple(pixbuf.get_width() * (y - menu_size - tool_size - status_size) 
								/ pixbuf.get_height(), y - menu_size - tool_size - status_size, self.optionlist[2]))
							
						else:
							
							pixbuf = pixbuf.scale_simple(int(pixbuf.get_width() * self.optionlist[17] / 100), int(pixbuf.get_height() * self.optionlist[17] / 100), self.optionlist[2])
							
					self.image1_scaled_width = pixbuf.get_width()
					self.image1_scaled_height = pixbuf.get_height()
					pixbuf.saturate_and_pixelate(pixbuf, self.optionlist[6] / 10, False)
					
					if self.optionlist[18] == 1:
						
						x_move = (x - pixbuf.get_width()) / 2
						y_move = (y - pixbuf.get_height() - menu_size - tool_size - status_size) / 2
						
					else:
						
						x_move = (x - pixbuf.get_width() - self.vscroll.size_request()[0] + self.vscroll.size_request()[0] * self.optionlist[22]) / 2
						y_move = ((y - pixbuf.get_height() - self.hscroll.size_request()[1] + self.hscroll.size_request()[1] * self.optionlist[22]
						- menu_size - tool_size - status_size) / 2)
						
					if x_move < 0:
						
						x_move = 0
						
					if y_move < 0:
						
						y_move = 0
						
					self.layout.set_size(pixbuf.get_width(), pixbuf.get_height())
					self.layout.move(self.image_box, x_move, y_move)
					
					self.image.set_from_pixbuf(pixbuf)
					del pixbuf
					gc.collect()
					self.image2.hide()
					self.image.show()
					
					if self.archive_type != "":
						
						title = os.path.basename(self.path) + ' --- [' + str(self.file_number + 1) + ' / ' + str(len(self.file)) + ']'
						
					else:
						
						title = os.path.basename(os.path.dirname(self.path)) + ' --- [' + str(self.file_number + 1) + ' / ' + str(len(self.file)) + ']'
						
					self.window.set_title(unicode(title, sys.getfilesystemencoding()))
					
					if self.archive_type == '':
						
						status = ('[' + str(self.file_number + 1) + ' / ' + str(len(self.file)) + ']    ---    ' + os.path.basename(os.path.dirname(self.path))
						+ '    ---    ' + str(self.image1_width) + 'x' + str(self.image1_height) + '    ---    ' 
						+ str('%.1f' % (100.0 * self.image1_scaled_height / self.image1_height)) + '%')
						
					else:
						
						status = ('[' + str(self.file_number + 1) + ' / ' + str(len(self.file)) + ']    ---    ' + os.path.basename(self.path) 
						+ '    ---    ' + str(self.image1_width) + 'x' + str(self.image1_height) + '    ---    ' 
						+ str('%.1f' % (100.0 * self.image1_scaled_height / self.image1_height)) + '%')
					
					self.statusbar.push(0, unicode(status, sys.getfilesystemencoding()))	
					
				else:
					
					if self.file_number == self.old_file_number and self.stored_double == 1:
						
						pixbuf = self.stored_pixbuf
						pixbuf2 = self.stored_pixbuf2
						set_new_old_file_number = 0
						
					elif self.file_number == self.old_file_number + 2 and self.cached == 2 and self.optionlist[7]:
						
						pixbuf = self.cached_pixbuf
						pixbuf2 = self.cached_pixbuf2
						self.stored_pixbuf = pixbuf
						self.stored_pixbuf2 = pixbuf2
						set_new_old_file_number = 1
					
					else:
						
						if self.old_file_number != -1:
							
							del self.stored_pixbuf
							
							try:
								del self.stored_pixbuf2
							except:
								pass
								
							gc.collect()
						
						try:
							pixbuf = gtk.gdk.pixbuf_new_from_file(self.file[self.file_number])
							pixbuf2 = gtk.gdk.pixbuf_new_from_file(self.file[self.file_number + 1])
							self.stored_pixbuf = pixbuf
							self.stored_pixbuf2 = pixbuf2
							set_new_old_file_number = 1
							self.stored_double = 1
						except:
							if os.path.exists("/tmp/comix"):
								shutil.rmtree("/tmp/comix/")
							print ''
							print 'ERROR:'
							print 'Could not load image "' + os.path.basename(self.file[self.file_number]) + '" or "' +  os.path.basename(self.file[self.file_number + 1]) + '" in ' + os.path.dirname(self.file[self.file_number]) + '.'
							print ''
							print 'Either "' + os.path.basename(self.file[self.file_number]) + '" or "' +  os.path.basename(self.file[self.file_number + 1]) + '" is not readable, corrupt'
							print 'or "' + os.path.basename(self.file[self.file_number]) + '" or "' +  os.path.basename(self.file[self.file_number + 1]) + '" is incorrectly identified as an image file.'
							print 'The application has been terminated, please check the image files and/or'
							print 'read and write permissions in ' + os.path.dirname(self.file[self.file_number]) + '.'
							print ''
							sys.exit(1)
						
					self.image1_width = pixbuf.get_width()
					self.image1_height = pixbuf.get_height()
					self.image2_width = pixbuf2.get_width()
					self.image2_height = pixbuf2.get_height()
					
					if pixbuf.get_height() > pixbuf2.get_height():
						
						height = pixbuf.get_height()
						
					else:
						
						height = pixbuf2.get_height()
						
					width = pixbuf.get_width() + pixbuf2.get_width()
					
					if ((width > x or height > y - menu_size - tool_size - status_size 
					or self.optionlist[9] == 1) and self.optionlist[18] == 1 or (self.optionlist[17] != 100 and self.optionlist[18] == 0)):
						
						if self.optionlist[18] == 1:
							
							if (1.0 * width / x) > (1.0 * height / (y - menu_size - tool_size - status_size)):
								
								pixbuf = pixbuf.scale_simple(x * pixbuf.get_width() / width, x * pixbuf.get_height() / width, self.optionlist[2])
								pixbuf2 = pixbuf2.scale_simple(x * pixbuf2.get_width() / width, x * pixbuf2.get_height() / width, self.optionlist[2])
								
							else:
								
								pixbuf = (pixbuf.scale_simple((y - menu_size - tool_size - status_size) * pixbuf.get_width() / 
								height, (y - menu_size - tool_size - status_size) * pixbuf.get_height() / height, self.optionlist[2]))
								
								pixbuf2 = (pixbuf2.scale_simple((y - menu_size - tool_size - status_size) * pixbuf2.get_width() / 
								height, (y - menu_size - tool_size - status_size) * pixbuf2.get_height() / height, self.optionlist[2]))
								
						else:
							
							pixbuf = pixbuf.scale_simple(int(pixbuf.get_width() * self.optionlist[17] / 100), int(pixbuf.get_height() * self.optionlist[17] / 100), self.optionlist[2])
							pixbuf2 = pixbuf2.scale_simple(int(pixbuf2.get_width() * self.optionlist[17] / 100), int(pixbuf2.get_height() * self.optionlist[17] / 100), self.optionlist[2])
					
					if self.optionlist[8] == 1:
						
						self.image_box.reorder_child(self.image, -1)
						
					else:
						
						self.image_box.reorder_child(self.image, 0)
						
					pixbuf.saturate_and_pixelate(pixbuf, self.optionlist[6] / 10, False)
					pixbuf2.saturate_and_pixelate(pixbuf2, self.optionlist[6] / 10, False)				
					self.image1_scaled_width = pixbuf.get_width()
					self.image1_scaled_height = pixbuf.get_height()
					self.image2_scaled_width = pixbuf2.get_width()
					self.image2_scaled_height = pixbuf2.get_height()
					
					if pixbuf.get_height() > pixbuf2.get_height():
						
						height = pixbuf.get_height()
						
					else:
						
						height = pixbuf2.get_height()
						
					if self.optionlist[18] == 1:
						
						x_move = (x - (pixbuf.get_width() + pixbuf2.get_width())) / 2
						y_move = (y - height - menu_size - tool_size - status_size) / 2
						
					else:
						
						x_move = (x - (pixbuf.get_width() + pixbuf2.get_width()) - self.vscroll.size_request()[0] + self.vscroll.size_request()[0] * self.optionlist[22]) / 2
						y_move = ((y - height - self.hscroll.size_request()[1] + self.hscroll.size_request()[1] * self.optionlist[22]
						- menu_size - tool_size - status_size) / 2)
						
					if x_move < 0:
						
						x_move = 0
						
					if y_move < 0:
						
						y_move = 0
						
					self.layout.move(self.image_box, x_move, y_move)
					self.layout.set_size(pixbuf.get_width() + pixbuf2.get_width(), height)
					
					self.image.set_from_pixbuf(pixbuf)
					self.image2.set_from_pixbuf(pixbuf2)
					del pixbuf
					del pixbuf2
					gc.collect()
					self.image.show()
					self.image2.show()
					
					if self.archive_type != "":
						
						command = os.path.basename(self.path) + ' --- [' + str(self.file_number + 1) + ',' + str(self.file_number + 2) + ' / ' + str(len(self.file)) + ']'
						
					else:
						
						command = os.path.basename(os.path.dirname(self.path)) + ' --- [' + str(self.file_number + 1) + ',' + str(self.file_number + 2) + ' / ' + str(len(self.file)) + ']'
						
					self.window.set_title(unicode(command, sys.getfilesystemencoding()))
					
					if self.image1_height > self.image2_height:
						height = self.image1_height
					else:
						height = self.image2_height
						
					if self.archive_type == '':
						
						status = ('[' + str(self.file_number + 1) + ',' + str(self.file_number + 2) + ' / ' + str(len(self.file)) + ']    ---    ' 
						+ os.path.basename(os.path.dirname(self.path) ) + '    ---    ' + str(self.image1_width + self.image2_width) + 'x' + str(height) 
						+ '    ---    ' + str('%.1f' % (100.0 * self.image1_scaled_height / self.image1_height)) + '%')
						
					else:
						
						status = ('[' + str(self.file_number + 1) + ',' + str(self.file_number + 2) + ' / ' + str(len(self.file)) + ']    ---    ' + os.path.basename(self.path) 
						+ '    ---    ' + str(self.image1_width + self.image2_width) + 'x' + str(height) + '    ---    ' 
						+ str('%.1f' % (100.0 * self.image1_scaled_height / self.image1_height)) + '%')
					
					self.statusbar.push(0, unicode(status, sys.getfilesystemencoding()))		
					
				self.vadjust_upper = (self.vadjust.upper - self.window.get_size()[1] + self.hscroll.size_request()[1] * (1 - self.optionlist[22]) + 
				status_size + tool_size + menu_size)
				
				self.hadjust_upper = self.hadjust.upper - self.window.get_size()[0] + self.vscroll.size_request()[0]  * (1 - self.optionlist[22]) 
				
			else:
				
				self.window.set_title("Comix")
				self.image.hide()
				
				if self.filetype_error != 1:
					
					self.statusbar.push(0, '')
				
			if self.optionlist[24] and self.optionlist[0]:
				
				pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
				color = gtk.gdk.Color()
				cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
				gtk.gdk.window_get_toplevels()[1].set_cursor(cursor)
					
			else:
				
				gtk.gdk.window_get_toplevels()[1].set_cursor(None)
				
			if self.file_exist:
				
				if self.file_number + 3 < len(self.file) and self.optionlist[4] and self.file_number != self.old_file_number:
					
					try:
						self.cached_pixbuf = gtk.gdk.pixbuf_new_from_file(self.file[self.file_number + 2])
						self.cached_pixbuf2 = gtk.gdk.pixbuf_new_from_file(self.file[self.file_number + 3])
						self.cached = 2
					except:
						if os.path.exists("/tmp/comix"):
							shutil.rmtree("/tmp/comix/")
						print ''
						print 'ERROR:'
						print 'Could not load image "' + os.path.basename(self.file[self.file_number]) + '" or "' +  os.path.basename(self.file[self.file_number + 1]) + '" in ' + os.path.dirname(self.file[self.file_number]) + '.'
						print ''
						print 'Either "' + os.path.basename(self.file[self.file_number]) + '" or "' +  os.path.basename(self.file[self.file_number + 1]) + '" is not readable, corrupt'
						print 'or "' + os.path.basename(self.file[self.file_number]) + '" or "' +  os.path.basename(self.file[self.file_number + 1]) + '" is incorrectly identified as an image file.'
						print 'The application has been terminated, please check the image files and/or'
						print 'read and write permissions in ' + os.path.dirname(self.file[self.file_number]) + '.'
						print ''
						sys.exit(1)
					
				elif self.file_number + 1 < len(self.file) and not self.optionlist[4] and self.file_number != self.old_file_number:
					
					try:
						self.cached_pixbuf = gtk.gdk.pixbuf_new_from_file(self.file[self.file_number + 1])
						self.cached = 1
					except:
						if os.path.exists("/tmp/comix"):
							shutil.rmtree("/tmp/comix/")
						print ''
						print 'ERROR:'
						print 'Could not load image "' + os.path.basename(self.file[self.file_number]) + '" in ' + os.path.dirname(self.file[self.file_number]) + '.'
						print ''
						print 'Either "' + os.path.basename(self.file[self.file_number]) + '" is not readable, corrupt'
						print 'or "' + os.path.basename(self.file[self.file_number]) + '" is incorrectly identified as an image file.'
						print 'The application has been terminated, please check the image file and/or'
						print 'read and write permissions in ' + os.path.dirname(self.file[self.file_number]) + '.'
						print ''
						sys.exit(1)
						
				if set_new_old_file_number:
					
					self.old_file_number = self.file_number
		
	def __init__(self):
		
		# Set window icon
		if os.path.exists(os.getenv('XDG_DATA_DIRS', '') + '/pixmaps/comix.png'):
			icon_path = os.getenv('XDG_DATA_DIRS','') + '/pixmaps/comix.png'
		elif os.path.exists(os.getenv('XDG_DATA_DIRS','') + 'pixmaps/comix.png'):
			icon_path = os.getenv('XDG_DATA_DIRS','') + 'pixmaps/comix.png'				
		elif os.path.exists('/usr/local/share/pixmaps/comix.png'):
			icon_path = '/usr/local/share/pixmaps/comix.png'
		elif os.path.exists('/usr/share/pixmaps/comix.png'):
			icon_path = '/usr/share/pixmaps/comix.png'
		
		try:
			icon = gtk.gdk.pixbuf_new_from_file(icon_path)
			gtk.window_set_default_icon(icon)
		except:
			pass
		
		# Parse comixrc file and set corresponding preferences
		if os.path.exists(os.getenv('HOME', '') + "/.comix/comixrc"):
			
			comixrc = open(os.getenv('HOME', '') + "/.comix/comixrc", 'r')
			temp = comixrc.readlines()
			comixrc.close()
			
			if len(temp) > 26:
				
				if temp[0] == "fullscreen=TRUE\n":
					self.optionlist[1] = 1
					
				if temp[1] == "double_page=TRUE\n":
					self.optionlist[5] = 1
					
				if temp[2] == "quality=NEAREST\n":
					self.optionlist[2] = gtk.gdk.INTERP_NEAREST
				elif temp[2] == "quality=BILINEAR\n":
					self.optionlist[2] = gtk.gdk.INTERP_BILINEAR
				elif temp[2] == "quality=HYPER\n":
					self.optionlist[2] = gtk.gdk.INTERP_HYPER
					
				if temp[4] == "cache_next=TRUE\n":
					self.optionlist[7] = 1
					
				if temp[5] == "flip_double=TRUE\n":
					self.optionlist[8] = 1
					
				if temp[6][:-1].isdigit():
					
					if float(temp[6]) >=0 and float(temp[6]) <= 30:
						
						self.optionlist[6] = float(temp[6])
						
				if temp[7] == "stretch=TRUE\n":
					self.optionlist[9] = 1
					
				if temp[12] == "save_position_and_size=TRUE\n":
					
					self.optionlist[14] = 1
					
					if temp[8][:-1].isdigit():
						
						if (int(temp[8][:-1]) >= 100 and int(temp[8][:-1]) <= gtk.gdk.screen_get_default().get_monitor_geometry(
						gtk.gdk.screen_get_default().get_monitor_at_window(gtk.gdk.window_get_toplevels()[0])).width):
							
							self.optionlist[10] = int(temp[8][:-1])
							
					if temp[9][:-1].isdigit():
						
						if (int(temp[9][:-1]) >= 100 and int(temp[9][:-1]) <= gtk.gdk.screen_get_default().get_monitor_geometry(
							gtk.gdk.screen_get_default().get_monitor_at_window(gtk.gdk.window_get_toplevels()[0])).height):
							
							self.optionlist[11] = int(temp[9][:-1])
							
					if temp[10][:-1].isdigit():
						
						if (int(temp[10][:-1]) >= 0 and int(temp[10][:-1]) <= gtk.gdk.screen_get_default().get_monitor_geometry(
							gtk.gdk.screen_get_default().get_monitor_at_window(gtk.gdk.window_get_toplevels()[0])).width):
							
							self.optionlist[12] = int(temp[10][:-1])
								
					if temp[11][:-1].isdigit():
						
						if (int(temp[11][:-1]) >= 0 and int(temp[11][:-1]) <= gtk.gdk.screen_get_default().get_monitor_geometry(
							gtk.gdk.screen_get_default().get_monitor_at_window(gtk.gdk.window_get_toplevels()[0])).height):
							
							self.optionlist[13] = int(temp[11][:-1])
									
					self.window.move(self.optionlist[12], self.optionlist[13])
					
				if os.path.exists(temp[13][:-1]):
					
					self.optionlist[15] = temp[13][:-1]
					
				if temp[14] == "fit_to_screen=FALSE\n":
					
					self.optionlist[16] = 0
					self.optionlist[18] = 0
					
				# temp[15] NOT USED
				if temp[3] == "hide_bars=FALSE\n":
					self.optionlist[3] = 0
					
				if temp[16][:-1].isdigit():
					
					if int(temp[16][:-1]) >= 0 and int(temp[16][:-1]) <= 65535:
						
						self.optionlist[19] = int(temp[16][:-1])
							
				if temp[17][:-1].isdigit():
					
					if int(temp[17][:-1]) >= 0 and int(temp[17][:-1]) <= 65535:
						
						self.optionlist[20] = int(temp[17][:-1])
							
				if temp[18][:-1].isdigit():
					
					if int(temp[18][:-1]) >= 0 and int(temp[18][:-1]) <= 65535:
						
						self.optionlist[21] = int(temp[18][:-1])
							
				if temp[19] == "hide_scrollbars=TRUE\n":
					self.optionlist[22] = 1
					
				if temp[20] == "next_archive=TRUE\n":
					self.optionlist[23] = 1
					
				if temp[21] == "hide_cursor=TRUE\n":
					self.optionlist[24] = 1
					
				if temp[22] == "show_menubar=FALSE\n":
					self.optionlist[25] = 0
					
				if temp[23] == "show_toolbar=FALSE\n":
					self.optionlist[26] = 0
					
				if temp[24] == "show_statusbar=FALSE\n":
					self.optionlist[27] = 0
					
				if temp[25] == "view_comments=TRUE\n":
					self.optionlist[28] = 1
					
				if len(temp[26]) > 1:
					self.optionlist[29] = temp[26][:-1]
		
		# Parse bookmarks file
		if os.path.exists(os.environ['HOME'] + "/.comix/bookmarks"):
			
			bookmarks = open(os.environ['HOME'] + "/.comix/bookmarks", 'r')
			temp = bookmarks.readlines()
			bookmarks.close()
			
			for i in range(len(temp)):
				
				if i % 2 == 0:
					
					self.bookmarks.append(temp[i][:-1])
					
				else:
					
					if temp[i][:-1].isdigit():
						
						self.bookmark_numbers.append(int(temp[i][:-1]))
						
					else:
						
						self.bookmark_numbers.append(1)
		
		self.window.set_size_request(100, 100)
		self.layout.modify_bg(gtk.STATE_NORMAL, gtk.gdk.colormap_get_system().alloc_color(gtk.gdk.Color(self.optionlist[19], self.optionlist[20], self.optionlist[21]), False, True))
		self.create_windows(None)
		
		self.layout.drag_dest_set(gtk.DEST_DEFAULT_HIGHLIGHT |
		gtk.DEST_DEFAULT_DROP, [("text/plain", 0, 80)], gtk.gdk.ACTION_DEFAULT)
		self.layout.set_events(gtk.gdk.BUTTON1_MOTION_MASK|gtk.gdk.BUTTON_RELEASE_MASK)
		self.window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
		
		self.window.connect('delete_event', self.close_application)
		self.window.connect('key_press_event', self.key_press_event)
		self.window.connect('button_press_event', self.mouse_click_event)
		self.window.connect('configure_event',self.area_resize_event)
		self.window.connect('scroll_event', self.scroll_wheel_event)
		self.options_window.connect('delete_event', self.close_options)
		self.file_select.connect('delete_event', self.file_select_cancel)
		self.invalid_filename_dialog.connect('response', self.close_invalid_filename)
		self.invalid_filename_dialog.connect('delete_event', self.close_invalid_filename)
		self.permission_dialog.connect('response', self.close_permission_dialog)
		self.permission_dialog.connect('delete_event', self.close_permission_dialog)
		self.file_dialog.connect('response', self.close_file_info)
		self.file_dialog.connect('delete_event', self.close_file_info)
		self.about_dialog.connect('response', self.close_about)
		self.about_dialog.connect('delete_event', self.close_about)
		self.page_dialog.connect('response', self.save_and_close_go_to_page)
		self.page_dialog.connect('delete_event', self.close_go_to_page)
		self.convert_dialog.connect('response', self.save_and_close_convert)
		self.convert_dialog.connect('delete_event', self.close_convert)
		self.combobox_convert.connect('changed', self.change_convert)
		self.overwrite_dialog.connect('response', self.save_and_close_overwrite)
		self.overwrite_dialog.connect('delete_event', self.close_overwrite)
		self.layout.connect('drag_motion', self.drag_motion)
		self.layout.connect('drag_data_received', self.drag_data)
		self.layout.connect('motion_notify_event', self.drag_image)
		self.layout.connect('button_release_event', self.button_release)
		
		self.actiongroup.add_actions([('Next', gtk.STOCK_GO_FORWARD, 'Next page', 'Page_Down', None, self.next_page),
		('Previous', gtk.STOCK_GO_BACK, 'Previous page', 'Page_Up', None, self.previous_page),
		('First', gtk.STOCK_GOTO_FIRST, 'First page', 'Home', None, self.first_page),
		('Last',gtk.STOCK_GOTO_LAST, 'Last page', 'End', None, self.last_page),
		('Go', gtk.STOCK_JUMP_TO, '_Go to page...', 'g', None, self.open_go_to_page),
		('Zoom', None, 'Zoom'),
		('Zin', gtk.STOCK_ZOOM_IN, 'Zoom in', 'KP_Add', None, self.zoom_in),
		('Zout', gtk.STOCK_ZOOM_OUT, 'Zoom out', 'KP_Subtract', None, self.zoom_out),
		('Zoriginal', gtk.STOCK_ZOOM_100, 'Original size', '<Control>0', None, self.zoom_original),
		('Zwidth', gtk.STOCK_ZOOM_FIT, 'Fit _width', 'w', None, self.zoom_width),
		('Zheight', gtk.STOCK_ZOOM_FIT, 'Fit _height', 'h', None, self.zoom_height),
		('Zfit', gtk.STOCK_ZOOM_FIT, '_Best fit', 'b', None, self.zoom_fit),
		('Book', None, 'Bookmarks'),
		('Save_book', gtk.STOCK_SAVE, 'A_dd bookmark', '<Control>d', None, self.save_bookmark),
		('Clear_book', gtk.STOCK_CLEAR, 'Clear bookmarks', '', None, self.clear_bookmarks),
		('Options', gtk.STOCK_PREFERENCES, 'Preferences', '', None, self.open_options),
		('About', gtk.STOCK_ABOUT, 'About', '', None, self.open_about),
		('File', gtk.STOCK_DIALOG_INFO, 'Properties', '<Alt>Return', None, self.open_file_info),
		('Comments', gtk.STOCK_DIALOG_INFO, 'View _comments', 'c', None, self.comments_switch),
		('Open', gtk.STOCK_OPEN, '_Open...', '<Control>o', None, self.open_file),
		('Convert', gtk.STOCK_CONVERT, 'Convert...', '', None, self.open_convert),
		('Close', gtk.STOCK_CLOSE, '_Close', '<Control>w', None, self.blank_page),
		('Quit', gtk.STOCK_QUIT, '_Quit', '<Control>q', None, self.short_close_application),
		('menu_file', None, 'File'),
		('menu_view', None, 'View'),
		('menu_go', None, 'Go'),
		('menu_help', None, 'Help')])
		self.actiongroup.add_toggle_actions([('Fullscreen', None, '_Fullscreen', 'f', None, self.fullscreen_switch),
		('Double', None, '_Double page view', 'd', None, self.double_page_switch),
		('Toolbar', None, 'Toolbar', '', None, self.toolbar_switch),
		('Menubar', None, 'Menubar', '', None, self.menubar_switch),
		('Statusbar', None, 'Statusbar', '', None, self.statusbar_switch),
		('Scrollbars', None, 'Scrollbars', '', None, self.scrollbars_switch),
		('Fit', gtk.STOCK_ZOOM_FIT, 'Fit to _screen mode', 's', None, self.fit_to_screen_switch)])
		self.ui.insert_action_group(self.actiongroup, 0)
		self.ui_menu.insert_action_group(self.actiongroup, 0)
		
		ui_description = """
		<ui>
			<menubar name="Menu">
				<menu action="menu_file">
					<menuitem action="Open" />
					<menuitem action="Convert" />
					<separator />
					<menuitem action="File" />
					<menuitem action="Comments" />
					<menuitem action="Options" />
					<separator />
					<menuitem action="Close" />
					<menuitem action="Quit" />
				</menu>
				<menu action="menu_view">
					<menuitem action="Fullscreen" />
					<menuitem action="Double" />
					<menuitem action="Fit" />
					<separator />
					<menuitem action="Zin" />
					<menuitem action="Zout" />
					<menuitem action="Zoriginal" />
					<menuitem action="Zwidth" />
					<menuitem action="Zheight" />
					<menuitem action="Zfit" />
					<separator />
					<menuitem action="Menubar" />
					<menuitem action="Toolbar" />
					<menuitem action="Statusbar" />
					<menuitem action="Scrollbars" />
				</menu>
				<menu action="menu_go">
					<menuitem action="Next" />
					<menuitem action="Previous" />
					<menuitem action="First" />
					<menuitem action="Last" />
					<separator />
					<menuitem action="Go" />
				</menu>
				<menu action="Book">
					<menuitem action="Save_book" />
					<menuitem action="Clear_book" />"""
					
		for i,bookmark in enumerate(self.bookmarks):
			
			dir = 0
			
			if not os.path.isdir(bookmark):
				if gtk.gdk.pixbuf_get_file_info(bookmark) != None:
					if (gtk.gdk.pixbuf_get_file_info(bookmark)[0]['mime_types'][0] in 
					['image/jpeg', 'image/bmp', 'image/gif', 'image/png', 'image/tiff']):
						
						dir = 1
						
						if len(os.path.basename(os.path.dirname(bookmark))) <= 30:
							name = unicode(os.path.basename(os.path.dirname(bookmark)), sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
							
						else:
							name = unicode(os.path.basename(os.path.dirname(bookmark))[:13], sys.getfilesystemencoding()) + ' ... ' + unicode(os.path.basename(os.path.dirname(bookmark))[-12:], sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
						
			if dir == 0:
				if len(os.path.basename(bookmark)) <= 30:
					name = unicode(os.path.basename(bookmark), sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
					
				else:
					name = unicode(os.path.basename(bookmark)[:13], sys.getfilesystemencoding()) + ' ... ' + unicode(os.path.basename(bookmark)[-12:], sys.getfilesystemencoding()) + ', page ' + str(self.bookmark_numbers[i])
			
			self.actiongroup.add_actions([('Book' + str(i+1), gtk.STOCK_FILE, name, '', None, self.open_bookmark)])
			ui_description = ui_description + '\n<menuitem action="Book' + str(i+1) + '" />'
				
		ui_description = ui_description + """</menu>
			<menu action="menu_help">
				<menuitem action="About" />
			</menu>
		</menubar>
		</ui>"""
		
		self.merge_id_menu = self.ui_menu.add_ui_from_string(ui_description)
		self.table.attach(self.ui_menu.get_widget('/Menu'), 0, 3, 0, 1, gtk.FILL|gtk.SHRINK, gtk.FILL|gtk.SHRINK, 0, 0)
		self.table.attach(self.toolbar, 0, 3, 1, 2, gtk.FILL|gtk.SHRINK, gtk.FILL|gtk.SHRINK, 0, 0)
		
		self.button_previous.connect_object("clicked", self.previous_page, None)
		self.toolbar.insert(self.button_previous, -1)
		self.button_previous.show()	
		
		self.button_next.connect_object("clicked", self.next_page, None)
		self.toolbar.insert(self.button_next, -1)
		self.button_next.show()	
		
		self.button_first.connect_object("clicked", self.first_page, None)
		self.toolbar.insert(self.button_first, -1)
		self.button_first.show()	
		
		self.button_last.connect_object("clicked", self.last_page, None)
		self.toolbar.insert(self.button_last, -1)
		self.button_last.show()	
		
		self.button_go.connect_object("clicked", self.open_go_to_page, None)
		self.toolbar.insert(self.button_go, -1)
		self.button_go.show()	
		
		item = gtk.ToolItem()
		item.show()
		item.set_expand(True)
		self.toolbar.insert(item, -1)
		
		self.button_zin.connect_object("clicked", self.zoom_in, None)
		self.toolbar.insert(self.button_zin, -1)
		self.button_zin.show()	
		
		self.button_zout.connect_object("clicked", self.zoom_out, None)
		self.toolbar.insert(self.button_zout, -1)
		self.button_zout.show()	
		
		self.button_z100.connect_object("clicked", self.zoom_original, None)
		self.toolbar.insert(self.button_z100, -1)
		self.button_z100.show()	
		
		self.button_zfit.connect_object("clicked", self.zoom_fit, None)
		self.toolbar.insert(self.button_zfit, -1)
		self.button_zfit.show()
		
		self.toolbar.set_focus_child(self.button_zfit) # Needed unless space key should activate buttons
		
		self.statusbar.show()
		self.table.attach(self.statusbar, 0, 2, 5, 6, gtk.FILL|gtk.SHRINK, gtk.FILL|gtk.SHRINK, 0, 0)
		
		if self.optionlist[1] == 1:
			
			self.window.resize(self.screen.get_width() / 2, self.screen.get_height() * 3 / 4)
			self.optionlist[0] == 1
			self.actiongroup.get_action('Fullscreen').set_active(True)
			
		if self.optionlist[5] == 1:
			
			self.optionlist[4] == 1
			self.actiongroup.get_action('Double').set_active(True)
			
		if self.optionlist[16] == 1:
			
			self.optionlist[18] == 1
			self.actiongroup.get_action('Fit').set_active(True)
			self.actiongroup.get_action('Zin').set_sensitive(False)
			self.actiongroup.get_action('Zout').set_sensitive(False)
			self.actiongroup.get_action('Zoriginal').set_sensitive(False)
			self.actiongroup.get_action('Zwidth').set_sensitive(False)
			self.actiongroup.get_action('Zheight').set_sensitive(False)
			self.actiongroup.get_action('Zfit').set_sensitive(False)
			self.actiongroup.get_action('Scrollbars').set_sensitive(False)
			self.button_zin.set_sensitive(False)
			self.button_zout.set_sensitive(False)
			self.button_z100.set_sensitive(False)
			self.button_zfit.set_sensitive(False)
			
		if self.optionlist[25] == 1:
			
			self.optionlist[25] = 0
			self.actiongroup.get_action('Menubar').set_active(True)
			self.show_menu = 1
			
		if self.optionlist[26] == 1:
			
			self.optionlist[26] = 0
			self.actiongroup.get_action('Toolbar').set_active(True)
			self.show_tool = 1
			
		if self.optionlist[27] == 1:
			
			self.optionlist[27] = 0
			self.actiongroup.get_action('Statusbar').set_active(True)
			self.show_status = 1
			
		if self.optionlist[22] == 0:
			
			self.optionlist[22] = 1
			self.actiongroup.get_action('Scrollbars').set_active(True)
			
		if len(self.bookmarks) == 0:
			
			self.actiongroup.get_action('Clear_book').set_sensitive(False)
			
		else:
			
			self.actiongroup.get_action('Clear_book').set_sensitive(True)
		
		if len(sys.argv) == 2:
			
			path = os.path.abspath(sys.argv[1])
			self.load_file(path)
			
		else:
			
			self.actiongroup.get_action('Comments').set_sensitive(False)
			self.actiongroup.get_action('File').set_sensitive(False)
			self.actiongroup.get_action('Save_book').set_sensitive(False)
			self.actiongroup.get_action('Convert').set_sensitive(False)
			self.actiongroup.get_action('Close').set_sensitive(False)
			self.actiongroup.get_action('Go').set_sensitive(False)
			self.actiongroup.get_action('Next').set_sensitive(False)
			self.actiongroup.get_action('Previous').set_sensitive(False)
			self.actiongroup.get_action('First').set_sensitive(False)
			self.actiongroup.get_action('Last').set_sensitive(False)
			self.button_previous.set_sensitive(False)
			self.button_next.set_sensitive(False)
			self.button_first.set_sensitive(False)
			self.button_last.set_sensitive(False)
			self.button_go.set_sensitive(False)
			
		self.refresh_image()
	
def main():
	
	gtk.main()
	
	if not os.path.exists(os.environ['HOME'] + "/.comix"):
		
		os.mkdir(os.environ['HOME'] + "/.comix")
		
	comixrc = open(os.environ['HOME'] + "/.comix/comixrc", 'w')
	
	if Comic.optionlist[1] == 1:
		
		option_string = "fullscreen=TRUE\n"
		
	else: 
		
		option_string = "fullscreen=FALSE\n"
		
	if Comic.optionlist[5] == 1:
		
		option_string = option_string + "double_page=TRUE\n"
		
	else: 
		
		option_string = option_string + "double_page=FALSE\n"
		
	if Comic.optionlist[2] == gtk.gdk.INTERP_NEAREST:
		
		option_string = option_string + "quality=NEAREST\n"
		
	else:
		
		if Comic.optionlist[2] == gtk.gdk.INTERP_TILES:
			
			option_string = option_string + "quality=TILES\n"
			
		else:
			
			if Comic.optionlist[2] == gtk.gdk.INTERP_BILINEAR:
				
				option_string = option_string + "quality=BILINEAR\n"
				
			else:
				
				option_string = option_string + "quality=HYPER\n"
				
	if Comic.optionlist[3] == 0:
		
		option_string = option_string + "hide_bars=FALSE\n"
		
	else:
		
		option_string = option_string + "hide_bars=TRUE\n"
		
	if Comic.optionlist[7] == 1:
		
		option_string = option_string + "cache_next=TRUE\n"
		
	else:
		
		option_string = option_string + "cache_next=FALSE\n"
		
	if Comic.optionlist[8] == 1:
		
		option_string = option_string + "flip_double=TRUE\n"
		
	else:
		
		option_string = option_string + "flip_double=FALSE\n"
		
	option_string = option_string + str(int(Comic.optionlist[6])) + "\n"
	
	if Comic.optionlist[9] == 1:
		
		option_string = option_string + "stretch=TRUE\n"
		
	else:
		
		option_string = option_string + "stretch=FALSE\n"
		
	if Comic.optionlist[14] == 1 and Comic.optionlist[0] == 0:
		
		option_string = option_string + str(Comic.optionlist[10]) + "\n"
		option_string = option_string + str(Comic.optionlist[11]) + "\n"
		option_string = option_string + str(Comic.optionlist[12]) + "\n"
		option_string = option_string + str(Comic.optionlist[13]) + "\n"
		option_string = option_string + "save_position_and_size=TRUE\n"
		
	else:
		
		option_string = option_string + "0\n"
		option_string = option_string + "0\n"
		option_string = option_string + "0\n"
		option_string = option_string + "0\n"
		option_string = option_string + "save_position_and_size=FALSE\n"
		
	option_string = option_string + Comic.optionlist[15] + "\n"
	
	if Comic.optionlist[16] == 1:
		
		option_string = option_string + "fit_to_screen=TRUE\n"
		
	else:
		
		option_string = option_string + "fit_to_screen=FALSE\n"
		
	option_string = option_string + "NOT USED\n"
	
	option_string = option_string + str(Comic.optionlist[19]) + "\n"
	option_string = option_string + str(Comic.optionlist[20]) + "\n"
	option_string = option_string + str(Comic.optionlist[21]) + "\n"
	
	if Comic.optionlist[22] == 1:
		
		option_string = option_string + "hide_scrollbars=TRUE\n"
		
	else:
		
		option_string = option_string + "hide_scrollbars=FALSE\n"
		
	if Comic.optionlist[23] == 1:
		
		option_string = option_string + "next_archive=TRUE\n"
		
	else:
		
		option_string = option_string + "next_archive=FALSE\n"
		
	if Comic.optionlist[24] == 1:
		
		option_string = option_string + "hide_cursor=TRUE\n"
		
	else:
		
		option_string = option_string + "hide_cursor=FALSE\n"
		
	if Comic.optionlist[25] == 1:
		
		option_string = option_string + "show_menubar=TRUE\n"
		
	else:
		
		option_string = option_string + "show_menubar=FALSE\n"
		
	if Comic.optionlist[26] == 1:
		
		option_string = option_string + "show_toolbar=TRUE\n"
		
	else:
		
		option_string = option_string + "show_toolbar=FALSE\n"
		
	if Comic.optionlist[27] == 1:
		
		option_string = option_string + "show_statusbar=TRUE\n"
		
	else:
		
		option_string = option_string + "show_statusbar=FALSE\n"
		
	if Comic.optionlist[28] == 1:
		
		option_string = option_string + "view_comments=TRUE\n"
		
	else:
		
		option_string = option_string + "view_comments=FALSE\n"
		
	option_string = option_string + Comic.optionlist[29] + "\n"
	
	comixrc.write(option_string)
	comixrc.close()
	
	bookmarks = open(os.environ['HOME'] + "/.comix/bookmarks", 'w')
	
	option_string = ""
	
	for i, bookmark in enumerate(Comic.bookmarks):
		
		option_string = option_string + bookmark + "\n"
		option_string = option_string + str(Comic.bookmark_numbers[i]) + "\n"
		
	bookmarks.write(option_string)
	bookmarks.close()
	
	if os.path.exists("/tmp/comix"):
		
		shutil.rmtree("/tmp/comix/")
	
	return 0

if __name__ == "__main__":
	
	Comic()
	main()
