# -*- coding: ISO-8859-1 -*-
""" capellaScript -- 08.06.2004 Andreas Herzog
>>> What's your name, litte Tone?

    Mit diesem Skript kann die capella-interne Notenbezeichnung sichtbar gemacht werden.|
    |
    Alternativ kann auch die normale Notenbezeichnung gewählt werden.
    ||
    Das Skript kann über die Mundharmonika-Funktion auch benutzt werden, um neue Belegungen für Mundharmonika zu erstellen (nur für Skript-Programmierer).
    |
    Version 1.0    |
    
    |
    

        |

<<<


"""

import xml.dom
import string


from xml.dom.minidom import NodeList



# doc = [] # parentNode von score

def latin1_e(u):
    return u.encode('Latin-1')
def latin1_d(u):
    return u.decode('Latin-1')
    

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
    

def addNewElementNode(el,tagName):
    # add new Node with tagName "tagName" to el 
    global doc
    newChild = doc.createElement(tagName)
    el.appendChild(newChild)
    return newChild

    
def getDialogValues1():
	
    global PositionUeberUnter, TextHight, NurLoeschen, Intelligenz, Mundharmonika

    rad1 = Radio(['über der Notenzeile', 'unter der Notenzeile'], text='', padding = 8, value=0)
    rad2 = Radio(['Originalschreibweise', 'Intelligente Schreibweise','Oktav-Nummerierungen (mit Striche)','Oktav-Nummerierungen (mit Zahlen)'], text='Schreibweise', padding = 8, value=0)
    edit1  = Edit ('4', min=0, max=11,text = 'Zwischenräume ', width=4)
    NurLoeschenCheck = CheckBox('Nur Elemente dieses Skripts löschen!', value=0)
    MundharmonikaCheck = CheckBox('Mundharmonika-Sonderfunktion', value=0)
    lab1 = Label('Zwischenräume', width = 4)
    hbox1 = HBox([edit1, lab1], padding = 8)
    vbox1 = VBox([hbox1, rad1], padding = 8,text = 'Abstand von der Mittellinie')
    hbox2 = HBox([vbox1], padding = 8)
    vbox2= VBox([hbox2, rad2, NurLoeschenCheck, MundharmonikaCheck], padding = 8)
    
    dlg = Dialog('Bitte wählen: ', vbox2)

	
    if dlg.run():
        PositionUeberUnter = rad1.value()
    	TextHight= edit1.value()
    	NurLoeschen = NurLoeschenCheck.value()
    	Intelligenz = rad2.value()
    	Mundharmonika = MundharmonikaCheck.value()
        return True
    else:
        return False
        

