182 lines
6.6 KiB
Python
182 lines
6.6 KiB
Python
#
|
|
# timezone_gui.py: gui timezone selection.
|
|
#
|
|
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
|
|
# All rights reserved.
|
|
#
|
|
# 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, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
import string
|
|
import gtk
|
|
import gtk.glade
|
|
import gtk.gdk
|
|
import gobject
|
|
from scdate.core import zonetab
|
|
import pango
|
|
import sys
|
|
|
|
from timezone_map_gui import TimezoneMap, Enum
|
|
from iw_gui import *
|
|
from booty.bootloaderInfo import dosFilesystems
|
|
from bootloader import hasWindows
|
|
|
|
from constants import *
|
|
import gettext
|
|
_ = lambda x: gettext.ldgettext("anaconda", x)
|
|
|
|
try:
|
|
import gnomecanvas
|
|
except ImportError:
|
|
import gnome.canvas as gnomecanvas
|
|
|
|
class TimezoneWindow(InstallWindow):
|
|
def __init__(self, ics):
|
|
InstallWindow.__init__(self, ics)
|
|
|
|
# Need to set the custom handler before loading the glade file or
|
|
# this won't work.
|
|
gtk.glade.set_custom_handler(self.custom_widget_handler)
|
|
|
|
# Set the default now. We'll fix it for real in getScreen.
|
|
self.default = "America/New York"
|
|
|
|
self.zonetab = zonetab.ZoneTab()
|
|
|
|
# Pull in a bunch of widgets.
|
|
self.xml = gtk.glade.XML("/usr/share/system-config-date/system-config-date.glade", domain="system-config-date")
|
|
self.vbox = self.xml.get_widget("tz_vbox")
|
|
self.utcCheckbox = self.xml.get_widget("utc_check")
|
|
self.notebook = self.xml.get_widget("notebook")
|
|
|
|
ics.setTitle(_("Time Zone Selection"))
|
|
ics.setNextEnabled(1)
|
|
|
|
def custom_widget_handler(self, xml, function_name, widget_name, str1, str2,
|
|
int1, int2):
|
|
if hasattr(self, function_name):
|
|
handler = getattr(self, function_name)
|
|
return handler(str1, str2, int1, int2)
|
|
else:
|
|
# Lame.
|
|
return gtk.Label()
|
|
|
|
def timezone_widget_create (self, str1, str2, int1, int2):
|
|
mappath = "/usr/share/system-config-date/pixmaps/map1440.png"
|
|
|
|
self.tz = AnacondaTZMap(self.zonetab, self.default, map=mappath,
|
|
viewportWidth=480)
|
|
self.tz.show_all()
|
|
return self.tz
|
|
|
|
def getNext(self):
|
|
newzone = self.tz.getCurrent().tz
|
|
self.timezone.setTimezoneInfo(newzone.replace(" ", "_"), self.utcCheckbox.get_active())
|
|
return None
|
|
|
|
# TimezoneWindow tag="timezone"
|
|
def getScreen(self, anaconda):
|
|
self.intf = anaconda.intf
|
|
self.timezone = anaconda.timezone
|
|
(self.default, asUTC) = self.timezone.getTimezoneInfo()
|
|
|
|
if not self.default:
|
|
self.default = anaconda.instLanguage.getDefaultTimeZone(anaconda.rootPath)
|
|
asUTC = 0
|
|
|
|
if (string.find(self.default, "UTC") != -1):
|
|
self.default = "America/New_York"
|
|
|
|
self.default = self.default.replace("_", " ")
|
|
|
|
# Now fix the default we set when we made the timezone map widget.
|
|
self.tz.setCurrent(self.zonetab.findEntryByTZ(self.default))
|
|
self.utcCheckbox.set_active(asUTC)
|
|
|
|
if not anaconda.ksdata:
|
|
self.utcCheckbox.set_active(not hasWindows(anaconda.bootloader))
|
|
|
|
self.notebook.remove(self.vbox)
|
|
return self.vbox
|
|
|
|
class AnacondaTZMap(TimezoneMap):
|
|
def __init__(self, zonetab, default, map="", viewportWidth=480):
|
|
TimezoneMap.__init__(self, zonetab, default, map=map, viewportWidth=viewportWidth)
|
|
self.columns = Enum("TRANSLATED", "TZ", "ENTRY")
|
|
|
|
def status_bar_init(self):
|
|
self.status = None
|
|
|
|
def load_entries (self, root):
|
|
iter = self.tzStore.get_iter_first()
|
|
|
|
for entry in self.zonetab.getEntries():
|
|
if entry.lat is not None and entry.long is not None:
|
|
x, y = self.map2canvas(entry.lat, entry.long)
|
|
marker = root.add(gnomecanvas.CanvasText, x=x, y=y,
|
|
text=u'\u00B7', fill_color='yellow',
|
|
anchor=gtk.ANCHOR_CENTER,
|
|
weight=pango.WEIGHT_BOLD)
|
|
self.markers[entry.tz] = marker
|
|
|
|
if entry.tz == "America/New York":
|
|
# In case the /etc/sysconfig/clock is messed up, use New
|
|
# York as the default.
|
|
self.fallbackEntry = entry
|
|
|
|
iter = self.tzStore.insert_after(iter, [gettext.ldgettext("system-config-date", entry.tz), entry.tz, entry])
|
|
|
|
def timezone_list_init (self, default):
|
|
self.hbox = gtk.HBox()
|
|
self.tzStore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING,
|
|
gobject.TYPE_PYOBJECT)
|
|
|
|
root = self.canvas.root()
|
|
|
|
self.load_entries(root)
|
|
|
|
# Add the ListStore to the sorted model after the list has been
|
|
# populated, since otherwise we end up resorting on every addition.
|
|
self.tzSorted = gtk.TreeModelSort(self.tzStore)
|
|
self.tzSorted.set_sort_column_id(0, gtk.SORT_ASCENDING)
|
|
self.tzCombo = gtk.ComboBox(model=self.tzSorted)
|
|
cell = gtk.CellRendererText()
|
|
self.tzCombo.pack_start(cell, True)
|
|
self.tzCombo.add_attribute(cell, 'text', 0)
|
|
self.tzCombo.connect("changed", self.selectionChanged)
|
|
self.hbox.pack_start(self.tzCombo, False, False)
|
|
|
|
self.pack_start(self.hbox, False, False)
|
|
|
|
def selectionChanged(self, widget, *args):
|
|
iter = widget.get_active_iter()
|
|
if iter is None:
|
|
return
|
|
entry = widget.get_model().get_value(iter, self.columns.ENTRY)
|
|
if entry:
|
|
self.setCurrent (entry, skipList=1)
|
|
if entry.long != None and entry.lat != None:
|
|
self.move_to (entry.long, entry.lat)
|
|
|
|
def updateTimezoneList(self):
|
|
# Find the currently selected item in the combo box and update both
|
|
# the combo and the comment label.
|
|
iter = self.tzCombo.get_model().get_iter_first()
|
|
while iter:
|
|
if self.tzCombo.get_model().get_value(iter, 1) == self.currentEntry.tz:
|
|
self.tzCombo.set_active_iter(iter)
|
|
break
|
|
|
|
iter = self.tzCombo.get_model().iter_next(iter)
|