summaryrefslogtreecommitdiffstats
path: root/iw
diff options
context:
space:
mode:
authorpnfisher <pnfisher>1999-07-28 16:23:57 +0000
committerpnfisher <pnfisher>1999-07-28 16:23:57 +0000
commit6597944cbd98c82f954f9f0f6dcf9e37e8f17ffc (patch)
treefaf713e4d3ea4c474dd2597a7269c4e9d722048e /iw
parent0bd9ae6eef267f14d1c2a51c95ecac67f7d60d5c (diff)
downloadanaconda-6597944cbd98c82f954f9f0f6dcf9e37e8f17ffc.tar.gz
anaconda-6597944cbd98c82f954f9f0f6dcf9e37e8f17ffc.tar.xz
anaconda-6597944cbd98c82f954f9f0f6dcf9e37e8f17ffc.zip
initial checkin
Diffstat (limited to 'iw')
-rw-r--r--iw/__init__.py0
-rw-r--r--iw/iw.py15
-rw-r--r--iw/language.py37
-rw-r--r--iw/package.py410
-rw-r--r--iw/progress.py148
-rw-r--r--iw/welcome.py38
-rw-r--r--iw/xpms.py195
7 files changed, 843 insertions, 0 deletions
diff --git a/iw/__init__.py b/iw/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/iw/__init__.py
diff --git a/iw/iw.py b/iw/iw.py
new file mode 100644
index 000000000..fc6dc7438
--- /dev/null
+++ b/iw/iw.py
@@ -0,0 +1,15 @@
+class InstallWindow:
+ def __init__ (self,ics):
+ self.ics = ics
+
+ def getNext (self):
+ return None
+
+ def getPrev (self):
+ return None
+
+ def getScreen (self):
+ pass
+
+ def getICS (self):
+ return self.ics
diff --git a/iw/language.py b/iw/language.py
new file mode 100644
index 000000000..9b5b315b9
--- /dev/null
+++ b/iw/language.py
@@ -0,0 +1,37 @@
+from gtk import *
+from iw import *
+
+class LanguageWindow (InstallWindow):
+
+ def __init__ (self, ics):
+ InstallWindow.__init__ (self, ics)
+
+ ics.setTitle ("Language Selection")
+ ics.setNextEnabled (1)
+ ics.setHTML ("<HTML><BODY>Select which language you would like"
+ "to use for the system default.</BODY></HTML>")
+
+ self.languages = ["English", "German", "French", "Spanish",
+ "Hungarian", "Japanese", "Chinese", "Korean"]
+ self.question = ("What language should be used during the "
+ "installation process?")
+
+ def getScreen (self):
+ mainBox = GtkVBox (FALSE, 10)
+ label = GtkLabel (self.question)
+ label.set_alignment (0.5, 0.5)
+
+ box = GtkVBox (FALSE, 10)
+ language1 = GtkRadioButton (None, self.languages[0])
+ box.pack_start (language1, FALSE)
+ for locale in self.languages[1:]:
+ language = GtkRadioButton (language1, locale)
+ box.pack_start (language, FALSE)
+
+ align = GtkAlignment (0.5, 0.5)
+ align.add (box)
+
+ mainBox.pack_start (label, FALSE, FALSE, 10)
+ mainBox.pack_start (align)
+
+ return mainBox
diff --git a/iw/package.py b/iw/package.py
new file mode 100644
index 000000000..80115beba
--- /dev/null
+++ b/iw/package.py
@@ -0,0 +1,410 @@
+from gtk import *
+from gnome.ui import *
+from iw import *
+from string import *
+from xpms import *
+from thread import *
+import rpm
+
+
+class IndividualPackageSelectionWindow (InstallWindow):
+
+ def __init__ (self, ics):
+ InstallWindow.__init__ (self, ics)
+
+ self.todo = ics.getToDo ()
+ ics.setTitle ("Individual Package Selection")
+ ics.setNextEnabled (1)
+ ics.setHTML ("<HTML><BODY>Next you must select which packages to install."
+ "</BODY></HTML>")
+ ics.setHelpEnabled (FALSE)
+ self.DIR = 0
+ self.DIR_UP = 1
+ self.RPM = 2
+
+ self.updatingIcons = FALSE
+
+ def getPrev (self):
+ return PackageSelectionWindow
+
+ def build_tree (self, x):
+ if (x == ()): return ()
+ if (len (x) == 1): return (x[0],)
+ else: return (x[0], self.build_tree (x[1:]))
+
+ def merge (self, a, b):
+ if a == (): return self.build_tree (b)
+ if b == (): return a
+ if b[0] == a[0]:
+ if len (a) > 1 and isinstance (a[1], type (())):
+ return (a[0],) + (self.merge (a[1], b[1:]),) + a[2:]
+ elif b[1:] == (): return a
+ else: return (a[0],) + (self.build_tree (b[1:]),) + a[1:]
+ else:
+ return (a[0],) + self.merge (a[1:], b)
+
+ def build_ctree (self, list, cur_parent = None, prev_node = None, path = ""):
+ if (list == ()): return
+
+ if (len (list) > 1 and isinstance (list[1], type (()))): leaf = FALSE
+ else: leaf = TRUE
+
+ if isinstance (list[0], type (())):
+ self.build_ctree (list[0], prev_node, None, self.ctree.node_get_row_data (prev_node))
+ self.build_ctree (list[1:], cur_parent, None, path)
+ else:
+ node = self.ctree.insert_node (cur_parent, None, (list[0],), 2,
+ self.closed_p, self.closed_b, self.open_p, self.open_b, leaf)
+ cur_path = path + "/" + list[0]
+ self.ctree.node_set_row_data (node, cur_path)
+ self.build_ctree (list[1:], cur_parent, node, path)
+
+ def draw_root_icons (self):
+ self.iconList.freeze ()
+ self.iconList.clear ()
+ for x in self.ctree.base_nodes ():
+ dirName = self.ctree.get_node_info (x)[0]
+ pos = self.iconList.append ("/usr/src/mc/gnome/i-directory.png", dirName)
+ self.iconList.set_icon_data (pos, (self.DIR, x))
+ self.iconList.thaw ()
+
+
+ def get_rpm_desc (self, header):
+ desc = replace (header[rpm.RPMTAG_DESCRIPTION], "\n\n", "\x00")
+ desc = replace (desc, "\n", " ")
+ desc = replace (desc, "\x00", "\n\n")
+ return desc
+
+ def clear_package_desc (self):
+ self.currentPackage = None
+ self.packageName.set_text ("")
+ self.packageSize.set_text ("")
+ self.packageDesc.freeze ()
+ self.packageDesc.delete_text (0, -1)
+ self.packageDesc.thaw ()
+ self.cbutton.set_active (FALSE)
+ self.cbutton.set_sensitive (FALSE)
+
+
+ def select_icon (self, iconList, arg1, event, *args):
+ if event and event.type != GDK._2BUTTON_PRESS and event.type != GDK.BUTTON_PRESS:
+ return
+ icon_data = iconList.get_icon_data (arg1)
+ if not icon_data: return
+
+ if event and iconList.icon_is_visible (arg1) != VISIBILITY_FULL:
+ allocation = iconList.get_allocation ()
+ if (event.y - self.iconListAdj.value) < (allocation[3]/2):
+ self.iconList.moveto (arg1, 0.0)
+ else:
+ self.iconList.moveto (arg1, 1.0)
+
+ if event == None or event.type == GDK.BUTTON_PRESS:
+ if icon_data[0] == self.RPM:
+ header = icon_data[1]
+ # if we're already displaying the current package, don't redraw
+ if self.packageName.get () == "%s-%s-%s" % (header[rpm.RPMTAG_NAME],
+ header[rpm.RPMTAG_VERSION],
+ header[rpm.RPMTAG_RELEASE]):
+ return
+
+ self.currentPackage = header
+ self.currentPackagePos = arg1
+ self.cbutton.set_sensitive (TRUE)
+ if header.selected:
+ self.cbutton.set_active (TRUE)
+ else:
+ self.cbutton.set_active (FALSE)
+
+ self.packageName.set_text ("%s-%s-%s" % (header[rpm.RPMTAG_NAME],
+ header[rpm.RPMTAG_VERSION],
+ header[rpm.RPMTAG_RELEASE]))
+ self.packageSize.set_text ("%.1f KBytes" % (header[rpm.RPMTAG_SIZE] / 1024.0))
+ self.packageDesc.freeze ()
+ self.packageDesc.delete_text (0, -1)
+ self.packageDesc.insert_defaults (self.get_rpm_desc (header))
+ self.packageDesc.thaw ()
+ else:
+ self.clear_package_desc ()
+ return
+
+ if icon_data[0] == self.RPM:
+ active = self.cbutton.get_active ()
+ if active == TRUE:
+ self.cbutton.set_active (FALSE)
+ else:
+ self.cbutton.set_active (TRUE)
+
+ if icon_data[0] == self.DIR_UP:
+ current_node = icon_data[1].parent
+ if current_node:
+ self.ctree.select (current_node)
+ else:
+ # handle the imaginary root node
+ current_node = self.ctree.base_nodes ()[0]
+ self.ctree.unselect (icon_data[1])
+ self.draw_root_icons ()
+
+ elif icon_data[0] == self.DIR:
+ current_node = icon_data[1]
+ self.ctree.select (current_node)
+ if (current_node.parent):
+ self.ctree.expand_to_depth (current_node.parent, 1)
+ else: return
+
+ if self.ctree.node_is_visible (current_node) != VISIBILITY_FULL:
+ self.ctree.node_moveto (current_node, 0, 0.5, 0.0)
+
+ def select (self, ctree, node, *args):
+ self.clear_package_desc ()
+ self.iconList.freeze ()
+ self.iconList.clear ()
+ self.iconList.append ("/home/devel/msw/i-directory-up.png", "Up")
+ self.iconList.set_icon_data (0, (self.DIR_UP, node))
+ for x in node.children:
+ dirName = ctree.get_node_info (x)[0]
+ pos = self.iconList.append ("/usr/src/mc/gnome/i-directory.png", dirName)
+ self.iconList.set_icon_data (pos, (self.DIR, x))
+
+ try:
+ # this code is wrapped in a generic exception handler since we don't
+ # care if we access a namespace that lacks rpms
+
+ # drop the leading slash off the package namespace
+ for header in self.flat_groups[ctree.node_get_row_data (node)[1:]]:
+ if header.selected:
+ packageIcon = "/home/devel/pnfisher/gnome-package-checked.png"
+ self.cbutton.set_active (TRUE)
+ else:
+ packageIcon = "/usr/src/gnorpm/gnome-package.xpm"
+ self.cbutton.set_active (FALSE)
+
+ pos = self.iconList.append (packageIcon, header[rpm.RPMTAG_NAME])
+ self.iconList.set_icon_data (pos, (self.RPM, header))
+ except:
+ pass
+
+ # make sure that the iconList is reset to show the initial files in a dir,
+ # unless we're rebuilding the icons because one has been selected for install
+ if not self.updatingIcons:
+ self.iconListSW.get_vadjustment ().set_value (0.0)
+ self.iconList.thaw ()
+ self.iconList.show_all ()
+
+
+ def installButtonToggled (self, cbutton, *args):
+ if not self.currentPackage: return
+ oldSelectedStatus = self.currentPackage.selected
+
+ if cbutton.get_active ():
+ self.currentPackage.selected = 1
+ else:
+ self.currentPackage.selected = 0
+
+
+ if oldSelectedStatus != self.currentPackage.selected:
+ self.updatingIcons = TRUE
+ self.ctree.select (self.ctree.selection[0])
+ self.iconList.select_icon (self.currentPackagePos)
+ self.updatingIcons = FALSE
+
+# self.iconList.freeze ()
+# if self.currentPackage.selected:
+# packageIcon = "/home/devel/pnfisher/gnome-package-checked.png"
+# else:
+# packageIcon = "/usr/src/gnorpm/gnome-package.xpm"
+
+# print self.currentPackagePos
+# self.iconList.remove (self.currentPackagePos)
+# print "got here"
+# self.iconList.insert (self.currentPackagePos, packageIcon,
+# self.currentPackage[rpm.RPMTAG_NAME])
+# self.iconList.set_icon_data (self.currentPackagePos, (self.RPM, self.currentPackage))
+
+# self.iconList.thaw ()
+
+
+ def getScreen (self):
+ threads_leave ()
+ self.todo.headerList()
+ threads_enter ()
+
+ self.path_mapping = {}
+ self.ctree = GtkCTree ()
+ self.ctree.set_selection_mode (SELECTION_BROWSE)
+ # Kludge to get around CTree's extremely broken focus behavior
+ self.ctree.unset_flags (CAN_FOCUS)
+
+ if (not self.__dict__.has_key ("open_p")):
+ self.open_p, self.open_b = create_pixmap_from_xpm_d (self.ctree,
+ None, DIRECTORY_OPEN_XPM)
+ self.closed_p, self.closed_b = create_pixmap_from_xpm_d (self.ctree,
+ None, DIRECTORY_CLOSE_XPM)
+
+ groups = {}
+
+ # go through all the headers and grok out the group names, placing
+ # packages in lists in the groups dictionary.
+
+ for key in self.todo.hdList.packages.keys():
+ header = self.todo.hdList.packages[key]
+ if not groups.has_key (header[rpm.RPMTAG_GROUP]):
+ groups[header[rpm.RPMTAG_GROUP]] = []
+ groups[header[rpm.RPMTAG_GROUP]].append (header)
+
+ keys = groups.keys ()
+ keys.sort ()
+ self.flat_groups = groups
+ index = 0
+
+ # now insert the groups into the list, then each group's packages
+ # after sorting the list
+ def cmpHdrName(first, second):
+ if first[rpm.RPMTAG_NAME] < second[rpm.RPMTAG_NAME]:
+ return -1
+ elif first[rpm.RPMTAG_NAME] == second[rpm.RPMTAG_NAME]:
+ return 0
+ return 1
+
+ groups = ()
+ for key in keys:
+ self.flat_groups[key].sort (cmpHdrName)
+ groups = self.merge (groups, split (key, "/"))
+ self.ctree.freeze ()
+ self.build_ctree (groups)
+
+ for base_node in self.ctree.base_nodes ():
+ self.ctree.expand_recursive (base_node)
+ self.ctree.columns_autosize ()
+ for base_node in self.ctree.base_nodes ():
+ self.ctree.collapse_recursive (base_node)
+ self.ctree.thaw ()
+
+ self.ctree.connect ("tree_select_row", self.select)
+ sw = GtkScrolledWindow ()
+ sw.set_border_width (5)
+ sw.set_policy (POLICY_NEVER, POLICY_AUTOMATIC)
+ sw.add (self.ctree)
+ iconHBox = GtkHBox ()
+ iconHBox.pack_start (sw, FALSE)
+
+ self.iconList = GnomeIconList (90)
+ self.iconList.set_selection_mode (SELECTION_MULTIPLE)
+ self.iconList.connect ("select_icon", self.select_icon)
+ self.draw_root_icons ()
+
+ self.iconListSW = GtkScrolledWindow ()
+ self.iconListSW.set_border_width (5)
+ self.iconListSW.set_policy (POLICY_NEVER, POLICY_AUTOMATIC)
+ self.iconListSW.add (self.iconList)
+ self.iconListAdj = self.iconListSW.get_vadjustment ()
+ iconHBox.pack_start (self.iconListSW)
+
+ descVBox = GtkVBox ()
+ descVBox.pack_start (GtkHSeparator (), FALSE, padding=3)
+
+
+ hbox = GtkHBox ()
+ label = GtkLabel ("Name: ")
+ self.packageName = GtkLabel ()
+ self.packageName.set_alignment (0.0, 0.0)
+ hbox.pack_start (label, FALSE, padding=5)
+ hbox.pack_start (self.packageName, FALSE)
+ label = GtkLabel ("Package Details")
+ label.set_alignment (1.0, 1.0)
+ hbox.pack_start (label, padding=5)
+ descVBox.pack_start (hbox, FALSE)
+
+ hbox = GtkHBox ()
+ label = GtkLabel ("Size: ")
+ self.packageSize = GtkLabel ()
+ self.packageSize.set_alignment (0.0, 0.5)
+ hbox.pack_start (label, FALSE, padding=5)
+ hbox.pack_start (self.packageSize, FALSE)
+ align = GtkAlignment (1.0, 0.0)
+ self.cbutton = GtkCheckButton ("Select Package For Installation")
+ self.cbutton.set_sensitive (FALSE)
+ self.cbutton.connect ("toggled", self.installButtonToggled)
+ self.cbutton.children()[0].set_alignment (1.0, 0.5)
+ align.add (self.cbutton)
+ hbox.pack_start (align, padding=5)
+ descVBox.pack_start (hbox, FALSE)
+
+ descSW = GtkScrolledWindow ()
+ descSW.set_border_width (5)
+ descSW.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC)
+
+ self.packageDesc = GtkText ()
+ self.packageDesc.set_word_wrap (TRUE)
+ self.packageDesc.set_line_wrap (TRUE)
+ self.packageDesc.set_editable (FALSE)
+ descSW.add (self.packageDesc)
+ descSW.set_usize (-1, 100)
+
+ descVBox.pack_start (descSW)
+
+# descFrame = GtkFrame ("Package Details")
+# descFrame.set_border_width (5)
+# descFrame.add (descVBox)
+
+ vbox = GtkVBox ()
+ vbox.pack_start (iconHBox)
+ vbox.pack_start (descVBox, FALSE)
+
+ return vbox
+
+class PackageSelectionWindow (InstallWindow):
+ def __init__ (self, ics):
+ InstallWindow.__init__ (self, ics)
+
+ self.todo = ics.getToDo ()
+ ics.setTitle ("Package Group Selection")
+ ics.setNextEnabled (1)
+ ics.setHTML ("<HTML><BODY>Next you must select which package groups to install."
+ "</BODY></HTML>")
+
+ def getNext (self):
+ if self.individualPackages.get_active ():
+ return IndividualPackageSelectionWindow
+ else:
+ return None
+
+ def getScreen (self):
+ threads_leave ()
+ self.todo.headerList ()
+ self.todo.compsList()
+ threads_enter ()
+
+ sw = GtkScrolledWindow ()
+ sw.set_border_width (5)
+ sw.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC)
+
+ box = GtkVBox (FALSE, 10)
+ for comp in self.todo.comps:
+ if not comp.hidden:
+ checkButton = GtkCheckButton (comp.name)
+ checkButton.set_active (comp.selected)
+
+ def toggled (widget, comp):
+ if widget.get_active ():
+ comp.select (0)
+ else:
+ comp.unselect (0)
+
+ checkButton.connect ("toggled", toggled, comp)
+
+ box.pack_start (checkButton)
+
+ sw.add_with_viewport (box)
+
+ vbox = GtkVBox (FALSE, 5)
+ self.individualPackages = GtkCheckButton ("Select individual packages")
+ self.individualPackages.set_active (FALSE)
+ align = GtkAlignment (0.5, 0.5)
+ align.add (self.individualPackages)
+
+ vbox.pack_start (sw, TRUE)
+ vbox.pack_start (align, FALSE)
+
+ return vbox
+
diff --git a/iw/progress.py b/iw/progress.py
new file mode 100644
index 000000000..5a13f32df
--- /dev/null
+++ b/iw/progress.py
@@ -0,0 +1,148 @@
+from gtk import *
+from iw import *
+import string
+import rpm
+import time
+
+class InstallProgressWindow (InstallWindow):
+
+ def __init__ (self, ics):
+ InstallWindow.__init__ (self, ics)
+
+ ics.setTitle ("Installing Packages")
+ ics.setPrevEnabled (0)
+
+ self.numComplete = 0
+ self.sizeComplete = 0
+
+ def setPackageScale (self, amount, total):
+ threads_enter ()
+ self.progress.update (float (amount) / total)
+ threads_leave ()
+
+ def completePackage(self, header):
+ def formatTime(amt):
+ hours = amt / 60 / 60
+ amt = amt % (60 * 60)
+ min = amt / 60
+ amt = amt % 60
+ secs = amt
+
+ return "%01d:%02d.%02d" % (int(hours) ,int(min), int(secs))
+
+ self.numComplete = self.numComplete + 1
+ apply (self.clist.set_text, self.status["completed"]["packages"] + ("%d" % self.numComplete,))
+
+ self.sizeComplete = self.sizeComplete + header[rpm.RPMTAG_SIZE]
+ apply (self.clist.set_text, self.status["completed"]["size"] +
+ ("%d M" % (self.sizeComplete / (1024 * 1024)),))
+
+ apply (self.clist.set_text, self.status["remaining"]["packages"] +
+ ("%d" % (self.numTotal - self.numComplete),))
+
+ apply (self.clist.set_text, self.status["remaining"]["size"] +
+ ("%d M" % ((self.totalSize - self.sizeComplete) / (1024 * 1024)),))
+
+ elapsedTime = time.time() - self.timeStarted
+ apply (self.clist.set_text, self.status["completed"]["time"] + ("%s" % formatTime(elapsedTime),))
+
+ finishTime = (float (self.totalSize) / self.sizeComplete) * elapsedTime
+ apply (self.clist.set_text, self.status["total"]["time"] + ("%s" % formatTime(finishTime),))
+
+ remainingTime = finishTime - elapsedTime
+ apply (self.clist.set_text, self.status["remaining"]["time"] + ("%s" % formatTime(remainingTime),))
+
+ return
+
+# self.clist.set_text ("%d" % self.numComplete,
+# status["completed"]["packages"]["row"],
+# status["completed"]["packages"]["
+
+
+ self.timeCompleteW.setText("%12s" % formatTime(elapsedTime))
+
+ self.timeTotalW.setText("%12s" % formatTime(finishTime))
+
+ def setPackage(self, header):
+ print header[rpm.RPMTAG_SUMMARY]
+ threads_enter ()
+ self.name.set_text (header[rpm.RPMTAG_NAME])
+ self.size.set_text ("%.1f KBytes" % (header[rpm.RPMTAG_SIZE] / 1024.0))
+ self.summary.set_text (header[rpm.RPMTAG_SUMMARY])
+ threads_leave ()
+
+ def setSizes (self, total, totalSize):
+ self.numTotal = total
+ self.totalSize = totalSize
+ self.timeStarted = time.time ()
+
+ apply (self.clist.set_text, self.status["total"]["packages"] + ("%d" % total,))
+
+ apply (self.clist.set_text, self.status["total"]["size"] +
+ ("%d M" % (totalSize / (1024 * 1024)),))
+
+ def getScreen (self):
+ table = GtkTable (3, 3)
+ label = GtkLabel ("Package")
+ label.set_alignment (0.0, 0.0)
+ table.attach (label, 0, 1, 0, 1, FILL, 0)
+ label = GtkLabel (":")
+ table.attach (label, 1, 2, 0, 1, 0, 0, 5)
+ label = GtkLabel (":")
+ table.attach (label, 1, 2, 1, 2, 0, 0, 5)
+ label = GtkLabel (":")
+ label.set_alignment (0.0, 0.0)
+ table.attach (label, 1, 2, 2, 3, 0, FILL | EXPAND, 5)
+ label = GtkLabel ("Size")
+ label.set_alignment (0.0, 0.0)
+ table.attach (label, 0, 1, 1, 2, FILL, 0)
+ label = GtkLabel ("Summary")
+ label.set_alignment (0.0, 0.0)
+ table.attach (label, 0, 1, 2, 3, FILL, FILL | EXPAND)
+
+ self.name = GtkLabel();
+ self.name.set_alignment (0.0, 0.0)
+ self.size = GtkLabel();
+ self.size.set_alignment (0.0, 0.0)
+ self.summary = GtkLabel();
+ self.summary.set_alignment (0.0, 0.0)
+ self.summary.set_line_wrap (TRUE)
+ self.summary.set_text ("\n\n")
+ table.attach(self.name, 2, 3, 0, 1, FILL | EXPAND, 0)
+ table.attach(self.size, 2, 3, 1, 2, FILL | EXPAND, 0)
+ table.attach(self.summary, 2, 3, 2, 3, FILL | EXPAND, FILL | EXPAND)
+
+ vbox = GtkVBox (FALSE, 10)
+ vbox.pack_start (table, FALSE)
+
+ self.progress = GtkProgressBar()
+ vbox.pack_start (self.progress, FALSE)
+
+ self.status = {
+ "total" : { "packages" : (0, 1),
+ "size" : (0, 2),
+ "time" : (0, 3) },
+ "completed" : { "packages" : (1, 1),
+ "size" : (1, 2),
+ "time" : (1, 3) },
+ "remaining" : { "packages" : (2, 1),
+ "size" : (2, 2),
+ "time" : (2, 3) }
+ }
+
+ clist = GtkCList (4, ("Status", "Packages", "Size", "Time"))
+ clist.set_column_justification (0, JUSTIFY_LEFT)
+ clist.set_column_justification (1, JUSTIFY_RIGHT)
+ clist.set_column_justification (2, JUSTIFY_RIGHT)
+ clist.set_column_justification (3, JUSTIFY_RIGHT)
+ clist.append (("Total", "0", "0", "0:00.00"))
+ clist.append (("Completed", "0", "0", "0:00.00"))
+ clist.append (("Remaining", "0", "0", "0:00.00"))
+# clist.set_column_auto_resize (0, TRUE)
+ clist.columns_autosize ()
+ self.clist = clist
+ vbox.pack_start (clist, TRUE)
+
+ self.ics.getInstallInterface ().setPackageProgressWindow (self)
+ return vbox
+
diff --git a/iw/welcome.py b/iw/welcome.py
new file mode 100644
index 000000000..f8a1120e0
--- /dev/null
+++ b/iw/welcome.py
@@ -0,0 +1,38 @@
+from gtk import *
+from iw import *
+
+class WelcomeWindow (InstallWindow):
+
+ def __init__ (self, ics):
+ InstallWindow.__init__ (self, ics)
+
+ ics.setTitle ("Welcome to Red Hat Linux!")
+ ics.setPrevEnabled (0)
+ ics.setNextEnabled (1)
+ ics.setHTML("<HTML><BODY><CENTER><H2>Welcome to<br>Red Hat Linux!</H2></CENTER>"
+ ""
+ "<P>This installation process is outlined in detail in the "
+ "Official Red Hat Linux Installation Guide available from "
+ "Red Hat Software. If you have access to this manual, you "
+ "should read the installation section before continuing.</P><P>"
+ "If you have purchased Official Red Hat Linux, be sure to "
+ "register your purchase through our web site, "
+ "http://www.redhat.com/.</P></BODY></HTML>")
+
+ def getScreen (self):
+ label = GtkLabel("(insert neat logo graphic here)")
+ label.set_line_wrap (TRUE)
+
+ box = GtkVBox (FALSE, 10)
+ box.pack_start (label, TRUE, TRUE, 0)
+
+ try:
+ im = GdkImlib.Image ("shadowman-200.png")
+ im.render ()
+ pix = im.make_pixmap ()
+ box.pack_start (pix, TRUE, TRUE, 0)
+
+ except:
+ print "Unable to load shadowman-200.png"
+
+ return box
diff --git a/iw/xpms.py b/iw/xpms.py
new file mode 100644
index 000000000..b0bd31ea0
--- /dev/null
+++ b/iw/xpms.py
@@ -0,0 +1,195 @@
+DIRECTORY_OPEN_XPM = [ "16 16 34 1",
+" c None",
+". c #000000",
+"+ c #B6BB9A",
+"@ c #9A9D82",
+"# c #9DA285",
+"$ c #858871",
+"% c #A9AC97",
+"& c #90937A",
+"* c #A1A588",
+"= c #8D9178",
+"- c #81846F",
+"; c #696B5A",
+"> c #595B4C",
+", c #313229",
+"' c #868972",
+") c #DBDEC5",
+"! c #DFE2CD",
+"~ c #CED3B2",
+"{ c #505144",
+"] c #606152",
+"^ c #E3E5D4",
+"/ c #C7CDA4",
+"( c #A5AA85",
+"_ c #C3C99E",
+": c #55574A",
+"< c #D6D8C9",
+"[ c #787C61",
+"} c #353535",
+"| c #A0A487",
+"1 c #4D4F44",
+"2 c #D7DBC0",
+"3 c #686B54",
+"4 c #B7BAA3",
+"5 c #8A8F70",
+" ",
+" ",
+" .... ",
+" .+@+@. ",
+" .#$#$#$...... ",
+" .%&*&*&*=-&-;.",
+" ...........>,'.",
+".)!~!~!~!~!~.{].",
+".^/(_(_(_(_(.{:.",
+" .<_(_(_(_(_[.:.",
+" }!|_(_(_(_(_.1.",
+" }2(_(_(_(_(3..",
+" .4(5(5(5(5(5..",
+" ............ ",
+" ",
+" " ]
+
+DIRECTORY_CLOSE_XPM = [ "16 16 28 1",
+" c None",
+". c #000000",
+"+ c #B6BB9A",
+"@ c #9A9D82",
+"# c #9DA285",
+"$ c #858871",
+"% c #E8EADF",
+"& c #DDDFC8",
+"* c #ECEDE2",
+"= c #C4C6B3",
+"- c #D2D3CA",
+"; c #D6DABF",
+"> c #C0C4A7",
+", c #CDD2AD",
+"' c #B8BC9D",
+") c #B2B798",
+"! c #A3A78C",
+"~ c #868972",
+"{ c #E3E5D4",
+"] c #7A7B68",
+"^ c #6E6F60",
+"/ c #A6AB8E",
+"( c #94987F",
+"_ c #B1B596",
+": c #94967D",
+"< c #626556",
+"[ c #D2D7B6",
+"} c #53554A",
+" ",
+" ",
+" .... ",
+" .+@+@. ",
+" .#$#$#$...... ",
+" .%&*&*&%*=-;>.",
+" .;+,+,+,')!+~.",
+" .{,+,+,))!+!].",
+" .;+,+,)+!+!!^.",
+" .{,+,)+!+!/(^.",
+" .;+,_+!+!!(:<.",
+" .{,_+!+!!::~<.",
+" .[]~]:]~]^<<}.",
+" ............ ",
+" ",
+" " ]
+
+OLD_DIRECTORY_CLOSE_XPM = [ "16 16 28 1",
+" c None",
+". c #000000",
+"+ c #C4B893",
+"@ c #A59A7C",
+"# c #AAA07F",
+"$ c #8F866B",
+"% c #EEEADC",
+"& c #E6DCC3",
+"* c #F1ECE0",
+"= c #CCC4AF",
+"- c #D7D3C8",
+"; c #E2D8B9",
+"> c #CBC0A1",
+", c #DBCDA5",
+"' c #C5B996",
+") c #C0B591",
+"! c #AFA586",
+"~ c #8F866D",
+"{ c #EAE4D0",
+"] c #807764",
+"^ c #746D5C",
+"/ c #B3A988",
+"( c #9F9679",
+"_ c #BDB18F",
+": c #9E9377",
+"< c #696454",
+"[ c #DFD4B0",
+"} c #585448",
+" ",
+" ",
+" .... ",
+" .+@+@. ",
+" .#$#$#$...... ",
+" .%&*&*&%*=-;>.",
+" .;+,+,+,')!+~.",
+" .{,+,+,))!+!].",
+" .;+,+,)+!+!!^.",
+" .{,+,)+!+!/(^.",
+" .;+,_+!+!!(:<.",
+" .{,_+!+!!::~<.",
+" .[]~]:]~]^<<}.",
+" ............ ",
+" ",
+" " ]
+
+OLD_DIRECTORY_OPEN_XPM = [ "16 16 34 1",
+" c None",
+". c #000000",
+"+ c #C4B893",
+"@ c #A59A7C",
+"# c #AAA07F",
+"$ c #8F866B",
+"% c #B3AB92",
+"& c #9B9174",
+"* c #ADA282",
+"= c #988F72",
+"- c #8A826A",
+"; c #716A56",
+"> c #605A48",
+", c #353128",
+"' c #8F866D",
+") c #E5DBC0",
+"! c #E8E0C9",
+"~ c #DCD0AA",
+"{ c #565041",
+"] c #655E4F",
+"^ c #EAE4D0",
+"/ c #D7C89C",
+"( c #B3A57D",
+"_ c #D4C494",
+": c #5B5648",
+"< c #DCD7C6",
+"[ c #83795B",
+"} c #353535",
+"| c #ACA181",
+"1 c #534F42",
+"2 c #E2D9BB",
+"3 c #72694F",
+"4 c #C0B79E",
+"5 c #978C69",
+" ",
+" ",
+" .... ",
+" .+@+@. ",
+" .#$#$#$...... ",
+" .%&*&*&*=-&-;.",
+" ...........>,'.",
+".)!~!~!~!~!~.{].",
+".^/(_(_(_(_(.{:.",
+" .<_(_(_(_(_[.:.",
+" }!|_(_(_(_(_.1.",
+" }2(_(_(_(_(3..",
+" .4(5(5(5(5(5..",
+" ............ ",
+" ",
+" " ]