#!/usr/bin/python

# GLINT graphical package management
# Copyright (C) 1995 Red Hat, Inc
#
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.

import string

from Tkinter import *
from rhtkinter import *
from group import *
from package import *
from packageset import *
from buttonbar import *
from area import *
from query import QueryWindow
from install import DoInstall
from install import DoUpgrade
from uninstall import DoUninstall
from glintw import *
from config import DoConfig
from rhutil import *

import rhdialog
import os
import posixpath
import regex

VERSION = "2.5";
COPYRIGHT = "Copyright (C) 1998 - Red Hat Software\nThis may be freely redistributed under the terms of the GNU Public License";


print "Glint Graphical Package Manager -- version", VERSION
print COPYRIGHT

installedPackageSet = InstalledPackageSet()
availablePackageSet = None
availableWindowCount = 0

defaultPackagePath = "/mnt/cdrom/RedHat/RPMS"
currentPackagePath = defaultPackagePath

class InstalledWindow(GlintWindow):

    def available(self):
	global availablePackageSet, currentPackagePath

	if (not availablePackageSet):
	    availablePackageSet = PackagePathSet(currentPackagePath)

	    if (len(availablePackageSet.getPackages()) == 0):
		rhdialog.error(currentPackagePath +" doesn't contain any RPMs")
		availablePackageSet = None
	    else:
		availw = AvailableWindow(Toplevel())
		availablePackageSet.cacheCurrentSet()
		availablePackageSet.setDiff(installedPackageSet)
		availgr = Group(availablePackageSet)
		availw.setGroup(availgr)

    def config(self):
	global defaultPackagePath, currentPackagePath

	(currentPackagePath,) = DoConfig(defaultPackagePath, currentPackagePath)

    def fillButtonBar(self):
	self.buttonBar.addButton('Query', self.queryButton)
	self.buttonBar.addButton('Uninstall', self.uninstallButton)
	self.buttonBar.addButton('Verify', self.verifyButton)
	self.buttonBar.addButton('Configure', self.config)
	self.buttonBar.addButton('Available', self.available)
	if (self.canClose):
	    self.buttonBar.addButton('Close', self.close)
	else:
	    self.buttonBar.addButton('Exit', self.close)

    def uninstallButton(self):
	packages = self.area.getGroup().topGroup().getSelectedPackages()
	self.uninstall(packages)

    def uninstall(self, packages):
	global availablePackageSet

	installedPackageSet.close()
	DoUninstall(packages)
	installedPackageSet.reopen()

	for package in packages.getPackages():
	    installedPackageSet.mightNotHave(package.getLabel())
	    if (availablePackageSet):
		availablePackageSet.addPackageFromCache(package.getLabel())

    def changeGroup(self, group, newWin):
	if (newWin):
	    win = InstalledWindow(1, Toplevel(), group)
	else:
	    self.area.pushGroup(group)

    def __init__(self, canClose, Master=None, group = None):
	global installedPackageSet

	self.canClose = canClose
	
	GlintWindow.__init__(self, 0, Master)

	if (Master):
	    Master.title("Installed Packages")

	self.pack({ 'expand' : '1', 'fill' : 'both' } )
	if (group == None):
	    instgroup = Group(installedPackageSet)
	    self.setGroup(instgroup)
	else:
	    self.setGroup(group)

	self.area.addToMenus('Query', self.query)
	self.area.addToMenus('Uninstall', self.uninstall)
	self.area.addToMenus('Verify', self.verify)

class AvailableWindow(GlintWindow):

    def fillButtonBar(self):
	self.buttonBar.addButton('Query', self.queryButton)
	self.buttonBar.addButton('Install', self.installButton)
	self.buttonBar.addButton('Upgrade', self.upgradeButton)
	self.buttonBar.addButton('Help', self.help)
	self.buttonBar.addButton('Close', self.close)

    def close(self):
	global availablePackageSet, availableWindowCount

	availableWindowCount = availableWindowCount - 1
	self.area.cleanup()

	if (not availableWindowCount):
	    availablePackageSet = None

	self.quit()
	
    def upgradeButton(self):
	packages = self.area.getGroup().topGroup().getSelectedPackages()
	self.upgrade(packages)

    def installButton(self):
	packages = self.area.getGroup().topGroup().getSelectedPackages()
	self.install(packages)

    def upgrade(self, packages):
	global installedPackageSet
	global availablePackageSet

	installedPackageSet.close()
	DoUpgrade(packages)
	installedPackageSet.reopen()

	for package in installedPackageSet.getPackages():
	    installedPackageSet.mightNotHave(package.getLabel())
	    if (availablePackageSet and 
		not installedPackageSet.containsLabel(package.getLabel())):
		availablePackageSet.addPackageFromCache(package.getLabel())

	self.updateInstalledPackages(packages)

    def install(self, packages):
	global installedPackageSet
	global availablePackageSet

	installedPackageSet.close()
	DoInstall(packages)
	installedPackageSet.reopen()

	self.updateInstalledPackages(packages)

    def updateInstalledPackages(self, packages):
	global installedPackageSet
	global availablePackageSet

	for package in packages.getPackages():
	    installedPackageSet.mightNowHave(package.getLabel())
	    if (installedPackageSet.containsLabel(package.getLabel())):
		availablePackageSet.removePackage(package.getLabel())

    def changeGroup(self, group, newWin):
	if (newWin):
	    availw = AvailableWindow(Toplevel())
	    availw.setGroup(group)
	else:
	    self.area.pushGroup(group)

    def __init__(self, Master=None):
	global availableWindowCount

	GlintWindow.__init__(self, 1, Master)
	self.pack({ 'expand' : '1', 'fill' : 'both' } )
	self.area.addToMenus('Query', self.query)
	self.area.addToMenus('Install', self.install)
	self.area.addToMenus('Upgrade', self.upgrade)

	availableWindowCount = availableWindowCount + 1

	if (Master):
	    Master.title("Available Packages")

if (os.path.exists("/root/.glintrc")):
    configexp = regex.compile("^([a-z]*):[ \t]*(.*)$")

    rcfile = open("/root/.glintrc", "r")
    line = rcfile.readline()
    while (line):
	origline = line

        if (len(line) == 0 or line[0] == '#'):
            line = seriesf.readline()
            continue

        while (line[0] == ' ' or [0] == '\t'):
            line = line[1:]
        last = len(line) - 1
        while (line[last] == ' ' or [last] == '\t'):
            last = last - 1
            line = line[:last]

        line = chop(line)

	if (configexp.match(line)):
	    (option, value) = configexp.group(1, 2)
	    if (option == "rpmpath"): 
		defaultPackagePath = value
		currentPackagePath = defaultPackagePath
	    else:
		print "Unknown option", option," in /root/.glintrc"
	else:
	    print "Bad line in /root/.glintrc:", origline

	line = rcfile.readline()

# magic to keep a root window from appearing
L = Label()
L.tk.call('wm', 'withdraw', '.')
del L

win = InstalledWindow(0, Toplevel())

win.wait_window(win)

