#!/usr/bin/env python
# -*- coding: latin-1 -*-

# splitJoinTk
# "Split" une chaîne en une liste, puis "join" la liste
# (c) Olivier Pirson --- DragonSoft
# http://www.opimedia.be/DS/
# Débuté le 21 août 2008
# v.01.00 --- 22 août 2008
# v.01.01 --- 12 novembre 2008 : correction interface
# v.01.02 --- 27 septembre 2009 : nouveau site web
# v.01.03 --- 15 mars 2010 : nouveau site web et adaptation Python 3
#         --- 2 janvier 2012 : nouveau site web
#####################################################################
from __future__ import print_function

VERSION = 'v.01.03 --- 2012 January 2'

import os, platform, sys

if sys.version_info[0] >= 3:  # Python >= 3
    import tkinter as tk
    import tkinter.font as tkFont
    import tkinter.messagebox as tkMessageBox
else:                         # 2.6 <= Python < 3
    import Tkinter as tk
    import tkFont
    import tkMessageBox



######################
# Variables globales #
######################
sep = ':'  # Séparateur pour le split
if platform.system().lower() == 'windows':
    sep = ';'

sep_out = sep  # Séparateur pour le join



############
# Fonction #
############
def help_msg():
    """Affiche le message d'aide sur la sortie des erreurs
    et termine le programme par un code d'erreur 1"""
    print("""splitJoinTk
  Split a string to a list, then join the list

  splitJoinTk [envvar|-] [--help]
  (c) Olivier Pirson --- DragonSoft --- http://www.opimedia.be/DS/
             {0}

  envvar: read this environment variable   (default: PATH)
  -: read stdin
  --help: display the help message""".format(VERSION),
          file=sys.stderr)
    sys.exit(1)



##############################
# Fonctions pour l'interface #
##############################
def cmd_about():
    """MessageBox About..."""
    tkMessageBox.showinfo('About...',
                          """splitJoinTk

{0}
http://www.opimedia.be/DS/
(c) Olivier Pirson --- DragonSoft

Infos:
Python {1}""".format(VERSION, sys.version))


def cmd_clear():
    """Efface in"""
    tk_Text.delete('1.0', tk.END)
    cmd_refresh_list(None)


def cmd_new_sep(event):
    """Change le séparateur pour le split et actualise"""
    global sep

    sep = tk_Entry_sep.get()
    cmd_refresh_list(None)


def cmd_new_sep_out(event):
    """Change le séparateur pour le join et actualise"""
    global sep_out

    sep_out = tk_Entry_sep_out.get()
    cmd_refresh_out(None)


def cmd_print():
    """Envoie out sur la sortie standard"""
    str_out = tk_Text_out.get('1.0', tk.END)
    if (str_out != '') and (str_out[-1] == '\n'):
        str_out = str_out[:-1]
    print(str_out)


def cmd_print_stderr():
    """Envoie out sur la sortie des erreurs"""
    str_out = tk_Text_out.get('1.0', tk.END)
    if (str_out != '') and (str_out[-1] == '\n'):
        str_out = str_out[:-1]
    print(str_out, file=sys.stderr)


def cmd_quit():
    """Quitte le programme"""
    tk_Win.quit()


def cmd_refresh_list(event):
    """Réactualise la liste et out"""
    str_in = tk_Text.get('1.0', tk.END)
    if (str_in != '') and (str_in[-1] == '\n'):
        str_in = str_in[:-1]
    tk_Listbox.delete(0, tk.END)
    for t in str_in.split(sep):
        tk_Listbox.insert(tk.END, t)
    cmd_sel_all()


def cmd_refresh_out(event):
    """Réactualise out"""
    tk_Text_out.config(state=tk.NORMAL)
    tk_Text_out.delete('1.0', tk.END)
    tk_Text_out.insert(tk.END,
                       sep_out.join([tk_Listbox.get(x) for x in tk_Listbox.curselection()]))
    tk_Text_out.config(state=tk.DISABLED)


def cmd_sel_all():
    """Sélectionne tout"""
    tk_Listbox.select_set(0, tk.END)
    cmd_refresh_out(None)


def cmd_sel_clear():
    """Déselectionne tout"""
    tk_Listbox.select_clear(0, tk.END)
    cmd_refresh_out(None)


def cmd_sel_invert():
    """Inverse la sélection"""
    sel = tk_Listbox.curselection()
    tk_Listbox.select_set(0, tk.END)
    for i in sel:
        tk_Listbox.select_clear(int(i))
    cmd_refresh_out(None)


def cmd_select_var(event):
    """Sélectionne une variable d'environnement"""
    if len(tk_Listbox_vars.curselection()) != 1:
        cmd_clear()
    else:
        tk_Text.delete('1.0', tk.END)
        tk_Text.insert(tk.END,
                       os.getenv(tk_Listbox_vars.get(tk_Listbox_vars.curselection()[0]), ''))
        cmd_refresh_list(None)



########
# Main #
########
str_in = ''

width_in = 120
height_in = 5

width_out = width_in
height_out = height_in

width_list = 90
height_list = 25

width_list_vars = 25
height_list_vars = 5

## Gestion des arguments en ligne
arg = 0
for a in sys.argv[1:]:
    if (a != '') and (a[0] == '-'):
        if a == '--help':
            help_msg()
        elif a == '-':
            if arg:
                print('!Too much arg: {0}\n'.format(a), file=sys.stderr)
                help_msg()
            str_in = sys.stdin.read()
            arg = 2
        else:
            print('!Bad arg: {0}\n'.format(a), file=sys.stderr)
            help_msg()
    else:
        if arg:
            print('!Too much arg: {0}\n'.format(a), file=sys.stderr)
            help_msg()
        str_var = a
        arg = 1

