#!/usr/bin/python
#
# GUI for RHN Configuration
# Copyright (c) 2000 Red Hat, Inc.
#
# Author: Preston Brown <pbrown@redhat.com>

import os, sys
import string

import gtk
from gtk import TRUE, FALSE
import gnome
import gnome.ui
import libglade
import signal

sys.path.append("/usr/share/rhn/up2date/")

import config

class Gui:

    def __init__(self):
        self.xml = libglade.GladeXML("/usr/share/rhn/up2date/configdlg.glade",
                                     "configDialog")

        self.xml.signal_autoconnect (
            { "onRetrieveOnlyButtonToggled" : self.enableAction,
              
              "onFileSelectorButtonClicked" : self.doFileSelector,
              "onAddPackageButtonClicked" : self.addButtonAction,
              "onEditPackageButtonClicked" : self.editButtonAction,
              "onRemovePackageButtonClicked" : self.removeButtonAction,
              "onAddFileButtonClicked" : self.addButtonAction,
              "onEditFileButtonClicked" : self.editButtonAction,
              "onRemoveFileButtonClicked" : self.removeButtonAction }
            
            )
        self.dlg = self.xml.get_widget("configDialog")
        self.xml.get_widget("notebook1").remove_page(0)
        self.dlg.connect("delete-event", gtk.mainquit)
        self.dlg.connect("hide", gtk.mainquit)

        self.xml.get_widget("cancelButton").connect("clicked", gtk.mainquit)
        self.xml.get_widget("okButton").connect("clicked", self.finish)
        
        self.cfg = config.Up2dateConfig()
        try:
            self.cfg.load()
        except:
            dlg = gnome.ui.GnomeErrorDialog("There was an error loading your configuration.  Make sure that\nyou have read access to /etc/sysconfig/rhn.",
                                            self.dlg)
            
            

        self.setInitialValues()


    def setInitialValues(self):
        # General Tab
#          addresses = self.cfg.readEntry("adminAddress")
#          self.emailCount = len(addresses)
#          if self.emailCount != 0:
#              for address in addresses:
#                  self.xml.get_widget("emailList").append([address])
#          else:
#              self.xml.get_widget("emailList").append(["root@localhost"])
#              self.emailCount = 1

#          self.xml.get_widget("enableProxyButton").set_active(self.cfg.readEntry("enableProxy"))
#          self.enableAction(self.xml.get_widget("enableProxyButton"))
#          self.xml.get_widget("proxyEntry").set_text(self.cfg.readEntry("pkgProxy"))

        # Retrieval Tab
        if self.cfg.readEntry("retrieveOnly"):
            self.xml.get_widget("retrieveOnlyButton").set_active(TRUE)
        else:
            self.xml.get_widget("retrieveOnlyButton").set_active(FALSE)
        self.enableAction(self.xml.get_widget("retrieveOnlyButton"))
                          
        if self.cfg.readEntry("retrieveNew"):
            self.xml.get_widget("retrieveNewButton").set_active(TRUE)
        else:
            self.xml.get_widget("retrieveNewButton").set_active(FALSE)
            
        if self.cfg.readEntry("noReplaceConfig"):
            self.xml.get_widget("noReplaceConfigButton").set_active(TRUE)
        else:
            self.xml.get_widget("noReplaceConfigButton").set_active(FALSE)

        if self.cfg.readEntry("retrieveSource"):
            self.xml.get_widget("retrieveSourceButton").set_active(TRUE)
        else:
            self.xml.get_widget("retrieveSourceButton").set_active(FALSE)

        if self.cfg.readEntry("keepAfterInstall"):
            self.xml.get_widget("keepPackagesButton").set_active(TRUE)
        else:
            self.xml.get_widget("keepPackagesButton").set_active(FALSE)

        if self.cfg.readEntry("useGPG"):
            self.xml.get_widget("useGPGButton").set_active(TRUE)
        else:
            self.xml.get_widget("useGPGButton").set_active(FALSE)
            
        if self.cfg.readEntry("versionOverride"):
            self.xml.get_widget("versionOverrideEntry").set_text(self.cfg.readEntry("versionOverride"))

        self.xml.get_widget("storageDirEntry").set_text(self.cfg.readEntry("storageDir"))

        # Package Tab
        pkgs = self.cfg.readEntry("pkgSkipList")
        self.packageCount = len(pkgs)
        if self.packageCount != 0:
            for s in pkgs:
                self.xml.get_widget("packageList").append([s])

        files = self.cfg.readEntry("fileSkipList")
        self.fileCount = len(files)
        if self.fileCount != 0:
            for s in files:
                self.xml.get_widget("fileList").append([s])
                


    def writeValues(self, button):
        # General
#          emails = []
#          for i in range(self.emailCount):
#              emails.append(self.xml.get_widget("emailList").get_text(i, 0))
#          self.cfg.writeEntry("adminAddress", emails)

