#
# keyboard_gui.py: keyboard configuration gui dialog
#
# 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 isys
import iutil
import string
import xkb
from iw_gui import *
from gtk import *
from kbd import Keyboard
from log import log
from flags import flags
from translate import _, N_

class KeyboardWindow (InstallWindow):
    windowTitle = N_("Keyboard Configuration")
    htmlTag = "kybd"

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

	self.kb = xkb.XKB()
	self.rules = self.kb.getRules()
	rules = self.kb.getRulesBase()
	self.rulesbase = rules[string.rfind(rules, "/")+1:]

    def getNext (self):
        if self.flags.setupFilesystems:
            self.kb.setRule(self.model, self.layout, self.variant,
                             "complete")

	if (self.x != (None, None)):
            self.x.setKeyboard(self.rulesbase, self.model,
                            self.layout, self.variant, "")

        self.kbd.setfromx(self.model, self.layout, self.variant)
        self.kbd.beenset = 1


        try:
            isys.loadKeymap(self.kbd.get())
        except:
            log("failed to load keymap")
            
        return None

    def select_row(self, clist, row, col, event):
	self.model = self.modelList.get_row_data(self.modelList.selection[0])
	self.layout = self.layoutList.get_row_data(self.layoutList.selection[0])
	self.variant = self.variantList.get_row_data(self.variantList.selection[0])

    def setMap(self, data):
        if self.flags.setupFilesystems:
            self.kb.setRule(self.model, self.layout, self.variant, "complete")

    # KeyboardWindow tag="kybd"
    def getScreen(self, instLang, kbd, x):
	self.flags = flags
	self.kbd = kbd
        self.x = x

	if (x == (None, None)):
            rules, model, layout, variant, options = Keyboard().getXKB()
        else:
            rules, model, layout, variant, options = x.getKeyboard()
        self.model = model
        self.layout = layout
        self.variant = variant

        if not self.kbd.beenset:
            default = instLang.getDefaultKeyboard()
            
            if Keyboard.console2x.has_key(default):
                self.model = Keyboard.console2x[default][0]
                self.layout = Keyboard.console2x[default][1]
                if flags.setupFilesystems:
                    self.kb.setRule(self.model, self.layout, self.variant, 
				     "complete")
		elif kbd.type == "Sun":
		    self.model = kbd.model
		    self.layout = kbd.layout


	box = GtkVBox(FALSE, 5)
        hbox = GtkHBox(FALSE, 5)
        pix = self.ics.readPixmap("gnome-keyboard.png")
        if pix:
            a = GtkAlignment()
            a.add(pix)
            a.set(0.0, 0.0, 0.0, 0.0)
            hbox.pack_start(a, FALSE)

        label = GtkLabel(_("Which model keyboard is attached to the computer?"))
        label.set_line_wrap(TRUE)
        label.set_usize(350, -1)
        hbox.pack_start(label, FALSE)
        box.pack_start(hbox, FALSE)

	def moveto(widget, *args):
            widget.moveto(widget.selection[0], 0, 0.5, 0.5)

	box.pack_start(GtkLabel(_("Model")), FALSE)
        sw = GtkScrolledWindow()
        sw.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC)
        self.modelList = GtkCList()
	self.modelList.freeze()
        self.modelList.set_selection_mode(SELECTION_BROWSE)
        for key, model in self.rules[0].items():
            loc = self.modelList.append((model,))
	    self.modelList.set_row_data(loc, key)
            if key == self.model:
                self.modelList.select_row(loc, 0)
        self.modelList.sort()
        self.modelList.connect("select_row", self.select_row)
        self.modelList.columns_autosize()
        self.modelList.connect_after("draw", moveto)
	self.modelList.thaw()
        sw.add(self.modelList)
        sw.set_policy(POLICY_NEVER, POLICY_AUTOMATIC)
        box.pack_start(sw, TRUE)

	box.pack_start(GtkLabel(_("Layout")), FALSE)
        sw = GtkScrolledWindow()
        sw.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC)
        self.layoutList = GtkCList()
	self.layoutList.freeze()
        self.layoutList.set_selection_mode(SELECTION_BROWSE)
        for key, layout in self.rules[1].items():
            loc = self.layoutList.append((layout,))
	    self.layoutList.set_row_data(loc, key)
            if key == self.layout:
                self.layoutList.select_row(loc, 0)
        self.layoutList.sort()
        self.layoutList.connect("select_row", self.select_row)
        self.layoutList.columns_autosize()
	self.layoutList.connect_after("draw", moveto)
	self.layoutList.thaw()
        sw.add(self.layoutList)
        sw.set_policy(POLICY_NEVER, POLICY_AUTOMATIC)
	box.pack_start(sw, TRUE)

	box.pack_start(GtkLabel(_("Dead Keys")), FALSE)
        sw = GtkScrolledWindow()
        sw.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC)
        self.variantList = GtkCList()
        self.variantList.set_selection_mode(SELECTION_BROWSE)
#  For now, the only variant is deadkeys, so we'll just handle that
#  as special case, so the text can be less confusing.
#        self.variantList.append(("None",))
#        for (key, variant) in self.rules[2].items():
        count = 0
        for key, variant in(("basic",(_("Enable dead keys"))),
                            ("nodeadkeys",(_("Disable dead keys")))):
            loc = self.variantList.append((variant,))
	    self.variantList.set_row_data(loc, key)
            if self.variant == "nodeadkeys":
                self.variantList.select_row(count, 0)
            count = count + 1
            
        self.variantList.sort()
        self.variantList.connect("select_row", self.select_row)
        self.variantList.columns_autosize()
        sw.add(self.variantList)
	box.pack_start(sw, FALSE)

        label = GtkLabel(_("Test your selection here:"))
        label.set_alignment(0.0, 0.5)
        box.pack_start(label, FALSE)

        entry = GtkEntry()
        box.pack_start(entry, FALSE)

        entry.connect("grab-focus", self.setMap)

        box.set_border_width(5)
        return box
