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/fp_Column.cpp abi.pow\src\/text/fmt/xp/fp_Column.cpp
--- abi.org\src\/text/fmt/xp/fp_Column.cpp	Thu May 11 09:01:00 2000
+++ abi.pow\src\/text/fmt/xp/fp_Column.cpp	Mon May 15 09:10:38 2000
@@ -24,6 +24,7 @@
 #include "fp_Column.h"
 #include "fp_Page.h"
 #include "fp_Line.h"
+#include "fv_View.h"
 #include "fl_SectionLayout.h"
 #include "gr_DrawArgs.h"
 
@@ -214,6 +215,24 @@
 	}
 }
 
+void fp_Container::_drawBoundaries(dg_DrawArgs* pDA)
+{
+    UT_ASSERT(pDA->pG == m_pG);
+    if(m_pPage->getDocLayout()->getView()->getShowPara() && m_pG->queryProperties(GR_Graphics::DGP_SCREEN)){
+        UT_RGBColor clr(127,127,127);
+        m_pG->setColor(clr);
+        UT_sint32 xoffBegin = pDA->xoff - 1;
+        UT_sint32 yoffBegin = pDA->yoff - 1;
+        UT_sint32 xoffEnd = pDA->xoff + m_iWidth + 2;
+        UT_sint32 yoffEnd = pDA->yoff + m_iMaxHeight + 2;
+
+        m_pG->drawLine(xoffBegin, yoffBegin, xoffEnd, yoffBegin);
+        m_pG->drawLine(xoffBegin, yoffEnd, xoffEnd, yoffEnd);
+        m_pG->drawLine(xoffBegin, yoffBegin, xoffBegin, yoffEnd);
+        m_pG->drawLine(xoffEnd, yoffBegin, xoffEnd, yoffEnd);
+    }
+}
+
 void fp_Container::draw(dg_DrawArgs* pDA)
 {
 	int count = m_vecLines.getItemCount();
@@ -227,6 +246,8 @@
 		pLine->draw(&da);
 	}
 
+    _drawBoundaries(pDA);
+
 #if 0
 	m_pG->drawLine(pDA->xoff, pDA->yoff, pDA->xoff + m_iWidth, pDA->yoff);
 	m_pG->drawLine(pDA->xoff + m_iWidth, pDA->yoff, pDA->xoff + m_iWidth, pDA->yoff + m_iMaxHeight);
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/fp_Column.h abi.pow\src\/text/fmt/xp/fp_Column.h
--- abi.org\src\/text/fmt/xp/fp_Column.h	Wed Apr 19 19:50:52 2000
+++ abi.pow\src\/text/fmt/xp/fp_Column.h	Mon May 15 09:11:19 2000
@@ -109,6 +109,8 @@
 	fl_SectionLayout*		m_pSectionLayout;
 
 	GR_Graphics*			m_pG;
+
+    void                    _drawBoundaries(dg_DrawArgs* pDA);
 };
 
 class fp_Column : public fp_Container
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/fp_Page.cpp abi.pow\src\/text/fmt/xp/fp_Page.cpp
--- abi.org\src\/text/fmt/xp/fp_Page.cpp	Thu May 11 09:01:02 2000
+++ abi.pow\src\/text/fmt/xp/fp_Page.cpp	Mon May 15 09:46:37 2000
@@ -151,11 +151,50 @@
 	return m_pLayout;
 }
 
