Professional UI Solutions
Site Map   /  Register
 
 

Forum

Please Log In to post a new message or reply to an existing one. If you are not registered, please register.

NOTE: Some forums may be read-only if you are not currently subscribed to our technical support services.

Forums » Prof-UIS Tech Support » Crash in ItemHide Collapse All
Subject Author Date
Offer Har Aug 27, 2010 - 1:07 AM

Dear Support,


We found a bug after calling ItemHide in 2.87. We are also sending you an application to reproduce the crash.


The crash happens in the following squence:


1) Adding a few nodes with leafs, expanding the node (ItemExpand)


2) Hiding one node from the middle of the tree, and adding leafs to the last node


If the whole tree is visible, the crash will happen when adding the leaf to the last node when OnSwUpdateScrollBars is called.


If the last node is not visible, the crash will happen as soon as you scroll to the last node.


Please let us know that you received the application via mail.


Thanks,


Ron.

Technical Support Aug 27, 2010 - 10:29 AM

Thank you for providing us with the test project. It crashes with Prof-UIS 2.87. It works with Prof-UIS 2.90. So, the fix is Prof-UIS 2.90.

Offer Har Aug 28, 2010 - 5:52 AM

Dear Support,


This is the crash when the dialog is enlarged before pressing the two buttons, and causing the crash right at the button 2 clicking:


 



>    ProfUIS290md.dll!CExtTreeGridDataProvider::_Tree_MapRowToCache(unsigned long nRowNo=11)  Line 2237 + 0x9 bytes    C++
	 ProfUIS290md.dll!CExtTreeGridDataProvider::_Tree_NodeGetByVisibleRowIndex(unsigned long nRowNo=12)  Line 970 + 0x16 bytes    C++
	 ProfUIS290md.dll!CExtTreeGridDataProvider::TreeNodeGetByVisibleRowIndex(unsigned long nRowNo=12)  Line 955 + 0x16 bytes    C++
	 ProfUIS290md.dll!CExtTreeGridWnd::ItemGetByVisibleRowIndex(long nRowNo=12)  Line 3073 + 0xc bytes    C++
	 ProfUIS290md.dll!CExtTreeGridWnd::OnSiwQueryItemExtentV(long nRowNo=11, int * p_nExtraSpaceBefore=0x00000000, int * p_nExtraSpaceAfter=0x00000000)  Line 5123 + 0x16 bytes    C++
	 ProfUIS290md.dll!CExtGridBaseWnd::OnSiwCalcPageMetrics(int nDirection=0)  Line 7480 + 0x1d bytes    C++
	 ProfUIS290md.dll!CExtScrollItemWnd::OnSiwGetVisibleRange()  Line 7159 + 0x18 bytes    C++
	 ProfUIS290md.dll!CExtScrollItemWnd::OnSwUpdateScrollBars()  Line 5801 + 0x1d bytes    C++
	 ProfUIS290md.dll!CExtGridBaseWnd::OnSwUpdateScrollBars()  Line 13048    C++
	 ProfUIS290md.dll!CExtTreeGridWnd::ItemInsert(_TREEITEM * hTreeItemParent=0x02cfa9a4, unsigned long nIdxInsertBefore=4294967295, unsigned long nInsertCount=1, bool bRedraw=true)  Line 3531 + 0x12 bytes    C++
	 TreeGridBug.exe!CComboProblemDlg::OnClick2()  Line 399 + 0x2c bytes    C++

Technical Support Aug 28, 2010 - 9:11 AM

Fixed. Please update the source code for the following method:

CExtTreeGridCellNode * CExtTreeGridDataProvider::_Tree_NodeInsert(
            CExtTreeGridCellNode * pNodeParent,
            ULONG nIdxInsertBefore, // = (ULONG(-1L)) // if (ULONG(-1L)) - insert to end
            ULONG nInsertCount // = 1
            ) // returns pointer to first inserted
{
            __EXT_DEBUG_GRID_ASSERT_VALID( this );
            if( nInsertCount == 0 )
                        return NULL;
CExtGridDataProvider & _DP = _Tree_GetCacheDP();
CExtTreeGridCellNode * pNodeRoot = _Tree_NodeGetRoot();
            if( pNodeParent == NULL )
            {
                        pNodeParent = pNodeRoot;
                        __EXT_DEBUG_GRID_ASSERT_VALID( pNodeParent );
            } // if( pNodeParent == NULL )
            else
            {
                        __EXT_DEBUG_GRID_ASSERT_VALID( pNodeParent );
                        __EXT_DEBUG_GRID_ASSERT( LPCVOID(pNodeParent->DataProviderGet()) == LPCVOID(&_DP) );
            } // else from if( pNodeParent == NULL )
ULONG nParentChildCount = pNodeParent->TreeNodeGetChildCount();
            if(                     nIdxInsertBefore == ULONG(-1L)
                        ||           nIdxInsertBefore > nParentChildCount
                        )
                        nIdxInsertBefore = nParentChildCount;

ULONG nReservedRowCount = 0;
            _DP.CacheReservedCountsGet( NULL, &nReservedRowCount );
ULONG nAdditionalOffsetTotal = 0;
ULONG nAdditionalOffsetVisible = 0;
ULONG nVisibleOffset = 0;
ULONG nInsertOffset = nReservedRowCount;
CExtTreeGridCellNode * pNodeCompute = pNodeParent;
            if( nIdxInsertBefore != 0 )
            {
                        __EXT_DEBUG_GRID_ASSERT( nIdxInsertBefore <= nParentChildCount );
                        if( nIdxInsertBefore == nParentChildCount )
                        {
                                    nAdditionalOffsetTotal =
                                                pNodeParent->_ContentWeight_Get( false );
                                    nAdditionalOffsetVisible =
                                                pNodeParent->_ContentWeight_Get( true );
                                    if( pNodeParent != pNodeRoot )
                                    {
                                                nAdditionalOffsetTotal ++;
                                                nAdditionalOffsetVisible ++;
                                    }
                        }
                        else
                                    pNodeCompute = pNodeParent->TreeNodeGetChildAt( nIdxInsertBefore );
            }
            else
            {
                        if( pNodeParent != pNodeRoot )
                        {
                                    nAdditionalOffsetTotal = 1;
                                    nAdditionalOffsetVisible = 1;
                        }
            }
            nInsertOffset += pNodeCompute->TreeNodeCalcOffset( false );
            if(                     pNodeParent->TreeNodeIsDisplayed()
                        &&        pNodeParent->TreeNodeIsExpanded()
                        )
                        nVisibleOffset += pNodeCompute->TreeNodeCalcOffset( true, false ) + nAdditionalOffsetVisible;
            else
                        nVisibleOffset = ULONG(-1L);
            nInsertOffset += nAdditionalOffsetTotal;

            if( ! _DP.RowInsert( nInsertOffset, nInsertCount ) )
                        return NULL;

CExtTreeGridCellNode * pNodeRetVal = NULL;
ULONG nIdx = 0;
            for( ; nIdx < nInsertCount; nIdx++ )
            {
                        ULONG nEffectiveIdx = nInsertOffset + nIdx;
                        CExtTreeGridCellNode * pNodeCurr =
                                    STATIC_DOWNCAST( CExtTreeGridCellNode, _DP.CellGet( 0, nEffectiveIdx, _Tree_NodeGetRTC() ) );
                        __EXT_DEBUG_GRID_ASSERT_VALID( pNodeCurr );
                        _Tree_NodeAdjustProps( pNodeCurr );
                        m_arrGridRef.InsertAt( nEffectiveIdx - nReservedRowCount, pNodeCurr );
                        if( nVisibleOffset != ULONG(-1L) )
                                    m_arrGridVis.InsertAt( nVisibleOffset + nIdx, pNodeCurr );
                        pNodeCurr->m_pNodeParent = pNodeParent;
                        ULONG nSiblingIdx = nIdxInsertBefore + nIdx;
                        pNodeParent->m_arrChildren.InsertAt( nSiblingIdx, pNodeCurr, 1 );
                        pNodeCurr->m_nOptIndex = nSiblingIdx;
                        if( nIdx == 0 )
                                    pNodeRetVal = pNodeCurr;
                        CExtTreeGridCellNode * pNodePrev = NULL, * pNodeNext = NULL;
                        if( nSiblingIdx > 0 )
                        {
                                    pNodePrev = pNodeParent->m_arrChildren.GetAt( nSiblingIdx - 1 );
                                    __EXT_DEBUG_GRID_ASSERT_VALID( pNodePrev );
                        } // if( nSiblingIdx > 0 )
                        if( nSiblingIdx < ULONG(pNodeParent->m_arrChildren.GetSize()-1) )
                        {
                                    pNodeNext = pNodeParent->m_arrChildren.GetAt( nSiblingIdx + 1 );
                                    __EXT_DEBUG_GRID_ASSERT_VALID( pNodeNext );
                        } // if( nSiblingIdx < ULONG(pNodeParent->m_arrChildren.GetSize()-1) )
                        if( pNodePrev != NULL )
                        {
                                    pNodePrev->m_pNodeNext = pNodeCurr;
                                    pNodeCurr->m_pNodePrev = pNodePrev;
                        } // if( pNodePrev != NULL )
                        if( pNodeNext != NULL )
                        {
                                    pNodeNext->m_pNodePrev = pNodeCurr;
                                    pNodeCurr->m_pNodeNext = pNodeNext;
                        } // if( pNodeNext != NULL )
            } // for( ; nIdx < nInsertCount; nIdx++ )

ULONG nResetIdx, nResetCnt = ULONG(pNodeParent->m_arrChildren.GetSize());
            for( nResetIdx = nIdxInsertBefore; nResetIdx < nResetCnt; nResetIdx++ )
            {
                        CExtTreeGridCellNode * pNode = (CExtTreeGridCellNode *) pNodeParent->m_arrChildren.GetAt( nResetIdx );
                        __EXT_DEBUG_GRID_ASSERT_VALID( pNode );
                        __EXT_DEBUG_GRID_ASSERT_KINDOF( CExtTreeGridCellNode, pNode );
                        pNode->m_nOptIndex = nResetIdx;
            } // for( nResetIdx = nIdxInsertBefore; nResetIdx < nResetCnt; nResetIdx++ )
            
            if( nVisibleOffset != ULONG(-1L) )
                        pNodeParent->_ContentWeight_Increment( nInsertCount, false );
            else
                        pNodeParent->_ContentWeight_IncrementNonExpanded( nInsertCount );
            return pNodeRetVal;
}

