from iw import *
from gtk import *
from gui import _
from xpms import SMALL_CHECK
import GdkImlib

class LiloWindow (InstallWindow):
   foo = GdkImlib.create_image_from_xpm (SMALL_CHECK)
   foo.render()
   checkMark = foo.make_pixmap()
   del foo

   def __init__ (self, ics):
       InstallWindow.__init__ (self, ics)

       ics.readHTML ("lilo")

       ics.setTitle (_("Lilo Configuration"))
       ics.setNextEnabled (1)
       self.type = None
       self.bootdisk = None
       self.lilo = None

   def getNext (self):
       # XXX
       if not self.bootdisk: return None

       if self.bootdisk.get_active ():
           self.todo.bootdisk = 1
       else:
           self.todo.bootdisk = 0

       if self.lilo.get_active ():
           self.todo.setLiloLocation (None)
       else:
           if self.mbr.get_active ():
               self.todo.setLiloLocation ("mbr")
           else:
               self.todo.setLiloLocation ("partition")

       self.todo.setLiloImages(self.images)

   def typeName(self, type):
       if (type == 2):
           return "Linux Native"
       elif (type == 1):
           return "DOS/Windows"
       elif (type == 4):
           return "OS/2 / Windows NT"
       else:
           return "Other"

   def toggled (self, widget, *args):
       if widget.get_active ():
           state = FALSE
       else:
           state = TRUE

       for n in [self.radioBox, self.editBox, self.imageList ]:
           n.set_sensitive (state)

   def labelUpdated(self, *args):
       index = self.imageList.selection[0]
       device = self.imageList.get_text(index, 1)

       label = self.labelEntry.get_text()
       self.imageList.set_text(index, 3, label)

       if label:
           self.defaultCheck.set_sensitive (TRUE)
       else:
           self.defaultCheck.set_sensitive (FALSE)

   def defaultUpdated(self, *args):
       if self.ignoreSignals: return

       index = self.imageList.selection[0]

       if self.defaultCheck.get_active():
           if self.default != None:
               self.imageList.set_text(self.default, 0, "")

           self.imageList.set_pixmap(index, 0, self.checkMark)
           self.default = index
       else:
           self.imageList.set_text(index, 0, "")
           self.default = None

   def labelSelected(self, *args):
       index = self.imageList.selection[0]
       device = self.imageList.get_text(index, 1)
       label = self.imageList.get_text(index, 3)

       self.deviceLabel.set_text(_("Partition") + ": " + device)
       device = device[5:]

       type = self.images[device][1]

       self.typeLabel.set_text(_("Type") + ":" + self.typeName(type))
       self.labelEntry.set_text(label)

       if not label:
           self.defaultCheck.set_sensitive (FALSE)

       self.ignoreSignals = 1
       if index == self.default:
           self.defaultCheck.set_active(1)
       else:
           self.defaultCheck.set_active(0)
       self.ignoreSignals = 0

   def getScreen (self):
       self.images = self.todo.getLiloImages()
       self.ignoreSignals = 0

       if '/' not in self.todo.mounts.keys (): return None
       (bootpart, boothd) = self.todo.getLiloOptions()

       format = "/dev/%s"

       self.radioBox = GtkTable(2, 6)
       self.radioBox.set_border_width (5)

       spacer = GtkLabel("")
       spacer.set_usize(10, 1)
       self.radioBox.attach(spacer, 0, 1, 2, 4, FALSE)

       label = GtkLabel(_("Install LILO boot record on:"))
       label.set_alignment(0.0, 0.5)
       self.radioBox.attach(label, 0, 2, 1, 2)

       self.mbr = GtkRadioButton(None,
           ("/dev/%s %s" % (boothd, _("Master Boot Record (MBR)"))))
       self.radioBox.attach(self.mbr, 1, 2, 2, 3)
       part = GtkRadioButton(self.mbr,
           ("/dev/%s %s" % (bootpart,
               _("First sector of boot partition"))))
       self.radioBox.attach(part, 1, 2, 3, 4)

       self.linearCheck = GtkCheckButton(
           _("Use linear mode (needed for some SCSI drives)"))
       self.radioBox.attach(self.linearCheck, 0, 2, 4, 5)

       label = GtkLabel(_("Kernel parameters") + ":")
       label.set_alignment(0.0, 0.5)
       self.appendEntry = GtkEntry(15)
       box = GtkHBox(FALSE, 5)
       box.pack_start(label)
       box.pack_start(self.appendEntry)
       alignment = GtkAlignment()
       alignment.set(0.0, 0.5, 0, 1.0)
       alignment.add(box)
       self.radioBox.attach(alignment, 0, 2, 5, 6)

       box = GtkVBox (FALSE, 0)

       optionBox = GtkVBox (FALSE, 5)
       optionBox.set_border_width (5)
       self.bootdisk = GtkCheckButton (_("Create boot disk"))
       self.bootdisk.set_active (TRUE)
       optionBox.pack_start (self.bootdisk)

       self.lilo = GtkCheckButton (_("Do not install LILO"))
       self.lilo.set_active (FALSE)
       self.lilo.connect ("toggled", self.toggled)
       optionBox.pack_start (self.lilo, FALSE)

       box.pack_start (optionBox, FALSE)

       box.pack_start (GtkHSeparator (), FALSE)
       box.pack_start (self.radioBox, FALSE)

       self.imageList = GtkCList (4,
           ( _("Default"), _("Device"), _("Partition type"), _("Boot label")))
       self.imageList.connect("select_row", self.labelSelected)

       sortedKeys = self.images.keys()
       sortedKeys.sort()

       self.default = None
       count = 0
       for n in sortedKeys:
           (label, type) = self.images[n]
           self.imageList.append(("", "/dev/" + n, self.typeName(type),
                                   label))
           if (label == "linux"):
               self.default = count
               self.imageList.set_pixmap(count, 0, self.checkMark)
           count = count + 1

       self.imageList.columns_autosize ()
       self.imageList.column_title_passive (1)
       self.imageList.set_border_width (5)
       self.imageList.set_column_justification(2, JUSTIFY_CENTER)

       self.deviceLabel = GtkLabel(_("Partition") + ":")
       self.typeLabel = GtkLabel(_("Type") + ":")

       tempBox = GtkHBox(TRUE)
       self.deviceLabel.set_alignment(0.0, 0.0)
       self.typeLabel.set_alignment(0.0, 0.0)
       tempBox.pack_start(self.deviceLabel, FALSE)
       tempBox.pack_start(self.typeLabel, FALSE)
       self.defaultCheck = GtkCheckButton("Default boot image")
       self.defaultCheck.connect("toggled", self.defaultUpdated)

       # Alliteration!
       self.labelLabel = GtkLabel(_("Boot label") + ":")
       self.labelEntry = GtkEntry(15)
       self.labelEntry.connect("changed", self.labelUpdated)

       tempBox2 = GtkHBox(FALSE, 5)
       self.labelLabel.set_alignment(0.0, 0.5)
       tempBox2.pack_start(self.labelLabel, FALSE)
       tempBox2.pack_start(self.labelEntry, FALSE)

       self.editBox = GtkVBox ()
       self.editBox.pack_start (tempBox, FALSE)
       self.editBox.pack_start (self.defaultCheck, FALSE)
       self.editBox.pack_start (tempBox2, FALSE)
       self.editBox.set_border_width (5)

       box.pack_start (GtkHSeparator (), FALSE)
       box.pack_start (self.editBox, FALSE)

       self.imageList.set_selection_mode (SELECTION_BROWSE)

       sw = GtkScrolledWindow ()
       sw.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC)
       sw.add (self.imageList)
       box.pack_start (sw, TRUE)

       return box