# 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.

from Tkinter import *
from rhtkinter import *
from package import *
from packageset import *
from buttonbar import *
from listbox import *
from rhdialog import *
from verify import DoVerify

import time

class DetailsWindow(RHFrame):

    def createWidgets(self):
	inf = Frame(self)
	labels = Frame(inf)
	fields = Frame(inf)

	b = Button(self, { 'command' : self.close, 'text' : 'Close' } )
	b.pack({ 'side' : 'bottom' })

	self.items = {}
	
	for n in ( 'Name', 'Version', 'Release', 'Size',
		   'Vendor', 'Distribution', 'Build host', 'Build date'):
	    l = Label(labels, { 'anchor' : 'w', 'text' : n })
	    l.pack( { 'anchor' : 'w' } )
	    self.items[n] = Label(fields, { 'anchor' : 'w' })
	    self.items[n].pack( { 'anchor' : 'w' } )

	inf.pack( { 'side' : 'left' } )
	fields.pack( { 'side' : 'right' } )
	labels.pack()

    def close(self):
	self.closeCallback()
	self.quit()

    def showPackage(self, package):
	if (self.master):
	    self.master.title("Details on %s" % package.getName())
	self.items['Name']['text'] = package.getName()
	self.items['Version']['text'] = package.getVersion()
	self.items['Release']['text'] = package.getRelease()
	self.items['Size']['text'] = package.getSize()
	self.items['Distribution']['text'] = package.getDistribution()
	self.items['Build host']['text'] = package.getBuildhost()
	self.items['Build date']['text'] = time.asctime(
				time.gmtime(package.getBuilddate()))
	self.items['Vendor']['text'] = package.getVendor()

	### should add installed date to this

    def __init__(self, closeCallback, Master = None):
	RHFrame.__init__(self, Master)
	self.createWidgets()
	self.pack()
	self.closeCallback = closeCallback

