"""

This class handles projects (open, close, save, ...)

"""

# Initialize i18n
from constants import localedir, unixname
from tools import gettext

gettext = gettext(unixname, localedir)
gettext.textdomain(unixname)
_ = gettext.gettext

import cPickle
import log4py
import os
import sys

from constants import iconpath, configdirectory, shortcutfile
from time import sleep

# this is for installations with both python-gtk versions
try:
    import pygtk
    pygtk.require('2.0')
except:
    pass

try:
    import gtk
except (RuntimeError, TypeError, NameError), detail:
    logger = log4py.Logger().get_instance()
    logger.error(_("An error occured: %s") % detail)
    sys.exit(1)

try:
    import gtk as gnome
    import gnome.tools
except:
    import gnometools
    gnome.tools = gnometools
    
class Project:

    def __init__(self):
        self.Filename = ""
        self.DataFiles = []
        self.DataVolumeID = ""
        self.DataSize = ""
        self.AudioFiles = []
        self.AudioVolumeID = ""
        self.AudioSize = ""
        self.OtherInfo = None
        self.CancelPressed = gtk.FALSE
        self.__busy__ = gtk.FALSE

    def New(self):
        filedialog = gnome.tools.FileSelectionDialog(multiselection = gtk.FALSE, filetypes = [gnome.tools.EROASTER_PROJECTS, gnome.tools.ALL_FILES], icondir = iconpath)
        filedialog.use_lastdirectory("%s%s%s%slastdirectory.project" % (gnome.tools.get_homedirectory(), os.sep, configdirectory, os.sep))
        filedialog.load_shortcuts_from_file("%s%s%s%s%s" % (gnome.tools.get_homedirectory(), os.sep, configdirectory, os.sep, shortcutfile))
        filedialog.ok_button.connect("clicked", self.SetNewFilename, filedialog.get_directory, filedialog.get_filenames, filedialog.destroy)
        filedialog.close_button.connect("clicked", self.CloseFileDialog, filedialog.destroy)
        filedialog.show()
        self.CancelPressed = gtk.FALSE
        self.__busy__ = gtk.TRUE
        while (self.__busy__ == gtk.TRUE):
            while (gtk.events_pending()):
                gtk.mainiteration()
            sleep(0.01)

    def SetNewFilename(self, args, get_directory, get_filenames, destroy):
        self.__init__()
        self.Filename = "%s/%s" % (get_directory(), get_filenames())
        destroy()
        self.__busy__ = gtk.FALSE

    def CloseFileDialog(self, args, destroy):
        destroy()
        self.CancelPressed = gtk.TRUE
        self.__busy__ = gtk.FALSE

    def Close(self):
        self.__init__()

    def Clear(self):
        self.__init__()

    def Open(self):
        filedialog = gnome.tools.FileSelectionDialog(multiselection = gtk.FALSE, filetypes = [gnome.tools.EROASTER_PROJECTS, gnome.tools.ALL_FILES], icondir = iconpath)
        filedialog.use_lastdirectory("%s%s%s%slastdirectory.project" % (gnome.tools.get_homedirectory(), os.sep, configdirectory, os.sep))
        filedialog.load_shortcuts_from_file("%s%s%s%s%s" % (gnome.tools.get_homedirectory(), os.sep, configdirectory, os.sep, shortcutfile))
        filedialog.ok_button.connect("clicked", self.OpenSetFilename, filedialog.get_directory, filedialog.get_filenames, filedialog.destroy)
        filedialog.close_button.connect("clicked", self.CloseFileDialog, filedialog.destroy)
        filedialog.show()
        self.CancelPressed = gtk.FALSE
        self.__busy__ = gtk.TRUE
        while (self.__busy__ == gtk.TRUE):
            while (gtk.events_pending()):
                gtk.mainiteration()
            sleep(0.01)

    def OpenSetFilename(self, args, get_directory, get_filenames, destroy):
        filename = "%s/%s" % (get_directory(), get_filenames())
        if ((os.path.isfile(filename)) and (not os.path.islink(filename))):
            destroy()
            self.Filename = filename
            file = open(self.Filename, "r")
            try:
                pickler = cPickle.Unpickler(file)
                dict = pickler.load()
                self.DataFiles = dict["DataFiles"]
                self.DataVolumeID = dict["DataVolumeID"]
                self.DataSize = dict["DataSize"]
                self.AudioFiles = dict["AudioFiles"]
                self.AudioVolumeID = dict["AudioVolumeID"]
                self.AudioSize = dict["AudioSize"]
                self.OtherInfo = dict["OtherInfo"]
            except:
                gnome.tools.ErrorDialog(_("Invalid ERoaster Project file !"))
            file.close()
            self.__busy__ = gtk.FALSE

    def Save(self):
        if (self.Filename == ""):
            filedialog = gnome.tools.FileSelectionDialog(multiselection = gtk.FALSE, filetypes = [gnome.tools.EROASTER_PROJECTS, gnome.tools.ALL_FILES], icondir = iconpath, windowtitle = "Save File")
            filedialog.use_lastdirectory("%s%s%s%slastdirectory.project" % (gnome.tools.get_homedirectory(), os.sep, configdirectory, os.sep))
            filedialog.load_shortcuts_from_file("%s%s%s%s%s" % (gnome.tools.get_homedirectory(), os.sep, configdirectory, os.sep, shortcutfile))
            filedialog.ok_button.connect("clicked", self.SaveProjectWithFileSelection, filedialog.get_directory, filedialog.get_filenames, filedialog.destroy)
            filedialog.close_button.connect("clicked", filedialog.destroy)
            filedialog.show()
        else:
            self.SaveProject()

    def SaveProjectWithFileSelection(self,args, get_directory, get_filenames, destroy):
        self.Filename = "%s%s%s" % (get_directory(), os.sep, get_filenames())
        destroy()
        self.SaveProject()

    def SaveProject(self):
        dict = {}
        dict["DataFiles"] = self.DataFiles
        dict["DataVolumeID"] = self.DataVolumeID
        dict["DataSize"] = self.DataSize
        dict["AudioFiles"] = self.AudioFiles
        dict["AudioVolumeID"] = self.AudioVolumeID
        dict["AudioSize"] = self.AudioSize
        dict["OtherInfo"] = self.OtherInfo
        file = open(self.Filename, "w")
        pickler = cPickle.Pickler(file)
        pickler.dump(dict)
        file.close()


syntax highlighted by Code2HTML, v. 0.9.1