Index: abi/src/wp/impexp/xp/ie_imp_MsWord_97.cpp =================================================================== RCS file: /cvsroot/abi/src/wp/impexp/xp/ie_imp_MsWord_97.cpp,v retrieving revision 1.178 diff -u -r1.178 ie_imp_MsWord_97.cpp --- abi/src/wp/impexp/xp/ie_imp_MsWord_97.cpp 25 Oct 2002 08:03:25 -0000 1.178 +++ abi/src/wp/impexp/xp/ie_imp_MsWord_97.cpp 25 Oct 2002 13:19:45 -0000 @@ -506,7 +506,10 @@ m_iDocPosition(0), m_pBookmarks(NULL), m_iBookmarksCount(0), - m_iMSWordListId(0) + m_iMSWordListId(0), + m_iRowsRemaining(0), + m_iCellsRemaining(0), + m_bInTable(false) { for(UT_uint32 i = 0; i < 9; i++) m_iListIdIncrement[i] = 0; @@ -746,6 +749,12 @@ void IE_Imp_MsWord_97::_appendChar (UT_UCSChar ch) { + + // eat tab characters + if (m_bInTable && ch == 7) { + return; + } + if ( m_bIsLower ) ch = UT_UCS4_tolower ( ch ); m_pTextRun += ch; @@ -1510,9 +1519,63 @@ getDoc()->appendStrux(PTX_SectionTable,NULL); getDoc()->appendStrux(PTX_SectionCell, (const XML_Char **)cellAtts); #endif - } - } + if (m_bInTable == false) { + m_bInTable = true; + + __table_open(); + } + + if (ps->endcell) { + ps->endcell = 0; + __cell_close(); + if (m_iCellsRemaining > 0) { + m_iCellsRemaining--; + if (m_iCellsRemaining == 0) { + __row_close(); + } + } + } + + __row_open(); + + // determine column spans + if (!m_bCellOpen) { + m_vecColumnSpansForCurrentRow.clear(); + + for (int column = 1; column < ps->nocellbounds; column++) { + int span = 0; + + for (int i = column; i < ps->nocellbounds; i++) { + if (ps->cellbounds[i] >= apap->ptap.rgdxaCenter[column]) { + span = (i - column); + if (span) { + span++; + } + break; + } + } + m_vecColumnSpansForCurrentRow.addItem((void *)span); + } + } + + __cell_open(); + + if (m_iCellsRemaining == 0) { + m_iCellsRemaining = apap->ptap.itcMac + 1; + } + + if (m_iRowsRemaining == 0) { + m_iRowsRemaining = ps->norows; + } + + m_iRowsRemaining--; + } + else if (m_bInTable) { + m_bInTable = false; + __table_close(); + } +} UT_String propBuffer; UT_String props; @@ -2758,3 +2821,131 @@ IE_Imp_MsWord_97 * pDocReader = static_cast (ps->userData); return pDocReader->_docProc (ps, tag); } + + +//--------------------------------------------------------------------------/ +//--------------------------------------------------------------------------/ + +void IE_Imp_MsWord_97::__table_open () { + + UT_DEBUGMSG(("\n")); + + m_iCurrentRow = 0; + m_iCurrentCell = 0; + + getDoc()->appendStrux( + PTX_Block, + NULL + ); + getDoc()->appendStrux( + PTX_SectionTable, + NULL //pPropsArray + ); + + m_bRowOpen = false; + m_bCellOpen = false; + } + +//--------------------------------------------------------------------------/ +//--------------------------------------------------------------------------/ + +void IE_Imp_MsWord_97::__table_close () { + + __cell_close(); + __row_close(); + + UT_DEBUGMSG(("\n
\n")); + + getDoc()->appendStrux( + PTX_EndTable, + NULL + ); + } + +//--------------------------------------------------------------------------/ +//--------------------------------------------------------------------------/ + +void IE_Imp_MsWord_97::__row_open () { + + if (m_bRowOpen) { + return; + } + + m_bRowOpen = true; + m_iCurrentRow++; + m_iCurrentCell = 0; + + UT_DEBUGMSG(("\n\t", m_iCurrentRow)); + } + +//--------------------------------------------------------------------------/ +//--------------------------------------------------------------------------/ + +void IE_Imp_MsWord_97::__row_close () { + + if (m_bRowOpen) { + UT_DEBUGMSG(("\t")); + } + m_bRowOpen = false; + } + +//--------------------------------------------------------------------------/ +//--------------------------------------------------------------------------/ + +void IE_Imp_MsWord_97::__cell_open () { + + if (m_bCellOpen) { + return; + } + + m_bCellOpen = true; + m_iCurrentCell++; + + UT_DEBUGMSG(("\t", m_iCurrentCell)); + + UT_String propBuffer; + + UT_String_sprintf( + propBuffer, + "left-attach:%d; right-attach:%d; top-attach:%d; bot-attach:%d", + m_iCurrentCell - 1, + m_iCurrentCell + (int)m_vecColumnSpansForCurrentRow.getNthItem(m_iCurrentCell - 1), + m_iCurrentRow - 1, + m_iCurrentRow + ); + + XML_Char* pProps = "props"; + const XML_Char* propsArray[3]; + propsArray[0] = pProps; + propsArray[1] = propBuffer.c_str(); + propsArray[2] = NULL; + + getDoc()->appendStrux( + PTX_SectionCell, + propsArray + ); + getDoc()->appendStrux( + PTX_Block, + NULL + ); + } + +//--------------------------------------------------------------------------/ +//--------------------------------------------------------------------------/ + +void IE_Imp_MsWord_97::__cell_close () { + + if (!m_bCellOpen) { + return; + } + + m_bCellOpen = false; + + UT_DEBUGMSG(("")); + + getDoc()->appendStrux( + PTX_EndCell, + NULL + ); + } +