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.180
diff -u -r1.180 ie_imp_MsWord_97.cpp
--- abi/src/wp/impexp/xp/ie_imp_MsWord_97.cpp	25 Oct 2002 18:25:04 -0000	1.180
+++ abi/src/wp/impexp/xp/ie_imp_MsWord_97.cpp	29 Oct 2002 11:59:27 -0000
@@ -52,6 +52,9 @@
 #include "ap_Strings.h"
 #include "ap_Dialog_Id.h"
 
+#include "pf_Frag_Strux.h"
+#include "pt_PieceTable.h"
+
 #ifdef DEBUG
 #define IE_IMP_MSWORD_DUMP
 #include "ie_imp_MsWord_dump.h"
@@ -757,9 +760,16 @@
 void IE_Imp_MsWord_97::_appendChar (UT_UCSChar ch)
 {
 
-	// eat tab characters
-	if (m_bInTable && ch == 7) {
+	
+	if (m_bInTable) {
+		switch (ch) {
+			case 7:			// eat tab characters
 		return;	
+			case 30:		// ??
+				ch = '-';
+				break;
+			}
+		UT_DEBUGMSG(("%c", ch));
 		}	
 
 	if ( m_bIsLower )
@@ -1515,7 +1525,7 @@
 	  if (apap->fInTable) {
 	    if (!m_bInTable) {
 	      m_bInTable = true;	    
-	      _table_open(apap);
+	        _table_open();
 	    }
 	    
 	    if (ps->endcell) {
@@ -1541,9 +1551,6 @@
 		for (int i = column; i < ps->nocellbounds; i++) {
 		  if (ps->cellbounds[i] >= apap->ptap.rgdxaCenter[column]) {
 		    span = (i - column);
-		    if (span) {
-		      span++;
-		    }
 		    break;
 		  }
 		}
@@ -1551,7 +1558,7 @@
 	      }
 	    }
 	    
-	    _cell_open(apap);
+	    _cell_open(ps, apap);
 	    
 	    if (m_iCellsRemaining == 0) {
 	      m_iCellsRemaining = apap->ptap.itcMac + 1;
@@ -2803,7 +2810,7 @@
 //--------------------------------------------------------------------------/
 //--------------------------------------------------------------------------/
 
-void IE_Imp_MsWord_97::_table_open (PAP *apap) 
+void IE_Imp_MsWord_97::_table_open () 
 {
   
   UT_DEBUGMSG(("\n<TABLE>"));
@@ -2827,19 +2834,49 @@
 //--------------------------------------------------------------------------/
 //--------------------------------------------------------------------------/
 
-void IE_Imp_MsWord_97::_table_close () 
-{
+void IE_Imp_MsWord_97::_table_close () {
   
   _cell_close();
   _row_close();
   
   UT_DEBUGMSG(("\n</TABLE>\n"));
   
+	if (m_vecColumnWidths.size()) {
+		// build column width properties string
+		UT_String propBuffer;
+		UT_String props = "table-column-props:";
+
+		for (UT_uint32 i = 0; i < m_vecColumnWidths.size(); i++) {
+			UT_String_sprintf(propBuffer,
+				"%s/",
+				UT_convertInchesToDimensionString(DIM_IN, (((float)(int)m_vecColumnWidths.getNthItem(i)) / 1440), "1.4")
+				);
+			props += propBuffer;
+			}
+
+		XML_Char* pProps = "props";
+		const XML_Char* propsArray[3];
+		propsArray[0] = pProps;
+		propsArray[1] = props.c_str();
+		propsArray[2] = NULL;
+
+		// apply properties
+		PL_StruxDocHandle sdh = getDoc()->getLastStruxOfType(PTX_SectionTable);
+		
+		pf_Frag_Strux * pfStrux = (pf_Frag_Strux *)sdh;
+		PT_AttrPropIndex indexAP = pfStrux->getIndexAP();
+		const PP_AttrProp * pAP = NULL;
+		getDoc()->getPieceTable()->getAttrProp(indexAP,&pAP);	
+							   
+		((PP_AttrProp *)pAP)->setAttributes(propsArray);
+		}
+		
+	// end-of-table
   getDoc()->appendStrux(
 			PTX_EndTable,
 			NULL
 			);
-}
+	}
 
 //--------------------------------------------------------------------------/
 //--------------------------------------------------------------------------/
@@ -2873,27 +2910,50 @@
 //--------------------------------------------------------------------------/
 //--------------------------------------------------------------------------/
 
-void IE_Imp_MsWord_97::_cell_open (PAP *apap) 
+void IE_Imp_MsWord_97::_cell_open (const wvParseStruct *ps, const PAP *apap) 
 {
   
   if (m_bCellOpen || apap->fTtp) {
     return;
   }
   
+	// determine column widths
+	UT_Vector columnWidths;
+	
+	for (int i = 1; i < ps->nocellbounds; i++) {
+		int width = apap->ptap.rgdxaCenter[i] - apap->ptap.rgdxaCenter[i - 1];
+		if (width <= 0) {
+			break;
+			}				  
+		columnWidths.addItem((void *)width);
+		}
+		
+	if (columnWidths.size() > m_vecColumnWidths.size()) {
+		m_vecColumnWidths.clear();
+		m_vecColumnWidths = columnWidths;
+		}
+
+	// add a new cell
   m_bCellOpen = true;
   m_iCurrentCell++;
   
-  UT_DEBUGMSG(("\t<CELL:%d>", m_iCurrentCell));
+    UT_DEBUGMSG(("\t<CELL:%d:%d>", (int)m_vecColumnSpansForCurrentRow.getNthItem(m_iCurrentCell - 1), ps->vmerges[m_iCurrentRow - 1][m_iCurrentCell - 1]));
   
   UT_String propBuffer;
   
+	int vspan = ps->vmerges[m_iCurrentRow - 1][m_iCurrentCell - 1];
+	
+	if (vspan > 0) {
+		vspan--;
+		}
+
   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
+		m_iCurrentRow + vspan
 		    );
   
   XML_Char* pProps = "props";
@@ -2906,10 +2966,6 @@
 			PTX_SectionCell, 
 			propsArray
 			);
-  getDoc()->appendStrux(
-			PTX_Block,
-			NULL
-			);
 }
 
 //--------------------------------------------------------------------------/
@@ -2924,7 +2980,7 @@
   
   m_bCellOpen = false;
   
-  UT_DEBUGMSG(("</TAB>"));
+	UT_DEBUGMSG(("</CELL>"));
   
   getDoc()->appendStrux(
 			PTX_EndCell, 
