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 <IE_Imp_MsWord_97 *> (ps->userData);
 	return pDocReader->_docProc (ps, tag);
 }
+
+
+//--------------------------------------------------------------------------/
+//--------------------------------------------------------------------------/
+
+void IE_Imp_MsWord_97::__table_open () {
+
+	UT_DEBUGMSG(("\n<TABLE>"));
+	
+	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</TABLE>\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<ROW:%d>", m_iCurrentRow));
+	}
+
+//--------------------------------------------------------------------------/
+//--------------------------------------------------------------------------/
+
+void IE_Imp_MsWord_97::__row_close () {
+
+	if (m_bRowOpen) {
+		UT_DEBUGMSG(("\t</ROW>"));
+		}
+	m_bRowOpen = false;
+	}
+
+//--------------------------------------------------------------------------/
+//--------------------------------------------------------------------------/
+
+void IE_Imp_MsWord_97::__cell_open () {
+
+	if (m_bCellOpen) {
+		return;
+		}
+
+	m_bCellOpen = true;
+	m_iCurrentCell++;
+
+	UT_DEBUGMSG(("\t<TAB:%d>", 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(("</TAB>"));
+
+	getDoc()->appendStrux(
+		PTX_EndCell, 
+		NULL 
+		);
+	}
+						
