# -*- 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
#
#-------------------------------------------------------------------------------


"""
This module defines the 'Meshes and Enveloppe' page.

This module defines the following classes:
- MeshFormatDialog
- FacesSelectorDialog
- SolutionDomainView
- PageText
"""


#-------------------------------------------------------------------------------
# Library modules import
#-------------------------------------------------------------------------------


import os, sys, string, types
import Tix
from Tkconstants import *
import tkFileDialog


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


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


#-------------------------------------------------------------------------------
# Popup window: Mesh Format dialog window
#-------------------------------------------------------------------------------


class MeshFormatDialog(Dialog.Dialog):
    """
    All dirty stuff is done by the Dialog module
    """
    def body(self, master):
        """
        Format selector layout
        """
        # Main initialization
        #
        t = PageText()

        # Variables declaration
        #
        self.mesh_format = Tix.StringVar()

        # Layout
        #
        la = Tix.Label(master, text=t.MAKE_CHOICE, font=fT)
        la.pack(side=TOP, fill=BOTH, anchor=N, padx=4, pady=10)

        f = Tix.Frame(master, bd=2, relief=FLAT)
        f.pack(side=TOP, expand=YES, padx=10, pady=2)

        r = [0]*9
        l = [0]*9
        for (num, v, txt) in [(0, 'cgns', 'CGNS 2.4 ".cgns"')       ,
                              (1, 'hex',  'NUMECA Hex".hex"')     ,
                              (2, 'unv',  'I-deas Universal ".unv"'),
                              (3, 'med',  'MED 2.3 ".med"')         ,
                              (4, 'des',  'NOPO (Simail) ".des"')   ,
                              (5, 'msh',  'Gmsh ".msh"')            ,
                              (6, 'ngeom','Comet ".ngeom"')         ,
                              (7, 'case',  'EnSight (>= 6) ".case"'),
                              (8, 'neu', 'GAMBIT neutral ".neu"'   )]:           
            r[num] = Tix.Radiobutton(f, value=v, variable=self.mesh_format)
            l[num] = Tix.Label(f, text=txt)
            r[num].grid(row=num, column=0)
            l[num].grid(row=num, column=1, sticky=W)

        # Activate the default format : "NOPO Simail (.des)"
        #
        r[4].select()


    def apply(self):
        """
        What to do when user clicks on 'OK'?
        """
        self.result = self.mesh_format.get()


#-------------------------------------------------------------------------------
# Popup window: Faces selector dialog window
#-------------------------------------------------------------------------------


class FacesSelectorDialog(Dialog.Dialog):
    """
    All dirty stuff is done by the Dialog module
    """
    def getString(self, item, key):
        """
        Just verify if the item value is a positive integer, when
        the key is for a color.
        """
        ans = 1
        if key == 'color':
            try:
                item = int(item)
                if item < 0: raise ValueError
            except:
                self.e[0].bell()
                self.e[0].selection_range(0,END)
                self.e[0].config(selectbackground='red')
                ans = 0

        return ans


    def setListbox(self, num, list):
        """
        Add colors and groups input in entries in the good list.
        """
        t = PageText() 
        iok = []
        # 1) Which key is it ?
        #
        if num == 0:
            key = 'color'
        elif num == 1:
            key = 'group'
        else:
            raise ValueError

        for item in list:
            if self.getString(item, key):

                # 2) Verify that the input is not allready in the Listbox
                #
                if item in self.result[key]:
                    iok.append(item)
                    self.e[num].delete(0,END)
                else:

                    # 3) Update element 
                    #
                    self.result[key].append(str(item))
        
                    # 4) Update Listbox, clean entry
                    #
                    self.l[num].listbox.insert(END, item)
                    self.e[num].delete(0,END)

        if iok:
            item = string.join(iok, '\n')
            Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_ALLREADY+item)

    def getColorGroup(self, num, var, event=None):
        """
        Add colors and groups input in entries in the good list.
        """
        list = string.split(var.get())
        if list:
            self.setListbox(num, list)


    def killSelection(self, num, event=None):
        """
        Delete the selection from the listbox (one by one).
        """
        # 1) Is there something to delete ?
        #
        item = self.l[num].listbox.curselection()
        if item:
            # 2) Delete item from listbox
            #
            index = int(item[0])
            self.l[num].listbox.delete(index)

            # 3) Delete item from self.result
            #
            if num == 0:
                del self.result['color'][index]
            elif num == 1:
                del self.result['group'][index]        


    def getParameters(self, num, var, event=None):
        """
        1) Input '-fraction', '-plan' parameters.
        """
        if self.check2.isPositive(self.efp[num], var):
            var.get()


    def body(self, master):
        """
        Faces selector layout
        """
        # Main initialization
        #
        t = PageText()

        # Variables declaration and initialization
        #
        self.color     = Tix.StringVar()
        self.group     = Tix.StringVar()
        self.reverse   = Tix.StringVar()
        self.type      = Tix.StringVar()
        self.fraction  = Tix.StringVar()
        self.plan      = Tix.StringVar()

        self.result = self.default.copy()
        self.result['color'] = []
        self.result['group'] = []
        #self.result['reverse'] = ""
        #self.result['type']  = ""
        #self.result['fraction']  = ""
        #self.result['plan']  = ""
        #self.node = ['faces_fraction', 'faces_plan']
        #self.def_values = [0.1, 0.8]

        # Lay out
        #
        self.img = Tix.PhotoImage(file = PIC_PATH+'mana_blk.gif')

        # Display the two listbox
        #
        f = [0]*2
        g = [0]*2
        h = [0]*2
        self.l = [0]*2
        self.e = [0]*2
        b = [0]*2
        for (num, txt1, txt2, var) in [(0, t.COLOR_LIST, t.COLOR_NEW, self.color),
                                       (1, t.GROUP_LIST, t.GROUP_NEW, self.group)]:

            f[num] = Tix.LabelFrame(master, label=txt1, bd=2)
            f[num].label.config(font=fT)
            f[num].pack(side=TOP, expand=YES, padx=10, pady=2)
            w1 = f[num].frame
            
            self.l[num] = Tix.ScrolledListBox(w1, scrollbar='auto',
                                              width=200, height=60)
            self.l[num].pack(side=TOP, expand=YES, padx=4, pady=10)
            self.l[num].vsb.config(width=10, bd=1)
            self.l[num].hsb.config(width=10, bd=1)

            g[num] = Tix.Frame(w1, relief=FLAT)
            g[num].pack(side=TOP, fill=BOTH)
            w2 = g[num]

            h[num] = Tix.Label(w2, text=txt2)
            h[num].grid(row=0, column=0, padx=4, sticky=W)
            
            self.e[num] = Tix.Entry(w2, width=20, textvariable=var)
            self.e[num].event_add("<<E>>", "<Return>", "<Motion>", "<FocusOut>")
            self.e[num].bind("<<E>>", TkPage.Callback(self.getColorGroup,num,var))
            self.e[num].grid(row=1, column=0, padx=4)
            self.e[num].delete(0,END)

            # Kill buttons
            #
            b[num] = Tix.Button(w2, image=self.img,
                                command=TkPage.Callback(self.killSelection,num))
            b[num].grid(row=1, column=1, padx=2, pady=1)
            self.balloon.bind_widget(b[num], statusmsg=t.MSG_DEL_SEL)

        self.balloon.bind_widget(h[0], statusmsg=t.MSG_SEL_REF)
        self.balloon.bind_widget(h[1], statusmsg=t.MSG_SEL_GRP)
        self.balloon.bind_widget(self.e[0], statusmsg=t.MSG_SEL_REF)
        self.balloon.bind_widget(self.e[1], statusmsg=t.MSG_SEL_GRP)

        # Display the boundary and internal buttons
        #
        k1 = Tix.Frame(master, relief=GROOVE, bd=2)
        k1.pack(side=TOP, fill=BOTH, padx=14, pady=2)

        self.sel = Tix.Select(k1, label=t.FACES_TYPES, labelside=TOP,
                              allowzero=1, radio=0, orientation='vertical',
                              variable=self.type)
        self.sel.label.config(font=fT)
        self.sel.add('int',  text=t.FACES_INTERNAL)
        self.sel.add('bord', text=t.FACES_BOUNDARY)
        self.sel.pack(side=TOP, padx=5, pady=5)

        k2 = Tix.Frame(master, relief=GROOVE, bd=2)
        k2.pack(side=TOP, fill=BOTH, padx=14, pady=8)

        # Reversal Selection
        #
        la = Tix.Label(k2, text=t.FACES_REVERSE, font=fT, pady=2)
        la.grid(row=0, column=0, padx=3, pady=2, sticky=W)
        self.c = Tix.Checkbutton(k2, onvalue='on', offvalue='off',
                                 variable=self.reverse)
        self.c.grid(row=0, column=1, pady=2, sticky=E)


        # Parameters : Fraction and Plan
        #
        self.k3 = Tix.LabelFrame(master, label=t.PARAM, bd=2)
        self.k3.label.config(font=fT)
        self.k3.pack(side=TOP, expand=YES, padx=10, pady=2)
        k3fp = self.k3.frame

        #w123 = Tix.Frame(self.w122, relief=FLAT)
        #w123.pack(side=TOP, anchor=W, pady=5)

        lfp = [0]*2
        for (i, tx1, tx2, tx3) in [(0, t.PASTE_FRACTION, t.MSG_FRACTION, '-fraction'),
                                   (1, t.PASTE_PLAN, t.MSG_PLAN, '-plan')]:

            lfp[i] = Tix.Label(k3fp, text=tx1)
            lfp[i].grid(row=i, column=0, padx=5, sticky=W)
            self.balloon.bind_widget(lfp[i], statusmsg=tx2,
                                     balloonmsg=t.KEYWORD_E+tx3)

        self.efp = [0]*2
        for (i, var) in [(0, self.fraction),
                         (1, self.plan)]:

            self.efp[i] = Tix.Entry(k3fp, bd=2, width=10, textvariable=var)
            self.efp[i].grid(row=i, column=1, padx=5, sticky=E)
            self.efp[i].event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
            self.efp[i].bind("<<Event>>", TkPage.Callback(self.getParameters,i,var))

        
        # Default configuration
        #
        if self.default['config'] in ["faces_paste",
                                      "faces_periodic",
                                      "faces_select"]:
            self.sel.bord.invoke()
            self.sel.label.config(state=DISABLED)
            self.sel.bord.config(state=DISABLED)
            self.sel.int.config(state=DISABLED)
            self.c.deselect()
            self.fraction.set(0.1)
            self.plan.set(0.8)

        if self.default['config'] == "faces_select" or self.default['config'] == "faces_syrthes":
            self.k3.pack_forget()




        # Previous values
        #
        try:
            if self.default['reverse'] == 'on':
                self.c.select()
        except:
            pass

        for (i,s) in [(0,'color'), (1,'group')]:
            try:
                if self.default[s]:
                    self.setListbox(i, string.split(self.default[s]))
            except:
                pass

        if self.default['config'] in ["faces_paste",
                                      "faces_periodic"]:
            for (p, var) in [('fraction', self.fraction),
                             ('plan'    , self.plan)]:
                try:
                    if self.default[p]:
                        var.set(self.default[p])
                except:
                    pass

        try:
            if self.default['type']:
                for type in string.split(self.default['type']):
                    if type == 'bord': self.sel.bord.invoke()
                    if type == 'int': self.sel.int.invoke()
        except:
            pass


    def apply(self):
        """
        What to do when user clicks on 'OK'?
        """
        for name in ['color', 'group']:
            l = self.result[name]
            self.result[name] = string.join(l, ' ')
            if self.result[name] == []:
                self.result[name] = None

        self.result['reverse'] = self.reverse.get()
        self.result['type'] = self.type.get()
        self.result['fraction'] = self.fraction.get()
        self.result['plan'] = self.plan.get()


    def sequence(self):
        """
        Bind the dialog window with only 'Echap' (delete sequence 'Return', 
        because of the entries)
        """
        self.bind("<Escape>", self.cancel)


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


