# -*- coding: ISO-8859-1 -*-
""" capellaScript -- (c) Paul Villiger, Erweiterung: Andreas Herzog
>>> Script Manager TK 

    Ausführen und Zuweisen von beliebeigen Skripts über 10 Menuepunkte.
    Ein Skript kann an "Direct_Call" zugwiesen werden und wir über das Skript "Script_Manager_Direct.py" aufgerufen.
    Die beiden Skripts "Script_Manager.py" und "Script_Manager_Direct.py" sind dafür konzipiert , um sie über die Pluginleiste aufzurufen.
    
    Damit die Symbole für die einzelnen Skripte gefunden werden, müssen die Icons im Ordner capella-Verzeichnis\scripts\Icons oder capella-Verzeichnis\scripts\Plugins_Villiger\Icons kopiert werden.
<<<

History: 07.12.03 - Erste Ausgabe
         13.01.03 - Optionen gehen nicht verloren, wenn das aufgerufene Programm diese ueberschreibt
         03.02.04 - sys.argv[0] wird auf aufgerufenes Programm gsetzt
         13.06.04 - Optionen werden in richtige Datei geschrieben
         29.11.05 - Ergänzung um neues Dialogfenster mit Iconbuttons für die Skripte (Andreas Herzog)
         08.01.07 - Anpassungen an capella 5.12
         17.10.07 - Anpassungen capella 2008 (Paul)
         23.11.07 - Neue Downloadstruktur, Symbole in Verzeichnis "scripts\symbols"

         
"""
import os, sys, string, _winreg

symbolDir = 'symbols'   # Verzeichnis mit den Icons

# Ab hier neuer Programmcode

if (6, 0, 0) > capVersion():
    scriptPath = os.path.join(getProgramDir(), 'scripts')
else:
    r = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
    homePath, x = _winreg.QueryValueEx(r, 'Personal')
    _winreg.CloseKey(r)
    scriptPath = os.path.join(homePath,'capella', 'scripts')


from Tkinter import Label as LabelTk, Button as ButtonTk, Frame, Tk, PhotoImage, LEFT, RIGHT, Button, SUNKEN, X, FLAT, TOP, Toplevel

def Test(text):
    messageBox('Test',str(text))

def changeButton(root, programmNummer):
    ScriptManagerOptionsFileName = optionFileName
    options = ScriptOptions() 
    opt = options.get()
    #Test(programmNummer)
    if programmNummer < 10:
        program = 'prog00' + str(programmNummer)
    elif programmNummer < 100:
        program = 'prog0' + str(programmNummer)
    else:
        program = 'prog' + str(programmNummer)
    root.destroy()
    opt[program] = selectScript()
    options.set(opt)

    root2 = Tk()
    menu = Menu(root2, False, modus=1, group=int(programmNummer/100))
    root2.mainloop()  

