## date_gui - Program creates a user interface 
##             that allows the system time, system date,
##             time zone, and ntpd configuration to be easily set
## Copyright (C) 2001, 2002, 2003 Red Hat, Inc.
## Copyright (C) 2001, 2002, 2003 Brent Fox <bfox@redhat.com>
##                                Tammy Fox <tfox@redhat.com>

## 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 gtk
import gobject
import time
import string
import socket
import mainWindow
import Clock
##
## I18N
## 
from rhpl.translate import _, N_
import rhpl.translate as translate
translate.textdomain ("system-config-date")

class datePage:
    def __init__(self, dateBackend):
        self.mainVBox = gtk.VBox(gtk.FALSE, 5)

        self.ntpServers = dateBackend.readServersFile()

        self.flag = gtk.FALSE
        times = mainWindow.dateBackend.getDate()

        self.dateFrame = gtk.Frame(_("Date"))
        self.dateFrame.set_border_width(4)
        self.timeFrame = gtk.Frame(_("Time"))
        self.timeFrame.set_border_width(4)

        hbox = gtk.HBox(gtk.TRUE, 20)
        self.mainVBox.pack_start(hbox, gtk.FALSE)

        #-----------------Calendar----------#
        self.cal = gtk.Calendar()
        self.cal.select_month(times[1]-1, times[0])
        self.cal.select_day(times[2])

        #-----------------Clock-------------#
        self.clock = Clock.Clock()
        gtk.timeout_add(1000, self.clock.updateTime)

        table = gtk.Table(3, 2)
        table.set_border_width(10)
        table.set_row_spacings(6)
        table.set_col_spacings(6)
        label = gtk.Label(_("Current Time : "))
        label.set_alignment(1.0, 0.5)
        table.attach(label, 0, 1, 0, 1)
        table.attach(self.clock.launch(), 1, 2, 0, 1)

        label = gtk.Label(_("Hour : "))
        label.set_alignment(1.0, 0.5)
        table.attach(label, 0, 1, 1, 2)
        self.hourEntry = gtk.SpinButton()
        self.hourEntry.set_digits(0)
        self.hourEntry.connect("insert-text", self.filter)
        hourAdj = gtk.Adjustment(times[3], 0, 24, 1)
        self.hourEntry.set_adjustment(hourAdj)
        self.hourEntry.set_value(times[3])
        table.attach(self.hourEntry, 1, 2, 1, 2)

        label = gtk.Label(_("Minute : "))
        label.set_alignment(1.0, 0.5)
        table.attach(label, 0, 1, 2, 3)
        self.minEntry = gtk.SpinButton()
        self.minEntry.set_digits(0)
        self.minEntry.connect("insert-text", self.filter)
        self.minEntry.set_increments(1.0, 5.0)
        minAdj = gtk.Adjustment(times[4], 0, 59, 1)
        self.minEntry.set_adjustment(minAdj)
        self.minEntry.set_value(times[4])
        table.attach(self.minEntry, 1, 2, 2, 3)

        label = gtk.Label(_("Second : "))
        label.set_alignment(1.0, 0.5)
        table.attach(label, 0, 1, 3, 4)
        self.secEntry = gtk.SpinButton()
        self.secEntry.set_digits(0)
        self.secEntry.connect("insert-text", self.filter)
        secAdj = gtk.Adjustment(times[5], 0, 60, 1)
        self.secEntry.set_adjustment(secAdj)
        self.secEntry.set_value(times[5])
        table.attach(self.secEntry, 1, 2, 3, 4)

        #----------------Packing details----#
        self.dateFrame.add(self.cal)
        self.timeFrame.add(table)

        #----------------Timeserver frame---#
        self.timeserverFrame = gtk.Frame(_("Network Time Protocol"))
        self.timeserverFrame.set_border_width(6)
        self.timeserverFrame.set_size_request(375, 50)

        ts_vbox = gtk.VBox(gtk.FALSE, 10)
        ts_hbox = gtk.HBox(gtk.FALSE, 10)
        self.timeserverFrame.add(ts_vbox)

        label = gtk.Label(_("Your computer can synchronize its clock with "
                         "a remote time server using the Network Time Protocol."))

        label.set_line_wrap(gtk.TRUE)
        label.set_size_request(420, -1)
        label.set_alignment(0.1, 0.5)

        ts_vbox.pack_start(label, gtk.FALSE, 10)

        self.ntpCheckButton = gtk.CheckButton(_("_Enable Network Time Protocol"))

        a = gtk.Alignment(0.1, 0.3)
        a.add(self.ntpCheckButton)

        ts_vbox.pack_start(a, gtk.FALSE)

        label = gtk.Label(_("_Server:  "))
        label.set_use_underline(gtk.TRUE)
        self.ntpCombo = gtk.Combo()
        label.set_mnemonic_widget(self.ntpCombo.entry)

        self.ntpCombo.set_sensitive(gtk.FALSE)
        self.ntpCombo.entry.set_text("")

        self.ntpCheckButton.connect("clicked", self.ntpCheckButtonClicked)

        #Find out if ntpd is currently running.  If so, activate checkbox
        ntpStatus = mainWindow.dateBackend.isNtpRunning()
        if ntpStatus == 1:            
            self.ntpCheckButton.set_active(gtk.TRUE)
        elif ntpStatus == None:
            text = (_("The NTP initscript (%s) does not seem to be functioning "
                      "properly.  Try running 'rpm -V ntp' to see if the initscript "
                      "has been modified.  system-config-date will exit now.")
                      % '/etc/rc.d/init.d/ntpd')
            dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, text)

            dlg.set_title(_("Error"))
            dlg.set_default_size(100, 100)
            dlg.set_position (gtk.WIN_POS_CENTER_ON_PARENT)
            dlg.set_border_width(2)
            dlg.set_modal(gtk.TRUE)
            rc = dlg.run()
            dlg.destroy()

            import os
            os._exit(1)

        ntpServerIP = mainWindow.dateBackend.getNtpServer()

        if ntpServerIP:
            try:
                ntpServer = socket.gethostbyaddr(ntpServerIP)[0]
            except:
                ntpServer = ntpServerIP
                pass
        else:
            ntpServer = None

        if ntpServer:
            if ntpServer in self.ntpServers:
                #If an NTP server is already specified and is already in the list, then sort and set_popdown
                self.ntpServers.sort()
                self.ntpCombo.set_popdown_strings(self.ntpServers)
                self.ntpCombo.entry.set_text(ntpServer)
            else:
                #If an NTP server is already specified but not in the list, then add it, sort, and set_popdown
                self.ntpServers.append(ntpServer)
                self.ntpServers.sort()
                self.ntpCombo.set_popdown_strings(self.ntpServers)
                self.ntpCombo.entry.set_text(ntpServer)
        else:
            #There's no current NTP server, so just present our default list
            self.ntpCombo.set_popdown_strings(self.ntpServers)
            self.ntpCombo.entry.set_text("")

        ts_hbox.pack_start(label, gtk.FALSE)
        ts_hbox.pack_start(self.ntpCombo, gtk.TRUE, gtk.TRUE)

        a = gtk.Alignment(0.3, 0.5, 0.5, 0)
        a.add(ts_hbox)
        
        ts_vbox.pack_start(a, gtk.FALSE)
        
        hbox.pack_start(self.dateFrame, gtk.FALSE, 10)
        hbox.pack_start(self.timeFrame, gtk.TRUE, 10) 
        self.mainVBox.pack_start(self.timeserverFrame, gtk.TRUE)

        self.hourEntry.connect("changed", self.changed)
        self.minEntry.connect("changed", self.changed)
        self.secEntry.connect("changed", self.changed)

    def filter(self, widget, text, len, pos):
        if len != 1:
            return

        # first character case:
        if not widget.get_text ():
            if (text[0] not in string.digits):
                widget.emit_stop_by_name ("insert-text")

        # everything else:
        if (text[0] not in string.digits):
            widget.emit_stop_by_name ("insert-text")

    def getDate(self):
        return self.cal.get_date()

    def getTime(self):
        if self.flag == gtk.TRUE:
            hour = self.hourEntry.get_text()
            min = self.minEntry.get_text()
            sec = self.secEntry.get_text()

            return hour, min, sec
        else:
            hour, min, sec = self.clock.getTime()
            return hour, min, sec

    def updateSpinButtons(self):
        hour, min, sec = self.clock.getTime()
        self.hourEntry.set_value(int(hour))
        self.minEntry.set_value(int(min))
        self.secEntry.set_value(int(sec))

    def getNtpEnabled(self):
        return self.ntpCheckButton.get_active()

    def getTimeServer(self):
        return self.ntpCombo.entry.get_text()

    def getNtpServerList(self):
        if self.ntpCombo.entry.get_text() not in self.ntpServers:
            self.ntpServers.append(self.ntpCombo.entry.get_text())
        return self.ntpServers

    def ntpCheckButtonClicked(self, args):
        self.ntpCombo.set_sensitive(self.ntpCheckButton.get_active())
        self.dateFrame.set_sensitive(not self.ntpCheckButton.get_active())
        self.timeFrame.set_sensitive(not self.ntpCheckButton.get_active())
        
    def changed(self, *args):
        self.flag = gtk.TRUE

    def getVBox(self):
        return self.mainVBox

