#
# upgrade_swap_gui.py: dialog for adding swap files for 2.4
#
# Mike Fulbright <msf@redhat.com>
#
# Copyright 2001 Red Hat, Inc.
#
# This software may be freely redistributed under the terms of the GNU
# library public license.
#
# You should have received a copy of the GNU Library Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

import string
import isys 
import iutil
import upgrade
import gui
from gnome.ui import *
from gtk import *
from iw_gui import *
from package_gui import queryUpgradeContinue
from translate import _, N_
from log import log
from flags import flags

class UpgradeSwapWindow (InstallWindow):		
    windowTitle = N_("Upgrade Swap Partition")
    htmlTag = "upswapfile"

    def getNext (self):
        #-If the user doesn't need to add swap, we don't do anything
        if not self.neededSwap:
            return None

        if self.option2.get_active():
            rc = self.warning()

            if rc == 0:
                raise gui.StayOnScreen
            else:
                return None

        data = self.clist.get_row_data(self.row)
        if data:
            mnt, part, size = data
            val = int(self.entry.get_text())
            size = int(size)
            val = int(val)
        else:
            val = 0
            
        if val > 2000 or val < 1:
            rc = self.swapWrongSize()
            raise gui.StayOnScreen

        elif (val+16) > size:
            rc = self.swapTooBig()
            raise gui.StayOnScreen            

        else:
            if flags.setupFilesystems:
                upgrade.createSwapFile(self.instPath, self.fsset, mnt, val)
            self.dispatch.skipStep("addswap", 1)
                
        return None

    def toggle (self, data):
        self.swapbox.set_sensitive(self.option1.get_active())

    def clist_cb(self, clist, row, col, data):
        self.row = row
    
    def getScreen (self, intf, fsset, instPath, swapInfo, dispatch):
        self.neededSwap = 0
        self.fsset = fsset
        self.instPath = instPath
        self.intf = intf
        self.dispatch = dispatch
        
        rc = swapInfo

        self.neededSwap = 1
        self.row = 0
        box = GtkVBox (FALSE, 5)
        box.set_border_width (5)

	label = GtkLabel (_("The 2.4 kernel needs significantly more "
                            "swap than older kernels, as much as twice "
                            "as much swap space as RAM on the system.  "
                            "You currently have %dMB of swap configured, but "
                            "you may create additional swap space on one of "
                            "your file systems now.")
                          % (iutil.swapAmount() / 1024) +
                          _("\n\nThe installer has detected %s MB of RAM.\n") %
                          (iutil.memInstalled(corrected = 1)/1024))

        label.set_alignment (0.5, 0.0)
        label.set_usize(400, 100)
        label.set_line_wrap (TRUE)
        box.pack_start(label, FALSE)

        hs = GtkHSeparator()
        box.pack_start(hs, FALSE)

        self.option1 = GtkRadioButton(None,
                                      (_("I want to create a swap file")))
        box.pack_start(self.option1, FALSE)

        (fsList, suggSize, suggMntPoint) = rc

        self.swapbox = GtkVBox(FALSE, 5)
        box.pack_start(self.swapbox, FALSE)
        

        label = GtkLabel (_("Select the partition to put the swap file on:"))
        a = GtkAlignment(0.2, 0.5)
        a.add(label)
        self.swapbox.pack_start(a, FALSE)

        titles = ((_("Mount Point")), (_("Partition")), (_("Free Space (MB)")))
        self.clist = GtkCList(3, titles)
        self.clist.connect("select-row", self.clist_cb)
        a = GtkAlignment(0.5, 0.5)
        a.add(self.clist)
        self.swapbox.pack_start(a, FALSE, TRUE, 10)

        count = 0
        for (mnt, part, size) in fsList:
            self.clist.append([mnt, part, str(size)])
            self.clist.set_row_data(count, [mnt, part, size])
            count = count + 1

        self.clist.select_row(0, 0)

        label = GtkLabel (_("It is recommended that your swap file be at "
                            "least %d MB.  Please enter a size for the swap "
                            "file:") % suggSize)
        label.set_usize(400, 40)
        label.set_line_wrap (TRUE)
        a = GtkAlignment(0.5, 0.5)
        a.add(label)
        self.swapbox.pack_start(a, FALSE, TRUE, 10)


        hbox = GtkHBox(FALSE, 5)
        a = GtkAlignment(0.4, 0.5)
        a.add(hbox)
        self.swapbox.pack_start(a, FALSE)

        label = GtkLabel (_("Swap file size (MB):"))
        hbox.pack_start(label, FALSE)

        self.entry = GtkEntry(4)
        self.entry.set_usize(40, 25)
        self.entry.set_text(str(suggSize))
        hbox.pack_start(self.entry, FALSE, TRUE, 10)

        self.option2 = GtkRadioButton(self.option1,
                                      (_("I don't want to create a swap "
                                         "file")))
        box.pack_start(self.option2, FALSE, TRUE, 20)

        self.option1.connect("toggled", self.toggle)
        return box


    def warning(self):
        rc = self.intf.messageWindow(_("Warning"), 
                    _("It is stongly recommended that you create a swap "
                      "file.  Failure to do so could cause the installer "
                      "to abort abnormally.  Are you sure that you wish "
                      "to continue?"), type = "yesno")
        return rc

    def swapWrongSize(self):
        rc = self.intf.messageWindow(_("Warning"), 
                    _("The swap file must be between 1 and 2000 MB in size."),
                       type = "okcancel")
        return rc

    def swapTooBig(self):
        
        rc = self.intf.messageWindow(_("Warning"), 
                    _("There is not enough space on the device you "
			  "selected for the swap partition."),
                       type = "okcancel")
        return rc