Offer Har Aug 28, 2010 - 12:28 AM

Dear Support,


It crashes in 2.90 as well - please check with the official version you released. Below is the call stack with the sample application I sent you when crashing it 2.90. Please fix this - we need this feature.


Thanks,


Ron.


>    ProfUIS290md.dll!CExtTreeGridDataProvider::_Tree_MapRowToCache(unsigned long nRowNo=11)  Line 2237 + 0x9 bytes    C++
	 ProfUIS290md.dll!CExtTreeGridDataProvider::_Tree_NodeGetByVisibleRowIndex(unsigned long nRowNo=12)  Line 970 + 0x16 bytes    C++
	 ProfUIS290md.dll!CExtTreeGridDataProvider::TreeNodeGetByVisibleRowIndex(unsigned long nRowNo=12)  Line 955 + 0x16 bytes    C++
	 ProfUIS290md.dll!CExtTreeGridWnd::ItemGetByVisibleRowIndex(long nRowNo=12)  Line 3073 + 0xc bytes    C++
	 ProfUIS290md.dll!CExtTreeGridWnd::OnSiwQueryItemExtentV(long nRowNo=11, int * p_nExtraSpaceBefore=0x00000000, int * p_nExtraSpaceAfter=0x00000000)  Line 5123 + 0x16 bytes    C++
	 ProfUIS290md.dll!CExtGridBaseWnd::OnSiwCalcPageMetrics(int nDirection=0)  Line 7480 + 0x1d bytes    C++
	 ProfUIS290md.dll!CExtScrollItemWnd::OnSwGetPageSize(int nDirection=0)  Line 6200 + 0x1a bytes    C++
	 ProfUIS290md.dll!CExtGridBaseWnd::OnSwDoScrollBy(CSize sizeScroll={...}, bool bDoScroll=true)  Line 7527 + 0x18 bytes    C++
	 ProfUIS290md.dll!CExtScrollItemWnd::OnSwDoScroll(unsigned int nScrollCode=1535, unsigned int nPos=1, bool bDoScroll=true)  Line 6997 + 0x33 bytes    C++
	 ProfUIS290md.dll!CExtScrollWnd::OnVScroll(unsigned int nSBCode=5, unsigned int nPos=1, CScrollBar * pScrollBar=0x0012fd44)  Line 4855 + 0x30 bytes    C++
	 mfc80d.dll!CWnd::OnWndMsg(unsigned int message=277, unsigned int wParam=65541, long lParam=2496342, long * pResult=0x0012d1d0)  Line 2118    C++
	 mfc80d.dll!CWnd::WindowProc(unsigned int message=277, unsigned int wParam=65541, long lParam=2496342)  Line 1741 + 0x20 bytes    C++
	 ProfUIS290md.dll!CExtScrollWnd::WindowProc(unsigned int message=277, unsigned int wParam=65541, long lParam=2496342)  Line 4974    C++
	 ProfUIS290md.dll!CExtGridBaseWnd::WindowProc(unsigned int message=277, unsigned int wParam=65541, long lParam=2496342)  Line 13197    C++
	 mfc80d.dll!AfxCallWndProc(CWnd * pWnd=0x0012f38c, HWND__ * hWnd=0x000816f0, unsigned int nMsg=277, unsigned int wParam=65541, long lParam=2496342)  Line 240 + 0x1c bytes    C++
	 mfc80d.dll!AfxWndProc(HWND__ * hWnd=0x000816f0, unsigned int nMsg=277, unsigned int wParam=65541, long lParam=2496342)  Line 389    C++
	 mfc80d.dll!AfxWndProcBase(HWND__ * hWnd=0x000816f0, unsigned int nMsg=277, unsigned int wParam=65541, long lParam=2496342)  Line 411 + 0x15 bytes    C++
	 user32.dll!7e418734()     
	 [Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]    
	 user32.dll!7e418816()     
	 user32.dll!7e428ea0()     
	 user32.dll!7e428eec()     
	 ntdll.dll!7c90e473()     
	 user32.dll!7e4194be()     
	 user32.dll!7e42c174()     
	 user32.dll!7e42f40b()     
	 ProfUIS290md.dll!CExtScrollBar::_SetScrollPos(int nPos=1, bool bTrackPos=true, bool bRedraw=false, bool bSendScrollingNotification=true)  Line 687 + 0x54 bytes    C++
	 ProfUIS290md.dll!CExtScrollBar::ScrollBar_TrackMouseLButtonDown(tagMSG * pMSG=0x0012da7c)  Line 2353 + 0x1f bytes    C++
	 ProfUIS290md.dll!CExtScrollBar::ScrollBar_OnMouseClickMsg(tagMSG * pMSG=0x0012da7c)  Line 1735 + 0x16 bytes    C++
	 ProfUIS290md.dll!CExtScrollBar::OnLButtonDown(unsigned int nFlags=1, CPoint point={...})  Line 1791    C++
	 mfc80d.dll!CWnd::OnWndMsg(unsigned int message=513, unsigned int wParam=1, long lParam=2162696, long * pResult=0x0012dbf8)  Line 2169    C++
	 mfc80d.dll!CWnd::WindowProc(unsigned int message=513, unsigned int wParam=1, long lParam=2162696)  Line 1741 + 0x20 bytes    C++
	 ProfUIS290md.dll!CExtScrollBar::WindowProc(unsigned int message=513, unsigned int wParam=1, long lParam=2162696)  Line 455 + 0x14 bytes    C++
	 mfc80d.dll!AfxCallWndProc(CWnd * pWnd=0x0012fd44, HWND__ * hWnd=0x00261756, unsigned int nMsg=513, unsigned int wParam=1, long lParam=2162696)  Line 240 + 0x1c bytes    C++
	 mfc80d.dll!AfxWndProc(HWND__ * hWnd=0x00261756, unsigned int nMsg=513, unsigned int wParam=1, long lParam=2162696)  Line 389    C++
	 mfc80d.dll!AfxWndProcBase(HWND__ * hWnd=0x00261756, unsigned int nMsg=513, unsigned int wParam=1, long lParam=2162696)  Line 411 + 0x15 bytes    C++
	 user32.dll!7e418734()     
	 user32.dll!7e418816()     
	 user32.dll!7e4189cd()     
	 user32.dll!7e4196c7()     
	 mfc80d.dll!AfxInternalPumpMessage()  Line 183    C++
	 mfc80d.dll!CWinThread::PumpMessage()  Line 896    C++
	 mfc80d.dll!AfxPumpMessage()  Line 190 + 0xd bytes    C++
	 mfc80d.dll!CWnd::RunModalLoop(unsigned long dwFlags=4)  Line 4322 + 0x5 bytes    C++
	 ProfUIS290md.dll!CExtResDlg::_DoModalImpl()  Line 6394 + 0xc bytes    C++
	 ProfUIS290md.dll!CExtResDlg::DoModal()  Line 6338 + 0x12 bytes    C++
	 TreeGridBug.exe!CComboProblemApp::InitInstance()  Line 65 + 0xe bytes    C++
	 mfc80d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f2a, int nCmdShow=1)  Line 37 + 0xd bytes    C++
	 TreeGridBug.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f2a, int nCmdShow=1)  Line 33    C++
	 TreeGridBug.exe!__tmainCRTStartup()  Line 589 + 0x35 bytes    C
	 TreeGridBug.exe!WinMainCRTStartup()  Line 414    C
	 kernel32.dll!7c817077()     
	 ProfUIS290md.dll!CExtDynTabControlBar::OnCreate(tagCREATESTRUCTA * lpCreateStruct=0x00730065)  Line 1302 + 0xc bytes    C++
	 ProfUIS290md.dll!CExtCustomizeCmdScreenTip::_GetBaseClass()  Line 117 + 0xf bytes    C++
	 81f0558b()   

 


 

