# -*- coding: ISO-8859-1 -*-
""" capellaScript -- 07.11.2004 Andreas Herzog
>>> Der Stylist

    Mit Hilfe dieses Skripts kann man einer Partitur einen bestimmten Stil zuweisen. 
    Ein bereits bestehender Kommentar wird dabei nicht gelöscht.
    |
    |

    Version 1.0    |

    |


        |

<<<

# 1.0: Ursprungsversion
"""
import new
from xml.dom.minidom import Node, Element
import xml.dom
import string
from xml.dom.minidom import NodeList


Styles = ['capella-Standard','dezent rundlich','Kirchenlied','Früherziehung','Renaissance','capella-jazzy','Meisterwerk','Engraver','Liebeslied','Psalmodie','Weihnachtslied','capella-invertiert','capella-Jazzakkord','Anderer:']

NumberOfStyles = 14

def latin1_e(u):
    return u.encode('Latin-1')
def latin1_d(u):
    return u.decode('Latin-1')

# neu eingefügt
def addElementNode(el,tagName):
    # add new Node to el if Node "tagName" does not exist
    # otherwise return the existing Node
    global doc
    childs = el.childNodes
    for n in range(childs.length):
        if childs[n].nodeType ==childs[n].ELEMENT_NODE and childs[n].tagName == tagName:
            return childs[n]
    newChild = doc.createElement(tagName)
    el.appendChild(newChild)
    return newChild

# neu eingefügt
def addNewElementNode(el,tagName):
    # add new Node with tagName "tagName" to el
    global doc
    newChild = doc.createElement(tagName)
    el.appendChild(newChild)
    return newChild


def getDialogValues():

    global  Stil, selectedStyle, Fehler

    rad1 = Radio(['capella-Standard','dezent rundlich','Kirchenlied','Früherziehung','Renaissance','capella-jazzy','Meisterwerk','Engraver','Liebeslied','Psalmodie','Weihnachtslied','capella-invertiert','capella-Jazzakkord','Anderer:'], text='', padding = 0, value=0)
    edit1 = Edit('', width= 25)
    vbox1  = VBox([rad1,edit1], text='', padding=12)


    dlg = Dialog('Bitte Stil der Musiksymbole wählen: ', vbox1)

    if dlg.run():
        Fehler = 0

        Stil = rad1.value()
        if Stil < NumberOfStyles-1:
                selectedStyle = Styles[Stil]
        if Stil == NumberOfStyles-1 and edit1.value() <> '':
                selectedStyle = edit1.value()
                #messageBox('Fehler', 'Alles ok!')
        if Stil == NumberOfStyles-1 and edit1.value() == '':
                messageBox('Fehler', 'Sie haben keinen Stil angegeben!')
                Fehler = 1
        return True
    else:
        return False

def changeDoc(score):
        global  Stil, selectedStyle, Fehler

        infoTags = 0
        commentTags = 0


        if getDialogValues() and Fehler == 0:
                        newStyle = latin1_d('<style>' + selectedStyle + '</style>')   ### Zuweisung an einer Stelle
                        for info in score.getElementsByTagName('info'):
                                infoTags = 1
                                #messageBox('Test', 'OK!')
                                for comment in info.getElementsByTagName('comment'):                            # falls Kommentar vorhanden
                                        commentTags = 1
                                        comment1 = comment.firstChild
                                        content = comment1.nodeValue

                                        start1 = string.find(content,'<style>')                                 # 1.Abschnitt des Kommentars bis zur vorhandenen Stil-Anweisung
                                        start2 = string.find(content,'</style>')                                # 2.Abschnitt des Kommentars ab der vorhandenen Stil-Anweisung
                                        length = len(content)
                                        comment.parentNode.removeChild(comment)                                 # Löschen des bisherigen Kommentars
                                        comment2= addNewElementNode(info,'comment')
                                        #messageBox('Fehler', str(start1) + ',' + str(start2) + ',' + str(length))

                                        if start1 > -1:
                                                textNode = doc.createTextNode(content[:start1] + newStyle + content[(start2+8):]) # Generierung des neuen Kommentars bei vorhandener Stil-Anweisung
                                        if start1 == -1:
                                                textNode = doc.createTextNode(content + newStyle)                                                                 # Generierung des neuen Kommentars bei bisher fehlender Stil-Anweisung
                                        comment2.appendChild(textNode)

                                if commentTags == 0:                                                            # falls kein Kommentar vorhanden
                                        commentNew = addNewElementNode(info,'comment')
                                        textNodeNew = doc.createTextNode(newStyle)
                                        commentNew.appendChild(textNodeNew)
                        if infoTags == 0:                                      									# falls keine Informationen zur Partitur bisher vorliegen

                                infoNew = doc.createElement('info')                           
                                score.insertBefore(infoNew, score.firstChild)            
                                commentNew = addNewElementNode(infoNew,'comment')
                                textNodeNew = doc.createTextNode(newStyle)
                                commentNew.appendChild(textNodeNew)

                        return True

# Hauptprogramm:

from caplib.capDOM import ScoreChange
import tempfile

class ScoreChange(ScoreChange):
        def changeScore(self, score):
           global doc
           doc = score.parentNode

           changeDoc(score)



if activeScore():

        activeScore().registerUndo("Stilzuweisung")
        tempInput = tempfile.mktemp('.capx')
        tempOutput = tempfile.mktemp('.capx')
        activeScore().write(tempInput)
        ScoreChange(tempInput, tempOutput)
        activeScore().read(tempOutput)
        os.remove(tempInput)
        os.remove(tempOutput)
