@Override
    public void computeEfficientMargins()
    {
        //minimal margins
        emargin.top = margin.top;
        emargin.bottom = margin.bottom;
        //check if something inside can be collapsed and it is larger
        if (containsBlocks() && containsFlow())
        {
            BlockBox firstseparated = null;
            int mbottom = 0;
            
            for (int i = 0; i < getSubBoxNumber(); i++)
            {
                BlockBox subbox = (BlockBox) getSubBox(i);
                if (subbox.isDisplayed() && subbox.isInFlow())
                {
                    subbox.computeEfficientMargins();
                    boolean boxempty = subbox.marginsAdjoin();
                    
                    //if no separated box yet, update the top margin
                    if (firstseparated == null && !separatedFromTop(this)) 
                    {
                    	if (subbox.emargin.top > emargin.top)
                    		emargin.top = subbox.emargin.top;
                    }
                    
                    //update the bottom margin
                    if (boxempty)
                    {
                        int m = Math.max(subbox.emargin.top, subbox.emargin.bottom); //margins adjoin: we may use both top or bottom
                    	if (m > mbottom)
                    		mbottom = m;
                    }
                    else
                    	mbottom = subbox.emargin.bottom;
                    
                    if (!boxempty && firstseparated == null)
                        firstseparated = subbox;
                }
            }

            //collapse bottom margins
            if (mbottom > emargin.bottom && !separatedFromBottom(this))
            	emargin.bottom = mbottom;
        }
        
        //if the box is empty, collapse it to a single margin
        if (marginsAdjoin())
        {
        	emargin.top = Math.max(emargin.top, emargin.bottom);
        	emargin.bottom = 0;
        }
        
    }
@ Override public void computeEfficientMargins ( ) { emargin . top = margin . top ; emargin . bottom = margin . bottom ; if ( containsBlocks ( ) && containsFlow ( ) ) { BlockBox firstseparated = null ; int mbottom = 0 ; for ( int i = 0 ; i < getSubBoxNumber ( ) ; i ++ ) { BlockBox subbox = ( BlockBox ) getSubBox ( i ) ; if ( subbox . isDisplayed ( ) && subbox . isInFlow ( ) ) { subbox . computeEfficientMargins ( ) ; boolean boxempty = subbox . marginsAdjoin ( ) ; if ( firstseparated == null && ! separatedFromTop ( this ) ) { if ( subbox . emargin . top > emargin . top ) emargin . top = subbox . emargin . top ; } if ( boxempty ) { int m = Math . max ( subbox . emargin . top , subbox . emargin . bottom ) ; if ( m > mbottom ) mbottom = m ; } else mbottom = subbox . emargin . bottom ; if ( ! boxempty && firstseparated == null ) firstseparated = subbox ; } } if ( mbottom > emargin . bottom && ! separatedFromBottom ( this ) ) emargin . bottom = mbottom ; } if ( marginsAdjoin ( ) ) { emargin . top = Math . max ( emargin . top , emargin . bottom ) ; emargin . bottom = 0 ; } }
Computes the efficient sizes of in-flow margins for collapsing