class SolutionDomainView(TkPage.Page):
    """
    Class to open Thermal Scalar Transport Page.
    """
    def _dependsPages(self, name):
        """
        Construction of the list of dependencies Pages.
        """
        self.case[name]['depends'] = ['models/initia',
                                      'bounda/scalar']


    def _tkControlVariables(self):
        """
        Tkinter variables declaration.
        """
        self.mesh            = Tix.StringVar()
        self.rc_on_off       = Tix.StringVar()
        self.x_tv            = Tix.DoubleVar()
        self.y_tv            = Tix.DoubleVar()
        self.z_tv            = Tix.DoubleVar()
        self.dx_r1           = Tix.DoubleVar()
        self.dy_r1           = Tix.DoubleVar()
        self.dz_r1           = Tix.DoubleVar()
        self.ang_r1          = Tix.DoubleVar()
        self.ptx_r1          = Tix.DoubleVar()
        self.pty_r1          = Tix.DoubleVar()
        self.ptz_r1          = Tix.DoubleVar()
        self.ptx_r2          = Tix.DoubleVar()
        self.pty_r2          = Tix.DoubleVar()
        self.ptz_r2          = Tix.DoubleVar()
        self.mat11           = Tix.DoubleVar()
        self.mat12           = Tix.DoubleVar()
        self.mat13           = Tix.DoubleVar()
        self.mat21           = Tix.DoubleVar()
        self.mat22           = Tix.DoubleVar()
        self.mat23           = Tix.DoubleVar()
        self.mat31           = Tix.DoubleVar()
        self.mat32           = Tix.DoubleVar()
        self.mat33           = Tix.DoubleVar()
        self.df_on_off       = Tix.StringVar()
        self.warp            = Tix.DoubleVar()
        self.perio_name      = Tix.StringVar()
        self.syr_on_off      = Tix.StringVar()
        self.perio_on_off    = Tix.StringVar()
        self.perio_mode      = Tix.StringVar()
        self.syr2d_on_off    = Tix.StringVar()
        self.ec_on_off       = Tix.StringVar()
        self.echo_num        = Tix.IntVar()
        self.sc_on_off       = Tix.StringVar()
        self.ascii_on_off    = Tix.StringVar()
        self.check_on_off    = Tix.StringVar()
        self.sel_on_off      = Tix.StringVar()
        self.activate        = Tix.StringVar()
        self.post_on_off     = Tix.StringVar()
        self.med_on_off     = Tix.StringVar()
        self.post_dir        = Tix.StringVar()
        self.dec_poly_on_off = Tix.StringVar()


    def _pageControl(self):
        """
        XML node declaration and supplementary default value settings.
        """
        self.node_ecs    = self.case.xmlInitNodeList('solution_domain')[0]
        self.node_models = self.case.xmlInitNodeList('thermophysical_models')[0]
        self.node_turb   = self.node_models.xmlInitNodeList('turbulence', 'model')[0]

        self.node_meshes     = self.node_ecs.xmlInitNodeList('meshes_list')[0]
        self.node_paste      = self.node_ecs.xmlInitNodeList('paste_meshes', "status")[0]
        self.node_cut        = self.node_ecs.xmlInitNodeList('faces_cutting', "status")[0]
        self.node_syrthes    = self.node_ecs.xmlInitNodeList('syrthes_coupling', "status")[0]
        self.node_perio      = self.node_ecs.xmlInitNodeList('periodic_boundary', 'status')[0]
##        self.node_miscel     = self.node_ecs.xmlInitNodeList('miscellaneous')[0]
        self.node_standalone = self.node_ecs.xmlInitNodeList('standalone')[0]
        self.node_post       = self.node_standalone.xmlInitNodeList('post-processing', 'status', format="ensight7 gold")[0]
        self.node_med       = self.node_standalone.xmlInitNodeList('post-processing', 'status', format="med")[0]

        self.node = ['faces_fraction', 'faces_plan', 'warp_angle_max']
        self.def_values = [0.1, 0.8, 0.01]

        self.time  = 0
        self.perio = 1


    def setLink(self, fullfile):
        """
        Tab1: set link between asked file and case's directory "MAILLAGE"
        and keep dependance between file ena directory if destruction
        """

        name = os.path.basename(fullfile)
        new_full = self.case['mesh_path'] + "/" + name
    
        os.symlink(fullfile,new_full)


    def getMeshFormat(self, mesh):
        """
        Tab1: return the format and the listbox name fo the given elementNode.
        Put the format in attribute of the elementNode if necessary.
        """
        t = PageText()

        label = string.split(mesh,".")[0]
        try:
            format = string.split(mesh,".")[1]
        except:
            format = None

        if format not in ["unv","des","hex","med","cgns", "msh","ngeom","case","neu"]:
             dialog = MeshFormatDialog(self.master, title=t.MESH_FORMAT, default="")
             format = dialog.result
             if format:
                 mesh = mesh + "." + format 
             else:
                 format = ""


        return format, label, mesh


    def addMeshInList(self, event=None):
        """
        Tab1: add input new meshes in the listbox and case.
        """
        input_meshes = string.split(self.mesh.get())
        if not input_meshes: return

        t = PageText()
        self.stbar.busy()

        # 1) Verify if the all new meshes are the mesh_path directory.
        #
        for mesh in input_meshes:

            if mesh not in os.listdir(self.case['mesh_path']):
                Dialog.ShowInfo(self.master, title=t.WARNING,
                                text=t.MSG_MESH + t.MSG_IDENTITY)


        # 1) Verify that the new mesh is not allready in the case
        #
        for mesh in input_meshes:

            # 2) Mesh format
            #
            format, label, mesh = self.getMeshFormat(mesh)

            nameList = SolutionDomainModel(self.case).getMeshList()

            if mesh in nameList:
                Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_ALLREADY+mesh)

            else:

                # 2) Add in the list
                #
                nameList.append(mesh)

                # 3) Update Listbox or delete elementNode <mesh> if
                #    something is wrong with the format
                #
                if format in ["unv","des","hex","med","cgns","msh","ngeom","case","neu"]:
                    self.list.listbox.insert(END, mesh)
                SolutionDomainModel(self.case).setMesh(mesh, format)

        self.stbar.idle()


    def searchMesh(self, event=None):
        """
        Tab1: open a FileDialog in order to search a mesh file in the system file.
        """
        t = PageText()
        self.stbar.busy()
        #self.stbar.set(t.MSG_NEW_SEL + self.case['mesh_path'] + ").")

        file_name = ""
        tk_fopen = tkFileDialog.askopenfilename

        if self.case['mesh_path'] and os.path.isdir(self.case['mesh_path']):
            dir = self.case['mesh_path']
        else:
            dir = os.getcwd()

        file_name = tk_fopen (title=t.NEW_MESH,
                              initialdir=dir,
                              filetypes=[ ("All files","*")              ,
                                          ("CGNS 2.2 files","*.cgns")    ,
                                          ("Hexa NUMECA files","*.hex")  ,
                                          ("I-DEAS files","*.unv")       ,
                                          ("MED 2.1 files","*.med")      ,
                                          ("NOPO (Simail) files","*.des"),
                                          ("GMSH files","*.msh")         ,
                                          ("Comet files","*.ngeom")      ,
                                          ("EnSight files","*.case")     ,
                                          ("GAMBIT neutral files","*.neu")] )   

        if file_name:
            if os.path.dirname(file_name) != self.case['mesh_path']:
                self.setLink(file_name)
                self.stbar.set(t.MSG_NEW_SEL + self.case['mesh_path'] + ").")
            self.mesh.set(os.path.basename(file_name))
            self.addMeshInList()
        self.stbar.idle()


    def selectListbox(self, list):
        """
        Return the selected item from the listbox (one by one).
        """
        try:
            index = int(list.listbox.curselection()[0])
            select = list.listbox.get(index)
        except IndexError:
            select = None
            index = None
            
        return select, index


    def delMesh(self, event=None):
        """
        Tab1: delete the selected mesh from the listbox (one by one).
        """
        self.stbar.busy()

        # 1) Is there a mesh to delete ?
        #
        select, index = self.selectListbox(self.list)

        if select:
            t = PageText()

            # 2) Delete mesh from listbox
            #
            self.list.listbox.delete(index)

            # 3) Delete mesh from case
            #

            SolutionDomainModel(self.case).delMesh(select)   

            # 4) Delete link in directory if it's an imported file
            #
            new_full = self.case['mesh_path'] + "/" + select
            l = string.split(select," ")[0]
            try:
                f = string.split(l,".")[1]
            except:
                f = None
            if f not in ["unv","des","hex","med","cgns","msh","ngeom","case","neu"]:
                new_full= self.case['mesh_path'] + "/" + l
            try:
                ldir = os.readlink(new_full)
            except:
                ldir = new_full


