R/dynamicGraphMain.R

"dynamicGraphMain" <-
function (vertexList = NULL, blockList = NULL, dg = NULL, object = NULL, 
    objectName = NULL, control = dg.control(...), ...) 
{
    if ((is.null(dg))) 
        dg <- .newDgGraphEdges(vertexList = vertexList, 
                               blockList = blockList, ...)
    args <- list(...)
    if (!is.null(args$title) && (control$label == "dynamicGraph")) {
        control$label <- args$title
    }
    blockTree <- NULL
    if (length(dg@visibleVertices) == 0) 
        dg@visibleVertices <- 1:length(vertexList)
    if (length(dg@visibleBlocks) == 0) 
        dg@visibleBlocks <- 1:length(blockList)
    if (length(blockList) == 0) 
        blockList <- NULL
    tkselectionForVisibleVertices <- FALSE
    permit.update.block.index <- TRUE
    font.vertex.label <- "8x16"
    font.edge.label <- "8x16"
    font.block <- "10x20"
    min.x <- -control$margin
    max.x <- control$width + control$margin
    d.x <- -min.x/(max.x - min.x)
    min.y <- -control$margin
    max.y <- control$height + control$margin
    d.y <- -min.y/(max.y - min.y)
    initial.set.popups <- FALSE
    colors <- c("DarkGreen", "navy", "NavyBlue", "DarkBlue", 
        "DarkRed", "MidnightBlue", "DarkSlateGray", "DarkSlateGrey", 
        "MediumBlue", "ForestGreen", "SaddleBrown", "DarkOliveGreen", 
        "firebrick", "brown", "blue", "green", "red", "DarkSlateBlue", 
        "SeaGreen", "DarkCyan", "DarkMagenta", "OliveDrab", "sienna", 
        "LimeGreen", "DimGray", "DimGrey", "maroon", "OrangeRed", 
        "DarkGoldenrod", "chocolate", "MediumSeaGreen", "DarkViolet", 
        "LawnGreen", "LightSeaGreen", "SteelBlue", "chartreuse", 
        "SpringGreen", "black", "SlateGray", "SlateGrey", "VioletRed", 
        "IndianRed", "DarkOrange", "RoyalBlue", "peru", "SlateBlue", 
        "BlueViolet", "DarkOrchid", "LightSlateGray", "LightSlateGrey", 
        "YellowGreen", "CadetBlue", "DarkTurquoise", "goldenrod", 
        "orange", "DeepPink", "tomato", "DodgerBlue", "purple", 
        "DeepSkyBlue", "coral", "gold", "DarkSeaGreen", "RosyBrown", 
        "GreenYellow", "MediumPurple", "PaleVioletRed", "DarkKhaki", 
        "MediumOrchid", "CornflowerBlue", "salmon", "LightCoral", 
        "turquoise", "LightSlateBlue", "SandyBrown", "DarkSalmon", 
        "DarkGray", "DarkGrey", "cyan", "magenta", "yellow", 
        "LightGreen", "tan", "LightSalmon", "HotPink", "burlywood", 
        "orchid", "PaleGreen", "gray", "grey", "SkyBlue", "LightGoldenrod", 
        "LightSkyBlue", "aquamarine", "LightSteelBlue", "plum", 
        "violet", "khaki", "LightBlue", "thistle", "LightPink", 
        "PowderBlue", "LightGray", "LightGrey", "PaleGoldenrod", 
        "wheat", "NavajoWhite", "pink", "PaleTurquoise", "PeachPuff", 
        "gainsboro", "moccasin", "bisque", "BlanchedAlmond", 
        "AntiqueWhite", "PapayaWhip", "MistyRose", "beige", "lavender", 
        "LemonChiffon", "linen", "cornsilk", "OldLace", "LightCyan", 
        "LightYellow", "honeydew", "WhiteSmoke", "seashell", 
        "LavenderBlush", "AliceBlue", "FloralWhite", "azure", 
        "ivory", "MintCream", "GhostWhite", "snow", "white")
    "myColor" <- function(i) colors[min(i%%137, length(colors))]
    "drawModel" <- function(frameModels = NULL, frameViews = NULL, 
        graphWindow = NULL, dg = NULL, object = NULL, 
        frameModelsEnv = .get.env.frameModels(frameModels = frameModels), 
        initialWindow = FALSE, returnNewMaster = FALSE, redraw = FALSE, 
        returnFrameModel = TRUE, control = NULL, ...) {
        if ((is.null(dg))) 
            dg <- .newDgGraphEdges(vertexList = vertexList, 
                                   blockList = blockList, ...)
        args <- list(...)
        if (!is.null(args$title)) {
            control$label <- args$title
        }
        "redrawView" <- function(frameModels = NULL, frameViews = NULL, 
            graphWindow = NULL, dg = NULL, initialWindow = FALSE, 
            returnNewMaster = FALSE, redraw = FALSE, returnFrameModel = TRUE, 
            setUpdateCountModelMain = FALSE, control = NULL, ...) {
            args <- list(...)
            if (!is.null(args$title)) {
                control$label <- args$title
            }
            "setSrcLabel" <- function(viewLabel) {
                "g" <- function(x, i, max) {
                  if (!is.null(zoomCenter)) 
                    x <- (x - c(zoomCenter[i]))/Scale + zoomCenter[i]
                  x <- c(x[1], mean(x), x[2])
                  x <- c(x, 100/max * x - 50)
                  return(round(x))
                }
                x <- (min.x + (max.x - min.x) * as.numeric(tkxview(canvas)))
                x <- g(x, 1, control$width)
                x.txt <- paste(format(x, digits = 3, trim = FALSE), 
                  collapse = ", ")
                y <- (min.y + (max.y - min.y) * as.numeric(tkyview(canvas)))
                y <- g(y, 2, control$height)
                y.txt <- paste(format(y, digits = 3, trim = FALSE), 
                  collapse = ", ")
                ViewType <- control$viewClasses[control$viewClasses[, 
                  2] == class(GraphWindow), 1]
                tkconfigure(viewLabel, text = paste(ViewType, 
                  " | ", "X:", x.txt, "Y:", y.txt))
            }
            "getLabel" <- function() {
                title <- paste("Model: ", dm.frameViews@index, 
                  sep = " ")
                if (exists("GraphWindow")) 
                  title <- paste(title, "; Graph: ", GraphWindow@index, 
                    GraphWindow@id, sep = " ")
                return(title)
            }
            "tkinsert.blockVertices" <- function(parent, stratum, 
                treeWidget, delete = FALSE) {
                for (j in seq(along = vertexList)) {
                  vertex <- vertexList[[j]]
                  vertex.stratum <- retStratum(j, vertex.type = "Vertex")
                  if (vertex.stratum == stratum) {
                    child <- name(vertex)
                    fill <- "DarkGreen"
                    if (!is.element(j, dg@visibleVertices)) {
                      child <- tdv(child)
                      fill <- "SpringGreen"
                    }
                    if (delete) 
                      tkdelete(treeWidget, child)
                    else tkinsert(treeWidget, "end", parent, 
                      child, text = child, fill = fill)
                  }
                }
            }
            "ubl" <- function(label = block@label, index = block@index, 
                block = NULL) paste(c("", abs(index), label), 
                collapse = ":")
            "iubl" <- function(s, n = nchar(s), m = 1 + (1:n)[substring(s, 
                1:n, 1:n) == ":"][2]) paste(substring(s, m:n, 
                m:n), collapse = "")
            "tdv" <- function(name) paste(c("(", name, ")"), collapse = "")
            "tkinsert.block" <- function(treeWidget, parent, 
                block, open = openTreeBlock[abs(block@index)], 
                delete = FALSE, fill = "Blue") {
                Child <- block@label
                child <- ubl(Child, block = block)
                if (delete) 
                  tkdelete(treeWidget, child)
                else tkinsert(treeWidget, "end", parent, child, 
                  open = open, text = Child, fill = fill)
            }
            "tkinsert.blockTree" <- function(treeWidget, tree, 
                delete = FALSE) {
                "subVisitBlockTree" <- function(tree) {
                  parent <- ubl(block = tree$block)
                  tkinsert.blockVertices(parent, tree$block@stratum, 
                    treeWidget, delete)
                  if (!is.null((tree$sub.blocks))) 
                    for (j in 1:length(tree$sub.blocks)) {
                      tkinsert.block(treeWidget, parent, 
                                     block = tree$sub.blocks[[j]]$block, 
                                     delete)
                      subVisitBlockTree(tree$sub.blocks[[j]])
                    }
                }
                if (!.IsEmpty(blockList) && !.IsEmpty(tree) && 
                  !(length(tree) == 0)) {
                  tkinsert.blockVertices(parent = "root", 0, 
                    treeWidget, delete)
                  tkinsert.block(treeWidget, parent = "root", 
                    block = tree$block, open = TRUE, delete = delete, 
                    fill = "DarkBlue")
                  subVisitBlockTree(tree)
                }
            }
            "oldtkinsert.blockList" <- function(treeWidget, blockList, 
                delete = FALSE) {
                if (!.IsEmpty(blockList)) 
                  for (j in 1:length(blockList)) {
                    parent <- "root"
                    ancestor <- max(ancestors(blockList[[j]]))
                    if (ancestor > 0) 
                      parent <- ubl(block = blockList[[ancestor]])
                    tkinsert.block(treeWidget, parent = parent, 
                      block = blockList[[j]], open = openTreeBlock[j], 
                      delete = delete)
                    parent <- ubl(block = blockList[[j]])
                    tkinsert.blockVertices(parent, blockList[[j]]@stratum, 
                      treeWidget, delete)
                  }
                tkinsert.blockVertices(parent = "root", 0, treeWidget, 
                  delete)
            }
            "tkinsert.blockList" <- function(treeWidget, blockList, 
                delete = FALSE) {
                tkinsert.blockVertices("root", stratum = 0, treeWidget, 
                  delete = delete)
                if (!.IsEmpty(blockList)) 
                  for (j in 1:length(blockList)) {
                    if (0 == parent(blockList[[j]])) {
                      tkinsert.subblockList(treeWidget, blockList, 
                        index = j, parent = 0, 
                        stratum = stratum(blockList[[j]]), 
                        delete = delete)
                    }
                  }
            }
            "tkinsert.subblockList" <- function(treeWidget, blockList, 
                index, parent = blockList[[index]]@parent, 
                stratum = blockList[[index]]@stratum, delete = FALSE) {
                parentName <- "root"
                if (parent > 0) 
                  parentName <- ubl(block = blockList[[parent]])
                tkinsert.block(treeWidget, parent = parentName, 
                  block = blockList[[index]], open = openTreeBlock[index], 
                  delete = delete)
                parentName <- ubl(block = blockList[[index]])
                tkinsert.blockVertices(parentName, stratum, treeWidget, 
                  delete)
                if (!.IsEmpty(blockList)) 
                  for (j in 1:length(blockList)) {
                    if (index == parent(blockList[[j]])) {
                      tkinsert.subblockList(treeWidget, blockList, 
                        index = j, parent = index, 
                        stratum = stratum(blockList[[j]]), 
                        delete = delete)
                    }
                  }
            }
            "grepVertices" <- function(name) {
                selectedVertices <- NULL
                for (j in 1:length(vertexList)) 
                  if (length(grep(namesVertices[j], name)) > 0) 
                  selectedVertices <- c(selectedVertices, j)
                return(selectedVertices)
            }
            "grepBlocks" <- function(name) {
                selectedBlocks <- NULL
                if (!.IsEmpty(blockList)) 
                  for (j in 1:length(blockList)) {
                    blockname <- ubl(block = blockList[[j]])
                    if (length(grep(blockname, name)) > 0) 
                      selectedBlocks <- c(selectedBlocks, j)
                  }
                return(selectedBlocks)
            }
            "popupSelectedInPanel" <- function() {
                selectedVertices <- NULL
                selectedBlocks <- NULL
                if (control$variableFrame) {
                  box <- GW.top$env$box
                  if ((get("type", box$env) == "variableList")) {
                    vv <- returnVisibleVertices()
                    sv <- as.numeric(tkcurselection(box)) + 1
                    if (tkselectionForVisibleVertices) 
                      selectedVertices <- c(setdiff(vv, sv), 
                        setdiff(sv, vv))
                    else selectedVertices <- sv
                  }
                  else {
                    sv <- tclvalue(tcl(box, "selection", "get"))
                    selectedVertices <- c(selectedVertices, grepVertices(sv))
                    selectedBlocks <- c(selectedBlocks, grepBlocks(sv))
                  }
                }
                for (i in selectedVertices) {
                  vertex.type <- "Vertex"
                  if (closedVertex[i]) 
                    vertex.type <- "Vertex"
                  callPopupInBox(vertex = vertexList[[i]], i = i, 
                    vertex.type = vertex.type, 
                    UserNodePopupItems = control$UserMenus)()
                }
                for (i in selectedBlocks) {
                  vertex.type <- "OpenBlock"
                  if (closedBlock[i]) 
                    vertex.type <- "ClosedBlock"
                  callPopupInBox(vertex = blockList[[i]], i = i, 
                    vertex.type = vertex.type, 
                    UserNodePopupItems = control$UserMenus)()
                }
            }
            "bindBox" <- function(box, label = "newGraph") {
                if (control$debug.position) 
                  print(label)
                tcl("bind", box, "<F11>", function(...) {
                  print("<<<F11>>>")
                })
                tkbind(box, "<F12>", function(...) {
                  print("<<<F12>>>")
                })
                tkbind(box, "<Button-1>", function() {
                  if (control$debug.position) 
                    print("<Button-1>")
                  vv <- returnVisibleVertices()
                  if (!(get("type", box$env) == "variableList")) {
                    sv <- tclvalue(tcl(box, "selection", "get"))
                  }
                  else {
                    sv <- as.numeric(tkcurselection(box)) + 1
                  }
                  if (control$debug.position) 
                    print(sv)
                  if (control$debug.position) 
                    print(vv)
                })
                if (control$debug.position) 
                  print("<Button-1>")
                tkbind(box, "<Double-Button-1>", function() {
                  if (control$debug.position) 
                    print("<Double-Button-1>")
                  if (tkselectionForVisibleVertices) {
                    vv <- returnVisibleVertices()
                    sv <- as.numeric(tkcurselection(box)) + 1
                    for (i in setdiff(vv, sv)) subDropVertex(i, 
                      slave = FALSE, upd = FALSE)
                    for (i in setdiff(sv, vv)) subAddVertex(i, 
                      slave = FALSE)
                  }
                  else {
                    for (i in (as.numeric(tkcurselection(box)) + 
                      1)) {
                      if (is.element(i, returnVisibleVertices())) 
                        subDropVertex(i, slave = FALSE, upd = FALSE)
                      else subAddVertex(i, slave = FALSE)
                    }
                  }
                })
                if (control$debug.position) 
                  print("<Double-Button-1>")
                tkbind(box, "<Button-2>", function() {
                  if (control$debug.position) 
                    print("<Button-2>")
                  if (!(get("type", box$env) == "variableList")) {
                    sv <- tclvalue(tcl(box, "selection", "get"))
                    if (control$debug.position) 
                      print(sv)
                  }
                  else {
                    vv <- returnVisibleVertices()
                    sv <- as.numeric(tkcurselection(box)) + 1
                    for (i in setdiff(vv, sv)) propertyNode(i, 
                      vertex.type = "Vertex")()
                    for (i in setdiff(sv, vv)) propertyNode(i, 
                      vertex.type = "Vertex")()
                  }
                })
                if (control$debug.position) 
                  print("<Button-2>")
                tkbind(box, "<Enter>", function() {
                  if (control$debug.position) 
                    print("<Enter>")
                  subUpdatePositions(label)
                  if ((get("type", box$env) == "variableList")) {
                    if (tkselectionForVisibleVertices) {
                      for (i in 1:length(vertexList)) {
                        tkselection.clear(box, i - 1)
                      }
                      for (i in returnVisibleVertices()) {
                        tkselection.set(box, i - 1)
                      }
                    }
                  }
                  else {
                    sv <- tclvalue(tcl(box, "selection", "get"))
                    if (control$debug.position) 
                      print(sv)
                  }
                })
                if (control$debug.position) 
                  print("<Enter>")
                tkbind(box, "<Leave>", function() {
                  if (control$debug.position) 
                    print("<Leave>")
                  subUpdatePositions(label)
                })
                if (control$debug.position) 
                  print("<Leave>")
                tkbind(box, "<ButtonRelease-1>", function() {
                  if (control$debug.position) 
                    print("<ButtonRelease-1>")
                  subUpdatePositions(label)
                  if ((get("type", box$env) == "variableList")) {
                  }
                  else {
                    sv <- tclvalue(tcl(box, "selection", "get"))
                    if (control$debug.position) 
                      print(sv)
                  }
                })
                if (control$debug.position) 
                  print("<ButtonRelease-1>")
                tkbind(box, "<Motion>", function() {
                })
                if (control$debug.position) 
                  print("<Motion>")
                tkbind(box, "<Button-3>", function() {
                  print("<Button-3....>")
                  if (control$debug.position) 
                    print("<Button-3>")
                  popupSelectedInPanel()
                })
                if (control$debug.position) 
                  print("<Button-3>")
            }

            "moveCanvas" <- function() {
                o.x <- NULL
                o.y <- NULL
                function(x, y) {
                  n.x <- as.numeric(x) * d.x / min.x
                  n.y <- as.numeric(y) * d.y / min.y
                  if (!is.null(o.y)) { 
                    d.x <- n.x - o.x
                    d.y <- n.y - o.y
                    if ((abs(d.x) < 0.1) && (abs(d.y) < 0.1)) {
                      r.x <- as.numeric(tkxview(GW.top$env$canvas))[1]
                      r.y <- as.numeric(tkyview(GW.top$env$canvas))[1]
                      tkxview.moveto(GW.top$env$canvas, r.x + d.x)
                      tkyview.moveto(GW.top$env$canvas, r.y + d.y)
                      setSrcLabel(GW.top$env$viewLabel)
                    }
                  }
                  o.x <<- n.x
                  o.y <<- n.y
                }
            }

            "newGraph" <- function(viewType, ldg, title = "Graph diddler", 
                index = -1, id = 0, close.enough = control$closeenough, 
                parent = "", background = "white", width = 400, 
                height = 400) {
                prototype <- "DynamicGraphView"
                x <- match(viewType, control$viewClasses[, 1])
                if (is.null(x) || all(is.na(x))) {
                  x <- match(viewType, control$viewClasses[, 
                    2])
                  viewType <- paste(control$viewClasses[, 1][x])
                }
                if (!is.null(x) && !all(is.na(x))) 
                  prototype <- paste(control$viewClasses[, 2][x])
                top <- tktoplevel()
                f0.box <- NULL
                viewLabel <- NULL
                tags <- NULL
                if (control$permitZoom) {
                  f <- tkframe(top)
                  tkpack(f, expand = "yes", side = "top", fill = "both")
                  if (control$variableFrame) {
                    w.pane <- FALSE
                    try(w.pane <- tcl("panedwindow", .Tk.subwin(f)), 
                      silent = TRUE)
                    has.paned <- (class(w.pane) != "logical")
                    if (!has.paned) {
                      control$variableFrame <<- has.paned
                      message("'panedwindow' not in your version of 'Tcl/tk'")
                    }
                  }
                  if (control$variableFrame) {
                    tkpack(w.pane, side = "top", expand = "yes", 
                      fill = "both", pady = 2, padx = "2m")
                    tcl("wm", "iconname", top, "Paned window")
                    "myTclRequire" <- function(package, warn = TRUE) {
                      a <- tclvalue(.Tcl(paste("package versions ", 
                        package)))
                      if (length(a) == 1 && nchar(a) == 0 && a == "") {
                        if (warn) 
                          warning(paste("Tcl package", package, 
                            "not found."))
                        return(FALSE)
                      }
                      else .Tcl(paste("package require ", package))
                    }
                    f0 <- tkframe(f)
                    if ((!.IsEmpty(blockList) || !.IsEmpty(blockTree)) && 
                      (class(myTclRequire("BWidget", warn = FALSE)) == 
                        "tclObj")) {
                      "selectcommand" <- function(...) {
                        sv <- NULL
                        if ((get("type", GW.top$env$box$env) == 
                          "variableList")) {
                          sv <- as.numeric(tkcurselection(box)) + 
                            1
                        }
                        else {
                          sv <- tclvalue(tcl(box, "selection", 
                            "get"))
                        }
                        print(paste(" Node: ", list(...)[[1]], 
                          "; ", list(...)[[2]], "; Cut: ", sv))
                      }
                      "dropcmd" <- function(...) {
                        moveVertex <- grepVertices(list(...)[[6]])
                        moveBlock <- grepBlocks(list(...)[[6]])
                        toVertex <- grepVertices(list(...)[[3]])
                        toBlock <- grepBlocks(list(...)[[3]])
                        toBlockIndex <- NULL
                        if (!is.null(toBlock)) {
                          if (length(toBlock) > 1) {
                            message(paste("Ignoring blocks: ", 
                              paste(toBlock[2:length(toBlock)], 
                                collapse = ",")))
                            toBlock <- toBlock[1]
                          }
                          if (!is.null(toVertex)) {
                            message(paste("Ignoring vertices: ", 
                              paste(toVertex, collapse = ",")))
                          }
                          toBlockIndex <- toBlock
                        }
                        else if (!is.null(toVertex)) {
                          if (length(toVertex) > 1) {
                            message(paste("Ignoring vertices: ", 
                              paste(toVertex[2:length(toVertex)], 
                                collapse = ",")))
                            toVertex <- toVertex[1]
                          }
                          toBlockIndex <- retBlockIndex(toVertex)
                        }
                        if (!is.null(moveVertex)) {
                          if (length(moveVertex) > 1) {
                            message(paste("Ignoring vertices: ", 
                              paste(moveVertex[2:length(moveVertex)], 
                                collapse = ",")))
                            moveVertex <- moveVertex[1]
                          }
                          if (!is.null(moveBlock)) 
                            message(paste("Ignoring blocks with same name: ", 
                              paste(moveBlock, collapse = ",")))
                          posFrom <- retVertexPos(moveVertex, 
                            vertex.type = "Vertex")
                          if (!is.null(toBlockIndex)) {
                            posTo <- retVertexPos(toBlockIndex, 
                              vertex.type = "ClosedBlock")
                            dxy = posTo - posFrom
                            if (setVertexPos(moveVertex, posTo, 
                              dxy, vertex.type = "Vertex")) {
                              if (toBlockIndex == retBlockIndex(moveVertex)) 
                                setUpdateBlockEdges("dropcmd")
                              if (closedVertex[moveVertex] && 
                                !closedBlock[toBlockIndex]) 
                                setCloseVertex(moveVertex, 
                                               !closedVertex[moveVertex], 
                                  vertex.type = "Vertex")
                              if (!closedVertex[moveVertex]) 
                                tkmove(canvas, vertexItem(moveVertex)$tag, 
                                  dxy[1], dxy[2])
                            }
                          }
                        }
                        else if (!is.null(moveBlock)) {
                          if (length(moveBlock) > 1) {
                            message(paste("Ignoring blocks: ", 
                              paste(moveBlock[2:length(moveBlock)], 
                                collapse = ",")))
                            moveBlock <- moveBlock[1]
                          }
                          old.parentName <- "root"
                          old.parent <- max(ancestors(blockList[[moveBlock]]))
                          if (old.parent > 0) 
                            old.parentName <- ubl(block = blockList[[old.parent]])
                          if (is.null(toBlockIndex)) 
                            toBlockIndex <- 0
                          moveBlockName <- ubl(block = blockList[[moveBlock]])
                          if (toBlockIndex == 0) 
                            toBlockName <- "root"
                          else toBlockName <- ubl(block = blockList[[toBlockIndex]])
                          if (moveBlock == toBlockIndex) 
                            message("No move!")
                          else if (!(toBlockIndex == 0) && is.element(toBlockIndex, 
                            blockList[[moveBlock]]@descendants)) 
                            message("Move to child!")
                          else {
                            setUpdatePositions("dropcmd")
                            tkinsert.subblockList(GW.top$env$box, 
                              blockList, index = moveBlock, delete = TRUE)
                            parentFromBlock <- blockList[[moveBlock]]@parent
                            if (parentFromBlock > 0) {
                              x <- blockList[[parentFromBlock]]@children
                              blockList[[parentFromBlock]]@children <<- x[x != 
                                moveBlock]
                            }
                            blockList[[moveBlock]]@parent <<- toBlockIndex
                            if (toBlockIndex > 0) {
                              x <- unique(c(blockList[[toBlockIndex]]@children, 
                                moveBlock))
                              blockList[[toBlockIndex]]@children <- x[x != 0]
                            }
                            x <- unique(c(moveBlock, blockList[[moveBlock]]@descendants))
                            x <- x[x != 0]
                            for (j in blockList[[moveBlock]]@ancestors) {
                              if (j > 0) {
                                blockList[[j]]@descendants <<- setdiff(blockList[[j]]@descendants, 
                                  x)
                              }
                            }
                            if (toBlockIndex > 0) {
                              for (j in blockList[[toBlockIndex]]@ancestors) {
                                if (j > 0) {
                                  z <- unique(c(blockList[[j]]@descendants, x))
                                  z <- z[z != 0]
                                  blockList[[j]]@descendants <<- z
                                }
                              }
                              z <- unique(c(blockList[[toBlockIndex]]@descendants, 
                                x))
                              z <- z[z != 0]
                              blockList[[toBlockIndex]]@descendants <<- z
                            }
                            if (toBlockIndex > -1) {
                              oldAnc <- blockList[[moveBlock]]@ancestors
                              if (toBlockIndex > 0) 
                                z <- unique(c(blockList[[toBlockIndex]]@ancestors, 
                                  toBlockIndex))
                              else z <- 0
                              z <- z[z != 0]
                              blockList[[moveBlock]]@ancestors <<- z
                              if (toBlockIndex > 0) 
                                newAnc <- unique(c(toBlockIndex, 
                                  blockList[[toBlockIndex]]@ancestors))
                              else newAnc <- 0
                              newAnc <- newAnc[newAnc != 0]
                              for (j in blockList[[moveBlock]]@descendants) {
                                if (j > 0) {
                                  z <- unique(c(newAnc, setdiff(blockList[[j]]@ancestors, 
                                    oldAnc)))
                                  z <- z[z != 0]
                                  blockList[[j]]@ancestors <<- z
                                }
                              }
                            }
                            blockList <<- checkBlockList(blockList)
                            tkinsert.subblockList(GW.top$env$box, 
                              blockList, index = moveBlock, delete = FALSE)
                            blockTree <<- list(NULL)
                          }
                        }
                      }
                      "opencmd" <- function(...) {
                        openTreeBlock[which(iubl(list(...)) == 
                          Names(blockList))] <<- TRUE
                      }
                      "closecmd" <- function(...) {
                        openTreeBlock[which(iubl(list(...)) == 
                          Names(blockList))] <<- FALSE
                      }
                      "dropovercmd" <- function(...) {
                        print(paste("DropOverCmd: ", paste(unlist(list(...)), 
                          collapse = ";")))
                      }
                      "draginitcmd" <- function(...) {
                        print(paste("DragInitCmd: ", paste(unlist(list(...)), 
                          collapse = ";")))
                      }
                      "dragendcmd" <- function(...) {
                        print(paste("DragEndCmd: ", paste(unlist(list(...)), 
                          collapse = ";")))
                      }
                      "f0.box" <- tkwidget(f0, "Tree", relief = "raised", 
                        background = background, highlightcolor = "Black", 
                        selectbackground = "gray", selectforeground = "white", 
                        dragenabled = TRUE, dragevent = 1, dropenabled = TRUE, 
                        dropcmd = function(...) dropcmd(...), 
                        opencmd = function(...) opencmd(...), 
                        closecmd = function(...) closecmd(...), 
                        selectcommand = function(...) selectcommand(...), 
                        yscrollcommand = function(...) tkset(f0.scr, 
                          ...))
                      if (FALSE && !.IsEmpty(blockTree)) {
                        assign("type", "blockTree", envir = f0.box$env)
                        tkinsert.blockTree(f0.box, blockTree)
                      }
                      else {
                        assign("type", "blockList", envir = f0.box$env)
                        tkinsert.blockList(f0.box, blockList, 
                          delete = FALSE)
                      }
                    }
                    else {
                      f0.box <- tklistbox(f0, relief = "raised", 
                        background = background, selectmode = "multiple", 
                        highlightcolor = "Black", foreground = "DarkGreen", 
                        yscrollcommand = function(...) tkset(f0.scr, 
                          ...))
                      assign("type", "variableList", envir = f0.box$env)
                      for (i in (1:length(namesVertices))) {
                        child <- namesVertices[i]
                        if (!is.element(i, ldg@visibleVertices)) 
                          child <- tdv(child)
                        tkinsert(f0.box, "end", child)
                      }
                      if (tkselectionForVisibleVertices) 
                        for (i in ldg@visibleVertices) {
                          tkselection.set(f0.box, i - 1)
                        }
                    }
                    tkpack(f0.box, expand = "yes", fill = "both")
                    f0.scr <- tkscrollbar(f0, repeatinterval = 5, 
                      orient = "vertical", command = function(...) {
                        tkyview(f0.box, ...)
                      })
                    tkgrid(f0.box, padx = 1, pady = 1, row = 0, 
                      column = 1, rowspan = 1, columnspan = 1, 
                      sticky = "news")
                    tkgrid(f0.scr, padx = 1, pady = 1, row = 0, 
                      column = 2, rowspan = 1, columnspan = 1, 
                      sticky = "news")
                    tkgrid.columnconfigure(f0, 1, weight = 1, 
                      minsize = 0)
                    tkgrid.rowconfigure(f0, 0, weight = 1, minsize = 0)
                    bindBox(f0.box)
                    f1 <- tkframe(f)
                    viewLabel <- tklabel(f1, text = viewType, 
                      foreground = "DarkSlateBlue", background = "LightGrey")
                    xscr <- tkscrollbar(f1, repeatinterval = 5, 
                      orient = "horizontal", background = "white", 
                      command = function(...) {
                        tkxview(canvas, ...)
                        setSrcLabel(viewLabel)
                      })
                    yscr <- tkscrollbar(f1, repeatinterval = 5, 
                      orient = "vertical", command = function(...) {
                        tkyview(canvas, ...)
                        setSrcLabel(viewLabel)
                      })
                    canvas <- tkcanvas(f1, relief = "raised", 
                      background = background, closeenough = close.enough, 
                      borderwidth = 5, 
                      scrollregion = c(min.x, min.y, max.x, max.y), 
                      xscrollincrement = -4, 
                      yscrollincrement = -4, 
                      xscrollcommand = function(...) tkset(xscr, ...), 
                      yscrollcommand = function(...) tkset(yscr, ...), 
                      width = width, height = height)
                    tkpack(canvas, expand = "yes", fill = "both")
                    tkgrid(canvas, padx = 1, pady = 1, row = 0, 
                      column = 1, rowspan = 1, columnspan = 1, 
                      sticky = "news")
                    tkgrid(yscr, padx = 1, pady = 1, row = 0, 
                      column = 2, rowspan = 1, columnspan = 1, 
                      sticky = "news")
                    tkgrid(xscr, padx = 1, pady = 1, row = 1, 
                      column = 1, rowspan = 1, columnspan = 1, 
                      sticky = "news")
                    tkgrid(viewLabel, padx = 1, pady = 1, row = 2, 
                      column = 1, rowspan = 1, columnspan = 2, 
                      sticky = "news")
                    tkgrid.columnconfigure(f1, 1, weight = 1, 
                      minsize = 0)
                    tkgrid.rowconfigure(f1, 0, weight = 1, minsize = 0)
                    tkadd(w.pane, f0, f1)
                    tkfocus(canvas)
                    tkfocus(top)
                  }
                  else {
                    viewLabel <- tklabel(f, text = viewType, 
                      foreground = "DarkSlateBlue", background = "LightGrey")
                    xscr <- tkscrollbar(f, repeatinterval = 5, 
                      orient = "horizontal", background = "white", 
                      command = function(...) {
                        tkxview(canvas, ...)
                        setSrcLabel(viewLabel)
                      })
                    yscr <- tkscrollbar(f, repeatinterval = 5, 
                      orient = "vertical", command = function(...) {
                        tkyview(canvas, ...)
                        setSrcLabel(viewLabel)
                      })
                    f1 <- tkframe(f)
                    canvas <- tkcanvas(f1, relief = "raised", 
                      background = background, closeenough = close.enough, 
                      borderwidth = 5, highlightthickness = 2, 
                      scrollregion = c(min.x, min.y, max.x, max.y), 
                      xscrollincrement = -4, yscrollincrement = -4, 
                      xscrollcommand = function(...) tkset(xscr, ...), 
                      yscrollcommand = function(...) tkset(yscr, ...), 
                      width = width, height = height)
                    tkpack(canvas, expand = "yes", fill = "both")
                    tkgrid(f1, padx = 1, pady = 1, row = 0, column = 0, 
                      rowspan = 1, columnspan = 1, sticky = "news")
                    tkgrid(yscr, padx = 1, pady = 1, row = 0, 
                      column = 1, rowspan = 1, columnspan = 1, 
                      sticky = "news")
                    tkgrid(xscr, padx = 1, pady = 1, row = 1, 
                      column = 0, rowspan = 1, columnspan = 1, 
                      sticky = "news")
                    tkgrid(viewLabel, padx = 1, pady = 1, row = 2, 
                      column = 0, rowspan = 1, columnspan = 1, 
                      sticky = "news")
                    tkgrid.columnconfigure(f, 0, weight = 1, 
                      minsize = 0)
                    tkgrid.rowconfigure(f, 0, weight = 1, minsize = 0)
                    tkpack(canvas, expand = "yes", fill = "both", 
                      padx = 1, pady = 1)
                    tkfocus(canvas)
                  }
                }
                else {
                  canvas <- tkcanvas(top, relief = "raised", 
                    background = background, closeenough = close.enough, 
                    width = width, height = height)
                  tkpack(canvas)
                }
                assign("box", f0.box, envir = top$env)
                assign("canvas", canvas, envir = top$env)
                assign("viewLabel", viewLabel, envir = top$env)
                assign("tags", tags, envir = top$env)
                GW.top <<- (top)
                GW.tags <<- list(NULL)
                GW.env <<- .Dg.toplevel(parent)
                prototype <- typeToPrototype(type = viewType, 
                  prototype = "DynamicGraphView", classes = control$viewClasses)
                result <- new(prototype, id.env = GW.env$ID, 
                  label = paste(title, viewType, sep = " / "), 
                  index = index, id = id, dg = ldg)
                tktitle(top) <- title
                return(result)
            }
            "Args" <- function(x.drawModel = drawModel, x.redrawView = redrawView, 
                x.frameModels = dgm.frameModels, x.frameViews = dm.frameViews, 
                x.graphWindow = GraphWindow, x.vertexList = vertexList, 
                x.blockList = blockList, x.dg = dg, x.visibleVertices = dg@visibleVertices, 
                x.visibleBlocks = dg@visibleBlocks, x.edgeList = currentEdges(edge.type = "VertexEdge"), 
                x.oriented = dg@oriented, x.blockEdgeList = currentEdges(edge.type = "BlockEdge"), 
                x.factorVertexList = dg@factorVertexList, x.factorEdgeList = currentEdges(edge.type = "FactorEdge"), 
                x.extraList = dg@extraList, x.extraEdgeList = currentEdges(edge.type = "ExtraEdge"), 
                x.object = object, x.objectName = objectName, 
                x.viewType = dg@viewType, x.top = GW.top, x.box = GW.top$env$box, 
                x.canvas = GW.top$env$canvas, x.viewLabel = GW.top$env$viewLabel, 
                x.tags = GW.tags, x.envir = GW.env$env, x.title = title, 
                x.selectedNodes = selectedNodes, x.selectedEdges = selectedEdges, 
                x.closedBlock = closedBlock, x.hiddenBlock = hiddenBlock, 
                x.control = control) return(list(drawModel = x.drawModel, 
                redrawView = x.redrawView, frameModels = x.frameModels, 
                frameViews = x.frameViews, graphWindow = x.graphWindow, 
                modelIndex = x.frameViews@index, viewIndex = x.graphWindow@index, 
                vertexList = x.vertexList, blockList = x.blockList, 
                dg = x.dg, visibleVertices = x.visibleVertices, 
                visibleBlocks = x.visibleBlocks, edgeList = x.edgeList, 
                oriented = x.oriented, blockEdgeList = x.blockEdgeList, 
                factorVertexList = x.factorVertexList, factorEdgeList = x.factorEdgeList, 
                extraList = x.extraList, extraEdgeList = x.extraEdgeList, 
                object = x.object, objectName = x.objectName, 
                viewType = x.viewType, top = x.top, box = x.box, 
                canvas = x.canvas, viewLabel = x.viewLabel, tags = x.tags, 
                envir = x.envir, title = x.title, selectedNodes = x.selectedNodes, 
                selectedEdges = x.selectedEdges, closedBlock = x.closedBlock, 
                hiddenBlock = x.hiddenBlock, control = x.control))
            "makeSlave" = function(sameModel = TRUE, local.Views = NULL, 
                Object = NULL, label = "Default", variableFrame = control$variableFrame) {
                control$variableFrame <- variableFrame
                sinkView(NULL, edges = FALSE, blocks = TRUE)
                edge.List <- currentEdges(edge.type = "VertexEdge")
                blockEdgeList <- currentEdges(edge.type = "BlockEdge")
                factorEdgeList <- currentEdges(edge.type = "FactorEdge")
                extraEdgeList <- currentEdges(edge.type = "ExtraEdge")
                Arguments <- Args()
                ldg <- dg
                ldg@edgeList <- edge.List
                if (any(slotNames(Object) == ".title")) {
                  label <- Object@.title
                }
                if (sameModel) 
                  redrawView(frameModels = dgm.frameModels, frameViews = local.Views, 
                    graphWindow = NULL, dg = ldg, control = control, 
                    Arguments = Arguments, title = label)
                else drawModel(frameModels = dgm.frameModels, 
                  frameViews = NULL, graphWindow = NULL, dg = ldg, 
                  object = Object, control = control, Arguments = Arguments, title = label)
            }
            "relativePositionsCanvas" <- function(positions) {
                if (!is.null(zoomPositions)) {
                  diff <- 100/(zoomPositions[, 2] - zoomPositions[, 
                    1])
                  p <- (diag(diff) %*% (.asRow(positions)) - 
                    0)
                }
                else p <- .asRow(positions)
                x <- t(diag(c(control$width, control$height, 
                  rep(100, local.N - 2))/100) %*% (p + 0))
                x <- (x - 0) * Scale + 0
                x <- round(x)
                return(x)
            }
            "inversCanvasRelativePosition" <- function(positions) {
                p <- .asRow(positions)
                p <- (p - 0)/Scale + 0
                if (is.null(dim(p)) && (length(p) < local.N)) 
                  if (length(p) == 1) 
                    p <- rep(p, local.N)
                  else p <- rep(0, local.N)
                p <- t(diag(c(100/control$width, 100/control$height, 
                  rep(1, local.N - 2))) %*% p - 0)
                if (!is.null(zoomPositions)) {
                  diff <- (zoomPositions[, 2] - zoomPositions[, 
                    1])/100
                  q <- t(diag(diff) %*% t(p + 0))
                  return(q)
                }
                else return(p)
            }
            "positionsCanvas" <- function(positions) {
                if (!is.null(zoomPositions)) {
                  a <- zoomPositions[, 1]
                  b <- zoomPositions[, 2]
                  A <- matrix(rep(a, ifelse(is.null(dim(positions)), 
                    1, nrow(positions))), byrow = TRUE, ncol = local.N)
                  diff <- 100/(b - a)
                  p <- (diag(diff) %*% (.asRow(positions) - t(A)) - 
                    50)
                }
                else p <- .asRow(positions)
                x <- t(diag(c(control$width, control$height, 
                  rep(100, local.N - 2))/100) %*% (p + 50))
                if (!is.null(zoomCenter)) 
                  x <- t((t(x) - c(zoomCenter)) * Scale + zoomCenter)
                x <- round(x)
                return(x)
            }
            "inversCanvasPosition" <- function(positions) {
                p <- .asRow(positions)
                if (!is.null(zoomCenter)) 
                  p <- t((t(p) - zoomCenter)/Scale + zoomCenter)
                if (is.null(dim(p)) && (length(p) < local.N)) 
                  if (length(p) == 1) 
                    p <- rep(p, local.N)
                  else p <- rep(0, local.N)
                p <- t(diag(c(100/control$width, 100/control$height, 
                  rep(1, local.N - 2))) %*% p - 50)
                if (!is.null(zoomPositions)) {
                  a <- zoomPositions[, 1]
                  b <- zoomPositions[, 2]
                  A <- matrix(rep(a, ifelse(is.null(dim(positions)), 
                    1, nrow(positions))), byrow = TRUE, ncol = local.N)
                  diff <- (b - a)/100
                  q <- t(diag(diff) %*% t(p + 50) + t(A))
                  return(q)
                }
                else return(p)
            }
            "replaceXY" <- function(x, y, position) {
                position[1] <- as.numeric(x)
                position[2] <- as.numeric(y)
                if (control$permitZoom) {
                  r.x <- as.numeric(tkxview(GW.top$env$canvas))
                  r.y <- as.numeric(tkyview(GW.top$env$canvas))
                  if (d.x == 0) 
                    m.x <- 0
                  else m.x <- -(r.x[1] - d.x)/d.x * min.x
                  if (d.y == 0) 
                    m.y <- 0
                  else m.y <- -(r.y[1] - d.y)/d.y * min.y
                  m <- c(m.x, m.y, rep(0, local.N - 2))
                  position <- position + m
                }
                return(position)
            }
            "callPopup" <- function(i, PopupMenu) {
                force(i)
                function(x, y) {
                  xCanvas <- as.integer(x) + as.integer(tkwinfo("rootx", 
                    canvas))
                  yCanvas <- as.integer(y) + as.integer(tkwinfo("rooty", 
                    canvas))
                  .Tcl(paste("tk_popup", .Tcl.args(PopupMenu, 
                    xCanvas, yCanvas)))
                }
            }
            "callPopupInBox" <- function(vertex, i, vertex.type, 
                UserNodePopupItems) {
                force(vertex)
                force(i)
                force(vertex.type)
                force(UserNodePopupItems)
                function(...) {
                  nodePopupMenu <- tkmenu(GW.top$env$box, tearoff = FALSE)
                  addNodePopups(vertex, i, vertex.type, nodePopupMenu, 
                    UserNodePopupItems, slave = FALSE)
                  xCanvas <- as.integer(tkwinfo("rootx", GW.top$env$box))
                  yCanvas <- as.integer(tkwinfo("rooty", GW.top$env$box))
                  .Tcl(paste("tk_popup", .Tcl.args(nodePopupMenu, 
                    xCanvas, yCanvas)))
                }
            }
            "callPopupNode" <- function(vertex, i, vertex.type, 
                UserNodePopupItems) {
                force(vertex)
                force(i)
                force(vertex.type)
                force(UserNodePopupItems)
                function(x, y) {
                  nodePopupMenu <- tkmenu(canvas, tearoff = FALSE)
                  addNodePopups(vertex, i, vertex.type, nodePopupMenu, 
                    UserNodePopupItems)
                  xCanvas <- as.integer(x) + as.integer(tkwinfo("rootx", 
                    canvas))
                  yCanvas <- as.integer(y) + as.integer(tkwinfo("rooty", 
                    canvas))
                  .Tcl(paste("tk_popup", .Tcl.args(nodePopupMenu, 
                    xCanvas, yCanvas)))
                }
            }
            "callPopupEdge" <- function(edge, i, f, t, edge.type, 
                U.Menus) {
                force(edge)
                force(i)
                force(f)
                force(t)
                force(edge.type)
                force(U.Menus)
                function(x, y) {
                  edgePopupMenu <- tkmenu(canvas, tearoff = FALSE)
                  addEdgePopups(canvas, edge, i, f, t, edgePopupMenu, 
                    U.Menus, edge.type)
                  xCanvas <- as.integer(x) + as.integer(tkwinfo("rootx", 
                    canvas))
                  yCanvas <- as.integer(y) + as.integer(tkwinfo("rooty", 
                    canvas))
                  .Tcl(paste("tk_popup", .Tcl.args(edgePopupMenu, 
                    xCanvas, yCanvas)))
                }
            }
            "getTag" <- function(text, number, setTag = TRUE) {
                tag <- paste(text, abs(number), GraphWindow@id, 
                  sep = ".")
                if (is.null(GW.tags[[1]])) 
                  GW.tags <<- list(tag)
                else if (!any(unlist(lapply(GW.tags, function(i) i == 
                  tag)))) 
                  GW.tags <<- append(list(tag), GW.tags)
                else if (setTag) 
                  message(paste("(( Duplicated tag: ", tag, " ))", 
                    sep = " "))
                if (control$saveTkReferences) 
                  assign("tags", GW.tags, envir = GW.env$env)
                return(tag)
            }
            "deleteTags" <- function(text = "deleteTags: ") {
                for (i in seq(along = GW.tags)) {
                  tkdelete(GW.top$env$canvas, GW.tags[[i]])
                }
                for (i in seq(along = GW.tags)) {
                  tag <- tkgettags(GW.top$env$canvas, i)
                  if (length(as.character(tag)) > 0) {
                    if (FALSE || control$debug.edges) {
                      print(paste(text, i, as.character(tag), 
                        sep = ": "))
                    }
                    tkdelete(GW.top$env$canvas, i)
                  }
                }
            }
            "destroyView" <- function(deleteTags = FALSE, txt = "") {
                function(...) {
                  if (deleteTags) 
                    deleteTags("destroyView")
                  updateWindow <<- FALSE
                  tkdestroy(GW.top)
                }
            }
            "sinkVertexList" <- function() {
                vertexList <<- dgm.frameModels@vertices
                for (i in seq(along = vertexList)) {
                  position <- positionsVertices[i, ]
                  position(vertexList[[i]]) <<- position
                  position <- positionsLabels[i, ]
                  labelPosition(vertexList[[i]]) <<- position
                  label(vertexList[[i]]) <<- Labels[i]
                  vertexList[[i]]@name <<- namesVertices[i]
                  color(vertexList[[i]]) <<- colorsVertices[i]
                  blockindex(vertexList[[i]]) <<- blocksVertices[i]
                  if (!.IsEmpty(blockList)) 
                    if (blocksVertices[i] == 0) 
                      stratum(vertexList[[i]]) <<- 0
                    else stratum(vertexList[[i]]) <<- strataBlocks[blocksVertices[i]]
                }
                dgm.frameModels@vertices <<- vertexList
                return(vertexList)
            }
            "sinkEdgeList" <- function() {
                dg@edgeList <<- GraphWindow@dg@edgeList
                for (i in seq(along = dg@edgeList)) {
                  position <- positionsEdgeLabels[i, ]
                  dg@edgeList[[i]]@label.position <<- position
                }
                GraphWindow@dg@edgeList <<- dg@edgeList
                return(dg@edgeList)
            }
            "sinkBlockTree" <- function(tree) {
                "subSinkBlockTree" <- function(tree) {
                  i <- abs(tree$block@index)
                  position <- positionsBlocks[i, , ]
                  position(tree$block) <<- position
                  position <- positionsBlockLabels[i, ]
                  labelPosition(tree$block) <<- position
                  tree$block@stratum <<- strataBlocks[i]
                  tree$block@label <<- blockLabels[i]
                  tree$block@closed <<- closedBlock[i]
                  tree$block@visible <<- !hiddenBlock[i]
                  if (!is.null((tree$sub.blocks))) 
                    for (j in 1:length(tree$sub.blocks)) {
                      tree$sub.blocks[[j]] <<- subSinkBlockTree(tree$sub.blocks[[j]])
                    }
                  return(tree)
                }
                if (!.IsEmpty(blockList) && !.IsEmpty(tree) && 
                  !(length(tree) == 0)) 
                  subSinkBlockTree(tree)
                return(tree)
            }
            "sinkBlockList" <- function(sinkTree = TRUE) {
                if (!.IsEmpty(blockList)) 
                  for (i in seq(along = blockList)) {
                    position <- positionsBlocks[i, , ]
                    position(blockList[[i]]) <<- position
                    position <- positionsBlockLabels[i, ]
                    labelPosition(blockList[[i]]) <<- position
                    blockList[[i]]@stratum <<- strataBlocks[i]
                    blockList[[i]]@label <<- blockLabels[i]
                    blockList[[i]]@closed <<- closedBlock[i]
                    blockList[[i]]@visible <<- !hiddenBlock[i]
                  }
                if (sinkTree && !is.null(blockTree)) 
                  sinkBlockTree(blockTree)
                if (is.null(blockList)) {
                  dgm.frameModels@blocks <<- new("dg.BlockList")
                  return(dgm.frameModels@blocks)
                }
                else {
                  dgm.frameModels@blocks <<- blockList
                  return(blockList)
                }
            }
            "sinkBlockEdges" <- function() {
                dg@blockEdgeList <<- GraphWindow@dg@blockEdgeList
                return(dg@blockEdgeList)
            }
            "sinkFactorVertexList" <- function() {
                dg@factorVertexList <<- GraphWindow@dg@factorVertexList
                for (i in seq(along = dg@factorVertexList)) {
                  position <- positionsFactorVertices[i, ]
                  position(dg@factorVertexList[[i]]) <<- position
                  position <- positionsFactorLabels[i, ]
                  labelPosition(dg@factorVertexList[[i]]) <<- position
                  label(dg@factorVertexList[[i]]) <<- factorLabels[i]
                  dg@factorVertexList[[i]]@name <<- namesFactorVertices[i]
                  color(dg@factorVertexList[[i]]) <<- colorsFactorVertices[i]
                  if (!.IsEmpty(blockList)) {
                    blockindex(dg@factorVertexList[[i]]) <<- blocksFactorVertices[i]
                    stratum(dg@factorVertexList[[i]]) <<- strataBlocks[blocksFactorVertices[i]]
                  }
                }
                GraphWindow@dg@factorVertexList <<- dg@factorVertexList
                return(dg@factorVertexList)
            }
            "sinkFactorEdgeList" <- function() {
                dg@factorEdgeList <<- GraphWindow@dg@factorEdgeList
                return(dg@factorEdgeList)
            }
            "sinkExtraVertexList" <- function() {
                dg@extraList <<- GraphWindow@dg@extraList
                for (i in seq(along = dg@extraList)) {
                  position <- positionsExtraVertices[i, ]
                  position(dg@extraList[[i]]) <<- position
                  position <- positionsExtraLabels[i, ]
                  labelPosition(dg@extraList[[i]]) <<- position
                  label(dg@extraList[[i]]) <<- extraLabels[i]
                  dg@extraList[[i]]@name <<- namesExtraVertices[i]
                  color(dg@extraList[[i]]) <<- colorsExtraVertices[i]
                  if (!.IsEmpty(blockList)) {
                    blockindex(dg@extraList[[i]]) <<- blocksExtraVertices[i]
                    stratum(dg@extraList[[i]]) <<- strataBlocks[blocksExtraVertices[i]]
                  }
                }
                GraphWindow@dg@extraList <<- dg@extraList
                return(dg@extraList)
            }
            "sinkExtraEdgeList" <- function() {
                dg@extraEdgeList <<- GraphWindow@dg@extraEdgeList
                return(dg@extraEdgeList)
            }
            "sinkView" <- function(menuItem, vertices = TRUE, 
                edges = TRUE, blocks = FALSE) {
                if (vertices && (is.null(menuItem$update.vertices) || 
                  menuItem$update.vertices)) {
                  V <- sinkVertexList()
                }
                if (edges && (is.null(menuItem$update.edges) || 
                  menuItem$update.edges)) {
                  E <- sinkEdgeList()
                  V <- sinkFactorVertexList()
                  E <- sinkFactorEdgeList()
                  V <- sinkExtraVertexList()
                  E <- sinkExtraEdgeList()
                }
                if (blocks && (is.null(menuItem$update.blocks) || 
                  menuItem$update.blocks)) 
                  B <- sinkBlockList()
                E <- sinkBlockEdges()
                if (!is.null(blockTree)) 
                  BT <- sinkBlockTree(blockTree)
                m <- dm.frameViews@index
                n <- GraphWindow@index
                dm.frameViews@graphs[[n]] <<- GraphWindow
                dgm.frameModels@models[[m]]@graphs[[n]] <<- GraphWindow
            }
            "update" <- function(type = "Arguments", ...) {
                if (type == "Arguments") 
                  sinkView(...)
                else subUpdatePositions(...)
            }
            "subSinkAllFrames" <- function(type = "Arguments", 
                ...) {
                V <- sinkVertexList()
                for (m in 1:length(dgm.frameModels@models)) {
                  title <- paste("Model:", m, sep = " ")
                  frame.view <- dgm.frameModels@models[[m]]
                  dgm.frameModels@models[[m]]@model <<- list(object)
                  for (n in 1:length(frame.view@graphs)) {
                    graph.window <- frame.view@graphs[[n]]
                    if (is.null(graph.window)) {
                      message(paste("Empty window: ", title, 
                        "; Graph:", n, sep = " "))
                    }
                    else {
                      gw.env <- .get.env.graphWindow(graphWindow = graph.window, 
                        frameViews = frame.view, frameModels = dgm.frameModels)$env
                      if (is.null(formals(gw.env$Update))) {
                        if (control$debug.update) {
                          txt <- paste("(( No update function: ", 
                            title, "; Graph:", n, graph.window@label, 
                            " ))", sep = " ")
                          message(txt)
                        }
                      }
                      else gw.env$Update(type, ...)
                    }
                  }
                }
            }
            "sinkAllFrames" <- function(type = "Arguments", txt) {
                force(type)
                force(txt)
                function(...) {
                  subSinkAllFrames(type, txt)
                }
            }
            "objectAssign" <- function(R) {
                if (!is.null(R) && !is.null(R$object)) {
                  if (!is.null(objectName)) 
                    assign(objectName, R$object, pos = 1)
                }
            }
            "setModel" <- function(R.object = NULL, dg = NULL, 
                txt = "", graphWindow = NULL, copyProperties = FALSE, 
                setUpdate = TRUE, RR = NULL) {
                if (is.null(dg)) 
                  dg <- .newDgGraphEdges(viewType = GraphWindow@dg@viewType, 
                    oriented = GraphWindow@dg@oriented, vertexList = vertexList, 
                    visibleVertices = GraphWindow@dg@visibleVertices, 
                    visibleBlocks = GraphWindow@dg@visibleBlocks, 
                    edgeList = copyCurrentEdges(edge.type = "VertexEdge", 
                      copyProperties = copyProperties), blockList = blockList, 
                    blockEdgeList = copyCurrentEdges(edge.type = "BlockEdge", 
                      copyProperties = copyProperties), factorVertexList = GraphWindow@dg@factorVertexList, 
                    factorEdgeList = copyCurrentEdges(edge.type = "FactorEdge", 
                      copyProperties = copyProperties), extraList = GraphWindow@dg@extraList, 
                    extraEdgeList = copyCurrentEdges(edge.type = "ExtraEdge", 
                      copyProperties = copyProperties))
                if (control$debug.update) {
                  print(paste("setModel:", txt))
                  print(c(updateCountModel, updateCountModelMain))
                }
                if (hasMethod("setGraphEdges", class(R.object))) {
                  # message("Using 'setGraphEdges' for your model class.")
                  object <<- setGraphEdges(R.object, dg = dg, 
                    ...)
                }
                else if (hasMethod("setGraphComponents", class(R.object))) {
                  message("Please implement 'setGraphEdges' for your model class.")
                  if (is.null(dg@edgeList)) 
                    dg@edgeList <- new("dg.VertexEdgeList")
                  object <<- setGraphComponents(R.object, viewType = dg@viewType, 
                    visibleVertices = dg@visibleVertices, visibleBlocks = dg@visibleBlocks, 
                    extraVertices = dg@extraList, vertexEdges = dg@edgeList, 
                    blockEdges = dg@blockEdgeList, factorVertices = dg@factorVertexList, 
                    factorEdges = dg@factorEdgeList, extraEdges = dg@extraEdgeList)
                }
                if (setUpdate) {
                  updateCountModelMain <<- updateCountModelMain + 
                    1
                  updateCountModel <<- updateCountModelMain
                }
            }
            "updateModel" <- function() {
                if (control$debug.update) 
                  print(paste("updateModel", getLabel()))
                if (hasMethod("returnGraphComponents", class(object)) || 
                  hasMethod("graphComponents", class(object)) || 
                  hasMethod("graphEdges", class(object))) {
                  tkconfigure(canvas, cursor = "watch")
                  tkconfigure(GW.top$env$viewLabel, text = paste(dg@viewType, 
                    " | Working !!!"))
                  tkfocus(GW.top)
                  Arguments <- Args()
                  if (hasMethod("graphEdges", class(object))) {
                    graphContent <- graphEdges(object, viewType = dg@viewType, 
                      Arguments = Arguments)
                  }
                  else {
                    message("Please implement 'graphEdges' for your model class.")
                    if (hasMethod("graphComponents", class(object))) 
                      graphContent <- graphComponents(object, 
                        viewType = dg@viewType, Arguments = Arguments)
                    else  {
                    warning("'returnGraphComponents' remove to aviod 'NOTE' by 'R CMD check'!")
                      # graphContent <- returnGraphComponents(object, 
                      #                    viewType = dg@viewType, Arguments = Arguments)
                    }
                  }
                  if ((class(graphContent) == "dg.graph") || 
                    (class(graphContent) == "dg.graphedges")) {
                    redrawView(frameModels = dgm.frameModels, 
                      frameViews = dm.frameViews, graphWindow = GraphWindow, 
                      dg = graphContent, control = control, Arguments = Arguments)
                  }
                  else {
                    message("Please return object of class 'dg.graphedges'.")
                    if (is.list(graphContent)) {
                      names <- names(graphContent)
                      checkClass <- function(name, class, z = "$", 
                        a = "graphContent", b = paste(a, z, name, 
                          sep = "")) {
                        text <- paste(c("if ((\"", name, "\" %in% names) ", 
                          "&& (class(", b, ") != \"", class, 
                          "\")) ", "{ message(paste(\"Invalid class of '", 
                          name, "' in list from 'graphComponents'; \")); ", 
                          b, " <<- new(\"", class, "\", .nullToList(", 
                          b, ")) }"), collapse = "")
                        eval(parse(text = text))
                      }
                      checkClass("extraVertices", "dg.VertexList")
                      checkClass("vertexEdges", "dg.VertexEdgeList")
                      checkClass("graphEdges", "dg.VertexEdgeList")
                      checkClass("blockEdges", "dg.BlockEdgeList")
                      checkClass("factorVertices", "dg.FactorVertexList")
                      checkClass("factorEdges", "dg.FactorEdgeList")
                      checkClass("extraEdges", "dg.ExtraEdgeList")
                    }
                    ldg <- .newDgGraphEdges(vertexList = vertexList, 
                      visibleVertices = graphContent$visibleVertices, 
                      visibleBlocks = graphContent$visibleBlocks, 
                      edgeList = graphContent$vertexEdges, blockList = blockList, 
                      blockEdgeList = graphContent$blockEdges, 
                      factorVertexList = graphContent$factorVertices, 
                      factorEdgeList = graphContent$factorEdges, 
                      extraList = graphContent$extraVertices, 
                      extraEdgeList = graphContent$extraEdges)
                    redrawView(frameModels = dgm.frameModels, 
                      frameViews = dm.frameViews, graphWindow = GraphWindow, 
                      dg = ldg, control = control, Arguments = Arguments)
                  }
                  tkconfigure(GW.top$env$viewLabel, text = dg@viewType)
                  tkconfigure(canvas, cursor = "arrow")
                }
            }
            "testUpdateModel" <- function() {
                if ((updateCountModel < updateCountModelMain)) {
                  updateModel()
                  updateCountModel <<- updateCountModelMain
                }
            }
            "extractEdgesResult" <- function(R, newEdges, from.R.edgeList = TRUE, 
                title) {
                if (!from.R.edgeList || is.null(R$edgeList)) 
                  if (is.null(R$newEdges$vertexEdges)) 
                    Edges <- newEdges$vertexEdges
                  else if (is.null(R$dg)) 
                    Edges <- R$newEdges$vertexEdges
                  else Edges <- R$dg@edgeList
                else Edges <- R$edgeList
                return(Edges)
            }
            "getEdges" <- function(edge.type = "VertexEdge") {
                if (edge.type == "VertexEdge") 
                  return(GraphWindow@dg@edgeList)
                else if (edge.type == "FactorEdge") 
                  return(GraphWindow@dg@factorEdgeList)
                else if (edge.type == "ExtraEdge") 
                  return(GraphWindow@dg@extraEdgeList)
                else if (edge.type == "BlockEdge") 
                  return(GraphWindow@dg@blockEdgeList)
                else return(NULL)
            }
            "edgesClass" <- function(edge.type = "VertexEdge") if (edge.type == 
                "VertexEdge") 
                return("dg.VertexEdgeList")
            else if (edge.type == "FactorEdge") 
                return("dg.FactorEdgeList")
            else if (edge.type == "ExtraEdge") 
                return("dg.ExtraEdgeList")
            else if (edge.type == "BlockEdge") 
                return("dg.BlockEdgeList")
            else return(NULL)
            "currentEdges" <- function(edge.type = "VertexEdge") {
                E <- getEdges(edge.type = edge.type)
                if (length(E) > 0) {
                  E <- lapply(E, function(egde) if (sum(abs(egde@vertex.indices)) > 
                    0) 
                    egde)
                  E <- .removeNull(E)
                }
                else E <- NULL
                if (!is.null(E)) {
                  class(E) <- edgesClass(edge.type = edge.type)
                }
                return(E)
            }
            "append.index.edge" <- function(e, edge.type = "VertexEdge", 
                edgeClass = NULL) {
                if (edge.type == "VertexEdge") 
                  new.edge <- returnEdgeList(list(e), vertexList, 
                    color = control$edgeColor, oriented = dg@oriented, 
                    types = edgeClass, N = local.N, edgeClasses = control$edgeClasses)
                else if (edge.type == "FactorEdge") 
                  new.edge <- returnFactorEdgeList(list(e), vertexList, 
                    color = control$factorEdgeColor, dg@factorVertexList)
                else if (edge.type == "ExtraEdge") 
                  new.edge <- returnExtraEdgeList(list(e), vertexList, 
                    color = control$extraEdgeColor, dg@extraList)
                else if (edge.type == "BlockEdge") 
                  new.edge <- new("dg.BlockEdgeList")
                if (!is.na(control$namesOnEdges) && !control$namesOnEdges) {
                  label(new.edge[[1]]) <- ""
                }
                E <- append(getEdges(edge.type = edge.type), 
                  new.edge)
                class(E) <- edgesClass(edge.type = edge.type)
                if (edge.type == "VertexEdge") 
                  GraphWindow@dg@edgeList <<- E
                else if (edge.type == "FactorEdge") 
                  GraphWindow@dg@factorEdgeList <<- E
                else if (edge.type == "ExtraEdge") 
                  GraphWindow@dg@extraEdgeList <<- E
                else if (edge.type == "BlockEdge") 
                  GraphWindow@dg@blockEdgeList <<- E
                return(E)
            }
            "append.edge" <- function(e, edge.type = "VertexEdge") {
                E <- append(getEdges(edge.type = edge.type), 
                  list(e))
                class(E) <- edgesClass(edge.type = edge.type)
                if (edge.type == "VertexEdge") 
                  GraphWindow@dg@edgeList <<- E
                else if (edge.type == "FactorEdge") 
                  GraphWindow@dg@factorEdgeList <<- E
                else if (edge.type == "ExtraEdge") 
                  GraphWindow@dg@extraEdgeList <<- E
                else if (edge.type == "BlockEdge") 
                  GraphWindow@dg@blockEdgeList <<- E
                return(E)
            }
            "selectCurrentEdges" <- function(omitEdges = FALSE, 
                edge.type = "VertexEdge") {
                E <- getEdges(edge.type = edge.type)
                if (length(E) > 0) {
                  j <- omitEdges | vertex.in.edge(0, edge.type = edge.type)
                  if (edge.type == "VertexEdge") 
                    j <- j | non.graph.edge(edge.type = edge.type)
                  E <- sapply(1:length(E), function(x) if (!j[x]) 
                    E[[x]])
                  E <- .removeNull(E)
                }
                else E <- NULL
                return(E)
            }
            "copyCurrentEdges" <- function(omitEdges = FALSE, 
                edge.type = "VertexEdge", copyProperties = FALSE) {
                E <- getEdges(edge.type = edge.type)
                if (length(E) > 0) {
                  j <- omitEdges | vertex.in.edge(0, edge.type = edge.type)
                  if (edge.type == "VertexEdge") 
                    j <- j | non.graph.edge(edge.type = edge.type)
                  edge.classes <- lapply(1:length(E), function(x) if (!j[x]) 
                    class(E[[x]]))
                  edge.classes <- .removeNull(edge.classes)
                  if (copyProperties) {
                    edge.widths <- lapply(1:length(E), function(x) if (!j[x]) 
                      width(E[[x]]))
                    edge.widths <- .removeNull(edge.widths)
                    edge.colors <- lapply(1:length(E), function(x) if (!j[x]) 
                      color(E[[x]]))
                    edge.colors <- .removeNull(edge.colors)
                    edge.dashs <- lapply(1:length(E), function(x) if (!j[x]) 
                      dash(E[[x]]))
                    edge.dashs <- .removeNull(edge.dashs)
                  }
                  if (edge.type == "BlockEdge") {
                    blockEdges <- lapply(1:length(E), function(x) if (!j[x]) 
                      E[[x]])
                    blockEdges <- .removeNull(blockEdges)
                    class(blockEdges) <- "dg.BlockEdgeList"
                  }
                  else {
                    E <- lapply(1:length(E), function(x) if (!j[x]) 
                      E[[x]]@vertex.indices)
                  }
                  E <- .removeNull(E)
                }
                else {
                  edge.classes <- NULL
                  if (copyProperties) {
                    edge.widths <- NULL
                    edge.colors <- NULL
                    edge.dashs <- NULL
                  }
                  E <- NULL
                  blockEdges <- NULL
                }
                if (edge.type == "VertexEdge") 
                  E <- returnEdgeList(E, vertexList, types = edge.classes, 
                    color = control$edgeColor, oriented = dg@oriented, 
                    N = local.N, edgeClasses = control$edgeClasses)
                else if (edge.type == "FactorEdge") 
                  E <- returnFactorEdgeList(E, vertexList, dg@factorVertexList, 
                    color = control$factorEdgeColor)
                else if (edge.type == "ExtraEdge") 
                  E <- returnExtraEdgeList(E, vertexList, dg@extraList, 
                    color = control$extraEdgeColor)
                else if (edge.type == "BlockEdge") 
                  E <- blockEdges
                if (copyProperties && !is.null(E)) {
                  Widths(E) <- unlist(edge.widths)
                  Colors(E) <- unlist(edge.colors)
                  Dashes(E) <- unlist(edge.dashs)
                }
                return(E)
            }
            "appendToCurrentEdges" <- function(omitEdges = FALSE, 
                new.edge = NULL, edge.type = "VertexEdge", edgeClass = NULL) {
                E <- getEdges(edge.type = edge.type)
                if (length(E) > 0) {
                  j <- omitEdges | vertex.in.edge(0, edge.type = edge.type)
                  if (edge.type == "VertexEdge") 
                    j <- j | non.graph.edge(edge.type = edge.type)
                  E <- lapply(1:length(E), function(x) if (!j[x]) 
                    E[[x]])
                  E <- .removeNull(E)
                  edge.list <- lapply(E, function(e) e@vertex.indices)
                  edge.classes <- lapply(E, function(e) class(e))
                  if (!is.null(new.edge)) {
                    edge.list <- append(edge.list, new.edge)
                    edge.classes <- append(edge.classes, edgeClass)
                  }
                }
                else {
                  edge.classes <- edgeClass
                  edge.list <- new.edge
                }
                if (edge.type == "VertexEdge") 
                  E <- returnEdgeList(edge.list, vertexList, 
                    types = edge.classes, color = control$edgeColor, 
                    oriented = dg@oriented, N = local.N, edgeClasses = control$edgeClasses)
                else if (edge.type == "FactorEdge") 
                  E <- NULL
                else if (edge.type == "ExtraEdge") 
                  E <- NULL
                else if (edge.type == "BlockEdge") 
                  E <- NULL
                return(E)
            }
            "which.unordered.edge" <- function(e, edge.type = "VertexEdge") {
                n <- length(e)
                unlist(lapply(getEdges(edge.type = edge.type), 
                  function(i) length(e[!is.na(match(e, i@vertex.indices))]) == 
                    n))
            }
            "which.edge" <- function(e, edge.type = "VertexEdge") unlist(lapply(getEdges(edge.type = edge.type), 
                function(i) all(i@vertex.indices == e)))
            "vertex.in.edge" <- function(e, edge.type = "VertexEdge") unlist(lapply(getEdges(edge.type = edge.type), 
                function(i) is.element(e, i@vertex.indices)))
            "non.graph.edge" <- function(edge.type = "VertexEdge") unlist(lapply(getEdges(edge.type = edge.type), 
                function(i) any(i@vertex.indices <= 0)))
            "edge.vertices" <- function(i, type.negative = "Factor", 
                edge.type = "VertexEdge") {
                E <- getEdges(edge.type = edge.type)
                edge <- E[[i]]@vertex.indices
                edge.vertices <- vector("list", length(edge))
                for (j in seq(along = edge)) if (edge[j] > 0) 
                  edge.vertices[[j]] <- vertexList[[edge[j]]]
                else if (type.negative == "Factor") 
                  edge.vertices[[j]] <- dg@factorVertexList[[-edge[j]]]
                else if (type.negative == "Extra") 
                  edge.vertices[[j]] <- dg@extraList[[-edge[j]]]
                else if (type.negative == "ClosedBlock") 
                  edge.vertices[[j]] <- blockList[[-edge[j]]]
                return(edge.vertices)
            }
            "edge.negative.type" <- function(edge.type = "VertexEdge") if (edge.type == 
                "VertexEdge") 
                return("Vertex")
            else if (edge.type == "FactorEdge") 
                return("Factor")
            else if (edge.type == "ExtraEdge") 
                return("Extra")
            else if (edge.type == "BlockEdge") 
                return("ClosedBlock")
            "edge.names" <- function(i, type.negative = edge.negative.type(edge.type), 
                edge.type = "VertexEdge") lapply(edge.vertices(i, 
                type.negative = type.negative, edge.type = edge.type), 
                function(v) retVertexName(v@index, vertex.type = ifelse(v@index > 
                  0, "Vertex", type.negative)))
            "edge.positions" <- function(i, type.negative = edge.negative.type(edge.type), 
                edge.type = "VertexEdge") {
                lapply(edge.vertices(i, type.negative = type.negative, 
                  edge.type = edge.type), function(v) retVertexPos(v@index, 
                  ifelse(v@index > 0, "Vertex", type.negative)))
            }
            "edge.strata" <- function(i, type.negative = edge.negative.type(edge.type), 
                edge.type = "VertexEdge") {
                lapply(edge.vertices(i, type.negative = type.negative, 
                  edge.type = edge.type), function(v) retStratum(v@index, 
                  vertex.type = ifelse(v@index > 0, "Vertex", 
                    type.negative)))
            }
            "clearEdge" <- function(i, edge.type = "VertexEdge") if (edge.type == 
                "VertexEdge") 
                GraphWindow@dg@edgeList[[i]]@vertex.indices <<- c(0, 
                  0)
            else if (edge.type == "FactorEdge") 
                GraphWindow@dg@factorEdgeList[[i]]@vertex.indices <<- c(0, 
                  0)
            else if (edge.type == "ExtraEdge") 
                GraphWindow@dg@extraEdgeList[[i]]@vertex.indices <<- c(0, 
                  0)
            else if (edge.type == "BlockEdge") 
                GraphWindow@dg@blockEdgeList[[i]]@vertex.indices <<- c(0, 
                  0)
            "from" <- function(i, edge.type = "VertexEdge") getEdges(edge.type = edge.type)[[i]]@vertex.indices[1]
            "to" <- function(i, edge.type = "VertexEdge") getEdges(edge.type = edge.type)[[i]]@vertex.indices[2]
            transformation <- control$transformation
            "setTransformation" <- function(value = NULL) {
                if (is.null(value) == (!is.null(transformation))) {
                  if (!.IsEmpty(blockList)) 
                    for (i in seq(along = blockList)) if ((closedBlock[i] || 
                      hiddenBlock[i])) {
                    }
                    else deleteBlock(i)
                  transformation <<- value
                  if (!.IsEmpty(blockList)) 
                    for (i in seq(along = blockList)) if ((closedBlock[i] || 
                      hiddenBlock[i])) {
                    }
                    else if (is.element(i, dg@visibleBlocks)) 
                      drawBlock(blockList[[i]], i, setTag = FALSE)
                }
                else transformation <<- value
                subUpdateGraphWindow("setTransformation", all.blockframes = TRUE)
            }
            "angle" <- function(value = NULL) if (!is.null(value)) 
                Angle <<- value
            else return(Angle)
            "project" <- function(position) if (!is.null(transformation)) 
                t(transformation %*% .asRow(position))
            else position
            "inversProject" <- function(position) if (!is.null(transformation)) 
                t(solve(transformation, .asRow(position)))
            else position
            "applyTransformation" <- function(trans, draw.box = FALSE, 
                redraw = TRUE) {
                if (!is.null(transformation)) {
                  transformation <<- transformation %*% trans
                  if (redraw) 
                    subUpdateGraphWindow("applyTransformation", 
                      all.blockframes = TRUE)
                }
            }
            "sphereRand" <- function(n) {
                nx2 <- 2
                while ((nx2 >= 1)) {
                  x <- 2 * runif(n) - 1
                  nx2 <- sum(x^2)
                }
                return(x/sqrt(nx2))
            }
            "makeRotation" <- function(x, y, alpha = 0, use.alpha = FALSE, 
                n = length(x)) {
                if (length(x) != length(y) || !is.null(dim(x)) || 
                  !is.null(dim(y))) 
                  stop("Invalid arguments")
                "dnrm2" <- function(x) sqrt(sum(x^2))
                rot <- diag(1, n)
                nx <- dnrm2(x)
                ny <- dnrm2(y)
                if ((nx == 0) || (ny == 0)) 
                  return(rot)
                x <- x * (1/nx)
                y <- y * (1/ny)
                xy <- t(x) %*% y
                c <- ifelse(use.alpha, cos(alpha), xy)
                cc <- 1 - c^2
                s <- ifelse(use.alpha, sin(alpha), ifelse(cc > 
                  0, sqrt(cc), 0))
                cm1 <- c - 1
                y <- y - xy * x
                ny <- dnrm2(y)
                if (ny == 0) 
                  return(rot)
                y <- y * (1/ny)
                a <- x * cm1 + y * s
                b <- -x * s + y * cm1
                rot <- rot + a %*% t(x) + b %*% t(y)
                return(rot)
            }
            "canvasToSphere" <- function(X) {
                rad <- 100
                pos <- inversCanvasRelativePosition(X)
                x <- pos[1]
                y <- pos[2]
                norm.2 <- x^2 + y^2
                rad.2 <- rad^2
                z <- sqrt(max(rad.2 - norm.2, 0))
                if (local.N > 2) 
                  res <- c(x, y, z, rep(0, local.N - 3))
                else res <- c(x, y)
                if (norm.2 < rad.2) 
                  return(res)
                else {
                  r <- sqrt(norm.2/rad.2)
                  return(res/r)
                }
            }
            "doHandRotate" <- function() {
                p <- NULL
                function(x, y) {
                  tkconfigure(canvas, cursor = "watch")
                  tkfocus(canvas)
                  X <- replaceXY(x, y, rep(50, local.N))
                  if (is.null(p)) 
                    p <<- canvasToSphere(X)
                  else {
                    oldp <- p
                    p <<- canvasToSphere(X)
                    applyTransformation(makeRotation(oldp, p), 
                      draw.box = FALSE, redraw = TRUE)
                    tkconfigure(canvas, cursor = "arrow")
                  }
                }
            }
            "rockPlot" <- function(k = 2) {
                function(x, y) {
                  tkconfigure(canvas, cursor = "watch")
                  tkfocus(GW.top)
                  print("rockPlot")
                  angle <- 10
                  p1 <- sphereRand(control$N) # 'N' ???
                  p2 <- sphereRand(control$N) # 'N' ???
                  for (i in 1:k) applyTransformation(makeRotation(p1, 
                    p2, alpha = angle, use.alpha = TRUE), draw.box = FALSE, 
                    redraw = TRUE)
                  for (i in 1:(2 * k)) applyTransformation(makeRotation(p1, 
                    p2, alpha = -angle, use.alpha = TRUE), draw.box = FALSE, 
                    redraw = TRUE)
                  for (i in 1:k) applyTransformation(makeRotation(p1, 
                    p2, alpha = angle, use.alpha = TRUE), draw.box = FALSE, 
                    redraw = TRUE)
                  print("Finished rocking!")
                  tkconfigure(canvas, cursor = "arrow")
                }
            }
            "keyRotate" <- function(v = 0, sign = 1) {
                force(v)
                force(sign)
                function(...) {
                  if ((v > 2) || (local.N > 2)) {
                    v1 <- ifelse(v == 1, 2, 1)
                    v2 <- ifelse(v == 3, 2, 3)
                    if (is.null(transformation)) 
                      X <- diag(local.N)
                    else X <- transformation
                    angle <- pi/16
                    applyTransformation(makeRotation((X[, v1]), 
                      (X[, v2]), alpha = ifelse(sign == 1, angle, 
                        -angle), use.alpha = TRUE), draw.box = FALSE, 
                      redraw = TRUE)
                  }
                }
            }
            "vertexItem" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                if (vertex.type == "ClosedBlock") 
                  return(itemsClosedBlocks[[i]])
                else if (vertex.type == "Vertex") 
                  return(itemsVertices[[i]])
                else if (vertex.type == "Factor") 
                  return(itemsFactors[[-i]])
                else if (vertex.type == "Extra") 
                  return(itemsExtras[[abs(i)]])
            }
            "setVertexItem" <- function(i, value, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                if (vertex.type == "ClosedBlock") 
                  itemsClosedBlocks[[i]] <<- value
                else if (vertex.type == "Vertex") 
                  itemsVertices[[i]] <<- value
                else if (vertex.type == "Factor") 
                  itemsFactors[[abs(i)]] <<- value
                else if (vertex.type == "Extra") 
                  itemsExtras[[i]] <<- value
            }
            "edgeItem" <- function(i, edge.type = "VertexEdge") {
                if (i > 0) 
                  return(itemsEdges[[i]])
                else if (edge.type == "BlockEdge") {
                  if (is.element(abs(i), dg@visibleBlocks)) 
                    return(itemsBlockEdges[[-i]])
                  else return(NULL)
                }
                else if (edge.type == "FactorEdge") 
                  return(itemsFactorEdges[[-i]])
                else return(itemsExtraEdges[[-i]])
            }
            "subSetEdgeItem" <- function(from, edge.type, i, 
                edgeNode) {
                if (from > 0) {
                  itemsEdges[[from]][[i]] <<- edgeNode
                }
                else if (edge.type == "BlockEdge") {
                  if (is.element(abs(i), dg@visibleBlocks)) 
                    itemsBlockEdges[[-from]][[i]] <<- edgeNode
                  else NULL
                }
                else if (edge.type == "FactorEdge") 
                  itemsFactorEdges[[-from]][[i]] <<- edgeNode
                else itemsExtraEdges[[-from]][[i]] <<- edgeNode
            }
            "reinsertEdgeItem" <- function(edgeNode, from, to, 
                nr, edge.type = "VertexEdge") {
                edges <- edgeItem(from, edge.type = edge.type)
                if (length(edges) > 0) 
                  for (i in seq(along = edges)) {
                    e <- edges[[i]]
                    if (!(is.null(e))) 
                      if ((e$nr == nr) && (e$type == edge.type)) 
                        if (e$to == to) {
                          subSetEdgeItem(from, edge.type, i, 
                            edgeNode)
                        }
                  }
            }
            "setEdgeItem" <- function(i, edge.type = "VertexEdge", 
                edges = NULL) {
                if (i > 0) 
                  itemsEdges[[i]] <<- edges
                else if (edge.type == "BlockEdge") {
                  itemsBlockEdges[[-i]] <<- edges
                }
                else if (edge.type == "FactorEdge") 
                  itemsFactorEdges[[-i]] <<- edges
                else itemsExtraEdges[[-i]] <<- edges
            }
            "openBlockItem" <- function(i) return(itemsOpenBlocks[[i]])
            "setOpenBlockItem" <- function(i, blocks) itemsOpenBlocks[[i]] <<- blocks
            "closedBlockItem" <- function(i) {
                return(itemsClosedBlocks[[i]])
            }
            "setCloseVertex" <- function(i, value, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) if (vertex.type == "Vertex") {
                closedVertex[i] <<- value
                if (value) {
                  tkdelete(canvas, vertexItem(i)$tag)
                  updateBlockEdges()
                  updateCountBlockEdges <<- updateCountBlockEdgesMain
                }
                else {
                  vertexColor <- retVertexColor(i, vertex.type)
                  drawVertex(i, w = control$w, vertexcolor = control$vertexColor, 
                    vertex.type = "Vertex")
                  setVertexColor(i, color = vertexColor, vertex.type = vertex.type)
                }
            }
            "setClosedBlock" <- function(i, value, update = TRUE) {
                if (i > 0) {
                  closedBlock[i] <<- value
                  if (all(is.na(positionsClosedBlocks[i, ]))) 
                    positionsClosedBlocks[i, ] <<- apply(positionsBlocks[i, 
                      , ], 1, mean)
                  if (value) 
                    tkdelete(canvas, openBlockItem(i)$tag)
                  else tkdelete(canvas, closedBlockItem(i)$tag)
                  if (update) 
                    if ((updateCountBlockEdges < updateCountBlockEdgesMain)) {
                      updateBlockEdges()
                      updateCountBlockEdges <<- updateCountBlockEdgesMain
                    }
                }
            }
            "isInClosedBlock" <- function(i) {
                a <- blockList[[i]]@ancestors
                result <- FALSE
                if (length(a) > 1) {
                  a <- a[a != 0]
                  result <- any(closedBlock[a])
                }
                return(result)
            }
            "setHiddenBlock" <- function(i, value, update = TRUE) {
                if (i > 0) {
                  hiddenBlock[i] <<- value
                  if (value) {
                    if (all(is.na(positionsClosedBlocks[i, ]))) 
                      positionsClosedBlocks[i, ] <<- apply(positionsBlocks[i, 
                        , ], 1, mean)
                    if (closedBlock[i]) 
                      tkdelete(canvas, closedBlockItem(i)$tag)
                    else tkdelete(canvas, openBlockItem(i)$tag)
                  }
                }
            }
            "retStratum" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                "strata" <- function(i) if (i > 0) 
                  strataBlocks[i]
                else i
                if (vertex.type == "ClosedBlock") 
                  strataBlocks[abs(i)]
                else if (vertex.type == "Vertex") {
                  if (.IsEmpty(blockList)) 
                    strataVertices[i]
                  else if (blocksVertices[i] == 0) 
                    return(0)
                  else strata(blocksVertices[i])
                }
                else if (vertex.type == "Factor") {
                  if (.IsEmpty(blockList)) 
                    strataFactorVertices[-i]
                  else strata(blocksFactorVertices[-i])
                }
                else if (vertex.type == "Extra") {
                  if (.IsEmpty(blockList)) 
                    strataExtraVertices[abs(i)]
                  else strata(blocksExtraVertices[i])
                }
            }
            "retBlockIndex" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                if (vertex.type == "ClosedBlock") 
                  abs(i)
                else if (vertex.type == "Vertex") 
                  blocksVertices[i]
                else if (vertex.type == "Factor") 
                  blocksFactorVertices[-i]
                else if (vertex.type == "Extra") 
                  blocksExtraVertices[i]
            }
            "setBlockIndex" <- function(i, value, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                update <- FALSE
                if (permit.update.block.index) {
                  if (vertex.type == "Vertex") {
                    blocksVertices[i] <<- value
                    b <- closedBlock[value] || hiddenBlock[value]
                    if ((value > 0) && (b != closedVertex[i])) {
                      if (!(control$constrained || constrainedVertices[i])) {
                        if (b %in% dg@visibleBlocks) 
                          setCloseVertex(i, !closedVertex[i], 
                            vertex.type)
                        if (!closedVertex[i]) {
                          pos <- retVertexPos(i, vertex.type)
                          moveEdgesToVertex(pos, i, edge.type = "VertexEdge")
                        }
                      }
                      update <- TRUE
                    }
                  }
                  else if (vertex.type == "Factor") 
                    blocksFactorVertices[-i] <<- value
                  else if (vertex.type == "Extra") 
                    blocksExtraVertices[i] <<- value
                }
                return(update)
            }
            "updateVertexInBlock" <- function(i, k, visibleBefore, 
                visibleAfter) {
                if (TRUE) {
                  child <- namesVertices[i]
                  if (!visibleBefore) 
                    child <- tdv(child)
                  if (k == 0) 
                    parent = "root"
                  else {
                    parent <- blockLabels[k]
                    parent <- ubl(label = parent, index = k)
                  }
                  tkdelete(GW.top$env$box, child)
                  m <- 0
                  if (control$debug.strata) 
                    print(c(i, k))
                  for (j in seq(along = vertexList)) {
                    vertex <- vertexList[[j]]
                    stratum <- retStratum(j, vertex.type = "Vertex")
                    if (control$debug.strata && FALSE) {
                      STRATUM <- stratum(vertex)
                      a <- ""
                      if (stratum != STRATUM) 
                        a <- "%"
                      b <- ""
                      if (j != index(vertex)) 
                        b <- "#"
                      print(paste(c(a, b, name(vertex), index(vertex), 
                        as.numeric(stratum), names(STRATUM), 
                        as.numeric(STRATUM)), collapse = ", "))
                    }
                    if ((stratum == k) && (index(vertex) < i)) {
                      m <- m + 1
                      if (control$debug.strata) 
                        print(m)
                    }
                  }
                  child <- namesVertices[i]
                  fill <- "ForestGreen"
                  if (!visibleAfter) {
                    child <- tdv(child)
                    fill <- "LimeGreen"
                  }
                  tkinsert(GW.top$env$box, m, parent, child, 
                    text = child, fill = fill)
                }
            }
            "updateVertexBlockIndex" <- function(position, i) {
                currentIndex <- retBlockIndex(i, vertex.type = "Vertex")
                update <- FALSE
                if (permit.update.block.index) {
                  if (!.IsEmpty(blockList)) {
                    k <- 0
                    for (j in seq(along = blockList)) if (inBlock(position, 
                      j)) {
                      k <- j
                    }
                    change <- setBlockIndex(i, k, vertex.type = "Vertex")
                    update <- update || change
                  }
                }
                update <- update || (currentIndex != retBlockIndex(i, 
                  vertex.type = "Vertex"))
                if (control$variableFrame && update) {
                  if ((get("type", GW.top$env$box$env) == "variableList")) {
                  }
                  else {
                    v <- is.element(i, dg@visibleVertices)
                    updateVertexInBlock(i, k, visibleBefore = v, 
                      visibleAfter = v)
                  }
                }
                return(update)
            }
            "updateAllBlockIndices" <- function() {
                updateEdges <- FALSE
                if (permit.update.block.index) {
                  if (!is.null(vertexList)) 
                    for (i in seq(along = vertexList)) {
                      update <- updateVertexBlockIndex(positionsVertices[i, 
                        ], i)
                      updateEdges <- updateEdges || update
                    }
                  if (updateEdges) {
                    setUpdateBlockEdges("updateAllBlockIndices")
                  }
                }
                return(updateEdges)
            }
            "findMove" <- function(position, dxy = rep(0, local.N)) {
                return(inversProject(inversCanvasPosition(positionsCanvas(project(position)) + 
                  dxy)))
            }
            "findDifference" <- function(p1, p2) {
                return(relativePositionsCanvas(project(inversProject(inversCanvasPosition(p1)) - 
                  inversProject(inversCanvasPosition(p2)))))
            }
            "retVertexPos" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                if (vertex.type == "ClosedBlock") 
                  position <- positionsClosedBlocks[abs(i), ]
                else if (vertex.type == "Vertex") {
                  if (closedVertex[i]) 
                    position <- positionsClosedBlocks[blockReferences[retBlockIndex(i, 
                      vertex.type)], ]
                  else position <- positionsVertices[i, ]
                }
                else if (vertex.type == "Factor") 
                  position <- positionsFactorVertices[-i, ]
                else if (vertex.type == "Extra") 
                  position <- positionsExtraVertices[abs(i), 
                    ]
                return(positionsCanvas(project(position)))
            }
            "setVertexPos" <- function(i, xy, dxy = rep(0, local.N), 
                vertex.type = ifelse(i > 0, "Vertex", "Factor")) {
                ok <- TRUE
                position <- inversProject(inversCanvasPosition(xy))
                if (vertex.type == "ClosedBlock") 
                  positionsClosedBlocks[i, ] <<- position
                else if (vertex.type == "Vertex") {
                  old.position <- positionsVertices[i, ]
                  old.labelposition <- positionsLabels[i, ]
                  positionsVertices[i, ] <<- position
                  positionsLabels[i, ] <<- findMove(positionsLabels[i, 
                    ], dxy)
                  if (permit.update.block.index) {
                    if (updateVertexBlockIndex(position, i)) {
                      if (control$constrained || constrainedVertices[i]) {
                        positionsVertices[i, ] <<- old.position
                        positionsLabels[i, ] <<- old.labelposition
                        updateVertexBlockIndex(old.position, 
                          i)
                        ok <- FALSE
                      }
                      else setUpdateBlockEdges("setVertexPos")
                    }
                  }
                }
                else if (vertex.type == "Factor") {
                  positionsFactorVertices[-i, ] <<- position
                  positionsFactorLabels[-i, ] <<- findMove(positionsFactorLabels[-i, 
                    ], dxy)
                }
                else if (vertex.type == "Extra") {
                  positionsExtraVertices[abs(i), ] <<- position
                  positionsExtraLabels[abs(i), ] <<- findMove(positionsExtraLabels[abs(i), 
                    ], dxy)
                }
                return(ok)
            }
            "changeVertexPos" <- function(i, dxy = rep(0, local.N), 
                vertex.type = ifelse(i > 0, "Vertex", "Factor")) {
                ok <- TRUE
                if (vertex.type == "Vertex") {
                  old.position <- positionsVertices[i, ]
                  old.labelposition <- positionsLabels[i, ]
                  position <- findMove(positionsVertices[i, ], 
                    dxy)
                  positionsVertices[i, ] <<- position
                  positionsLabels[i, ] <<- findMove(positionsLabels[i, 
                    ], dxy)
                  if (updateVertexBlockIndex(position, i)) {
                    if (control$constrained || constrainedVertices[i]) {
                      positionsVertices[i, ] <<- old.position
                      positionsLabels[i, ] <<- old.labelposition
                      updateVertexBlockIndex(old.position, i)
                      ok <- FALSE
                    }
                  }
                }
                else if (vertex.type == "Factor") {
                  positionsFactorVertices[-i, ] <<- findMove(positionsFactorVertices[-i, 
                    ], dxy)
                  positionsFactorLabels[-i, ] <<- findMove(positionsFactorLabels[-i, 
                    ], dxy)
                }
                else if (vertex.type == "Extra") {
                  positionsExtraVertices[i, ] <<- findMove(positionsExtraVertices[i, 
                    ], dxy)
                  positionsExtraLabels[i, ] <<- findMove(positionsExtraLabels[i, 
                    ], dxy)
                }
                return(ok)
            }
            "retVertexName" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) if (vertex.type == "OpenBlock") 
                blockLabels[i]
            else if (vertex.type == "ClosedBlock") 
                blockLabels[abs(i)]
            else if (vertex.type == "Vertex") 
                namesVertices[i]
            else if (vertex.type == "Factor") 
                namesFactorVertices[-i]
            else if (vertex.type == "Extra") 
                extraLabels[abs(i)]
            "selectedNodesMatrix" <- function() {
                if (length(selectedNodes) > 0) {
                  r <- data.frame(index = unlist(lapply(selectedNodes, 
                    function(k) k$index)), hit = unlist(lapply(selectedNodes, 
                    function(k) k$hit.type)), type = unlist(lapply(selectedNodes, 
                    function(k) k$node.type)))
                  r
                }
            }
            "selectedEdgesMatrix" <- function() {
                if (length(selectedEdges) > 0) {
                  data.frame(index = unlist(lapply(selectedEdges, 
                    function(k) k$index)), from = unlist(lapply(selectedEdges, 
                    function(k) k$from)), to = unlist(lapply(selectedEdges, 
                    function(k) k$to)), hit = unlist(lapply(selectedEdges, 
                    function(k) k$hit.type)), type = unlist(lapply(selectedEdges, 
                    function(k) k$edge.type)))
                }
            }
            "retVertexColor" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                if (length(selectedNodes) > 0) {
                  x <- lapply(selectedNodes, function(k) ((i == 
                    k$index) && ("none" != k$hit.type) && (vertex.type == 
                    k$node.type)))
                  if (any(unlist(x))) 
                    return("YellowGreen")
                }
                if (vertex.type == "ClosedBlock") 
                  color(blockList[[i]])
                else if (vertex.type == "Vertex") 
                  colorsVertices[i]
                else if (vertex.type == "Factor") 
                  colorsFactorVertices[-i]
                else if (vertex.type == "Extra") 
                  colorsExtraVertices[abs(i)]
            }
            "setEdgeColor" <- function(i = 0, edge.type = "VertexEdge", 
                color = NULL) {
                activefill <- "LimeGreen"
                if (is.null(color)) 
                  activefill <- "DarkSlateGray"
                "f" <- function(x) if (is.null(x)) 
                  "NULL"
                else x
                E <- getEdges(edge.type = edge.type)[[i]]
                if (is.null(color)) 
                  color <- E@color
                "setEdge" <- function(k, edges) {
                  if (k != 0) {
                    edges <- edgeItem(k, edge.type = edge.type)
                    if (length(edges) > 0) 
                      for (e in edges) if (!(is.null(e))) 
                        if ((e$nr == i) && (e$type == edge.type)) 
                          if (e$to > k) {
                            for (l in 1:length(e$edges)) tkitemconfigure(canvas, 
                              e$edges[[l]], fill = color, activefill = activefill)
                            for (l in 1:length(e$tags)) tkitemconfigure(canvas, 
                              e$tags[[l]], fill = color, activefill = activefill)
                          }
                  }
                }
                for (j in E@vertex.indices) setEdge(j, edgeItem(j, 
                  edge.type = edge.type))
            }
            "setEdgeDash" <- function(i = 0, edge.type = "VertexEdge", 
                dash = NULL) {
                "f" <- function(x) if (is.null(x)) 
                  "NULL"
                else x
                E <- getEdges(edge.type = edge.type)[[i]]
                if (is.null(color)) 
                  color <- E@color
                "setEdge" <- function(k, edges) {
                  if (k != 0) {
                    edges <- edgeItem(k, edge.type = edge.type)
                    if (length(edges) > 0) 
                      for (e in edges) if (!(is.null(e))) 
                        if ((e$nr == i) && (e$type == edge.type)) 
                          if (e$to > k) {
                            for (l in 1:length(e$edges)) tkitemconfigure(canvas, 
                              e$edges[[l]], dash = dash)
                            for (l in 1:length(e$tags)) tkitemconfigure(canvas, 
                              e$tags[[l]], dash = dash)
                          }
                  }
                }
                for (j in E@vertex.indices) setEdge(j, edgeItem(j, 
                  edge.type = edge.type))
            }
            "setVertexColor" <- function(i, color = retVertexColor(i, 
                vertex.type), vertex.type = ifelse(i > 0, "Vertex", 
                "Factor"), permanent = FALSE) {
                if (!(length(color) == 1)) {
                  print(color)
                  print(i)
                }
                if (color == "cyan") 
                  activefill <- "DarkCyan"
                else activefill <- "LimeGreen"
                if (color == retVertexColor(i, vertex.type)) 
                  activefill <- "IndianRed"
                items <- vertexItem(i, vertex.type)$dot$dynamic
                if (!is.null(items)) 
                  if (length(items) > 0) 
                    for (k in seq(length(items))) tkitemconfigure(canvas, 
                      items[[k]], fill = color[[1]], activefill = activefill)
                if (permanent) {
                  if (vertex.type == "ClosedBlock") 
                    color(blockList[[i]]) <<- color
                  else if (vertex.type == "Vertex") 
                    colorsVertices[i] <<- color
                  else if (vertex.type == "Factor") 
                    colorsFactorVertices[abs(i)] <<- color
                  else if (vertex.type == "Extra") 
                    colorsExtraVertices[abs(i)] <<- color
                }
            }
            "retVertexLabel" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) if (control$useNamesForLabels) {
                if ((vertex.type == "OpenBlock") || (vertex.type == 
                  "ClosedBlock")) 
                  blockLabels[i]
                else if (vertex.type == "Vertex") 
                  namesVertices[i]
                else if (vertex.type == "Factor") 
                  namesFactorVertices[-i]
                else if (vertex.type == "Extra") 
                  namesExtraVertices[i]
            }
            else {
                if ((vertex.type == "OpenBlock") || (vertex.type == 
                  "ClosedBlock")) 
                  blockLabels[i]
                else if (vertex.type == "Vertex") 
                  Labels[i]
                else if (vertex.type == "Factor") 
                  factorLabels[-i]
                else if (vertex.type == "Extra") 
                  extraLabels[i]
            }
            "setVertexLabel" <- function(i, label, vertex.type) {
                if (vertex.type == "ClosedBlock") {
                  blockLabels[i] <<- label
                  tkitemconfigure(canvas, itemsClosedBlocks[[i]]$l, 
                    text = label)
                }
                else if (vertex.type == "Vertex") {
                  Labels[i] <<- label
                  tkitemconfigure(canvas, itemsVertices[[i]]$l, 
                    text = label)
                }
                else if (vertex.type == "Factor") {
                  factorLabels[-i] <<- label
                  tkitemconfigure(canvas, itemsFactors[[-i]]$l, 
                    text = label)
                }
                else if (vertex.type == "Extra") {
                  extraLabels[i] <<- label
                  tkitemconfigure(canvas, itemsExtras[[i]]$l, 
                    text = label)
                }
            }
            "retLabelPos" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                if (vertex.type == "ClosedBlock") 
                  position <- positionsBlockLabels[i, ]
                else if (vertex.type == "Vertex") 
                  position <- positionsLabels[i, ]
                else if (vertex.type == "Factor") 
                  position <- positionsFactorLabels[-i, ]
                else if (vertex.type == "Extra") 
                  position <- positionsExtraLabels[i, ]
                positionsCanvas(project(position))
            }
            "setLabelPos" <- function(i, xy, dxy = rep(0, local.N), 
                vertex.type = ifelse(i > 0, "Vertex", "Factor")) if (vertex.type == 
                "ClosedBlock") {
                positionsBlockLabels[i, ] <<- positionsBlockLabels[i, 
                  ] + inversCanvasRelativePosition(dxy)
            }
            else if (vertex.type == "Vertex") 
                positionsLabels[i, ] <<- findMove(positionsLabels[i, 
                  ], dxy)
            else if (vertex.type == "Factor") 
                positionsFactorLabels[-i, ] <<- findMove(positionsFactorLabels[-i, 
                  ], dxy)
            else if (vertex.type == "Extra") 
                positionsExtraLabels[i, ] <<- findMove(positionsExtraLabels[i, 
                  ], dxy)
            "retEdgeLabelPos" <- function(label.number, f = 0, 
                t = 0) relativePositionsCanvas(positionsEdgeLabels[label.number, 
                ])
            "setEdgeLabelPos" <- function(edgeNode, label.number, 
                xy, dxy = rep(0, local.N), f = 0, t = edgeNode$to, 
                edge.type = edgeNode$type) {
                positionsEdgeLabels[label.number, ] <<- positionsEdgeLabels[label.number, 
                  ] + inversCanvasRelativePosition(dxy)
                E <- getEdges(edge.type = edge.type)
                labelPosition(E[[edgeNode$nr]]) <- positionsEdgeLabels[label.number, 
                  ]
            }
            "setEdgeLabel" <- function(edgeNode, label = "", 
                i = edgeNode$label.number, f = 0, t = edgeNode$to, 
                edge.type = edgeNode$type, permanent = TRUE) {
                if (control$debug.strata && (label != " ")) {
                  text <- paste(paste(i, paste(f, t, sep = "-"), 
                    sep = "<"), label, sep = ">")
                  tkitemconfigure(canvas, edgeNode$label, text = text)
                  tkitemconfigure(canvas, edgeNode$label, fill = myColor(i + 
                    2))
                }
                else tkitemconfigure(canvas, edgeNode$label, 
                  text = label)
                if (permanent) {
                  if (edgeNode$type == "VertexEdge") 
                    label(GraphWindow@dg@edgeList[[edgeNode$nr]]) <<- label
                  else if (edgeNode$type == "FactorEdge") 
                    label(GraphWindow@dg@factorEdgeList[[edgeNode$nr]]) <<- label
                  else if (edgeNode$type == "ExtraEdge") 
                    label(GraphWindow@dg@extraEdgeList[[edgeNode$nr]]) <<- label
                  else if (edgeNode$type == "BlockEdge") 
                    label(GraphWindow@dg@blockEdgeList[[edgeNode$nr]]) <<- label
                }
            }
            "retEdgeLabel" <- function(edgeNode, i, f, t, edge.type = "VertexEdge") {
                if (is.na(control$namesOnEdges)) 
                  label <- ""
                else if (edgeNode$type == "VertexEdge") 
                  label(GraphWindow@dg@edgeList[[edgeNode$nr]])
                else if (edgeNode$type == "FactorEdge") 
                  label(GraphWindow@dg@factorEdgeList[[edgeNode$nr]])
                else if (edgeNode$type == "ExtraEdge") 
                  label(GraphWindow@dg@extraEdgeList[[edgeNode$nr]])
                else if (edgeNode$type == "BlockEdge") 
                  label(GraphWindow@dg@blockEdgeList[[edgeNode$nr]])
            }
            "setEdgeWidth" <- function(edgeNode, width = 1, i = edgeNode$label.number, 
                f = 0, t = edgeNode$to, edge.type = edgeNode$type) {
                for (l in 1:length(edgeNode$edges)) tkitemconfigure(canvas, 
                  edgeNode$edges[[l]], width = width)
                if (edgeNode$type == "VertexEdge") 
                  width(GraphWindow@dg@edgeList[[edgeNode$nr]]) <<- width
                else if (edgeNode$type == "FactorEdge") 
                  width(GraphWindow@dg@factorEdgeList[[edgeNode$nr]]) <<- width
                else if (edgeNode$type == "ExtraEdge") 
                  width(GraphWindow@dg@extraEdgeList[[edgeNode$nr]]) <<- width
                else if (edgeNode$type == "BlockEdge") 
                  width(GraphWindow@dg@blockEdgeList[[edgeNode$nr]]) <<- width
            }
            "vertexTypeOfEdge" <- function(index, edge.type = "VertexEdge", 
                edgeObject = NULL) if (edge.type == "factorBlockEdge") 
                ifelse(index > 0, "Factor", "ClosedBlock")
            else ifelse(index > 0, "Vertex", ifelse(edge.type == 
                "FactorEdge", "Factor", ifelse(edge.type == "ExtraEdge", 
                "Extra", "ClosedBlock")))
            "displayNode" <- function(i, type) {
                display <- TRUE
                if (type == "Factor") {
                }
                else if (type == "Extra") {
                }
                else if (type == "ClosedBlock") {
                  if (!closedBlock[abs(i)]) 
                    display <- FALSE
                  if (hiddenBlock[abs(i)]) 
                    display <- FALSE
                  if (!(abs(i) %in% dg@visibleBlocks)) 
                    display <- FALSE
                }
                else if (closedVertex[abs(i)]) 
                  display <- FALSE
                return(display)
            }
            "displayEdge" <- function(f, t, from.type = vertexTypeOfEdge(f, 
                edgeNode$type), to.type = vertexTypeOfEdge(t, 
                edgeNode$type), edgeNode = NULL) {
                display <- displayNode(f, from.type)
                if (display) 
                  display <- displayNode(t, to.type)
                return(display)
            }
            "setEdgeCoords" <- function(edgeNode, edge.type = "Edge", 
                f = edgeNode$from, t = edgeNode$to, posFrom = retVertexPos(f, 
                  from.type), posTo = retVertexPos(t, to.type), 
                from.type = vertexTypeOfEdge(f, edgeNode$type), 
                to.type = vertexTypeOfEdge(t, edgeNode$type), 
                raise = TRUE, setEdgeLabel = TRUE, width = control$w) {
                edgeNode <- subSetEdgeCoords(edgeNode, f, t, 
                  posFrom, posTo, from.type, to.type)
                l <- sqrt(sum((posTo - posFrom)^2))
                doDrawEdge <- FALSE
                if (is.null(edgeNode$edges)) 
                  doDrawEdge <- TRUE
                else {
                  if (l < 1) 
                    setEdgeLabel(edgeNode, " ", edgeNode$label.number, 
                      f = f, edge.type = edge.type, permanent = FALSE)
                  else {
                    if (raise) 
                      for (l in 1:length(edgeNode$edges)) tkitemraise(canvas, 
                        edgeNode$edges[[l]])
                    if (length(edgeNode$tags) > 0) 
                      for (l in 1:length(edgeNode$tags)) tkitemraise(canvas, 
                        edgeNode$tags[[l]])
                    tkitemraise(canvas, edgeNode$label)
                  }
                  if (setEdgeLabel) {
                    display <- displayEdge(f = f, t, edgeNode = edgeNode)
                    if (display) {
                      label <- retEdgeLabel(edgeNode, edgeNode$label.number, 
                        f = f)
                      setEdgeLabel(edgeNode, label, edgeNode$label.number, 
                        f = f, edge.type = edge.type, permanent = FALSE)
                    }
                  }
                  posLabel <- (posFrom + posTo)/2 + retEdgeLabelPos(edgeNode$label.number, 
                    f, t)
                  tkcoords(canvas, edgeNode$label, posLabel[1], 
                    posLabel[2])
                }
            }
            "subSetEdgeCoords" <- function(edgeNode, f, t, posFrom = retVertexPos(f, 
                from.type), posTo = retVertexPos(t, to.type), 
                from.type = vertexTypeOfEdge(f, edgeNode$type), 
                to.type = vertexTypeOfEdge(t, edgeNode$type), 
                width = control$w) {
                stratumFrom <- retStratum(f, from.type)
                stratumTo <- retStratum(t, to.type)
                reverse <- edgeNode$reverse
                display <- displayEdge(f, t, from.type, to.type, 
                  edgeNode = edgeNode)
                drawnEdge <- TRUE
                if (display) {
                  diff <- posTo - posFrom
                  l <- sqrt(sum(diff^2))
                  posTo <- posTo - diff * min(2 * control$w, 
                    l)/l
                  posFrom <- posFrom + diff * min(2 * control$w, 
                    l)/l
                  if (is.null(edgeNode$edges)) {
                    edges <- getEdges(edge.type = edgeNode$type)
                    drawEdge(edges[[edgeNode$nr]], edgeNode$nr, 
                      lower = TRUE, edge.type = edgeNode$type, 
                      reinsert = TRUE)
                    edgeNodes <- edgeItem(f, edge.type = edgeNode$type) # 'edge.type' = edgeNode$type ???
                    if (length(edgeNodes) > 0) 
                      for (e in edgeNodes) {
                        if (!(is.null(e))) 
                          if ((e$nr == edgeNode$nr) && (e$type == 
                            edgeNode$type)) 
                            if (e$to == edgeNode$to) 
                              edgeNode <- e
                      }
                  }
                  else {
                    label <- retEdgeLabel(edgeNode, edgeNode$label.number, 
                      f, t, edge.type = edgeNode$type)
                    tkitemconfigure(canvas, edgeNode$label, text = label)
                  }
                }
                else {
                  posTo <- c(0, 0)
                  posFrom <- c(0, 0)
                  if (is.null(edgeNode$edges)) 
                    drawnEdge <- FALSE
                  else {
                    tkitemconfigure(canvas, edgeNode$label, text = "")
                  }
                }
                if (drawnEdge) {
                  if ((stratumFrom != 0) || (stratumTo != 0) || 
                    !Oriented) {
                    if (is.na(edgeNode$oriented)) 
                      none <- stratumFrom == stratumTo
                    else none <- !edgeNode$oriented
                    for (l in 1:length(edgeNode$edges)) if (none) 
                      tkitemconfigure(canvas, edgeNode$edges[[l]], 
                        arrow = "none")
                    else tkitemconfigure(canvas, edgeNode$edges[[l]], 
                      arrow = "last")
                    edge.oriented <- FALSE
                    if (!is.na(edgeNode$oriented)) 
                      edge.oriented <- edgeNode$oriented
                    if (edge.oriented) 
                      reverse <- edgeNode$reverse
                    else reverse <- (stratumFrom > stratumTo)
                  }
                  "g" <- function(pos, ll) {
                    dxy <- tkcoords(canvas, edgeNode$tags[[ll]])
                    dxy <- apply(matrix(as.numeric(dxy), ncol = 2, 
                      byrow = 2), 2, mean)
                    dxy <- pos[1:2] - dxy
                    tkmove(canvas, edgeNode$tags[[ll]], dxy[1], 
                      dxy[2])
                  }
                  pos <- (posFrom + posTo)/2
                  if (length(edgeNode$tags) > 0) 
                    for (ll in 1:length(edgeNode$tags)) g(pos, 
                      ll)
                  "ff" <- function(posFrom, posTo, ll) {
                    if (reverse) 
                      tkcoords(canvas, edgeNode$edges[[ll]], 
                        posTo[1], posTo[2], posFrom[1], posFrom[2])
                    else tkcoords(canvas, edgeNode$edges[[ll]], 
                      posFrom[1], posFrom[2], posTo[1], posTo[2])
                  }
                  if (length(edgeNode$edges) == 1) 
                    ff(posFrom, posTo, 1)
                  else {
                    d <- posFrom - posTo
                    ld <- sqrt(sum(d[1:2]^2))
                    e <- width * d[1:2]/ld/2 * (length(edgeNode$edges) - 
                      1)/4
                    d <- width * c(-d[2], d[1])/ld/2 * (length(edgeNode$edges) - 
                      1)
                    if (length(edgeNode$edges) == 2) {
                      ff(posFrom[1:2] + d, posTo[1:2] + d, 1)
                      ff(posFrom[1:2] - d, posTo[1:2] - d, 2)
                    }
                    else {
                      for (lll in 1:length(edgeNode$edges)) {
                        kk <- lll - (length(edgeNode$edges) + 
                          1)/2
                        ff(posFrom[1:2] + kk * d + abs(kk) * 
                          e, posTo[1:2] + kk * d - abs(kk) * 
                          e, lll)
                      }
                    }
                  }
                }
                return(edgeNode)
            }
            "retBlockPos" <- function(i, j) {
                position <- positionsBlocks[i, , j]
                positionsCanvas(project(position))
            }
            "changeBlockCornerPos" <- function(i, A, dxy) {
                db <- toBlockPoints(A, dxy)
                positionsBlocks[i, , 1] <<- findMove(positionsBlocks[i, 
                  , 1], db[1, ])
                positionsBlocks[i, , 2] <<- findMove(positionsBlocks[i, 
                  , 2], db[2, ])
            }
            "changeBlockPos" <- function(i, A, dxy) {
                positionsBlocks[i, , 1] <<- findMove(positionsBlocks[i, 
                  , 1], dxy)
                positionsBlocks[i, , 2] <<- findMove(positionsBlocks[i, 
                  , 2], dxy)
            }
            "inBlock" <- function(position, block) {
                if (is.null(blockList[[block]])) 
                  return(FALSE)
                else {
                  block.position <- t(positionsBlocks[block, 
                    , ])
                  if (!all((block.position[1, ] < block.position[2, 
                    ]))) 
                    warning("Invalid block positions")
                  return(all((block.position[1, ] < position) & 
                    (position < block.position[2, ])))
                }
            }
            "retBlockPoints" <- function(i, header = FALSE, box = FALSE, 
                n) {
                A <- positionsBlocks[i, , 1]
                if (header) {
                  if (box) {
                    A <- A + c(1, 1, rep(0, local.N - 2))
                    B <- A + c(3 * n, 5, rep(0, local.N - 2))
                  }
                  else {
                    B <- positionsBlocks[i, , 2]
                    A <- A + c(1, 5, rep(0, local.N - 2))
                    B[1] <- B[1] - 1
                    B[2] <- A[2] + 1
                  }
                }
                else B <- positionsBlocks[i, , 2]
                delta <- c(0, 0, 0)
                position <- matrix(c(c(A[1], A[2], A[3]), c(B[1], 
                  B[2], B[3]) + delta, c(A[1], B[2], A[3]), c(B[1], 
                  A[2], A[3]), c(A[1], A[2], B[3]) + delta, c(A[1], 
                  B[2], B[3]) + delta, c(B[1], A[2], B[3]) + 
                  delta, c(B[1], B[2], A[3])), ncol = 3, byrow = TRUE)
                if (local.N < 3) 
                  position <- position[, 1:local.N]
                else if (local.N > 3) 
                  for (i in 4:local.N) position <- cbind(position, 
                    rep(0, 8))
                positionsCanvas(project(position))
            }
            "toBlockPoints" <- function(n, p) {
                result <- switch(EXPR = paste(n - 1), "0" = c(c(p[1], 
                  p[2], p[3]), c(0, 0, 0)), "1" = c(c(0, 0, 0), 
                  c(p[1], p[2], p[3])), "2" = c(c(p[1], 0, p[3]), 
                  c(0, p[2], 0)), "3" = c(c(0, p[2], p[3]), c(p[1], 
                  0, 0)), "4" = c(c(p[1], p[2], 0), c(0, 0, p[3])), 
                  "5" = c(c(p[1], 0, 0), c(0, p[2], p[3])), "6" = c(c(0, 
                    p[2], 0), c(p[1], 0, p[3])), "7" = c(c(0, 
                    0, p[3]), c(p[1], p[2], 0)))
                result <- matrix(result, ncol = 3, byrow = TRUE)
                if (local.N < 3) 
                  result <- result[, 1:local.N]
                if (local.N > 3) 
                  for (i in 4:local.N) result <- cbind(result, 
                    rep(0, 8))
                return(result)
            }
            "retBlockLabelPos" <- function(i) relativePositionsCanvas(positionsBlockLabels[i, 
                ])
            "addEdgePopups" <- function(canvas, edge, i, f, t, 
                edgePopupMenu, U.Menus, edge.type = "VertexEdge") {
                tkadd(edgePopupMenu, "command", label = paste("Edge from", 
                  retVertexLabel(f), "to", retVertexLabel(t), 
                  "(echo indices)"), command = function() {
                  print("Hej from edge")
                  print(c(f, t))
                })
                tkadd(edgePopupMenu, "command", label = paste("Delete edge (Here: Slave view!)"), 
                  accelerator = "[ double click edge ]", command = function() subDropEdge(i, 
                    f, t, edge.type = edge.type, slave = TRUE))
                tkadd(edgePopupMenu, "command", label = paste("Delete all edges to/from blocks"), 
                  command = function() subDropEdge(i, f, t, from.all = TRUE, 
                    to.all = TRUE, edge.type = edge.type, slave = FALSE))
                propEdgeMenu <- tkmenu(edgePopupMenu, tearoff = FALSE)
                tkadd(propEdgeMenu, "command", label = paste("Open dialog box for slot values"), 
                  command = function() propertyEdge(i, f, t, 
                    edge.type = edge.type)())
                tkadd(propEdgeMenu, "command", label = paste("/ Change edge class"), 
                  command = function() changeEdgeClass(i, f, 
                    t, edge.type = edge.type)())
                tkadd(propEdgeMenu, "command", label = paste("/ Set edge label"), 
                  command = function() {
                    activateEdge(i, from = f, to = t, edge.type = edge.type)()
                    changeEdgeLabel(i, f, t, edge.type = edge.type)()
                  })
                tkadd(propEdgeMenu, "command", label = paste("/ Compute edge label"), 
                  accelerator = "[ click label ]", command = function() {
                    activateEdge(i, from = f, to = t, edge.type = edge.type)()
                    computeEdgeLabel(i, f, t, FALSE, edge.type = edge.type)()
                  })
                tkadd(propEdgeMenu, "command", label = paste("/ Force computation of edge label"), 
                  accelerator = "[ double click label ]", command = function() {
                    activateEdge(i, from = f, to = t, edge.type = edge.type)()
                    computeEdgeLabel(i, f, t, TRUE, edge.type = edge.type)()
                  })
                tkadd(propEdgeMenu, "command", label = paste("/ Delete label of edge"), 
                  accelerator = "[ triple click label ]", command = function() deleteEdgeLabel(i, 
                    f, t, edge.type = edge.type)())
                tkadd(edgePopupMenu, "cascade", label = "Properties", 
                  menu = propEdgeMenu)
                helpEdgeMenu <- tkmenu(edgePopupMenu, tearoff = FALSE)
                tkadd(helpEdgeMenu, "command", label = paste(" - Add edge: Left click the vertices of the edge to add"), 
                  command = function() message("Left click the vertices of the edge to add"))
                tkadd(helpEdgeMenu, "command", label = paste(" - Drag edge: Move edge with two vertices"), 
                  command = function() message("Left click edge and drag edge"))
                tkadd(helpEdgeMenu, "command", label = paste(" - Drag label: Move label of edge"), 
                  command = function() message("Left click edge label and drag label"))
                tkadd(edgePopupMenu, "cascade", label = "Help on edges", 
                  menu = helpEdgeMenu)
                methEdgeMenu <- tkmenu(edgePopupMenu, tearoff = FALSE)
                if (hasMethod("addToPopups", class(edge))) 
                  addToPopups(edge, edge.type, methEdgeMenu, 
                    i, sinkView, Args)
                tkadd(edgePopupMenu, "cascade", label = "Items by method 'addToPopups'", 
                  menu = methEdgeMenu)
                userEdgeMenu <- tkmenu(edgePopupMenu, tearoff = FALSE)
                "UserEdgePopup" <- function(item) {
                  force(item)
                  force(f)
                  force(t)
                  force(edge.type)
                  force(edge)
                  function(...) {
                    sinkView(U.Menus[[item]])
                    j <- which.unordered.edge(c(t, f), edge.type = edge.type)
                    from.type <- vertexTypeOfEdge(f, edge.type, 
                      edge)
                    to.type <- vertexTypeOfEdge(t, edge.type, 
                      edge)
                    U.Menus[[item]]$command(object, retVertexName(f, 
                      from.type), retVertexName(t, to.type), 
                      from = f, to = t, from.type = from.type, 
                      to.type = to.type, edge.index = i, which.edge = j, 
                      edge.type = edge.type, Arguments = Args())
                  }
                }
                if (length(U.Menus) > 0) 
                  for (item in seq(along = U.Menus)) if (names(U.Menus[item]) == 
                    "Edge") 
                    tkadd(userEdgeMenu, "command", label = U.Menus[[item]]$label, 
                      command = UserEdgePopup(item))
                tkadd(edgePopupMenu, "cascade", label = "User defined items", 
                  menu = userEdgeMenu)
            }
            "setBindEdge" <- function(canvas, edge, line, label, 
                i, f, t, U.Menus, edge.type = "VertexEdge") {
                if (initial.set.popups) {
                  edgePopupMenu <- tkmenu(canvas, tearoff = FALSE)
                  addEdgePopups(canvas, edge, i, f, t, edgePopupMenu, 
                    U.Menus, edge.type)
                }
                tkitembind(canvas, label, "<Leave>", function() tkconfigure(canvas, 
                  cursor = "arrow"))
                tkitembind(canvas, label, "<Enter>", function() tkconfigure(canvas, 
                  cursor = "hand1"))
                tkitembind(canvas, line, "<Leave>", function() tkconfigure(canvas, 
                  cursor = "arrow"))
                tkitembind(canvas, line, "<Enter>", function() tkconfigure(canvas, 
                  cursor = "tcross"))
                tkitembind(canvas, label, "<Button-1>", activateEdge(i, 
                  from = f, to = t, edge.type = edge.type))
                tkitembind(canvas, label, "<B1-Motion>", moveEdgeLabel(i, 
                  f, t, edge.type = edge.type))
                tkitembind(canvas, label, "<ButtonRelease-1>", 
                  computeEdgeLabel(i, f, t, FALSE, edge.type = edge.type))
                tkitembind(canvas, label, "<Double-Button-1>", 
                  computeEdgeLabel(i, f, t, TRUE, edge.type = edge.type))
                tkitembind(canvas, label, "<Triple-Button-1>", 
                  deleteEdgeLabel(i, f, t, edge.type = edge.type))
                tkitembind(canvas, label, "<Shift-1>", changeEdgeClass(i, 
                  f, t, edge.type = edge.type))
                if (initial.set.popups) 
                  tkitembind(canvas, label, "<Button-3>", callPopup(i, 
                    edgePopupMenu))
                else tkitembind(canvas, label, "<Button-3>", 
                  callPopupEdge(edge, i, f, t, edge.type, U.Menus))
                tkitembind(canvas, line, "<Option-1>", activateEdge(i, 
                  from = f, to = t, edge.type, hit.type = "option-1", 
                  color = "DarkGreen"))
                tkitembind(canvas, line, "<Shift-1>", activateEdge(i, 
                  from = f, to = t, edge.type, hit.type = "shift-1", 
                  color = "DarkGreen"))
                tkitembind(canvas, line, "<Control-1>", activateEdge(i, 
                  from = f, to = t, edge.type, hit.type = "control-1", 
                  color = "SeaGreen"))
                tkitembind(canvas, line, "<Shift-Control-1>", 
                  activateEdge(i, from = f, to = t, edge.type, 
                    hit.type = "shift-control-1", color = "LightSeaGreen"))
                tkitembind(canvas, line, "<Option-3>", activateEdge(i, 
                  from = f, to = t, edge.type, hit.type = "option-3", 
                  color = "LightGreen"))
                tkitembind(canvas, line, "<Shift-3>", activateEdge(i, 
                  from = f, to = t, edge.type, hit.type = "shift-3", 
                  color = "LightGreen"))
                tkitembind(canvas, line, "<Control-3>", activateEdge(i, 
                  from = f, to = t, edge.type, hit.type = "control-3", 
                  color = "SpringGreen"))
                tkitembind(canvas, line, "<Shift-Control-3>", 
                  activateEdge(i, from = f, to = t, edge.type, 
                    hit.type = "shift-control-3", color = "LimeGreen"))
                tkitembind(canvas, line, "<Button-1>", activateEdge(i, 
                  from = f, to = t, edge.type = edge.type))
                tkitembind(canvas, line, "<Double-Button-1>", 
                  deleteEdge(i, f, t, edge.type = edge.type))
                tkitembind(canvas, line, "<B1-Motion>", moveEdge(i, 
                  f, t, edge.type = edge.type))
                if (initial.set.popups) 
                  tkitembind(canvas, line, "<Button-3>", callPopup(i, 
                    edgePopupMenu))
                else tkitembind(canvas, line, "<Button-3>", callPopupEdge(edge, 
                  i, f, t, edge.type, U.Menus))
            }
            "subDrawEdge" <- function(edge, i, edgecolor = "black", 
                lower = FALSE, edge.type = "VertexEdge", newE = FALSE) {
                "emptyEdge" <- function() list(list(lines = NULL, 
                  tags = NULL, from = f, to = t, label = NULL, 
                  label.position = NULL))
                type.negative <- ifelse(edge.type == "BlockEdge", 
                  "ClosedBlock", ifelse(edge.type == "FactorEdge", 
                    "Factor", "Extra"))
                useMethod <- FALSE
                result <- FALSE
                if (!is.null(edge)) 
                  useMethod <- hasMethod("draw", class(edge))
                if (useMethod) {
                  position <- edge.positions(i, type.negative = type.negative, 
                    edge.type = edge.type)
                  if (length(position) == 2) {
                    f <- from(i, edge.type = edge.type)
                    t <- to(i, edge.type = edge.type)
                    from.type <- vertexTypeOfEdge(f, edge.type, 
                      edge)
                    to.type <- vertexTypeOfEdge(t, edge.type, 
                      edge)
                    display <- displayEdge(f, t, from.type, to.type)
                  }
                  else {
                    display <- TRUE
                  }
                  if (display) {
                    strata <- edge.strata(i, type.negative = type.negative, 
                      edge.type = edge.type)
                    x <- lapply(position, function(e) e[1])
                    y <- lapply(position, function(e) e[2])
                    result <- draw(edge, canvas, position, x, 
                      y, stratum = strata, w = edge@width * Scale, 
                      color = edge@color, font.edge.label = font.edge.label, 
                      background = control$background)
                  }
                  else result <- emptyEdge()
                }
                else {
                  f <- from(i, edge.type = edge.type)
                  t <- to(i, edge.type = edge.type)
                  from.type <- vertexTypeOfEdge(f, edge.type, 
                    edge)
                  to.type <- vertexTypeOfEdge(t, edge.type, edge)
                  display <- displayEdge(f, t, from.type, to.type)
                  if (!display) {
                    print("Drawing edge to undisplay")
                    result <- emptyEdge
                  }
                  else {
                    posFrom <- retVertexPos(f, from.type)
                    posTo <- retVertexPos(t, to.type)
                    stratumFrom <- retStratum(f, from.type)
                    stratumTo <- retStratum(t, to.type)
                    if (stratumFrom == stratumTo) 
                      arrowhead = "none"
                    else if (stratumFrom < stratumTo) 
                      arrowhead = "last"
                    else arrowhead = "first"
                    E <- getEdges(edge.type = edge.type)[[i]]
                    line <- tkcreate(canvas, "line", posFrom[1], 
                      posFrom[2], posTo[1], posTo[2], arrow = arrowhead, 
                      width = E@width, fill = E@color)
                    label.position <- (posFrom + posTo)/2
                    pos <- label.position + rep(0, local.N)
                    txt <- E@label
                    label <- tkcreate(canvas, "text", pos[1], 
                      pos[2], text = txt, anchor = "nw", font = font.edge.label, 
                      activefill = "DarkSlateGray")
                    result <- list(list(lines = list(line), from = f, 
                      to = t, label = label, label.position = label.position))
                  }
                }
                return(result)
            }
            "insertEdgeItems" <- function(R, edge, i, edge.type = "VertexEdge", 
                newE = FALSE, reinsert = FALSE) {
                if (!is.null(R)) {
                  for (k in 1:length(R)) {
                    if (!reinsert) 
                      positionsEdgeLabels <<- rbind(positionsEdgeLabels, 
                        rep(0, local.N))
                    f <- R[[k]]$from
                    t <- R[[k]]$to
                    edge.oriented <- NA
                    if (is.element("oriented", slotNames(edge))) 
                      edge.oriented <- edge@oriented
                    if (is.null(R[[k]]$lines)) {
                      edgeNode <- list(nr = i, type = edge.type, 
                        to = t, tag = NULL, oriented = edge.oriented, 
                        reverse = FALSE, edges = NULL, tags = NULL, 
                        label = NULL, label.number = nrow(positionsEdgeLabels))
                      setEdgeItem(f, edge.type = edge.type, c(edgeItem(f, 
                        edge.type = edge.type), list(edgeNode)))
                      edgeNode <- list(nr = i, type = edge.type, 
                        to = f, tag = NULL, oriented = edge.oriented, 
                        reverse = TRUE, edges = NULL, tags = NULL, 
                        label = NULL, label.number = nrow(positionsEdgeLabels))
                      setEdgeItem(t, edge.type = edge.type, c(edgeItem(t, 
                        edge.type = edge.type), list(edgeNode)))
                    }
                    else {
                      if (length(R) > 1) 
                        tag <- getTag(edge.type, round(i + (k - 
                          1)/length(R), digits = 2))
                      else tag <- getTag(edge.type, i)
                      tkaddtag(canvas, tag, "withtag", R[[k]]$label)
                      for (l in 1:length(R[[k]]$lines)) tkaddtag(canvas, 
                        tag, "withtag", R[[k]]$lines[[l]])
                      if (length(R[[k]]$tags) > 0) 
                        for (l in 1:length(R[[k]]$tags)) tkaddtag(canvas, 
                          tag, "withtag", R[[k]]$tags[[l]])
                      edgeNode <- list(nr = i, type = edge.type, 
                        to = t, tag = tag, oriented = edge.oriented, 
                        reverse = FALSE, edges = R[[k]]$lines, 
                        tags = R[[k]]$tags, label = R[[k]]$label, 
                        label.number = nrow(positionsEdgeLabels))
                      if (reinsert) {
                        reinsertEdgeItem(edgeNode, from = f, 
                          to = t, nr = i, edge.type = edge.type)
                      }
                      else setEdgeItem(f, edge.type = edge.type, 
                        c(edgeItem(f, edge.type = edge.type), 
                          list(edgeNode)))
                      subSetEdgeCoords(edgeNode, f, t, width = control$w)
                      if (newE) 
                        tkitemconfigure(canvas, R[[k]]$label, 
                          text = edge@label)
                      edgeNode <- list(nr = i, type = edge.type, 
                        to = f, tag = tag, oriented = edge.oriented, 
                        reverse = TRUE, edges = R[[k]]$lines, 
                        tags = R[[k]]$tags, label = R[[k]]$label, 
                        label.number = nrow(positionsEdgeLabels))
                      if (reinsert) {
                        reinsertEdgeItem(edgeNode, from = t, 
                          to = f, nr = i, edge.type = edge.type)
                      }
                      else setEdgeItem(t, edge.type = edge.type, 
                        c(edgeItem(t, edge.type = edge.type), 
                          list(edgeNode)))
                      for (l in 1:length(R[[k]]$lines)) setBindEdge(canvas, 
                        edge, R[[k]]$lines[[l]], R[[k]]$label, 
                        i, f, t, control$UserMenus, edge.type = edge.type)
                      if (length(R[[k]]$tags) > 0) 
                        for (l in 1:length(R[[k]]$tags)) setBindEdge(canvas, 
                          edge, R[[k]]$tags[[l]], R[[k]]$label, 
                          i, f, t, control$UserMenus, edge.type = edge.type)
                    }
                  }
                }
            }
            "drawEdge" <- function(edge, i, edgecolor = "black", 
                lower = FALSE, edge.type = "VertexEdge", newE = FALSE, 
                reinsert = FALSE) {
                if (control$debug.edges) 
                  print(paste("drawEdge", i, edge.type))
                if (!any(nodeIndices(edge) == 0)) {
                  result <- subDrawEdge(edge, i, edgecolor, lower, 
                    edge.type, newE)
                  insertEdgeItems(result, edge, i, edge.type = edge.type, 
                    newE = newE, reinsert = reinsert)
                }
            }
            "tkcoordsBlock" <- function(i, color = "black", lower = FALSE) {
                "tkcoordsRectangleLine" <- function(line, i, A, 
                  B, positions, color = "black", width = 1) {
                  posA <- positions[A, ]
                  posB <- positions[B, ]
                  tkcoords(canvas, line, posA[1], posA[2], posB[1], 
                    posB[2])
                }
                "tkcoordsCornerLine" <- function(line, i, A, posA, 
                  posB, color = "black", width = 1) {
                  diff <- posB - posA
                  l <- sqrt(sum(diff^2))
                  posB <- posA + diff * min(30, l)/l
                  posA <- posA - diff * min(control$w/2, l)/l
                  tkcoords(canvas, line, posA[1], posA[2], posB[1], 
                    posB[2])
                }
                "tkcoordsRectangleCorner" <- function(line, i, 
                  A, B, C, D, positions, color = "black", width = 2) {
                  posA <- positions[A, ]
                  tkcoordsCornerLine(line[[1]], i, A, posA, positions[B, 
                    ], color, width)
                  tkcoordsCornerLine(line[[2]], i, A, posA, positions[C, 
                    ], color, width)
                  if (!is.null(transformation)) 
                    tkcoordsCornerLine(line[[3]], i, A, posA, 
                      positions[D, ], color, width)
                }
                "tkcoordsRectangle" <- function(rectangle, i, 
                  positions, color = "black", width = 1) {
                  line <- rectangle$Lines
                  tkcoordsRectangleLine(line[[1]], i, 1, 3, positions, 
                    color, width)
                  tkcoordsRectangleLine(line[[2]], i, 4, 8, positions, 
                    color, width)
                  tkcoordsRectangleLine(line[[3]], i, 1, 4, positions, 
                    color, width)
                  tkcoordsRectangleLine(line[[4]], i, 3, 8, positions, 
                    color, width)
                  if (!is.null(transformation)) {
                    tkcoordsRectangleLine(line[[5]], i, 5, 6, 
                      positions, color, width)
                    tkcoordsRectangleLine(line[[6]], i, 7, 2, 
                      positions, color, width)
                    tkcoordsRectangleLine(line[[7]], i, 5, 7, 
                      positions, color, width)
                    tkcoordsRectangleLine(line[[8]], i, 6, 2, 
                      positions, color, width)
                    tkcoordsRectangleLine(line[[9]], i, 1, 5, 
                      positions, color, width)
                    tkcoordsRectangleLine(line[[10]], i, 3, 6, 
                      positions, color, width)
                    tkcoordsRectangleLine(line[[11]], i, 4, 7, 
                      positions, color, width)
                    tkcoordsRectangleLine(line[[12]], i, 8, 2, 
                      positions, color, width)
                  }
                  corner <- rectangle$Corners
                  tkcoordsRectangleCorner(corner[[1]], i, 1, 
                    3, 4, 5, positions, color, width + 2)
                  tkcoordsRectangleCorner(corner[[2]], i, 8, 
                    4, 3, 2, positions, color, width + 2)
                  tkcoordsRectangleCorner(corner[[3]], i, 4, 
                    1, 8, 7, positions, color, width + 2)
                  tkcoordsRectangleCorner(corner[[4]], i, 3, 
                    8, 1, 6, positions, color, width + 2)
                  if (!is.null(transformation)) {
                    tkcoordsRectangleCorner(corner[[5]], i, 5, 
                      6, 7, 1, positions, color, width + 2)
                    tkcoordsRectangleCorner(corner[[6]], i, 2, 
                      7, 6, 8, positions, color, width + 2)
                    tkcoordsRectangleCorner(corner[[7]], i, 7, 
                      5, 2, 4, positions, color, width + 2)
                    tkcoordsRectangleCorner(corner[[8]], i, 6, 
                      2, 5, 3, positions, color, width + 2)
                  }
                }
                "tkcoordsBar" <- function(line, i, positions, 
                  color = "black", width = 1) {
                  tkcoordsRectangleLine(line[[1]], i, 1, 3, positions, 
                    color, width)
                  tkcoordsRectangleLine(line[[2]], i, 4, 8, positions, 
                    color, width)
                  tkcoordsRectangleLine(line[[3]], i, 1, 4, positions, 
                    color, width)
                  tkcoordsRectangleLine(line[[4]], i, 3, 8, positions, 
                    color, width)
                }
                positions <- retBlockPoints(i)
                if (!is.null(openBlockItem(i)$canvas)) 
                  tkcoords(canvas, openBlockItem(i)$canvas, positions[1, 
                    1], positions[1, 2], positions[8, 1], positions[8, 
                    2])
                if (!is.null(openBlockItem(i)$rectangle)) 
                  tkcoordsRectangle(openBlockItem(i)$rectangle, 
                    i, positions, color = color, width = 1)
                txt <- blockList[[i]]@label
                positions <- retBlockPoints(i, header = TRUE, 
                  n = nchar(txt))
                if (!is.null(openBlockItem(i)$bar)) 
                  tkcoordsBar(openBlockItem(i)$bar, i, positions, 
                    color = color, width = 1)
                pos <- retBlockPos(i, 1) + c(8, 4, rep(0, local.N - 
                  2))
                if (!is.null(openBlockItem(i)$label)) 
                  tkcoords(canvas, openBlockItem(i)$label, pos[1], 
                    pos[2])
            }
            "drawBlock" <- function(block, i, color = "Grey", 
                box = FALSE, lower = TRUE, setTag = TRUE) {
                "drawRectangleLine" <- function(i, A, B, positions, 
                  tag, color = "black", width = 1) {
                  posA <- positions[A, ]
                  posB <- positions[B, ]
                  line <- tkcreate(canvas, "line", posA[1], posA[2], 
                    posB[1], posB[2], width = width, fill = color)
                  tkaddtag(canvas, tag, "withtag", line)
                  tkitembind(canvas, line, "<B1-Motion>", moveBlockLine(i, 
                    A, B))
                  tkitembind(canvas, line, "<Leave>", function() tkconfigure(canvas, 
                    cursor = "arrow"))
                  if ((A == 1) && (B == 3)) 
                    cursor <- "left_side"
                  else if ((A == 4) && (B == 8)) 
                    cursor <- "right_side"
                  else if ((A == 1) && (B == 4)) 
                    cursor <- "top_side"
                  else if ((A == 3) && (B == 8)) 
                    cursor <- "bottom_side"
                  else if ((A == 5) && (B == 6)) 
                    cursor <- "left_side"
                  else if ((A == 7) && (B == 2)) 
                    cursor <- "right_side"
                  else if ((A == 5) && (B == 7)) 
                    cursor <- "top_side"
                  else if ((A == 6) && (B == 2)) 
                    cursor <- "bottom_side"
                  else if ((A == 1) && (B == 5)) 
                    cursor <- "top_side"
                  else if ((A == 3) && (B == 6)) 
                    cursor <- "bottom_side"
                  else if ((A == 4) && (B == 7)) 
                    cursor <- "top_side"
                  else if ((A == 8) && (B == 2)) 
                    cursor <- "bottom_side"
                  tkitembind(canvas, line, "<Enter>", function() tkconfigure(canvas, 
                    cursor = cursor))
                  return(line)
                }
                "drawCornerLine" <- function(i, A, posA, posB, 
                  tag, color = "black", width = 1) {
                  diff <- posB - posA
                  l <- sqrt(sum(diff^2))
                  posB <- posA + diff * min(25, l)/l
                  posA <- posA - diff * min(control$w/2, l)/l
                  line <- tkcreate(canvas, "line", posA[1], posA[2], 
                    posB[1], posB[2], width = width, fill = color)
                  tkaddtag(canvas, tag, "withtag", line)
                  tkitembind(canvas, line, "<B1-Motion>", moveBlockPoint(i, 
                    A))
                  tkitembind(canvas, line, "<Leave>", function() tkconfigure(canvas, 
                    cursor = "arrow"))
                  if ((A == 1) || (A == 5)) 
                    cursor <- "top_left_corner"
                  else if ((A == 8) || (A == 2)) 
                    cursor <- "bottom_right_corner"
                  else if ((A == 4) || (A == 7)) 
                    cursor <- "top_right_corner"
                  else if ((A == 3) || (A == 6)) 
                    cursor <- "bottom_left_corner"
                  tkitembind(canvas, line, "<Enter>", function() tkconfigure(canvas, 
                    cursor = cursor))
                  return(line)
                }
                "drawRectangleCorner" <- function(i, A, B, C, 
                  D, positions, tag, color = "black", width = 2) {
                  posA <- positions[A, ]
                  l <- vector("list", 3)
                  l[[1]] <- drawCornerLine(i, A, posA, positions[B, 
                    ], tag, color, width)
                  l[[2]] <- drawCornerLine(i, A, posA, positions[C, 
                    ], tag, color, width)
                  if (!is.null(transformation)) 
                    l[[3]] <- drawCornerLine(i, A, posA, positions[D, 
                      ], tag, color, width)
                  return(l)
                }
                "drawRectangle" <- function(i, positions, tag, 
                  color = "black", width = 1) {
                  l <- vector("list", 12)
                  l[[1]] <- drawRectangleLine(i, 1, 3, positions, 
                    tag, color, width)
                  l[[2]] <- drawRectangleLine(i, 4, 8, positions, 
                    tag, color, width)
                  l[[3]] <- drawRectangleLine(i, 1, 4, positions, 
                    tag, color, width)
                  l[[4]] <- drawRectangleLine(i, 3, 8, positions, 
                    tag, color, width)
                  if (!is.null(transformation)) {
                    l[[5]] <- drawRectangleLine(i, 5, 6, positions, 
                      tag, color, width)
                    l[[6]] <- drawRectangleLine(i, 7, 2, positions, 
                      tag, color, width)
                    l[[7]] <- drawRectangleLine(i, 5, 7, positions, 
                      tag, color, width)
                    l[[8]] <- drawRectangleLine(i, 6, 2, positions, 
                      tag, color, width)
                    l[[9]] <- drawRectangleLine(i, 1, 5, positions, 
                      tag, color, width)
                    l[[10]] <- drawRectangleLine(i, 3, 6, positions, 
                      tag, color, width)
                    l[[11]] <- drawRectangleLine(i, 4, 7, positions, 
                      tag, color, width)
                    l[[12]] <- drawRectangleLine(i, 8, 2, positions, 
                      tag, color, width)
                  }
                  c <- vector("list", 8)
                  c[[1]] <- drawRectangleCorner(i, 1, 3, 4, 5, 
                    positions, tag, color, width + 2)
                  c[[2]] <- drawRectangleCorner(i, 8, 4, 3, 2, 
                    positions, tag, color, width + 2)
                  c[[3]] <- drawRectangleCorner(i, 4, 1, 8, 7, 
                    positions, tag, color, width + 2)
                  c[[4]] <- drawRectangleCorner(i, 3, 8, 1, 6, 
                    positions, tag, color, width + 2)
                  if (!is.null(transformation)) {
                    c[[5]] <- drawRectangleCorner(i, 5, 6, 7, 
                      1, positions, tag, color, width + 2)
                    c[[6]] <- drawRectangleCorner(i, 2, 7, 6, 
                      8, positions, tag, color, width + 2)
                    c[[7]] <- drawRectangleCorner(i, 7, 5, 2, 
                      4, positions, tag, color, width + 2)
                    c[[8]] <- drawRectangleCorner(i, 6, 2, 5, 
                      3, positions, tag, color, width + 2)
                  }
                  return(list(Lines = l, Corners = c))
                }
                "drawBar" <- function(i, positions, tag, box = FALSE, 
                  color = "black", width = 1) {
                  l <- vector("list", 4)
                  l[[1]] <- drawRectangleLine(i, 1, 3, positions, 
                    tag, color, width)
                  l[[2]] <- drawRectangleLine(i, 4, 8, positions, 
                    tag, color, width)
                  l[[3]] <- drawRectangleLine(i, 1, 4, positions, 
                    tag, color, width)
                  l[[4]] <- drawRectangleLine(i, 3, 8, positions, 
                    tag, color, width)
                  return(l)
                }
                tag <- getTag("block", i, setTag = setTag)
                positions <- retBlockPoints(i)
                posA <- positions[1, ]
                posB <- positions[8, ]
                popupitems <- NULL
                blockcanvas <- NULL
                if (control$drawBlockBackground) 
                  if (is.null(transformation)) {
                    blockcanvas <- tkcreate(canvas, "rectangle", 
                      posA[1], posA[2], posB[1], posB[2], fill = color(block))
                    tkaddtag(canvas, tag, "withtag", blockcanvas)
                    popupitems <- append(popupitems, list(blockcanvas))
                  }
                if (control$drawBlockFrame) 
                  Rectangle <- drawRectangle(i, positions, tag, 
                    color = color, width = 1)
                else Rectangle <- NULL
                txt <- blockLabels[i]
                positions <- retBlockPoints(i, header = TRUE, 
                  box = box, n = nchar(txt))
                if (control$drawBlockFrame) {
                  Bar <- drawBar(i, positions, tag, box = box, 
                    color = color, width = 2)
                  popupitems <- append(popupitems, Bar)
                }
                else Bar <- NULL
                posA <- retBlockPos(i, 1)
                pos <- posA + c(8, 4, rep(0, local.N - 2))
                label <- tkcreate(canvas, "text", pos[1], pos[2], 
                  text = txt, anchor = "nw", font = font.block, 
                  activefill = "DarkSlateGray")
                setOpenBlockItem(i, list(tag = tag, rectangle = Rectangle, 
                  canvas = blockcanvas, bar = Bar, label = label, 
                  block = i))
                setBindNode(canvas, blockList[[i]], tag, popupitems, 
                  label, i, "OpenBlock", control$UserMenus)
            }
            "addNodePopups" <- function(vertex, i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor"), nodePopupMenu, UserNodePopupItems, 
                slave = TRUE) {
                label <- retVertexLabel(i, vertex.type)
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(nodePopupMenu, "command", label = paste("Vertex", 
                    label, "(echo index)"), command = function() print(paste("Hej from vertex", 
                    label, "with index", i)))
                else if ((vertex.type == "OpenBlock") || (vertex.type == 
                  "ClosedBlock")) 
                  tkadd(nodePopupMenu, "command", label = paste("Block", 
                    label, "(echo index)"), command = function() print(paste("Hej from block", 
                    label, "with index", i)))
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(nodePopupMenu, "command", label = paste("Highlight for adding edge"), 
                    accelerator = "[ Click vertex ]", command = function() {
                      subActivateVertex(i, color = "green", vertex.type = vertex.type)
                      message("Click the other vertex")
                    })
                else if ((vertex.type == "OpenBlock")) {
                }
                else if ((vertex.type == "ClosedBlock")) 
                  tkadd(nodePopupMenu, "command", label = paste("Highlight block for adding edges"), 
                    accelerator = "[ Click block ]", command = function() {
                      subActivateVertex(i, color = "green", vertex.type = "ClosedBlock")
                      message("Click vertex or block")
                    })
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(nodePopupMenu, "command", 
                        label = paste("Add edge after highlighting with selecting class"), 
                    command = newEdge(i, vertex.type = "Vertex", 
                      slave = FALSE, selectClass = TRUE))
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(nodePopupMenu, "command", label = paste("Add edge after highlighting", 
                    if (slave) 
                      "(Here: Slave view!)"
                    else "", collapse = ""), accelerator = "[ Click vertex ]", 
                    command = newEdge(i, vertex.type = "Vertex", 
                      slave = slave))
                else if ((vertex.type == "OpenBlock")) {
                }
                else if ((vertex.type == "ClosedBlock")) 
                  tkadd(nodePopupMenu, "command", 
                        label = paste("Adds edges from/to block after highlight", 
                    if (slave) 
                      "(Here: Slave view!)"
                    else "", collapse = ""), accelerator = "[ Click block ]", 
                    command = newEdge(i, vertex.type = "ClosedBlock", 
                      slave = slave))
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) {
                }
                else if ((vertex.type == "OpenBlock")) {
                  tkadd(nodePopupMenu, "command", label = paste("Mark vertices of block"), 
                    command = function() {
                      markVerticesOfBlock(i, descendants = FALSE)
                    })
                  tkadd(nodePopupMenu, "command", label = paste(" --- and descendants"), 
                    command = function() {
                      markVerticesOfBlock(i, slave = FALSE)
                    })
                  tkadd(nodePopupMenu, "command", label = paste("Undisplay frames of block"), 
                    command = function() {
                      undisplayBlock(i, descendants = FALSE)
                    })
                  tkadd(nodePopupMenu, "command", label = paste(" --- and descendants"), 
                    command = function() {
                      undisplayBlock(i, slave = FALSE)
                    })
                  tkadd(nodePopupMenu, "command", label = paste("'Delete' (close) block"), 
                    command = function() {
                      removeBlock(i, descendants = FALSE)
                    })
                  tkadd(nodePopupMenu, "command", label = paste(" --- and descendants"), 
                    command = function() {
                      removeBlock(i, slave = FALSE)
                    })
                  tkadd(nodePopupMenu, "command", label = paste("New sub block"), 
                    accelerator = "(~ <F4>)", command = function() {
                      position <- position(blockList[[i]])
                      position <- apply(position, 1, mean)
                      position <- matrix(c(position - 10, position + 
                        10), nrow = 2, byrow = TRUE)
                      new.Block(position, get.name = TRUE)
                    })
                  tkadd(nodePopupMenu, "command", label = paste("Minimize (shade) block"), 
                    accelerator = "[ Double click block head ]", 
                    command = function() {
                      closeBlock(i)()
                    })
                  tkadd(nodePopupMenu, "command", label = paste("Maximize block"), 
                    command = function() {
                      zoomPositions <- positionsBlocks[i, , ]
                      zoomPositions[, 1] <- zoomPositions[, 1] - 
                        2
                      zoomPositions[, 2] <- zoomPositions[, 2] + 
                        2
                      zoomPositions <<- zoomPositions
                      subUpdateGraphWindow("Maximize", redrawVertices = TRUE, 
                        all.blockframes = TRUE)
                    })
                  tkadd(nodePopupMenu, "command", label = paste("Redraw full graph"), 
                    command = function() {
                      zoomPositions <<- NULL
                      subUpdateGraphWindow("Redraw", redrawVertices = TRUE, 
                        all.blockframes = TRUE)
                    })
                }
                else if ((vertex.type == "ClosedBlock")) 
                  tkadd(nodePopupMenu, "command", label = paste("Open block"), 
                    accelerator = "[ Double click minimized block ]", 
                    command = function() {
                      openBlock(i)()
                    })
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) {
                  if (!(is.element(i, returnVisibleVertices()))) 
                    tkadd(nodePopupMenu, "command", label = paste("Add vertex", 
                      if (slave) 
                        "(Here: Slave view!)"
                      else "", collapse = ""), command = function() subAddVertex(i, 
                      vertex.type = vertex.type, slave = slave))
                  else tkadd(nodePopupMenu, "command", label = paste("Delete vertex", 
                    if (slave) 
                      "(Here: Slave view!)"
                    else "", collapse = ""), command = function() subDropVertex(i, 
                    vertex.type = vertex.type, slave = slave))
                }
                else if ((vertex.type == "OpenBlock")) {
                }
                else if ((vertex.type == "ClosedBlock")) {
                }
                propNodeMenu <- tkmenu(nodePopupMenu, tearoff = FALSE)
                tkadd(propNodeMenu, "command", label = paste("Open dialog box for slot values"), 
                  command = function() propertyNode(i, vertex.type = vertex.type)())
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(propNodeMenu, "command", label = paste("/ Change label"), 
                    accelerator = "[ Double click label ]", command = changeVertexLabel(i, 
                      vertex.type = vertex.type))
                else if ((vertex.type == "OpenBlock")) 
                  tkadd(propNodeMenu, "command", label = paste("/ Change label of block"), 
                    command = changeVertexLabel(i, vertex.type = "ClosedBlock"))
                else if ((vertex.type == "ClosedBlock")) 
                  tkadd(propNodeMenu, "command", label = paste("/ Change label"), 
                    accelerator = "[ Double click label of minimized block ]", 
                    command = changeVertexLabel(i, vertex.type = "ClosedBlock"))
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(propNodeMenu, "command", label = paste("/ Delete vertex label"), 
                    command = deleteVertexLabel(i, vertex.type = "Vertex"))
                else if ((vertex.type == "OpenBlock")) 
                  tkadd(propNodeMenu, "command", label = paste("/ Delete label of block"), 
                    command = deleteVertexLabel(i, vertex.type = "ClosedBlock"))
                else if ((vertex.type == "ClosedBlock")) 
                  tkadd(propNodeMenu, "command", label = paste("/ Delete label of block"), 
                    command = deleteVertexLabel(i, vertex.type = "ClosedBlock"))
                tkadd(nodePopupMenu, "cascade", label = "Properties", 
                  menu = propNodeMenu)
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) {
                }
                else if ((vertex.type == "OpenBlock")) {
                }
                else if ((vertex.type == "ClosedBlock")) {
                }
                helpNodeMenu <- tkmenu(nodePopupMenu, tearoff = FALSE)
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(helpNodeMenu, "command", label = paste(" - Delete vertex"), 
                    accelerator = "[ Double click vertex ]", 
                    command = function() {
                    })
                else if ((vertex.type == "OpenBlock")) {
                }
                else if ((vertex.type == "ClosedBlock")) {
                }
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(helpNodeMenu, "command", label = paste(" - Drag vertex: Move vertex"), 
                    command = function() {
                    })
                else if ((vertex.type == "OpenBlock")) {
                  tkadd(helpNodeMenu, "command", label = paste(" - Drag block head:    Move block"), 
                    command = function() {
                    })
                  tkadd(helpNodeMenu, "command", label = paste(" - Drag block corner:  Resize block"), 
                    command = function() {
                    })
                }
                else if ((vertex.type == "ClosedBlock")) 
                  tkadd(helpNodeMenu, "command", label = paste(" - Drag block:  Move minimized block"), 
                    command = function() {
                    })
                if ((vertex.type == "Vertex") || (vertex.type == 
                  "Factor")) 
                  tkadd(helpNodeMenu, "command", label = paste(" - Drag label:    Move vertex label"), 
                    command = function() {
                    })
                else if ((vertex.type == "OpenBlock")) {
                }
                else if ((vertex.type == "ClosedBlock")) 
                  tkadd(helpNodeMenu, "command", 
                        label = paste(" - Drag label:   Move label of minimized block"), 
                    command = function() {
                    })
                tkadd(nodePopupMenu, "cascade", label = "Help on node", 
                  menu = helpNodeMenu)
                methNodeMenu <- tkmenu(nodePopupMenu, tearoff = FALSE)
                if (hasMethod("addToPopups", class(vertex))) 
                  addToPopups(vertex, vertex.type, methNodeMenu, 
                    i, sinkView, Args)
                tkadd(nodePopupMenu, "cascade", label = "Items by method 'addToPopups'", 
                  menu = methNodeMenu)
                userNodeMenu <- tkmenu(nodePopupMenu, tearoff = FALSE)
                "NodePopup" <- function(UserNodePopupItems, item, 
                  vertex.type) {
                  force(UserNodePopupItems)
                  force(item)
                  force(vertex.type)
                  function(...) {
                    sinkView(UserNodePopupItems[[item]], blocks = TRUE)
                    UserNodePopupItems[[item]]$command(object, 
                      retVertexName(i, vertex.type), type = vertex.type, 
                      index = i, Arguments = Args())
                  }
                }
                if (length(UserNodePopupItems) > 0) 
                  for (item in seq(along = UserNodePopupItems)) 
                    if ((names(UserNodePopupItems[item]) == vertex.type)) 
                    tkadd(userNodeMenu, "command", label = UserNodePopupItems[[item]]$label, 
                      command = NodePopup(UserNodePopupItems, 
                        item, vertex.type))
                tkadd(nodePopupMenu, "cascade", label = "User defined items", 
                  menu = userNodeMenu)
            }
            "setBindNode" <- function(canvas, vertex, tag, result, 
                label, i, vertex.type, UserNodePopupItems) {
                "f" <- function(item, i, label = FALSE) {
                  tkitembind(canvas, item, "<Leave>", function() tkconfigure(canvas, 
                    cursor = "arrow"))
                  if (label) {
                    if (vertex.type == "ClosedBlock") 
                      tkitembind(canvas, item, "<Enter>", function() tkconfigure(canvas, 
                        cursor = "diamond_cross"))
                    else tkitembind(canvas, item, "<Enter>", 
                      function() tkconfigure(canvas, cursor = "hand2"))
                  }
                  else if (vertex.type == "ClosedBlock") 
                    tkitembind(canvas, item, "<Enter>", function() tkconfigure(canvas, 
                      cursor = "cross"))
                  else tkitembind(canvas, item, "<Enter>", function() tkconfigure(canvas, 
                    cursor = "crosshair"))
                  if (label) 
                    tkitembind(canvas, item, "<Button-1>", newEdge(i, 
                      vertex.type, slave = FALSE))
                  else tkitembind(canvas, item, "<Button-1>", 
                    newEdge(i, vertex.type, slave = FALSE))
                  # tkitembind(canvas, item, "<Button-2>", function(...) {
                  #   print("--2--")
                  # })
                  tkitembind(canvas, item, "<Up>", function(...) {
                    function(...) print("--UP%--")
                  })
                  tkitembind(canvas, item, "<Down>", function(...) {
                    print("--Down%--")
                  })
                  tkitembind(canvas, item, "<Left>", function(...) {
                    print("--Left%--")
                  })
                  tkitembind(canvas, item, "<Right>", function(...) {
                    print("--Right%--")
                  })
                  tkitembind(canvas, item, "<Home>", function(...) {
                    print("--PgUp%--")
                  })
                  tkitembind(canvas, item, "<End>", function(...) {
                    print("--PgDn%--")
                  })
                  tkitembind(canvas, item, "<Delete>", function(...) {
                    print("--Delete%--")
                  })
                  tkitembind(canvas, item, "<F1>", function(...) {
                    print("--F1%--")
                  })
                  tkitembind(canvas, item, "<Alt-1>", function(...) {
                    print("--A1%--")
                  })
                  tkitembind(canvas, item, "<Alt_L>", function(...) {
                    print("--A%--")
                  })
                  tkitembind(canvas, item, "<Option-1>", activateVertex(i, 
                    vertex.type, hit.type = "option-1", color = "DarkGreen"))
                  tkitembind(canvas, item, "<Shift-1>", activateVertex(i, 
                    vertex.type, hit.type = "shift-1", color = "DarkGreen"))
                  tkitembind(canvas, item, "<Control-1>", activateVertex(i, 
                    vertex.type, hit.type = "control-1", color = "SeaGreen"))
                  tkitembind(canvas, item, "<Shift-Control-1>", 
                    activateVertex(i, vertex.type, hit.type = "shift-control-1", 
                      color = "LightSeaGreen"))
                  tkitembind(canvas, item, "<Option-3>", activateVertex(i, 
                    vertex.type, hit.type = "option-3", color = "LightGreen"))
                  tkitembind(canvas, item, "<Shift-3>", activateVertex(i, 
                    vertex.type, hit.type = "shift-3", color = "LightGreen"))
                  tkitembind(canvas, item, "<Control-3>", activateVertex(i, 
                    vertex.type, hit.type = "control-3", color = "SpringGreen"))
                  tkitembind(canvas, item, "<Shift-Control-3>", 
                    activateVertex(i, vertex.type, hit.type = "shift-control-3", 
                      color = "LimeGreen"))
                  if (label) 
                    tkitembind(canvas, item, "<B1-Motion>", moveVertexLabel(i, 
                      vertex.type))
                  else tkitembind(canvas, item, "<B1-Motion>", 
                    moveVertex(i, vertex.type))
                  if (label) 
                    tkitembind(canvas, item, "<Double-Button-1>", 
                      changeVertexLabel(i, vertex.type))
                  else if (vertex.type == "ClosedBlock") 
                    tkitembind(canvas, item, "<Double-Button-1>", 
                      openBlock(i))
                  else tkitembind(canvas, item, "<Double-Button-1>", 
                    undisplayVertex(i, vertex.type, slave = FALSE))
                  if (label) 
                    tkitembind(canvas, item, "<Triple-Button-1>", 
                      deleteVertexLabel(i, vertex.type))
                  if (initial.set.popups) 
                    tkitembind(canvas, item, "<Button-3>", callPopup(i, 
                      nodePopupMenu))
                  else tkitembind(canvas, item, "<Button-3>", 
                    callPopupNode(vertex, i, vertex.type, UserNodePopupItems))
                  tkaddtag(canvas, tag, "withtag", item)
                }
                "blockitembind" <- function(item, label = FALSE) {
                  tkitembind(canvas, item, "<Leave>", function() tkconfigure(canvas, 
                    cursor = "arrow"))
                  if (label) 
                    tkitembind(canvas, item, "<Enter>", function() tkconfigure(canvas, 
                      cursor = "left_ptr"))
                  else tkitembind(canvas, item, "<Enter>", function() tkconfigure(canvas, 
                    cursor = "right_ptr"))
                  tkitembind(canvas, item, "<B1-Motion>", moveBlock(i, 
                    1))
                  tkitembind(canvas, item, "<Double-Button-1>", 
                    closeBlock(i))
                  if (initial.set.popups) 
                    tkitembind(canvas, item, "<Button-3>", callPopup(i, 
                      nodePopupMenu))
                  else tkitembind(canvas, item, "<Button-3>", 
                    callPopupNode(vertex, i, vertex.type, UserNodePopupItems))
                  tkaddtag(canvas, tag, "withtag", item)
                }
                if (initial.set.popups) {
                  nodePopupMenu <- tkmenu(canvas, tearoff = FALSE)
                  addNodePopups(vertex, i, vertex.type, nodePopupMenu, 
                    UserNodePopupItems)
                }
                if (vertex.type == "OpenBlock") {
                  blockitembind(label, label = TRUE)
                  if (!is.null(result)) 
                    if (length(result) > 0) 
                      for (k in seq(length(result))) blockitembind(result[[k]])
                }
                else {
                  f(label, i, TRUE)
                  if (!is.null(result$dynamic)) 
                    if (length(result$dynamic) > 0) 
                      for (k in seq(length(result$dynamic))) f(result$dynamic[[k]], 
                        i, FALSE)
                  if (!is.null(result$fixed)) 
                    if (length(result$fixed) > 0) 
                      for (k in seq(length(result$fixed))) f(result$fixed[[k]], 
                        i, FALSE)
                }
            }
            "subDrawVertex" <- function(vertex, i, w = control$w, 
                vertexcolor = vertexcolor, vertex.type = ifelse(i > 
                  0, "Vertex", "Factor"), setTag = TRUE) {
                tag <- getTag(vertex.type, i, setTag = setTag)
                pos <- retVertexPos(i, vertex.type)
                if (hasMethod("draw", class(vertex))) 
                  dot <- draw(vertex, canvas, pos, x = pos[1], 
                    y = pos[2], stratum = retStratum(i, vertex.type = vertex.type), 
                    w = w * Scale, color = vertexcolor, background = control$background)
                else {
                  s <- w * sqrt(4/pi) * Scale
                  p <- tkcreate(canvas, "oval", pos[1] - s, pos[2] - 
                    s, pos[1] + s, pos[2] + s, fill = vertexcolor, 
                    activefill = "OrangeRed")
                  dot <- list(dynamic = list(p), fixed = NULL)
                }
                label <- tkcreate(canvas, "text", pos[1] + w, 
                  pos[2], text = retVertexLabel(i, vertex.type), 
                  anchor = "nw", font = font.vertex.label, activefill = "DarkSlateGray")
                if (control$debug.strata && (vertex.type != "Factor") && 
                  (vertex.type != "Extra")) {
                  strata <- retStratum(i, vertex.type)
                  block <- retBlockIndex(i, vertex.type)
                  color <- myColor(strata)
                  numbers <- tkcreate(canvas, "text", pos[1] - 
                    4 * w, pos[2] - 4 * w, text = paste(i, strata, 
                    block, sep = "."), fill = color, anchor = "nw", 
                    font = "12x30", activefill = "DarkSlateGray")
                  tkaddtag(canvas, tag, "withtag", numbers)
                }
                else numbers <- NULL
                if (vertex.type != "OpenBlock") 
                  setBindNode(canvas, vertex, tag, dot, label, 
                    i, vertex.type, control$UserMenus)
                else setBindNode(canvas, vertex, tag, dot, label, 
                  i, vertex.type, control$UserMenus)
                return(list(tag = tag, dot = dot, label = label, 
                  numbers = numbers))
            }
            "drawVertex" <- function(i, w = control$w, vertexcolor = vertexcolor, 
                vertex.type = ifelse(i > 0, "Vertex", "Factor"), 
                setTag = TRUE) {
                if (vertex.type == "ClosedBlock") 
                  itemsClosedBlocks[[i]] <<- subDrawVertex(blockList[[i]], 
                    i, w = w, vertexcolor = vertexcolor, vertex.type = vertex.type, 
                    setTag = setTag)
                else if (vertex.type == "Vertex") 
                  itemsVertices[[i]] <<- subDrawVertex(vertexList[[i]], 
                    i, w = w, vertexcolor = vertexcolor, vertex.type = vertex.type, 
                    setTag = setTag)
                else if (vertex.type == "Factor") 
                  itemsFactors[[-i]] <<- subDrawVertex(dg@factorVertexList[[-i]], 
                    i, w = w, vertexcolor = vertexcolor, vertex.type = vertex.type, 
                    setTag = setTag)
                else if (vertex.type == "Extra") 
                  itemsExtras[[i]] <<- subDrawVertex(dg@extraList[[i]], 
                    i, w = w, vertexcolor = vertexcolor, vertex.type = vertex.type, 
                    setTag = setTag)
            }
            "clearSelectedVertices" <- function() {
                if (length(selectedNodes) > 0) {
                  lapply(selectedNodes, function(k) setVertexColor(k$index, 
                    color = "red", vertex.type = k$node.type))
                  selectedNodes <<- list()
                }
            }
            "setActivatedVertex" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor"), hit.type = "none") {
                if (hit.type == "none") 
                  activatedNode <<- list(number = i, vertex.type = vertex.type)
                if (!((i == 0) && (hit.type == "none"))) {
                  a <- list(index = i, node.type = vertex.type, 
                    hit.type = hit.type)
                  if (!any(unlist(lapply(selectedNodes, function(i) all(unlist(i) == 
                    unlist(a)))))) 
                    selectedNodes <<- append(list(a), selectedNodes)
                }
            }
            "retActivatedVertex" <- function() return(activatedNode[[1]])
            "retActivatedVertexVertex.Type" <- function() return(activatedNode[[2]])
            "deActivateVertex" <- function(i, color = retVertexColor(i, 
                vertex.type), vertex.type = ifelse(i > 0, "Vertex", 
                "Factor"), new.edge = FALSE) {
                if (length(selectedNodes) > 0) {
                  same <- (retActivatedVertex() == i)
                  x <- lapply(selectedNodes, function(k) if ((k$index == 
                    i) && (k$node.type == vertex.type) && ((new.edge && 
                    (k$hit.type == "none")) || (!new.edge) || 
                    same)) {
                    setVertexColor(i, color = color, vertex.type = vertex.type)
                    return(TRUE)
                  }
                  else return(FALSE))
                  selectedNodes <<- selectedNodes[!unlist(x)]
                }
                if ((retActivatedVertex() == i) && (retActivatedVertexVertex.Type() == 
                  vertex.type)) {
                  setActivatedVertex(0, "Null")
                  setVertexColor(i, color = color, vertex.type = vertex.type)
                  return(TRUE)
                }
                else return(FALSE)
            }
            "subActivateVertex" <- function(i, color = "green", 
                vertex.type = ifelse(i > 0, "Vertex", "Factor"), 
                hit.type = "none", new.edge = FALSE) {
                if (!(hit.type == "none")) {
                  setActivatedVertex(i, vertex.type, hit.type = hit.type)
                  setVertexColor(i, color = color, vertex.type = vertex.type)
                  return(TRUE)
                }
                else if (!deActivateVertex(i, "cyan", vertex.type, 
                  new.edge = new.edge)) 
                  if ((retActivatedVertex() == 0) && (vertex.type != 
                    "Extra")) {
                    setActivatedVertex(i, vertex.type)
                    setVertexColor(i, color = color, vertex.type = vertex.type)
                    return(TRUE)
                  }
                  else return(FALSE)
                else return(TRUE)
            }
            "activateVertex" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor"), color = "green", hit.type = "none") {
                force(i)
                force(vertex.type)
                force(hit.type)
                force(color)
                function(...) subActivateVertex(i, color = color, 
                  vertex.type = vertex.type, hit.type = hit.type)
            }
            "clearSelectedEdges" <- function() {
                if (length(selectedEdges) > 0) {
                  lapply(selectedEdges, function(k) setEdgeColor(k$index, 
                    color = NULL, edge.type = k$edge.type))
                  selectedEdges <<- list()
                }
            }
            "setActivatedEdge" <- function(i, from = -1, to = -1, 
                edge.type = ifelse(i > 0, "Edge", "Factor"), 
                hit.type = "none") {
                if (hit.type == "none") 
                  activatedEdge <<- list(number = i, edge.type = edge.type)
                if (!((i == 0) && (hit.type == "none"))) {
                  a <- list(index = i, from = from, to = to, 
                    edge.type = edge.type, hit.type = hit.type)
                  if (!any(unlist(lapply(selectedEdges, function(i) all(unlist(i) == 
                    unlist(a)))))) 
                    selectedEdges <<- append(list(a), selectedEdges)
                }
            }
            "subActivateEdge" <- function(i, from = -1, to = -1, 
                edge.type = "VertexEdge", color = "green", hit.type = "none") {
                if ((hit.type != "none")) {
                  setActivatedEdge(i, from = from, to = to, edge.type, 
                    hit.type = hit.type)
                  if (i > 0) 
                    setEdgeColor(i, edge.type = edge.type, color)
                }
                else {
                  if (activatedEdge$number > 0) {
                    setEdgeColor(activatedEdge$number, edge.type = activatedEdge$edge.type, 
                      color = NULL)
                    if ((i != 0) && (length(selectedEdges) > 
                      0)) {
                      same <- (retActivatedEdge() == i)
                      new.edge <- TRUE
                      x <- lapply(selectedEdges, function(k) if ((k$hit.type == 
                        "none")) {
                        if (k$index != 0) 
                          setEdgeColor(k$index, color = NULL, 
                            edge.type = k$edge.type)
                        return(TRUE)
                      }
                      else return(FALSE))
                      assign("x", x, pos = 1)
                      selectedEdges <<- selectedEdges[!unlist(x)]
                    }
                  }
                  setActivatedEdge(i, from = from, to = to, edge.type, 
                    hit.type = hit.type)
                  if (i > 0) 
                    setEdgeColor(i, edge.type = edge.type, "Green")
                }
            }
            "activateEdge" <- function(i, from = -1, to = -1, edge.type = "VertexEdge", 
                color = "green", hit.type = "none") {
                force(i)
                force(from)
                force(to)
                force(edge.type)
                force(hit.type)
                force(color)
                function(...) subActivateEdge(i, from = from, 
                  to = to, color = color, edge.type = edge.type, 
                  hit.type = hit.type)
            }
            "retActivatedEdge" <- function(edge.type = "VertexEdge") return(activatedEdge$number)
            "updateSelectedEdges" <- function(R, vertexEdges, edge.type = "VertexEdge", 
                setVertex = FALSE, updateBE = FALSE) {
                if (updateBE) {
                  updateBlockEdges()
                  sinkBlockEdges()
                }
                if (is.element("dg", names(R))) 
                  ldg <- R$dg
                else ldg <- .newDgGraphEdges(vertexList = vertexList, 
                  visibleVertices = R$VisibleVertices, visibleBlocks = R$VisibleBlocks, 
                  edgeList = vertexEdges, blockList = blockList, 
                  factorVertexList = R$FactorVertices, factorEdgeList = R$FactorEdges, 
                  extraList = R$ExtraVertices, extraEdgeList = R$ExtraEdges)
                setModel(R$object, dg = ldg, txt = "updateSelectedEdges", 
                  RR = R)
                activateEdge(0, edge.type = NULL)()
                if (setVertex) 
                  setActivatedVertex(0, "Vertex")
                clearSelectedVertices()
                clearSelectedEdges()
                clearFactorEdges()
                clearExtraEdges()
                update.edge.labels()
                if (!is.null(ldg@factorVertexList) && !is.null(ldg@factorEdgeList)) 
                  drawFactors(ldg@factorEdgeList, ldg@factorVertexList)
            }
            "drawResult" <- function(newEdges, R, slave, txt, Arguments = Args()) {
                Edges <- extractEdgesResult(R, newEdges, TRUE, 
                  txt)
                if (is.null(Edges)) 
                  Edges <- new("dg.VertexEdgeList")
                if (is.element("dg", names(R))) {
                  ldg <- R$dg
                }
                else {
                  ldg <- .newDgGraphEdges(vertexList = vertexList, 
                    visibleVertices = R$VisibleVertices, visibleBlocks = R$VisibleBlocks, 
                    edgeList = Edges, blockList = blockList, 
                    blockEdgeList = R$BlockEdges, factorVertexList = R$FactorVertices, 
                    factorEdgeList = R$FactorEdges, extraList = R$ExtraVertices, 
                    extraEdgeList = R$ExtraEdges)
                }
                if (any(slotNames(R$object) == ".title"))
                  newtitle <- R$object@.title
                else
                  newtitle <- dgm.frameModels@label
                if (slave) {
                  drawModel(frameModels = dgm.frameModels,
                  # frameViews = dm.frameViews, 
                    graphWindow = NULL, dg = ldg, object = R$object, 
                    title = newtitle, control = control, Arguments = Arguments)
                }
                else {
                  tktitle(GW.top) <- newtitle
                  setModel(R$object, dg = ldg, txt = txt, RR = R)
                  redrawView(frameModels = dgm.frameModels, frameViews = dm.frameViews, 
                    graphWindow = GraphWindow, dg = ldg,
                    control = control, Arguments = Arguments)
                }
            }
            "updateNode" <- function(i, vertex.type = "Vertex", 
                items = itemsVertices, ii = i, pos = retVertexPos(ii, 
                  vertex.type), redrawVertices = TRUE) {
                update <- FALSE
                update.edges <- FALSE
                if (redrawVertices) {
                  tkdelete(canvas, vertexItem(ii, vertex.type = vertex.type)$tag)
                  drawVertex(ii, w = control$w, vertexcolor = control$vertexColor, 
                    vertex.type = vertex.type, setTag = FALSE)
                  vertexColor <- retVertexColor(ii, vertex.type = vertex.type)
                  setVertexColor(ii, color = vertexColor, vertex.type = vertex.type)
                }
                else {
                  xy <- tkcoords(canvas, items[[i]]$tag)
                  xy <- apply(matrix(as.numeric(xy), ncol = 2, 
                    byrow = 2), 2, mean)
                  if (!(all(is.na(xy)))) {
                    update <- TRUE
                    if (!any(is.nan(xy)) && (length(xy) > 0)) {
                      dxy <- findDifference(pos, c(xy, rep(0, 
                        local.N - 2)))
                      ll <- sum(dxy[1:2]^2)
                      if ((vertex.type == "Vertex") || (vertex.type == 
                        "ClosedBlock")) 
                        if (is.numeric(ll)) {
                          if ((length(ll) > 0) && (ll > 0)) 
                            update.edges <- TRUE
                        }
                        else message(paste("Invalid length: ", 
                          ll))
                      tkmove(canvas, items[[i]]$tag, dxy[1], 
                        dxy[2])
                    }
                    if (vertex.type == "ClosedBlock") {
                      posLabel <- pos + retBlockLabelPos(ii)
                      tkcoords(canvas, items[[i]]$label, posLabel[1], 
                        posLabel[2])
                      tkitemconfigure(canvas, items[[i]]$label, 
                        text = retVertexLabel(i, vertex.type = vertex.type))
                    }
                    else {
                      posLabel <- retLabelPos(ii, vertex.type = vertex.type)
                      xyl <- as.numeric(tkcoords(canvas, items[[i]]$l))
                      tkitemconfigure(canvas, items[[i]]$l, text = retVertexLabel(ii, 
                        vertex.type = vertex.type))
                      vertexColor <- retVertexColor(ii, vertex.type = vertex.type)
                      setVertexColor(ii, color = vertexColor, 
                        vertex.type = vertex.type)
                      if (!any(is.nan(xyl)) && (length(xyl) > 
                        0)) {
                        dxy <- findDifference(posLabel, c(xyl, 
                          rep(0, local.N - 2)))
                        tkmove(canvas, items[[i]]$l, dxy[1], 
                          dxy[2])
                      }
                    }
                  }
                }
                return(list(update = update, update.edges = update.edges))
            }
            "subUpdatePanel" <- function() {
                if (control$variableFrame) {
                  if ((get("type", GW.top$env$box$env) == "variableList")) {
                  }
                  else {
                    tkinsert.blockList(GW.top$env$box, blockList, 
                      delete = TRUE)
                    tkinsert.blockList(GW.top$env$box, blockList, 
                      delete = FALSE)
                  }
                }
            }
            "subUpdateGraphWindow" <- function(txt = "", redrawVertices = FALSE, 
                raiseEdges = FALSE, updateEdges = FALSE, all.blockframes = FALSE, 
                blockframes = NULL) {
                if (control$debug.update) 
                  print(paste("subUpdateGraphWindow:", txt, " (0)", 
                    getLabel()))
                if (control$variableFrame) 
                  subUpdatePanel()
                pos <- NULL
                update.edges <- TRUE
                if (!.IsEmpty(blockList)) 
                  for (i in seq(along = blockList)) {
                    if ((closedBlock[i] || hiddenBlock[i]) && 
                      (i %in% dg@visibleBlocks)) {
                      if (all(positionsClosedBlocks[i, ] < rep(-100, 
                        local.N))) {
                        deleteBlock(i)
                        visible.Blocks <- returnVisibleBlocks()
                        visible.Blocks <- visible.Blocks[visible.Blocks != 
                          i]
                        setVisibleBlocks(visible.Blocks)
                        openBlock(i, update = FALSE)()
                      }
                      else {
                        pos <- retVertexPos(i, "ClosedBlock")
                        update.edges <- updateEdges || is.element(i, 
                          blockframes)
                        if (!hiddenBlock[i] && !is.null(itemsClosedBlocks[[i]])) {
                          R <- updateNode(i, vertex.type = "ClosedBlock", 
                            items = itemsClosedBlocks)
                          update.edges <- update.edges | R$update.edges
                        }
                      }
                      if (!is.null(pos) && !is.null(dg@blockEdgeList)) 
                        if ((update.edges || raiseEdges) && (length(itemsBlockEdges[[i]]) > 
                          0)) 
                          for (e in itemsBlockEdges[[i]]) if (!(is.null(e))) 
                            if (TRUE) 
                              setEdgeCoords(e, edge.type = "BlockEdge", 
                                f = i, posFrom = pos, from.type = vertexTypeOfEdge(-i, 
                                  e$type), raise = FALSE, setEdgeLabel = FALSE)
                    }
                    else if (all.blockframes || (is.element(i, 
                      blockframes))) {
                      if (all(positionsClosedBlocks[i, ] < rep(-100, 
                        local.N))) {
                        deleteBlock(i)
                      }
                      else {
                        tkitemconfigure(canvas, itemsOpenBlocks[[i]]$label, 
                          text = retVertexLabel(i, vertex.type = "ClosedBlock"))
                        tkcoordsBlock(i, lower = FALSE)
                      }
                    }
                  }
                if (!is.null(itemsExtras)) 
                  for (i in seq(along = itemsExtras)) if (!is.null(itemsExtras[[i]]) && 
                    !is.null(itemsExtras[[i]][[1]])) {
                    updateNode(i, vertex.type = "Extra", items = itemsExtras, 
                      redrawVertices = redrawVertices)
                    if (!is.null(pos) && (update.edges || raiseEdges) && 
                      (length(itemsExtraEdges[[i]]) > 0)) 
                      for (e in itemsExtraEdges[[i]]) if (!(is.null(e))) 
                        if (TRUE) 
                          setEdgeCoords(e, edge.type = "ExtraEdge", 
                            f = -i, posFrom = pos)
                  }
                if (!is.null(itemsFactors)) 
                  for (i in seq(along = itemsFactors)) if (!is.null(itemsFactors[[i]]) && 
                    !is.null(itemsFactors[[i]][[1]])) {
                    vertex.indices <- dg@factorVertexList[[i]]@vertex.indices
                    setFactorVertexPosition(i, vertex.indices)
                    updateNode(i, vertex.type = "Factor", items = itemsFactors, 
                      ii = -i, redrawVertices = redrawVertices)
                  }
                for (i in seq(along = itemsVertices)) if (!is.null(itemsVertices[[i]]) && 
                  !is.null(itemsVertices[[i]][[1]])) {
                  pos <- retVertexPos(i, "Vertex")
                  update.edges <- updateEdges || redrawVertices
                  if (!closedVertex[i]) {
                    R <- updateNode(i, pos = pos, redrawVertices = redrawVertices)
                    update.edges <- update.edges || R$update.edges
                    if (R$update && !redrawVertices) {
                      if (control$debug.strata) {
                        strata <- retStratum(i, vertex.type = "Vertex")
                        block <- retBlockIndex(i, vertex.type = "Vertex")
                        color <- myColor(strata)
                        tkitemconfigure(canvas, itemsVertices[[i]]$numbers, 
                          text = paste(i, strata, block, sep = "."))
                        tkitemconfigure(canvas, itemsVertices[[i]]$numbers, 
                          fill = color)
                      }
                    }
                  }
                  else update.edges <- TRUE
                  if (!is.null(pos) && (update.edges || raiseEdges) && 
                    (length(itemsEdges[[i]]) > 0)) 
                    for (e in itemsEdges[[i]]) if (!(is.null(e))) 
                      if (TRUE) 
                        setEdgeCoords(e, edge.type = "vertexEdge", 
                          f = i, posFrom = pos)
                }
            }
            "setUpdateVertices" <- function(txt = "") {
                updateCountVerticesMain <<- updateCountVerticesMain + 
                  1
                updateCountVertices <<- updateCountVerticesMain
            }
            "setUpdatePositions" <- function(txt = "") {
                updateCountPositionsMain <<- updateCountPositionsMain + 
                  1
                updateCountPositions <<- updateCountPositionsMain
            }
            "setUpdateBlocks" <- function(txt = "") {
                updateCountBlocksMain <<- updateCountBlocksMain + 
                  1
                updateCountBlocks <<- updateCountBlocksMain
            }
            "setUpdateBlockEdges" <- function(txt = "", local = TRUE) {
                updateCountBlockEdgesMain <<- updateCountBlockEdgesMain + 
                  1
                if (!local) 
                  updateCountBlockEdges <<- updateCountBlockEdgesMain
            }
            "setUpdateAll" <- function(txt = "") {
                updateCountVerticesMain <<- updateCountVerticesMain + 
                  1
                updateCountPositionsMain <<- updateCountPositionsMain + 
                  1
                updateCountBlocksMain <<- updateCountBlocksMain + 
                  1
                updateCountBlockEdgesMain <<- updateCountBlockEdgesMain + 
                  1
                updateCountVertices <<- updateCountVerticesMain
                updateCountPositions <<- updateCountPositionsMain
                updateCountBlocks <<- updateCountBlocksMain
                updateCountBlockEdges <<- updateCountBlockEdgesMain
            }
            "subUpdatePositions" <- function(txt = "") {
                if (updateWindow) {
                  testUpdateModel()
                  n <- length(vertexList)
                  m <- length(itemsVertices)
                  if (n > m) 
                    for (i in seq(n - m)) {
                      closedVertex <<- c(closedVertex, FALSE)
                      itemsVertices <<- append(itemsVertices, 
                        list(NULL))
                      itemsEdges <<- append(itemsEdges, list(NULL))
                    }
                  n <- length(blockList)
                  m <- length(itemsClosedBlocks)
                  if (n > m) {
                    for (i in seq(n - m)) {
                      itemsBlockEdges <<- append(itemsBlockEdges, 
                        list(NULL))
                      itemsClosedBlocks <<- append(itemsClosedBlocks, 
                        list(NULL))
                      itemsOpenBlocks <<- append(itemsOpenBlocks, 
                        list(NULL))
                      closedBlock <<- c(closedBlock, FALSE)
                      hiddenBlock <<- c(hiddenBlock, FALSE)
                      openTreeBlock <<- c(openTreeBlock, FALSE)
                      dg@visibleBlocks <- unique(sort(c(dg@visibleBlocks, 
                        m + i)))
                      dg@visibleBlocks <<- dg@visibleBlocks[dg@visibleBlocks != 
                        0]
                    }
                    Arguments <- Args()
                    redrawView(frameModels = dgm.frameModels, 
                      frameViews = dm.frameViews, graphWindow = GraphWindow, 
                      dg = dg, control = control, Arguments = Arguments)
                  }
                  all.blockframes <- updateCountBlocks < updateCountBlocksMain
                  updateEdges <- updateCountBlockEdges < updateCountBlockEdgesMain
                  updateVertices <- updateCountVertices < updateCountVerticesMain
                  updatePositions <- updateCountPositions < updateCountPositionsMain
                  if (updateCountBlockEdges < updateCountBlockEdgesMain) 
                    updateAllBlockIndices()
                  if (updatePositions || updateVertices || updateEdges || 
                    all.blockframes) 
                    subUpdateGraphWindow(txt, updateEdges = updateEdges, 
                      redrawVertices = updateVertices, all.blockframes = all.blockframes)
                  if (updateEdges) 
                    updateBlockEdges()
                  updateCountVertices <<- updateCountVerticesMain
                  updateCountPositions <<- updateCountPositionsMain
                  updateCountBlocks <<- updateCountBlocksMain
                  updateCountBlockEdges <<- updateCountBlockEdgesMain
                }
            }
            "updatePositions" <- function(txt = "") {
                force(txt)
                function(...) {
                  subUpdatePositions(txt)
                }
            }
            "tkdeleteRectangleCorner" <- function(line) {
                tkdelete(canvas, line[[1]])
                tkdelete(canvas, line[[2]])
                if (!is.null(transformation)) 
                  tkdelete(canvas, line[[3]])
            }
            "tkdeleteRectangle" <- function(rectangle) {
                line <- rectangle$Lines
                tkdelete(canvas, line[[1]])
                tkdelete(canvas, line[[2]])
                tkdelete(canvas, line[[3]])
                tkdelete(canvas, line[[4]])
                if (!is.null(transformation)) {
                  tkdelete(canvas, line[[5]])
                  tkdelete(canvas, line[[6]])
                  tkdelete(canvas, line[[7]])
                  tkdelete(canvas, line[[8]])
                  tkdelete(canvas, line[[9]])
                  tkdelete(canvas, line[[10]])
                  tkdelete(canvas, line[[11]])
                  tkdelete(canvas, line[[12]])
                }
                corner <- rectangle$Corners
                tkdeleteRectangleCorner(corner[[1]])
                tkdeleteRectangleCorner(corner[[2]])
                tkdeleteRectangleCorner(corner[[3]])
                tkdeleteRectangleCorner(corner[[4]])
                if (!is.null(transformation)) {
                  tkdeleteRectangleCorner(corner[[5]])
                  tkdeleteRectangleCorner(corner[[6]])
                  tkdeleteRectangleCorner(corner[[7]])
                  tkdeleteRectangleCorner(corner[[8]])
                }
            }
            "tkdeleteBar" <- function(line) {
                tkdelete(canvas, line[[1]])
                tkdelete(canvas, line[[2]])
                tkdelete(canvas, line[[3]])
                tkdelete(canvas, line[[4]])
            }
            "deleteBlock" <- function(i) {
                tkdeleteRectangle(openBlockItem(i)$rectangle)
                tkdeleteBar(openBlockItem(i)$bar)
                tkdelete(canvas, openBlockItem(i)$label)
                if (!is.null(openBlockItem(i)$canvas)) 
                  tkdelete(canvas, openBlockItem(i)$canvas)
            }
            "subSubDeleteEdge" <- function(i, f, t, edge.type = "VertexEdge") {
                E <- getEdges(edge.type = edge.type)[[i]]
                "delete" <- function(k, edges) {
                  edges <- edgeItem(k, edge.type = edge.type)
                  if (length(edges) > 0) 
                    for (e in edges) if (!(is.null(e))) 
                      if ((e$nr == i) && (e$type == edge.type)) 
                        if (e$to > k) {
                          if (control$debug.edges) {
                            cat("Tkdelete, subSubDeleteEdge: ")
                            for (l in 1:length(e$edges)) cat(paste(e$edges[[l]], 
                              " "))
                            for (l in 1:length(e$tags)) cat(paste(e$tags[[l]], 
                              " "))
                            cat(paste(e$label))
                            cat("\n")
                          }
                          for (l in 1:length(e$edges)) tkdelete(canvas, 
                            e$edges[[l]])
                          for (l in 1:length(e$tags)) tkdelete(canvas, 
                            e$tags[[l]])
                          tkdelete(canvas, e$label)
                        }
                }
                for (j in E@vertex.indices) delete(j, edgeItem(j, 
                  edge.type = edge.type))
                "remove" <- function(k, edges) if (length(edges) > 
                  0) {
                  result <- NULL
                  for (e in edges) if (!(is.null(e))) 
                    if (!((e$nr == i) && (e$type == edge.type))) 
                      result <- c(result, list(e))
                  if (is.null(result)) 
                    setEdgeItem(k, edge.type = edge.type, list(NULL))
                  else setEdgeItem(k, edge.type = edge.type, 
                    result)
                }
                for (j in E@vertex.indices) remove(j, edgeItem(j, 
                  edge.type = edge.type))
            }
            "subSubUndisplayFactorVertex" <- function(i, edge.type = "FactorEdge") {
                edges <- edgeItem(i, edge.type = edge.type)
                if (length(edges) > 0) 
                  for (e in edges) if (!(is.null(e))) {
                    subSubDeleteEdge(e$nr, i, e$to, edge.type = edge.type)
                    clearEdge(e$nr, edge.type = edge.type)
                  }
                visible.Vertices <- returnVisibleVertices()
                visible.Vertices <- visible.Vertices[visible.Vertices != 
                  i]
                setVisibleVertices(visible.Vertices)
                tkdelete(canvas, vertexItem(i)$tag)
                setVertexItem(i, list(NULL))
            }
            "clearFactorEdges" <- function() {
                for (f in seq(along = itemsFactors)) subSubUndisplayFactorVertex(-f)
            }
            "clearExtraEdges" <- function() {
            }
            "setVisibleVertices" <- function(i) {
                dg@visibleVertices <<- i
                GraphWindow@dg@visibleVertices <<- dg@visibleVertices
            }
            "returnVisibleVertices" <- function() {
                return(dg@visibleVertices)
            }
            "setVisibleBlocks" <- function(i) {
                dg@visibleBlocks <<- i
                GraphWindow@dg@visibleBlocks <<- dg@visibleBlocks
            }
            "returnVisibleBlocks" <- function() {
                return(dg@visibleBlocks)
            }
            "subSubUndisplayVertex" <- function(i, edge.type = "VertexEdge") {
                if (control$debug.position) 
                  print(paste("subSubUndisplayVertex", i, edge.type))
                edges <- edgeItem(i, edge.type = edge.type)
                if (length(edges) > 0) 
                  for (e in edges) if (!(is.null(e))) 
                    if ((e$type == edge.type)) {
                      subSubDeleteEdge(e$nr, i, e$to, edge.type = edge.type)
                      clearEdge(e$nr, edge.type = edge.type)
                    }
                visible.Vertices <- returnVisibleVertices()
                visible.Vertices <- visible.Vertices[visible.Vertices != 
                  i]
                setVisibleVertices(visible.Vertices)
                tkdelete(canvas, vertexItem(i)$tag)
                setVertexItem(i, list(NULL))
                if (control$variableFrame) {
                }
            }
            "update.edge.labels" <- function() {
                "subUpdateEdgeLabels" <- function(itemsNodes, edge.type = "VertexEdge") 
                  for (f in seq(along = itemsNodes)) 
                    if (!is.null(itemsNodes[[f]]) && !is.null(itemsNodes[[f]][[1]])) {
                  if (edge.type != "VertexEdge") 
                    f <- -f
                  edges <- edgeItem(f, edge.type = edge.type)
                  if (length(edges) > 0) 
                    for (e in edges) if (!(is.null(e))) 
                      if (e$to < f) {
                        display <- displayEdge(f, e$to, edgeNode = e)
                        if (!is.na(control$namesOnEdges) && control$namesOnEdges && 
                          display) {
                          vertexnames <- c(retVertexName(f, vertexTypeOfEdge(f, 
                            e$type)), retVertexName(e$to, vertexTypeOfEdge(e$to, 
                            e$type)))
                          if (e$reverse) 
                            vertexnames <- rev(vertexnames)
                          label <- paste(vertexnames, collapse = "~")
                        }
                        else label <- ""
                        setEdgeLabel(e, label, e$label.number, 
                          f = f, permanent = TRUE)
                        setEdgeWidth(e, 2, e$label.number, f = f)
                      }
                }
                if (control$updateEdgeLabels) {
                  subUpdateEdgeLabels(itemsVertices, edge.type = "VertexEdge")
                  subUpdateEdgeLabels(itemsFactors, edge.type = "FactorEdge")
                  subUpdateEdgeLabels(itemsExtras, edge.type = "ExtraEdge")
                  subUpdateEdgeLabels(itemsClosedBlocks, edge.type = "BlockEdge")
                }
                if (!is.na(control$namesOnEdges) && !control$namesOnEdges) {
                  for (i in seq(along = GraphWindow@dg@edgeList)) 
                    label(GraphWindow@dg@edgeList[[i]]) <<- ""
                  for (i in seq(along = GraphWindow@dg@factorEdgeList)) 
                    label(GraphWindow@dg@factorEdgeList[[i]]) <<- ""
                  for (i in seq(along = GraphWindow@dg@extraEdgeList)) 
                    label(GraphWindow@dg@extraEdgeList[[i]]) <<- ""
                  for (i in seq(along = GraphWindow@dg@blockEdgeList)) 
                    label(GraphWindow@dg@blockEdgeList[[i]]) <<- ""
                }
            }
            "updateBlockEdges" <- function() {
                Edges <- selectCurrentEdges(omitEdges = FALSE, 
                  edge.type = "VertexEdge")
                edge.list <- lapply(Edges, function(i) i@vertex.indices)
                sinkVertexList()
                NewBlockEdges <- returnBlockEdgeList(edge.list, 
                  vertexList, blockList, color = control$blockEdgeColor, 
                  visibleBlocks = dg@visibleBlocks, oriented = dg@oriented)
                new.list <- lapply(NewBlockEdges, function(i) {
                  x <- i@vertex.indices
                  names(x) <- NULL
                  x
                })
                old.list <- lapply(getEdges(edge.type = "BlockEdge"), 
                  function(i) {
                    x <- i@vertex.indices
                    names(x) <- NULL
                    x
                  })
                match.old.new <- match(old.list, new.list)
                for (i in seq(along = match.old.new)) if (is.na(match.old.new[i])) 
                  if (all(abs(old.list[[i]]) > 0)) {
                    subSubDeleteEdge(i, old.list[[i]][1], old.list[[i]][2], 
                      edge.type = "BlockEdge")
                    clearEdge(i, edge.type = "BlockEdge")
                  }
                match.new.old <- match(new.list, old.list)
                for (i in seq(along = match.new.old)) if (is.na(match.new.old[i])) {
                  E <- append.edge(NewBlockEdges[[i]], edge.type = "BlockEdge")
                  drawEdge(E[[length(E)]], length(E), lower = TRUE, 
                    edge.type = "BlockEdge")
                }
            }
            "deleteAllEdgeLabels" <- function(permanent = TRUE) {
                function(...) {
                  "g" <- function(items, edge.type = "VertexEdge") 
                    for (f in seq(along = items)) 
                      if (TRUE || !is.null(items[[f]]) && !is.null(items[[f]][[1]])) {
                    ff <- ifelse(edge.type == "VertexEdge", f, 
                      -f)
                    if (control$debug.edges) 
                      cat(paste(edge.type, f, ff, ": "))
                    edges <- edgeItem(ff, edge.type = edge.type)
                    if (length(edges) > 0) 
                      for (e in edges) if (!(is.null(e))) {
                        if (control$debug.edges) 
                          cat(paste(" ", e$to))
                        if ((e$to < f) || ((ff < 0))) {
                          setEdgeLabel(e, "", e$label.number, 
                            f = ff, permanent = permanent)
                          setEdgeWidth(e, 2, e$label.number, 
                            f = ff)
                        }
                      }
                    if (control$debug.edges) 
                      cat("\n")
                  }
                  g(itemsVertices, edge.type = "VertexEdge")
                  g(itemsClosedBlocks, edge.type = "BlockEdge")
                  g(itemsFactors, edge.type = "FactorEdge")
                  g(itemsExtras, edge.type = "ExtraEdge")
                }
            }
            "moveEdgesToVertex" <- function(X, v, edge.type = "VertexEdge") {
                edges <- edgeItem(v, edge.type = edge.type)
                if (length(edges) > 0) 
                  for (e in edges) if (!(is.null(e))) 
                    setEdgeCoords(e, edge.type = "vertexEdge", 
                      f = v, posFrom = X, raise = FALSE, setEdgeLabel = FALSE)
            }
            "moveVerticesInBlock" <- function(i, dxy, move.vertices = TRUE) {
                for (v in seq(along = vertexList)) 
                  if (is.element(v, dg@visibleVertices)) {
                  blockIndex <- retBlockIndex(v, vertex.type = "Vertex")
                  if ((blockIndex > 0) && (blockReferences[blockIndex] == i)) {
                    if (move.vertices) {
                      if (changeVertexPos(v, dxy)) 
                        if (!closedVertex[v]) 
                          tkmove(canvas, vertexItem(v)$tag, dxy[1], 
                            dxy[2])
                    }
                    pos <- retVertexPos(v, "Vertex")
                    moveEdgesToVertex(pos, v, edge.type = "VertexEdge")
                  }
                }
            }
            "subMoveVertex" <- function(i, vertex.type, posFrom, posTo) {
                dxy <- findDifference(posTo, posFrom)
                tag <- vertexItem(i, vertex.type)$tag
                if (setVertexPos(i, posTo, dxy, vertex.type)) {
                  tkmove(canvas, tag, dxy[1], dxy[2])
                  tkitemraise(canvas, tag)
                  if (control$debug.strata && (vertex.type != 
                    "Factor") && (vertex.type != "Extra") && 
                    (vertex.type != "ClosedBlock")) {
                    strata <- retStratum(i, vertex.type)
                    block <- retBlockIndex(i, vertex.type)
                    color <- myColor(strata)
                    tkitemconfigure(canvas, itemsVertices[[i]]$numbers, 
                      text = paste(i, strata, block, sep = "."))
                    tkitemconfigure(canvas, itemsVertices[[i]]$numbers, 
                      fill = color)
                  }
                  if (vertex.type == "ClosedBlock") {
                    moveVerticesInBlock(i, dxy, move.vertices = FALSE)
                    moveEdgesToVertex(posTo, -i, edge.type = "BlockEdge")
                  }
                  else if (vertex.type == "Vertex") {
                    if (closedVertex[i]) 
                      posTo <- retVertexPos(i, "Vertex")
                    moveEdgesToVertex(posTo, i, edge.type = "VertexEdge")
                  }
                  else if (vertex.type == "Extra") {
                    posTo <- retVertexPos(i, vertex.type)
                    moveEdgesToVertex(posTo, -i, edge.type = "ExtraEdge")
                  }
                  else if (vertex.type == "Factor") {
                    moveEdgesToVertex(posTo, i, edge.type = "FactorEdge")
                  }
                  else {
                    posTo <- retVertexPos(i, vertex.type)
                    moveEdgesToVertex(posTo, i, edge.type = "VertexEdge")
                  }
                }
            }
            "setFactorVertexPosition" <- function(i, vertex.indices) {
                if (!dg@factorVertexList[[abs(i)]]@fixed.positions) {
                  posFrom <- retVertexPos(-i, "Factor")
                  positions <- NULL
                  for (j in seq(along = vertex.indices)) if (vertex.indices[j] > 
                    0) 
                    positions <- rbind(positions, positionsVertices[vertex.indices[j], 
                      ])
                  position <- apply(positions, 2, mean)
                  posTo <- positionsCanvas(project(position))
                  subMoveVertex(-i, "Factor", posFrom, posTo)
                }
            }
            "moveFactorVertex" <- function(vertex) {
                if (!is.null(itemsFactors)) 
                  for (i in seq(along = itemsFactors)) if (!is.null(itemsFactors[[i]]) && 
                    !is.null(itemsFactors[[i]][[1]])) {
                    vertex.indices <- dg@factorVertexList[[i]]@vertex.indices
                    if (is.element(vertex, vertex.indices)) 
                      setFactorVertexPosition(i, vertex.indices)
                  }
            }
            "moveVertex" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                force(i)
                force(vertex.type)
                function(x, y) {
                  deActivateVertex(i, retVertexColor(i, vertex.type), 
                    vertex.type)
                  posFrom <- retVertexPos(i, vertex.type)
                  posTo <- replaceXY(x, y, posFrom)
                  subMoveVertex(i, vertex.type, posFrom, posTo)
                  moveFactorVertex(i)
                  setUpdatePositions("")
                }
            }
            "moveVertexLabel" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                force(i)
                force(vertex.type)
                function(x, y) {
                  deActivateVertex(i, retVertexColor(i, vertex.type), 
                    vertex.type)
                  if (vertex.type == "ClosedBlock") {
                    posFrom <- retVertexPos(i, vertex.type) + 
                      retBlockLabelPos(i)
                    X <- replaceXY(x, y, posFrom)
                    dxy <- findDifference(X, posFrom)
                    tkcoords(canvas, vertexItem(i, vertex.type)$label, 
                      x, y)
                    setLabelPos(i, X, dxy, vertex.type)
                  }
                  else {
                    posFrom <- retLabelPos(i, vertex.type)
                    X <- replaceXY(x, y, posFrom)
                    dxy <- findDifference(X, posFrom)
                    tkmove(canvas, vertexItem(i, vertex.type)$label, 
                      dxy[1], dxy[2])
                    setLabelPos(i, X, dxy, vertex.type)
                  }
                  setUpdatePositions("")
                }
            }
            "changeVertexLabel" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                force(i)
                force(vertex.type)
                function(...) {
                  ReturnVal <- modalDialog("Label Entry", "Enter new label", 
                    retVertexLabel(i, vertex.type), top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  setVertexLabel(i, ReturnVal, vertex.type)
                  setUpdatePositions("")
                }
            }
            "deleteVertexLabel" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                force(i)
                force(vertex.type)
                function(...) {
                  setVertexLabel(i, "", vertex.type)
                  setUpdatePositions("")
                }
            }
            "changeEdgeLabel" <- function(i, f, t, edge.type = "VertexEdge") {
                force(i)
                force(f)
                force(t)
                force(edge.type)
                function(...) {
                  if (retActivatedEdge() == i) {
                    edges <- edgeItem(f, edge.type = edge.type)
                    if (length(edges) > 0) 
                      for (e in edges) if (!(is.null(e))) 
                        if (e$nr == i) 
                          if (e$to == t) {
                            label <- paste(edge.names(i, edge.type = edge.type), 
                              collapse = "%")
                            ReturnVal <- modalDialog("Edge label Entry", 
                              "Enter new label", label, top = GW.top)
                            if (ReturnVal == "ID_CANCEL") 
                              return()
                            setEdgeLabel(e, ReturnVal, e$label.number, 
                              f = f, permanent = TRUE)
                          }
                  }
                }
            }
            "subDropVertex" <- function(i, vertex.type = "Vertex", 
                slave = TRUE, upd = TRUE) {
                if (control$debug.position) 
                  print(paste("subDropVertex", i, vertex.type))
                tkconfigure(canvas, cursor = "watch")
                tkfocus(GW.top)
                redraw <- FALSE
                if (!(dg@viewType == "Simple")) 
                  redraw <- TRUE
                vertexEdges <- copyCurrentEdges(omitEdges = vertex.in.edge(i, 
                  edge.type = "VertexEdge"), edge.type = "VertexEdge", 
                  copyProperties = FALSE)
                factorEdges <- copyCurrentEdges(omitEdges = vertex.in.edge(i, 
                  edge.type = "FactorEdge"), edge.type = "FactorEdge", 
                  copyProperties = FALSE)
                extraEdges <- copyCurrentEdges(omitEdges = vertex.in.edge(i, 
                  edge.type = "ExtraEdge"), edge.type = "ExtraEdge", 
                  copyProperties = FALSE)
                blockEdges <- copyCurrentEdges(omitEdges = vertex.in.edge(i, 
                  edge.type = "BlockEdge"), edge.type = "BlockEdge", 
                  copyProperties = FALSE)
                if (vertex.type == "selected") {
                  newEdges <- list(vertexEdges = vertexEdges, 
                    factorEdges = factorEdges, extraEdges = extraEdges, 
                    blockEdges = blockEdges)
                }
                else if (vertex.type == "Vertex") {
                  newEdges <- list(vertexEdges = vertexEdges, 
                    factorEdges = factorEdges, extraEdges = extraEdges, 
                    blockEdges = blockEdges)
                }
                else if (vertex.type == "Factor") 
                  newEdges <- list(vertexEdges = vertexEdges, 
                    factorEdges = factorEdges, extraEdges = NULL, 
                    blockEdges = NULL)
                else if (vertex.type == "Extra") 
                  newEdges <- list(vertexEdges = vertexEdges, 
                    factorEdges = NULL, extraEdges = extraEdges, 
                    blockEdges = NULL)
                else if (vertex.type == "closedBlock") 
                  newEdges <- list(vertexEdges = vertexEdges, 
                    factorEdges = NULL, extraEdges = NULL, blockEdges = NULL)
                if (vertex.type == "selected") {
                  redraw <- TRUE
                  message("Selected vertices not added to 'newEdges';")
                  message("Resulting edges should be returned from modifyModel!")
                }
                R <- NULL
                if (is.null(object)) 
                  R <- TRUE
                Arguments <- Args()
                visible.Vertices <- returnVisibleVertices()
                if (i != 0) 
                  visible.Vertices <- visible.Vertices[visible.Vertices != i]
                if (!is.null(object) && (control$hasMethods || 
                  hasMethod("modifyModel", class(object)))) {
                  if (i == 0) 
                    name <- ""
                  else name <- retVertexName(i, vertex.type)
                  R <- modifyModel(object, action = "dropVertex", 
                    name = name, index = i, type = vertex.type, 
                    newEdges = newEdges, visibleVertices = visible.Vertices, 
                    selectedNodes = selectedNodes, selectedEdges = selectedEdges, 
                    Arguments = Arguments)
                }
                if (!is.null(R)) {
                  objectAssign(R)
                  if (slave || redraw) 
                    drawResult(newEdges, R, slave, "dropVertex")
                  else {
                    if (any(slotNames(R$object) == ".title"))
                      tktitle(GW.top) <- R$object@.title
                    setVisibleVertices(visible.Vertices)
                    if (i != 0) 
                      subSubUndisplayVertex(i)
                    updateSelectedEdges(R, vertexEdges, edge.type = NULL)
                  }
                }
                else message("Null result in dropVertex")
                updateBlockEdges()
                tkconfigure(canvas, cursor = "arrow")
                if (control$variableFrame) {
                  index <- i
                  if ((get("type", GW.top$env$box$env) == "variableList")) {
                    if (!(slave || redraw)) {
                      tkdelete(GW.top$env$box, index - 1)
                      tkinsert(GW.top$env$box, index - 1, tdv(namesVertices[[index]]))
                    }
                    if (tkselectionForVisibleVertices) {
                      for (i in 1:length(vertexList)) {
                        tkselection.clear(GW.top$env$box, i - 1)
                      }
                      for (i in returnVisibleVertices()) {
                        tkselection.set(GW.top$env$box, i - 1)
                      }
                    }
                  }
                  else updateVertexInBlock(index, k = retStratum(index), 
                    visibleBefore = TRUE, visibleAfter = FALSE)
                }
            }
            "undisplayVertex" <- function(i, vertex.type = ifelse(i > 
                0, "Vertex", "Factor"), slave = TRUE) {
                force(i)
                force(slave)
                function(...) {
                  deActivateVertex(i, retVertexColor(i, vertex.type), 
                    vertex.type)
                  subDropVertex(i, vertex.type, slave)
                }
            }
            "undisplayBlock" <- function(i, descendants = TRUE, 
                slave = TRUE, update = TRUE) {
                "subUndisplayBlock" <- function(i) {
                  deleteBlock(i)
                  visible.Blocks <- returnVisibleBlocks()
                  visible.Blocks <- visible.Blocks[visible.Blocks != 
                    i]
                  setVisibleBlocks(visible.Blocks)
                }
                if (descendants) 
                  for (j in blockList[[i]]@descendants) if ((j != 
                    i) && (j != 0)) {
                    subUndisplayBlock(j)
                    if ((closedBlock[j] || hiddenBlock[j])) 
                      openBlock(j, update = FALSE)()
                  }
                subUndisplayBlock(i)
                if (update) 
                  subUpdateGraphWindow("undisplayBlock", raiseEdges = TRUE, 
                    updateEdges = TRUE)
            }
            "removeBlock" <- function(i, descendants = TRUE, slave = TRUE, 
                update = TRUE) {
                "subRemoveBlock" <- function(i) {
                  deleteBlock(i)
                  visible.Blocks <- returnVisibleBlocks()
                  visible.Blocks <- visible.Blocks[visible.Blocks != i]
                  setVisibleBlocks(visible.Blocks)
                  positionsBlocks[i, , 1] <<- rep(-1000, local.N)
                  positionsBlocks[i, , 2] <<- rep(-1000, local.N) + 1e-04
                  positionsClosedBlocks[i, ] <<- rep(-1000, local.N)
                }
                if (descendants) 
                  for (j in blockList[[i]]@descendants) if ((j != i) && (j != 0)) {
                    subRemoveBlock(j)
                    if ((closedBlock[j] || hiddenBlock[j])) 
                      openBlock(j, update = FALSE)()
                  }
                subRemoveBlock(i)
                V <- sinkVertexList()
                if (updateAllBlockIndices() || TRUE) 
                  setUpdateBlockEdges("removeBlock")
                subUpdateGraphWindow("removeBlock", redrawVertices = TRUE, 
                  raiseEdges = TRUE, updateEdges = TRUE, all.blockframes = TRUE)
                setUpdateAll("removeBlock")
            }
            "markVerticesOfBlock" <- function(i, descendants = TRUE, 
                slave = TRUE, update = TRUE) {
                "subMarkVerticesOfBlock" <- function(i) {
                  subActivateVertex(i, "ClosedBlock", hit.type = "Mark-2", 
                    color = "GreenYellow")
                  for (v in seq(along = vertexList)) if (is.element(v, 
                    dg@visibleVertices)) {
                    bi <- retBlockIndex(v, vertex.type = "Vertex")
                    if ((bi == i)) {
                      subActivateVertex(v, "Vertex", hit.type = "Mark-2", 
                        color = "GreenYellow")
                      vertices <<- c(vertices, v)
                    }
                  }
                }
                vertices <- numeric(0)
                if (descendants) 
                  for (j in blockList[[i]]@descendants) if ((j != 
                    i) && (j != 0)) {
                    subMarkVerticesOfBlock(j)
                  }
                subMarkVerticesOfBlock(i)
                return(vertices)
            }
            "moveEdge" <- function(i, f, t, edge.type = "VertexEdge") {
                force(i)
                force(f)
                force(t)
                force(edge.type)
                function(x, y) {
                  if (control$debug.position) 
                    print(paste("moveEdge", i, f, t, edge.type))
                  activateEdge(0, from = f, to = t, edge.type = edge.type)()
                  from.type <- vertexTypeOfEdge(f, edge.type)
                  to.type <- vertexTypeOfEdge(t, edge.type)
                  posFrom <- retVertexPos(f, from.type)
                  posTo <- retVertexPos(t, to.type)
                  pos <- (posFrom + posTo)/2
                  X <- replaceXY(x, y, pos)
                  dxy <- findDifference(X, pos)
                  if (sum(dxy^2) < 0.25^2 * sum((posFrom - posTo)^2)) {
                    "fun" <- function(ii, vertex.type, position) {
                      if (control$debug.position) 
                        print(paste("moveEdge, f", ii, vertex.type))
                      if (vertex.type == "ClosedBlock") {
                        if (setVertexPos(-ii, position + dxy, 
                          dxy, vertex.type = vertex.type)) 
                          if ((closedBlock[-ii]) || hiddenBlock[-ii]) 
                            tkmove(canvas, vertexItem(-ii, vertex.type = vertex.type)$tag, 
                              dxy[1], dxy[2])
                      }
                      else if (vertex.type == "Extra") {
                        if (setVertexPos(ii, position + dxy, 
                          dxy, vertex.type = vertex.type)) 
                          tkmove(canvas, vertexItem(ii, vertex.type = vertex.type)$tag, 
                            dxy[1], dxy[2])
                      }
                      else if (!closedVertex[ii]) {
                        if (setVertexPos(ii, position + dxy, 
                          dxy, vertex.type = vertex.type)) 
                          tkmove(canvas, vertexItem(ii)$tag, 
                            dxy[1], dxy[2])
                      }
                      edges <- edgeItem(ii, edge.type = edge.type)
                      if (length(edges) > 0) 
                        for (e in edges) if (!(is.null(e))) 
                          setEdgeCoords(e, edge.type = edge.type, 
                            f = ii, posFrom = position, raise = FALSE, 
                            setEdgeLabel = FALSE)
                    }
                    fun(f, from.type, posFrom)
                    fun(t, to.type, posTo)
                  }
                  setUpdatePositions("")
                }
            }
            "moveEdgeLabel" <- function(i, f, t, edge.type = "VertexEdge") {
                force(i)
                force(f)
                force(t)
                force(edge.type)
                function(x, y) {
                  activateEdge(0, from = f, to = t, edge.type = edge.type)()
                  edges <- edgeItem(f, edge.type = edge.type)
                  if (length(edges) > 0) 
                    for (e in edges) if (!(is.null(e))) 
                      if (e$nr == i) 
                        if ((e$to == t)) 
                          if (!(e$reverse) || !Oriented) {
                            from.type <- vertexTypeOfEdge(f, 
                              edge.type)
                            to.type <- vertexTypeOfEdge(t, edge.type)
                            pos <- (retVertexPos(t, to.type) + 
                              retVertexPos(f, from.type))/2
                            pos <- pos + retEdgeLabelPos(e$label.number, 
                              f, e$to)
                            X <- replaceXY(x, y, pos)
                            dxy <- findDifference(X, pos)
                            # tkcoords(canvas, e$label, x, y)
                            tkmove(canvas, e$label, dxy[1], dxy[2])
                            setEdgeLabelPos(e, e$label.number, 
                              X, dxy, f = f)
                          }
                }
            }
            "subSubAddEdge" <- function(f, t, from.type, to.type, 
                edge.type = "VertexEdge", slave = TRUE, edgeClass = NULL) {
                fun <- function(result, ff, tt, edge.type = "VertexEdge") {
                  if (!any(which.edge(c(ff, tt), edge.type = edge.type)) && 
                    (!any(which.edge(c(tt, ff), edge.type = edge.type)) || 
                      dg@oriented)) 
                    return(append(result, list(c(ff, tt))))
                  else return(result)
                }
                redraw <- FALSE
                if (!(dg@viewType == "Simple")) 
                  redraw <- TRUE
                result <- NULL
                if (edge.type == "selected") {
                  redraw <- TRUE
                  message("Selected edges not added to 'newEdges';")
                  message("Resulting edges should be returned from modifyModel!")
                }
                else if (edge.type == "VertexEdge") {
                  result <- fun(result, f, t, edge.type = "VertexEdge")
                }
                else if (edge.type == "extraEdge") {
                  message("No edges to extra vertices!")
                }
                else if (edge.type == "FactorEdge") {
                  message("Resulting edges should be returned from modifyModel!")
                  redraw <- TRUE
                }
                else if (edge.type == "ExtraEdge") {
                  message("Resulting edges should be returned from modifyModel!")
                  redraw <- TRUE
                }
                else if (edge.type == "factorBlockEdge") {
                  message("Resulting edges should be returned from modifyModel!")
                  message("Factoredges are only draw between vertices and factors!")
                  redraw <- TRUE
                }
                else if (edge.type == "BlockEdge") {
                  from.block <- f
                  if (!(from.type == "Vertex")) {
                    from.block <- unique(sort(c(from.block, blockList[[from.block]]@descendants)))
                    from.block <- from.block[from.block != 0]
                  }
                  to.block <- t
                  if (!(to.type == "Vertex")) {
                    to.block <- unique(sort(c(to.block, blockList[[to.block]]@descendants)))
                    to.block <- to.block[to.block != 0]
                  }
                  if (from.type == "Vertex") {
                    for (w in seq(along = vertexList)) if (is.element(w, 
                      dg@visibleVertices)) 
                      if (is.element(retBlockIndex(w, vertex.type = "Vertex"), 
                        to.block)) 
                        result <- fun(result, f, w, edge.type = "VertexEdge")
                  }
                  else if (to.type == "Vertex") {
                    for (v in seq(along = vertexList)) if (is.element(v, 
                      dg@visibleVertices)) 
                      if (is.element(retBlockIndex(v, vertex.type = "Vertex"), 
                        from.block)) 
                        result <- fun(result, v, t, edge.type = "VertexEdge")
                  }
                  else {
                    for (v in seq(along = vertexList)) if (is.element(v, 
                      dg@visibleVertices)) 
                      if (is.element(retBlockIndex(v, vertex.type = "Vertex"), 
                        from.block)) 
                        for (w in seq(along = vertexList)) if (is.element(w, 
                          dg@visibleVertices)) 
                          if (is.element(retBlockIndex(w, vertex.type = "Vertex"), 
                            to.block)) 
                            result <- fun(result, v, w, edge.type = "VertexEdge")
                  }
                }
                if (redraw || !is.null(result) || (edge.type == "selected")) {
                  vertexEdges <- appendToCurrentEdges(omitEdges = FALSE, 
                    new.edge = result, edge.type = "VertexEdge", 
                    edgeClass = edgeClass)
                  newEdges <- list(vertexEdges = vertexEdges, 
                    extraEdges = NULL, factorEdges = NULL, blockEdges = NULL)
                  R <- NULL
                  if (is.null(object)) 
                    R <- TRUE
                  Arguments <- Args()
                  if (!is.null(object) && (control$hasMethods || 
                    hasMethod("modifyModel", class(object)))) {
                    if (f == 0) 
                      name.f <- ""
                    else name.f <- retVertexName(f, from.type)
                    if (t == 0) 
                      name.t <- ""
                    else name.t <- retVertexName(t, to.type)
                    R <- modifyModel(object, action = "addEdge", 
                      name.1 = name.f, name.2 = name.t, from = f, 
                      to = t, from.type = from.type, to.type = to.type, 
                      newEdges = newEdges, selectedNodes = selectedNodes, 
                      selectedEdges = selectedEdges, Arguments = Arguments)
                  }
                  if (!is.null(R)) {
                    objectAssign(R)
                    if (slave || redraw) 
                      drawResult(newEdges, R, slave, "addEdge")
                    else {
                      if (any(slotNames(R$object) == ".title"))
                        tktitle(GW.top) <- R$object@.title
                      for (i in seq(along = result)) {
                        E <- append.index.edge(result[[i]], edge.type = "VertexEdge", 
                          edgeClass = edgeClass)
                        drawEdge(E[[length(E)]], length(E), lower = TRUE, 
                          edge.type = "VertexEdge")
                      }
                      updateSelectedEdges(R, vertexEdges, edge.type = edge.type, 
                        setVertex = TRUE, updateBE = TRUE)
                    }
                  }
                  else message("Null result in addEdge")
                }
            }
            "subAddEdge" <- function(f, t, from.type, to.type, 
                edge.type = "VertexEdge", slave = TRUE, edgeClass = NULL) {
                tkconfigure(canvas, cursor = "watch")
                tkfocus(GW.top)
                if ((from.type != "Extra") && (to.type != "Extra")) 
                  subSubAddEdge(f, t, from.type, to.type, edge.type = edge.type, 
                    slave = slave, edgeClass = edgeClass)
                if (f != 0) 
                  setVertexColor(f, color = retVertexColor(f, 
                    from.type), from.type)
                if (t != 0) 
                  setVertexColor(t, color = retVertexColor(t, 
                    to.type), to.type)
                setActivatedVertex(0, "Vertex")
                tkconfigure(canvas, cursor = "arrow")
            }
            "subNewBlock" <- function(position, get.name = TRUE, 
                color = control$blockColors[1]) {
                positionCenter <- apply(position, c(2), mean)
                n <- length(blockList) + 1
                if (get.name) {
                  label <- modalDialog("Name Entry", "Enter name of new block", 
                    paste("Block", n, sep = ""), top = GW.top)
                  if (label == "ID_CANCEL") 
                    return()
                }
                else label <- paste("B", n, sep = "")
                stratum <- n
                if (is.null(color)) 
                  if (is.null(blockList)) 
                    color <- "grey"
                  else color <- color(blockList[[1]])
                ancestors <- 0
                for (j in seq(along = blockList)) if (inBlock(positionCenter, 
                  j)) 
                  ancestors <- unique(sort(c(ancestors, j, ancestors(blockList[[j]]))))
                parent <- max(ancestors)
                ancestors <- unique(sort(c(ancestors(blockList[[parent]]), 
                  parent)))
                ancestors <- ancestors[ancestors != 0]
                new.block <- new("dg.Block", stratum = stratum, 
                  index = -stratum, position = position, color = color, 
                  closed = FALSE, visible = TRUE, label = label, 
                  parent = parent, ancestors = ancestors)
                sinkBlockList()
                for (j in seq(along = blockList)) if (j %in% 
                  ancestors) {
                  x <- unique(sort(c(blockList[[j]]@descendants, 
                    n)))
                  blockList[[j]]@descendants <<- x[x != 0]
                }
                children <- unique(sort(c(blockList[[parent]]@children, 
                  n)))
                blockList[[parent]]@children <<- children[children != 
                  0]
                if (is.null(blockList)) {
                  blockList <<- list(new.block)
                  class(blockList) <<- "dg.BlockList"
                  dgm.frameModels@blocks <<- blockList
                  positionsBlocks <- Positions(blockList)
                  d <- dim(positionsBlocks)
                  positionsBlocks <<- array(positionsBlocks, 
                    dim = c(d[1], d[2]/2, 2))
                  positionsBlockLabels <<- matrix(labelPosition(new.block), 
                    nrow = 1)
                  positionsClosedBlocks <<- matrix(positionCenter, 
                    nrow = 1)
                  blockReferences <<- c(n)
                  blockLabels <<- c(label)
                  strataBlocks <<- c(n)
                  closedBlock <<- c(FALSE)
                  hiddenBlock <<- c(FALSE)
                  openTreeBlock <<- c(FALSE)
                  dg@visibleBlocks <<- c(n)
                }
                else {
                  blockList <<- append(blockList, list(new.block))
                  class(blockList) <<- "dg.BlockList"
                  dgm.frameModels@blocks <<- blockList
                  d <- dim(positionsBlocks)
                  pBs <- array(positionsBlocks, dim = c(d[1], 
                    d[2] * 2))
                  pBs <- rbind(pBs, c(position(new.block)))
                  positionsBlocks <<- array(pBs, dim = c(d[1] + 
                    1, d[2], 2))
                  positionsBlockLabels <<- rbind(positionsBlockLabels, 
                    labelPosition(new.block))
                  positionsClosedBlocks <<- rbind(positionsClosedBlocks, 
                    positionCenter)
                  blockReferences <<- c(blockReferences, n)
                  blockLabels <<- c(blockLabels, label)
                  strataBlocks <<- c(strataBlocks, n)
                  closedBlock <<- c(closedBlock, FALSE)
                  hiddenBlock <<- c(hiddenBlock, FALSE)
                  openTreeBlock <<- c(openTreeBlock, FALSE)
                  dg@visibleBlocks <<- c(dg@visibleBlocks, n)
                  itemsClosedBlocks <<- append(itemsClosedBlocks, 
                    list(NULL))
                  itemsBlockEdges <<- append(itemsBlockEdges, 
                    list(NULL))
                }
                if (control$variableFrame && !.IsEmpty(blockList)) {
                  if (!(get("type", GW.top$env$box$env) == "variableList")) {
                    if (control$debug.strata) 
                      print(n)
                    if (control$debug.strata) 
                      print(ancestors)
                    m <- max(ancestors)
                    if (m == 0) 
                      parent = "root"
                    else {
                      parent <- ubl(block = blockList[[m]])
                    }
                    tkinsert.block(GW.top$env$box, parent = parent, 
                      block = blockList[[n]], open = openTreeBlock[n], 
                      delete = FALSE)
                  }
                  else message("Redraw graph (make slave window) for panel with block tree!")
                }
            }
            "new.Block" <- function(position, get.name = FALSE) {
                tkconfigure(canvas, cursor = "watch")
                tkconfigure(GW.top$env$viewLabel, text = paste(dg@viewType, 
                  " | Working !!!"))
                subNewBlock(position, get.name = get.name)
                n <- length(blockList)
                drawBlock(blockList[[n]], n)
                if (updateAllBlockIndices()) 
                  setUpdateBlockEdges("createNewBlock")
                subUpdateGraphWindow("createNewBlock", redrawVertices = TRUE, 
                  raiseEdges = TRUE, updateEdges = TRUE)
                setUpdateBlocks("")
                subUpdatePositions()
                tkconfigure(GW.top$env$viewLabel, text = dg@viewType)
                tkconfigure(canvas, cursor = "arrow")
            }
            "newBlockXY" <- function() {
                function(x, y) {
                  X <- replaceXY(x, y, rep(50, local.N))
                  position <- c(inversProject(inversCanvasPosition(X)))
                  delta <- c(10, 10, rep(50, local.N - 2))
                  position <- matrix(c(position - delta, position + 
                    delta), nrow = 2, byrow = TRUE)
                  new.Block(position, get.name = FALSE)
                }
            }
            "newEdge" <- function(i, vertex.type = ifelse(i > 0, 
                "Vertex", "Factor"), slave = TRUE, selectClass = FALSE) {
                force(i)
                force(slave)
                force(vertex.type)
                force(selectClass)
                function(...) {
                  edgeClass = control$edgeClasses[, 1][[1]]
                  if (selectClass) {
                    ReturnVal <- selectDialog("Select class of edge", 
                      "Select class", control$edgeClasses[, 1], 
                      top = GW.top)
                    if ((length(ReturnVal) > 0) && (ReturnVal != 
                      "ID_CANCEL")) 
                      edgeClass <- control$edgeClasses[ReturnVal, 
                        1]
                  }
                  from.type <- retActivatedVertexVertex.Type()
                  f <- retActivatedVertex()
                  t <- i
                  if (!subActivateVertex(i, "green", vertex.type, 
                    new.edge = TRUE)) 
                    if ((f != 0) && !((f == i) && (from.type == 
                      vertex.type))) {
                      edge.type <- "VertexEdge"
                      if ((vertex.type == "Extra") || (from.type == 
                        "Extra")) 
                        edge.type <- "extraEdge"
                      if ((vertex.type == "Factor") || (from.type == 
                        "Factor")) 
                        if ((edge.type == "extraEdge")) 
                          edge.type <- "factorExtraEdge"
                        else edge.type <- "FactorEdge"
                      if ((vertex.type == "ClosedBlock") || (from.type == 
                        "ClosedBlock")) 
                        if ((edge.type == "extraEdge")) 
                          edge.type <- "blockExtraEdge"
                        else if ((edge.type == "FactorEdge")) 
                          edge.type <- "factorBlockEdge"
                        else edge.type <- "BlockEdge"
                      subAddEdge(f, t, from.type, vertex.type, 
                        edge.type = edge.type, slave = slave, 
                        edgeClass = edgeClass)
                    }
                }
            }
            "addLastEdge" <- function(vertex.type = ifelse(i > 
                0, "Vertex", "Factor")) {
                function() {
                  n <- length(vertexList)
                  f <- retActivatedVertex()
                  if ((f > 0) && (retActivatedVertexVertex.Type() == 
                    "Vertex")) 
                    setVertexColor(f, color = retVertexColor(i, 
                      vertex.type), vertex.type)
                  setActivatedVertex(n - 1, vertex.type)
                  newEdge(n, vertex.type = "Vertex", slave = FALSE)()
                }
            }
            "subSubDropEdge" <- function(i, f, t, from.type = vertexTypeOfEdge(f, 
                edge.type), to.type = vertexTypeOfEdge(t, edge.type), 
                edge.type = "VertexEdge", slave = TRUE) {
                redraw <- FALSE
                if (!(dg@viewType == "Simple")) 
                  redraw <- TRUE
                j.g <- FALSE
                if (edge.type == "selected") {
                  redraw <- TRUE
                  message("Selected edges not added to 'newEdges';")
                  message("Resulting edges should be returned from modifyModel!")
                  vertexEdges <- copyCurrentEdges(edge.type = "VertexEdge")
                  newEdges <- list(vertexEdges = vertexEdges, 
                    extraEdges = NULL, factorEdges = NULL, blockEdges = NULL)
                }
                else if (edge.type == "VertexEdge") {
                  j.g <- which.unordered.edge(c(t, f), edge.type = edge.type)
                  vertexEdges <- copyCurrentEdges(omitEdges = j.g, 
                    edge.type = edge.type)
                  newEdges <- list(vertexEdges = vertexEdges, 
                    extraEdges = NULL, factorEdges = NULL, blockEdges = NULL)
                }
                else if (edge.type == "FactorEdge") {
                  message("Resulting edges should be returned from modifyModel!")
                  redraw <- TRUE
                  newEdges <- list(vertexEdges = NULL, extraEdges = NULL, 
                    factorEdges = NULL, blockEdges = NULL)
                }
                else if (edge.type == "ExtraEdge") {
                  message("Resulting edges should be returned from modifyModel!")
                  redraw <- TRUE
                  vertexEdges <- copyCurrentEdges(edge.type = "VertexEdge")
                  newEdges <- list(vertexEdges = NULL, extraEdges = NULL, 
                    factorEdges = NULL, blockEdges = NULL)
                }
                else if ((edge.type == "blockExtraEdge") || (edge.type == 
                  "factorExtraEdge") || (edge.type == "factorBlockEdge")) {
                  message("Not possible: Factoredges are only draw between vertices and factors!")
                  newEdges <- list(vertexEdges = NULL, extraEdges = NULL, 
                    factorEdges = NULL, blockEdges = NULL)
                }
                else if (edge.type == "BlockEdge") {
                  from.block <- -f
                  if (from.block > 0) 
                    from.block <- c(from.block, blockList[[from.block]]@descendants)
                  to.block <- -t
                  if (to.block > 0) 
                    to.block <- c(to.block, blockList[[to.block]]@descendants)
                  if (from.type == "Vertex") {
                    for (w in seq(along = vertexList)) if (is.element(w, 
                      dg@visibleVertices)) 
                      if (is.element(retBlockIndex(w, vertex.type = "Vertex"), 
                        to.block)) 
                        j.g <- j.g | which.unordered.edge(c(f, 
                          w), edge.type = "VertexEdge")
                  }
                  else if (to.type == "Vertex") {
                    for (v in seq(along = vertexList)) if (is.element(v, 
                      dg@visibleVertices)) 
                      if (is.element(retBlockIndex(v, vertex.type = "Vertex"), 
                        from.block)) 
                        j.g <- j.g | which.unordered.edge(c(v, 
                          t), edge.type = "VertexEdge")
                  }
                  else {
                    for (v in seq(along = vertexList)) if (is.element(v, 
                      dg@visibleVertices)) 
                      if (is.element(retBlockIndex(v, vertex.type = "Vertex"), 
                        from.block)) 
                        for (w in seq(along = vertexList)) if (is.element(w, 
                          dg@visibleVertices)) 
                          if (is.element(retBlockIndex(w, vertex.type = "Vertex"), 
                            to.block)) 
                            if (v != w) 
                              j.g <- j.g | which.unordered.edge(c(v, 
                                w), edge.type = "VertexEdge")
                  }
                  vertexEdges <- copyCurrentEdges(omitEdges = j.g, 
                    edge.type = "VertexEdge")
                  newEdges <- list(vertexEdges = vertexEdges, 
                    extraEdges = NULL, factorEdges = NULL, blockEdges = NULL)
                }
                R <- NULL
                if (is.null(object)) 
                  R <- TRUE
                Arguments <- Args()
                if (!is.null(object) && (control$hasMethods || 
                  hasMethod("modifyModel", class(object)))) {
                  if (f == 0) 
                    name.f <- ""
                  else name.f <- retVertexName(f, from.type)
                  if (t == 0) 
                    name.t <- ""
                  else name.t <- retVertexName(t, to.type)
                  R <- modifyModel(object, action = "dropEdge", 
                    name.1 = name.f, name.2 = name.t, from = f, 
                    to = t, from.type = from.type, to.type = to.type, 
                    edge.index = i, newEdges = newEdges, selectedNodes = selectedNodes, 
                    selectedEdges = selectedEdges, Arguments = Arguments)
                }
                if (!is.null(R)) {
                  objectAssign(R)
                  if (slave || redraw) 
                    drawResult(newEdges, R, slave, "dropEdge")
                  else {
                    if (any(slotNames(R$object) == ".title"))
                      tktitle(GW.top) <- R$object@.title
                    subSubDeleteEdge(i, f, t, edge.type = edge.type)
                    clearEdge(i, edge.type = edge.type)
                    if (edge.type == "BlockEdge") {
                      for (k in seq(along = j.g)) if (j.g[k]) {
                        subSubDeleteEdge(k, f, t, edge.type = "VertexEdge")
                        clearEdge(k, edge.type = "VertexEdge")
                      }
                    }
                    updateSelectedEdges(R, vertexEdges, edge.type = edge.type, 
                      setVertex = FALSE, updateBE = TRUE)
                  }
                }
                else message("Null result in dropEdge")
            }
            "subDropEdge" <- function(i, f, t, from.type = vertexTypeOfEdge(f, 
                edge.type), to.type = vertexTypeOfEdge(t, edge.type), 
                from.all = FALSE, to.all = FALSE, edge.type = "VertexEdge", 
                slave = TRUE) {
                tkconfigure(canvas, cursor = "watch")
                tkfocus(GW.top)
                if (from.type == "ClosedBlock") 
                  from.block <- f
                else from.block <- retBlockIndex(f, vertex.type = from.type)
                if (to.type == "ClosedBlock") 
                  to.block <- t
                else to.block <- retBlockIndex(t, vertex.type = to.type)
                if (from.all && ((from.type == "ClosedBlock") || 
                  ((from.type == "Vertex")))) {
                  for (v in seq(along = vertexList)) if (is.element(v, 
                    dg@visibleVertices)) 
                    if ((retBlockIndex(v, vertex.type = "Vertex") == 
                      from.block)) 
                      subDropEdge(NULL, v, t, "Vertex", to.type, 
                        FALSE, to.all, edge.type = edge.type, 
                        slave = slave)
                }
                else if (to.all && ((to.type == "ClosedBlock") || 
                  ((to.type == "Vertex")))) {
                  for (w in seq(along = vertexList)) if (is.element(w, 
                    dg@visibleVertices)) 
                    if ((retBlockIndex(w, vertex.type = "Vertex") == 
                      to.block)) 
                      subDropEdge(NULL, f, w, "Vertex", "Vertex", 
                        FALSE, FALSE, edge.type = edge.type, 
                        slave = slave)
                }
                else {
                  j <- which.unordered.edge(c(t, f), edge.type = edge.type)
                  if (any(j)) {
                    i <- (1:(length(j)))[j]
                    for (j in seq(along = i)) subSubDropEdge(i[j], 
                      f, t, edge.type = edge.type, slave = slave)
                  }
                }
                tkconfigure(canvas, cursor = "arrow")
            }
            "deleteEdge" <- function(i, f, t, edge.type = "VertexEdge") {
                force(i)
                force(f)
                force(t)
                force(edge.type)
                function(...) {
                  if (retActivatedEdge() == i) 
                    subDropEdge(i, f, t, from.all = FALSE, to.all = FALSE, 
                      edge.type = edge.type, slave = FALSE)
                }
            }
            "changeEdgeClass" <- function(i, f, t, edge.type = "VertexEdge") {
                force(i)
                force(f)
                force(t)
                force(edge.type)
                function(...) {
                  ReturnVal <- selectDialog("Test selectDialog Entry", 
                    "Select name", control$edgeClasses[, 1], 
                    top = GW.top)
                  if ((length(ReturnVal) > 0) && (ReturnVal != 
                    "ID_CANCEL")) {
                    E <- getEdges(edge.type = edge.type)
                    newEdge <- E[[i]]
                    class(newEdge) <- control$edgeClasses[ReturnVal, 
                      2]
                    E <- append.edge(newEdge, edge.type = edge.type)
                    subSubDeleteEdge(i, f, t, edge.type = edge.type)
                    clearEdge(i, edge.type = edge.type)
                    drawEdge(E[[length(E)]], length(E), lower = TRUE, 
                      edge.type = edge.type)
                    setModel(object, txt = "changeEdgeClass", 
                      copyProperties = TRUE, RR = NULL)
                  }
                }
            }
            "propertyEdge" <- function(i, f, t, edge.type = "VertexEdge") {
                force(i)
                force(f)
                force(t)
                force(edge.type)
                function(...) {
                  E <- sinkEdgeList()
                  E <- sinkBlockEdges()
                  E <- sinkFactorEdgeList()
                  E <- sinkExtraEdgeList()
                  E <- getEdges(edge.type = edge.type)
                  fixedSlots <- c("vertex.indices", "label.position")
                  if (length(selectedEdges) > 0) 
                    fixedSlots <- c(fixedSlots, "label", "oriented")
                  ReturnVal <- propertyDialog(E[[i]], control$edgeClasses, 
                    fixedSlots = fixedSlots, top = GW.top)
                  if (!is.null(ReturnVal$values)) {
                    E[[i]] <- ReturnVal$object
                    subSubDeleteEdge(i, f, t, edge.type = edge.type)
                    drawEdge(E[[i]], i, lower = TRUE, edge.type = edge.type, 
                      newE = TRUE)
                    if (length(selectedEdges) > 0) {
                      lapply(selectedEdges, function(k) setEdgeColor(k$index, 
                        color = NULL, edge.type = k$edge.type))
                      if (!is.null(ReturnVal$values$oriented)) {
                        message("Change of 'oriented' not implemented; ")
                      }
                      if (!is.null(ReturnVal$values$dash)) 
                        lapply(selectedEdges, function(k) if (k$edge.type == 
                          edge.type) {
                          dash(E[[k$index]]) <<- ReturnVal$values$dash
                          setEdgeDash(k$index, dash = ReturnVal$values$dash, 
                            edge.type = k$edge.type)
                        })
                      if (!is.null(ReturnVal$values$vertex.indices)) {
                        message("Change of 'vertex.indices' not possible; ")
                      }
                      if (!is.null(ReturnVal$values$width)) 
                        lapply(selectedEdges, function(k) if (k$edge.type == 
                          edge.type) {
                          width(E[[k$index]]) <<- ReturnVal$values$width
                          edges <- edgeItem(k$from, edge.type = edge.type)
                          if (length(edges) > 0) 
                            for (e in edges) if (!(is.null(e))) 
                              if (e$nr == k$index) 
                                if (e$to == k$to) 
                                  setEdgeWidth(e, width = ReturnVal$values$width, 
                                    edge.type = k$edge.type)
                        })
                      if (!is.null(ReturnVal$values$color)) 
                        lapply(selectedEdges, function(k) if (k$edge.type == 
                          edge.type) {
                          color(E[[k$index]]) <<- ReturnVal$values$color
                          setEdgeColor(k$index, color = ReturnVal$values$color, 
                            edge.type = k$edge.type)
                        })
                      if (!is.null(ReturnVal$values$label)) {
                        message("Change of 'label' not possible for group of edges; ")
                      }
                      if (!is.null(ReturnVal$values$label.position)) {
                        message("Change of 'label.position' not possible for group of edges; ")
                      }
                      if (!is.null(ReturnVal$values$class)) 
                        lapply(selectedEdges, function(k) if (k$edge.type == 
                          edge.type) {
                          class(E[[k$index]]) <<- ReturnVal$values$class
                          subSubDeleteEdge(k$index, k$from, k$to, 
                            edge.type = k$edge.type)
                          drawEdge(E[[k$index]], k$index, lower = TRUE, 
                            edge.type = k$edge.type)
                        })
                      if (is.null(ReturnVal$values$color)) 
                        clearSelectedEdges()
                      else selectedEdges <<- list()
                    }
                    if (edge.type == "VertexEdge") 
                      GraphWindow@dg@edgeList <<- E
                    else if (edge.type == "FactorEdge") 
                      GraphWindow@dg@factorEdgeList <<- E
                    else if (edge.type == "ExtraEdge") 
                      GraphWindow@dg@extraEdgeList <<- E
                    else if (edge.type == "BlockEdge") 
                      GraphWindow@dg@blockEdgeList <<- E
                    setModel(object, txt = "changeEdgeClass", 
                      copyProperties = TRUE, RR = NULL)
                  }
                }
            }
            "propertyNode" <- function(i, vertex.type = "Vertex") {
                force(i)
                force(vertex.type)
                function(...) {
                  "f" <- function() {
                    if ((length(selectedNodes) > 0) && (length(ReturnVal$values) > 
                      1) && ("color" %in% names(ReturnVal$values))) 
                      message("Only color changed for selected vertices; ")
                    if ("name" %in% names(ReturnVal$values)) {
                      if ((vertex.type == "ClosedBlock") || (vertex.type == 
                        "OpenBlock")) {
                        message("No names for blocks! ; ")
                      }
                      else {
                        message("Names can not be changed, use labels ; ")
                      }
                    }
                    if ("index" %in% names(ReturnVal$values)) {
                      message("The internal index not be changed! ; ")
                    }
                    if ("ancestors" %in% names(ReturnVal$values)) {
                      message("Ancestors should not be set manually; ")
                    }
                    if ("descendants" %in% names(ReturnVal$values)) {
                      message("Descendants should not be set manually; ")
                    }
                    if ("position" %in% names(ReturnVal$values)) {
                      if ((vertex.type == "ClosedBlock") || (vertex.type == 
                        "OpenBlock")) {
                        positionsBlocks[i, , ] <<- ReturnVal$values$position
                        subUpdateGraphWindow("Update from main menu", 
                          redrawVertices = TRUE, raiseEdges = TRUE, 
                          updateEdges = TRUE, all.blockframes = TRUE)
                        setUpdateBlocks("")
                      }
                      else {
                        posFrom <- retVertexPos(i, vertex.type)
                        posTo <- positionsCanvas(ReturnVal$values$position)
                        subMoveVertex(i, vertex.type, posFrom, 
                          posTo)
                        moveFactorVertex(i)
                        setUpdatePositions("")
                      }
                    }
                    if ("blockindex" %in% names(ReturnVal$values)) {
                      if ((vertex.type == "ClosedBlock") || (vertex.type == 
                        "OpenBlock")) {
                      }
                      else {
                        message(paste("Blockindex of vertices only used when positions", 
                          " of vertices relative blocks are ignored ; "))
                        # if (FALSE && .IsEmpty(blockList)) 
                          # if (vertex.type == "Vertex") {
                          #   blockindexVertices[i] <<- ReturnVal$blockindex
                          # 'blockindexVertices' !!!
                          # }
                          # else if (vertex.type == "Factor") {
                          #   blockindexFactorVertices[-i] <<- ReturnVal$blockindex
                          # 'blockindexFactorVertices' !!!
                          # }
                          # else if (vertex.type == "Extra") {
                          #   blockindexExtraVertices[i] <<- ReturnVal$blockindex
                          # 'blockindexExtraVertices' !!!
                          # }
                      }
                    }
                    if ("stratum" %in% names(ReturnVal$values)) {
                      if ((vertex.type == "ClosedBlock") || (vertex.type == 
                        "OpenBlock")) {
                        strataBlocks[abs(i)] <<- ReturnVal$values$stratum
                        if (updateAllBlockIndices()) 
                          setUpdateBlockEdges("propertyDialog: Block stratum")
                        subUpdateGraphWindow("propertyDialog: Block stratum", 
                          updateEdges = TRUE, blockframes = 0)
                        setUpdateBlocks("")
                      }
                      else {
                        message(paste("Stratas of vertices only used when positions", 
                          " of vertices relative blocks are ignored ; "))
                        if (FALSE && .IsEmpty(blockList)) 
                          if (vertex.type == "Vertex") {
                            strataVertices[i] <<- ReturnVal$stratum
                          }
                          else if (vertex.type == "Factor") {
                            strataFactorVertices[-i] <<- ReturnVal$stratum
                          }
                          else if (vertex.type == "Extra") {
                            strataExtraVertices[i] <<- ReturnVal$stratum
                          }
                      }
                    }
                    if ("closed" %in% names(ReturnVal$values)) {
                      message("Closed block by mouse interaction; ")
                    }
                    if ("visible" %in% names(ReturnVal$values)) {
                      message("Closed ancestor block by mouse interaction; ")
                    }
                    if ("color" %in% names(ReturnVal$values)) {
                      if (vertex.type != "OpenBlock") 
                        setVertexColor(i, ReturnVal$values$color, 
                          vertex.type, permanent = TRUE)
                      else message("Close and open block to activate color; ")
                      if (length(selectedNodes) > 0) {
                        lapply(selectedNodes, function(k) if ((k$node.type != 
                          "OpenBlock") && (k$node.type != "ClosedBlock")) 
                          setVertexColor(k$index, color = ReturnVal$values$color, 
                            vertex.type = k$node.type, permanent = TRUE))
                        selectedNodes <<- list()
                      }
                      setUpdatePositions("")
                    }
                    if ("constrained" %in% names(ReturnVal$values)) {
                      constrainedVertices[i] <<- ReturnVal$values$constrained
                    }
                    if ("label" %in% names(ReturnVal$values)) {
                      setVertexLabel(i, ReturnVal$values$label, 
                        vertex.type)
                      setUpdatePositions("")
                    }
                    if ("label.position" %in% names(ReturnVal$values)) 
                      if (!(vertex.type == "OpenBlock")) {
                        posFrom <- retLabelPos(i, vertex.type)
                        X <- positionsCanvas(ReturnVal$values$label.position)
                        dxy <- findDifference(X, posFrom)
                        tkmove(canvas, vertexItem(i, vertex.type)$label, 
                          dxy[1], dxy[2])
                        setLabelPos(i, X, dxy, vertex.type)
                        setUpdatePositions("")
                      }
                    if ("class" %in% names(ReturnVal$values)) {
                      message("Changing class of variable!")
                      subUpdateGraphWindow("Update from main menu", 
                        redrawVertices = TRUE, raiseEdges = TRUE, 
                        updateEdges = TRUE, all.blockframes = TRUE)
                      setUpdateVertices("")
                    }
                  }
                  if ((vertex.type == "ClosedBlock") || (vertex.type == 
                    "OpenBlock")) {
                    B <- sinkBlockList()
                    block <- blockList[[i]]
                    difficultSlots <- c("ancestors", "descendants", 
                      "closed", "visible")
                    if ((vertex.type == "OpenBlock")) 
                      difficultSlots <- c(difficultSlots, "color", 
                        "label", "label.position")
                    ReturnVal <- propertyDialog(block, NULL, 
                      okReturn = FALSE, fixedSlots = c("index"), 
                      difficultSlots = difficultSlots, top = GW.top)
                    if (!is.null(ReturnVal$values)) {
                      dgm.frameModels@blocks[[abs(i)]] <<- ReturnVal$object
                      blockList[[abs(i)]] <<- ReturnVal$object
                      f()
                    }
                  }
                  else if (vertex.type == "Vertex") {
                    V <- sinkVertexList()
                    vertex <- dgm.frameModels@vertices[[i]]
                    ReturnVal <- propertyDialog(vertex, control$vertexClasses, 
                      fixedSlots = c("index", "name"), difficultSlots = c("blockindex", 
                        "stratum"), okReturn = FALSE, top = GW.top)
                    if (!is.null(ReturnVal$values)) {
                      dgm.frameModels@vertices[[i]] <<- ReturnVal$object
                      vertexList[[i]] <<- ReturnVal$object
                      f()
                    }
                  }
                  else if (vertex.type == "Factor") {
                    V <- sinkFactorVertexList()
                    vertex <- GraphWindow@dg@factorVertexList[[abs(i)]]
                    ReturnVal <- propertyDialog(vertex, control$factorClasses, 
                      fixedSlots = c("name", "index", "vertex.indices"), 
                      difficultSlots = c("blockindex", "stratum"), 
                      okReturn = FALSE, top = GW.top)
                    if (!is.null(ReturnVal$values)) {
                      GraphWindow@dg@factorVertexList[[-i]] <<- ReturnVal$object
                      dg@factorVertexList[[-i]] <<- ReturnVal$object
                      f()
                    }
                  }
                  else if (vertex.type == "Extra") {
                    V <- sinkExtraVertexList()
                    vertex <- GraphWindow@dg@extraList[[i]]
                    ReturnVal <- propertyDialog(vertex, NULL, 
                      okReturn = FALSE, fixedSlots = c("name", 
                        "index"), difficultSlots = c("blockindex", 
                        "stratum"), top = GW.top)
                    if (!is.null(ReturnVal$values)) {
                      GraphWindow@dg@extraList[[i]] <<- ReturnVal$object
                      dg@extraList[[i]] <<- ReturnVal$object
                      f()
                    }
                  }
                }
            }
            "computeEdgeLabel" <- function(i, f, t, force = FALSE, 
                edge.type = "VertexEdge") {
                force(i)
                force(f)
                force(t)
                force(force)
                force(edge.type)
                function(...) {
                  if (retActivatedEdge() == i) {
                    tkconfigure(canvas, cursor = "watch")
                    tkfocus(GW.top)
                    edges <- edgeItem(f, edge.type = edge.type)
                    if (length(edges) > 0) 
                      for (e in edges) if (!(is.null(e))) 
                        if (e$nr == i) 
                          if (e$to == t) 
                            if (!is.null(object) && (control$hasMethods || 
                              hasMethod("testEdge", class(object)))) {
                              from.type <- vertexTypeOfEdge(f, 
                                edge.type)
                              to.type <- vertexTypeOfEdge(t, 
                                edge.type)
                              R <- testEdge(object, action = "remove", 
                                name.1 = retVertexName(f, from.type), 
                                name.2 = retVertexName(t, to.type), 
                                from = f, to = t, from.type = from.type, 
                                to.type = to.type, edge.index = i, 
                                force = force, Arguments = Args())
                              if (!is.null(R)) {
                                if ((control$hasMethods || hasMethod("label", 
                                  class(R)))) 
                                  setEdgeLabel(e, label(R), e$label.number, 
                                    f = f, permanent = TRUE)
                                if ((control$hasMethods || hasMethod("width", 
                                  class(R)))) 
                                  setEdgeWidth(e, width(R), e$label.number, 
                                    f = f)
                                activateEdge(0, from = f, to = t, 
                                  edge.type = edge.type)()
                              }
                            }
                    tkconfigure(canvas, cursor = "arrow")
                  }
                }
            }
            "deleteEdgeLabel" <- function(i, f, t, edge.type = "VertexEdge") {
                force(i)
                force(f)
                force(t)
                force(edge.type)
                function(...) {
                  edges <- edgeItem(f, edge.type = edge.type)
                  E <- getEdges(edge.type = edge.type)[[i]]
                  if (length(edges) > 0) 
                    for (e in edges) if (!(is.null(e))) 
                      if (e$nr == i) {
                        setEdgeLabel(e, "", e$label.number, f = f, 
                          permanent = TRUE)
                        setEdgeWidth(e, E@width, e$label.number, 
                          f = f)
                      }
                }
            }
            "moveBlockPoint" <- function(i, A) {
                force(i)
                force(A)
                function(x, y) {
                  posTo <- retBlockPoints(i)[A, ]
                  X <- replaceXY(x, y, posTo)
                  dxy <- findDifference(X, posTo)
                  changeBlockCornerPos(i, A, dxy)
                  tkcoordsBlock(i, color = "black", lower = FALSE)
                  if (updateAllBlockIndices()) 
                    setUpdateBlockEdges("moveBlockPoint")
                  subUpdateGraphWindow("moveBlockPoint", blockframes = 0)
                  setUpdateBlocks("")
                }
            }
            "moveBlockLine" <- function(i, A, B) {
                force(i)
                force(A)
                force(B)
                function(x, y) {
                  if ((A == 1) && (B == 3)) 
                    direction <- 1
                  else if ((A == 4) && (B == 8)) 
                    direction <- 1
                  else if ((A == 1) && (B == 4)) 
                    direction <- 2
                  else if ((A == 3) && (B == 8)) 
                    direction <- 2
                  else if ((A == 5) && (B == 6)) 
                    direction <- 1
                  else if ((A == 7) && (B == 2)) 
                    direction <- 1
                  else if ((A == 5) && (B == 7)) 
                    direction <- 2
                  else if ((A == 6) && (B == 2)) 
                    direction <- 2
                  else if ((A == 1) && (B == 5)) 
                    direction <- 3
                  else if ((A == 3) && (B == 6)) 
                    direction <- 3
                  else if ((A == 4) && (B == 7)) 
                    direction <- 3
                  else if ((A == 8) && (B == 2)) 
                    direction <- 3
                  posA <- retBlockPoints(i)[A, ]
                  posB <- retBlockPoints(i)[B, ]
                  X <- replaceXY(x, y, (posA + posB)/2)
                  Y <- X
                  Y[direction] <- (posA[direction] + posB[direction])/2
                  dxy <- findDifference(X, Y)
                  changeBlockCornerPos(i, A, dxy)
                  tkcoordsBlock(i, color = "black", lower = FALSE)
                  if (updateAllBlockIndices()) 
                    setUpdateBlockEdges("moveBlockLine")
                  subUpdateGraphWindow("moveBlockLine", blockframes = 0)
                  setUpdateBlocks("")
                }
            }
            "moveBlock" <- function(i, A) {
                force(i)
                force(A)
                Y <- NULL
                function(x, y) {
                  posTo <- retBlockPoints(i)[A, ]
                  if (is.null(Y)) 
                    Y <<- replaceXY(x, y, posTo)
                  else {
                    X <- replaceXY(x, y, posTo)
                    dxy <- findDifference(X, Y)
                    Y <<- X
                    changeBlockPos(i, A, dxy)
                    moveVerticesInBlock(i, dxy)
                    for (j in blockList[[i]]@descendants) if ((j != 
                      0) && (j != i)) {
                      changeBlockPos(j, A, dxy)
                      moveVerticesInBlock(j, dxy)
                      if (!(hiddenBlock[j] || closedBlock[j])) 
                        tkcoordsBlock(j, color = "black", lower = FALSE)
                    }
                    if (updateAllBlockIndices()) 
                      setUpdateBlockEdges("moveBlock")
                    subUpdateGraphWindow("moveBlock", blockframes = 0)
                    tkcoordsBlock(i, color = "black", lower = FALSE)
                    setUpdateBlocks("")
                  }
                }
            }
            "hideBlock" <- function(i, ancestor, update = TRUE) {
                blockReferences[i] <<- ancestor
                for (v in seq(along = vertexList)) if (is.element(v, 
                  dg@visibleVertices)) 
                  if (retBlockIndex(v, vertex.type = "Vertex") == 
                    i) 
                    setCloseVertex(v, TRUE, "Vertex")
                setHiddenBlock(i, TRUE, update = update)
                for (j in blockList[[i]]@descendants) {
                  if ((j != 0) && !hiddenBlock[j]) 
                    hideBlock(j, ancestor, update = FALSE)
                }
            }
            "closeBlock" <- function(i, update = TRUE) {
                force(i)
                function(...) {
                  for (v in seq(along = vertexList)) if (is.element(v, 
                    dg@visibleVertices)) 
                    if (retBlockIndex(v, vertex.type = "Vertex") == 
                      i) 
                      setCloseVertex(v, TRUE, "Vertex")
                  for (j in blockList[[i]]@descendants) {
                    if ((j != i) && (j != 0) && !hiddenBlock[j]) 
                      hideBlock(j, i, update = FALSE)
                  }
                  setClosedBlock(i, TRUE, update = update)
                  drawVertex(i, w = 10, vertexcolor = "Black", 
                    vertex.type = "ClosedBlock")
                  if (update) 
                    subUpdateGraphWindow("closeBlock", blockframes = i, 
                      updateEdges = TRUE)
                }
            }
            "subOpenBlock" <- function(i, update = TRUE) {
                blockReferences[i] <<- i
                if ((hiddenBlock[i] && closedBlock[i])) {
                  drawVertex(i, w = 10, vertexcolor = "Black", 
                    vertex.type = "ClosedBlock")
                }
                else {
                  setClosedBlock(i, FALSE, update = update)
                  vertex.type <- "ClosedBlock"
                  deActivateVertex(i, retVertexColor(i, vertex.type), 
                    vertex.type)
                  if (is.element(i, dg@visibleBlocks)) 
                    drawBlock(blockList[[i]], i)
                  for (v in seq(along = vertexList)) if (is.element(v, 
                    dg@visibleVertices)) {
                    bi <- retBlockIndex(v, vertex.type = "Vertex")
                    if ((bi == i) || (bi == 0)) 
                      setCloseVertex(v, FALSE, "Vertex")
                  }
                  for (j in blockList[[i]]@descendants) if ((j != 
                    0) && (hiddenBlock[j])) 
                    if (!isInClosedBlock(j)) 
                      subOpenBlock(j, update = FALSE)
                }
                setHiddenBlock(i, FALSE, update = FALSE)
            }
            "openBlock" <- function(i, update = TRUE) {
                force(i)
                force(update)
                function(...) {
                  subOpenBlock(i, update)
                  if (update) 
                    subUpdateGraphWindow("openBlock", raiseEdges = TRUE, 
                      updateEdges = TRUE)
                }
            }
            "subNewVertex" <- function(position, get.name = TRUE, 
                get.vertex.type = TRUE, get.how.to.compute = TRUE) {
                n <- length(vertexList) + 1
                if (get.name) {
                  ReturnVal <- modalDialog("Name Entry", "Enter name of new variable", 
                    paste("V", n, sep = ""), top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                }
                else ReturnVal <- paste("V", n, sep = "")
                vertextypes <- control$vertexClasses[, 1]
                vertextypes <- paste(vertextypes)
                vertex.type <- vertextypes[1]
                if (get.vertex.type) {
                  Return.Val <- selectDialog("Variable vertex.type selection entry", 
                    "Select vertex.type", vertextypes, top = GW.top)
                  vertex.type <- vertextypes[Return.Val]
                }
                if (!is.na(vertex.type) && (vertex.type == "TextVertex")) 
                  prototype <- "dg.TextVertex"
                else prototype <- typeToPrototype(type = vertex.type, 
                  prototype = "dg.Vertex", classes = control$vertexClasses)
                vertex <- new(prototype, name = ReturnVal, label = ReturnVal, 
                  index = n, position = position, blockindex = 0, 
                  stratum = 0, color = control$vertexColor)
                if (get.how.to.compute) {
                  Expression <- modalDialog("Expression Entry", 
                    "Enter expression for computing new variable", 
                    paste("object <<- object"), top = GW.top)
                  if (Expression == "ID_CANCEL") 
                    return()
                  else eval(parse(text = Expression))
                }
                else Expression <- ReturnVal
                sinkVertexList()
                vertexList <<- append(vertexList, list(vertex))
                class(vertexList) <<- "dg.VertexList"
                dgm.frameModels@vertices <<- vertexList
                positionsVertices <<- rbind(positionsVertices, 
                  position(vertex))
                positionsLabels <<- rbind(positionsLabels, position(vertex))
                Labels <<- c(Labels, Expression)
                closedVertex <<- c(closedVertex, FALSE)
                constrainedVertices <<- c(constrainedVertices, 
                  control$constrained)
                colorsVertices <<- c(colorsVertices, control$vertexColor)
                blocksVertices <<- c(blocksVertices, 0)
                strataVertices <<- c(strataVertices, 0)
                namesVertices <<- c(namesVertices, ReturnVal)
                itemsVertices <<- append(itemsVertices, list(NULL))
                itemsEdges <<- append(itemsEdges, list(NULL))
                updateAllBlockIndices()
                if (control$variableFrame) {
                  if ((get("type", GW.top$env$box$env) == "variableList")) {
                    if (!is.element(n, dg@visibleVertices)) 
                      ReturnVal <- tdv(ReturnVal)
                    tkinsert(GW.top$env$box, "end", ReturnVal)
                    if (tkselectionForVisibleVertices) 
                      for (i in returnVisibleVertices()) {
                        tkselection.set(GW.top$env$box, i - 1)
                      }
                  }
                }
            }
            "subAddVertex" <- function(index, vertex.type = "Vertex", 
                slave = TRUE) {
                tkconfigure(canvas, cursor = "watch")
                tkfocus(GW.top)
                redraw <- FALSE
                if (!(dg@viewType == "Simple")) 
                  redraw <- TRUE
                vertexEdges <- appendToCurrentEdges(omitEdges = FALSE, 
                  new.edge = NULL, edge.type = "VertexEdge")
                newEdges <- list(vertexEdges = vertexEdges, 
                  factorEdges = getEdges(edge.type = "FactorEdge"), 
                  extraEdges = getEdges(edge.type = "ExtraEdge"), 
                  blockEdges = getEdges(edge.type = "BlockEdge"))
                if (vertex.type == "selected") {
                  redraw <- TRUE
                  message("Selected vertices not added to 'newEdges';")
                  message("Resulting edges should be returned from modifyModel!")
                }
                R <- NULL
                if (is.null(object)) 
                  R <- TRUE
                Arguments <- Args()
                visible.Vertices <- returnVisibleVertices()
                if (index != 0) 
                  visible.Vertices <- c(visible.Vertices, index)
                if (!is.null(object) && (control$hasMethods || 
                  hasMethod("modifyModel", class(object)))) {
                  if (index == 0) 
                    name <- ""
                  else name <- retVertexName(index, vertex.type)
                  R <- modifyModel(object, action = "addVertex", 
                    name = name, index = index, type = vertex.type, 
                    newEdges = newEdges, visibleVertices = visible.Vertices, 
                    selectedNodes = selectedNodes, selectedEdges = selectedEdges, 
                    Arguments = Arguments)
                }
                if (!is.null(R)) {
                  objectAssign(R)
                  if (slave || redraw) 
                    drawResult(newEdges, R, slave, "addVertex")
                  else {
                    if (any(slotNames(R$object) == ".title"))
                      tktitle(GW.top) <- R$object@.title
                    setVisibleVertices(visible.Vertices)
                    drawVertex(index, w = control$w, vertexcolor = control$vertexColor, 
                      vertex.type = "Vertex")
                    updateSelectedEdges(R, vertexEdges, edge.type = NULL)
                  }
                }
                else message("Null result in addVertex")
                if (control$variableFrame) {
                  if ((get("type", GW.top$env$box$env) == "variableList")) {
                    if (!(slave || redraw)) {
                      tkdelete(GW.top$env$box, index - 1)
                      tkinsert(GW.top$env$box, index - 1, namesVertices[[index]])
                    }
                    if (tkselectionForVisibleVertices) 
                      for (i in returnVisibleVertices()) {
                        tkselection.set(GW.top$env$box, i - 1)
                      }
                  }
                  else updateVertexInBlock(index, k = retStratum(index), 
                    visibleBefore = FALSE, visibleAfter = TRUE)
                }
                tkconfigure(canvas, cursor = "arrow")
            }
            "newVertexXY" <- function() {
                function(x, y) {
                  X <- replaceXY(x, y, rep(50, local.N))
                  position <- c(inversProject(inversCanvasPosition(X)))
                  subNewVertex(position, get.name = FALSE, get.vertex.type = FALSE, 
                    get.how.to.compute = FALSE)
                  n <- length(vertexList)
                  subAddVertex(n, slave = FALSE)
                  tkfocus(canvas)
                }
            }
            "zoom" <- function(xy, factor) {
                "f" <- function(title, x) print(paste(title, paste(x, 
                  collapse = ", ")))
                if (is.null(xy)) 
                  xy <- c(control$width, control$height, rep(100, 
                    local.N - 2))/2
                X <- xy
                if (is.null(xy)) {
                  xy <- c(control$width, control$height, rep(100, 
                    local.N - 2))/2
                }
                else if (!is.null(zoomCenter)) 
                  X <- (xy - zoomCenter)/Scale + zoomCenter
                Scale <<- Scale * factor
                xy <- round(xy)
                for (i in seq(along = GW.tags)) {
                  tkitemscale(canvas, GW.tags[[i]], xy[1], xy[2], 
                    factor, factor)
                }
                if (control$debug.position) {
                  f("xy: ", xy)
                  f("X: ", X)
                  f("Old zoomCenter: ", zoomCenter)
                  f("Old upperLeft: ", upperLeft)
                  f("Old lowerRight: ", lowerRight)
                }
                upperLeft <<- upperLeft - (upperLeft - X)/factor
                lowerRight <<- lowerRight - (lowerRight - X)/factor
                newCenter <- (lowerRight + upperLeft)/2
                if (!is.null(zoomCenter)) 
                  if ((sum(zoomCenter - newCenter)^2) > 0.1) 
                    zoomCenterSet <<- TRUE
                zoomCenter <<- newCenter
                if (control$debug.position) {
                  f("New zoomCenter: ", zoomCenter)
                  f("New upperLeft: ", upperLeft)
                  f("New lowerRight: ", lowerRight)
                }
                if (zoomCenterSet) 
                  subUpdateGraphWindow("Update from zoom", redrawVertices = TRUE, 
                    raiseEdges = TRUE, updateEdges = TRUE, all.blockframes = TRUE)
                setSrcLabel(GW.top$env$viewLabel)
            }
            "zoomIn" <- function() {
                function(x, y) {
                  xy <- replaceXY(x, y, rep(50, local.N))
                  zoom(xy, sqrt(sqrt(2)))
                }
            }
            "zoomOut" <- function() {
                function(x, y) {
                  xy <- replaceXY(x, y, rep(50, local.N))
                  zoom(xy, 1/sqrt(sqrt(2)))
                }
            }
            "resizeCanvas" <- function() {
                function(x, y, ...) {
                }
            }
            "initFactorVariables" <- function(dg.factorVertexList) {
                if (length(dg.factorVertexList) > 0) {
                  itemsFactors <<- vector("list", length(dg.factorVertexList))
                  itemsFactorEdges <<- vector("list", length(dg.factorVertexList))
                  namesFactorVertices <<- Names(dg.factorVertexList)
                  positionsFactorVertices <<- Positions(dg.factorVertexList)
                  positionsFactorLabels <<- positionsFactorVertices
                  positionsFactorLabels[, 1] <<- positionsFactorLabels[, 
                    1] + 0.1 * control$w
                  factorLabels <<- Labels(dg.factorVertexList)
                  colorsFactorVertices <<- Colors(dg.factorVertexList)
                  blocksFactorVertices <<- rep(0, length(dg.factorVertexList))
                  strataFactorVertices <<- rep(0, length(dg.factorVertexList))
                  if (!is.matrix(positionsFactorVertices)) 
                    warning("Positions of factor-vertices should have same number of coordinates")
                  else if (!(dim(positionsFactorVertices)[2] == 
                    dim(positionsVertices)[2])) 
                    warning("Factor-vertices should have same number of coordinates as vertices")
                }
            }
            "initExtraVariables" <- function(dg.extraList) {
                if (length(dg.extraList) > 0) {
                  itemsExtras <<- vector("list", length(dg.extraList))
                  itemsExtraEdges <<- vector("list", length(dg.extraList))
                  namesExtraVertices <<- Names(dg.extraList)
                  positionsExtraVertices <<- Positions(dg.extraList)
                  positionsExtraLabels <<- positionsExtraVertices
                  positionsExtraLabels[, 1] <<- positionsExtraLabels[, 
                    1] + 0.1 * control$w
                  extraLabels <<- Labels(dg.extraList)
                  colorsExtraVertices <<- Colors(dg.extraList)
                  strataExtraVertices <<- rep(0, length(dg.extraList))
                  blocksExtraVertices <<- rep(0, length(dg.extraList))
                  if (!is.matrix(positionsExtraVertices)) 
                    warning("Positions of extra-vertices should have same number of coordinates")
                  else if (!(dim(positionsExtraVertices)[2] == 
                    dim(positionsVertices)[2])) 
                    warning("Extra-vertices should have same number of coordinates as vertices")
                }
            }
            "replaceBlocks" <- function(blockList) {
                if (!is.null(blockList)) {
                  positionsBlocks <- Positions(blockList)
                  d <- dim(positionsBlocks)
                  positionsBlocks <<- array(positionsBlocks, 
                    dim = c(d[1], d[2]/2, 2))
                  positionsClosedBlocks <- matrix(rep(NA, local.N * 
                    length(blockList)), ncol = local.N)
                  positionsClosedBlocks <<- apply(positionsBlocks, 
                    c(1, 2), mean)
                  blockReferences <<- 1:length(blockList)
                  positionsBlockLabels <<- matrix(rep(0, local.N * 
                    length(blockList)), ncol = local.N)
                  blockLabels <<- Labels(blockList)
                  strataBlocks <<- Strata(blockList)
                  setUpdateAll()
                }
            }
            "replaceVertices" <- function(vertexList) {
                if (length(vertexList) > 0) {
                  namesVertices <<- Names(vertexList)
                  positionsVertices <<- Positions(vertexList)
                  if (is.matrix(positionsVertices)) {
                    positionsLabels <<- positionsVertices
                    positionsLabels[, 1] <<- positionsLabels[, 
                      1] + 0.1 * control$w
                    Labels <<- Labels(vertexList)
                    colorsVertices <<- Colors(vertexList)
                    blocksVertices <<- Blockindices(vertexList)
                    strataVertices <<- Strata(vertexList)
                    setUpdateVertices()
                    setUpdatePositions()
                  }
                  if (!is.matrix(positionsVertices)) 
                    warning("Positions of extra-vertices should have same number of coordinates;")
                  else if (!(dim(positionsVertices)[2] == local.N)) 
                    warning("New vertices should have same number of coordinates as old vertices;")
                }
            }
            "drawFactors" <- function(X.FactorEdges, X.FactorVertices) {
                dg@factorEdgeList <<- X.FactorEdges
                GraphWindow@dg@factorEdgeList <<- dg@factorEdgeList
                dg@factorVertexList <<- X.FactorVertices
                GraphWindow@dg@factorVertexList <<- dg@factorVertexList
                initFactorVariables(dg@factorVertexList)
                for (i in seq(along = dg@factorEdgeList)) {
                  f <- dg@factorEdgeList[[i]]@vertex.indices[1]
                  t <- dg@factorEdgeList[[i]]@vertex.indices[2]
                  E <- append.index.edge(c(f, t), edge.type = "FactorEdge")
                  drawEdge(E[[length(E)]], length(E), lower = TRUE, 
                    edge.type = "FactorEdge")
                }
                if (length(dg@factorVertexList) > 0) 
                  for (i in seq(along = dg@factorVertexList)) drawVertex(-i, 
                    w = control$w, vertexcolor = control$vertexColor, 
                    vertex.type = "Factor")
            }
            "setMainMenu" <- function() {
                topMenu <- tkmenu(GW.top)
                tkconfigure(GW.top, menu = topMenu)
                fileMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(fileMenu, "command", label = "Save as Postscript ... ", 
                  command = function() {
                    fileName <- tclvalue(tkgetSaveFile(initialfile = "dynamicGraph.ps", 
                      filetypes = "{{Postsript Files} {.ps}}"))
                    if (!nchar(fileName)) 
                      tkmessageBox(message = "No file was selected!")
                    else tkpostscript(canvas, file = fileName, 
                      width = control$width, height = control$height)
                  })
                tkadd(fileMenu, "command", label = "Quit", 
                  command = function() destroyView(txt = "Quit")())
                tkadd(fileMenu, "command", label = "Popup selected in panel", 
                  command = function() {
                    popupSelectedInPanel()
                  })
                tkadd(topMenu, "cascade", label = "File", menu = fileMenu)
                userMenu <- tkmenu(topMenu, tearoff = FALSE)
                "UserMainMenu" <- function(i) {
                  force(i)
                  function(...) {
                    sinkView(control$UserMenus[[i]], blocks = TRUE)
                    arguments <- Args()
                    control$UserMenus[[i]]$command(object, Arguments = arguments)
                  }
                }
                if (length(control$UserMenus) > 0) 
                  for (i in seq(along = control$UserMenus)) 
                    if (names(control$UserMenus[i]) == "MainUser") 
                    tkadd(userMenu, "command", label = control$UserMenus[[i]]$label, 
                      command = UserMainMenu(i))
                tkadd(topMenu, "cascade", label = "User", menu = userMenu)
                variableMenu <- tkmenu(topMenu, tearoff = FALSE)
                "selectVariableDialog" <- function() {
                  vertexlabels <- Labels[dg@visibleVertices]
                  ReturnVal <- selectDialog("Variable vertex selection entry", 
                    "Select variable", vertexlabels, top = GW.top)
                  if ((length(ReturnVal) > 0) && (ReturnVal != 
                    "ID_CANCEL")) {
                    variableChoice <- vertexlabels[ReturnVal]
                    j <- (1:length(Labels))[Labels == variableChoice]
                    subActivateVertex(j, color = "green", vertex.type = "Vertex")
                    msg <- paste("Click other vertex to add edge to ", 
                      variableChoice, sep = "")
                    tkmessageBox(message = msg)
                  }
                }
                tkadd(variableMenu, "command", label = "Highlight vertex (for adding edge)", 
                  command = function() selectVariableDialog())
                "selectOtherDialog" <- function(slave = TRUE) {
                  "not.in" <- function(x, l = max(x)) {
                    y <- rep(TRUE, l)
                    y[x] <- FALSE
                    return((1:l)[y])
                  }
                  vertexnames <- Names(vertexList)[not.in(dg@visibleVertices, 
                    length(vertexList))]
                  ReturnVal <- selectDialog("Variable vertex selection entry", 
                    "Select variable", vertexnames, top = GW.top)
                  if ((length(ReturnVal) > 0) && (ReturnVal != 
                    "ID_CANCEL")) {
                    variableChoice <- vertexnames[ReturnVal]
                    index <- nameToVertexIndex(variableChoice, 
                      vertexList)
                    if (length(vertexnames) > 0) 
                      subAddVertex(index, slave = slave)
                  }
                }
                tkadd(variableMenu, "command", 
                  label = "Select vertex among variables not displayed (slave)", 
                  command = function() selectOtherDialog())
                tkadd(variableMenu, "command", 
                  label = "Select vertex among variables not displayed (here)", 
                  command = function() selectOtherDialog(slave = FALSE))
              # tkadd(variableMenu, "command", label = paste("'addVertex', selected vertices and edges"), 
              #   command = function() subAddVertex(0, vertex.type = "selected", 
              #     slave = FALSE))
                tkadd(variableMenu, "command", 
                  label = paste("'dropVertex', selected vertices and edges"), 
                  command = function() subDropVertex(0, vertex.type = "selected", 
                    slave = FALSE))
                tkadd(variableMenu, "command", 
                  label = "Create new variable (not displayed before selected)", 
                  accelerator = "(~ <F3>)", command = function() subNewVertex(rep(0, 
                    local.N)))
                tkadd(topMenu, "cascade", label = "Variables", 
                  menu = variableMenu)
                expVarMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(variableMenu, "cascade", label = "Export & show", 
                  menu = expVarMenu)
                edgesMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(edgesMenu, "command", label = " ... ", 
                  command = function() {
                  })
                tkadd(edgesMenu, "command", label = "Delete all edge labels (for good)", 
                  accelerator = "<F6>", command = function() {
                    deleteAllEdgeLabels()()
                    control$namesOnEdges <<- FALSE
                  })
                tkadd(edgesMenu, "command", label = "Delete all edge labels (temporary)", 
                  command = function() {
                    deleteAllEdgeLabels(permanent = FALSE)()
                  })
                tkadd(edgesMenu, "command", label = paste("'addEdge', selected vertices and edges"), 
                  command = function() subAddEdge(0, 0, "none", 
                    "none", edge.type = "selected", slave = FALSE, 
                    edgeClass = NULL)) # 'edgeClass' = NULL ???
                tkadd(edgesMenu, "command", label = paste("'dropEdge', selected vertices and edges"), 
                  command = function() subSubDropEdge(0, 0, 0, 
                    "none", "none", edge.type = "selected", slave = FALSE))
                expEdgesMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(edgesMenu, "cascade", label = "Export & show", 
                  menu = expEdgesMenu)
                tkadd(topMenu, "cascade", label = "Edges", menu = edgesMenu)
                generatorsMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(generatorsMenu, "command", label = " ... e.i. factors ", 
                  command = function() {
                  })
                expGenMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(generatorsMenu, "cascade", label = "Export & show", 
                  menu = expGenMenu)
                tkadd(topMenu, "cascade", label = "Generators", 
                  menu = generatorsMenu)
                blocksMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(blocksMenu, "command", label = " ... ", 
                  command = function() {
                  })
                tkadd(blocksMenu, "command", label = "Add new block", 
                  accelerator = "(~ <F4>)", command = function() {
                    n <- length(blockList)
                    position <- rep(0, local.N) + n
                    delta <- c(10, 10, rep(50, local.N - 2))
                    position <- matrix(c(position - delta, position + 
                      delta), nrow = 2, byrow = TRUE)
                    new.Block(position)
                  })
                expBlockMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(blocksMenu, "cascade", label = "Export & show", 
                  menu = expBlockMenu)
                tkadd(topMenu, "cascade", label = "Blocks", menu = blocksMenu)
                graphMenu <- tkmenu(topMenu, tearoff = FALSE)
                slaveMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(slaveMenu, "command", label = "Same model", 
                  command = function() {
                    makeSlave(sameModel = TRUE, local.Views = dm.frameViews, 
                      Object = object, label = control$label)
                  })
                tkadd(slaveMenu, "command", label = "Same model, switch 'variableFrame'", 
                  command = function() {
                    makeSlave(sameModel = TRUE, local.Views = dm.frameViews, 
                      Object = object, label = control$label, variableFrame = !control$variableFrame)
                  })
                tkadd(slaveMenu, "command", label = "Copy model", 
                  command = function() {
                    makeSlave(sameModel = FALSE, local.Views = NULL, 
                      Object = object, label = "Default")
                  })
                tkadd(graphMenu, "cascade", label = "Make slave window", 
                  menu = slaveMenu)
                tkadd(graphMenu, "command", label = "Set 'viewType', class of graph window", 
                  command = function() {
                    Arguments <- Args()
                    ReturnVal <- selectDialog("Test selectDialog Entry", 
                      "Select name", control$viewClasses[, 1], 
                      top = GW.top)
                    if ((length(ReturnVal) > 0) && (ReturnVal != 
                      "ID_CANCEL")) {
                      setModel(object, txt = "SetClassOfView", 
                        setUpdate = FALSE, RR = NULL)
                      class(GraphWindow) <<- control$viewClasses[ReturnVal, 
                        2]
                      dg@viewType <<- control$viewClasses[ReturnVal, 
                        1]
                      tkconfigure(GW.top$env$viewLabel, text = dg@viewType)
                      updateModel()
                    }
                  })
                refreshMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(refreshMenu, "command", label = "Refresh view (set positions as 'stored')", 
                  command = function() {
                    subUpdateGraphWindow("Update from main menu", 
                      redrawVertices = TRUE, raiseEdges = TRUE, 
                      updateEdges = TRUE, all.blockframes = TRUE)
                    sinkView(NULL, edges = TRUE, blocks = TRUE)
                  })
                tkadd(refreshMenu, "command", label = "Redraw graph window (more refreshing)", 
                  command = function() {
                    Arguments <- Args()
                    redrawView(frameModels = dgm.frameModels, 
                      frameViews = dm.frameViews, graphWindow = GraphWindow, 
                      dg = dg, control = control, Arguments = Arguments)
                  })
                tkadd(graphMenu, "cascade", label = "Refresh", 
                  menu = refreshMenu)
                transformationMenu <- tkmenu(topMenu, tearoff = FALSE, 
                  postcommand = function() nullTrans <<- tclVar(is.null(transformation)))
                nullTrans <- tclVar(is.null(transformation))
                tkadd(transformationMenu, "radiobutton", label = "Reset (enable) transformation", 
                  variable = nullTrans, value = 0, command = function() setTransformation(diag(1, 
                    local.N)))
                tkadd(transformationMenu, "radiobutton", label = "Disable rotation", 
                  variable = nullTrans, value = 1, command = function() setTransformation(NULL))
                tkadd(graphMenu, "cascade", label = "Rotation: The transformation", 
                  menu = transformationMenu)
                tkadd(graphMenu, "command", label = "Close", 
                  accelerator = "(~ [X])", command = function() destroyView(txt = "Close")())
                if (control$permitZoom) {
                  tkadd(graphMenu, "command", label = "Zoom in", 
                    accelerator = "(~ <F1>)", command = function() zoom(zoomCenter, 
                      2^0.25))
                  tkadd(graphMenu, "command", label = "Zoom out", 
                    accelerator = "(~ <F2>)", command = function() zoom(zoomCenter, 
                      2^-0.25))
                }
                nameLabelMenu <- tkmenu(topMenu, tearoff = FALSE, 
                  postcommand = function() useNames <<- tclVar(control$useNamesForLabels))
                useNames <- tclVar(control$useNamesForLabels)
                tkadd(nameLabelMenu, "radiobutton", label = "Labels is labels", 
                  variable = useNames, value = 0, command = function() {
                    control$useNamesForLabels <<- FALSE
                    subUpdateGraphWindow("useNamesForLabels", 
                      redrawVertices = TRUE, raiseEdges = FALSE, 
                      updateEdges = FALSE, all.blockframes = FALSE)
                  })
                tkadd(nameLabelMenu, "radiobutton", label = "Use names for labels", 
                  variable = useNames, value = 1, command = function() {
                    control$useNamesForLabels <<- TRUE
                    subUpdateGraphWindow("useNamesForLabels", 
                      redrawVertices = TRUE, raiseEdges = FALSE, 
                      updateEdges = FALSE, all.blockframes = FALSE)
                  })
                tkadd(graphMenu, "cascade", label = "Names for labels", 
                  menu = nameLabelMenu)
                tkadd(topMenu, "cascade", label = "Graph", menu = graphMenu)
                exportMenu <- tkmenu(topMenu, tearoff = FALSE)
                expGraphMenu <- tkmenu(topMenu, tearoff = FALSE)
                tkadd(graphMenu, "cascade", label = "Export & show", 
                  menu = expGraphMenu)
                "argsExport" <- function() {
                  ReturnVal <- modalDialog("Args Name Entry", 
                    "Enter name for Args", "Args", top = GW.top)
                  sinkView(NULL, edges = TRUE, blocks = TRUE)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  assign(ReturnVal, Args(), pos = 1)
                }
                tkadd(expGraphMenu, "command", label = "Assign 'Args' in .GlobalEnv", 
                  command = function() argsExport())
                tkadd(exportMenu, "command", label = "Assign 'Args' in .GlobalEnv", 
                  command = function() argsExport())
                "updateAllPositionsMenu" <- function() {
                  subSinkAllFrames("Positions", txt = "Update")
                  Str(dgm.frameModels, excludeSlots = TRUE)
                }
                tkadd(expGraphMenu, "command", label = "Update positions of all views of 'frameModels'", 
                  command = function() updateAllPositionsMenu())
                tkadd(exportMenu, "command", label = "Update positions of all views of 'frameModels'", 
                  command = function() updateAllPositionsMenu())
                "updateAllArgumentsMenu" <- function() {
                  subSinkAllFrames("Arguments", menuItem = NULL, 
                    vertices = TRUE, edges = TRUE, blocks = TRUE)
                  Str(dgm.frameModels, excludeSlots = TRUE)
                }
                tkadd(expGraphMenu, "command", label = "Update all slots of 'frameModels'", 
                  command = function() updateAllArgumentsMenu())
                tkadd(exportMenu, "command", label = "Update all slots of 'frameModels'", 
                  command = function() updateAllArgumentsMenu())
                "latticeModelsExport" <- function() {
                  ReturnVal <- modalDialog("Lattice for Models Name Entry", 
                    "Enter name for lattice for models", "frameModels", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  sinkView(NULL, edges = TRUE, blocks = TRUE)
                  Str(dgm.frameModels, excludeSlots = TRUE)
                  message("Consider: \"Update all slots of 'frameModels'\" before 'export'")
                  assign(ReturnVal, dgm.frameModels, pos = 1)
                }
                tkadd(expGraphMenu, "command", label = "Assign 'frameModels' in .GlobalEnv", 
                  command = function() latticeModelsExport())
                tkadd(exportMenu, "command", label = "Assign 'frameModels' in .GlobalEnv", 
                  command = function() latticeModelsExport())
                "latticeGraphsExport" <- function() {
                  ReturnVal <- modalDialog("Lattice for Views Name Entry", 
                    "Enter name for lattice for views", "frameViews", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  sinkView(NULL, edges = TRUE, blocks = TRUE)
                  Str(dm.frameViews, excludeSlots = c("class", 
                    "label", "label.position"))
                  message("Consider: \"Update all slots of 'frameModels'\" ")
                  assign(ReturnVal, dm.frameViews, pos = 1)
                }
                tkadd(expGraphMenu, "command", label = "Assign 'frameViews' in .GlobalEnv", 
                  command = function() latticeGraphsExport())
                tkadd(exportMenu, "command", label = "Assign 'frameViews' in .GlobalEnv", 
                  command = function() latticeGraphsExport())
                "graphWindowExport" <- function() {
                  ReturnVal <- modalDialog("GraphWindow Name Entry", 
                    "Enter name for graphWindow", "graphWindow", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  sinkView(NULL, edges = TRUE, blocks = TRUE)
                  Str(GraphWindow, excludeSlots = c("class", 
                    "label", "label.position"))
                  assign(ReturnVal, GraphWindow, pos = 1)
                }
                tkadd(expGraphMenu, "command", label = "Assign 'graphWindow' in .GlobalEnv", 
                  command = function() graphWindowExport())
                tkadd(exportMenu, "command", label = "Assign 'graphWindow' in .GlobalEnv", 
                  command = function() graphWindowExport())
                "objectExport" <- function() {
                  ReturnVal <- modalDialog("Object Name Entry", 
                    "Enter name for object", "object", top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  assign(ReturnVal, object, pos = 1)
                }
                tkadd(exportMenu, "command", label = "Assign 'object' in .GlobalEnv", 
                  command = function() objectExport())
                tkadd(expGraphMenu, "command", label = "Assign 'object' in .GlobalEnv", 
                  command = function() objectExport())
                "transformationExport" <- function() {
                  ReturnVal <- modalDialog("Transformation Name Entry", 
                    "Enter name for transformation", "transformation", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  assign(ReturnVal, transformation, pos = 1)
                }
                tkadd(exportMenu, "command", label = "Assign 'transformation' in .GlobalEnv", 
                  command = function() transformationExport())
                tkadd(expGraphMenu, "command", label = "Assign 'transformation' in .GlobalEnv", 
                  command = function() transformationExport())
                "topExport" <- function() {
                  ReturnVal <- modalDialog("Top Name Entry", 
                    "Enter name for top", "top", top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  assign(ReturnVal, GW.top, pos = 1)
                }
                tkadd(exportMenu, "command", label = "Assign 'top' in .GlobalEnv", 
                  command = function() topExport())
                tkadd(expGraphMenu, "command", label = "Assign 'top' in .GlobalEnv", 
                  command = function() topExport())
                "canvasExport" <- function() {
                  ReturnVal <- modalDialog("Canvas Name Entry", 
                    "Enter name for canvas", "canvas", top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  assign(ReturnVal, GW.top$env$canvas, pos = 1)
                }
                tkadd(exportMenu, "command", label = "Assign 'canvas' in .GlobalEnv", 
                  command = function() canvasExport())
                tkadd(expGraphMenu, "command", label = "Assign 'canvas' in .GlobalEnv", 
                  command = function() canvasExport())
                "viewLabelExport" <- function() {
                  ReturnVal <- modalDialog("ViewLabel Name Entry", 
                    "Enter name for viewLabel", "viewLabel", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  assign(ReturnVal, GW.top$env$viewLabel, pos = 1)
                }
                tkadd(exportMenu, "command", label = "Assign 'viewLabel' in .GlobalEnv", 
                  command = function() viewLabelExport())
                tkadd(expGraphMenu, "command", label = "Assign 'viewLabel' in .GlobalEnv", 
                  command = function() viewLabelExport())
                tkadd(expVarMenu, "command", label = "'print(selectedNodesMatrix(selectedNodes()))'", 
                  command = function() print(selectedNodesMatrix()))
                "vertexListExport" <- function() {
                  ReturnVal <- modalDialog("Vertices Name Entry", 
                    "Enter name for vertices", "vertexList", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  vertices <- sinkVertexList()
                  assign(ReturnVal, vertexList, pos = 1)
                }
                tkadd(expVarMenu, "command", label = "Assign 'vertexList' in .GlobalEnv", 
                  command = function() vertexListExport())
                tkadd(exportMenu, "command", label = "Assign 'vertexList' in .GlobalEnv", 
                  command = function() vertexListExport())
                tkadd(expVarMenu, "command", label = "'print(asDataFrame(vertexList))'", 
                  command = function() print(asDataFrame(vertexList)))
                tkadd(expEdgesMenu, "command", label = "'print(selectedEdgesMatrix(selectedEdges()))'", 
                  command = function() print(selectedEdgesMatrix()))
                "edgeListExport" <- function() {
                  ReturnVal <- modalDialog("Edges Name Entry", 
                    "Enter name for Edges", "edgeList", top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  edge.List <- sinkEdgeList()
                  assign(ReturnVal, edge.List, pos = 1)
                }
                tkadd(expEdgesMenu, "command", label = "Assign 'edgeList' in .GlobalEnv", 
                  command = function() edgeListExport())
                tkadd(exportMenu, "command", label = "Assign 'edgeList' in .GlobalEnv", 
                  command = function() edgeListExport())
                tkadd(expEdgesMenu, "command", label = "'print(asDataFrame(dg@edgeList))'", 
                  command = function() print(asDataFrame(dg@edgeList)))
                "extraListExport" <- function() {
                  ReturnVal <- modalDialog("ExtraVertices Name Entry", 
                    "Enter name for the extravertices", "extraList", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  extra.List <- sinkExtraVertexList()
                  assign(ReturnVal, extra.List, pos = 1)
                }
                tkadd(expEdgesMenu, "command", label = "Assign 'extraList' in .GlobalEnv", 
                  command = function() extraListExport())
                tkadd(exportMenu, "command", label = "Assign 'extraList' in .GlobalEnv", 
                  command = function() extraListExport())
                tkadd(expEdgesMenu, "command", label = "'print(asDataFrame(dg@extraList))'", 
                  command = function() print(asDataFrame(dg@extraList)))
                "extraEdgeListExport" <- function() {
                  ReturnVal <- modalDialog("ExtraEdges Name Entry", 
                    "Enter name for the extraedges", "extraEdgeList", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  extra.Edge.List <- sinkExtraEdgeList()
                  assign(ReturnVal, extra.Edge.List, pos = 1)
                }
                tkadd(expEdgesMenu, "command", label = "Assign 'extraEdgeList' in .GlobalEnv", 
                  command = function() extraEdgeListExport())
                tkadd(exportMenu, "command", label = "Assign 'extraEdgeList' in .GlobalEnv", 
                  command = function() extraEdgeListExport())
                tkadd(expEdgesMenu, "command", label = "'print(asDataFrame(dg@extraEdgeList))'", 
                  command = function() print(asDataFrame(dg@extraEdgeList)))
                "factorVertexListExport" <- function() {
                  ReturnVal <- modalDialog("FactorVertices Name Entry", 
                    "Enter name for the factorvertices", "factorVertexList", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  factorVertex.List <- sinkFactorVertexList()
                  assign(ReturnVal, factorVertex.List, pos = 1)
                }
                tkadd(expGenMenu, "command", label = "Assign 'factorVertexList' in .GlobalEnv", 
                  command = function() factorVertexListExport())
                tkadd(exportMenu, "command", label = "Assign 'factorVertexList' in .GlobalEnv", 
                  command = function() factorVertexListExport())
                tkadd(expGenMenu, "command", label = "'print(asDataFrame(dg@factorVertexList))'", 
                  command = function() print(asDataFrame(dg@factorVertexList)))
                "factorEdgeListExport" <- function() {
                  ReturnVal <- modalDialog("FactorEdges Name Entry", 
                    "Enter name for the factoredges", "factorEdgeList", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  factor.Edge.List <- sinkFactorEdgeList()
                  assign(ReturnVal, factor.Edge.List, pos = 1)
                }
                tkadd(expGenMenu, "command", label = "Assign 'factorEdgeList' in .GlobalEnv", 
                  command = function() factorEdgeListExport())
                tkadd(exportMenu, "command", label = "Assign 'factorEdgeList' in .GlobalEnv", 
                  command = function() factorEdgeListExport())
                tkadd(expGenMenu, "command", label = "'print(asDataFrame(dg@factorEdgeList))'", 
                  command = function() print(asDataFrame(dg@factorEdgeList)))
                "blockListExport" <- function() {
                  ReturnVal <- modalDialog("Blocklist Name Entry", 
                    "Enter name for the blocklist", "blockList", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  block.List <- sinkBlockList()
                  assign(ReturnVal, block.List, pos = 1)
                }
                tkadd(expBlockMenu, "command", label = "Assign 'blockList' in .GlobalEnv", 
                  command = function() blockListExport())
                tkadd(exportMenu, "command", label = "Assign 'blockList' in .GlobalEnv", 
                  command = function() blockListExport())
                tkadd(expBlockMenu, "command", label = "'print(asDataFrame(blockList))'", 
                  command = function() print(asDataFrame(blockList)))
                if (!is.null(blockTree)) {
                  "blockTreeExport" <- function() {
                    ReturnVal <- modalDialog("Blocktree Name Entry", 
                      "Enter name for the blocktree", "blockTree", 
                      top = GW.top)
                    if (ReturnVal == "ID_CANCEL") 
                      return()
                    sinkBlockList()
                    assign(ReturnVal, blockTree, pos = 1)
                  }
                  tkadd(expBlockMenu, "command", label = "Assign 'blockTree' in .GlobalEnv", 
                    command = function() blockTreeExport())
                  tkadd(exportMenu, "command", label = "Assign 'blockTree' in .GlobalEnv", 
                    command = function() blockTreeExport())
                }
                "blockEdgeListExport" <- function() {
                  ReturnVal <- modalDialog("BlockEdges Name Entry", 
                    "Enter name for the blockedges", "blockEdgeList", 
                    top = GW.top)
                  if (ReturnVal == "ID_CANCEL") 
                    return()
                  blockEdge.List <- sinkBlockEdges()
                  assign(ReturnVal, blockEdge.List, pos = 1)
                }
                tkadd(expBlockMenu, "command", label = "Assign 'blockEdgeList' in .GlobalEnv", 
                  command = function() blockEdgeListExport())
                tkadd(exportMenu, "command", label = "Assign 'blockEdgeList' in .GlobalEnv", 
                  command = function() blockEdgeListExport())
                tkadd(expBlockMenu, "command", label = "'print(asDataFrame(dg@blockEdgeList))'", 
                  command = function() print(asDataFrame(dg@blockEdgeList)))
                tkadd(topMenu, "cascade", label = "Export", menu = exportMenu)
            }
            top <- NULL
            box <- NULL
            canvas <- NULL
            viewLabel <- NULL
            tags <- NULL
            updateCountVertices <- updateCountVerticesMain
            updateCountPositions <- updateCountPositionsMain
            updateCountBlocks <- updateCountBlocksMain
            updateCountBlockEdges <- updateCountBlockEdgesMain
            if (setUpdateCountModelMain) 
                updateCountModelMain <<- updateCountModelMain + 
                  1
            updateCountModel <- updateCountModelMain
            updateWindow <- TRUE
            args <- list(...)
            "extract" <- function(x, y = x, z = "$", a = "graphComponents", 
                b = paste(a, z, y, collapse = "")) {
                eval(parse(text = paste(c("if (is.null(", x, 
                  ") && !is.null(", b, ")) {", x, " <<- ", b, 
                  " } "), collapse = "")))
            }
            Arguments <- args$Arguments
            if (!is.null(Arguments)) {
                X <- matrix(c("frameModels", "frameModels", "frameViews", 
                  "frameViews", "dg", "dg", "control", "control", 
                  "top", "top", "box", "box", "canvas", "canvas", 
                  "viewLabel", "viewLabel", "tags", "tags"), 
                  ncol = 2, byrow = TRUE)
                apply(X, 1, function(i) extract(i[1], i[2], a = "Arguments"))
                if ((is.null(dg@visibleBlocks)) && (!is.null(Arguments$visibleBlocks) || 
                  (length(Arguments$visibleBlocks) == 0))) 
                  dg@visibleBlocks <- Arguments$visibleBlocks
            }
            if (is.null(dg)) 
                dg <- .newDgGraphEdges(vertexList = vertexList, 
                  blockList = blockList, ...)
            if (is.null(dg@oriented)) 
                dg@oriented <- FALSE
            if (is.null(control)) 
                control <- dg.control(...)
            if (!is.null(args$vertexList)) {
                vertexList <<- args$vertexList
                replaceVertices(vertexList)
            }
            if (!is.null(args$blockList)) {
                blockList <<- args$blockList
                replaceBlocks(blockList)
            }
            if (is.null(args$blockList) && !is.null(args$blockTree)) {
                blockList <<- blockTreeToList(args$blockTree)
                replaceBlocks(blockList)
            }
            openTreeBlock <- rep(TRUE, length(blockList))
            if (is.null(dg@visibleVertices)) 
                dg@visibleVertices <- 1:length(vertexList)
            if (is.null(dg@visibleBlocks)) 
                dg@visibleBlocks <- 1:length(blockList)
            zoomPositions <- NULL
            Scale <- 1
            zoomCenterSet <- FALSE
            zoomCenter <- NULL
            upperLeft <- c(min.x, min.y, rep(0, local.N - 2))
            lowerRight <- c(max.x, max.y, rep(100, local.N - 
                2))
            if (is.null(dg@extraList)) 
                dg@extraList <- new("dg.VertexList")
            if (is.null(dg@edgeList)) 
                dg@edgeList <- new("dg.VertexEdgeList")
            if (is.null(dg@factorEdgeList)) 
                dg@factorEdgeList <- new("dg.FactorEdgeList")
            if (is.null(dg@extraEdgeList)) 
                dg@extraEdgeList <- new("dg.ExtraEdgeList")
            if (is.null(dg@blockEdgeList)) 
                dg@blockEdgeList <- new("dg.BlockEdgeList")
            if (!is.na(control$namesOnEdges) && !control$namesOnEdges) {
                for (i in seq(along = dg@edgeList)) label(dg@edgeList[[i]]) <- ""
                for (i in seq(along = dg@factorEdgeList)) label(dg@factorEdgeList[[i]]) <- ""
                for (i in seq(along = dg@extraEdgeList)) label(dg@extraEdgeList[[i]]) <- ""
                for (i in seq(along = dg@blockEdgeList)) label(dg@blockEdgeList[[i]]) <- ""
            }
            Oriented <- FALSE
            if (!is.na(dg@oriented)) 
                Oriented <- dg@oriented
            if (!Oriented) {
                for (i in seq(along = dg@edgeList)) {
                  if (!is.na(dg@edgeList[[i]]@oriented)) 
                    if (dg@edgeList[[i]]@oriented) {
                      dg@oriented <- TRUE
                      Oriented <- TRUE
                    }
                }
                if (Oriented) 
                  message("Oriented edge found!")
            }
            if (redraw) 
                graphWindow <- NULL
            GW.top <- (top)
            GW.tags <- tags
            GW.env <- NULL
            if (is.numeric(frameViews)) 
                dm.frameViews <- dgm.frameModels@models[[frameViews]]
            else dm.frameViews <- frameViews
            if (is.null(graphWindow)) {
                ArgWindow <- FALSE
                m <- dm.frameViews@index
                n <- 1
                if (!.IsEmpty(dgm.frameModels@models[[m]]@graphs)) 
                  n <- length(dgm.frameModels@models[[m]]@graphs) + 
                    1
                fv.env <- .get.env.frameViews(frameViews = dm.frameViews, 
                  frameModels = dgm.frameModels)
                GraphWindow <- newGraph(dg@viewType, dg, background = control$background, 
                  title = ifelse(control$label != "Default", 
                    control$label, paste(n, m, sep = "@")), parent = fv.env, 
                  index = n, width = control$width, height = control$height)
                if (control$saveTkReferences) {
                  assign("top", GW.top, envir = GW.env$env)
                  assign("tags", GW.tags, envir = GW.env$env)
                }
            }
            else {
                ArgWindow <- TRUE
                if (is.numeric(graphWindow)) 
                  GraphWindow <- dm.frameViews@graphs[[graphWindow]]
                else GraphWindow <- graphWindow
                m <- dm.frameViews@index
                gw.env <- .get.env.graphWindow(graphWindow = GraphWindow, 
                  frameViews = dgm.frameModels@models[[m]], frameModels = dgm.frameModels)
                GW.env <- gw.env
                if (is.element("top", ls(GW.env$env))) {
                  GW.top <- evalq(top, GW.env$env)
                  GW.tags <- evalq(tags, GW.env$env)
                }
                m <- dm.frameViews@index
                n <- graphWindow@index
                GraphWindow@id <- GraphWindow@id + 1
                if (!is.null(GW.top)) {
                  GraphWindow@dg@visibleVertices <- .nullToEmpty(dg@visibleVertices)
                  GraphWindow@dg@visibleBlocks <- .nullToEmpty(dg@visibleBlocks)
                  GraphWindow@dg@extraList <- .nullToList(dg@extraList, 
                    type = "dg.VertexList")
                  GraphWindow@dg@edgeList <- dg@edgeList
                  GraphWindow@dg@factorVertexList <- .nullToList(dg@factorVertexList, 
                    type = "dg.FactorVertexList")
                  GraphWindow@dg@factorEdgeList <- dg@factorEdgeList
                  GraphWindow@dg@extraEdgeList <- dg@extraEdgeList
                  GraphWindow@dg@blockEdgeList <- dg@blockEdgeList
                  deleteTags()
                  GW.tags <- list(NULL)
                  if (control$saveTkReferences) 
                    assign("tags", GW.tags, envir = GW.env$env)
                  bindBox(GW.top$env$box, label = "redrawView")
                }
                else {
                  GraphWindow <- newGraph(dg@viewType, dg, background = control$background, 
                    title = ifelse(control$label != "Default", 
                      control$label, paste(n, m, sep = "@")), 
                    id = GraphWindow@id, index = n, parent = dm.frameViews.env, 
                    width = control$width, height = control$height)
                }
            }
            activatedNode <- list(number = 0, vertex.type = "Null")
            selectedNodes <- list()
            activatedEdge <- list(number = 0, edge.type = NULL)
            selectedEdges <- list()
            itemsFactors <- NULL
            itemsFactorEdges <- NULL
            namesFactorVertices <- NULL
            itemsExtraEdges <- NULL
            positionsFactorVertices <- NULL
            positionsFactorLabels <- NULL
            factorLabels <- NULL
            colorsFactorVertices <- NULL
            strataFactorVertices <- NULL
            blocksFactorVertices <- NULL
            if (FALSE && !is.null(dg@factorVertexList)) {
                namesFactorVertices <- Names(dg@factorVertexList)
                positionsFactorVertices <- Positions(dg@factorVertexList)
                positionsFactorLabels <- NULL
                factorLabels <- Labels(dg@factorVertexList)
                colorsFactorVertices <- Colors(dg@factorVertexList)
                strataFactorVertices <- Strata(dg@factorVertexList)
                blocksFactorVertices <- Blockindices(dg@factorVertexList)
            }
            itemsExtras <- NULL
            itemsExtraEdges <- NULL
            namesExtraVertices <- NULL
            positionsExtraVertices <- NULL
            positionsExtraLabels <- NULL
            extraLabels <- NULL
            colorsExtraVertices <- NULL
            strataExtraVertices <- NULL
            blocksExtraVertices <- NULL
            if (FALSE && !is.null(dg@extraList)) {
                namesExtraVertices <- Names(dg@extraList)
                positionsExtraVertices <- Positions(dg@extraList)
                positionsExtraLabels <- NULL
                extraLabels <- Labels(dg@extraList)
                colorsExtraVertices <- Colors(dg@extraList)
                strataExtraVertices <- Strata(dg@extraList)
                blocksExtraVertices <- Blockindices(dg@extraList)
            }
            Angle <- 10
            canvas <- GW.top$env$canvas
            itemsEdges <- vector("list", length(vertexList))
            itemsVertices <- vector("list", length(vertexList))
            itemsOpenBlocks <- vector("list", length(blockList))
            itemsClosedBlocks <- vector("list", length(blockList))
            positionsEdgeLabels <- NULL
            closedVertex <- rep(FALSE, length(vertexList))
            closedBlock <- rep(FALSE, length(blockList))
            hiddenBlock <- rep(FALSE, length(blockList))
            if (!.IsEmpty(blockList)) {
                blockList <<- checkBlockList(blockList)
                if (!is.null(Arguments) && !is.null(Arguments$closedBlock)) 
                  closedBlock <- Arguments$closedBlock
                else closedBlock <- Closed(blockList)
                hiddenBlock <- closedBlock
                for (i in seq(along = blockList)) hiddenBlock[i] <- isInClosedBlock(i)
                if (!is.null(Arguments) && !is.null(Arguments$hiddenBlock)) {
                  hiddenBlock <- hiddenBlock | Arguments$hiddenBlock
                }
                dg@visibleBlocks <- unique(sort(dg@visibleBlocks))
                dg@visibleBlocks <- dg@visibleBlocks[dg@visibleBlocks != 
                  0]
                for (i in seq(along = vertexList)) {
                  s <- blocksVertices[i]
                  if (s %in% dg@visibleBlocks) 
                    closedVertex[i] <- closedBlock[s] || hiddenBlock[s]
                }
                if (!is.null(dg@visibleBlocks) && length(dg@visibleBlocks) == 
                  0) 
                  hiddenBlock <- hiddenBlock
            }
            itemsBlockEdges <- list(NULL)
            if (!.IsEmpty(blockList)) {
                itemsBlockEdges <- vector("list", length(blockList))
            }
            initFactorVariables(dg@factorVertexList)
            initExtraVariables(dg@extraList)
            if (!.IsEmpty(blockList)) 
                for (i in seq(along = blockList)) if (is.na(hiddenBlock[i])) 
                  message("hiddenBlock missing!!")
                else if (!hiddenBlock[i]) 
                  if (is.element(i, dg@visibleBlocks)) 
                    if (is.na(closedBlock[i])) 
                      message("closedBlock missing!!")
                    else if (closedBlock[i]) 
                      drawVertex(i, w = 10, vertexcolor = "Black", 
                        vertex.type = "ClosedBlock")
                    else drawBlock(blockList[[i]], i)
            for (i in seq(along = dg@edgeList)) drawEdge(dg@edgeList[[i]], 
                i, edge.type = "VertexEdge")
            for (i in seq(along = dg@factorEdgeList)) drawEdge(dg@factorEdgeList[[i]], 
                i, edge.type = "FactorEdge")
            for (i in seq(along = dg@extraEdgeList)) drawEdge(dg@extraEdgeList[[i]], 
                i, edge.type = "ExtraEdge")
            for (i in seq(along = dg@blockEdgeList)) drawEdge(dg@blockEdgeList[[i]], 
                i, edge.type = "BlockEdge")
            for (i in seq(along = vertexList)) if (is.element(i, 
                dg@visibleVertices)) 
                if (!closedVertex[i]) 
                  drawVertex(i, w = control$w, vertexcolor = control$vertexColor, 
                    vertex.type = "Vertex")
            if (length(dg@factorVertexList) > 0) 
                for (i in seq(along = dg@factorVertexList)) drawVertex(-i, 
                  w = control$w, vertexcolor = control$vertexColor, 
                  vertex.type = "Factor")
            if (length(dg@extraList) > 0) 
                for (i in seq(along = dg@extraList)) drawVertex(i, 
                  w = control$w, vertexcolor = control$vertexColor, 
                  vertex.type = "Extra")
            if (initialWindow) 
                update.edge.labels()
            setMainMenu()
            # tkbind(canvas, "<B1-Motion>", moveCanvas())
            tkbind(canvas, "<B2-Motion>", moveCanvas())
            tkbind(canvas, "<B3-Motion>", doHandRotate())
            tkbind(canvas, "<F12>", rockPlot(k = 1))
            tkbind(canvas, "<F1>", zoomIn())
            tkbind(canvas, "<F2>", zoomOut())
            tkbind(canvas, "<F3>", newVertexXY())
            tkbind(canvas, "<F4>", newBlockXY())
            tkbind(canvas, "<F5>", addLastEdge())
            tkbind(canvas, "<F6>", deleteAllEdgeLabels())
            tkbind(canvas, "<F7>", function(...) {
                print("<<F7>>")
            })
            tkbind(canvas, "<F12>", function(...) {
                print("<<F12>>")
            })
            tkbind(canvas, "<Up>", keyRotate(v = 1, sign = 1))
            tkbind(canvas, "<Down>", keyRotate(v = 1, sign = -1))
            tkbind(canvas, "<Left>", keyRotate(v = 2, sign = 1))
            tkbind(canvas, "<Right>", keyRotate(v = 2, sign = -1))
            tkbind(canvas, "<Prior>", keyRotate(v = 3, sign = 1))
            tkbind(canvas, "<Next>", keyRotate(v = 3, sign = -1))
            tkbind(canvas, "<Destroy>", destroyView(txt = "Canvas"))
            tkbind(canvas, "<Home>", function(...) {
                print("<<Fn-PgUp>>")
            })
            tkbind(canvas, "<End>", function(...) {
                print("<<Fn-PgDn>>")
            })
            tkbind(canvas, "<Alt_L>", function(...) {
                print("<<A>>")
            })
            tkbind(canvas, "<Delete>", function(...) {
                print("<<Delete>>")
            })
            tkbind(canvas, "<Pause>", function(...) {
                print("<<Pause>>")
            })
            tkbind(canvas, "<space>", function(...) {
                print("<<space>>")
            })
            tkbind(canvas, "<Tab>", function(...) {
                print("<<Tab>>")
            })
            tkbind(canvas, "<slash>", function(...) {
                print("<<slash>>")
            })
            tkbind(canvas, "<less>", function(...) {
                print("<<less>>")
            })
            tkbind(canvas, "<greater>", function(...) {
                print("<<greater>>")
            })
            tkbind(canvas, "<Escape>", function(...) {
                print("<<Escape>>")
            })
            tkbind(canvas, "<Shift-Up>", function(...) {
                print("<<Shift-Up>>")
            })
            tkbind(canvas, "<Shift-Down>", function(...) {
                print("<<Shift-Down>>")
            })
            tkbind(canvas, "<minus>", function(...) {
                print("<<minus>>")
            })
            tkbind(canvas, "<plus>", function(...) {
                print("<<plus>>")
            })
            tkbind(canvas, "<backslash>", function(...) {
                print("--backslash--")
            })
            tkbind(canvas, "<Alt-1>", function(...) {
                print("--A1#--")
            })
            if (control$debug.update) 
                tkbind(GW.top$env$viewLabel, "<Enter>", 
                       function() print(dg@viewType))
            tkbind(canvas, "<Configure>", resizeCanvas())
            if (control$enterLeaveUpdate) {
                tkbind(canvas, "<Enter>", updatePositions("Enter"))
                if (control$updateAllViews) 
                  tkbind(canvas, "<Leave>", sinkAllFrames("Positions", 
                    "Leave"))
                else tkbind(canvas, "<Leave>", updatePositions("Leave"))
            }
            m <- dm.frameViews@index
            if (control$saveFunctions) {
                assign("Update", update, envir = GW.env$env)
            }
            if (!redraw) 
                if (!ArgWindow) {
                  if (.IsEmpty(dgm.frameModels@models[[m]]@graphs)) {
                    dm.frameViews@graphs <<- list(GraphWindow)
                    dgm.frameModels@models[[m]] <<- dm.frameViews
                  }
                  else {
                    dm.frameViews@graphs <<- append(dgm.frameModels@models[[m]]@graphs, 
                      list(GraphWindow))
                    dgm.frameModels@models[[m]] <<- dm.frameViews
                  }
                }
                else {
                  dm.frameViews@graphs[[n]] <<- GraphWindow
                  dgm.frameModels@models[[m]]@graphs[[n]] <<- GraphWindow
                }
            if (!initialWindow) 
                updateBlockEdges()
            if (hasMethod("setGraphEdges", class(object))) {
                # message("Using 'setGraphEdges' for your model class.")
                object <<- setGraphEdges(object, dg = dg, ...)
            }
            else if (hasMethod("setGraphComponents", class(object))) {
                message("Please implement 'setGraphEdges' for your model class.")
                if (is.null(dg@edgeList)) 
                  dg@edgeList <- new("dg.VertexEdgeList")
                object <<- setGraphComponents(object, viewType = dg@viewType, 
                  visibleVertices = dg@visibleVertices, visibleBlocks = dg@visibleBlocks, 
                  extraVertices = dg@extraList, vertexEdges = dg@edgeList, 
                  blockEdges = dg@blockEdgeList, factorVertices = dg@factorVertexList, 
                  factorEdges = dg@factorEdgeList, extraEdges = dg@extraEdgeList)
            }
            if (control$returnNull) 
                return(NULL)
            else if (returnFrameModel) 
                invisible(dgm.frameModels)
            else invisible(GraphWindow)
        }
        updateCountModelMain <- 0
        if (is.numeric(frameViews)) 
            dm.frameViews <- dgm.frameModels@models[[frameViews]]
        else dm.frameViews <- frameViews
        if (is.null(dm.frameViews)) {
            ArgFrameViews <- FALSE
            m <- 1
            if (!.IsEmpty(dgm.frameModels@models)) 
                m <- length(dgm.frameModels@models) + 1
            Label <- control$label
            if (is.object(object) && ("name" %in% slotNames(object))) 
                Label <- paste(control$label, object@name)
            dm.frameViews.env <- .Dg.toplevel(parent = frameModelsEnv)
            dm.frameViews <- .newDynamicGraphModelObject(object, 
                label = Label, index = m, parent = frameModelsEnv, 
                env = dm.frameViews.env)
            if (control$saveFunctions) {
                assign("RedrawView", redrawView, envir = dm.frameViews.env$env)
            }
            else {
                txt <- "(( No 'update' and 'overwrite' since 'saveFunctions = FALSE'))"
                message(txt)
            }
        }
        else {
            ArgFrameViews <- TRUE
            m <- dm.frameViews@index
            dm.frameViews.env <- .get.env.frameViews(frameViews = dgm.frameModels@models[[m]], 
                frameModels = dgm.frameModels)
            if (is.null(dm.frameViews.env)) {
                dm.frameViews.env <- .Dg.toplevel(parent = frameModelsEnv)
                dm.frameViews@id.env <- dm.frameViews.env$ID
            }
            object <- dm.frameViews@model[[1]]
        }
        if (returnNewMaster || redraw) {
            graphs <- dm.frameViews@graphs
            if (!redraw) 
                dm.frameViews@graphs <- list()
            if (length(graphs) > 0) 
                for (i in (1:length(graphs))) if (!is.null(graphs[[i]])) {
                  ViewType <- control$viewClasses[control$viewClasses[, 
                    2] == class(graphs[[i]]), 1]
                  ldg <- .newDgGraphEdges(vertexList = vertexList, 
                    oriented = graphs[[i]]@dg@oriented, viewType = ViewType, 
                    visibleVertices = graphs[[i]]@dg@visibleVertices, 
                    visibleBlocks = graphs[[i]]@dg@visibleBlocks, 
                    edgeList = graphs[[i]]@dg@edgeList, blockList = blockList, 
                    blockEdgeList = graphs[[i]]@dg@blockEdgeList, 
                    factorVertexList = graphs[[i]]@dg@factorVertexList, 
                    factorEdgeList = graphs[[i]]@dg@factorEdgeList, 
                    extraList = graphs[[i]]@dg@extraList, extraEdgeList = graphs[[i]]@dg@extraEdgeList)
                  R <- redrawView(frameModels = dgm.frameModels, 
                    frameViews = dm.frameViews, graphWindow = graphs[[i]], 
                    dg = ldg, returnNewMaster = returnNewMaster, 
                    redraw = redraw, returnFrameModel = FALSE, 
                    control = control)
                }
        }
        if (!redraw) 
            if (!ArgFrameViews) {
                if (.IsEmpty(dgm.frameModels@models)) 
                  dgm.frameModels@models <<- list(dm.frameViews)
                else dgm.frameModels@models <<- append(dgm.frameModels@models, 
                  list(dm.frameViews))
            }
            else {
                dgm.frameModels@models[[m]] <<- dm.frameViews
            }
        if (!redraw && !returnNewMaster) {
            local.graphWindow <- redrawView(frameModels = dgm.frameModels, 
                frameViews = dm.frameViews, graphWindow = graphWindow, 
                dg = dg, initialWindow = initialWindow, returnNewMaster = FALSE, 
                redraw = FALSE, returnFrameModel = FALSE, control = control)
        }
        if (returnFrameModel) 
            invisible(dgm.frameModels)
        else invisible(dm.frameViews)
    }
    Arguments <- list(...)
    dgm.frameModels <- NULL
    if (!is.null(Arguments$dgm.frameModels)) 
        dgm.frameModels <- Arguments$dgm.frameModels
    if (!is.null(Arguments$frameModels)) 
        dgm.frameModels <- Arguments$frameModels
    returnNewMaster <- FALSE
    if (!is.null(Arguments$returnNewMaster)) 
        returnNewMaster <- Arguments$returnNewMaster
    redraw <- FALSE
    if (!is.null(Arguments$redraw)) 
        redraw <- Arguments$redraw
    updateCountVerticesMain <- 0
    updateCountPositionsMain <- 0
    updateCountBlocksMain <- 0
    updateCountBlockEdgesMain <- 0
    if (is.null(dgm.frameModels)) {
        dgm.frameModels.env <- .Dg.toplevel()
        dgm.frameModels <- .newDynamicGraphObject(vertexList, 
            blocks = blockList, blockTree = blockTree, label = control$label, 
            control = control, parent = .DgRoot, env = dgm.frameModels.env)
        if (control$saveFunctions) 
            assign("DrawModel", drawModel, envir = dgm.frameModels.env$env)
    }
    else {
        dgm.frameModels.env <- .Dg.toplevel()
        dgm.frameModels@id.env <- dgm.frameModels.env$ID
    }
    if (redraw) {
        vertexList <- dgm.frameModels@vertices
        blockList <- dgm.frameModels@blocks
        if (length(blockList) == 0) 
            blockList <- NULL
    }
    namesVertices <- Names(vertexList)
    positionsVertices <- Positions(vertexList)
    if (is.matrix(positionsVertices)) {
        indices <- Indices(vertexList)
        if (!all(seq(length(indices)) == indices)) {
            warning("Invalid indices of vertices replaces")
            Indices(vertexList) <- seq(length(indices))
            indices <- Indices(vertexList)
        }
        positionsLabels <- positionsVertices
        positionsLabels[, 1] <- positionsLabels[, 1] + 0.1 * 
            control$w
        Labels <- Labels(vertexList)
        constrainedVertices <- Constrained(vertexList)
        colorsVertices <- Colors(vertexList)
        blocksVertices <- Blockindices(vertexList)
        strataVertices <- Strata(vertexList)
        local.N <- ncol(positionsVertices)
        if (is.null(blockList) && !is.null(blockTree)) 
            blockList <- blockTreeToList(blockTree)
        positionsBlock <- NULL
        positionsBlockLabels <- NULL
        positionsClosedBlocks <- NULL
        blockLabels <- NULL
        strataBlocks <- NULL
        if (!.IsEmpty(blockList)) {
            positionsBlocks <- Positions(blockList)
            d <- dim(positionsBlocks)
            positionsBlocks <- array(positionsBlocks, dim = c(d[1], 
                d[2]/2, 2))
            positionsClosedBlocks <- matrix(rep(NA, local.N * 
                length(blockList)), ncol = local.N)
            positionsClosedBlocks <- apply(positionsBlocks, c(1, 
                2), mean)
            blockReferences <- 1:length(blockList)
            positionsBlockLabels <- matrix(rep(0, local.N * length(blockList)), 
                ncol = local.N)
            blockLabels <- Labels(blockList)
            strataBlocks <- Strata(blockList)
        }
        if (returnNewMaster || redraw) {
            models <- dgm.frameModels@models
            if (!redraw) 
                dgm.frameModels@models <- list()
            for (i in (1:length(models))) {
                frameViews <- models[[i]]
                object <- models[[i]]@model
                R <- drawModel(frameModels = dgm.frameModels, 
                  frameViews = frameViews, graphWindow = NULL, 
                  object = object, frameModelsEnv = dgm.frameModels.env, 
                  initialWindow = TRUE, returnNewMaster = returnNewMaster, 
                  redraw = redraw, returnFrameModel = FALSE, 
                  control = control)
            }
        }
        if (!redraw) {
            local.frameViews <- drawModel(frameModels = dgm.frameModels, 
                frameViews = NULL, graphWindow = NULL, frameModelsEnv = dgm.frameModels.env, 
                dg = dg, object = object, initialWindow = TRUE, 
                returnNewMaster = FALSE, redraw = FALSE, returnFrameModel = FALSE, 
                control = control)
        }
    }
    else {
        dgm.frameModels <- NULL
        warning("Positions of vertices should have same number of coordinates")
    }
    if (control$returnNull) 
        return(NULL)
    else invisible(dgm.frameModels)
}

Try the dynamicGraph package in your browser

Any scripts or data that you put into this service are public.

dynamicGraph documentation built on May 2, 2019, 6:38 a.m.