+void fp_Page::_drawCropMarks(dg_DrawArgs* pDA)
+{
+    if(m_pView->getShowPara() && pDA->pG->queryProperties(GR_Graphics::DGP_SCREEN)){
+        fp_Column* pFirstColumnLeader = getNthColumnLeader(0);
+        fl_DocSectionLayout* pFirstSectionLayout = (pFirstColumnLeader->getDocSectionLayout());
+        UT_ASSERT(m_pOwner == pFirstSectionLayout);
+        UT_sint32 iLeftMargin = pFirstSectionLayout->getLeftMargin();
+        UT_sint32 iRightMargin = pFirstSectionLayout->getRightMargin();
+        UT_sint32 iTopMargin = pFirstSectionLayout->getTopMargin();
+        UT_sint32 iBottomMargin = pFirstSectionLayout->getBottomMargin();
+
+        UT_sint32 xoffStart = pDA->xoff + iLeftMargin - 1;
+        UT_sint32 yoffStart = pDA->yoff + iTopMargin - 1;
+        UT_sint32 xoffEnd = pDA->xoff + getWidth() - iRightMargin + 2;
+        UT_sint32 yoffEnd = pDA->yoff + getHeight() - iBottomMargin + 2;
+
+        UT_sint32 iLeftWidth = UT_MIN(iLeftMargin,20);
+        UT_sint32 iRightWidth = UT_MIN(iRightMargin,20);
+        UT_sint32 iTopHeight = UT_MIN(iTopMargin,20);
+        UT_sint32 iBottomHeight = UT_MIN(iBottomMargin,20);
+
+        UT_RGBColor clr(127,127,127);
+        pDA->pG->setColor(clr);
+        pDA->pG->drawLine(xoffStart, yoffStart, xoffStart, yoffStart - iTopHeight);
+        pDA->pG->drawLine(xoffStart, yoffStart, xoffStart - iLeftWidth, yoffStart);
+
+        pDA->pG->drawLine(xoffEnd, yoffStart - iTopHeight, xoffEnd, yoffStart);
+        pDA->pG->drawLine(xoffEnd, yoffStart, xoffEnd + iRightWidth, yoffStart);
+
+        pDA->pG->drawLine(xoffStart, yoffEnd, xoffStart, yoffEnd + iBottomHeight);
+        pDA->pG->drawLine(xoffStart - iLeftWidth, yoffEnd, xoffStart, yoffEnd);
+
+        pDA->pG->drawLine(xoffEnd, yoffEnd, xoffEnd, yoffEnd + iBottomHeight);
+        pDA->pG->drawLine(xoffEnd, yoffEnd, xoffEnd + iRightWidth, yoffEnd);
+    }
+}
+
 void fp_Page::draw(dg_DrawArgs* pDA)
 {
 	// draw each column on the page
 	int count = m_vecColumnLeaders.getItemCount();
 
+    _drawCropMarks(pDA);
+
 	for (int i=0; i<count; i++)
 	{
 		fp_Column* pCol = (fp_Column*) m_vecColumnLeaders.getNthItem(i);
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/fp_Page.h abi.pow\src\/text/fmt/xp/fp_Page.h
--- abi.org\src\/text/fmt/xp/fp_Page.h	Thu May 11 09:01:03 2000
+++ abi.pow\src\/text/fmt/xp/fp_Page.h	Mon May 15 09:13:27 2000
@@ -89,6 +89,7 @@
 #endif
 	
 protected:
+    void                _drawCropMarks(dg_DrawArgs*);
 	void				_reformat(void);
 
 	FL_DocLayout*		m_pLayout;
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/fp_Run.cpp abi.pow\src\/text/fmt/xp/fp_Run.cpp
--- abi.org\src\/text/fmt/xp/fp_Run.cpp	Thu May 11 09:01:05 2000
+++ abi.pow\src\/text/fmt/xp/fp_Run.cpp	Mon May 15 09:20:12 2000
@@ -309,7 +309,24 @@
 	return pSpanAP;
 }
 
+void fp_Run::_drawTextLine(UT_sint32 xoff,UT_sint32 yoff,UT_uint32 iWidth,UT_uint32 iHeight,UT_UCSChar *pText)
+{
+    m_pG->setFont(m_pG->getGUIFont());
 
+    UT_uint32 iTextLen = UT_UCS_strlen(pText);
+    UT_uint32 iTextWidth = m_pG->measureString(pText,0,iTextLen,NULL); 
+    UT_uint32 iTextHeight = m_pG->getFontHeight();
+
+    UT_uint32 xoffText = xoff + (iWidth - iTextWidth) / 2;
+    UT_uint32 yoffText = yoff - m_pG->getFontAscent() * 2 / 3;
+
+    m_pG->drawLine(xoff,yoff,xoff + iWidth,yoff);
+    UT_RGBColor clrPaper(255,255,255);
+    if((iTextWidth < iWidth) && (iTextHeight < iHeight)){
+        m_pG->fillRect(clrPaper,xoffText,yoffText,iTextWidth,iTextHeight);
+        m_pG->drawChars(pText,0,iTextLen,xoffText,yoffText);
+    }
+}
 
 //////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////
@@ -332,6 +349,8 @@
 	FL_DocLayout * pLayout = m_pBL->getDocLayout();
 	GR_Font* pFont = pLayout->findFont(pSpanAP,pBlockAP,pSectionAP, FL_DocLayout::FIND_FONT_AT_SCREEN_RESOLUTION);
 
+    UT_parseColor(PP_evalProperty("color",pSpanAP,pBlockAP,pSectionAP, m_pBL->getDocument(), UT_TRUE), m_colorFG);
+
 	m_pG->setFont(pFont);
 	m_iAscent = m_pG->getFontAscent();	
 	m_iDescent = m_pG->getFontDescent();
@@ -410,6 +429,51 @@
 	m_pG->clearArea(xoff, yoff, m_iWidth, m_pLine->getHeight());
 }
 
