/*! * Return the height of this Table taking into account the possibility * of it being broken. */ UT_sint32 fp_TOCContainer::getHeight(void) { UT_sint32 iFullHeight = fp_VerticalContainer::getHeight(); if(!isThisBroken()) { // // If this is a master table but it contains broken tables, we actually // want the height of the first broken table. The Master table is the // one that actually has a relevant Y value in the vertical container. // All other Y offsets from the broken tables are calculated relative to // it. // if(getFirstBrokenTOC() != NULL) { return getFirstBrokenTOC()->getHeight(); } return iFullHeight; } UT_sint32 iMyHeight = getYBottom() - getYBreak(); return iMyHeight; }
bool fp_TOCContainer::isInBrokenTOC(fp_Container * pCon) { // // OK A container is allowed in this broken TOC if it's // Y location plus height lie between getYBreak() and getYBottom. // // // Short circuit things if the BrokenContainer pointer is set. // if(pCon->getMyBrokenContainer() == static_cast<fp_Container *>(this)) { return true; } if(pCon->getMyBrokenContainer() != NULL) { return false; } UT_sint32 iTop = 0; iTop = pCon->getY(); UT_sint32 iHeight = pCon->getHeight(); UT_sint32 iBot = iTop + iHeight; UT_sint32 iBreak = getYBreak(); UT_sint32 iBottom = getYBottom(); xxx_UT_DEBUGMSG(("Column %x iTop = %d ybreak %d iBot= %d ybottom= %d \n",getBrokenColumn(),iTop,iBreak,iBot,iBottom)); if(iBot >= iBreak) { if(iBot < iBottom) { // pCon->setMyBrokenContainer(this); return true; } } return false; }
/*! * This method creates a new broken toccontainer, broken at the * offset given. * If the new TOCcontainer is broken from a pre-existing * broken TOC it is inserted into the holding vertical container after * the old broken TOC. * It also inserted into the linked list of containers in the vertical * container. * vpos is relative to the either the start of the TOC if it's the first * non-zero vpos or relative to the previous ybreak if it's further down. */ fp_ContainerObject * fp_TOCContainer::VBreakAt(UT_sint32 vpos) { // // Do the case of creating the first broken TOC from the master TOC. // fp_TOCContainer * pBroke = NULL; if(!isThisBroken() && getLastBrokenTOC() == NULL) { if(getFirstBrokenTOC() != NULL) { UT_ASSERT(UT_SHOULD_NOT_HAPPEN); return NULL; } pBroke = new fp_TOCContainer(getSectionLayout(),this); UT_DEBUGMSG(("SEVIOR:!!!!!!! First broken TOC %p \n",pBroke)); pBroke->setYBreakHere(vpos); pBroke->setYBottom(fp_VerticalContainer::getHeight()); // leave this in! UT_ASSERT(pBroke->getHeight()); setFirstBrokenTOC(pBroke); setLastBrokenTOC(pBroke); pBroke->setContainer(getContainer()); static_cast<fp_VerticalContainer *>(pBroke)->setHeight(pBroke->getHeight()); static_cast<fp_VerticalContainer *>(pBroke)->setY(getY()); return pBroke; } // // Now do the case of breaking a Master TOC. // if(getMasterTOC() == NULL) { return getLastBrokenTOC()->VBreakAt(vpos); } UT_sint32 iTotalHeight = getTotalTOCHeight(); if (vpos >= iTotalHeight) { UT_ASSERT(UT_SHOULD_NOT_HAPPEN); return NULL; } pBroke = new fp_TOCContainer(getSectionLayout(),getMasterTOC()); getMasterTOC()->setLastBrokenTOC(pBroke); xxx_UT_DEBUGMSG(("SEVIOR!!!!!!!!!!! New broken TOC %x \n",getLastBrokenTOC())); // // vpos is relative to the container that contains this height but we need // to add in the height above it. // setYBottom(getYBreak() + vpos -1); UT_ASSERT(getHeight() >0); pBroke->setYBreakHere(getYBreak()+vpos); pBroke->setYBottom(iTotalHeight); UT_ASSERT(pBroke->getHeight() > 0); UT_sint32 i = -1; // // The structure of TOC linked list is as follows. // NULL <= Master <==> Next <==> Next => NULL // first // ie terminated by NULL's in the getNext getPrev list. The second // broken TOC points and is pointed to by the Master TOC // pBroke->setPrev(this); fp_Container * pUpCon = NULL; if(getMasterTOC()->getFirstBrokenTOC() == this) { pUpCon = getMasterTOC()->getContainer(); pBroke->setPrev(getMasterTOC()); pBroke->setNext(NULL); getMasterTOC()->setNext(pBroke); setNext(pBroke); if (pUpCon) { i = pUpCon->findCon(getMasterTOC()); } } else { pBroke->setNext(NULL); setNext(pBroke); if(getYBreak() == 0 ) { UT_ASSERT(UT_SHOULD_NOT_HAPPEN); pUpCon = getMasterTOC()->getContainer(); if(pUpCon) { i = pUpCon->findCon(getMasterTOC()); } } else { pUpCon = getContainer(); if (pUpCon) { i = pUpCon->findCon(this); } } } if((i >= 0) && (i < pUpCon->countCons() -1)) { pUpCon->insertConAt(pBroke,i+1); } else if((i >= 0) && (i == pUpCon->countCons() -1)) { pUpCon->addCon(pBroke); } else { UT_DEBUGMSG(("Breaking a TOC that is not yet inserted\n")); } pBroke->setContainer(pUpCon); // // Now deal with issues from a container overlapping the top of the // of the new broken TOC. // // Skip this for now. Look at fp_TableContainer to see if it's needed later // static_cast<fp_VerticalContainer *>(pBroke)->setHeight(pBroke->getHeight()); return pBroke; }