##            if ldir != new_full:
##                Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_DEL_LINK)
##                os.unlink(new_full)

        self.stbar.force_idle()


    def getPasteMeshes(self, event=None):
        """
        Tab1: do we paste any meshes ?
        """
        self.stbar.busy()

        answer = self.rc_on_off.get()
        SolutionDomainModel(self.case).setPasteMeshesStatus(answer)
        if answer == 'off':
            self.w122.pack_forget()
        else:
            self.w122.pack(side=TOP, anchor=W, pady=5)

        self.stbar.idle()


    def listboxLabel(self, status, tagName, color="", group="", fraction="", plan="", type="", reverse=""):
        """
        Return the label to input in the listbox, associated
        with the selected faces.
        """
        t = PageText()
        name = ""

        if color:
            name = name + t.REFERENCE + color + " - "

        if group:
            name = name + t.GROUP + group + " - "

        if fraction:
            name = name + t.FRACTION + fraction + " - "

        if plan:
            name = name + t.PLAN + plan + " - "

        if tagName == 'faces_select' and type:
            name = name + t.TYPE + type + " - "

        if reverse == 'on':
            name = name  + t.FACES_REVERSE + " - "

        if color or group or type or reverse:
            if status == 'on':
                name = name + t.ACTIVATE
            else:
                name = name + t.DESACTIVATE

        return name


    def modifyStringList(self, parentNode, tagName):
        """
        Return the nodesList which is a part of the case, and the associated list
        of the labels which are in the listbox.
        """
        self.stbar.busy()

        result = {}
        stringList = []
        nodeList = SolutionDomainModel(self.case).getListNodes(parentNode, tagName)

        for node in nodeList:
            result = SolutionDomainModel(self.case).getFaces(node)
            status = node['status']
            name = self.listboxLabel(status, tagName, result['color'], 
                                     result['group'], result['fraction'],
                                     result['plan'], result['type'], result['reverse'])
            stringList.append(name)

        self.stbar.idle()
        return nodeList, stringList


    def addListbox(self, parentNode, tagName, list, event=None):
        """
        Popup the dialog window for faces selecting. Update the case and the listbox 'list'. 
        """ 
        t = PageText()

        if tagName == "faces_syrthes":
            line = SolutionDomainModel(self.case).getFacesSyrthesSelection()
            if line:
                Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_SYRTHONE)
                return
        if tagName == "faces_select":
            line = SolutionDomainModel(self.case).getSelectCommand()
            if line:
                Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_SELECTONE)
                return
        if tagName == "faces_periodic":
            line = SolutionDomainModel(self.case).getFacesPeriodicSelection(self.perio)
            if line:
                Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_PERIOONE)
                return

        self.stbar.busy()
        default = {}
        default['config']  = tagName 
        default['color']   = ""
        default['group']   = ""
        default['fraction']= "0.1"
        default['plan']    = "0.8"
        default['reverse'] = "off"
        default['type']    = ""
        default['semiconf']    = ""

        dialog = FacesSelectorDialog(self.master, title=t.FACES_TITLE,
                                     stbar=self.stbar, default=default)
        select = dialog.result.copy()

        if select['color'] or select['group'] or select['fraction'] or select['plan']or select['type'] or select['reverse']:

            node = SolutionDomainModel(self.case).getNodeAdd(parentNode, tagName, self.perio)
            SolutionDomainModel(self.case).setFacesSelect(node, tagName, select)

            # Update Listbox
            #
            if tagName in ("faces_syrthes", "faces_select"):
                select['fraction'] =""
                select['plan'] =""
            if tagName in ("faces_select"):
                select['type'] =""
            name = self.listboxLabel("on", tagName,
                                     select['color'], select['group'],
                                     select['fraction'], select['plan'],
                                     select['type'], select['reverse'])
            if name: list.listbox.insert(END, name)

        self.stbar.idle()


    def modifyListbox(self, parentNode, tagName, list, event=None):
        """
        Modify entry either in the listbox and the case.
        """
        self.stbar.busy()
        t = PageText()

        select, index = self.selectListbox(list)

        # Is there something to modify?
        #
        if select:
            nodesList, stringList = self.modifyStringList(parentNode, tagName)
            inode = stringList.index(select)

            default = SolutionDomainModel(self.case).getFacesSelect(nodesList, inode)
            default['config'] = tagName
            dialog = FacesSelectorDialog(self.master, title=t.FACES_TITLE,
                                         stbar=self.stbar, default=default)
            select = dialog.result.copy()

            if select['color'] or select['group'] or select['fraction'] or select['plan'] or select['type'] or select['reverse']:
                SolutionDomainModel(self.case).setFacesSelect(nodesList[inode], tagName, select)

                # Update Listbox
                #
                name = self.listboxLabel(SolutionDomainModel(self.case).getStatusNode(nodesList[inode]), 
                                    tagName,
                                         select['color'], select['group'],
                                         select['fraction'], select['plan'],
                                         select['type'], select['reverse'])
                if name:
                    list.listbox.delete(index)
                    list.listbox.insert(index, name)

        self.stbar.idle()


    def delListbox(self, parentNode, tagName, list, event=None):
        """
        Delete the selection from the listbox (one by one).
        """
        self.stbar.busy()

        select, index = self.selectListbox(list)

        # 1) Is there something to delete?
        #
        if select:
            nodesList, stringList = self.modifyStringList(parentNode, tagName)
            inode = stringList.index(select)

            # 2) Delete item from listbox
            #
            list.listbox.delete(index)

            # 3) Delete selection from case
            #
            SolutionDomainModel(self.case).delNode(nodesList[inode])

            # 4) Release the 2D mesh button if necessary
            #
            if tagName == 'faces_syrthes': self.syr2d_on_off.set('off')

        self.stbar.idle()


    def activeListbox(self, parentNode, tagName, list, event=None):
        """
        Activate/Desactivate the node 'parentNode' with the change of its
        attribute 'status' to on/off
        """
        self.stbar.busy()

        select, index = self.selectListbox(list)

        # 1) Is there something to delete?
        #
        if select:
            nodesList, stringList = self.modifyStringList(parentNode, tagName)
            inode = stringList.index(select)

            # 2) Change the value of the attribute 'status'
            #
            status = SolutionDomainModel(self.case).getStatusNode(nodesList[inode])
            if status == 'on':
                status = 'off'
            else:
                if tagName == "faces_syrthes":
                    line = SolutionDomainModel(self.case).getFacesSyrthesSelection()
                    status = 'on'
                    if line:
                        t = PageText()
                        Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_SYRTHONE)
                        return
                elif tagName == "faces_select":
                    line = SolutionDomainModel(self.case).getSelectCommand()
                    status = 'on'
                    if line:
                        t = PageText()
                        Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_SELECTONE)
                        return
                elif tagName == "faces_periodic":
                    line = SolutionDomainModel(self.case).getFacesPeriodicSelection(self.perio)
                    status = 'on'
                    if line:
                        t = PageText()
                        Dialog.ShowInfo(self.master, title=t.WARNING, text=t.MSG_PERIOONE)
                        return
                else:
                    status = 'on'
            SolutionDomainModel(self.case).setStatusNode(nodesList[inode], status)

            # 3) Update istbox
            #
            default = SolutionDomainModel(self.case).getFacesSelect(nodesList, inode)
            name = self.listboxLabel(SolutionDomainModel(self.case).getStatusNode(nodesList[inode])
                    , tagName, default['color'], default['group'], default['fraction'], default['plan'], default['type'], default['reverse'])
            if name:
                list.listbox.delete(index)
                list.listbox.insert(index, name)

        self.stbar.idle()


    def getFacesCutting(self, event=None):
        """
        Do we cut any faces ?
        """
        self.stbar.busy()

        answer = self.df_on_off.get()
        SolutionDomainModel(self.case).setCutStatus(answer)
        if answer == 'off':
            self.w132.pack_forget()
        else:
            self.w132.pack(side=TOP, anchor=W)

        self.stbar.idle()


    def getPasteCutParam(self, var, node, event=None):
        """
        Input '-dec-faces' parameters.
        """
        self.stbar.busy()

        self.getFacesCutting()

        # Input information only if it is different from default value
        #
        if self.check2.isPositive(self.ewarp, var):
            SolutionDomainModel(self.case).setCutAngle(var.get())

        self.stbar.idle()


    def getSyrthesCoupling(self, event=None):
        """
        Do we have a syrthes coupling ?
        """
        self.stbar.busy()

        answer = self.syr_on_off.get()
        SolutionDomainModel(self.case).setSyrthesCouplingStatus(answer)

        if answer == 'off':
            self.sp31.pack_forget()
            self.sp32.pack_forget()
            self.w32.pack_forget()
            self.wf2d.pack_forget()
        else:
            self.sp31.pack(side=TOP, fill=X)
            self.w32.pack(side=TOP)
            self.sp32.pack(side=TOP, fill=X)
            self.wf2d.pack(side=BOTTOM, anchor=W, padx=40, pady=5)
            if SolutionDomainModel(self.case).getSyrthes2dMeshStatus() == 'on':
                self.box32[0].select()
            else:
                self.box32[1].select()

        self.stbar.idle()


    def getSyrthes2dMesh(self, event=None):
        """
        Is the mesh for Syrthes a 2D mesh ?
        This command is invoked with 2 arguments. The first is the name of the
        button subwidget that has toggled. The second is a boolean value
        indicating whether the button subwidget is selected.
        """
        self.stbar.busy()

        if self.syr2d_on_off.get() == 'on':
            SolutionDomainModel(self.case).setSyrthes2dMeshStatus('on')
        else:
            SolutionDomainModel(self.case).delSyrthes2dMeshNode()
            self.box32[1].select()

        self.stbar.idle()


    def setValuesTranslation(self):
        """
        Put values found in xml file as soon as mode is "translation"
        """
        if not SolutionDomainModel(self.case).getTranslationDir(self.perio):
            SolutionDomainModel(self.case).setTranslationDefault(self.perio) 
        else:
            dx, dy, dz = SolutionDomainModel(self.case).getTranslationDir(self.perio)

        self.x_tv.set(dx)
        self.y_tv.set(dy)
        self.z_tv.set(dz)


    def setValuesRotation1(self, mode):
        """
        Put values found in xml file as soon as mode is "rotation1"
        """
        if not SolutionDomainModel(self.case).getRotationAngle(self.perio) and not SolutionDomainModel(self.case).getRotationDir(self.perio) and not SolutionDomainModel(self.case).getRotationCenter(self.perio, mode):
            SolutionDomainModel(self.case).setRotation1Default(self.perio) 
        else:
            angle = SolutionDomainModel(self.case).getRotationAngle(self.perio)
            rx, ry, rz = SolutionDomainModel(self.case).getRotationDir(self.perio)
            px, py, pz = SolutionDomainModel(self.case).getRotationCenter(self.perio, mode)

        self.ang_r1.set(angle)
        self.dx_r1.set(rx)
        self.dy_r1.set(ry)
        self.dz_r1.set(rz)
        self.ptx_r1.set(px)
        self.pty_r1.set(py)
        self.ptz_r1.set(pz)


    def setValuesRotation2(self, mode):
        """
        Put values found in xml file as soon as mode is "rotation"2
        """
        if not SolutionDomainModel(self.case).getRotationMatrix(self.perio, mode):
            SolutionDomainModel(self.case).setRotation2Default(self.perio)
        else:
            m11,m12,m13,m21,m22,m23,m31,m32,m33 = SolutionDomainModel(self.case).getRotationMatrix(self.perio, mode)
            px, py, pz = SolutionDomainModel(self.case).getRotationCenter(self.perio, mode)

        self.mat11.set(m11)
        self.mat12.set(m12)
        self.mat13.set(m13)
        self.mat21.set(m21)
        self.mat22.set(m22)
        self.mat23.set(m23)
        self.mat31.set(m31)
        self.mat32.set(m32)
        self.mat33.set(m33)
        self.ptx_r2.set(px)
        self.pty_r2.set(py)
        self.ptz_r2.set(pz)
        

    def setValuesPeriodicTransformation(self, mode):
        """
        Put values found in xml file as soon as mode of
        transformation is choosen
        """
        if mode == "translation" :
            self.setValuesTranslation()
        if mode == "rotation1":
            self.setValuesRotation1(mode)
        if mode == "rotation2":
            self.setValuesRotation2(mode)
        if mode == "tr+rota1":
            self.setValuesTranslation()
            self.setValuesRotation1(mode)
        if mode == "tr+rota2":
            self.setValuesTranslation()
            self.setValuesRotation2(mode)


    def getPeriodicity(self, event=None):
        """
        Do we have a periodicity ?
        """
        self.stbar.busy()

        answer = self.perio_on_off.get()

        if answer == 'off':
            self.w22.pack_forget()
            SolutionDomainModel(self.case).setPeriodicStatus(answer)
        else:
            self.sp21.pack(side=TOP, fill=X)
            self.w22.pack(side=TOP)
            SolutionDomainModel(self.case).setPeriodicStatus(answer)
            self.getPeriodicityMode()

        self.stbar.idle()


    def getPeriodicityMode(self, event=None):
        """
        Do we have a periodicity ?
        """
        self.stbar.busy()


        if self.perio_mode.get() =="":
            self.b22.config(value='translation')
            self.setValuesTranslation()

        if self.perio_mode.get() == "translation":
            self.rota1.pack_forget()
            self.rota2.pack_forget()
            self.faces.pack(side=TOP, fill=X, padx=5, pady=5)
            self.tvect.pack(side=TOP, fill=X, padx=5, pady=5)
            self.setValuesTranslation()

        elif self.perio_mode.get() == "rotation1":
            self.tvect.pack_forget()
            self.rota2.pack_forget()
            self.faces.pack(side=TOP, fill=X, padx=5, pady=5)
            self.rota1.pack(side=TOP, fill=X, padx=5, pady=5)
            self.setValuesRotation1(self.perio_mode.get())

        elif self.perio_mode.get() == "rotation2":
            self.tvect.pack_forget()
            self.rota1.pack_forget()
            self.faces.pack(side=TOP, fill=X, padx=5, pady=5)
            self.rota2.pack(side=TOP, fill=X, padx=5, pady=5)
            self.setValuesRotation2(self.perio_mode.get())

        elif self.perio_mode.get() == "tr+rota1":
            self.rota2.pack_forget()
            self.faces.pack(side=TOP, fill=X, padx=5, pady=5)
            self.tvect.pack(side=TOP, fill=X, padx=5, pady=5)
            self.rota1.pack(side=TOP, fill=X, padx=5, pady=5)
            self.setValuesTranslation()
            self.setValuesRotation1(self.perio_mode.get())

        elif self.perio_mode.get() == "tr+rota2":
            self.rota1.pack_forget()
            self.faces.pack(side=TOP, fill=X, padx=5, pady=5)
            self.tvect.pack(side=TOP, fill=X, padx=5, pady=5)
            self.rota2.pack(side=TOP, fill=X, padx=5, pady=5)
            self.setValuesTranslation()
            self.setValuesRotation2(self.perio_mode.get())
        SolutionDomainModel(self.case).setPeriodicTransformation(self.perio, self.perio_mode.get())
        self.setValuesPeriodicTransformation(self.perio_mode.get())
        self.stbar.idle()


    def getDirTranslation(self, i, dir, val, event=None):
        """
        Periodicity translation
        """
        self.stbar.busy()

        if self.check2.hasType(self.enttv[i], val):
            if self.perio_mode.get() != "rotation1" or self.perio_mode.get() != "rotation2":
                SolutionDomainModel(self.case).setTranslationDir(self.perio, dir, val.get())
          
        self.stbar.idle()


    def getDirRotation(self, i, dir, val, event=None):
        """
        Periodicity rotation
        """
        self.stbar.busy()

        if self.check2.hasType(self.entr1[i], val):
            if self.perio_mode.get() == "rotation1" or self.perio_mode.get() =="tr+rota1":
                SolutionDomainModel(self.case).setRotationDir(self.perio, dir, val.get())
          
        self.stbar.idle()


    def getAngleRotation(self, angle, event=None):
        """
        Periodicity rotation angle
        """
        self.stbar.busy()

        if self.check2.hasType(self.entang, angle):
            if self.perio_mode.get() == "rotation1" or self.perio_mode.get() =="tr+rota1":
                SolutionDomainModel(self.case).setRotationAngle(self.perio, angle.get())
          
        self.stbar.idle()


    def getCenterRotation(self, i, pos, val, event=None):
        """
        Periodicity : center of rotation 
        """
        self.stbar.busy()

        if self.check2.hasType(self.eptr1[i], val) or self.check2.hasType(self.eptr2[i], val):
            if self.perio_mode.get() != "translation":
                SolutionDomainModel(self.case).setRotationCenter(self.perio, self.perio_mode.get(), pos, val.get())
          
        self.stbar.idle()


    def getMatrixRotation(self, i, pos, val, event=None):
        """
        Periodicity translation
        """
        self.stbar.busy()

        if self.check2.hasType(self.entmat[i], val):
           if self.perio_mode.get() == "rotation2" or self.perio_mode.get() == "tr+rota2":
               SolutionDomainModel(self.case).setRotationMatrix(self.perio, self.perio_mode.get(), pos, val.get())
          
        self.stbar.idle()


    def getSyrthes2dMesh(self, event=None):
        """
        Is the mesh for Syrthes a 2D mesh ?
        This command is invoked with 2 arguments. The first is the name of the
        button subwidget that has toggled. The second is a boolean value
        indicating whether the button subwidget is selected.
        """
        self.stbar.busy()

        if self.syr2d_on_off.get() == 'on':
            SolutionDomainModel(self.case).setSyrthes2dMeshStatus('on')
        else:
            SolutionDomainModel(self.case).delSyrthes2dMeshNode()
            self.box32[1].select()

        self.stbar.idle()

##        #TODO: à deplacer dans batchRunning (idem pour appel à classe
##    def getEchoComm(self, event=None):
##        """
##        Tab 4: Input '-echo-comm' parameters : when the echo-comm is NO, no
##        input is set in the case, when the echo-comm is YES,
##        the value of the number of element to display is put in
##        the node 'echo_communication'.
##        """
##        self.stbar.busy()
##
##        # Input information only if it is different from default value
##        #
##        self.sp.pack_forget()
##        self.w43.pack_forget()
####        if self.ec_on_off.get() == 'off':
####            SolutionDomainModel(self.case).setEchoCommStatus("off")
##
####        else:
####            SolutionDomainModel(self.case).setEchoCommStatus("on")
##        if self.ec_on_off.get() != 'off':
##            self.sp.pack(side=TOP, fill=X)
##            self.w43.pack(side=TOP, padx=10)
##            self.getEchoNum()
##
##
##        self.stbar.idle()
##
##
##
##    def getEchoNum(self, event=None):
##        """
##        Tab 4: Input value of number of elements when echo-comm is ON
##        """
##        self.stbar.busy()
##
##        num = self.echo_num.get()
##        #TODO: à déplacer ds batchRunning ains que l'appel à la classe
####        if self.check2.isPositive(self.e41, self.echo_num):
####            SolutionDomainModel(self.case).setNbElementEchocomm(num)
##
##        self.stbar.idle()


    def getSimComm(self):
        """
        Tab 4: Simmulation of communication (-sim-comm)
        """
        self.stbar.busy()

        v = self.sc_on_off.get()

        # Warning: the node sim-comm can not be erase when the value its 'off'
        # because of the default value is 'on'.
        #
        SolutionDomainModel(self.case).setSimCommStatus(v)
        if v == 'on':
            self.b52.config(state=DISABLED)
            self.l52.config(state=DISABLED)
        else:
            self.b52.config(state=NORMAL)
            self.l52.config(state=NORMAL)

        self.stbar.idle()


    def getAsciiComm(self):
        """
        Tab 4: Communication file in ascii (-ascii)
        """
        self.stbar.busy()

        v = self.ascii_on_off.get()
        SolutionDomainModel(self.case).setAsciiCommStatus(v)

        self.stbar.idle()


