int InitWrite(int iSpace, int iDeep) { int iLength = GetWidth(); int iChildWidth = 0; int iMaxDeep = ++iDeep; CTreeNodeWriteable pFirst = FirstChild(); if (pFirst != null) { CTreeNodeWriteable pChild = pFirst; CTreeNodeWriteable pLast = pFirst; while (pChild != null) { iMaxDeep = Math.Max(iMaxDeep, pChild.InitWrite(iSpace, iDeep)); iChildWidth += (pChild.m_sWidth + iSpace); pLast = pChild; pChild = pChild.RightBrother(); } iChildWidth -= iSpace; int iFork = ((pFirst.m_sFork + (iChildWidth - (pLast.m_sWidth - pLast.m_sFork))) / 2); int iStart = (iFork - (iLength - 1) / 2); int iWidth = iChildWidth; if (iStart < 0) { iFork -= iStart; iWidth -= iStart; for (CTreeNodeWriteable pFirstChild = FirstChild(); pFirstChild != null; pFirstChild = pFirstChild.FirstChild()) { pFirstChild.m_sWidth = (short)(pFirstChild.m_sWidth - iStart); pFirstChild.m_sFork = (short)(pFirstChild.m_sFork - iStart); pFirstChild.m_sStart = (short)(pFirstChild.m_sStart - iStart); } iStart = 0; } int iPad = iStart + iLength - iWidth; if (iPad > 0) { iWidth += iPad; for (CTreeNodeWriteable pLastChild = LastChild(); pLastChild != null; pLastChild = pLastChild.LastChild()) { pLastChild.m_sWidth = (short)(pLastChild.m_sWidth + iPad); } } m_sFork = (short)iFork; m_sStart = (short)iStart; m_sWidth = (short)iWidth; m_sLength = (short)iLength; } else { m_sWidth = (short)iLength; m_sStart = 0; m_sLength = (short)iLength; m_sFork = (short)((iLength + 1) / 2 - 1); } return(iMaxDeep); }