// -----------------------------------------------------------------------------------
// Authors: 	Ronald van Elburg
// 
// 
//	
// Affiliations:
//           Department of Artificial Intelligence
//           Groningen University
//
//           Department for Experimental Neurophysiology
//			 Vrije Universiteit Amsterdam
//	-----------------------------------------------------------------------------------			
begintemplate ScalarHandler
	public edit, createhandler, set, copy, preparerun, printtofile, show, get_sessionstr
	public outvaluevec
	objref nil,this
	objref vbox
	objref outputvariable, protocol
	objref outfile,outvaluevec, sc
					
	strdef tstr, tstr1
	strdef scalarname,     shortname
	strdef lscalarname,    lshortname 
	
	external MRC_debugmode, MRC_CreateOutParamHandler,tstop, all_in_vector
			
	proc init(){
		if(numarg()==2){
			outputvariable=$o1
			protocol=$o2
			shortname=outputvariable.name
			//print "This is the protocol name: " , protocol
		}else if(1==MRC_debugmode && numarg()>2){
			printf("To many initialization parameters")
		}
				
		sc = new SymChooser("Get Section/Variable Name Example")
		nrntype=0 //nrntype: 0=voltage,1=state,2=current
		
		outvaluevec=new Vector(1,0)				
		runprepared=0
		scalarvalue=1e999
	}
	
	proc set(){
		outputvariable=$o1
		protocol=$2
		nrntype=$3 					//nrntype: 0=voltage,1=state,2=current
		record_start=$4
		record_stop=$5
	}
					
	proc copy(){
		$o1.set(outputvariable, protocol,nrntype,record_start,record_stop)
	}
	
	// Admittedly this is a hack to keep all the information on the handler class stricly local,
	// but it works!
	
	obfunc createhandler(){localobj handler
		if(1==MRC_debugmode){
		 		 print " Create ScalarHandler 1"
		}
		execute1("obfunc MRC_CreateOutParamHandler(){return new ScalarHandler($o1,$o2)}")
		handler=MRC_CreateOutParamHandler($o1,$o2)
		execute1("obfunc MRC_CreateOutParamHandler(){localobj nil  return nil}")
		return handler				
	}
	
	proc exprval() {
		xpanel("", 1)
			xbutton($s1, $s3)
			xvarlabel($s2)
		xpanel()
	}
	
	//Procedure: get_outparname
	//Create a symbol chooser to pick a new parameter for the loopparameter list.
	
	proc get_outparname(){
		if (sc.run()) {
			sc.text(lscalarname)
		}
    }	

	proc createeditwindow(){
					
		sprint(tstr, "Settings for Scalar: %s",outputvariable.name)
	
		vbox=new VBox()
		vbox.intercept(1)
		
    		exprval("Short Name in Output:", lshortname,"string_dialog(\"Short Name in Output:\", lshortname)")	
    		
    		xpanel(tstr)
    		    if(1==numarg()){	
    				xlabel($s1)
    			}
    			xbutton("Pick Outputvariable Name","get_outparname()")
    			xvarlabel(lscalarname)
    		xpanel()
		vbox.intercept(0)
		doNotify()
		
		dialog_outcome=vbox.dialog(tstr,"Accept","Cancel")
	}
	
	proc edit(){
		lscalarname=scalarname
		lshortname=shortname
		
		createeditwindow()
						
		if(1==dialog_outcome){
		  scalarname=lscalarname
		  shortname=lshortname		
		}
	}
	
	proc preparerun(){
        if(0==runprepared){
        	runprepared=1	
        }
    
        if(1==runprepared){
            
        }
	}
	
	proc printtofile(){	local index
		
		sprint(tstr,"%s.outvaluevec.x[0]=%s",this,scalarname)
        execute1(tstr)
		
		
		if(protocol.output_matlab_mfile==1){					
			sprint(tstr,"%s.m", $s1)
			outfile=new File(tstr)
			
			if(!outfile.isopen()){
				outfile.aopen()
			}
			
			if(outfile.isopen()){
				outfile.printf("%%Matlab object for: %s\n", outputvariable.name)
				outfile.printf("%s = %g;\n", shortname, outvaluevec.x[0])
				outfile.close()
			}
		}					
    
        if(protocol.output_neuronbinary==1){					
        
            sprint(tstr,"%s_%s.dat", $s1,shortname)
            outfile=new File(tstr)
            
            if(!outfile.isopen()){
                outfile.aopen()
            }
            
            if(outfile.isopen()){
                outvaluevec.vwrite(outfile,4)
                outfile.close()
            }
        }		
	}
	
	proc show(){
        sprint(tstr,"scalarvalue=%s",scalarname)
        execute1(tstr)		
        xpanel(scalarname, 1)
			xvalue("scalarvalue")
		xpanel()
	}
	
	proc get_sessionstr(){
		$s1=""
		sprint(tstr,"\t{") 				$o2.save(tstr)
	    sprint(tstr,"\t\tscalarname=\"%s\"",scalarname) 	$o2.save(tstr)
	    sprint(tstr,"\t\tshortname=\"%s\"",shortname) 	$o2.save(tstr)
		sprint(tstr,"\t}") 				$o2.save(tstr)
	}
	
	proc unref(){local refcount
		refcount=$1
		if(refcount==0 && 1==runprepared){
			//remove recorded parameters from cvode 
		}
	}
	
endtemplate ScalarHandler