#!/usr/bin/python
# -*- coding: UTF-8 -*-
# -*- python -*-
# Copyright (C) 2005 by Sebastien Estienne
#
# This file may be distributed and/or modified under the terms of
# the GNU General Public License version 2 as published by
# the Free Software Foundation.
# This file is distributed without any warranty; without even the implied
# warranty of merchantability or fitness for a particular purpose.
# See "COPYING" in the source distribution for more information.
#
# $Id: service-discovery-config.in 114 2006-08-06 20:35:34Z sebest $
#

import os
import sys

def error_msg(msg):
    d = gtk.MessageDialog(parent=None, flags=gtk.DIALOG_MODAL,
                          type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK)
    d.set_markup(msg)
    d.show_all()
    d.run()
    d.destroy()
    
try:
    import gettext
    gettext.bindtextdomain("service-discovery-applet", "/usr/share/locale")
    gettext.textdomain("service-discovery-applet")
    _ = gettext.gettext
    import gtk
    import gtk.glade
    gtk.glade.bindtextdomain("service-discovery-applet", "/usr/share/locale")
    gtk.glade.textdomain("service-discovery-applet")
    import gobject
    import gconf
    import avahi
    import avahi.ServiceTypeDatabase
except ImportError, e:
    error_msg(_("A required python module is missing!\n%s") % (e))
    sys.exit()

from avahi_discover.SimpleGladeApp import SimpleGladeApp

(
    COLUMN_ENABLED,
    COLUMN_SERVICE,
    COLUMN_NAME
) = range(3)

glade_dir = "/usr/share/service-discovery-applet/interfaces/"

gc_options = "/apps/service-discovery-applet/options"
gc_services =  "/apps/service-discovery-applet/services"

class Config_window(SimpleGladeApp):
    def __init__(self, path="service-discovery-config.glade", root="sda-prefs-dialog", domain=None, **kwargs):
	self.stype_database = avahi.ServiceTypeDatabase.ServiceTypeDatabase()
        path = os.path.join(glade_dir, path)
        SimpleGladeApp.__init__(self, path, root, domain, **kwargs)

    def __create_model(self):
        lstore = gtk.ListStore(
            gobject.TYPE_BOOLEAN,
            gobject.TYPE_STRING,
            gobject.TYPE_STRING)

	gc_entries = self.gc_client.all_entries(gc_services)
	for gc_entry in gc_entries:
	    svc_enabled = self.gc_client.get_bool(gc_entry.key)
	    svc_type = os.path.basename(gc_entry.key)

            iter = lstore.append()
            lstore.set(iter,
		       COLUMN_ENABLED, svc_enabled,
		       COLUMN_SERVICE, svc_type,
		       COLUMN_NAME, self.__get_service_type_description(svc_type))
        lstore.set_sort_column_id(COLUMN_SERVICE, gtk.SORT_ASCENDING)
	return lstore

    def __get_service_type_description(self, stype):
        if self.stype_database.has_key(stype):
	   return self.stype_database[stype]
	else:
	   return None

    def __add_columns(self, treeview):
        model = treeview.get_model()
	
        # column for enabled toggles
        renderer = gtk.CellRendererToggle()
        renderer.connect('toggled', self.enabled_toggled, model)

        column = gtk.TreeViewColumn(_("Enabled"), renderer, active=COLUMN_ENABLED)

        # set this column to a fixed sizing(of 50 pixels)
        #column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
        #column.set_fixed_width(50)
        treeview.append_column(column)

        # column for service type
	
        renderer = gtk.CellRendererText()
        renderer.set_data("column", COLUMN_SERVICE)

        column = gtk.TreeViewColumn(_("Service type"), renderer,
                                    text=COLUMN_SERVICE)
        treeview.append_column(column)

        # columns for service name
	renderer = gtk.CellRendererText()
        renderer.set_data("column", COLUMN_NAME)

        column = gtk.TreeViewColumn('Service Name', renderer,
                                    text=COLUMN_NAME)
        column.set_sort_column_id(COLUMN_NAME)
        treeview.append_column(column)

    def enabled_toggled(self, cell, path, model):
        # get toggled iter
        iter = model.get_iter((int(path),))
        enabled = model.get_value(iter, COLUMN_ENABLED)
	service_type = model.get_value(iter, COLUMN_SERVICE)
        # do something with the value
        enabled = not enabled

        # set new value
        model.set(iter, COLUMN_ENABLED, enabled)

	self.gc_client.set_bool("%s/%s" % (gc_services, service_type), enabled)

    def cb_local_toggled(self,cb,client):
	client.set_bool ("%s/%s" % (gc_options,"show_local_services"), cb.get_active())

    def cb_notifications_toggled(self,cb,client):
	client.set_bool ("%s/%s" % (gc_options,"show_notifications"), cb.get_active())

    def new(self):
        print "A new main_window has been created"

	# Gconf
	self.gc_client = gconf.client_get_default ()
	self.gc_client.add_dir (gc_options, gconf.CLIENT_PRELOAD_NONE)
	
	# images
	self.image_services.set_from_file("/usr/share/service-discovery-applet/icons//48x48/service-discovery-applet.png")
	
	# connect advanced checkbuttons
	self.checkbutton_local.set_active(self.gc_client.get_bool ("%s/%s" % (gc_options,"show_local_services")))
	self.checkbutton_local.connect('toggled',self.cb_local_toggled,self.gc_client)

	self.checkbutton_notifications.set_active(self.gc_client.get_bool ("%s/%s" % (gc_options,"show_notifications")))
	self.checkbutton_notifications.connect('toggled',self.cb_notifications_toggled,self.gc_client)


	# The services treeview
	model = self.__create_model()

	self.treeview_services.set_model(model)
	self.__add_columns(self.treeview_services)


def main():
    config_window = Config_window()

    config_window.run()
    
if __name__ == "__main__":
    main()

                                            
