# -*- coding: iso-8859-1 -*-
from __future__ import division # 1/2 == .5 (par defaut, 1/2 == 0)

##########################################
#            Modules
##########################################
#    WxGeometrie
#    Dynamic geometry, graph plotter, and more for french mathematic teachers.
#    Copyright (C) 2005-2007  Nicolas Pourcelot
#
#    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

# version unicode

from LIB import *
from API.menu import MenuBar
from API.panel import Panel_simple
import API

__liste__ = []
for module in param.modules:
    try:
        #~ print "test-mod0", module
        exec("import modules.%s" %module)

        menus = [objet for objet in getattr(modules, module).__dict__.values() if isinstance(objet, type) and issubclass(objet, MenuBar) and objet.__name__ <> "MenuBar"]
        if len(menus) > 1 and param.debug:
            print menus
            raise IndexError, str2(u"Plusieurs classes héritent de MenuBar dans le module %s." %module)
        if len(menus) == 0 and param.debug:
            raise IndexError, str2(u"Aucune classe n'hérite de MenuBar dans le module %s." %module)
        getattr(modules, module).__menu__ = menus[0]

        feuilles = [objet for objet in getattr(modules, module).__dict__.values() if isinstance(objet, type) and issubclass(objet, Feuille) and objet.__name__ <> "Feuille"]
        if len(menus) > 1 and param.debug:
            print feuilles
            raise IndexError, str2(u"Plusieurs classes héritent de Feuille dans le module %s." %module)
        elif len(feuilles) == 0:
            getattr(modules, module).__classe_feuille__ = Feuille
        else:
            getattr(modules, module).__classe_feuille__ = feuilles[0]

        #~ print "test-mod1", module
        panels = [objet for objet in getattr(modules, module).__dict__.values() if isinstance(objet, type) and issubclass(objet, Panel_simple) and not objet.__name__ in ("Panel_simple", "Panel_API_graphique")]
        if len(panels) > 1 and param.debug:
            print panels
            raise IndexError, str2(u"Plusieurs classes héritent de Panel_simple dans le module %s." %module)
        if len(panels) == 0 and param.debug:
            raise IndexError, str2(u"Aucune classe n'hérite de Panel_simple dans le module %s." %module)
        panel = getattr(modules, module).__panel__ = panels[0]
        try:
            exec("import modules.%s._param_ as __param__" %module)
            panel._param_ = __param__
            path = path2(param.emplacements["preferences"] + "/" + module + "/parametres.xml")
            if param.charger_preferences and os.path.exists(path):
                try:
                    a_verifier = {}
                    a_verifier.update([(dico, getattr(param, dico)) for dico in param.a_mettre_a_jour])
                    API.actualiser_module(panel._param_, path)
                    # certains paramètres peuvent avoir besoin d'une mise à jour (en cas de changement de version de wxgéométrie par exemple)
                    # cela concerne en particulier les dictionnaires, qui peuvent gagner de nouvelles clés.
                    for dictionnaire in param.a_mettre_a_jour:
                        for key in a_verifier[dictionnaire].keys():
                            if hasattr(panel._param_, dictionnaire): # (pour l'instant) param.a_mettre_a_jour s'applique à tout wxgéométrie, mais tous les paramêtres ne concernent pas tous les modules.
                                getattr(panel._param_, dictionnaire).setdefault(key, a_verifier[dictionnaire][key])
                except:
                    if param.debug:
                        param.erreurs_initialisation += u"\n\nImpossible d'actualiser les préférences du module '" + module + "'.\n" + traceback.format_exc()
        except ImportError:
            panel._param_ = None
            if param.debug:
                param.erreurs_initialisation += u"\n\nImpossible d'importer les paramêtres du module '" + module + "'.\n" + traceback.format_exc()
        except:
            if param.debug:
                param.erreurs_initialisation += u"\n\nImpossible d'importer les paramêtres du module '" + module + "'.\n" + traceback.format_exc()
            panel._param_ = None

        __liste__.append(module)

    except:
        if param.debug:
            param.erreurs_initialisation += u"\n\nImpossible d'importer le module '" + module + "'.\n" + traceback.format_exc()
        # On supprime les modules non chargés de la liste.
        # La liste des modules doit en effet être synchronisée avec celle des onglets dans l'implémentation actuelle.
        param.modules = [md for md in param.modules if md <> module]


def liste(nom = None):
    u"Retourne le module 'nom', ou à défaut la liste des modules."
    if nom:
        return getattr(modules, nom)
    return __liste__



