1. add
int
CXTPDockBar::_AdjustRow(CToolBarArray& arrRow, CPoint pt, int nLength, BOOL bHorz, AFX_SIZEPARENTPARAMS* lpLayout, int& nRemove)
{
CXTPDockInfoArray arrInfo;
int nPos;
// Step 1. Getting maximum available size;
for (nPos = 0; nPos < arrRow.GetSize(); nPos++)
{
CXTPToolBar* pBar = arrRow[nPos];
CSize sizeBar = pBar->CalcDockingLayout(nLength, _GetMode(bHorz, pBar));
CPoint p = bHorz? CPoint(pBar->m_pDockContext->m_rectMRUDockPos.left, pt.y):
CPoint(pt.x, pBar->m_pDockContext->m_rectMRUDockPos.top);
XTP_DOCK_INFO dockInfo(pBar, CRect(p, sizeBar), nPos);
arrInfo.Add(dockInfo);
}
ASSERT(arrInfo.GetSize() == arrRow.GetSize());
if (!bHorz) arrInfo.InvertRects();
arrInfo.Sort();
// Step 2. if Total length is more than available, fill empty area.
int nIndex = -1;
int nLen = 0; BOOL bMove = TRUE;
for (nPos = 0; nPos < arrInfo.GetSize(); nPos++ )
{
CRect& rect = arrInfo[nPos].rcBar;
bMove = (rect.left < nLen && (nIndex < arrInfo[nPos].nIndex || bMove));
if (bMove) rect.OffsetRect(nLen - rect.left, 0);
nLen = rect.right;
nIndex = arrInfo[nPos].nIndex;
}
nLen = nLength; nIndex = -1; bMove = TRUE;
for (nPos = (int)arrInfo.GetSize() - 1; nPos >= 0; nPos--)
{
CRect& rect = arrInfo[nPos].rcBar;
bMove = (rect.right - nLen > 0 && (nIndex < arrInfo[nPos].nIndex || bMove));
if (bMove) rect.OffsetRect(nLen - rect.right, 0);
nLen = rect.left;
nIndex = arrInfo[nPos].nIndex;
}
nLen = 0;
for (nPos = 0; nPos < arrInfo.GetSize(); nPos++ )
{
CRect& rect = arrInfo[nPos].rcBar;
if (rect.left < nLen)
rect.OffsetRect(nLen - rect.left, 0);
nLen = rect.left + rect.Width();
}
// Step 3. if Total length is more than available, make it expandable.
if (nLen > nLength)
{
int nSum = 0;
for (nPos = 0; nPos < arrInfo.GetSize(); nPos++ )
{
CXTPToolBar* pBar = arrInfo[nPos].pBar;
if (!(_GetMode(bHorz, pBar) & LM_HIDEWRAP))
arrInfo[nPos].nMinWidth = nLength;
else
{
CSize sz = pBar->CalcDockingLayout(1, _GetMode(bHorz, pBar));
arrInfo[nPos].nMinWidth = bHorz? sz.cx: sz.cy;
}
arrInfo[nPos].nTotlaMinWidth = nSum;
nSum += arrInfo[nPos].nMinWidth;
}
int nLen = nLength;
for (nPos = (int)arrInfo.GetSize() - 1; nPos >= 0; nPos--)
{
CRect& rect = arrInfo[nPos].rcBar;
int nLeft = bHorz? arrInfo[nPos].rcMRUPos.left: arrInfo[nPos].rcMRUPos.top;
if (nLeft >rect.left) nLeft = rect.left;
if (nLeft < nLen - rect.Width()) nLeft = nLen - rect.Width();
if (nLeft < arrInfo[nPos].nTotlaMinWidth) nLeft = arrInfo[nPos].nTotlaMinWidth;
if (nLen - nLeft < arrInfo[nPos].nMinWidth) nLeft = nLen - arrInfo[nPos].nMinWidth;
if ((nLen - nLeft < arrInfo[nPos].nMinWidth || nLeft < arrInfo[nPos].nTotlaMinWidth)
&& arrInfo.GetSize() != 1)
{
nRemove = arrInfo[arrInfo.GetSize() - 1].nIndex;
return 0;
}
rect.right = nLen;
nLen = rect.left = max(0, nLeft);
}
}
if (!bHorz) arrInfo.InvertRects();
int nWidth = 0;
// Calculate total width
for (nPos = 0; nPos < arrInfo.GetSize(); nPos++)
{
CXTPToolBar* pBar = arrInfo[nPos].pBar;
CRect& rect = arrInfo[nPos].rcBar;
CSize sizeBar = pBar->CalcDockingLayout(bHorz? rect.Width(): rect.Height(), _GetMode(bHorz, pBar));
nWidth = max(nWidth, bHorz? sizeBar.cy: sizeBar.cx);
}
// Step 4. Move it.
for (nPos = 0; nPos < arrInfo.GetSize(); nPos++)
{
CXTPToolBar* pBar = arrInfo[nPos].pBar;
CRect& rect = arrInfo[nPos].rcBar;
int nMode = _GetMode(bHorz, pBar) | LM_COMMIT;
if (pBar->GetFlags() & xtpFlagStretchedShared)
{
if (bHorz)
{
rect.right = nPos == arrInfo.GetSize() - 1? nLength: arrInfo[nPos + 1].rcBar.left;
rect.left = nPos == 0? 0: min(arrInfo[nPos - 1].rcBar.right, rect.left);
}
else
{
rect.bottom = nPos == arrInfo.GetSize() - 1? nLength: arrInfo[nPos + 1].rcBar.top;
rect.top = nPos == 0? 0: min(arrInfo[nPos - 1].rcBar.bottom, rect.top);
}
nMode |= LM_STRETCH;
}
CSize sz = pBar->CalcDockingLayout(bHorz? rect.Width(): rect.Height(), nMode, nWidth );
rect = CRect(rect.TopLeft(), sz);
pBar->m_pDockContext->m_uMRUDockPosition= GetPosition();
AfxRepositionWindow(lpLayout, pBar->m_hWnd, &rect);
pBar->Invalidate(FALSE);
}
return nWidth;
}