if arg == 0:
    str_var = 'path'
    arg = 1
if arg == 1:
    if platform.system().lower() == 'windows':
        str_var = str_var.upper()
    str_in = os.getenv(str_var, '')

if (str_in != '') and (str_in[-1] == '\n'):
    str_in = str_in[:-1]


## Fenêtre principale
tk_Win = tk.Tk()
tk_Win.title('splitJoinTk')
tk_Win.resizable(0,0)
tk_Win.protocol('WM_DELETE_WINDOW', cmd_quit)

font_bold = tkFont.Font(tk_Win, weight=tkFont.BOLD)
font_mono = tkFont.Font(tk_Win, size=10, family='courier')


# Entrée
tk_Text = tk.Text(tk_Win, width=width_in, height=height_out, font=font_mono)
tk_Text.pack()
tk_Text.bind('<FocusOut>', cmd_refresh_list)
tk_Text.bind('<Return>', cmd_refresh_list)



## Liste et boutons
tk_Frame = tk.Frame(tk_Win)
tk_Frame.pack()

# Liste
tk_Listbox = tk.Listbox(tk_Frame, width=width_list, height=height_list,
                        font=font_mono, selectmode=tk.MULTIPLE)
tk_Listbox.pack(side=tk.LEFT)
tk_Listbox.bind('<FocusOut>', cmd_refresh_out)
tk_Listbox.bind('<ButtonRelease-1>', cmd_refresh_out)

# Boutons
tk_Frame_buttons = tk.Frame(tk_Frame)
tk_Frame_buttons.pack(side=tk.RIGHT)


tk_Frame = tk.Frame(tk_Frame_buttons)
tk_Frame.grid(row=0, sticky=tk.W)
tk.Label(tk_Frame, text='In:', font=font_bold).pack(side=tk.LEFT)
tk_Entry_sep = tk.Entry(tk_Frame, width=3)
tk_Entry_sep.pack(side=tk.RIGHT, padx=3)
tk_Entry_sep.insert(tk.END, sep)
tk_Entry_sep.bind('<FocusOut>', cmd_new_sep)
tk_Entry_sep.bind('<Return>', cmd_new_sep)

tk.Button(tk_Frame_buttons, text='Clear', command=cmd_clear).grid(row=1, sticky=tk.W, padx=3)

tk_Listbox_vars = tk.Listbox(tk_Frame_buttons, width=width_list_vars, height=height_list_vars, font=font_mono)
tk_Listbox_vars.grid(row=2, sticky=tk.W)
tk_Listbox_vars.bind('<ButtonRelease-1>', cmd_select_var)
tk_Listbox_vars.bind('<Return>', cmd_select_var)
keys = sorted(os.environ.keys())
for k in keys:
    tk_Listbox_vars.insert(tk.END, k)


tk.Frame(tk_Frame_buttons, height=20).grid(row=10, sticky=tk.W)
tk.Label(tk_Frame_buttons, text='Sel.:', font=font_bold).grid(row=11, sticky=tk.W)

tk_Frame = tk.Frame(tk_Frame_buttons)
tk_Frame.grid(row=12, sticky=tk.W)
tk.Button(tk_Frame, text='All', command=cmd_sel_all).pack(side=tk.LEFT, padx=3)
tk.Button(tk_Frame, text='Clear', command=cmd_sel_clear).pack(side=tk.LEFT, padx=3)
tk.Button(tk_Frame, text='Invert', command=cmd_sel_invert).pack(side=tk.LEFT, padx=3)



tk.Frame(tk_Frame_buttons, height=20).grid(row=20, sticky=tk.W)

tk_Frame = tk.Frame(tk_Frame_buttons)
tk_Frame.grid(row=21, sticky=tk.W)
tk.Label(tk_Frame, text='Out:', font=font_bold).pack(side=tk.LEFT)
tk_Entry_sep_out = tk.Entry(tk_Frame, width=3)
tk_Entry_sep_out.pack(side=tk.RIGHT, padx=3)
tk_Entry_sep_out.insert(tk.END, sep_out)
tk_Entry_sep_out.bind('<FocusOut>', cmd_new_sep_out)
tk_Entry_sep_out.bind('<Return>', cmd_new_sep_out)

tk_Frame = tk.Frame(tk_Frame_buttons)
tk_Frame.grid(row=22, sticky=tk.W)
tk.Button(tk_Frame, text='stdout', command=cmd_print).pack(side=tk.LEFT, padx=3)
tk.Button(tk_Frame, text='stderr', command=cmd_print_stderr).pack(side=tk.LEFT, padx=3)


tk.Frame(tk_Frame_buttons, height=20).grid(row=30, sticky=tk.W)
tk_Frame = tk.Frame(tk_Frame_buttons)
tk_Frame.grid(row=31, sticky=tk.W)
tk.Button(tk_Frame, text='About', command=cmd_about).pack(side=tk.LEFT, padx=3)
tk.Button(tk_Frame, text='Quit', command=cmd_quit).pack(side=tk.LEFT, padx=3)



# Sortie
tk_Text_out = tk.Text(tk_Win, width=width_out, height=height_out, font=font_mono, state=tk.DISABLED)
tk_Text_out.pack()


##
try:
    i = list(tk_Listbox_vars.get(0, tk.END)).index(str_var)
    tk_Listbox_vars.select_set(i)
    tk_Listbox_vars.see(i)
except:
    pass

tk_Text.insert(tk.END, str_in)
cmd_refresh_list(None)
tk_Win.mainloop()