+void fp_TabRun::_drawArrow(UT_uint32 iLeft,UT_uint32 iTop,UT_uint32 iWidth, UT_uint32 iHeight)
+{
+    if (!(m_pG->queryProperties(GR_Graphics::DGP_SCREEN))){
+        return;
+    }
+
+    #define NPOINTS 8
+
+    UT_Point * points = (UT_Point *)calloc(NPOINTS,sizeof(UT_Point));
+    UT_ASSERT(points);
+
+    UT_sint32 cur_linewidth = 1 + (UT_MAX(10,m_iAscent) - 10) / 8;
+    UT_uint32 iyAxis = iTop + m_pLine->getAscent() * 2 / 3;
+    UT_uint32 iMaxWidth = iWidth / 10 * 6;
+    UT_uint32 ixGap = (iWidth - iMaxWidth) / 2;
+
+    points[0].x = iLeft + ixGap;
+    points[0].y = iyAxis - cur_linewidth / 2;
+
+    points[1].x = iLeft + ixGap + iMaxWidth - cur_linewidth * 4;
+    points[1].y = points[0].y;
+
+    points[2].x = points[1].x;
+    points[2].y = points[0].y - cur_linewidth * 2;
+
+    points[3].x = iLeft + iWidth - ixGap;
+    points[3].y = iyAxis;
+
+    points[4].x = points[1].x;
+    points[4].y = iyAxis + cur_linewidth * 2;
+
+    points[5].x = points[1].x;
+    points[5].y = iyAxis + cur_linewidth / 2;
+
+    points[6].x = points[0].x;
+    points[6].y = points[5].y;
+
+    points[7].x = points[0].x;
+    points[7].y = points[0].y;
+
+    m_pG->setColor(m_colorFG);
+    m_pG->polyLine(points,NPOINTS);
+    FREEP(points);
+}
+
 void fp_TabRun::_draw(dg_DrawArgs* pDA)
 {
 	UT_ASSERT(pDA->pG == m_pG);
@@ -438,10 +502,16 @@
 		)
 	{
 		m_pG->fillRect(clrSelBackground, pDA->xoff, iFillTop, m_iWidth, iFillHeight);
+        if(pView->getShowPara()){
+            _drawArrow(pDA->xoff, iFillTop, m_iWidth, iFillHeight);
+        }
 	}
 	else
 	{
 		m_pG->fillRect(clrNormalBackground, pDA->xoff, iFillTop, m_iWidth, iFillHeight);
+        if(pView->getShowPara()){
+            _drawArrow(pDA->xoff, iFillTop, m_iWidth, iFillHeight);
+        }
 	}
 }
 
@@ -1073,11 +1143,34 @@
 {
 	UT_ASSERT(!m_bDirty);
 	UT_ASSERT(m_pG->queryProperties(GR_Graphics::DGP_SCREEN));
+
+    UT_sint32 xoff = 0, yoff = 0;
+    m_pLine->getScreenOffsets(this, xoff, yoff);
+    UT_sint32 iWidth  = m_pLine->getMaxWidth() - m_pLine->calculateWidthOfLine();
+
+    m_pG->clearArea(xoff,yoff,iWidth,m_pLine->getHeight());
 }
 
 void fp_ForcedColumnBreakRun::_draw(dg_DrawArgs* pDA)
 {
 	UT_ASSERT(pDA->pG == m_pG);
+
+    if (!(m_pG->queryProperties(GR_Graphics::DGP_SCREEN))){
+        return;
+    }
+
+    FV_View* pView = m_pBL->getDocLayout()->getView();
+    UT_ASSERT(pView);
+    if(!pView->getShowPara()){
+        return;
+    }
+
+    UT_sint32 iLineWidth  = m_pLine->getMaxWidth() - m_pLine->calculateWidthOfLine();
+
+    UT_UCSChar *pColumnBreak;
+    UT_UCS_cloneString_char(&pColumnBreak,"Column Break");
+    _drawTextLine(pDA->xoff,pDA->yoff - m_pLine->getAscent() / 3,iLineWidth,m_pLine->getHeight(),pColumnBreak);
+    FREEP(pColumnBreak);
 }
 
 //////////////////////////////////////////////////////////////////
