# -*- coding: iso-8859-1 -*-
#
#-------------------------------------------------------------------------------
#                    Code_Saturne version 1.3
#                    ------------------------
#
#
#     This file is part of the Code_Saturne User Interface, element of the
#     Code_Saturne CFD tool.
#
#     Copyright (C) 1998-2007 EDF S.A., France
#
#     contact: saturne-support@edf.fr
#
#     The Code_Saturne User Interface 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.
#
#     The Code_Saturne User Interface 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 the Code_Saturne Kernel; if not, write to the
#     Free Software Foundation, Inc.,
#     51 Franklin St, Fifth Floor,
#     Boston, MA  02110-1301  USA
#
#-------------------------------------------------------------------------------


"""
"""


#-------------------------------------------------------------------------------
# Library odules import
#-------------------------------------------------------------------------------


import string
import Tix
from Tkconstants import *


#-------------------------------------------------------------------------------
# Application modules import
#-------------------------------------------------------------------------------


from Base.Common import *
import Base.Toolbox as Tool
import Base.Dialog as Dialog
import Base.TkPage as TkPage
import Base.XMLmodel as XMLmodel


#-------------------------------------------------------------------------------
# 
#-------------------------------------------------------------------------------


class ProbeValidator(TkPage.DataValidator2):
    """
    """
    def isProbeOK(self, entry, var):
        """
        This method validates the strict Positivity of the value, when an error
        occurs, an exception ValueError is raised.
        """
        try:
            if int(var) <= 0:
                return self._error(entry, ValueError, "value must be positive")
            else:
                return 1
        except:
            return self._error(entry, ValueError, "value must be positive")


#-------------------------------------------------------------------------------
# Output class
#-------------------------------------------------------------------------------


class VariableOption:
    """
    """
    def __init__(self, case, master, check, stbar, node, list_turb_probe, color, glob):
        """
        à faire : afficher les variables en fonction du modele de turb
        limiter le nombre de caractére des entry à 19
        test sur la cohérence des sondes (existence)
 
        on est obligé de passer la stbar en argument pour afficher les messages d'erreur:
                + de 19 caracteres pour le nom
                num des sondes existant et > 0
        """
        self.master = master
        self.case   = case
        self.check  = check
        self.stbar  = stbar
        self.node   = node
        self.color  = color
        self.glob   = glob
        self.list_turb_probe = list_turb_probe
        self.balloon = Tix.Balloon(self.master, statusbar=self.stbar.label, bd=1, bg='black')
        self.balloon.message.config(bg=wm['background'])

        self.dicoLabelName = {}
        self.name = self.node['name']

        self.node_bc      = self.case.xmlInitNode('boundary_conditions')
        self.node_var     = self.node_bc.xmlInitNodeList('variable')
        self.node_sca     = self.node_bc.xmlInitNodeList('scalar')

        self.label    = Tix.StringVar()
        self.printing = Tix.StringVar()
        self.post     = Tix.StringVar()
        self.probe    = Tix.StringVar()

        self._createWidgets()


    def _createWidgets(self):
        """
        """
        t = PageText()
        f1 = Tix.Frame(self.master)
        f1.pack()

        self.lab = Tix.Entry(f1, width=11, textvariable=self.label, fg=self.color)
        self.lab.event_add("<<Event1>>", "<Return>", "<Leave>")
        self.lab.bind("<<Event1>>", self.getLabel)
        self.balloon.bind_widget(self.lab, statusmsg=t.MSG_LABEL,
                                 balloonmsg=t.KEYWORD+"NOMVAR")

        butl = Tix.Checkbutton(f1, onvalue="on", offvalue="off",
                               variable=self.printing, command=self.getPrinting)
        self.balloon.bind_widget(butl, statusmsg=t.MSG_LISTING,
                                 balloonmsg=t.KEYWORD+"ILISVR")

        butp = Tix.Checkbutton(f1, onvalue="on", offvalue="off", 
                               variable=self.post, command=self.getPost)
        self.balloon.bind_widget(butp, statusmsg=t.MSG_POST,
                                 balloonmsg=t.KEYWORD+"ICHRVR")

        self.eProbes = Tix.Entry(f1, width=21, textvariable=self.probe)
        self.eProbes.event_add("<<Event2>>", "<Return>", "<Leave>", "<FocusOut>")
        self.eProbes.bind("<<Event2>>", self.getProbe)
        self.balloon.bind_widget(self.eProbes, statusmsg=t.MSG_PROBES,
                                 balloonmsg=t.KEYWORD+"IHISVR")