##    def getMeshCheck(self):
##        """
##        Tab 4: Check mesh
##        """
##        self.stbar.busy()
##        SolutionDomainModel(self.case).setMeshCheckStatus(self.check_on_off.get())
##        self.stbar.idle()


    def getPostProcessing(self, event=None):
        """
        Tab 4: Activate/Desactivate the Ensight command
        """
        self.stbar.busy()

        self.s57.pack_forget()
        self.w57.pack_forget()

        v = self.post_on_off.get()
        SolutionDomainModel(self.case).setEnsightStatus(v)

        m = self.med_on_off.get()
        SolutionDomainModel(self.case).setMedStatus(m)

        if v == 'off':
            self.l57.config(state=DISABLED)
            self.b57.config(state=DISABLED)
        if m == 'off':
            self.e56.select_range(0,0)
            self.e56.config(state=DISABLED, bg='grey')
            self.l56.config(state=DISABLED)
        elif m == 'on':
            self.e56.config(state=NORMAL)
            self.l56.config(state=NORMAL)
            self.check2.begin(self.e56)
        else:
            self.e56.config(state=NORMAL)
            self.l56.config(state=NORMAL)
            self.check2.begin(self.e56)
            self.s57.pack(side=TOP, padx=5, fill=X)
            self.w57.pack(side=TOP, padx=10)
            self.l57.config(state=NORMAL)
            self.b57.config(state=NORMAL)

        self.stbar.idle()


    def getPostDirectory(self, event=None):
        """
        Tab 4: Name of the Ensight Case directory
        """
        self.stbar.busy()

        dir = self.post_dir.get()

        if dir != 'cas_defaut':
            SolutionDomainModel(self.case).createPostDir(dir)
            self.check2.begin(self.e56)
        else:
            SolutionDomainModel(self.case).delPostDir()
##            SolutionDomainModel(self.case).delMed()

        self.stbar.idle()



    def getPolygonalFacesCut(self, event=None):
        """
        Tab 4: If some faces are not triangle or square, there are cut
        """
        self.stbar.busy()

        v = self.dec_poly_on_off.get()
        if v == 'on':
            SolutionDomainModel(self.case).setPolygonalNodeStatus(v)
        else:
            SolutionDomainModel(self.case).delPolygonalNode()

        self.stbar.idle()


    def ecsBatchRunning(self):
        """
        Tab 4: 
        """
        t = PageText()
        self.stbar.busy()

        # a  info to say that batch running and the results are in RESU directory
        #
        #Dialog.ShowInfo(self.master, title=t.RUNNING,
        ans = Dialog.askyesno(self.master, title=t.RUNNING,
                                image='ordinateur.gif', text=t.MSG_BATCH)
                                #image='sablier.gif', text=t.MSG_BATCH)

        if ans == 'no': 
            self.stbar.idle()
            return

        lines = []

        # Meshes and formats list
        #
        nameList = SolutionDomainModel(self.case).getMeshList()

        line_mesh = SolutionDomainModel(self.case).getMeshCommand()
        lines.append(line_mesh)

        # Paste
        #
        line_paste = SolutionDomainModel(self.case).getPasteCommand()
        lines.append(line_paste)

        # Cut
        #
        line_cut = SolutionDomainModel(self.case).getCutCommand()
        lines.append(line_cut)

        # perio
        #
        line_perio = SolutionDomainModel(self.case).getPerioCommand(self.perio)
        lines.append(line_perio)


##        # syrthes
##        #
##        line_syr = SolutionDomainModel(self.case).getSyrthesCommand()
##        lines.append(line_syr)

        #TODO: à déplacer dans batchRunning (+ appel à classe)
##        # echo-comm
##        #
##        line_echo = SolutionDomainModel(self.case).getEchoCommCommand()
##        lines.append(line_echo)

        # sim-comm
        #
        line_sim = SolutionDomainModel(self.case).getSimCommCommand()
        lines.append(line_sim)

        # ascii
        #