@@ -1142,10 +1235,33 @@
 {
 	UT_ASSERT(!m_bDirty);
 	UT_ASSERT(m_pG->queryProperties(GR_Graphics::DGP_SCREEN));
+
+    UT_sint32 xoff = 0, yoff = 0;
+    m_pLine->getScreenOffsets(this, xoff, yoff);
+    UT_sint32 iWidth  = m_pLine->getMaxWidth() - m_pLine->calculateWidthOfLine();
+
+    m_pG->clearArea(xoff,yoff,iWidth,m_pLine->getHeight());
 }
 
 void fp_ForcedPageBreakRun::_draw(dg_DrawArgs* pDA)
 {
 	UT_ASSERT(pDA->pG == m_pG);
+
+    if (!(m_pG->queryProperties(GR_Graphics::DGP_SCREEN))){
+        return;
+    }
+
+    FV_View* pView = m_pBL->getDocLayout()->getView();
+    UT_ASSERT(pView);
+    if(!pView->getShowPara()){
+        return;
+    }
+
+    UT_sint32 iLineWidth  = m_pLine->getMaxWidth() - m_pLine->calculateWidthOfLine();
+
+    UT_UCSChar *pPageBreak;
+    UT_UCS_cloneString_char(&pPageBreak,"Page Break");
+    _drawTextLine(pDA->xoff,pDA->yoff - m_pLine->getAscent() / 3,iLineWidth,m_pLine->getHeight(),pPageBreak);
+    FREEP(pPageBreak);
 }
 
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/fp_Run.h abi.pow\src\/text/fmt/xp/fp_Run.h
--- abi.org\src\/text/fmt/xp/fp_Run.h	Thu May 11 09:01:05 2000
+++ abi.pow\src\/text/fmt/xp/fp_Run.h	Mon May 15 09:20:54 2000
@@ -150,6 +150,7 @@
 	virtual	UT_Bool			recalcWidth(void);
 	
 	virtual void			_draw(dg_DrawArgs*) = 0;
+    void                    _drawTextLine(UT_sint32, UT_sint32, UT_uint32, UT_uint32, UT_UCSChar *);
 	virtual void       		_clearScreen(UT_Bool bFullLineHeightRect) = 0;
 	virtual UT_Bool			canBreakAfter(void) const = 0;
 	virtual UT_Bool			canBreakBefore(void) const = 0;
@@ -223,6 +224,9 @@
 	void					setWidth(UT_sint32);
 	
 protected:
+    UT_RGBColor             m_colorFG;
+
+    virtual void            _drawArrow(UT_uint32 iLeft,UT_uint32 iTop,UT_uint32 iWidth, UT_uint32 iHeight);
 	virtual void			_draw(dg_DrawArgs*);
 	virtual void       		_clearScreen(UT_Bool bFullLineHeightRect);
 };
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/fp_TextRun.cpp abi.pow\src\/text/fmt/xp/fp_TextRun.cpp
--- abi.org\src\/text/fmt/xp/fp_TextRun.cpp	Thu May 11 09:01:08 2000
+++ abi.pow\src\/text/fmt/xp/fp_TextRun.cpp	Mon May 15 09:22:27 2000
@@ -811,6 +811,9 @@
 	}
 
 	_drawDecors(pDA->xoff, yTopOfRun);
+    if(pView->getShowPara()){
+        _drawInvisibles(pDA->xoff, yTopOfRun);
+    }
 
 	// TODO: draw this underneath (ie, before) the text and decorations
 	m_bSquiggled = UT_FALSE;
@@ -1119,6 +1122,56 @@
 	m_pG->setLineWidth(m_iLineWidth);
 }
 
