#!/usr/bin/env python
#Author : croqmort@ifrance.com
#licence : standard GNU
#if you add some features, please send me that ;)

from Tkinter import *
from sys import stdout, argv, exit
from os import system

class Dialog(Frame):
    def enter(self, event, widget):
        widget["bg"] = "#DDF"
    def leave(self, event, widget):
        widget["bg"] = "#FFF"
    def ok_event(self, event=None):
        self.how = 1
        for i in self.entry_list:
            self.l.append(i.get())
        self.destroy()
    def cancel_event(self, event=None):
        self.destroy()
    def go(self):
        self.anti_rec = 0
        self.l = []
        self.mainloop()
        return self.l
    def destroy(self):
        if self.anti_rec == 0:
            self.anti_rec = 1
            self.master.destroy()
#            Frame.destroy(self)
#        self.quit()
    def addEntry(self, msg, default):
        frame = Frame(self.entryFrame)
        Label(frame, text=msg).pack(side=LEFT)
        entry = Entry(frame)
        def tmp_enter(event=None):
            self.enter(event, entry)
        def tmp_leave(event=None):
            self.leave(event, entry)
        entry.bind('<Enter>', tmp_enter)
        entry.bind('<Leave>', tmp_leave)
        entry["bg"] = "#FFF"
        entry["fg"] = "#000"
        entry.insert(END,default)
        entry.pack(side=RIGHT, fill=X, expand=1)
        self.entry_list.append(entry)
        frame.pack(side=BOTTOM,fill=X)
    def colorButton(self, widget):
        widget["background"] = "#DDF"
        widget["foreground"] = "black"
        widget["activebackground"] = "#AAF"
        widget["activeforeground"] = "black"
    def __init__(self, title="Entry Dialog"):
        Frame.__init__(self)
        self.how = 0
        self.pack(fill=BOTH, expand=1)
        self.master.title(title)
        self.master.iconname(title)
        self.entry_list = []
        self.entryFrame = Frame(self)
        self.entryFrame.pack(side=TOP, fill=X)
        self.buttonFrame = Frame(self)
        self.buttonFrame.pack(side=BOTTOM)
        self.buttonOk = Button(self.buttonFrame)
        self.buttonOk["text"] = "Ok"
        self.buttonOk["command"] = self.ok_event
        self.buttonOk.pack(side=RIGHT)
        self.colorButton(self.buttonOk)
        self.buttonCancel = Button(self.buttonFrame)
        self.buttonCancel["text"] = "Cancel"
        self.buttonCancel["command"] = self.cancel_event
        self.buttonCancel.pack(side=LEFT)
        self.colorButton(self.buttonCancel)
        self.master.protocol('WM_DELETE_WINDOW', self.quit)

def get_pct_a(s):
    l = []
    i = s.find("%a")
    while i != -1:
        n = 0
        while (i-n)!=0 and s[i-(n+1)]=='\\':
            n = n + 1
        if n%2 == 1:
            i = s.find("%a",i+2)
            continue
        ibs = s.find("(",i+2)
        ibe = s.find(")",ibs)
        if ibs == -1 or ibe == -1 or ibs!=i+2:
            i = s.find("%a",i+2)
            continue
        ic = s.find(",",ibs,ibe)
        if ic == -1: l.append((s[ibs+1:ibe].strip(),""))
        else: l.append((s[ibs+1:ic].strip(),s[ic+1:ibe].strip()))
        i = s.find("%a",i+2)
    return l

def replace_pct_a(s, l):
    w = i = s.find("%a")
    j = 0
    while i != -1:
        n = 0
        while (i-n) != 0 and s[i-(n+1)] == '\\':
            n = n + 1
        if n%2 == 1:
            w = i + 2
            i = s.find("%a", w)
            continue
        ibs = s.find("(", i + 2)
        ibe = s.find(")", ibs)
        if ibs == -1 or ibe == -1 or ibs != i+2:
            w = i + 2
            i = s.find("%a", w)
            continue
        s = s[:i] + l[j] + s[ibe+1:]
        w = i + len(l[j])
        j = j + 1
        i = s.find("%a",w)
    return s


usage = """
menu_wm_a.py command title
command can contain some "%a(text,default)"
a dialog box with all this entry appeared and all occurence of %a is replaced by your reply
command is launch
"""

usage_fr = """
menu_wm_a.py commande titre
commande peut contenir plusieurs "%a(texte, defaut)"
une boite de dialogue est cree contenant une entree pour chaque %a
toute les occurences de %a sont remplace par votre reponse puis commande est executee
"""

if len(argv) < 2:
    print usage_fr
    exit(0)
l = get_pct_a(argv[1])
if len(l) != 0:
    d = Dialog(argv[2])
    for (text, default) in l:
        d.addEntry(text, default)
    r = d.go()
    del d
    if len(r) != len(l): exit(0)
    str = replace_pct_a(argv[1],r)
else:
    str = argv[1]
system(str)
        
        
        
    
