public void calcDimsAndStartPts(LinkedList llist, draw d) {
    /*  Determines the following variables Lenx, Leny, Startx, Starty,
    TitleStarty   */
    // Task: Calculate the length and height of a node and its starting point.
    //   It also computes the y-coordinate of the title

    double TitleToSSGap, MinGt, MaxGt, Diam, MinTitlex, MaxTitlex;
    int NumNodes, NumLines;
    super.calcDimsAndStartPts(llist, d);
    // With circular nodes, not adding Textheight works better to finetune the circle size
    Lenx = Maxstringlength - .02;
    Leny = ((linespernode + 1) * Textheight) + ((linespernode - 1) * (0.5 * Textheight));
    TDx = (Lenx + Leny) / 5.0; // Height is a third of their average *)
    TDy = TDx / Math.sqrt(3);
    TitleToSSGap = 2 * Titleheight;
    NumLines = title.size();
    Startx = 0.0;
    Starty =
        Topy
            - IconHeight
            - IconToTitleGap
            - (NumLines * Titleheight)
            - ((NumLines - 1) * (0.5 * Titleheight))
            - TitleToSSGap
            - (Lenx / 2.0)
            - .15;
    TitleStarty = (Topy - IconHeight - IconToTitleGap - Titleheight) + .05;
  }
  //                 PROCEDURE DrawGeneralTree                            *)
  //                                                                      *)
  // This procedure calls on xCoord to obtain the x coordinate of each    *)
  // node in the tree, and then calls on ApplyModifier to to make any     *)
  // adjustments to the node positions that couldn't be made in xCoord.   *)
  // Finally, it does a pre-order traversal of the tree and draws each    *)
  // node to its rightful place in the tree, and connects appropriate     *)
  // nodes to form the binary tree.                                       *)
  void drawStructure(LinkedList llist, draw d) {
    int x;
    double TempLoc, xline[], yline[];
    double scootch = 0.0;
    GTN gtn = new GTN();
    String text, c;
    StringTokenizer checkCommand;

    super.drawStructure(llist, d);
    xline = new double[2];
    yline = new double[2];
    yline[0] = TitleEndy - .05;
    yline[1] = yline[0];
    xline[0] = 0;
    xline[1] = 1;
    // The polyline is drawn immediately under the title/caption
    LGKS.polyline(2, xline, yline, llist, d);

    if (emptyStruct()) {
      super.drawStructure(llist, d); // to handle empty structure
      return;
    }
    for (x = 0; x < MaxLevels; ++x) {
      Modifier[x] = 0.0;
      NextPos[x] =
          0.1; // 0.025;//TreeSideBorder+(Lenx/2.0); // The rightmost position at which we can plot
      // a node *)
    }

    // Scale drawings for more then 10 items
    if (nn >= 10) {
      xspacing -= (nn - 9) * .065;
    }

    // adjust the node starting position so that the sets don't overlap
    Starty -= ((nn / 7 + 2)) * .05;

    nodelist.reset();
    while (nodelist.hasMoreElements()) {
      if (nodelist.hasMoreElements()) gtn = (GTN) (nodelist.nextElement());
      else gtn = (GTN) (nodelist.currentElement());
      TempLoc = xCoord(gtn);
      ApplyModifier(gtn);
    }

    if (maxXCord + (Lenx / 2) < 1.0) {
      ModifierSum = Lenx / 2;
      if (nodelist.size() > 2)
        scootch = ((.975 - (maxXCord + (Lenx / 2))) / ((double) nodelist.size() - 1.0));
      else {
        scootch = ((1.0 - (maxXCord + (Lenx / 2))) / (double) nodelist.size());
        ModifierSum = scootch / 2;
      }
    } else ModifierSum = (((maxXCord - minXCord) / 2) - .5) * -1;

    nodelist.reset();
    x = 0;
    while (nodelist.hasMoreElements()) {
      if (nodelist.hasMoreElements()) gtn = (GTN) (nodelist.nextElement());
      else gtn = (GTN) (nodelist.currentElement());

      ApplyModifier(gtn);
      if (x == (nodelist.size() / 2) && badCommand == 1) {
        LGKS.set_text_align(0, 2, llist, d);
        LGKS.set_textline_color(4, llist, d);
        text = "Bad command!  No action taken.";
        LGKS.text(CenterScreen, (gtn.Gy + .13), text, llist, d);
        LGKS.set_text_align(1, 2, llist, d);
      }
      // The factor needed to shift the tree to the center *)
      xMin = CenterScreen - (0.5 * Maxtitlelength);
      xMax = CenterScreen + (0.5 * Maxtitlelength);
      yMax = Topy - IconHeight - IconToTitleGap;
      yMin = yMax;
      drawWalk(gtn, llist, d);
      Xcenter = (xMin + xMax) / 2.0;
      Ycenter = (yMin + yMax) / 2;
      snapheight = yMax - yMin;
      snapwidth = xMax - xMin;

      ModifierSum += scootch;
      x++;
    }

    LGKS.set_text_align(1, 2, llist, d);
    // Print Text info to screen
    if (weight == 0) text = "Weighted Union: On";
    else text = "Weighted Union: Off";
    LGKS.text(.0, (TitleEndy - .06), text, llist, d);

    if (path == 0) text = "Path Compresion: On";
    else text = "Path Compresion: Off";
    LGKS.text(.45, (TitleEndy - .06), text, llist, d);

    text = "Current Command:";
    LGKS.set_textline_color(2, llist, d);
    LGKS.text(.0, (TitleEndy - .11), text, llist, d);
    LGKS.text(.0, (TitleEndy - .15), command, llist, d);
    LGKS.set_textline_color(3, llist, d);
    text = "Average Comparsions Per Find: " + cpf;
    LGKS.text(.45, (TitleEndy - .11), text, llist, d);
    text = "Average Comparsions Per Union: " + cpu;
    LGKS.text(.45, (TitleEndy - .15), text, llist, d);

    LGKS.set_textline_color(1, llist, d);
    drawSets(llist, d);
  }