+void fp_TextRun::_drawInvisibleSpaces(UT_sint32 xoff, UT_sint32 yoff)
+{
+    UT_GrowBuf * pgbCharWidths = m_pBL->getCharWidths()->getCharWidths();
+    UT_uint16* pCharWidths = pgbCharWidths->getPointer(0);
+    const UT_UCSChar* pSpan;
+    UT_uint32 lenSpan;
+    UT_uint32 len = m_iLen;
+    UT_sint32 iWidth = 0;
+    UT_sint32 cur_linewidth = 1+ (UT_MAX(10,m_iAscent)-10)/8;
+    UT_sint32 iRectSize = cur_linewidth * 3 / 2;
+    UT_Bool bContinue = UT_TRUE;
+    UT_uint32 offset = m_iOffsetFirst;
+
+    if(findCharacter(0, UCS_SPACE) > 0){
+        while(bContinue){
+            bContinue = m_pBL->getSpanPtr(offset,&pSpan,&lenSpan);
+            UT_ASSERT(lenSpan > 0);
+
+
+            if(lenSpan > len){
+                lenSpan = len;
+            }
+
+            UT_uint32 iy = yoff + getAscent() * 2 / 3;
+
+            for (UT_uint32 i = 0;i < lenSpan;i++){
+               if(pSpan[i] == UCS_SPACE){
+                   m_pG->fillRect(m_colorFG,xoff + iWidth + (pCharWidths[i + offset] - iRectSize) / 2,iy,iRectSize,iRectSize);
+               }
+               iWidth += pCharWidths[i + offset];
+            }
+            if (len <= lenSpan){
+                bContinue = UT_FALSE;
+            }else{
+                offset += lenSpan;
+                len -= lenSpan;
+            }
+
+        }
+    }
+}
+
+void fp_TextRun::_drawInvisibles(UT_sint32 xoff, UT_sint32 yoff)
+{
+    if (!(m_pG->queryProperties(GR_Graphics::DGP_SCREEN))){
+        return;
+    }
+    _drawInvisibleSpaces(xoff,yoff);
+}
+
 void fp_TextRun::_drawSquiggle(UT_sint32 top, UT_sint32 left, UT_sint32 right)
 {
 	if (!(m_pG->queryProperties(GR_Graphics::DGP_SCREEN)))
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/fp_TextRun.h abi.pow\src\/text/fmt/xp/fp_TextRun.h
--- abi.org\src\/text/fmt/xp/fp_TextRun.h	Wed Apr 19 19:51:04 2000
+++ abi.pow\src\/text/fmt/xp/fp_TextRun.h	Mon May 15 09:23:04 2000
@@ -101,6 +101,8 @@
 	virtual void       		_clearScreen(UT_Bool bFullLineHeightRect);
 	
 	void					_drawDecors(UT_sint32, UT_sint32);
+    void                    _drawInvisibleSpaces(UT_sint32, UT_sint32);
+    void                    _drawInvisibles(UT_sint32, UT_sint32);
 	void					_drawSquiggle(UT_sint32 top, UT_sint32 left, UT_sint32 right);
 
 	void 					_getPartRect(UT_Rect* pRect,
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/fv_View.cpp abi.pow\src\/text/fmt/xp/fv_View.cpp
--- abi.org\src\/text/fmt/xp/fv_View.cpp	Thu May 11 09:01:15 2000
+++ abi.pow\src\/text/fmt/xp/fv_View.cpp	Mon May 15 09:23:54 2000
@@ -121,6 +121,7 @@
 
 	m_wrappedEnd = UT_FALSE;
 	m_startPosition = 0;
+    m_bShowPara = UT_FALSE;
 }
 
 FV_View::~FV_View()
@@ -5202,3 +5203,10 @@
 	return (wCount);
 }
 
+void FV_View::setShowPara(UT_Bool bShowPara)
+{
+    if(bShowPara != m_bShowPara){
+        m_bShowPara = bShowPara;
+        draw();
+    }
+};
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/fv_View.h abi.pow\src\/text/fmt/xp/fv_View.h
--- abi.org\src\/text/fmt/xp/fv_View.h	Thu May 11 09:01:16 2000
+++ abi.pow\src\/text/fmt/xp/fv_View.h	Mon May 15 09:24:45 2000
@@ -236,6 +236,8 @@
 
 	FV_DocCount                     countWords(void);
 
+    void            setShowPara(UT_Bool);    
+    inline UT_Bool  getShowPara(void) const { return m_bShowPara; };
 protected:
 	void				_generalUpdate(void);
 	
@@ -351,6 +353,8 @@
 
 	// prefs listener - to change cursor blink on/off (and possibly others)
 	static void _prefsListener( XAP_App *, XAP_Prefs *, UT_AlphaHashTable *, void *);
+
+    UT_Bool             m_bShowPara;
 };
 
 #endif /* FV_VIEW_H */
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/beos/ap_BeOSFrame.cpp abi.pow\src\/wp/ap/beos/ap_BeOSFrame.cpp
--- abi.org\src\/wp/ap/beos/ap_BeOSFrame.cpp	Wed Apr 19 19:51:53 2000
+++ abi.pow\src\/wp/ap/beos/ap_BeOSFrame.cpp	Mon May 15 09:25:59 2000
@@ -200,6 +200,7 @@
 	//((AP_FrameData*)m_pData)->m_pStatusBar->setView(pView);
 
 	pView->setInsertMode(((AP_FrameData*)m_pData)->m_bInsertMode);