##        # verif
##        #
##        line_verif = SolutionDomainModel(self.case).getVerifMaillCommand()
##        lines.append(line_verif)

        # select
        #
        line_sel = SolutionDomainModel(self.case).getSelectCommand()
        lines.append(line_sel)

        # ensight/cas
        #
        line_ens = SolutionDomainModel(self.case).getEnsightCommand()
        lines.append(line_ens)

        line_med = SolutionDomainModel(self.case).getMedCommand()
        lines.append(line_med)

        # Write the list "lines" in the new file
        #
        lines.append(" ")

        file = self.case['resu_path']+ '/' +'ecs_gui_cmd'
        f = open(file, 'w')
        f.writelines(lines)
        f.close()
        os.system('chmod +x ' + file)
        # on recupere la variable d'environnement de l'enveloppe dans "lance"
        # et on execute l'enveloppe
        #toto = os.popen('grep "ECS=/" ' + self.case['scripts_path'] + '/lance' + ' &').read()
        toto = os.popen('echo $ECS_HOME').read()
        cmd = toto[:-1] + "/bin/ecs -cwd "
        os.system(cmd +self.case['resu_path'] + ' -in ' + file + ' | tee '+ self.case['resu_path'] +'/listenv.pre &')

        self.stbar.idle()


    def DoubleClick(self, event=None):
        """
        This method is correcting a Tkinter bug with the listbox widget.
        Note : The following Sequence does not work with the listbox widget:
        - Double-1
        - Return
        - Up
        - Down
        About events, see www.python.org 16.1.6.7
        """
        if abs(event.time - self.time) < 300:
            print "widget = ", event.widget
        self.time = event.time


    def _make_page1(self):
        """
        The first page of the notebook is devoted the the meshes:
        - selection
        - paste
        - warp faces cutting
        """
        t = PageText()

        # Frames for layout
        #
        top = Tix.Frame(self.nb.page1, bd=2, relief=GROOVE)
        top.pack(side=TOP, fill=X, padx=10, pady=10)

        w11 = Tix.Frame(top, relief=FLAT)
        w11.pack(side=TOP, pady=10)

        # Meshes List in a Listbox
        #
        w111 = Tix.Frame(w11, relief=FLAT)
        w111.pack(side=LEFT)

        l111 = Tix.Label(w111, relief=FLAT, text=t.MESHES_LIST)
        l111.pack(side=TOP, anchor=W, padx=10)
        self.balloon.bind_widget(l111, balloonmsg=t.KEYWORD_E+"-maillage")

        self.list = Tix.ScrolledListBox(w111, scrollbar='auto +x +y', width=250, height=100)
        self.list.vsb.config(width=10, bd=1)
        self.list.hsb.config(width=10, bd=1)
        self.list.pack(side=LEFT, padx=10)
        self.balloon.bind_widget(self.list, balloonmsg=t.KEYWORD_E+"-maillage")


        # Meshes selection
        #
        w112 = Tix.Frame(w11, relief=FLAT)
        w112.pack(side=LEFT, padx=10, pady=5)


        # Add and Kill buttons
        #
        w113 = Tix.Frame(w112, relief=FLAT)
        w113.pack(side=TOP, anchor=W)


        self.img113 = Tix.PhotoImage(file=PIC_PATH+'search1.gif')
        b113 = Tix.Button(w113, image=self.img113, command=self.searchMesh)
        b113.grid(row=0, column=1, sticky=W, pady=5)
        self.balloon.bind_widget(b113, balloonmsg=t.SEARCH_MESH)

        self.img114 = Tix.PhotoImage(file=PIC_PATH+'skull.gif')
        b114 = Tix.Button(w113, image=self.img114, command=self.delMesh)
        b114.grid(row=1, column=1, sticky=W)
        self.balloon.bind_widget(b114, balloonmsg=t.MSG_DEL_MESH)

        # Separator
        #
        Tix.Frame(top, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)

        # Paste meshes
        #
        w12 = Tix.Frame(top, relief=FLAT)
        w12.pack(side=TOP, anchor=CENTER, padx=10, pady=5)

        w121 = Tix.Frame(w12, relief=FLAT)
        w121.pack(side=TOP, anchor=W, pady=5)

        l121 = Tix.Label(w121, text=t.PASTE_MESHES)
        l121.grid(row=0, column=0, sticky=W)
        self.balloon.bind_widget(l121, balloonmsg=t.KEYWORD_E+"-recollement")

        self.b121 = [0]*2
        for (i, tx1, tx2) in [(0, t.ON,  'on') ,
                              (1, t.OFF, 'off') ]:

            self.b121[i] = Tix.Radiobutton(w121, text=tx1, value=tx2,
                                           variable=self.rc_on_off,
                                           command=self.getPasteMeshes)
            self.b121[i].grid(row=0, column=i+1, padx=3, sticky=E)

        # Sélection de faces pour affichages
        #
        self.w122 = Tix.Frame(w12, relief=FLAT)
        self.w122.pack(side=TOP, anchor=W, pady=5)

        l122 = Tix.Label(self.w122, text=t.PASTE_FACES)
        l122.pack(side=TOP, anchor=W)
        self.balloon.bind_widget(l122, statusmsg=t.MSG_PASTE_SEL)

        self.list1 = Tix.ScrolledListBox(self.w122, scrollbar='auto +x +y',
                                         width=350, height=90)
        self.list1.vsb.config(width=10, bd=1)
        self.list1.hsb.config(width=10, bd=1)
        self.list1.pack(side=TOP, anchor=W)
        #self.list1.listbox.bind('<1>', self.DoubleClick)
        self.balloon.bind_widget(self.list1, statusmsg=t.MSG_PASTE_SEL)

        box1 = Tix.ButtonBox(self.w122, orientation=HORIZONTAL, relief=FLAT)
        box1.add('create', text=t.ADD,
                 command=TkPage.Callback(self.addListbox, 
                 self.node_paste, 'faces_paste', self.list1))
        box1.add('modify', text=t.MODIFY,
                 command=TkPage.Callback(self.modifyListbox,
                 self.node_paste, 'faces_paste', self.list1))
        box1.add('erase', text=t.ERASE,
                 command=TkPage.Callback(self.delListbox,
                 self.node_paste, 'faces_paste', self.list1))
        box1.add('active', text=t.ACTDESAC,
                 command=TkPage.Callback(self.activeListbox,
                 self.node_paste, 'faces_paste', self.list1))
        box1.pack(side=TOP, anchor=W, pady=5)

        # Separator
        #
        Tix.Frame(top, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)

        # Faces cutting
        #
        w13 = Tix.Frame(top, relief=FLAT)
        w13.pack(side=TOP, anchor=CENTER, padx=10, pady=5)

        w131 = Tix.Frame(w13, relief=FLAT)
        w131.pack(side=TOP, anchor=W)

        l131 = Tix.Label(w131, text=t.CUTTING)
        l131.grid(row=0, column=0, pady=5, sticky=W)
        self.balloon.bind_widget(l131, balloonmsg=t.KEYWORD_E+"-dec-faces")

        self.c131 = [0]*2
        for (i, tx1, tx2) in [(0, t.ON,'on'),
                              (1, t.OFF, 'off')]:

            self.c131[i] = Tix.Radiobutton(w131, text=tx1, value=tx2,
                                           variable=self.df_on_off,
                                           command=self.getFacesCutting)
            self.c131[i].grid(row=0, column=i+1, padx=3, pady=5, sticky=E)

        self.w132 = Tix.Frame(w13, relief=FLAT)
        self.w132.pack(side=TOP, anchor=W)

        l132 = Tix.Label(self.w132, text=t.WARP)
        l132.grid(row=0, column=0, pady=5, sticky=W)
        self.balloon.bind_widget(l132, statusmsg=t.MSG_CUTTING)

        self.ewarp = Tix.Entry(self.w132, bd=2, width=10, textvariable=self.warp)
        self.ewarp.grid(row=0, column=1, pady=5, padx=3, sticky=E)
        self.ewarp.event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
        self.ewarp.bind ("<<Event>>", TkPage.Callback(self.getPasteCutParam,self.warp,self.node_cut))


    def _make_page2(self):
        """
        The second page of the notebook is devoted the the periodic boundaries.
        """
        t = PageText()
        
        # Frames for layout
        #
        top = Tix.Frame(self.nb.page2, bd=2, relief=GROOVE)
        top.pack(side=TOP, fill=X, padx=10, pady=10)

        w20 = Tix.Frame(top, relief=FLAT)
        w20.pack(side=TOP, pady=5)

        w21 = Tix.Frame(w20, relief=FLAT)
        w21.pack(side=TOP, pady=5)

        l21 = Tix.Label(w21, text=t.PERIODICITY)
        l21.grid(row=0, column=0, sticky=W)
    #	self.balloon.bind_widget(l21, balloonmsg=t.KEYWORD_E+"-perio")

        self.b21 = [0]*2
        for (i, tx1, tx2) in [(0, t.ON, 'on'  ),
                              (1, t.OFF, 'off') ]:

            self.b21[i] = Tix.Radiobutton(w21, text=tx1, value=tx2,
                                          variable=self.perio_on_off,
                                          command=self.getPeriodicity)
            self.b21[i].grid(row=0, column=i+1, padx=3, sticky=E)


        # Periodic mode 

        self.w22 = Tix.Frame(w20, relief=FLAT)
        self.w22.pack(side=TOP, anchor=W, pady=5)

        #separator
        self.sp21 = Tix.Frame(self.w22, height=2, bd=2, relief=SUNKEN)
        self.sp21.pack(side=TOP, fill=X)

        #Choice of periodicity's mode

        w221 = Tix.Frame(self.w22, relief=FLAT)
        w221.pack(side=TOP, pady=0)

        self.b22 = Tix.OptionMenu(w221, options='menubutton.width 45')
        self.b22.menubutton.config(bd=2, relief=RAISED)
        self.balloon.bind_widget(self.b22, statusmsg=t.MSG_PERIO_MODE,
                                 balloonmsg=t.KEYWORD+"-trans or -rota")

        self.b22.grid(row=0, column=0, padx=10, pady=20)
        self.b22.add_command('translation',  label=t.TRANS)
        self.b22.add_command('rotation1',    label=t.ROTA1)
        self.b22.add_command('rotation2',    label=t.ROTA2)
        self.b22.add_command('tr+rota1',    label=t.TETROTA1)
        self.b22.add_command('tr+rota2',    label=t.TETROTA2)
        self.b22.config(variable=self.perio_mode,
                       command=self.getPeriodicityMode)
        
        #list of faces for type of periodicity
        self.faces = Tix.LabelFrame(self.w22, label=t.FACES_PERIO, relief=FLAT)
        self.faces.label.config(font=fT)
        self.faces.pack(side=TOP, fill=X)

        self.wlist = Tix.Frame(self.faces.frame, relief=FLAT)
        self.wlist.pack(side=TOP, pady=0)

        self.listp = Tix.ScrolledListBox(self.wlist, scrollbar='auto +x +y',
                                         width=350, height=50)
        self.listp.vsb.config(width=10, bd=1)
        self.listp.hsb.config(width=10, bd=1)
        self.listp.pack(side=TOP, anchor=W)

        boxp = Tix.ButtonBox(self.wlist, orientation=HORIZONTAL, relief=FLAT)
        boxp.add('create', text=t.ADD,
                 command=TkPage.Callback(self.addListbox, 
                 self.node_perio, 'faces_periodic', self.listp))
        boxp.add('modify', text=t.MODIFY,
                 command=TkPage.Callback(self.modifyListbox,
                 self.node_perio, 'faces_periodic', self.listp))
        boxp.add('erase', text=t.ERASE,
                 command=TkPage.Callback(self.delListbox,
                 self.node_perio, 'faces_periodic', self.listp))
        boxp.add('active', text=t.ACTDESAC,
                 command=TkPage.Callback(self.activeListbox,
                 self.node_perio, 'faces_periodic', self.listp))
        boxp.pack(side=TOP, anchor=W, pady=5)

        #Type of periodicity's mode

        self.tvect = Tix.LabelFrame(self.w22, label=t.TRANS_VECT, relief=FLAT)
        self.tvect.label.config(font=fT)
        self.tvect.pack(side=TOP, fill=X, padx=5)

        self.tval = Tix.Frame(self.tvect.frame, relief=FLAT)
        self.tval.pack(side=TOP, fill=X, padx=5)

        self.labtv = [0]*3
        self.enttv = [0]*3
        for (i, dir, xmldir, var) in [(0, 'TX', 'translation_x', self.x_tv),
                                      (1, 'TY', 'translation_y', self.y_tv),
                                      (2, 'TZ', 'translation_z', self.z_tv)]:
            self.labtv[i] = Tix.Label(self.tval, text=dir)
            self.labtv[i].grid(row=0, column=i*2, padx=5, pady=2) 
            self.balloon.bind_widget(self.labtv[i],balloonmsg=t.KEYWORD+"-trans")

            self.enttv[i] = Tix.Entry(self.tval, bd=2, width=10, textvariable=var)
            self.enttv[i].grid(row=0, column=1+i*2, padx=5, pady=2)
            self.enttv[i].event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
            self.enttv[i].bind ("<<Event>>", TkPage.Callback(self.getDirTranslation, i, xmldir, var))

        
        #definition of rotation with angle and vector
        self.rota1 = Tix.LabelFrame(self.w22, label=t.ROTA_ANG, relief=FLAT)
        self.rota1.label.config(font=fT)
        self.rota1.pack(side=TOP, fill=X, padx=5)

        #          for angle
        self.rotang = Tix.Frame(self.rota1.frame, relief=FLAT)
        self.rotang.pack(side=TOP, fill=X, padx=0)

        self.labang = Tix.Label(self.rotang, text="angle")
        self.labang.grid(row=0, column=0,padx=5, pady=2)
        self.entang = Tix.Entry(self.rotang, bd=2, width=10, textvariable=self.ang_r1)
        self.entang.grid(row=0, column=1, padx=5, pady=2)
        self.entang.event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
        self.entang.bind ("<<Event>>", TkPage.Callback(self.getAngleRotation, self.ang_r1))
        self.uniang = Tix.Label(self.rotang, text='deg')
        self.uniang.grid(row=0, column=2, padx=5, pady=2)
        
        #         separator
        Tix.Frame(self.rota1.frame, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)

        #         for direction vector
        self.rotdir = Tix.Frame(self.rota1.frame, relief=FLAT)
        self.rotdir.pack(side=TOP, fill=X, padx=0)
    
        self.labdir = Tix.Label(self.rotdir, text=t.VECTDIR)
        self.labdir.grid(row=0, column=0, columnspan=9, padx=10)
        self.labr1 = [0]*3
        self.entr1 = [0]*3
        for (i, dir, xmldir, var) in [(0, 'DX', "rotation_x", self.dx_r1),
                                      (1, 'DY', "rotation_y", self.dy_r1),
                                      (2, 'DZ', "rotation_z", self.dz_r1)]:
            self.labr1[i] = Tix.Label(self.rotdir, text=dir)
            self.labr1[i].grid(row=1, column=i*2, padx=5, pady=2) 
            self.balloon.bind_widget(self.labr1[i],balloonmsg=t.KEYWORD+"-trans")

            self.entr1[i] = Tix.Entry(self.rotdir, bd=2, width=10, textvariable=var)
            self.entr1[i].grid(row=1, column=1+i*2, padx=5, pady=2)
            self.entr1[i].event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
            self.entr1[i].bind ("<<Event>>", TkPage.Callback(self.getDirRotation, i, xmldir, var))

        #         separator
        Tix.Frame(self.rota1.frame, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)

        #         for center of rotation
        self.rotcen = Tix.Frame(self.rota1.frame, relief=FLAT)
        self.rotcen.pack(side=TOP, fill=X, padx=0)

        self.labpt = Tix.Label(self.rotcen, text=t.PT)
        self.labpt.grid(row=0, column=0, columnspan=9, padx=10)
        self.lptr1 = [0]*3
        self.eptr1 = [0]*3
        for (i, pos, xmlpos, val) in [(0, 'X', "rotation_center_x", self.ptx_r1),
                                      (1, 'Y', "rotation_center_y", self.pty_r1),
                                      (2, 'Z', "rotation_center_z", self.ptz_r1)]:
            self.lptr1[i] = Tix.Label(self.rotcen, text=pos)
            self.lptr1[i].grid(row=1, column=i*2, padx=5, pady=5) 
            self.eptr1[i] = Tix.Entry(self.rotcen, bd=2, width=10, textvariable=val)
            self.eptr1[i].grid(row=1, column=1+i*2, padx=5, pady=5)
            self.eptr1[i].event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
            self.eptr1[i].bind ("<<Event>>", TkPage.Callback(self.getCenterRotation, i, xmlpos, val))


        #definition of rotation with matrice
        self.rota2 = Tix.LabelFrame(self.w22, label=t.ROTA_ANG, relief=FLAT)
        self.rota2.label.config(font=fT)
        self.rota2.pack(side=TOP, fill=X, padx=5)

        self.rotmat = Tix.Frame(self.rota2.frame, relief=FLAT)
        self.rotmat.pack(side=TOP, fill=X, padx=0)

        self.labm = Tix.Label(self.rotmat, text=t.MAT)
        self.labm.grid(row=0, column=0, columnspan=9, padx=10, pady=10)
        self.labmat = [0]*9
        self.entmat = [0]*9
        for (i,r,c,num,xmlm,var) in [(0, 1, 0, 'm11', "rotation_matrix_11",self.mat11),
                                     (1, 1, 3, 'm12', "rotation_matrix_12",self.mat12),
                                     (2, 1, 6, 'm13', "rotation_matrix_13",self.mat13), 
                                 (3, 2, 0, 'm21', "rotation_matrix_21",self.mat21),
                         (4, 2, 3, 'm22', "rotation_matrix_22",self.mat22),
                                     (5, 2, 6, 'm23', "rotation_matrix_23",self.mat23),
                             (6, 3, 0, 'm31', "rotation_matrix_31",self.mat31), 
                         (7, 3, 3, 'm32', "rotation_matrix_32",self.mat32),
                                     (8, 3, 6, 'm33', "rotation_matrix_33",self.mat33)]:
            self.labmat[i] = Tix.Label(self.rotmat, text=num)
            self.labmat[i].grid(row=r, column=c, padx=2, pady=2, sticky=E) 
            self.balloon.bind_widget(self.labmat[i],balloonmsg=t.KEYWORD+"-trans")

            self.entmat[i] = Tix.Entry(self.rotmat, bd=2, width=10, textvariable=var)
            self.entmat[i].grid(row=r, column=c+1, padx=2, pady=2, sticky=W)
            self.entmat[i].event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
            self.entmat[i].bind ("<<Event>>", TkPage.Callback(self.getMatrixRotation, i, xmlm, var))

        #         separator
        Tix.Frame(self.rota2.frame, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)

        #         for direction vector
        self.rotdir2 = Tix.Frame(self.rota2.frame, relief=FLAT)
        self.rotdir2.pack(side=TOP, fill=X, padx=0)

        self.labpt2 = Tix.Label(self.rotdir2, text=t.PT)
        self.labpt2.grid(row=0, column=0, columnspan=9, padx=10)
        self.lptr2 = [0]*3
        self.eptr2 = [0]*3
        for (i, pos, xmlpos, val) in [(0, 'X', "rotation_center_x", self.ptx_r2),
                                      (1, 'Y', "rotation_center_y", self.pty_r2),
                                      (2, 'Z', "rotation_center_z", self.ptz_r2)]:
            self.lptr2[i] = Tix.Label(self.rotdir2, text=pos)
            self.lptr2[i].grid(row=1, column=i*3, pady=5) 
            self.eptr2[i] = Tix.Entry(self.rotdir2, bd=2, width=10, textvariable=val)
            self.eptr2[i].grid(row=1, column=1+i*3, pady=5)
            self.eptr2[i].event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
            self.eptr2[i].bind ("<<Event>>", TkPage.Callback(self.getCenterRotation, i, xmlpos, val))


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

        # syrthes coupling
        #
        top = Tix.Frame(self.nb.page3, bd=2, relief=GROOVE)
        top.pack(side=TOP, fill=X, padx=10, pady=10)

        w30 = Tix.Frame(top, relief=FLAT)
        w30.pack(side=TOP, pady=5)

        w31 = Tix.Frame(w30, relief=FLAT)
        w31.pack(side=TOP, anchor=W, pady=5)

        l31 = Tix.Label(w31, text=t.SYRTHES_COUPLING)
        l31.grid(row=0, column=0, sticky=W)
        self.balloon.bind_widget(l31, balloonmsg=t.KEYWORD_E+"-syrthes")

        self.b31 = [0]*2
        for (i, tx1, tx2) in [(0, t.ON, 'on'  ),
                              (1, t.OFF, 'off') ]:

            self.b31[i] = Tix.Radiobutton(w31, text=tx1, value=tx2,
                                          variable=self.syr_on_off,
                                          command=self.getSyrthesCoupling)
            self.b31[i].grid(row=0, column=i+1, padx=3, sticky=E)

        # Separator
        #
        #Tix.Frame(top, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)
        self.sp31 = Tix.Frame(top, height=2, bd=2, relief=SUNKEN)
        self.sp31.pack(side=TOP, fill=X)
        #

        self.w32 = Tix.Frame(top, relief=FLAT)
        self.w32.pack(side=TOP, pady =5)

        w321 = Tix.Frame(self.w32, relief=FLAT)
        w321.pack(side=TOP, anchor=W, pady=5)

        l321 = Tix.Label(w321, text=t.SYRTHES_FACES)
        l321.pack(side=TOP, anchor=W)
        self.balloon.bind_widget(l321, statusmsg=t.MSG_SYRTHES)

        self.list3 = Tix.ScrolledListBox(w321, scrollbar='auto +x +y',
                                         width=350, height=90)
        self.list3.vsb.config(width=10, bd=1)
        self.list3.hsb.config(width=10, bd=1)
        self.list3.pack(side=TOP, anchor=W)
        self.balloon.bind_widget(self.list3, statusmsg=t.MSG_SYRTHES)

        w33 = Tix.Frame(w321, relief=FLAT)
        w33.pack(side=TOP, anchor=W, pady=5)

        box31 = Tix.ButtonBox(w33, orientation=HORIZONTAL, relief=FLAT)
        box31.add('create', text=t.ADD,
                  command=TkPage.Callback(self.addListbox, 
                  self.node_syrthes, 'faces_syrthes', self.list3))
        box31.add('modify', text=t.MODIFY,
                  command=TkPage.Callback(self.modifyListbox,
                  self.node_syrthes, 'faces_syrthes', self.list3))
        box31.add('erase', text=t.ERASE,
                  command=TkPage.Callback(self.delListbox,
                  self.node_syrthes, 'faces_syrthes', self.list3))
        box31.add('active', text=t.ACTDESAC,
                  command=TkPage.Callback(self.activeListbox,
                  self.node_syrthes, 'faces_syrthes', self.list3))
        box31.pack(side=TOP, pady=15)

        # Separator
        #
        #Tix.Frame(top, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)
        self.sp32 = Tix.Frame(top, height=2, bd=2, relief=SUNKEN)
        self.sp32.pack(side=TOP, fill=X)
        #

        self.wf2d = Tix .Frame(top, relief = FLAT)
        self.wf2d.pack(side=BOTTOM, anchor=W, padx=40, pady=5)

        l32 = Tix.Label(self.wf2d, text=t.SYRTHES_2D)
        l32.grid(row=0, column=0, padx=0, pady=10, sticky=W)

        self.box32 = [0]*2
        for (i, tx1, tx2) in [(0, t.ON, 'on'  ),
                              (1, t.OFF, 'off') ]:

            self.box32[i] = Tix.Radiobutton(self.wf2d, text=tx1, value=tx2,
                                          variable=self.syr2d_on_off,
                                          command=self.getSyrthes2dMesh)
            self.box32[i].grid(row=0, column=i+1, padx=3, sticky=E)

        #self.box32 = Tix.Select(w33, relief=FLAT, allowzero=1, radio=1, 
        #                        variable=self.syr2d_on_off,
        #                        command=self.getSyrthes2dMesh)
        #self.box32.add('mesh2d', text=t.SYRTHES_2D)
        #self.box32.pack(side=TOP, pady=15)



