diff -urNwb -x CVS -x WIN32_20.1_i386_DBG -x WIN32_20.1_i386_OBJ -x abidiff.cmd -x patch.txt -x .#*.* abi.org\src\/text/fmt/xp/fl_BlockLayout.cpp abi.839\src\/text/fmt/xp/fl_BlockLayout.cpp
--- abi.org\src\/text/fmt/xp/fl_BlockLayout.cpp	Thu May 11 09:00:57 2000
+++ abi.839\src\/text/fmt/xp/fl_BlockLayout.cpp	Mon May 15 18:18:59 2000
@@ -307,7 +307,7 @@
 			UT_ASSERT(iPosLen < sizeof pszPosition);
 
 			memcpy(pszPosition, pStart, iPosLen);
-			pszPosition[i] = 0;
+            pszPosition[iPosLen] = 0;
 
 			iPosition = pG->convertDimension(pszPosition);
 
diff -urNwb -x CVS -x WIN32_20.1_i386_DBG -x WIN32_20.1_i386_OBJ -x abidiff.cmd -x patch.txt -x .#*.* abi.org\src\/wp/ap/xp/ap_TopRuler.cpp abi.839\src\/wp/ap/xp/ap_TopRuler.cpp
--- abi.org\src\/wp/ap/xp/ap_TopRuler.cpp	Thu Apr 20 09:03:47 2000
+++ abi.839\src\/wp/ap/xp/ap_TopRuler.cpp	Tue May 16 17:54:48 2000
@@ -1534,21 +1534,16 @@
 		UT_sint32 xAbsLeft = xFixed + m_infoCache.m_xPageViewMargin - m_xScrollOffset;
 
 		m_draggingCenter = _snapPixelToGrid(x, tick);
-		if(m_draggingCenter < xAbsLeft)
-		{
-			// don't drag off the page.
-			m_draggingCenter = xAbsLeft;
-		}
-		if(m_draggingCenter + m_infoCache.m_xrLeftIndent + m_infoCache.m_xrFirstLineIndent < xAbsLeft)
-		{
-			// don't drag first line indent off page.
-			m_draggingCenter = xAbsLeft - m_infoCache.m_xrLeftIndent - m_infoCache.m_xrFirstLineIndent;
-		}
-		if(m_draggingCenter + m_infoCache.m_xrLeftIndent < xAbsLeft)
+
+        UT_sint32 iAbsLeft = _getFirstPixelInColumn(&m_infoCache,0);
+        UT_sint32 iAbsRight = iAbsLeft + m_infoCache.u.c.m_xColumnWidth;
+        UT_sint32 iIndentShift = UT_MAX(0,UT_MAX(m_infoCache.m_xrLeftIndent,m_infoCache.m_xrLeftIndent + m_infoCache.m_xrFirstLineIndent));
+        UT_sint32 iRightIndentPos = iAbsRight - UT_MAX(0,m_infoCache.m_xrRightIndent) - iIndentShift;
+        if(iRightIndentPos - m_draggingCenter < m_minColumnWidth)
 		{
-			// don't drag left indent off page.
-			m_draggingCenter = xAbsLeft - m_infoCache.m_xrLeftIndent;
+            m_draggingCenter = iRightIndentPos - m_minColumnWidth;
 		}