+    ((FV_View *) m_pView)->setShowPara(((AP_FrameData*)m_pData)->m_bShowPara);
 	
 	m_pBeDocView->Window()->Lock();
 	m_pView->setWindowSize(m_pBeDocView->Bounds().Width(),
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/qnx/ap_QNXFrame.cpp abi.pow\src\/wp/ap/qnx/ap_QNXFrame.cpp
--- abi.org\src\/wp/ap/qnx/ap_QNXFrame.cpp	Wed May 10 08:45:51 2000
+++ abi.pow\src\/wp/ap/qnx/ap_QNXFrame.cpp	Mon May 15 09:26:29 2000
@@ -212,6 +212,7 @@
 	((AP_FrameData*)m_pData)->m_pStatusBar->setView(pView);
 
 	pView->setInsertMode(((AP_FrameData*)m_pData)->m_bInsertMode);
+    ((FV_View *) m_pView)->setShowPara(((AP_FrameData*)m_pData)->m_bShowPara);
 	
 	unsigned short w, h;
 	UT_QNXGetWidgetArea(m_dArea, NULL, NULL, &w, &h);
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/unix/ap_UnixFrame.cpp abi.pow\src\/wp/ap/unix/ap_UnixFrame.cpp
--- abi.org\src\/wp/ap/unix/ap_UnixFrame.cpp	Thu May 11 09:01:37 2000
+++ abi.pow\src\/wp/ap/unix/ap_UnixFrame.cpp	Mon May 15 09:26:51 2000
@@ -214,6 +214,7 @@
 	((AP_FrameData*)m_pData)->m_pStatusBar->setView(pView);
 
 	pView->setInsertMode(((AP_FrameData*)m_pData)->m_bInsertMode);
+    ((FV_View *) m_pView)->setShowPara(((AP_FrameData*)m_pData)->m_bShowPara);
 	
 	m_pView->setWindowSize(GTK_WIDGET(m_dArea)->allocation.width,
 						   GTK_WIDGET(m_dArea)->allocation.height);
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/win/ap_Win32Dialog_Options.cpp abi.pow\src\/wp/ap/win/ap_Win32Dialog_Options.cpp
--- abi.org\src\/wp/ap/win/ap_Win32Dialog_Options.cpp	Tue Apr 25 20:19:19 2000
+++ abi.pow\src\/wp/ap/win/ap_Win32Dialog_Options.cpp	Mon May 15 09:29:33 2000
@@ -375,6 +375,7 @@
 		{
 			// localize controls
 			_DS(OPTIONS_CHK_ViewShowRuler,			DLG_Options_Label_ViewRuler);
+            _DS(OPTIONS_CHK_ViewUnprintable,        DLG_Options_Label_ViewUnprintable);
 			_DS(OPTIONS_CHK_ViewCursorBlink,		DLG_Options_Label_ViewCursorBlink);
 			_DS(OPTIONS_CHK_ViewShowToolbars,		DLG_Options_Label_ViewToolbars);
 			_DS(OPTIONS_CHK_ViewAll,				DLG_Options_Label_ViewAll);
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/win/ap_Win32Frame.cpp abi.pow\src\/wp/ap/win/ap_Win32Frame.cpp
--- abi.org\src\/wp/ap/win/ap_Win32Frame.cpp	Thu May 11 09:01:39 2000
+++ abi.pow\src\/wp/ap/win/ap_Win32Frame.cpp	Mon May 15 09:28:35 2000
@@ -307,6 +307,7 @@
 	static_cast<AP_FrameData*>(m_pData)->m_pStatusBar->setView(pView);
 
 	pView->setInsertMode(static_cast<AP_FrameData*>(m_pData)->m_bInsertMode);
+    ((FV_View *) m_pView)->setShowPara(((AP_FrameData*)m_pData)->m_bShowPara);
 
 	RECT r;
 	GetClientRect(hwnd, &r);
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_Dialog_Options.cpp abi.pow\src\/wp/ap/xp/ap_Dialog_Options.cpp
--- abi.org\src\/wp/ap/xp/ap_Dialog_Options.cpp	Wed Apr 19 19:53:57 2000
+++ abi.pow\src\/wp/ap/xp/ap_Dialog_Options.cpp	Mon May 15 09:32:44 2000
@@ -103,6 +103,7 @@
 
 	Save_Pref_Bool( pPrefsScheme, AP_PREF_KEY_CursorBlink, _gatherViewCursorBlink() );
 	Save_Pref_Bool( pPrefsScheme, AP_PREF_KEY_RulerVisible, _gatherViewShowRuler() );
+    Save_Pref_Bool( pPrefsScheme, AP_PREF_KEY_ParaVisible, _gatherViewUnprintable() );
 
 	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 	// If we changed whether the ruler is to be visible
@@ -114,6 +115,17 @@
 		m_pFrame->toggleRuler( _gatherViewShowRuler() );
 	}
 
+    if ( _gatherViewUnprintable() != pFrameData->m_bShowPara )
+    {
+        pFrameData->m_bShowPara = _gatherViewUnprintable() ;
+        AV_View * pAVView = m_pFrame->getCurrentView();
+        UT_ASSERT(pAVView);
+
+        FV_View * pView = static_cast<FV_View *> (pAVView);
+
+        pView->setShowPara( _gatherViewUnprintable() );
+    }
+
 	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 	// save ruler units value
 	pPrefsScheme->setValue( AP_PREF_KEY_RulerUnits, UT_dimensionName( _gatherViewRulerUnits()) );
@@ -181,6 +193,9 @@
 	if (pPrefs->getPrefsValueBool(AP_PREF_KEY_RulerVisible,&b))
 		_setViewShowRuler (b);
 
+    if (pPrefs->getPrefsValueBool(AP_PREF_KEY_ParaVisible,&b))
+        _setViewUnprintable (b);
+
 	if (pPrefs->getPrefsValueBool(AP_PREF_KEY_CursorBlink,&b))
 		_setViewCursorBlink (b);
 
@@ -234,7 +249,6 @@
 	_controlEnable( id_CHECK_VIEW_SHOW_TOOLBARS,	UT_FALSE );
 	_controlEnable( id_CHECK_VIEW_ALL,				UT_FALSE );
 	_controlEnable( id_CHECK_VIEW_HIDDEN_TEXT,		UT_FALSE );
-	_controlEnable( id_CHECK_VIEW_UNPRINTABLE,		UT_FALSE );
 
 	// general
 	_controlEnable( id_BUTTON_SAVE,					UT_FALSE );
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_EditMethods.cpp abi.pow\src\/wp/ap/xp/ap_EditMethods.cpp
--- abi.org\src\/wp/ap/xp/ap_EditMethods.cpp	Wed Apr 26 18:25:59 2000
+++ abi.pow\src\/wp/ap/xp/ap_EditMethods.cpp	Mon May 15 09:33:30 2000
@@ -3976,8 +3976,26 @@
 	XAP_Frame * pFrame = (XAP_Frame *) pAV_View->getParentData();
 	UT_ASSERT(pFrame);
 
-	// TODO: synch this implementation with ap_GetState_View
-	s_TellNotImplemented(pFrame, "Show/Hide Paragraphs", __LINE__);
+    AP_FrameData *pFrameData = (AP_FrameData *)pFrame->getFrameData();
+    UT_ASSERT(pFrameData);
+
+    pFrameData->m_bShowPara = !pFrameData->m_bShowPara;
+
+    ABIWORD_VIEW;
+    pView->setShowPara(pFrameData->m_bShowPara);
+
+#if 0
+    // POLICY: make this the default for new frames, too
+    XAP_App * pApp = pFrame->getApp();
+    UT_ASSERT(pApp);
+    XAP_Prefs * pPrefs = pApp->getPrefs();
+    UT_ASSERT(pPrefs);
+    XAP_PrefsScheme * pScheme = pPrefs->getCurrentScheme(UT_TRUE);
+    UT_ASSERT(pScheme);
+
+    pScheme->setValueBool(AP_PREF_KEY_ParaVisible, pFrameData->m_bShowPara);
+#endif
+
 	return UT_TRUE;
 }
 
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_FrameData.cpp abi.pow\src\/wp/ap/xp/ap_FrameData.cpp
--- abi.org\src\/wp/ap/xp/ap_FrameData.cpp	Wed Apr 19 19:54:17 2000
+++ abi.pow\src\/wp/ap/xp/ap_FrameData.cpp	Mon May 15 09:34:17 2000
@@ -37,6 +37,7 @@
 	m_pStatusBar = NULL;
 
 	m_bShowRuler = UT_TRUE;