class QueryWindow(RHFrame):

    def next(self):
	if (self.currPackage and 
	      (self.currPackageNum + 1) < len(self.packages)):
	    self.currPackageNum = self.currPackageNum + 1
	    self.currPackage = self.packages[self.currPackageNum]
	    self.showCurrPackage()

    def previous(self):
	if (self.currPackage and self.currPackageNum):
	    self.currPackageNum = self.currPackageNum - 1
	    self.currPackage = self.packages[self.currPackageNum]
	    self.showCurrPackage()

    def motion(self, event):
	pass

    def select(self, event):
	line = event.widget.nearest(event.y)
	if (line != self.currPackageNum):
	    self.currPackageNum = line
	    self.currPackage = self.packages[self.currPackageNum]
	    self.showCurrPackage()

    def showCurrPackage(self):
	if (self.currPackage):
	    self.label['text'] = self.currPackage.getIdent()
	    self.description.delete('0.0', 'end')
	    self.description.insert('end', self.currPackage.getDescription())

	    if (self.packageList):
		self.packageList.select_clear('0', 'end')
		self.packageList.select_set("%d" % self.currPackageNum)

	    self.fileList.clear()

	    files = self.currPackage.getFileEntries()
	    for f in files:
		c = '';
		d = '';
		if (f.isConfig()):
		    c = 'C';
		if (f.isDoc()):
		    d = 'D';
		
		if (f.getState() == "replaced"):
		    s = 'r';
		elif (f.getState() == "not installed"):
		    s = 'n';
		else:
		    s = '';
		s = '';
		self.fileList.addItems([(d, c, s, f.getName() ) , ])

	    if (self.detailsWin):
		self.detailsWin.showPackage(self.currPackage)
	    if (self.master):
		self.master.title("Query of %s" % self.currPackage.getName())

    def noDetails(self):
        self.detailsWin = None

    def details(self):
	if (not self.detailsWin):
	    self.detailsWin = DetailsWindow(self.noDetails, Toplevel())
	    self.detailsWin.showPackage(self.currPackage)
	
    def close(self):
	if (self.detailsWin):
	    self.detailsWin.quit()
	self.quit()

    def verify(self):
	pset = PackageSet()
	pset.addPackage(self.currPackage)
	DoVerify(pset)

    def createWidgets(self):
	self.infoFrame = Frame(self, { 'border' : '2' } ) 

	if (len(self.packages) > 1):
	    f = Frame(self)

	    self.packageList = Listbox(f, { 'relief' : 'raised' } )
	    for p in self.packages:
		self.packageList.insert('end', p.getName())
	    self.packageList.pack({ 'side' : 'left', 'fill' : 'both' })
	    self.packageList.bind('<1>', self.select)
	    self.packageList.bind('<B1-Motion>', self.motion)
	    self.packageList.bind('<B1-ButtonRelease>', self.select)
	    self.packageScroll = Scrollbar(f, 
		    { 'command' : self.packageList.yview})
	    self.packageScroll.pack({ 'side' : 'right', 'fill' : 'y' })
	    self.packageList['yscrollcommand'] = self.packageScroll.set;
	    f.pack({ 'side' : 'left', 'fill' : 'both' })
	else:
	    self.packageList = None

	self.fileList = MultifieldListbox(self.infoFrame,
					  [ ('D', 1, 0), ('C', 1, 0), 
					    ('S', 1, 0), ('Path', 40, 1) ] );
	# self.fileList.deactivate()
	self.fileList.pack({ 'side' : 'bottom', 'expand' : '1', 
				'fill' : 'both' })

	self.infoFrame.pack({ 'side' : 'left', 'expand' : '1', 
				'fill' : 'both' } )

	self.label = Label(self.infoFrame)
	self.label.pack()

	f = Frame(self.infoFrame)
	self.description = Text(f, { 'height' : '4', 
		'width' : '20', 'wrap' : 'word' } )
	self.description.pack({ 'expand' : '1', 'fill' : 'both', 
				'side' : 'left' })
	s = Scrollbar(f, { 'command' : self.description.yview } )
	s.pack({ 'fill' : 'y', 'side' : 'right' })
	self.description['yscrollcommand'] = s.set
	f.pack({ 'expand' : '1', 'fill' : 'both' })
	
	f = Frame(self)

	self.sideButtons = ButtonBar(f)
	self.sideButtons.setOrientation('vert')
	self.sideButtons.addButton('Select', self.selectp)
	self.sideButtons.addButton('Unselect', self.unselectp)
	self.sideButtons.addButton('Verify', self.verify)
	self.sideButtons.addButton('Details', self.details)
	self.sideButtons.addButton('Close', self.close)
	self.sideButtons.pack({'anchor' : 'n' })

	if (len(self.packages) > 1):
	    self.iterButtons = ButtonBar(f)
	    self.iterButtons.setOrientation('vert')
	    self.iterButtons.addButton('Previous', self.previous)
	    self.iterButtons.addButton('Next', self.next)
	    self.iterButtons.pack({ 'side' : 'bottom' })

	f.pack({ 'side' : 'right', 'fill' : 'both' })

	self.pack({ 'expand' : '1', 'fill' : 'both' })

    def selectp(self):
	if (self.currPackage):
	    self.currPackage.select()

    def unselectp(self):
	if (self.currPackage):
	    self.currPackage.unselect()

    def __init__(self, pset, Master = None):
	RHFrame.__init__(self, Master)
	self.detailsWin = None
	self.packages = pset.getPackages()
	if (len(self.packages)):
	    self.currPackageNum = 0
	    self.currPackage = self.packages[self.currPackageNum]
	else:
	    self.currPackageNum = -1
	    self.currPackage = None
	
	self.createWidgets()
	self.showCurrPackage()

def DoQuery(pset):
    packages = pset.getPackages()

    if (len(packages) == 0):
	error("No packages have been selected to query")
	return

    QueryWindow(pset, Toplevel())