##    def _make_page4(self):
##        """
##        Tab 4 : MISC
##        """
##        t = PageText()
##
##
##        # ECHO COMM
##        #
##        f42 = Tix.Frame(self.nb.page4, bd=2, relief=GROOVE)
##        f42.pack(side=TOP, fill=X, padx=10, pady=10)
##
##        w42 = Tix.Frame(f42, relief=FLAT)
##        w42.pack(side=TOP, padx=10)
##
##        l42 = Tix.Label(w42, text=t.ECHO_COMM)
##        l42.grid(row=0, column=0, padx=0, pady=10, sticky=W)
##        self.balloon.bind_widget(l42, balloonmsg=t.KEYWORD_E+"-echo-comm")
##
##        self.b42 = [0]*2
##        for (i, tx1, tx2) in [(0, t.ON, 'on'  ),
##                              (1, t.OFF, 'off') ]:
##
##            self.b42[i] = Tix.Radiobutton(w42, text=tx1, value=tx2,
##                                          variable=self.ec_on_off,
##                                          command=self.getEchoComm)
##            self.b42[i].grid(row=0, column=i+1, sticky=W)
##
##        # Separator
##        self.sp = Tix.Frame(f42, height=2, bd=2, relief=SUNKEN)
##        self.sp.pack(side=TOP, fill=X)
##
##        self.w43 = Tix.Frame(f42, relief=FLAT)
##        self.w43.pack(side=TOP, padx=10)
##
##
##        #self.l43 = Tix.Label(self.w43, text=t.ECHO_VALUE, state=DISABLED)
##        self.l43 = Tix.Label(self.w43, text=t.ECHO_VALUE)
##        self.l43.grid(row=0, column=0, padx=3, pady=2, sticky=W)
##        self.balloon.bind_widget(self.l43, statusmsg=t.MSG_ECHO)
##
##        #self.e41 = Tix.Entry(self.w43, bd=2, width=10, state=DISABLED,
##        self.e41 = Tix.Entry(self.w43, bd=2, width=10,
##                             textvariable=self.echo_num)
##        self.e41.grid(row=0, column=1, pady=2, sticky=E)
##        self.e41.event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
##        self.e41.bind ("<<Event>>", self.getEchoNum)


    def _make_page4(self):
        """
        Tab 4 : STANDALONE
        """
        t = PageText()
        WIDTH = 41

        f51 = Tix.Frame(self.nb.page4, bd=2, relief=GROOVE)
        f51.pack(side=TOP, fill=X, padx=10, pady=10)

        # sim-comm
        #
        w51 = Tix.Frame(f51, relief=FLAT)
        w51.pack(side=TOP, padx=10)

        l51 = Tix.Label(w51, text=t.SIM_COMM, width=WIDTH, anchor=W)
        l51.pack(side=LEFT, padx=3, pady=10)
        self.balloon.bind_widget(l51, balloonmsg=t.KEYWORD_E+"-sim-comm",
                                 statusmsg=t.MSG_SIM_COMM)

        self.b51 = Tix.Checkbutton(w51, onvalue='on', offvalue='off',
                                   width=6, anchor=W,
                                   variable=self.sc_on_off,
                                   command=self.getSimComm)
        self.b51.pack(side=LEFT, padx=3)

        # Separator
        #
        Tix.Frame(f51, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)

        # Ascii
        #
        w52 = Tix.Frame(f51, relief=FLAT)
        w52.pack(side=TOP, padx=10)

        self.l52 = Tix.Label(w52, text=t.ASCII, width=WIDTH, anchor=W)
        self.l52.pack(side=LEFT, padx=3, pady=10)
        self.balloon.bind_widget(self.l52, balloonmsg=t.KEYWORD_E+"-ascii")

        self.b52 = Tix.Checkbutton(w52, onvalue='on', offvalue='off',
                                   width=6, anchor=W,
                                   variable=self.ascii_on_off,
                                   command=self.getAsciiComm)
        self.b52.pack(side=LEFT, padx=3)

        ####  7fev06 : TO DO : A jeter apres réponse YF (option -noeud)
        # Separator
        #
        #Tix.Frame(f51, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)

        # Noeuds
        #
        #w53 = Tix.Frame(f51, relief=FLAT)
        #w53.pack(side=TOP, padx=10)
#
#        l53 = Tix.Label(w53, text=t.NODE, width=WIDTH, anchor=W)
#        l53.pack(side=LEFT, padx=3, pady=10)
#        self.balloon.bind_widget(l53, balloonmsg=t.KEYWORD_E+"-noeud")
#
#        self.b53 = Tix.Checkbutton(w53, onvalue='on', offvalue='off',
#                                   width=6, anchor=W,
#                                   variable=self.node_on_off,
#                                   command=self.getNodeConnectivity)
#        self.b53.pack(side=LEFT, padx=3)