# popup for selection or none selection by probe

        pm_probe = Tix.PopupMenu(self.eProbes, title=t.POP_GLOBAL, state=NORMAL)
        pm_probe.bind_widget(self.eProbes)
        pm_probe.menu.add_separator()
        pm_probe.menu.add_command(label=t.SELECT_ALL, command=self.selectAll)
        pm_probe.menu.add_command(label=t.UNSELECT_ALL, command=self.cancelAll)
        pm_probe.menu.m1 = Tix.Menu(pm_probe.menu)

        #if glob ==0:
        #    self.lab.grid    (row=0, column=0, pady=2)
        #    butl.grid   (row=0, column=1, padx=28, pady=2)
        #    butp.grid   (row=0, column=2, padx=18, pady=2)
        #    self.eProbes.grid(row=0, column=3, padx=2, pady=2)

        self.lab.grid(row=0, column=0, pady=2)
        butl.grid(row=0, column=1, padx=28, pady=2)
        butp.grid(row=0, column=2, padx=18, pady=2)
        self.eProbes.grid(row=0, column=3, padx=2, pady=2)

        if self.node['label']:
            self.label.set(self.node['label'])
        #   self.dicoLabelName[self.name] = self.node['label']
        else:
            self.label.set(self.node['name'])
        #   self.dicoLabelName[self.name] = self.node['name']

        self.node_printing = self.node.xmlGetChildNodeList('listing_printing','status')
        self.node_post = self.node.xmlGetChildNodeList('postprocessing_recording','status')
        self.node_probe = self.node.xmlGetChildNodeList('probe_recording')

        self.printing.set('on')
        if self.node_printing:
            self.printing.set('off')
            
        self.post.set('on')
        if self.node_post: 
            self.post.set('off')


        listProbe = []

#TODELETE
#       if self.case['probes'] == 1:
#       if self.list_turb_probe:
#           self.probe.set(string.join(self.list_turb_probe))
#           self.getProbe()
#       else:

        list_name_probe = []
        if self.node_probe:
            for node in self.node_probe:
                listProbe.append(str(node['name']))
            if listProbe: self.probe.set(string.join(listProbe," "))

        if self.glob == 1: 
            self.selectAll()
            return
        if self.glob == 2:
            self.cancelAll()
            return


    def getLabel(self, event= None):
        t = PageText()

        self.check.begin(self.lab)
        self.stbar.busy()
        if len(self.label.get()) > 19:
            #self.check._error(self.lab, t.ERROR_8_CAR)
            self.check.error(self.lab)
            self.stbar.set(t.ERROR_8_CAR)
        elif len(self.label.get()) == 0:
            self.check.error(self.lab)
        else:
            self.node['label'] = self.label.get()

            for node1 in [self.node_var, self.node_sca]:
                for nodebc in node1:
                    if nodebc['name'] == self.node['name']:
                        nodebc['label'] = self.label.get()
                        break

            self.stbar.idle()
            return self.label.get()
        self.stbar.idle()


    def getPrinting(self, event= None):
        if self.printing.get() == 'off':
            self.node.xmlInitChildNode('listing_printing')['status'] = self.printing.get()
        else:
            if self.node.xmlGetChildNode('listing_printing'): 
                self.node.xmlRemoveChild('listing_printing')
        return self.printing.get()


    def getPost(self, event= None):
        if self.post.get() == 'off':
            self.node.xmlInitChildNode('postprocessing_recording')['status'] = self.post.get()
        else:
            if self.node.xmlGetChildNode('postprocessing_recording'): 
                self.node.xmlRemoveChild('postprocessing_recording')
        return self.post.get()

    def selectAll(self, event= None):
        self.probe.set(string.join(self.list_turb_probe))
        self.getProbe()


    def cancelAll(self, event= None):
        self.probe.set("")
        self.getProbe()


    def getProbe(self, event=None):
        t = PageText()
        self.stbar.clear()
        iok = 0
        ierr = []
        msg = ""
        self.check.begin(self.eProbes)
        for i in string.split(self.probe.get()):
            if not self.check.isProbeOK(self.eProbes,i): 
                iok = 1
            try:
                pr = int(i)
                if i not in self.list_turb_probe: ierr.append(i)
            except:
                pass
        if iok:
            msg= t.ERROR_INT
        if ierr:
            msg= msg + "  " + t.NOT_A_PROBE+ string.join(ierr)
        if iok or ierr:
            self.stbar.set(msg)
            self.check.error(self.eProbes)
        else:
            try:
                self.node.xmlRemoveChild('probe_recording')
            except:
                pass
            for i in string.split(self.probe.get()):
                self.node.xmlInitNodeList('probe_recording',name=i)