+    m_bShowPara = UT_TRUE;
 	m_bInsertMode = UT_TRUE;
 
 	if (pApp)
@@ -48,6 +49,9 @@
 
 		if (pApp->getPrefsValueBool( AP_PREF_KEY_RulerVisible, &b))
 			m_bShowRuler = b;
+
+        if (pApp->getPrefsValueBool( AP_PREF_KEY_ParaVisible, &b))
+            m_bShowPara = b;
 	}
 }
 
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_FrameData.h abi.pow\src\/wp/ap/xp/ap_FrameData.h
--- abi.org\src\/wp/ap/xp/ap_FrameData.h	Wed Apr 19 19:54:17 2000
+++ abi.pow\src\/wp/ap/xp/ap_FrameData.h	Mon May 15 09:34:39 2000
@@ -48,6 +48,7 @@
 
 	UT_Bool				m_bInsertMode;
 	UT_Bool				m_bShowRuler;
+    UT_Bool             m_bShowPara;
 	AP_TopRuler *		m_pTopRuler;
 	AP_LeftRuler *		m_pLeftRuler;
 
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_Menu_Functions.cpp abi.pow\src\/wp/ap/xp/ap_Menu_Functions.cpp
--- abi.org\src\/wp/ap/xp/ap_Menu_Functions.cpp	Wed Apr 19 19:54:47 2000
+++ abi.pow\src\/wp/ap/xp/ap_Menu_Functions.cpp	Mon May 15 09:35:08 2000
@@ -535,6 +535,11 @@
 		break;
 
 	case AP_MENU_ID_VIEW_SHOWPARA:
