/////////////////////////////////////////////////////////////////////////////// // NAME // CalculateCoordinates // ARGUMENTS // grfx - pointer to Device Context // DESCRIPTION // Caluclate the coordinates for the entire tree // RETURN VALUE // none // public void CalculateCoordinates(Graphics grfx) { InitCoordinates(); if (m_Root == null) { return; // nothing to calculate } // adjust graphics grfx.PageUnit = GraphicsUnit.Millimeter; grfx.PageScale = .01f; // Calculate height for each level m_Root.CalculateMaxHeight(this, grfx); // Calculate vertical position for root and all daughters m_Root.CalculateYCoordinate(InitialYCoord, this, grfx); // Calculate horizontal position for root and all daughters #if DoTrace Console.WriteLine("Beginning calculations"); #endif m_iHorizontalOffset = InitialXCoord; m_Root.CalculateXCoordinate(this, grfx, 0); if (UseRightToLeft) { UseRightToLeftOrientation(); } }
/////////////////////////////////////////////////////////////////////////////// // NAME // CalculateXCoordinate // ARGUMENTS // pTree - pointer to tree this node is in // pDC - pointer to the device context // iMaxColWidth - maximum width of the current column // DESCRIPTION // Determine the X-axis coordinate for this node // It assumes that the width of this and all other nodes have // already been established. // It also assumes that higher branching nodes are not wider than the // total width of their daughters (which may not always be true...) // RETURN VALUE // The X-axis coordinate at the mid-point of this node // public int CalculateXCoordinate(LingTreeTree Tree, Graphics grfx, int iMaxColWidth) { XMid = 0; // Determine the width for this node CalculateWidth(Tree, grfx); if (Daughter != null) { // is a non-terminal node LingTreeNode NextDaughter = Daughter.Sister; if (NextDaughter != null) { // node branches if (iMaxColWidth < m_iWidth) { iMaxColWidth = m_iWidth; // remember widest node in the column } } else { // only one daughter, so could be in a column if (iMaxColWidth < Width) { iMaxColWidth = Width; // remember widest node in the column } } int iLeftMost = Daughter.CalculateXCoordinate(Tree, grfx, iMaxColWidth); int iRightMost = iLeftMost; while (NextDaughter != null) { // calculate coordinates for other daughters iRightMost = NextDaughter.CalculateXCoordinate(Tree, grfx, iMaxColWidth); NextDaughter = NextDaughter.Sister; } // take mid point between first & last daughter XMid = (iLeftMost + iRightMost) / 2; if (iRightMost > iLeftMost) { if (m_iWidth > (iRightMost - iLeftMost)) { int iAdjust = (m_iWidth - (iRightMost - iLeftMost)) / 2; m_iXMid += iAdjust; NextDaughter = Daughter; while (NextDaughter != null) { NextDaughter.AdjustXValues(Tree, iAdjust); NextDaughter = NextDaughter.Sister; } } } } else { // is a terminal node if (iMaxColWidth < Width) { iMaxColWidth = Width; // this might be the widest node in the column } XMid = (int)Tree.HorizontalOffset + // Offset from last terminal node plus iMaxColWidth / 2; // half the width of this column Tree.HorizontalOffset = XMid + // have a new offset for next terminal node Tree.HorizontalGap + // gap between terminal nodes plus iMaxColWidth / 2; // half the width of the widest node in this column } XCoord = XMid - Width / 2; // adjust for width of this node int iEnd = XCoord + Width; if (Triangle) { iEnd += Tree.HorizontalGap / 2; } if (iEnd > Tree.XSize) { Tree.XSize = iEnd; // Keep track of total width for scrolling } #if DoTrace Console.WriteLine("{0}\tXSize = {1},\tWidth = {2},\tXCoord = {3},\tYCoord = {4}, \tXMid = {4}", Content, Tree.XSize, Width, XCoord, YCoord, XMid); #endif return(XMid); }