##        # Separator
##        #
##        Tix.Frame(f51, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)
##
##        # Verification du maillage
##        #
##        w532 = Tix.Frame(f51, relief=FLAT)
##        w532.pack(side=TOP, padx=10)
##
##        l532 = Tix.Label(w532, text=t.CHECK, width=WIDTH, anchor=W)
##        l532.pack(side=LEFT, padx=3, pady=10)
##        self.balloon.bind_widget(l532, balloonmsg=t.KEYWORD_E+"-verif")
##
##        self.b532 = Tix.Checkbutton(w532, onvalue='on', offvalue='off',
##                                   width=6, anchor=W,
##                                   variable=self.check_on_off,
##                                   command=self.getMeshCheck)
##        self.b532.pack(side=LEFT, padx=3)

        # Separator
        #
        Tix.Frame(f51, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)
        # Sélection de faces pour affichages
        #
        w54 = Tix.Frame(f51, relief=FLAT)
        w54.pack(side=TOP, padx=10, pady=5)

        w504 = Tix.Frame(w54, relief=FLAT)
        w504.pack(side=TOP, pady=5, anchor=W)

        l54 = Tix.Label(w504, text=t.SELECT_FACES)
        l54.pack(side=TOP, anchor=W)
        self.balloon.bind_widget(l54, balloonmsg=t.KEYWORD_E+"-fac-int",
                                 statusmsg=t.MSG_SELECT)

        self.list5 = Tix.ScrolledListBox(w504, scrollbar='auto +x +y',
                                         width=350, height=70)
        self.list5.vsb.config(width=10, bd=1)
        self.list5.hsb.config(width=10, bd=1)
        self.list5.pack(side=TOP, anchor=W)
        self.balloon.bind_widget(self.list5, statusmsg=t.MSG_SELECT)

        box5 = Tix.ButtonBox(w54, orientation=HORIZONTAL, relief=FLAT)
        box5.add('create', text=t.ADD,
                 command=TkPage.Callback(self.addListbox, 
                 self.node_standalone, 'faces_select', self.list5))
        box5.add('modify', text=t.MODIFY,
                 command=TkPage.Callback(self.modifyListbox,
                 self.node_standalone, 'faces_select', self.list5))
        box5.add('erase', text=t.ERASE,
                 command=TkPage.Callback(self.delListbox,
                 self.node_standalone, 'faces_select', self.list5))
        box5.add('active', text=t.ACTDESAC,
                 command=TkPage.Callback(self.activeListbox,
                 self.node_standalone, 'faces_select', self.list5))
        box5.pack(side=TOP, anchor=W)

        # Separator
        #
        Tix.Frame(f51, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X)

        # ensight/cas/dec-poly
        #
        w505 = Tix.Frame(f51, relief=FLAT)
        w505.pack(side=TOP, padx=10)

        w55 = Tix.Frame(w505, relief=FLAT)
        w55.pack(side=TOP, padx=10, anchor=W)

        l55 = Tix.Label(w55, text=t.POST)
        l55.grid(row=0, column=0, padx=3, pady=10, sticky=W)
        self.balloon.bind_widget(l55, balloonmsg=t.KEYWORD_E+"-ensight")

        self.b55 = [0]*2
        for (i, tx1, tx2) in [(0, t.ON,  'on' ),
                              (1, t.OFF, 'off') ]:

            self.b55[i] = Tix.Radiobutton(w55, text=tx1, value=tx2,
                                          variable=self.post_on_off,
                                          command=self.getPostProcessing)
            self.b55[i].grid(row=0, column=i+1, sticky=E)

        w55_m = Tix.Frame(w505, relief=FLAT)
        w55_m.pack(side=TOP, padx=10, anchor=W)

        l55_m = Tix.Label(w55_m, text=t.MED_DIR)
        l55_m.grid(row=0, column=0, padx=3, pady=2, sticky=W)
        self.balloon.bind_widget(l55_m, balloonmsg=t.KEYWORD_E+"-med")

        self.b55_m = [0]*2
        for (i, tx1, tx2) in [(0, t.ON,  'on' ),
                              (1, t.OFF, 'off') ]:

            self.b55_m[i] = Tix.Radiobutton(w55_m, text=tx1, value=tx2,
                                          variable=self.med_on_off,
                                          command=self.getPostProcessing)
            self.b55_m[i].grid(row=0, column=i+1, sticky=E)

        w56 = Tix.Frame(w505, relief=FLAT)
        w56.pack(side=TOP, padx=10, anchor=W)

        self.l56 = Tix.Label(w56, text=t.POST_DIR, state=DISABLED)
        self.l56.grid(row=0, column=0, padx=3, pady=2, sticky=W)
        self.balloon.bind_widget(self.l56, balloonmsg=t.KEYWORD_E+"-cas")
        self.balloon.bind_widget(self.l56, statusmsg=t.MSG_CASRESU)

        self.e56 = Tix.Entry(w56, bd=2, width=20, state=DISABLED,
                             textvariable=self.post_dir)
        self.e56.grid(row=0, column=1, pady=10, sticky=E)
        self.e56.event_add("<<Event>>", "<Return>", "<Leave>", "<FocusOut>")
        self.e56.bind ("<<Event>>", self.getPostDirectory)
        self.balloon.bind_widget(self.e56, balloonmsg=t.KEYWORD_E+"-cas")

        # Separator
        #
        self.s57 = Tix.Frame(f51, height=2, bd=2, relief=SUNKEN)
        self.s57.pack(side=TOP, padx=5, fill=X)

        self.w57 = Tix.Frame(f51, relief=FLAT)
        self.w57.pack(side=TOP, padx=10)

        self.l57 = Tix.Label(self.w57, text=t.DEC_POLY)
        self.l57.grid(row=0, column=0, padx=3, pady=10, sticky=W)
        self.balloon.bind_widget(self.l57, balloonmsg=t.KEYWORD_E+"-ensight -dec-poly")

        self.b57 = Tix.Checkbutton(self.w57, onvalue='on', offvalue='off',
                                   variable=self.dec_poly_on_off,
                                   command=self.getPolygonalFacesCut)
        self.b57.grid(row=0, column=1, sticky=E)


        # Batch Running button
        #
        f501 = Tix.Frame(self.nb.page4, bd=2, relief=GROOVE)
        f501.pack(side=TOP, fill=X, padx=10, pady=10)

        f502 = Tix.Frame(f501, relief=FLAT)
        f502.pack(side=TOP, pady=10)

        l2 = Tix.Label(f502, text=t.ECS_RUN, justify=LEFT)
        l2.grid(row=0, column=0, sticky=W)

        #self.img52 = Tix.PhotoImage(file=PIC_PATH+'rubic1c.gif')
        self.img52 = Tix.PhotoImage(file=PIC_PATH+'launcher.gif')
        b501 = Tix.Button(f502, image=self.img52, command=self.ecsBatchRunning)
        b501.grid(row=0, column=1, sticky=W, padx=5)


    def _createWidgets(self):
        """
        Create the Page layout.
        """
        t = PageText()

        # NoteBook and tabs layout
        #
        self.nb = Tix.NoteBook(self.myPage)
        self.nb.pack(side=TOP, fill=BOTH, expand=1)
    
        self.nb.nbframe.config(relief=RAISED, bd=2, font=fT,
                               tabpadx='2', tabpady='1',
                               focuscolor=self.bg,
                               backpagecolor=self.bg,
                               inactivebackground=wm['inactivebackground'])
        self.nb.add('page1', anchor='center', label=t.MESHES_TITLE)
        self.nb.add('page2', anchor='center', label=t.PERIODIC_TITLE)
        self.nb.add('page3', anchor='center', label=t.SYRTHES_TITLE)
        self.nb.add('page4', anchor='center', label=t.STANDALONE_TITLE)

        self._make_page1()
        self._make_page2()
        self._make_page3()
        self._make_page4()


    def _initializeWidgets(self):
        """
        Extract resquested informations from XML document.
        This informations are used to initialize the widgets.
        For this page default values of all widgets are necessary
        included in the XML file.
        """
        t = PageText()

        # Tab 1: MESHES

        # 1) Paste parameters / Warp faces cutting
        self.balloon.bind_widget(self.list5, statusmsg=t.MSG_SELECT)
        #
        if self.node_paste["status"] == 'on':
            self.b121[0].select()
            self.w122.pack(side=TOP, anchor=W, pady=5)
        else:
            self.node_paste["status"] = "off"
            self.b121[1].select()
            self.w122.pack_forget()

        if self.node_cut["status"] == 'on':
            self.c131[0].select()
            self.w132.pack(side=TOP, anchor=W)
        else:
            self.node_cut["status"] = "off"
            self.c131[1].select()
            self.w132.pack_forget()

        #list = self.node_paste.xmlGetNodeList('faces_paste')
        list = SolutionDomainModel(self.case).getListNodes(self.node_paste, 'faces_paste') 
        result = {}
        if list:
            for node in list:
                result = SolutionDomainModel(self.case).getFaces(node)
                name    = self.listboxLabel(node['status'], 'faces_paste',result['color'],
                                     result['group'], result['fraction'],
                                     result['plan'], result['type'], result['reverse'])
                if name:
                    self.list1.listbox.insert(END,name)

                #if not node.xmlGetDouble(self.node[2]):
        v = SolutionDomainModel(self.case).getValue(self.node_cut, self.node[2])
        if not v:
            self.warp.set(self.def_values[2])
        else:
            self.warp.set(v) 
        self.balloon.bind_widget(self.list5, statusmsg=t.MSG_SELECT)


        # 2) Meshes list
        #
        msg = ""
        nameList = SolutionDomainModel(self.case).getMeshList()

        if nameList:
            for mesh in nameList:
                if mesh not in os.listdir(self.case['mesh_path']):
                    msg = msg  + mesh + '\n'

                    if msg:
                        msg =  msg + '\n'
                        Dialog.Warning(self.master, title=t.WARNING,
                               text=t.MSG_MESH2 + msg + t.MSG_IDENTITY)

                self.list.listbox.insert(END, mesh)

        elif os.listdir(self.case['mesh_path']):
            for lmesh in os.listdir(self.case['mesh_path']):
                format = lmesh[-3:]
                if format == ".gz":
                    format = string.split(lmesh,".")[1]
                if format == "eom":
                    format = lmesh[-5:]
                if format == "gns" or format == "ase":
                    format = lmesh[-4:]
                if format in ["unv","des","hex","med","cgns","msh","ngeom","case","neu"]:
                    self.list.listbox.insert(END, lmesh)
                    format, label, mesh = self.getMeshFormat(lmesh)
                    SolutionDomainModel(self.case).setMesh(mesh, format)
                    #self.node_meshes.xmlInitNodeList('mesh',name=mesh, 
                                                    #     format=format)[0]


        # Tab 2: PERIODIC
        #
        status = SolutionDomainModel(self.case).getPeriodicStatus()
        if status != 'on':
            self.b21[1].select()
            self.w22.pack_forget()
        else:
            self.b21[0].select()
            self.w22.pack(side=TOP)
            mode = SolutionDomainModel(self.case).getPeriodicTransformation(self.perio)
            self.perio_mode.set(mode)
            self.setValuesPeriodicTransformation(mode)
                
        
        #list_perio = self.node_perio.xmlGetNodeList('faces_periodic')
        result = {}
        list_perio = SolutionDomainModel(self.case).getListNodes(self.node_perio, 'faces_periodic') 
        if list_perio:
            for node in list_perio:
                result = SolutionDomainModel(self.case).getFaces(node)
                name    = self.listboxLabel(node['status'], 'faces_periodic',result['color'],
                                     result['group'], result['fraction'],
                                     result['plan'], result['type'], result['reverse'])
                if name:
                    self.listp.listbox.insert(END,name)

        # Tab 3: SYRTHES
        #
        if SolutionDomainModel(self.case).getSyrthesCouplingStatus() == 'on':
            self.b31[0].select()
            self.sp31.pack(side=TOP, fill=X)
            self.w32.pack(side=TOP)
            self.sp32.pack(side=TOP, fill=X)
            self.wf2d.pack(side=BOTTOM, anchor=W, padx=40, pady=5)
            if SolutionDomainModel(self.case).getSyrthes2dMeshStatus() == 'on':
                self.box32[0].select()
            else:
                self.box32[1].select()
        else:
            SolutionDomainModel(self.case).setSyrthesCouplingStatus('off')
            self.b31[1].select()
            self.sp31.pack_forget()
            self.sp32.pack_forget()
            self.w32.pack_forget()
            self.wf2d.pack_forget()

        #for node in self.node_syrthes.xmlGetNodeList('faces_syrthes'):
        result = {}
        list_syrt = SolutionDomainModel(self.case).getListNodes(self.node_syrthes, 'faces_syrthes') 
        for node in list_syrt:
            result = SolutionDomainModel(self.case).getFaces(node)
            name    = self.listboxLabel(node['status'], 'faces_syrthes',result['color'],
                                     result['group'], result['fraction'],
                                     result['plan'], result['type'], result['reverse'])
            #n_rev = node.xmlGetNodeList('faces_reverse','status')
            #color   = node.xmlGetString('faces_color')
            #group   = node.xmlGetString('faces_group')
            #type    = node.xmlGetString('faces_type')
            #reverse = n_rev[0]['status']
            if name:
                self.list3.listbox.insert(END,name)


        # Tab 4: STANDALONE
        #
        node = self.node_standalone.xmlInitNode('ascii_communication', 'status')
        if node['status'] == 'on':
            self.ascii_on_off.set('on')
        else:
            self.ascii_on_off.set('off')
            self.node_standalone.xmlRemoveChild('ascii_communication')

        node = self.node_standalone.xmlInitNode('simulation_communication', 'status')
        v = node['status']
        if not v or v == 'on':
            self.sc_on_off.set('on')
            node['status'] = "on"
        else:
            self.sc_on_off.set('off')
            node['status'] = "off"

##        node = self.node_standalone.xmlInitNode('check_mesh', 'status')
##        if not node['status'] or node['status'] == 'on':
##            self.check_on_off.set('on')
##            node['status'] = "on"
##        else:
##            self.check_on_off.set('off')
##            node['status'] = "off"


        result = {}
        list_stand = SolutionDomainModel(self.case).getListNodes(self.node_standalone, 'faces_select') 
        for node in list_stand:
            result = SolutionDomainModel(self.case).getFaces(node)
            name    = self.listboxLabel(node['status'], 'faces_select',result['color'],
                                     result['group'], result['fraction'],
                                     result['plan'], result['type'], result['reverse'])
            if name: self.list5.listbox.insert(END,name)

        if self.node_post['status'] == 'off':
            self.post_on_off.set('off')
        else:
            self.node_post['status'] = 'on'
            self.post_on_off.set('on')

        if self.node_med['status'] == 'on':
            self.med_on_off.set('on')
        else:
            self.node_med['status'] = 'off'
            self.med_on_off.set('off')
        self.getPostProcessing()
        
        dir = self.node_standalone.xmlGetString('post_directory')
        if dir:
            self.post_dir.set(dir)
        else:
            self.post_dir.set('cas_defaut')

        node = self.node_post.xmlInitNode('polygonal_faces_cutting', 'status')
        if node['status'] == 'on':
            self.dec_poly_on_off.set('on')
        else:
            self.dec_poly_on_off.set('off')
            node.xmlRemoveNode()


#-------------------------------------------------------------------------------
# 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.ACTDESAC         = "Activer/Desactiver"
            self.ACTIVATE         = "[activée]"
            self.ADD              = "Ajouter"
            self.ASCII            = "Fichier de communication avec le Noyau en ASCII"
            self.CHECK            = "Vérification du maillage"
            self.COLOR_LIST       = "Sélection par références"
            self.COLOR_NEW        = "Nouvelles références :"
            self.CUTTING          = "Découpage des faces non planes :"
            self.DEC_POLY         = "Découpage en triangles des faces polygonales"
            self.DESACTIVATE      = "[desactivée]"
##            self.ECHO_COMM        = "Affichage des entêtes des messages échangés :"
##            self.ECHO_VALUE       = "Nombre de premiers/derniers éléments"
            self.ECS_RUN          = "Exécution de l'Enveloppe Code_Saturne"
            self.ERASE            = "Supprimer"
            self.ERROR            = "Erreur"
            self.FACES_BOUNDARY   = "faces de bord"
            self.FACES_INTERNAL   = "faces internes"
            self.FACES_PERIO      = "Liste des faces pour cette periodicité"
            self.FACES_REVERSE    = "Inversion de la sélection"
            self.FACES_TITLE      = "Sélection de faces"
            self.FACES_TYPES      = "Sélection des faces par type"
            self.FRACTION         = "Fraction : "
            self.GROUP            = "Groupes : "
            self.GROUP_LIST       = "Sélection par groupes"
            self.GROUP_NEW        = "Nouveaux groupes :"
            self.INPUT_MESH       = "Ajouter à la liste :"
            self.KEYWORD          = "Mot clé Code_Saturne : "
            self.KEYWORD_E        = "Option Enveloppe : "
            self.MAT              = "Définition de la matrice de rotation"
            self.MAKE_CHOICE      = "Veuillez sélectionner le format du maillage"
            self.MED_DIR          = "Post-processing au format Med :"
            self.MESH2D           = "Maillage Syrthes 2D"
            self.MESH_FORMAT      = "Sélection du format de maillage"
            self.MESH_PATH        = "Répertoires des maillages"
            self.MESHES_LIST      = "Liste des maillages :"
            self.MESHES_TITLE     = "MAILLAGES"
            self.MODIFY           = "Modifier"
            self.NEW_MESH         = "Nouveau maillage"
            self.NO               = "non"
            self.OFF              = "non"
            self.ON               = "oui"
            self.PARAM            = "Paramètres"
            self.PASTE_FACES      = "Sélections des faces de bord à recoller :"
            self.PASTE_FRACTION   = "fraction"
            self.PASTE_MESHES     = "Recollement de maillages :"
            self.PASTE_PLAN       = "plan"
            self.PERIODICITY      = "Périodicité"
            self.PERIO_LABEL      = "Nouvelles frontières périodiques :"
            self.PERIO_LIST       = "Liste des frontières périodiques :"
            self.PERIODIC_TITLE   = "FRONTIÈRES\nPÉRIODIQUES"
            self.PLAN             = "Plan : "
            self.POST             = "Post-processing au format Ensight Gold :"
            #self.POST_DIR         = "Nom du répertoire du cas Ensight"
            self.POST_DIR         = "Nom du cas"
            self.PT               = "Position d'un point fixe"
            self.REFERENCE        = "Références : "
            self.ROTA_ANG         = "Définition de la rotation"
            self.ROTA1            = "Périodicité de rotation (définie par angle "\
                                    "et direction)"
            self.ROTA2            = "Périodicité de rotation (définie par matrice)"
            self.RUNNING          = "Execution en batch de l'Enveloppe.\n"
            self.SEARCH_MESH      = "Rechercher et ajouter à la liste"
            self.SELECT_FACES     = "Sélection de faces internes pour visualisation :"
            self.SELECT_LIST      = "Liste des sélections :"
            self.SIM_COMM         = "Simulation de la communication avec le Noyau"
            self.STANDALONE_TITLE = "FONCTIONNEMENT\nAUTONOME"
            self.SYRTHES_TITLE    = "COUPLAGE\nSYRTHES"
            self.SYRTHES_2D       = "Le maillage Syrthes correspondant est 2D :"
            self.SYRTHES_COUPLING = "Couplage Syrthes : "
            self.SYRTHES_FACES    = "Sélections des faces de bord de couplage :"
            self.TRANS            = "Périodicité de translation "
            self.TRANS_VECT       = "Vecteur translation "
            self.TETROTA1         = "Translation et rotation (définie par angle "\
                                    "et direction)"
            self.TETROTA2         = "Translation et rotation (définie par matrice)"
            self.TYPE             = "Type de faces : "
            self.VECTDIR          = "Vecteur de rotation  "
            self.WARNING          = "Attention"
            self.WARP             = "Angle max de distorsion"
            self.YES              = "oui"
        else:
            self.ACTDESAC         = "Activate/Desactivate"
            self.ACTIVATE         = "[activated]"
            self.ADD              = "Add"
            self.ASCII            = "Communication file with the Core in ASCII"
            self.CHECK            = "Mesh checking"
            self.COLOR_LIST       = "Select by references"
            self.COLOR_NEW        = "Input references:"
            self.CUTTING          = "Warp faces cutting:"
            self.DEC_POLY         = "Polygonal faces cutting in triangles"
            self.DESACTIVATE      = "[desactivate]"