+        if ( pFrameData->m_bShowPara )
+            s = EV_MIS_Toggled;
+        else
+            s = EV_MIS_ZERO;
+        break;
 	case AP_MENU_ID_VIEW_HEADFOOT:
 		// TODO: implement view methods to check, toggle state
 		s = EV_MIS_Gray;
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_Prefs_SchemeIds.h abi.pow\src\/wp/ap/xp/ap_Prefs_SchemeIds.h
--- abi.org\src\/wp/ap/xp/ap_Prefs_SchemeIds.h	Wed Apr 19 19:55:10 2000
+++ abi.pow\src\/wp/ap/xp/ap_Prefs_SchemeIds.h	Mon May 15 09:36:07 2000
@@ -62,6 +62,8 @@
 #define AP_PREF_KEY_RulerVisible					"RulerVisible"				/* are the rulers visible? {0,1} */
 #define AP_PREF_DEFAULT_RulerVisible				"1"
 
+#define AP_PREF_KEY_ParaVisible                     "ParaVisible"               /* are the paragraphs/spaces/tats/etc. visible? {0,1} */
+#define AP_PREF_DEFAULT_ParaVisible                 "0"
 
 
 #define AP_PREF_KEY_SpellCheckWordList				"SpellCheckWordList"		/* name of ispell hash file */
@@ -111,6 +113,7 @@
 dcl(OptionsTabNumber)
 dcl(RulerUnits)
 dcl(RulerVisible)
+dcl(ParaVisible)
 dcl(SpellCheckWordList)
 dcl(StringSet)
 dcl(KeyBindings)
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_Toolbar_Functions.cpp abi.pow\src\/wp/ap/xp/ap_Toolbar_Functions.cpp
--- abi.org\src\/wp/ap/xp/ap_Toolbar_Functions.cpp	Wed Apr 19 19:55:23 2000
+++ abi.pow\src\/wp/ap/xp/ap_Toolbar_Functions.cpp	Mon May 15 09:37:20 2000
@@ -312,7 +312,10 @@
 		const XML_Char ** props_in = NULL;
 		const XML_Char * sz = NULL;
 
-		if (!pView->getSectionFormat(&props_in))
+        UT_Bool bResult = pView->getSectionFormat(&props_in);
+        pView->draw(NULL);
+
+        if (!bResult)
 			return s;
 
 		// NB: maybe *no* properties are consistent across the selection
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.pow\src\/wp/ap/xp/ap_TopRuler.cpp
--- abi.org\src\/wp/ap/xp/ap_TopRuler.cpp	Thu Apr 20 09:03:47 2000
+++ abi.pow\src\/wp/ap/xp/ap_TopRuler.cpp	Mon May 15 09:39:27 2000
@@ -1279,7 +1279,9 @@
 
 			_xorGuide(UT_TRUE);
 			m_draggingWhat = DW_NOTHING;
-			(static_cast<FV_View *>(m_pView))->setSectionFormat(properties);
+            FV_View *pView = static_cast<FV_View *>(m_pView);
+            pView->setSectionFormat(properties);
+            pView->draw(NULL);
 		}
 		return;
 
@@ -1298,7 +1300,9 @@
 
 			_xorGuide(UT_TRUE);
 			m_draggingWhat = DW_NOTHING;
-			(static_cast<FV_View *>(m_pView))->setSectionFormat(properties);
+            FV_View *pView = static_cast<FV_View *>(m_pView);
+            pView->setSectionFormat(properties);
+            pView->draw(NULL);
 		}
 		return;
 
@@ -1314,7 +1318,9 @@
 			UT_DEBUGMSG(("TopRuler: ColumnGap [%s]\n",properties[1]));
 
 			m_draggingWhat = DW_NOTHING;
-			(static_cast<FV_View *>(m_pView))->setSectionFormat(properties);
+            FV_View *pView = static_cast<FV_View *>(m_pView);
+            pView->setSectionFormat(properties);
+            pView->draw(NULL);
 		}
 		return;
 		
