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

import os
import sys

saveargs = []
for arg in sys.argv[1:]:
    saveargs.append(arg)
    sys.argv.remove(arg)

import gtk
from gtk import TRUE, FALSE
import gnome
import gnome.ui
# XXX: is this REALLY necessary here?
from gtk import glade
import xmlrpclib

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

from rhpl.translate import _, N_
gtk.glade.bindtextdomain ("up2date", "/usr/share/locale")

import config
import configUtils

import rpcServer

cfg = config.initUp2dateConfig()



class Gui:

    def __init__(self, firstboot=None):
        self.xml = gtk.glade.XML(
            "/usr/share/rhn/up2date_client/configdlg.glade",
            "configDialog", domain="up2date")

        self.xml.signal_autoconnect (
            { "onEnableProxyButtonToggled" : self.enableAction,
              "onEnableProxyAuthButtonToggled"  : self.enableAction,
              "onRetrieveOnlyButtonToggled" : self.enableAction,
              "onRefreshServerUrlButtonClicked" : self.refreshServerAction,
              "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", self.quit)
        self.xml.get_widget("okButton").connect("clicked", self.finish)

        if firstboot:
            self.dlg.set_position(gtk.WIN_POS_CENTER)
        
        self.rc = 0
        try:
            self.cfg = config.initUp2dateConfig()
        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
        
        self.xml.get_widget("enableProxyButton").set_active(self.cfg["enableProxy"])
        self.enableAction(self.xml.get_widget("enableProxyButton"))
        self.xml.get_widget("proxyEntry").set_text(self.cfg["httpProxy"])

        self.xml.get_widget("enableProxyAuthButton").set_active(self.cfg["enableProxyAuth"])
        self.enableAction(self.xml.get_widget("enableProxyAuthButton"))
        self.xml.get_widget("proxyUserEntry").set_text(str(self.cfg["proxyUser"]))
        self.xml.get_widget("proxyPasswordEntry").set_text(str(self.cfg["proxyPassword"]))

        self.serverUrlCombo = self.xml.get_widget("serverUrlCombo")
        #self.serverUrls = configUtils.getServerUrls()
        default = "https://xmlrpc.rhns.redhat.com/XMLRPC"
        self.serverUrls = [cfg["serverURL"]]
        
        self.serverUrlCombo.set_popdown_strings(self.serverUrls)
        default = "https://xmlrpc.rhns.redhat.com/XMLRPC"
        if default in self.serverUrls:
            self.serverUrlCombo.list.select_item(self.serverUrls.index(default))

        
        # Retrieval Tab
        if self.cfg["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["noReplaceConfig"]:
            self.xml.get_widget("noReplaceConfigButton").set_active(TRUE)
        else:
            self.xml.get_widget("noReplaceConfigButton").set_active(FALSE)

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

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

        if self.cfg["useGPG"]:
            self.xml.get_widget("useGPGButton").set_active(TRUE)
        else:
            self.xml.get_widget("useGPGButton").set_active(FALSE)

        if self.cfg["enableRollbacks"]:
            self.xml.get_widget("enableRollbacksButton").set_active(TRUE)
        else:
            self.xml.get_widget("enableRollbacksButton").set_active(FALSE)
            
        if self.cfg["versionOverride"]:
            self.xml.get_widget("versionOverrideEntry").set_text(self.cfg["versionOverride"])

        self.xml.get_widget("storageDirEntry").set_text(self.cfg["storageDir"])

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

        files = self.cfg["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

        self.cfg.set("enableProxy",
                     int(self.xml.get_widget("enableProxyButton").get_active()))
        self.cfg.set("httpProxy",
                     self.xml.get_widget("proxyEntry").get_text())

        self.cfg.set("enableProxyAuth",
                     int(self.xml.get_widget("enableProxyAuthButton").get_active()))
        self.cfg.set("proxyUser",
                     str(self.xml.get_widget("proxyUserEntry").get_text()))
        self.cfg.set("proxyPassword",
                     str(self.xml.get_widget("proxyPasswordEntry").get_text()))

        # Retrieval
        self.cfg.set("retrieveOnly",
                     int(self.xml.get_widget("retrieveOnlyButton").get_active()))
        self.cfg.set("noReplaceConfig",
                     int(self.xml.get_widget("noReplaceConfigButton").get_active()))
        self.cfg.set("retrieveSource",
                     int(self.xml.get_widget("retrieveSourceButton").get_active()))

        self.cfg.set("keepAfterInstall",
                     int(self.xml.get_widget("keepPackagesButton").get_active()))
        self.cfg.set("useGPG",
                     int(self.xml.get_widget("useGPGButton").get_active()))
        self.cfg.set("enableRollbacks",
                     int(self.xml.get_widget("enableRollbacksButton").get_active()))

        self.cfg.set("versionOverride",
                     self.xml.get_widget("versionOverrideEntry").get_text())
        self.cfg.set("storageDir",
                     self.xml.get_widget("storageDirEntry").get_text())
        self.serverUrl = self.serverUrlCombo.entry.get_text()
        self.cfg.set("serverURL", self.serverUrl) 

        # Packages
        packages = []
        for i in range(self.packageCount):
            packages.append(self.xml.get_widget("packageList").get_text(i, 0))
        self.cfg.set("pkgSkipList", packages)
 
        files = []
        for i in range(self.fileCount):
            files.append(self.xml.get_widget("fileList").get_text(i, 0))
        self.cfg.set("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 quit(self, button):
        self.dlg.hide()
        gtk.mainquit()
        self.rc = 0

    def finish(self, button):
        self.dlg.hide()
        self.rc = 1
        if self.writeValues(button):
            gtk.mainquit()

    def refreshServerListCombo(self):
        serverUrls = configUtils.getServerUrls()
        self.serverUrlCombo.set_popdown_strings(serverUrls)
        

    def refreshServerAction(self, button):
        self.refreshServerListCombo()
            

    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.fileCount > 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.FileSelection("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())
            self.xml.get_widget("proxyEntry").grab_focus()
            
        elif button.get_name() == "retrieveOnlyButton":
            self.xml.get_widget("installFrame").set_sensitive(not button.get_active())
            self.xml.get_widget("keepPackagesButton").set_sensitive(not button.get_active())
            self.xml.get_widget("enableRollbacksButton").set_sensitive(not button.get_active())

        elif button.get_name() == "enableProxyAuthButton":
            self.xml.get_widget("proxyUserEntry").set_sensitive(button.get_active())
            self.xml.get_widget("proxyPasswordEntry").set_sensitive(button.get_active())
            self.xml.get_widget("usernameLabel").set_sensitive(button.get_active())
            self.xml.get_widget("passwordLabel").set_sensitive(button.get_active())

def main(firstboot=None):


    try:
        from gtk import _disable_gdk_threading
        _disable_gdk_threading()
    except ImportError:
        pass

    gui = Gui(firstboot)

    # the ugly things you do for the sake of beauty
         
    gtk.mainloop()
    
    return gui.rc


if __name__ == "__main__":
 main()