+
 		if(m_draggingCenter == oldDragCenter)
 		{
 			// Position not changing so finish here.
@@ -1605,10 +1600,15 @@
 								m_infoCache.u.c.m_xColumnWidth + m_infoCache.u.c.m_xaRightMargin;
 
 		m_draggingCenter = _snapPixelToGrid(x, tick);
-		if(m_draggingCenter > xAbsRight)
+
+        UT_sint32 iAbsLeft = _getFirstPixelInColumn(&m_infoCache,0);
+        UT_sint32 iAbsRight = iAbsLeft + m_infoCache.u.c.m_xColumnWidth;
+        UT_sint32 iLeftIndentPos = iAbsLeft + UT_MAX(0,UT_MAX(m_infoCache.m_xrLeftIndent,m_infoCache.m_xrLeftIndent + m_infoCache.m_xrFirstLineIndent)) + UT_MAX(0,m_infoCache.m_xrRightIndent);
+        if(m_draggingCenter - iLeftIndentPos < m_minColumnWidth)
 		{
-			m_draggingCenter = xAbsRight;
+            m_draggingCenter = iLeftIndentPos + m_minColumnWidth;
 		}
+
 		if(m_draggingCenter == oldDragCenter)
 		{
 			// Position not changing so finish here.
@@ -1721,6 +1721,13 @@
 			UT_sint32 oldDraggingCenter = m_draggingCenter;
 			UT_Rect oldDraggingRect = m_draggingRect;
 			m_draggingCenter = xAbsLeft + xgrid;
+
+            UT_sint32 iRightPos = m_infoCache.u.c.m_xColumnWidth + xAbsLeft - m_infoCache.m_xrRightIndent;
+            if(iRightPos - m_draggingCenter < m_minColumnWidth)
+            {
+                m_draggingCenter = iRightPos - m_minColumnWidth;
+            }
+
 			_getParagraphMarkerRects(&m_infoCache,m_draggingCenter,0,0,&m_draggingRect,NULL,NULL);
 			if (!m_bBeforeFirstMotion && (m_draggingCenter != oldDraggingCenter))
 				draw(&oldDraggingRect,&m_infoCache);
@@ -1758,6 +1765,15 @@
 			UT_Rect oldDragging2Rect = m_dragging2Rect;
 			m_draggingCenter  = xAbsLeft + xgrid;
 			m_dragging2Center = xAbsLeft + xgridTagAlong;
+
+            UT_sint32 iFirstIndentShift = UT_MAX(0,m_infoCache.m_xrFirstLineIndent);
+            UT_sint32 iRightIndentPos = xAbsLeft + m_infoCache.u.c.m_xColumnWidth - m_infoCache.m_xrRightIndent - iFirstIndentShift;
+            if(iRightIndentPos - m_draggingCenter < m_minColumnWidth)
+            {
+                m_draggingCenter = iRightIndentPos - m_minColumnWidth;
+                m_dragging2Center = m_draggingCenter + xgridTagAlong - xgrid;
+            }
+
 			_getParagraphMarkerRects(&m_infoCache,
 									 m_draggingCenter,0,m_dragging2Center,
 									 &m_draggingRect,NULL,&m_dragging2Rect);
@@ -1789,6 +1805,13 @@
 			UT_sint32 oldDraggingCenter = m_draggingCenter;
 			UT_Rect oldDraggingRect = m_draggingRect;
 			m_draggingCenter = xAbsRight - xgrid;
+
+            UT_sint32 iLeftIndentPos = xAbsLeft + UT_MAX(m_infoCache.m_xrLeftIndent,m_infoCache.m_xrLeftIndent + m_infoCache.m_xrFirstLineIndent);
+            if(m_draggingCenter - iLeftIndentPos < m_minColumnWidth)
+            {
+                m_draggingCenter = iLeftIndentPos + m_minColumnWidth;
+            }
+
 			_getParagraphMarkerRects(&m_infoCache,0,m_draggingCenter,0,NULL,&m_draggingRect,NULL);
 			if (!m_bBeforeFirstMotion && (m_draggingCenter != oldDraggingCenter))
 				draw(&oldDraggingRect,&m_infoCache);
@@ -1818,6 +1841,13 @@
 			UT_sint32 oldDraggingCenter = m_draggingCenter;
 			UT_Rect oldDraggingRect = m_draggingRect;
 			m_draggingCenter = xAbsLeft + m_infoCache.m_xrLeftIndent + xgrid;
+
+            UT_sint32 iRightIndentPos = xAbsLeft + m_infoCache.u.c.m_xColumnWidth - m_infoCache.m_xrRightIndent;
+            if(iRightIndentPos - m_draggingCenter  < m_minColumnWidth)
+            {
+                m_draggingCenter = iRightIndentPos - m_minColumnWidth;
+            }
+
 			_getParagraphMarkerRects(&m_infoCache,0,0,m_draggingCenter,NULL,NULL,&m_draggingRect);
 			if (!m_bBeforeFirstMotion && (m_draggingCenter != oldDraggingCenter))
 				draw(&oldDraggingRect,&m_infoCache);
