begintemplate VectorPlay
public b, g, vx, vy, sname, set_vec, oldval, con1, contin, scale
objref b, g, this, vx, vy, sc
strdef sname, tstr

i=0
oldval=0

proc init() {
	have_name = 0
	is_con = 0
	state = 0
	contin = 0
	sc = new SymChooser("Variable Name to Play into")
	build()
	if (numarg() == 0) {
		sprint(tstr, "%s", this)
		b.map(tstr)
	}
}

proc build() {
	sname = "Choose Variable Name in Graph menu"
	b = new VBox()
	b.ref(this)
	b.save("save()")
	b.intercept(1)
	xpanel("", 1)
	xmenu("Specify")
	xbutton("Variable Name", "varname()")
	xbutton("Vector from Clipboard", "clipboard()")
	xcheckbox("Piecewise continuous", &contin, "con()")
	xbutton("*10", "scale(10)")
	xbutton("/10", "scale(.1)")
	xbutton("*2", "scale(2)")
	xbutton("/2", "scale(.5)")
	xmenu()
	xstatebutton("Connected", &state, "con()")
	xvarlabel(sname)
	xpanel()
	g = new Graph()
	b.intercept(0)
}

proc varname() {
	if (sc.run()) {
		have_name = 1
		sc.text(sname)
	}
	con1(is_con)
}

proc clipboard() {
	sprint(tstr, "%s.set_vec(hoc_obj_[1], hoc_obj_[0])", this)
	if(execute1(tstr) == 0) {
continue_dialog("No data in the Vector clipboard.")
        }else{
		con1(is_con)
	}
}

proc set_vec() {
	vx = $o1.c
	vy = $o2.c
	vy.plot(g, vx)
}

proc scale() {
	if (object_id(vy)) {
		vy.mul($1)
		g.erase
		vy.plot(g, vx)
	}
}

proc con() {
	if (!have_name) {
		continue_dialog("Choose Variable name (see Graph Menu)")
		state = 0
	}else if (!object_id(vy)) {
		continue_dialog("Choose Vector from Clipboard (see Graph Menu)")
		state = 0
	}else{
		con1(state)
	}		
}

proc con1() {
	if (object_id(vy)) {
		if (is_con) {
			vy.play_remove()
			sprint(tstr, "%s = %g", sname, oldval)
			execute(tstr)
			is_con = 0
			state = 0
		}
		if ($1) {
			if (contin) {
				sprint(tstr, "{%s.vy.play(&%s, %s.vx, 1)}", this, sname, this)
			}else{
				sprint(tstr, "{%s.vy.play(&%s, %s.vx)}", this, sname, this)
			}
			if (execute1(tstr)) {
				sprint(tstr, "%s.oldval = %s", this, sname)
				execute(tstr)
				is_con = 1
				state = 1
			}else{
				continue_dialog("Invalid Variable name")
			}
		}
	}
}

proc save() {local i
	b.save("load_file(\"vplay.hoc\")\n}\n{")
	b.save("ocbox_=new VectorPlay(1)")
	b.save("}\n{object_push(ocbox_)}")

	if (object_id(vy)) {
		sprint(tstr, "vy = new Vector(%d)", vy.size)
		b.save(tstr)
		sprint(tstr, "vx = new Vector(%d)", vx.size)
		b.save(tstr)
		sprint(tstr, "for i=0,%d { vx.x[i]=fscan() vy.x[i]=fscan()}",\
			vx.size-1)
		b.save(tstr)
		for i=0, vx.size-1 {   
			sprint(tstr, "%g %g", vx.x[i], vy.x[i])
			b.save(tstr)
		}
		b.save("{vy.plot(g, vx)}")
	}

	sprint(tstr, "{sname = \"%s\"  have_name = %d  contin = %d con1(%d)}",\
		 sname, have_name, contin, is_con)
	b.save(tstr)

	b.save("{object_pop()}\n{")
	g.save_name("ocbox_.g", 1)
	b.save("ocbox_ = ocbox_.b")
}

endtemplate VectorPlay

objref tobj

proc makeVectorPlay() {
	tobj = new VectorPlay()
	objref tobj
}