#          self.cfg.writeEntry("enableProxy", self.xml.get_widget("enableProxyButton").get_active())
#          self.cfg.writeEntry("pkgProxy", self.xml.get_widget("proxyEntry").get_text())

        # Retrieval
        self.cfg.writeEntry("retrieveOnly",
                            self.xml.get_widget("retrieveOnlyButton").get_active())
        self.cfg.writeEntry("retrieveNew",
                            self.xml.get_widget("retrieveNewButton").get_active())
        self.cfg.writeEntry("noReplaceConfig",
                            self.xml.get_widget("noReplaceConfigButton").get_active())
        self.cfg.writeEntry("retrieveSource",
                            self.xml.get_widget("retrieveSourceButton").get_active())

        self.cfg.writeEntry("keepAfterInstall",
                            self.xml.get_widget("keepPackagesButton").get_active())
        self.cfg.writeEntry("useGPG",
                            self.xml.get_widget("useGPGButton").get_active())

        self.cfg.writeEntry("versionOverride",
                            self.xml.get_widget("versionOverrideEntry").get_text())
        self.cfg.writeEntry("storageDir",
                            self.xml.get_widget("storageDirEntry").get_text())


        # Packages
        packages = []
        for i in range(self.packageCount):
            packages.append(self.xml.get_widget("packageList").get_text(i, 0))
        self.cfg.writeEntry("pkgSkipList", packages)
 
        files = []
        for i in range(self.fileCount):
            files.append(self.xml.get_widget("fileList").get_text(i, 0))
        self.cfg.writeEntry("fileSkipList", files) 

        try:
            self.cfg.save()
        except:
            dlg = gnome.ui.GnomeErrorDialog("There was an error saving your configuration.  Make sure that\nyou own %s." % self.cfg.fileName,
                                            self.dlg)
            return 0

        return 1

    def finish(self, button):
        if self.writeValues(button):
            gtk.mainquit()


    def addButtonAction(self, button):
        entry = None
        list = None
        if button.get_name() == "addEmailButton":
            entry = self.xml.get_widget("emailEntry")
            list = self.xml.get_widget("emailList")
            if entry.get_text() == "":
                gtk.gdk_beep()
                return
            self.emailCount = self.emailCount + 1
        elif button.get_name() == "addPackageButton":
            entry = self.xml.get_widget("packageEntry")
            list = self.xml.get_widget("packageList")
            if entry.get_text() == "":
                gtk.gdk_beep()
                return
            self.packageCount = self.packageCount + 1
        elif button.get_name() == "addFileButton":
            entry = self.xml.get_widget("fileEntry")
            list = self.xml.get_widget("fileList")
            if entry.get_text() == "":
                gtk.gdk_beep()
                return
            self.fileCount = self.fileCount + 1

        list.append([entry.get_text()])
        entry.set_text("")


    def editButtonAction(self, button):
        list = None
        sel = None
        entry = None
        rButton = None
        if button.get_name() == "editEmailButton":
            list = self.xml.get_widget("emailList")
            entry = self.xml.get_widget("emailEntry")
            rButton = self.xml.get_widget("removeEmailButton")
        elif button.get_name() == "editPackageButton":
            list = self.xml.get_widget("packageList")
            entry = self.xml.get_widget("packageEntry")
            rButton = self.xml.get_widget("removePackageButton")
        elif button.get_name() == "editFileButton":
            list = self.xml.get_widget("fileList")
            entry = self.xml.get_widget("fileEntry")
            rButton = self.xml.get_widget("removeFileButton")

        
        sel = list.selection
        if len(sel) > 0:
            text = list.get_text(sel[0], 0)
            self.removeButtonAction(rButton)
            entry.set_text(text)
            entry.grab_focus()
        else:
            gtk.gdk_beep()
        

    def removeButtonAction(self, button):
        count = 0
        list = None
        if button.get_name() == "removeEmailButton":
            list = self.xml.get_widget("emailList")
            if not len(list.selection):
                gtk.gdk_beep()
                return
            if self.emailCount > 0:
                self.emailCount = self.emailCount - 1
                count = self.emailCount
        elif button.get_name() == "removePackageButton":
            list = self.xml.get_widget("packageList")
            if not len(list.selection):
                gtk.gdk_beep()
                return
            if self.packageCount > 0:
                self.packageCount = self.packageCount - 1
                count = self.packageCount
        elif button.get_name() == "removeFileButton":
            list = self.xml.get_widget("fileList")
            if not len(list.selection):
                gtk.gdk_beep()
                return
            if self.packageCount > 0:
                self.fileCount = self.fileCount - 1
                count = self.fileCount
            
        sel = list.selection
        list.remove(sel[0])
        row = sel[0]
        if count > 0:
            list.select_row(row-1, 0)


    def doFileSelector(self, button):
        selector = gtk.GtkFileSelection("Choose Directory")
        selector.set_filename(self.xml.get_widget("storageDirEntry").get_text())
        selector.cancel_button.connect("clicked", selector.hide)
        selector.ok_button.connect("clicked", self.updateStorageDir, selector)
        selector.set_modal(TRUE)
        selector.show()


    def updateStorageDir(self, button, selector):
        dir = selector.get_filename()
        try:
            os.chdir(dir)
        except:
            gtk.gdk_beep()
            return

        if dir[-1] == "/":
            dir = dir[:-1]
        self.xml.get_widget("storageDirEntry").set_text(dir)
        selector.hide()


    def enableAction(self, button):
        if button.get_name() == "enableProxyButton":
            self.xml.get_widget("proxyEntry").set_sensitive(button.get_active())
        elif button.get_name() == "retrieveOnlyButton":
            self.xml.get_widget("installFrame").set_sensitive(not button.get_active())
            self.xml.get_widget("useGPGButton").set_sensitive(not button.get_active())
            self.xml.get_widget("keepPackagesButton").set_sensitive(not button.get_active())
            
            
def main():

    gui = Gui()
    gtk.mainloop()


if __name__ == "__main__":
 main()