class Menu:
    def getFileNames(self):
        ScriptManagerOptionsFileName = optionFileName    # Zurückholen der gespeicherten Werte
        options = ScriptOptions()
        opt = options.get()                    # Liste der Skriptnamen wird erstellt
        s = self.FrameNumber
        savedNames =[]
        while s < 100 + self.FrameNumber:
            first = int(s/100)
            second = int (s - first*100) /10
            
            third = s -second*10 -first*100
            progNummer = 'prog' + str(first) + str(second) + str(third)

            #Test(progNummer)
            new = (os.path.split(opt.get(progNummer, '')))
            savedNames.append(new[1])
            s +=1

      
        i=0
        while i < len(savedNames):
            savedNames[i] = str(savedNames[i])[:(len(savedNames[i])-3)]
            i+=1   
    
        h = 0
        while h < len(savedNames):
            if savedNames[h] == '':
                savedNames[h] = ' '
                
            h+=1
    
        return savedNames
    
    def findIcon(self,name):                    # Kontrollroutine ob die das Icon besteht
        iconPath = os.path.join(scriptPath, symbolDir)
        Pic = os.path.join(iconPath,name + '.gif')
        Blanco = os.path.join(iconPath, 'Blanko.gif')
        found = found1 = found2 = False

        if os.path.isfile(Pic):
            bild = PhotoImage(file=Pic)
            return bild
        elif os.path.isfile(Blanco):
            bild = PhotoImage(file=Blanco)
            return bild
        else:
            return False
    
    def getBilder(self, fileNames):
        self.bilder=[]
        i = 0                                    # Erstellen einer Liste der Icons
        while i < len(fileNames):
            self.bilder +=[self.findIcon(fileNames[i])]
            i+=1
        
        return self.bilder

    def ende(self):                            # Abbruch-Routine
        global Task 
        
        self.myParent.destroy()

        Task = -1 

    def setup(self):                        # Setup-Routine
        if self.Modus == 0:
            self.Modus = 1
            self.ModusLabel.pack()
        elif self.Modus == 1:
            self.Modus = 0
            self.ModusLabel.forget()            
  
        
    def setShow(self, number):                        # Gruppenauswahl
        i = 0
        while i < 10:
            self.ButtonGruppe[i].config(fg='black')
            i+=1
        self.ButtonGruppe[number].config(fg='red')
        self.FrameNumber = number*100
        self.fileNames = self.getFileNames()
        self.bilder = self.getBilder(self.fileNames)
        self.mainFrame1.subFrame0.destroy()
        j=self.FrameNumber
        self.LabelTk = []
        self.mainFrame1.subFrame0 = Frame(self.mainFrame1)
        self.mainFrame1.subFrame0.pack()    
        j=0
        while j < len(self.bilder):                    # Erstellen der Buttons und Labels
            if self.bilder[j] <> False:
                self.Button1 = Button(self.mainFrame1.subFrame0,image=self.bilder[j], command=lambda x=j+self.FrameNumber: self.callback(x))
                self.Button1.bind("<Enter>", lambda event, infoText=self.fileNames[j], Button=self.Button1: self.doInfo(infoText, Button, event))
                self.Button1.bind("<Leave>", lambda event: self.killInfo())
                self.Button1.grid(row=j-(10*int(j/10)), column=int(j/10)*2, padx = 5, pady=5)
            else:
                ButtonTk(self.mainFrame1.subFrame0,text=(str(self.fileNames[j]))[0]+'. ', command=lambda x=j+self.FrameNumber: self.callback(x)).grid(row=j-(10*int(j/10)), column=int(j/10)*2,  padx = 5, pady=5)
            if j < len(self.fileNames) and self.showNames == True:
                self.LabelTkSingle = LabelTk(self.mainFrame1.subFrame0,text=self.fileNames[j])
                self.LabelTkSingle.grid(row=j-(10*int(j/10)), column=int(j/10)*2+1, pady=5)
                self.LabelTk.append(self.LabelTkSingle)
                

            j+=1

    def doInfo(self,text = 'Noch nicht belegt', Button1= None, event=None):

        self.Info = Toplevel()
        self.Info.wm_overrideredirect(1)
        self.Info.wm_geometry("+%d+%d" % (event.x_root+10,event.y_root))# Fenster wird in der Mitte des Bildschirms positioniert
        self.text2= str(text)
        if self.text2 == ' ':
            self.text2 = 'Noch nicht belegt'

        self.InfoText = LabelTk(self.Info,text=self.text2)
        self.InfoText.config(bg='yellow',bd=1,)
        self.InfoText.pack(padx=1)
        
        
    def killInfo(self,text = '', event=None): 
        self.Info.destroy()       
    
        
    def callback(self,x):
        global chosenNumber

        if self.Modus == 0:
            chosenNumber = x
            self.myParent.destroy()
        if self.Modus == 1:
            changeButton(self.myParent,x)
            
                     
    def __init__(self, parent, namesVisible, modus = 0, group = 0):

        ScriptManagerOptionsFileName = optionFileName
        self.FrameNumber = group*100
        self.showNames = namesVisible
        self.fileNames = self.getFileNames()
        self.bilder = self.getBilder(self.fileNames)
        self.myParent = parent  ### (7) remember my parent, the root
        self.myParent.title('Skriptmanager TK')

        self.mainFrame = Frame(parent, bd=10, relief = FLAT)

        self.mainFrame.pack()
        self.mainFrame1 = Frame(self.mainFrame)
        self.mainFrame1.pack()
        self.mainFrame1.subFrame0 = Frame(self.mainFrame1)
        self.mainFrame1.subFrame0.pack()#
        self.Modus = modus
        self.ModusLabel = LabelTk(self.mainFrame,text='Setup-Modus', bg='red') 

             
        self.separator = Frame(self.mainFrame,height=2, bd=1, relief=SUNKEN)
        self.separator.pack(fill=X, padx=5, pady=5)
        self.mainFrame3 = Frame(self.mainFrame)
        self.mainFrame3.pack()
        self.ButtonGruppe = []
        i = 0
        while i < 10:
            self.ButtonGruppeSingle = ButtonTk(self.mainFrame3,text=i+1, command=lambda x=i: self.setShow(x))
            self.ButtonGruppeSingle.pack(side=LEFT, padx = 5, pady=5)
            self.ButtonGruppe.append(self.ButtonGruppeSingle)
            i+=1
        self.ButtonGruppe[group].config(fg='red')
        self.mainFrame2 = Frame(self.mainFrame)
        self.mainFrame2.pack()
        self.ButtonAbbrechen = ButtonTk(self.mainFrame2,text='Abbrechen', command= self.ende).pack(side=LEFT, padx = 5, pady=5)
        #self.ButtonAnzeige = ButtonTk(self.mainFrame2,text='Anzeige',command = self.setShow).pack(side=RIGHT, padx = 5, pady=5)
        self.ButtonSetupMode = ButtonTk(self.mainFrame2,text='Setupmodus',command = self.setup).pack(side=RIGHT, padx = 5, pady=5)
        if self.Modus == 1:
            self.ModusLabel.pack()     
        

        
        self.capPath = getProgramDir()    
        self.capPath = scriptPath    

        self.FrameNumber = group*100
        self.fileNames = self.getFileNames()
        self.bilder = self.getBilder(self.fileNames)
        self.mainFrame1.subFrame0.destroy()
        j=self.FrameNumber
        self.LabelTk = []
        self.mainFrame1.subFrame0 = Frame(self.mainFrame1)
        self.mainFrame1.subFrame0.pack()    
        j=0
        while j < len(self.bilder):                    # Erstellen der Buttons und Labels
            if self.bilder[j] <> False:
                self.Button1 = Button(self.mainFrame1.subFrame0,image=self.bilder[j], command=lambda x=j+self.FrameNumber: self.callback(x))
                self.Button1.bind("<Enter>", lambda event, infoText=self.fileNames[j], Button=self.Button1: self.doInfo(infoText, Button, event))
                self.Button1.bind("<Leave>", lambda event: self.killInfo())
                self.Button1.grid(row=j-(10*int(j/10)), column=int(j/10)*2, padx = 5, pady=5)
            else:
                ButtonTk(self.mainFrame1.subFrame0,text=(str(self.fileNames[j]))[0]+'. ', command=lambda x=j+self.FrameNumber: self.callback(x)).grid(row=j-(10*int(j/10)), column=int(j/10)*2,  padx = 5, pady=5)
            if j < len(self.fileNames) and self.showNames == True:
                self.LabelTkSingle = LabelTk(self.mainFrame1.subFrame0,text=self.fileNames[j])
                self.LabelTkSingle.grid(row=j-(10*int(j/10)), column=int(j/10)*2+1, pady=5)
                self.LabelTk.append(self.LabelTkSingle)
            j+=1
          
            found = False
            k= 0 
        while k < len(self.bilder):
            if self.bilder[k] <> False:
                found = True
            k+=1
        if found == False:
            messageBox('Fehler','Es wurden keine Icons gefunden, bitte ueberpruefen Sie ihre Installation der Icons! \nDie Icons muessen sich Ordner '+ scriptPath + '\Icons \noder  '+ scriptPath + '\Plugins_Villiger\Icons befinden!')
            
                              
        
        self.width = 300
        self.height= 400
        self.centx= self.myParent.winfo_screenwidth() / 2
        self.centy= self.myParent.winfo_screenheight() /2     
        self.midx =  self.centx-self.width/2
        self.midy = self.centy-self.height/2
    
        self.myParent.wm_geometry("+%d+%d" % (self.midx,self.midy))# Fenster wird in der Mitte des Bildschirms positioniert
        self.myParent.resizable(0, 0)           