Technical Support Aug 28, 2010 - 9:11 AM

Fixed. Please update the source code for the following method:

CExtTreeGridCellNode * CExtTreeGridDataProvider::_Tree_NodeInsert(
            CExtTreeGridCellNode * pNodeParent,
            ULONG nIdxInsertBefore, // = (ULONG(-1L)) // if (ULONG(-1L)) - insert to end
            ULONG nInsertCount // = 1
            ) // returns pointer to first inserted
{
            __EXT_DEBUG_GRID_ASSERT_VALID( this );
            if( nInsertCount == 0 )
                        return NULL;
CExtGridDataProvider & _DP = _Tree_GetCacheDP();
CExtTreeGridCellNode * pNodeRoot = _Tree_NodeGetRoot();
            if( pNodeParent == NULL )
            {
                        pNodeParent = pNodeRoot;
                        __EXT_DEBUG_GRID_ASSERT_VALID( pNodeParent );
            } // if( pNodeParent == NULL )
            else
            {
                        __EXT_DEBUG_GRID_ASSERT_VALID( pNodeParent );
                        __EXT_DEBUG_GRID_ASSERT( LPCVOID(pNodeParent->DataProviderGet()) == LPCVOID(&_DP) );
            } // else from if( pNodeParent == NULL )
ULONG nParentChildCount = pNodeParent->TreeNodeGetChildCount();
            if(                     nIdxInsertBefore == ULONG(-1L)
                        ||           nIdxInsertBefore > nParentChildCount
                        )
                        nIdxInsertBefore = nParentChildCount;

ULONG nReservedRowCount = 0;
            _DP.CacheReservedCountsGet( NULL, &nReservedRowCount );
ULONG nAdditionalOffsetTotal = 0;
ULONG nAdditionalOffsetVisible = 0;
ULONG nVisibleOffset = 0;
ULONG nInsertOffset = nReservedRowCount;
CExtTreeGridCellNode * pNodeCompute = pNodeParent;
            if( nIdxInsertBefore != 0 )
            {
                        __EXT_DEBUG_GRID_ASSERT( nIdxInsertBefore <= nParentChildCount );
                        if( nIdxInsertBefore == nParentChildCount )
                        {
                                    nAdditionalOffsetTotal =
                                                pNodeParent->_ContentWeight_Get( false );
                                    nAdditionalOffsetVisible =
                                                pNodeParent->_ContentWeight_Get( true );
                                    if( pNodeParent != pNodeRoot )
                                    {
                                                nAdditionalOffsetTotal ++;
                                                nAdditionalOffsetVisible ++;
                                    }
                        }
                        else
                                    pNodeCompute = pNodeParent->TreeNodeGetChildAt( nIdxInsertBefore );
            }
            else
            {
                        if( pNodeParent != pNodeRoot )
                        {
                                    nAdditionalOffsetTotal = 1;
                                    nAdditionalOffsetVisible = 1;
                        }
            }
            nInsertOffset += pNodeCompute->TreeNodeCalcOffset( false );
            if(                     pNodeParent->TreeNodeIsDisplayed()
                        &&        pNodeParent->TreeNodeIsExpanded()
                        )
                        nVisibleOffset += pNodeCompute->TreeNodeCalcOffset( true, false ) + nAdditionalOffsetVisible;
            else
                        nVisibleOffset = ULONG(-1L);
            nInsertOffset += nAdditionalOffsetTotal;

            if( ! _DP.RowInsert( nInsertOffset, nInsertCount ) )
                        return NULL;

CExtTreeGridCellNode * pNodeRetVal = NULL;
ULONG nIdx = 0;
            for( ; nIdx < nInsertCount; nIdx++ )
            {
                        ULONG nEffectiveIdx = nInsertOffset + nIdx;
                        CExtTreeGridCellNode * pNodeCurr =
                                    STATIC_DOWNCAST( CExtTreeGridCellNode, _DP.CellGet( 0, nEffectiveIdx, _Tree_NodeGetRTC() ) );
                        __EXT_DEBUG_GRID_ASSERT_VALID( pNodeCurr );
                        _Tree_NodeAdjustProps( pNodeCurr );
                        m_arrGridRef.InsertAt( nEffectiveIdx - nReservedRowCount, pNodeCurr );
                        if( nVisibleOffset != ULONG(-1L) )
                                    m_arrGridVis.InsertAt( nVisibleOffset + nIdx, pNodeCurr );
                        pNodeCurr->m_pNodeParent = pNodeParent;
                        ULONG nSiblingIdx = nIdxInsertBefore + nIdx;
                        pNodeParent->m_arrChildren.InsertAt( nSiblingIdx, pNodeCurr, 1 );
                        pNodeCurr->m_nOptIndex = nSiblingIdx;
                        if( nIdx == 0 )
                                    pNodeRetVal = pNodeCurr;
                        CExtTreeGridCellNode * pNodePrev = NULL, * pNodeNext = NULL;
                        if( nSiblingIdx > 0 )
                        {
                                    pNodePrev = pNodeParent->m_arrChildren.GetAt( nSiblingIdx - 1 );
                                    __EXT_DEBUG_GRID_ASSERT_VALID( pNodePrev );
                        } // if( nSiblingIdx > 0 )
                        if( nSiblingIdx < ULONG(pNodeParent->m_arrChildren.GetSize()-1) )
                        {
                                    pNodeNext = pNodeParent->m_arrChildren.GetAt( nSiblingIdx + 1 );
                                    __EXT_DEBUG_GRID_ASSERT_VALID( pNodeNext );
                        } // if( nSiblingIdx < ULONG(pNodeParent->m_arrChildren.GetSize()-1) )
                        if( pNodePrev != NULL )
                        {
                                    pNodePrev->m_pNodeNext = pNodeCurr;
                                    pNodeCurr->m_pNodePrev = pNodePrev;
                        } // if( pNodePrev != NULL )
                        if( pNodeNext != NULL )
                        {
                                    pNodeNext->m_pNodePrev = pNodeCurr;
                                    pNodeCurr->m_pNodeNext = pNodeNext;
                        } // if( pNodeNext != NULL )
            } // for( ; nIdx < nInsertCount; nIdx++ )

ULONG nResetIdx, nResetCnt = ULONG(pNodeParent->m_arrChildren.GetSize());
            for( nResetIdx = nIdxInsertBefore; nResetIdx < nResetCnt; nResetIdx++ )
            {
                        CExtTreeGridCellNode * pNode = (CExtTreeGridCellNode *) pNodeParent->m_arrChildren.GetAt( nResetIdx );
                        __EXT_DEBUG_GRID_ASSERT_VALID( pNode );
                        __EXT_DEBUG_GRID_ASSERT_KINDOF( CExtTreeGridCellNode, pNode );
                        pNode->m_nOptIndex = nResetIdx;
            } // for( nResetIdx = nIdxInsertBefore; nResetIdx < nResetCnt; nResetIdx++ )
            
            if( nVisibleOffset != ULONG(-1L) )
                        pNodeParent->_ContentWeight_Increment( nInsertCount, false );
            else
                        pNodeParent->_ContentWeight_IncrementNonExpanded( nInsertCount );
            return pNodeRetVal;
}