def handleNotes(score, voice):
    global TextHight, NoteHight, NoteLength, GraficalTag, NotenAblage, PositionUeberUnter, Intelligenz, Mundharmonika
    
    Kennung = '56294-' +  '12'
    GraficalTag = Kennung
    ToeneGesamt = '\''																
    for drawObjects in voice.getElementsByTagName('drawObjects'):					# Alle drawObj mit tag == GraficalTag löschen
        for drawObj in drawObjects.childNodes:
            if drawObj.nodeType == drawObj.ELEMENT_NODE and drawObj.tagName == 'drawObj':
                for basic in drawObj.getElementsByTagName('basic'):
                    if basic.hasAttribute('tag') and basic.getAttribute('tag') == GraficalTag:
                        drawObjects.removeChild(drawObj)
                              
        if drawObjects.getElementsByTagName('drawObj').length == 0:					# Wenn drawObjects keine Elemente mehr enthält, dann löschen  
            drawObjects.parentNode.removeChild(drawObjects)
	ToeneGesamt = '\''
    for chord in voice.getElementsByTagName('chord'):
        Toene = ''	
        VieleToene = ''	
        heads =  chord.getElementsByTagName('head')
        drawObjs = chord.getElementsByTagName('drawObjs')
        for head in chord.getElementsByTagName('head'):
                keineNote = 0
                alter = addElementNode(head,'alter')
                tie = addElementNode(head,'tie')
                if not alter.hasAttribute('step'):
                   alter.setAttribute('step',str('0'))
                if tie.hasAttribute('end'):
                		keineNote = 1		
                alters =  head.getElementsByTagName('alter')
            	if Toene <> '':
            		Toene =  '\r ' + Toene
            	Toene =  head.getAttribute('pitch') + Toene 
            	 
            	
                if alter.getAttribute('step') == '0':								# Berücksichtigung der Alteration
                	Alteration = '-'
                	if Mundharmonika == 1:
                		Toene = Toene + Alteration
                		
                if alter.getAttribute('step') == '1':
                	Alteration = '#'
                	if Intelligenz == 0:
                		Toene = Toene + Alteration
                	if Intelligenz == 1:
                		Toene = Toene[0] + Alteration + Toene[1]
                if alter.getAttribute('step') == '2':
                	Alteration = '##'
                	if Intelligenz == 0:
                		Toene = Toene + Alteration
                	if Intelligenz == 1:
                		Toene = Toene[0] + Alteration + Toene[1]	
                if alter.getAttribute('step') == '-1':
                	Alteration = 'b'
                	if Intelligenz == 0:
                		Toene = Toene + Alteration
                	if Intelligenz == 1 :
                		Toene = Toene[0] + Alteration + Toene[1]	
                if alter.getAttribute('step') == '-2':
                	Alteration = 'bb'
                	if Intelligenz == 0:
                		Toene = Toene + Alteration
                	if Intelligenz == 1 :
                		Toene = Toene[0] + Alteration + Toene[1]			
                
                if Intelligenz == 2:
                	if Toene[0] == 'B':
                		Toene = 'H' + Toene[1]
                	AlterString = ''
                	if Alteration == 'b':
                		AlterString = 'es'
                		if Toene[0] == 'A' or Toene[0] == 'E':
                			AlterString = 's'
                	if Alteration == 'bb':
                		AlterString = 'eses'
                		if Toene[0] == 'A' or Toene[0] == 'E':
                			AlterString = 'ses'
                	if Alteration == '#':
                		AlterString = 'is'
                	if Alteration == '##':
                		AlterString = 'isis'	
                	if Toene[1] == '1':
                		Toene = string.upper(Toene[0]) + AlterString + '\'\''
                	if Toene[1] == '2':
                	   Toene = string.upper(Toene[0]) + AlterString +  '\''
                	if Toene[1] == '3':
                		Toene = string.upper(Toene[0]) + AlterString +  ' '
                	if Toene[1] == '4':
                		Toene = string.lower(Toene[0]) + AlterString +  ' '
                	if Toene[1] == '5':
                		Toene = string.lower(Toene[0]) + AlterString +  '\''
                	if Toene[1] == '6':
                		Toene = string.lower(Toene[0]) + AlterString +  '\'\''
                	if Toene[1] == '7':
                		Toene = string.lower(Toene[0]) + AlterString +  '\'\'\''
                	if Toene[1] == '8':
                		Toene = string.lower(Toene[0]) + AlterString +  '\'\'\'\''
                	if VieleToene <> '':
            			VieleToene =  '\r ' + VieleToene
            		VieleToene =  Toene + VieleToene
            		
                if Intelligenz == 3:
                	if Toene[0] == 'B':
                		Toene = 'H' + Toene[1]
                	AlterString = ''
                	if Alteration == 'b':
                		AlterString = 'es'
                		if Toene[0] == 'A' or Toene[0] == 'E':
                			AlterString = 's'
                	if Alteration == 'bb':
                		AlterString = 'eses'
                		if Toene[0] == 'A' or Toene[0] == 'E':
                			AlterString = 'ses'
                	if Alteration == '#':
                		AlterString = 'is'
                	if Alteration == '##':
                		AlterString = 'isis'	
                	if Toene[1] == '1':
                		Toene = string.upper(Toene[0]) + AlterString + '2'
                	if Toene[1] == '2':
                	   Toene = string.upper(Toene[0]) + AlterString +  '1'
                	if Toene[1] == '3':
                		Toene = string.upper(Toene[0]) + AlterString +  ' '
                	if Toene[1] == '4':
                		Toene = string.lower(Toene[0]) + AlterString +  ' '
                	if Toene[1] == '5':
                		Toene = string.lower(Toene[0]) + AlterString +  '1'
                	if Toene[1] == '6':
                		Toene = string.lower(Toene[0]) + AlterString +  '2'
                	if Toene[1] == '7':
                		Toene = string.lower(Toene[0]) + AlterString +  '3'
                	if Toene[1] == '8':
                		Toene = string.lower(Toene[0]) + AlterString +  '4'
                	if VieleToene <> '':
            			VieleToene =  '\r ' + VieleToene
            		VieleToene =  Toene + VieleToene		
                if Toene[1] == ' ':
                	Toene = Toene[0]
                
                if PositionUeberUnter == 0:    									# Positionen festlegen
                	TextPositionY = 0-string.atoi(TextHight)
                   	EllipsenHight1 = -2.7 + TextPositionY
                	EllipsenHight2 = 0.8 + TextPositionY
                if PositionUeberUnter == 1:
                	TextPositionY = string.atoi(TextHight)
                   	EllipsenHight1 = -2.7 + TextPositionY
                	EllipsenHight2 = 0.8 + TextPositionY

        if NurLoeschen == 0:           
	        drawObjects = addElementNode(chord,'drawObjects')				# Notennamen
	        drawObj = addNewElementNode(drawObjects,'drawObj')
	        text = addElementNode(drawObj,'text')
	        text.setAttribute('x','0.8')
	        font = addNewElementNode(text,'font')
	        font.setAttribute('face','Arial')
	        font.setAttribute('color','')
	        NoteHeight = '12'
	        font.setAttribute('height','8')
	        font.setAttribute('charSet','1')
	        font.setAttribute('pitchAndFamily','2')
	        content = addNewElementNode(text,'content')
	        if Intelligenz == 0 or Intelligenz == 1:
	        	textNode = doc.createTextNode(Toene)
	        if Intelligenz == 2 or Intelligenz == 3:
	        	textNode = doc.createTextNode(VieleToene)
	        content.appendChild(textNode)
	        text.setAttribute('y',str(TextPositionY))
	        text.setAttribute('align','center')
	        basic = addElementNode(drawObj,'basic')
	        basic.setAttribute('tag',GraficalTag)
        ToeneGesamt = ToeneGesamt + Toene + '\',\''
    if NurLoeschen == 0 and Mundharmonika == 1:
	    drawObjects = addElementNode(chord,'drawObjects')				# Notennamen
	    drawObj = addNewElementNode(drawObjects,'drawObj')
	    text = addElementNode(drawObj,'text')
	    text.setAttribute('x','0.8')
	    font = addNewElementNode(text,'font')
	    font.setAttribute('face','Arial')
	    font.setAttribute('color','')
	    font.setAttribute('height','8')
	    font.setAttribute('charSet','1')
	    font.setAttribute('pitchAndFamily','2')
	    content = addNewElementNode(text,'content')
	    textNode = doc.createTextNode(ToeneGesamt)
	    content.appendChild(textNode)
	    text.setAttribute('y',str(TextPositionY))
	    text.setAttribute('align','center')
	    basic = addElementNode(drawObj,'basic')
	    basic.setAttribute('tag',GraficalTag)       
      
def changeDoc(score):
    
    if getDialogValues1():
        	for voice in score.getElementsByTagName('voice'):
                 handleNotes(score, voice)

# 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("Notennamen")
	tempInput = tempfile.mktemp('.capx')
	tempOutput = tempfile.mktemp('.capx')
	activeScore().write(tempInput)
	ScoreChange(tempInput, tempOutput)
	activeScore().read(tempOutput)
	os.remove(tempInput)
	os.remove(tempOutput)