#-------------------------------------------------------------------------------
# Main class
#-------------------------------------------------------------------------------


class OutputVariables(TkPage.Page):


    def _dependsPages(self, name):
        """
        Construction of the list of dependencies Pages.
        """
        self.case[name]['depends'] = ['bounda/scalar']


    def _pageControl(self):
        """
        """
        self.check = ProbeValidator()
        self.info_turb_name = []

        self.node_models    = self.case.xmlInitNode('thermophysical_models')
        self.analysis_ctrl  = self.case.xmlInitNode('analysis_control')
        self.fluid_prop     = self.case.xmlInitNode('physical_properties')
        self.node_model_vp  = self.node_models.xmlInitNode('velocity_pressure')
        self.node_var_vp    = self.node_model_vp.xmlGetNodeList('variable')
        self.node_pro_vp    = self.node_model_vp.xmlGetNodeList('property')
        self.node_output    = self.analysis_ctrl.xmlInitNode('output')
        self.node_probe     = self.node_output.xmlGetNodeList('probe','name')


    def GlobSelectAll(self):
        """
        We select all probes for all variables as asked in popup
        """
        model = XMLmodel.XMLmodel(self.case)

        probeList = []
        for node in self.node_probe: probeList.append(node['name'])

        for nodeList, color in [(self.node_var_vp, 'black'),
                                (model.getTurbNodeList(),             'black'),
                                (model.getThermalScalar(),            'brown'),
                                (model.getAdditionalScalar(),         'darkblue'),
                                (model.getAdditionalScalarProperty(), 'darkblue'),
                                (model.getFluidProperty(),            'darkgreen'),
                                (model.getTimeProperty(),             'darkgreen'),
                                (model.getWeightMatrixProperty(),     'blue'),
                                (model.getPuCoalScalProper(),         'green')]:

            for node in nodeList:
                glob = 1
                VariableOption(self.case, self.f2.window,
                               self.check, self.stbar,
                               node, probeList, color, glob)


    def GlobCancelAll(self):
        """
        We select all probes for all variables as asked in popup
        """
        model = XMLmodel.XMLmodel(self.case)

        probeList = ""
        for nodeList, color in [(self.node_var_vp, 'black'),
                                (model.getTurbNodeList(),             'black'),
                                (model.getThermalScalar(),            'brown'),
                                (model.getAdditionalScalar(),         'darkblue'),
                                (model.getAdditionalScalarProperty(), 'darkblue'),
                                (model.getFluidProperty(),            'darkgreen'),
                                (model.getTimeProperty(),             'darkgreen'),
                                (model.getPuCoalScalProper(),         'green'),
                                (model.getWeightMatrixProperty(),     'blue')]:

            for node in nodeList:
                glob = 2
                VariableOption(self.case, self.f2.window,
                               self.check, self.stbar,
                               node, probeList, color, glob)


    def _createWidgets(self):
        """
        """
        t = PageText()

        lf1 = Tix.LabelFrame(self.myPage, bd=2, label=t.TITLE, relief=FLAT)
        lf1.label.config(font=fT)
        lf1.pack(side=TOP, fill=X, padx=10, pady=10)

        f1 = Tix.Frame(lf1.frame, relief=FLAT)
        f1.pack(side=TOP, padx=10, pady=10)

        self.l1 = Tix.Label(f1, text=t.NAME, bd=1, relief=GROOVE)
        self.l2 = Tix.Label(f1, text=t.LISTING, bd=1, relief=GROOVE)
        self.l3 = Tix.Label(f1, text=t.POST, bd=1, relief=GROOVE)
        self.l4 = Tix.Label(f1, text=t.PROBE, bd=1, relief=GROOVE)
        self.l1.grid (row=0, column=0, ipadx=26, ipady=8)
        self.l2.grid (row=0, column=1, ipadx=8, ipady=1)
        self.l3.grid (row=0, column=2, ipadx=8, ipady=1)
        self.l4.grid (row=0, column=3, ipadx=55, ipady=8)

        self.f2 = Tix.ScrolledWindow(lf1.frame, relief=FLAT)
        self.f2.pack()