optionFileName = os.path.join(os.path.split(sys.argv[0])[0],'Script_Manager_TK.opt')
ScriptManagerOptionsFileName = optionFileName
    
class ScriptOptions(ScriptOptions):
    def __init__(self):
        dir, file = os.path.split(ScriptManagerOptionsFileName)
        file = os.path.splitext(file)[0] + '.opt'
        self._optionsFile = os.path.join(dir, file)
        self._oldOptionsFile = self._optionsFile
        s = self._oldOptionsFile
        if s.startswith(getProgramDir()):
            s = s[len(getProgramDir()):]
        s = s.replace(':', '$').replace('\\', '#')
        self._newOptionsFile = os.path.join(getUserDataDir(), s)


    
def selectScript():
    dlg = FileDialog()
    dlg.__init__(bOpen=True)
    dlg.setTitle('Python Skript auswählen')
    dlg.addFilter('Python Scripts', '*.py')
    dlg.setStartFile(str(sys.argv[0]))
    if dlg.run():
        return dlg.filePath()
    else:
        return ''

#Hauptprogramm:
chosenNumber = -2


root = Tk()


menu = Menu(root, False)


root.mainloop()




if chosenNumber <> -2:
    
    if chosenNumber >-1 and chosenNumber< 10:
        program = 'prog' + '00' + str(chosenNumber)
    elif chosenNumber >-1 and chosenNumber< 100:
        program = 'prog' + '0' + str(chosenNumber)
    else:    
        program = 'prog' + str(chosenNumber)
    #Test(program)
    ScriptManagerOptionsFileName = optionFileName
    options = ScriptOptions() 
    opt = options.get()
    opt['progSel'] = str(chosenNumber)    
    options.set(opt)
    if os.path.isfile(opt.get(program,'')):
        sys.argv[0] = opt[program]
        ScriptManagerOptionsFileName  = opt[program]
        execfile(opt[program])


