# -*- coding: ISO-8859-1 -*-
""" capellaScript -- 08.06.2004 Andreas Herzog
>>> What's your length, litte Tone?

    Mit diesem Skript kann man Textfelder mit der Notenlänge über die Noten legen.|
    |
    
    |
    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(['Bruchschreibweise', 'in Worten abgekürzt', 'in Worten'], 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)
    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], padding = 8)
    
    dlg = Dialog('Bitte wählen: ', vbox2)

	
    if dlg.run():
        PositionUeberUnter = rad1.value()
    	TextHight= edit1.value()
    	NurLoeschen = NurLoeschenCheck.value()
    	Intelligenz = rad2.value()
        return True
    else:
        return False
        

def handleNotes(score, voice):
    global TextHight, NoteHight, NoteLength, GraficalTag, NotenAblage, PositionUeberUnter, Intelligenz, Mundharmonika
    
    Kennung = '56294-' +  '22'
    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)


    for chord in voice.getElementsByTagName('chord'):
        Toene = ''	
        VieleToene = ''	
        duration = chord.getElementsByTagName('duration')[0]
        laenge = duration.getAttribute('base')
        heads = chord.getElementsByTagName('head')
        drawObjs = chord.getElementsByTagName('drawObjs')
        if Intelligenz == 1:
        	laenge = (laenge[2:]) + 'tel'
        	if laenge == '1tel':
        		laenge = 'Ganze'
        	if laenge == '2tel':
        		laenge = 'Halbe'
        if Intelligenz == 2:
        	laenge = (laenge[2:]) + 'tel'
        	if laenge == '1tel':
        		laenge = 'Ganze'
        	if laenge == '2tel':
        		laenge = 'Halbe'
        	if laenge == '4tel':
        		laenge = 'Viertel'
        	if laenge == '8tel':
        		laenge = 'Achtel'        		
        	if laenge == '16tel':
        		laenge = 'Sechszehntel'
        	if laenge == '32tel':
        		laenge = 'Zweiunddreizigstel'        		
        	if laenge == '64tel':
        		laenge = 'Vierundsechzigstel'
        	if laenge == '128tel':
        		laenge = 'Hundertachtundzwangzigstel'            		
        if duration.hasAttribute('dots'):
        	if duration.getAttribute('dots') == '1':
        		if Intelligenz == 0:
        			laenge = '3/' + str(string.atoi(laenge[2:])*2)
        		if Intelligenz == 1:
        			 laenge = laenge  + '\r ' + 'punkt.'
        		if Intelligenz == 2:
        			 laenge = laenge  + '\r ' + 'punktiert'        			 
        	if duration.getAttribute('dots') == '2':
        		if Intelligenz == 0:
        			laenge = '7/' + str(string.atoi(laenge[2:])*4)       
        		if Intelligenz == 1:
        			laenge = laenge  + '\r ' + 'dopp.'+ '\r ' + 'punkt.' 	
        		if Intelligenz == 2:
        			laenge = laenge  + '\r ' + 'doppelt'+ '\r ' + 'punktiert'         			
        for head in chord.getElementsByTagName('head'):
                        
                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 or Intelligenz == 2:
	        	textNode = doc.createTextNode(laenge)
	        content.appendChild(textNode)
	        text.setAttribute('y',str(TextPositionY))
	        text.setAttribute('align','center')
	        basic = addElementNode(drawObj,'basic')
	        basic.setAttribute('tag',GraficalTag)
        ToeneGesamt = ToeneGesamt + Toene + '\',\''
        
    for rest in voice.getElementsByTagName('rest'):
        Toene = ''	
        VieleToene = ''	
        duration = rest.getElementsByTagName('duration')[0]
        laenge = duration.getAttribute('base')
        drawObjs = rest.getElementsByTagName('drawObjs')
        if Intelligenz == 1:
        	laenge = (laenge[2:]) + 'tel'
        	if laenge == '1tel':
        		laenge = 'Ganze'
        	if laenge == '2tel':
        		laenge = 'Halbe'
        if Intelligenz == 2:
        	laenge = (laenge[2:]) + 'tel'
        	if laenge == '1tel':
        		laenge = 'Ganze'
        	if laenge == '2tel':
        		laenge = 'Halbe'
        	if laenge == '4tel':
        		laenge = 'Viertel'
        	if laenge == '8tel':
        		laenge = 'Achtel'        		
        	if laenge == '16tel':
        		laenge = 'Sechszehntel'
        	if laenge == '32tel':
        		laenge = 'Zweiunddreizigstel'        		
        	if laenge == '64tel':
        		laenge = 'Vierundsechzigstel'
        	if laenge == '128tel':
        		laenge = 'Hundertachtundzwangzigstel'            		
        if duration.hasAttribute('dots'):
        	if duration.getAttribute('dots') == '1':
        		if Intelligenz == 0:
        			laenge = '3/' + str(string.atoi(laenge[2:])*2)
        		if Intelligenz == 1:
        			 laenge = laenge  + '\r ' + 'punkt.'
        		#if Intelligenz == 2:
        		#	 laenge = laenge  + '\r ' + 'punktiert'        			 
        	if duration.getAttribute('dots') == '2':
        		if Intelligenz == 0:
        			laenge = '7/' + str(string.atoi(laenge[2:])*4)       
        		if Intelligenz == 1:
        			laenge = laenge  + '\r ' + 'dopp.'+ '\r ' + 'punkt.' 	
        		#if Intelligenz == 2:
        		#	laenge = laenge  + '\r ' + 'doppelt'+ '\r ' + 'punktiert'     
        if NurLoeschen == 0:           
	        drawObjects = addElementNode(rest,'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(laenge)
	        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("Notenlängen")
	tempInput = tempfile.mktemp('.capx')
	tempOutput = tempfile.mktemp('.capx')
	activeScore().write(tempInput)
	ScoreChange(tempInput, tempOutput)
	activeScore().read(tempOutput)
	os.remove(tempInput)
	os.remove(tempOutput)