# popup for global selection or none selection
        pm_global = Tix.PopupMenu(lf1.frame, title=t.POP_GLOBAL, state=NORMAL)
        pm_global.bind_widget(lf1.frame)
        pm_global.menu.add_separator()
        pm_global.menu.add_command(label=t.GLOB_SELECT_ALL, command=self.GlobSelectAll)
        pm_global.menu.add_command(label=t.GLOB_UNSELECT_ALL, command=self.GlobCancelAll)
        pm_global.menu.m1 = Tix.Menu(pm_global.menu)


    def _initializeWidgets(self):
        """
        """
        model = XMLmodel.XMLmodel(self.case)

        probeList = []
        for node in self.node_probe: probeList.append(node['name'])

        for nodeList, color in [(self.node_pro_vp,                    'black'),
                                (self.node_var_vp,                    'black'),
                                (model.getTurbNodeList(),             'black'),
                                (model.getThermalScalar(),            'brown'),
                                (model.getAdditionalScalar(),         'darkblue'),
                                (model.getAdditionalScalarProperty(), 'darkblue'),
                                (model.getFluidProperty(),            'darkgreen'),
                                (model.getTimeProperty(),             'darkgreen'),
                                (model.getPuCoalScalProper(),         'green'),
                                (model.getWeightMatrixProperty(),     'blue')]:

            for node in nodeList:
                glob = 0
                VariableOption(self.case, self.f2.window,
                               self.check, self.stbar,
                               node, probeList, color, glob)


#-------------------------------------------------------------------------------
# Text and messages for this page
#-------------------------------------------------------------------------------


class PageText:
    """
    Storage of all texts and messages for this page.
    """
    def __init__(self):
        
        # 1) Texts
        #
        if Tool.GuiParam.lang == 'fr':
            self.ERROR_8_CAR      = "Le nombre de caractères doit etre égal ou inférieur à 19"
            self.ERROR_INT        = "Le numéro de la sonde doit être > 0"
            self.GLOB_SELECT_ALL  = "Selectionner toutes les sondes pour toutes les variables"
            self.GLOB_UNSELECT_ALL= "Déselectionner toutes les sondes pour toutes les variables"
            self.KEYWORD          = "Mot clé Code_Saturne: "
            self.LISTING          = "Affichage\nlisting"
            self.NAME             = "Nom"
            self.NOT_A_PROBE      = "Erreur, numéro de sonde(s) inexistant(s) : "
            self.POP_GLOBAL       = "Menu popup"
            self.POST             = "Post-\nprocessing"
            self.PROBE            = "Sondes"
            self.SELECT_ALL       = "Tout sélectionner"
            self.TITLE            = "Suivi des variables / scalaires"
            self.UNSELECT_ALL     = "Tout désélectionner"
        else:
            self.ERROR_8_CAR      = "Number of character must be lower or equal than 19"
            self.ERROR_INT        = "Probe Number must be an integer > 0"
            self.GLOB_SELECT_ALL  = "Select all probes for all variables"
            self.GLOB_UNSELECT_ALL= "Unselect all probes for all variables"
            self.KEYWORD          = "Code_Saturne key word: "
            self.LISTING          = "Print in\nlisting"
            self.NAME             = "Name"
            self.NOT_A_PROBE      = "Error, this probe doesn't exist: " 
            self.POP_GLOBAL       = "Menu popup"
            self.POST             = "Post-\nprocessing"
            self.PROBE            = "Probes"
            self.SELECT_ALL       = "Select all"
            self.TITLE            = "Control Solution"
            self.UNSELECT_ALL     = "Unselect all"
        # 2) Messages
        #

        if Tool.GuiParam.lang == 'fr':
            self.MSG_LABEL     = "Nom de la Variable/Scalaire max 8 caractères"
            self.MSG_LISTING   = "Suivi dans le listing"
            self.MSG_POST      = "Suivi en Post-processing"
            self.MSG_PROBES    = "Entrer le numero des sondes"
        else:
            self.MSG_LABEL     = "Variable/Scalar name =< 8 characters"
            self.MSG_LISTING   = "Printing listing"
            self.MSG_POST      = "Post-processing"
            self.MSG_PROBES    = "Enter Probes number"

#-------------------------------------------------------------------------------
# End
#-------------------------------------------------------------------------------


syntax highlighted by Code2HTML, v. 0.9.1