##            self.ECHO_COMM        = "Enveloppe/Core passing messages headings:"
##            self.ECHO_VALUE       = "Number of first and last displaying elements"
            self.ECS_RUN          = "Enveloppe Code_Saturne batch running"
            self.ERASE            = "Erase"
            self.ERROR            = "Error"
            self.FACES_BOUNDARY   = "boundary faces"
            self.FACES_INTERNAL   = "internal faces"
            self.FACES_PERIO      = "List of faces for this periodicity"
            self.FACES_REVERSE    = "Reverse selection"
            self.FACES_TITLE      = "Faces selection"
            self.FACES_TYPES      = "Select faces by type"
            self.FRACTION         = "Fraction: "
            self.GROUP            = "Groups: "
            self.GROUP_LIST       = "Select by groups"
            self.GROUP_NEW        = "Input groups:"
            self.INPUT_MESH       = "Input new meshes in list:"
            self.KEYWORD          = "Code_Saturne key word: "
            self.KEYWORD_E        = "Enveloppe option: "
            self.MAT              = "Définition of the matrix of rotation"
            self.MAKE_CHOICE      = "Please, select the mesh file format"
            self.MED_DIR          = "Post-processing in Med format:"
            self.MESH2D           = "2D Syrthes mesh"
            self.MESH_FORMAT      = "Mesh format selection"
            self.MESH_PATH        = "Meshes directory"
            self.MESHES_LIST      = "List of meshes:"
            self.MESHES_TITLE     = "MESHES"
            self.NEW_MESH         = "New mesh"
            self.MODIFY           = "Modify"
            self.NO               = "no"
            self.OFF              = "off"
            self.ON               = "on"
            self.PARAM            = "Parameters"
            self.PASTE_FACES      = "Select boundary faces to paste:"
            self.PASTE_FRACTION   = "fraction"
            self.PASTE_MESHES     = "Paste meshes:"
            self.PASTE_PLAN       = "plan"
            self.PERIODICITY      = "Periodicity"
            self.PERIO_LABEL      = "New periodic boundaries:"
            self.PERIO_LIST       = "List of periodic boundaries:"
            self.PERIODIC_TITLE   = "PERIODIC\nBOUNDARIES"
            self.PLAN             = "Plan: "
            self.POST             = "Post-processing in Ensight Gold format:"
            self.PT               = "Position of a fixed point"
            self.POST_DIR         = "Case name"
            self.REFERENCE        = "References: "
            self.ROTA_ANG         = "Définition of the rotation"
            self.ROTA1            = "Periodicity of rotation (defined by angle"\
                                    " and direction)"
            self.ROTA2            = "Periodicity of rotation (defined by matrix)"
            self.RUNNING          = "Batch running of the enveloppe"
            self.SEARCH_MESH      = "Research and add in list"
            self.SIM_COMM         = "Simulation of communication"
            self.SELECT_FACES     = "Visualization for internal faces selection:"
            self.SELECT_LIST      = "Selections list:"
            self.STANDALONE_TITLE = "STAND-ALONE\nRUNNING"
            self.SYRTHES_TITLE    = "SYRTHES\nCOUPLING"
            self.SYRTHES_2D       = "The corresponding mesh for Syrthes is 2D:"
            self.SYRTHES_COUPLING = "Syrthes coupling:"
            self.SYRTHES_FACES    = "Select boundary faces for Syrthes coupling:"
            self.TRANS            = "Periodicity of translation "
            self.TRANS_VECT       = "Translation's vector "
            self.TETROTA1         = "Translation + rotation (defined by angle"\
                                    " and direction)"
            self.TETROTA2         = "Translation + rotation (defined by matrix)"
            self.TYPE             = "Faces type: "
            self.VECTDIR          = "Rotation vector"
            self.WARNING          = "Warning"
            self.WARP             = "Max warp angle"
            self.YES              = "yes"


        # 2) Messages
        #
        if Tool.GuiParam.lang == 'fr':
            self.MSG_ALLREADY  = "Attention, l'entrée suivante est déjà " \
                                 "enregistée dans la liste :\n\n"

            self.MSG_BATCH     = "L'exécution de l'enveloppe se fera dans " \
                                 "le répertoire RESU.\n\nLes résultats de cette " \
                                 "exécution seront aussi stockés dans ce " \
                                 "répertoire.\n\n" \
                                 "Voulez-vous vraiment exécuter l'enveloppe ?"

            self.MSG_CASRESU   = "Ce répertoire sera créé dans RESU" 

            self.MSG_CUTTING   = "Découpage en triangles des faces dont la " \
                                 "distorsion est supérieure à un angle minimal " \
                                 "en degrés (valeur par défaut : 0.01)."

            self.MSG_DEL_LINK  = "Le lien existant est détruit  "\
                                 "du répertoire MAILLAGE du cas."

            self.MSG_DEL_MESH  = "Supprimer le maillage sélectionné de la "\
                                 "liste des maillages."

            self.MSG_DEL_SEL   = "Supprimer la sélection de la liste."

            self.MSG_ECHO      = "Affichage des entêtes des messages échangés : "\
                                 "nombre des premiers/derniers éléments (optionel)."

            self.MSG_FRACTION  = "Fraction de la longueur de la plus petite " \
                                 "arête à partir de laquelle on considère " \
                                 "que deux noeuds peuvent être fusionnés " \
                                 "(valeur par défaut : 0.1)."

            self.MSG_IDENTITY  = "Vérifier l'existence et l'emplacement des " \
                                 "fichiers de maillage, ainsi que la rubrique " \
                                 "'Identité et chemins'."

            self.MSG_NEW_MESH  = "Entrer les noms des fichiers de maillages " \
                                 "sans chemin unix " \
                                 "(les fichiers doivent être dans le répertoire "

            self.MSG_NEW_MESH2 = "Rechercher un fichier de maillages " \
                                 "(le fichier doit être dans le répertoire "

            self.MSG_NEW_PERIO = "Entrer un nom pour repérer une nouvelle " \
                                 "frontière périodique. Chaque périodicité " \
                                 "peut être désactivée."

            self.MSG_NEW_SEL   = "Sélectionner un fichier de maillages " \
                                 "(le fichier doit être dans le répertoire "

            self.MSG_MESH      = "Le nouveau fichier de maillage entré n'est " \
                                 "pas dans le répertoire des maillages précisé " \
                                 "dans la rubrique 'Identité et chemins'" \
                                 "Un lien est donc crée dans ce répertoire'.\n\n"

            self.MSG_MESH2     = "Les fichiers de maillage suivants ne sont pas "\
                                 "dans le répertoire des maillages précisé "\
                                 "dans la rubrique 'Identité et chemins' :\n\n"

           # self.MSG_OPEN_DIALOG  = "Ouverture de la fenêtre de dialogue."

            self.MSG_PLAN      = "Cosinus minimal des normales de deux faces " \
                                 "coplanaires (valeur par défaut : 0.8)."

            self.MSG_PASTE_SEL = "Sélections des faces de bord pour recollement " \
                                 "de maillages. Ces sélections sont optionnelles. " \
                                 "Une sélection peut être active ou non. "

            self.MSG_PERIO_MODE= "Sélection du mode de transformation de la périodicité " 
            self.MSG_PERIOONE  = "Pour la Périodicité, une seule sélection de faces " \
                                 "est autorisée. Ici vous en avez déjà une. " \


            self.MSG_SELECT    = "Sélection de faces internes (comptage et affichage). " \
                                 "Une sélection peut être active ou non. " \
                                 "La visualisation des sélections est possible " \
                                 "si le post-processing est activé."

            self.MSG_SEL_REF   = "Il est possible d'entrer plusieurs références à la " \
                                 "fois en les séparant avec un espace ou des caractères."

            self.MSG_SEL_GRP   = "Il est possible d'entrer plusieurs groupes à la " \
                                 "fois en les séparant avec au moins un espace."

            self.MSG_SYRTHES   = "Sélections de faces de bord pour un couplage avec " \
                                 "le code Syrthes. Ces sélections sont optionnelles. " \
                                 "Une sélection peut être active ou non. " \

            self.MSG_SYRTHONE  = "Pour Syrthes, une seule sélection de faces " \
                                 "est autorisée. Ici vous en avez déjà une. " \

            self.MSG_SELECTONE  = "Une seule sélection de faces internes" \
                                 "est autorisée. Ici vous en avez déjà une. " \

            self.MSG_SIM_COMM  = "Désactive l'écriture du fichier de " \
                                 "communication entre l'Enveloppe et le Noyau."


        else:
            self.MSG_ALLREADY  = "Warning, the following input is allready " \
                                 "uploaded in the list:\n\n"

            self.MSG_BATCH     = "The batch running of enveloppe will be in  " \
                                 "RESU directory.\n\nResults of this running " \
                                 "will be stored in this RESU directory.\n\n" \
                                 "Do you really want to execute enveloppe ?"

            self.MSG_CASRESU   = "This directory will be created in RESU" 

            self.MSG_CUTTING   = "Faces are cut with a Delaunay method if their " \
                                 "warp angle is greatter than an minimal angle in " \
                                 "degrees (default angle value: 0.01)."

            self.MSG_DEL_LINK  = "The existing link is destroyed "\
                                 "from case's directory MAILLAGE."

            self.MSG_DEL_MESH  = "Delete the selected mesh from the meshes list."

            self.MSG_DEL_SEL   = "Delete the selection from the list."

            self.MSG_ECHO      = "Heading of the messages passing between "\
                                 "Enveloppe and the CORE: "\
                                 "number of first and last values (optional)."

            self.MSG_FRACTION  = "Length fraction of the smallest edge from " \
                                 "which we suppose that two nodes are in the " \
                                 "same place (default value: 0.1)."

            self.MSG_IDENTITY  = "Verify existence and location of the meshes "\
                                 "files, and the 'Identity and Pathes' rubric."

            self.MSG_NEW_MESH  = "Input the meshes files name without their "\
                                 "unix path (the files must be in the directory "

            self.MSG_NEW_MESH2 = "Research a meshes file "\
                                 "(the file must be in the directory "

            self.MSG_NEW_PERIO = "Input a label for a new periodic boundary."\
                                 "Each periodic boundary may desactivated or not."

            self.MSG_NEW_SEL    = "Select a meshes file "\
                                 "(the file must be in the directory "

            self.MSG_MESH      = "The new mesh entry is not in meshes directory "\
                                 "given in the 'Identity and paths' rubric." \
                                 "One link is created in this directory.\n\n"

            self.MSG_MESH2     = "The following meshes are not in the meshes "\
                                 "directory given in the 'Identity and paths' "\
                                 "rubric:\n\n"

           # self.MSG_OPEN_DIALOG  = "Open the dialog window."

            self.MSG_PLAN      = "Minimal cosinus of two normals from coplanar faces " \
                                 "(default value: 0.8)."

            self.MSG_PASTE_SEL = "Boundary faces selections for meshes paste. " \
                                 "These selections are optional. " \
                                 "A selection can be activated or not. "

            self.MSG_PERIO_MODE= "Periodicity's transformation mode selection " 

            self.MSG_PERIOONE  = "For Periodicity, only one faces selection is "\
                                 "allowed. Here you want one more.\n\n"

            self.MSG_SELECT    = "Faces selection (counting and display). " \
                                 "A selection can be activated or not. " \
                                 "The visualization of the selections is " \
                                 "possible when the post-processing is activated."

            self.MSG_SEL_REF   = "It is possible to input several references in one time " \
                                 "if they are separate with one space caracter or a string."

            self.MSG_SEL_GRP   = "It is possible to input several groups in one time " \
                                 "if they are separate with at least one space caracter."

            self.MSG_SYRTHES   = "Boundary faces selections for Syrthes coupling. " \
                                 "These selections are optional. " \
                                 "A selection can be activated or not. "

            self.MSG_SELECTONE  = "For internal faces selection, only one selection is "\
                                 "allowed. Here you want one more.\n\n"

            self.MSG_SIM_COMM  = "Disabled the creation of the communication " \
                                 "file between the Enveloppe and the Core."


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


syntax highlighted by Code2HTML, v. 0.9.1