require(tcltk)      # Load the tcltk package

oneinput <- function(mode, ioff, factor) {

   wvar <- tclVar("")
   xvar <- tclVar("")
   yvar <- tclVar("")
   zvar <- tclVar("")

   tt <- tktoplevel()
   tkwm.title(tt,mode)
   w.entry <- tkentry(tt, textvariable=wvar)
   x.entry <- tkentry(tt, textvariable=xvar)
   y.entry <- tkentry(tt, textvariable=yvar)
   z.entry <- tkentry(tt, textvariable=zvar)

   reset <- function()
    {
     tclvalue(xvar)<-""
    }

   reset.but <- tkbutton(tt, text="Reset", command=reset)

   submit <- function() {
     w <- as.numeric(tclvalue(wvar)) * factor + ioff
     x <- as.numeric(tclvalue(xvar)) * factor + ioff
     y <- as.numeric(tclvalue(yvar)) * factor + ioff
     z <- as.numeric(tclvalue(zvar)) * factor + ioff
     e <- parent.env(environment())
     e$w <- w
     e$x <- x
     e$y <- y
     e$z <- z
     tkdestroy(tt)
   }
   submit.but <- tkbutton(tt, text="submit", command=submit)

   tkgrid(tklabel(tt,text="Enter Four Inputs"),columnspan=2)
   tkgrid(tklabel(tt,text="Input1"), w.entry, pady = 10, padx =10)
   tkgrid(tklabel(tt,text="Input2"), x.entry, pady = 10, padx =10)
   tkgrid(tklabel(tt,text="Input3"), y.entry, pady = 10, padx =10)
   tkgrid(tklabel(tt,text="Input4"), z.entry, pady = 10, padx =10)
   tkgrid(submit.but, reset.but)

  tkwait.window(tt)
  return(c(w,x,y,z))
}


twoinput <- function(mode){

   wvar <- tclVar("")
   xvar <- tclVar("")
   yvar <- tclVar("")
   zvar <- tclVar("")

   tt <- tktoplevel()
   tkwm.title(tt,mode)
   w.entry <- tkentry(tt, textvariable=wvar)
   x.entry <- tkentry(tt, textvariable=xvar)
   y.entry <- tkentry(tt, textvariable=yvar)
   z.entry <- tkentry(tt, textvariable=zvar)

   reset <- function()
    {
     tclvalue(xvar)<-""
    }

   reset.but <- tkbutton(tt, text="Reset", command=reset)

   submit <- function() {
     w <- tclvalue(wvar)
     x <- tclvalue(xvar)
     y <- tclvalue(yvar)
     z <- tclvalue(zvar)
     e <- parent.env(environment())
     e$w <- w
     e$x <- x
     e$y <- y
     e$z <- z
     tkdestroy(tt)
   }
   submit.but <- tkbutton(tt, text="submit", command=submit)

   tkgrid(tklabel(tt,text="Enter Four Inputs"),columnspan=2)
   tkgrid(tklabel(tt,text="Input1"), w.entry, pady = 10, padx =10)
   tkgrid(tklabel(tt,text="Input2"), x.entry, pady = 10, padx =10)
   tkgrid(tklabel(tt,text="Input3"), y.entry, pady = 10, padx =10)
   tkgrid(tklabel(tt,text="Input4"), z.entry, pady = 10, padx =10)
   tkgrid(submit.but, reset.but)

  tkwait.window(tt)
  return(c(w,x,y,z))
}


plotit <- function(X,Y,Labels)
{
# if (length(X)!=length(Y) || length(from)!=length(to))
# stop("invalid data")

top <- tktoplevel()
tktitle(top) <- "Plotting Geographicals"
canvas <- tkcanvas(top, relief="raised", height=200, width=400)
tkpack(canvas)


moveNode <- function(i)
{
force(i)
function(x,y){
x <- as.numeric(x)
y <- as.numeric(y)
for ( e in nodeEdges[[i]] ){
tkcoords(canvas,e$edgeItem,x,y,X[e$to],Y[e$to])
}
tkmove(canvas, nodeItem[i], x-X[i],y-Y[i])
X[i] <<- x
Y[i] <<- y
}
}

nodeEdges <- vector("list",length(x))
nodeItem <- vector("character",length(x))
for ( i in seq(along=from) )
{
f <- from[i]
t <- to[i]
# add line to canvas
e <- tkcreate(canvas, "line", X[f],Y[f],X[t],Y[t],
width=2)
nodeEdges[[f]] <- c(nodeEdges[[f]],list(list(to=t,
edgeItem=e)))
nodeEdges[[t]] <- c(nodeEdges[[t]],list(list(to=f,
edgeItem=e)))
}
for ( i in seq(along=x) )
{
# add the nodes
p <- tkcreate(canvas,"oval",X[i]-6,Y[i]-6,X[i]+6,Y[i]+6,
fill="red")
l <- tkcreate(canvas,"text", X[i]+6, Y[i], text=Labels[i],
anchor="nw", font="10x20")
tag <- paste("node",i,sep="")
tkaddtag(canvas, tag, "withtag", p)
tkaddtag(canvas, tag, "withtag", l)
nodeItem[i] <- tag
# animate them ... for another tutorial
# tkitembind(canvas, p, "<B1-Motion>", moveNode(i))
}

e <- tkcreate(canvas, "line", 0,90,360,90,
width=2)
l <- tkcreate(canvas,"text", 0, 92, text="Equator",
anchor="nw", font="10x20")
e <- tkcreate(canvas, "line", 180,180,180,0,
width=2)
l <- tkcreate(canvas,"text", 182, 170, text="GMT",
anchor="nw", font="10x20")

}


# test code
library(tcltk)
lbl <- twoinput("Placenames - 4 for Latitude,Longitude")
y <- oneinput("Latitudes - 4 Decimal ", 90, -1.0)
x <-  oneinput("Longitudes - 4 Decimal ", 180, 1.0)
plotit(x,y,lbl)
