diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/inc/channels.h ipdf-new/inc/channels.h
--- ipdf-svn23-RJenhanced-070612.trunk/inc/channels.h	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/inc/channels.h	2007-08-31 15:14:29.000000000 +0200
@@ -35,6 +35,8 @@
 #define LandscapeToPortrait  -90
 #define RotateDirty          0
 
+#define UnknownAdvanceState  -1
+
 class CChannels
 {
 public:
@@ -51,6 +53,7 @@
     int         nRotateState;
     int         nContinousState;
     int         nZoombackState;
+    int         nColumnAdvanceState;
     ScbDocPtr   doc;        // maintain scribble state
     GBool       tbDirty;    
     eDmQuality  tbUpdateType;
@@ -72,6 +75,11 @@
     
     ////////////////////////////// toolbar /////////////////////////////
     GBool   onReceiveToolbarMsg(const int iconID, const int state); 
+    void    setColumnAdvanceState(const int state) { nColumnAdvanceState = state; }
+    GBool   isColumnAdvanceEnable() const { return iconState_selected == nColumnAdvanceState; }
+    GBool   isColumnAdvanceInit() const { return nColumnAdvanceState != UnknownAdvanceState; }
+    int     getColumnAdvanceState() const { return nColumnAdvanceState; }
+    void    initColumnAdvanceState(const GBool enable);
     void    setPanState(const int state) { nPanState = state; }
     GBool   isPanEnable() const { return iconState_selected == nPanState; }
     int     getPanState() const { return nPanState; }
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/inc/PDFViewerLog.h ipdf-new/inc/PDFViewerLog.h
--- ipdf-svn23-RJenhanced-070612.trunk/inc/PDFViewerLog.h	2007-06-12 23:16:54.000000000 +0200
+++ ipdf-new/inc/PDFViewerLog.h	2007-08-31 02:19:09.000000000 +0200
@@ -19,7 +19,7 @@
 #ifndef _PDFVIEWER_LOG_H_
 #define _PDFVIEWER_LOG_H_
 
-#define PV_LOGGING_ON       0 
+#define PV_LOGGING_ON       1 
 #define PV_WARNING_ON       1
 #define PV_ERROR_ON         1
 #define PV_DUMP_ON          1
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/inc/PDFView.h ipdf-new/inc/PDFView.h
--- ipdf-svn23-RJenhanced-070612.trunk/inc/PDFView.h	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/inc/PDFView.h	2007-08-31 14:12:48.000000000 +0200
@@ -58,10 +58,13 @@
     GooString *     getPassword();
     GtkWidget *     getWindow() { return drawArea; }
 
-    ////////////////////////// zoom and pan /////////////////////////
+    ////////////////// zoom , pan, column advance  //////////////////
 public:
     rectangle   zoomRect;   // used by zoom in/out 
     point       panPt;      // by pan
+    point       colPt;        // by columnadvance
+
+    void        initColumnAdvance(const int x, const int y);
     void        initPan(const int x, const int y);
     void        initZoomRect(const int x, const int y);
     void        adjustZoomRect(const int x, const int y);
@@ -93,6 +96,7 @@
     GBool       isZoomOutEnable();
     GBool       isScribbleEnable();
     GBool       isEraseEnable();
+    GBool       isColumnAdvanceEnable();
 
     ///////////////////////// view & mode ////////////////////////////
     GBool       isPageMode(); 
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/inc/Settings.h ipdf-new/inc/Settings.h
--- ipdf-svn23-RJenhanced-070612.trunk/inc/Settings.h	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/inc/Settings.h	2007-08-31 18:30:47.000000000 +0200
@@ -21,7 +21,7 @@
 #include "PageInfo.h"
 #include "goo/gtypes.h"
 #include <liberdm/display.h>
-
+#include <math.h>
 
 //////////////////////////////////////////////////////////////////////////
 // Define all settings here
@@ -48,6 +48,7 @@
 #define PageBreak       1
 #define PageRepeat      20
 #define Margin          -5
+#define ColumnMargin    40
 
 #define SmallWidth      1
 #define SmallHeight     2
@@ -120,6 +121,7 @@
     int         screenY;        // depends on view mode
     int         drawAreaWidth;  // usually it's a constant value
     int         drawAreaHeight; // could be change in run time, for full screen
+    double      columnWidth;    // column width for column advance sub mode
     int         currentPage;
     int         renderDir;      // pre-render direction
     int         mode;           // could be page-page or continous
@@ -128,8 +130,8 @@
     HistoryItem record;         // change to list to provide multi level record
     int         zbState;        // zoom back state is defined by user clicks count
     GBool       enableScb;      // is scribble enabled
+    GBool       enableColumnAdvance;
 
-     // Rincewind
      int         penSize;
      int         penColor;
      int         penLineStyle;
@@ -157,18 +159,20 @@
     void setRotate(const int r) { rotate = r; }
 
     // position & size
-    void getScreenRect(rectangle & rect);
+    int  getColumnWidth() const { return (int) (columnWidth * zoom); }
+    int  getScreenHeight() const { return drawAreaHeight; }
+    int  getScreenWidth() const { return drawAreaWidth; }
     int  getScreenX() const { return screenX; }
     int  getScreenY() const { return screenY; }
-    int  getScreenWidth() const { return drawAreaWidth; }
-    int  getScreenHeight() const { return drawAreaHeight; }
-    void setScreenX(const int x) { screenX = x; }
-    void setScreenY(const int y) { screenY = y; }
+    void getScreenRect(rectangle & rect);
     void moveScreenX(const int d) { screenX += d; }
     void moveScreenY(const int d) { screenY += d; }
+    void setColumnWidth(const int w) { columnWidth = w / zoom; }
     void setScreenPosition(const int , const int);
-    void setScreenSize(const int, const int);
     void setScreenRect(const rectangle & rect);
+    void setScreenSize(const int, const int);
+    void setScreenX(const int x) { screenX = x; }
+    void setScreenY(const int y) { screenY = y; }
     
     // page
     int getCurrentPage() const { return currentPage; }
@@ -201,6 +205,9 @@
 
     // is scribble enabled. Scribble can only disabled by manifest.
     GBool isScribbleEnabled() const { return enableScb; }
+
+    GBool isColumnAdvanceEnable() const { return enableColumnAdvance; }
+    void setColumnAdvance(const GBool enable) { enableColumnAdvance = enable; }
 };
 
 #endif
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/src/channels.cpp ipdf-new/src/channels.cpp
--- ipdf-svn23-RJenhanced-070612.trunk/src/channels.cpp	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/src/channels.cpp	2007-08-31 14:12:33.000000000 +0200
@@ -86,8 +86,8 @@
     nZoombackState = iconState_grey;
     nContinousState = iconState_normal;
     nRotateState = PortraitToLandscape;
-
-    // scribble icons are initialized by other function.
+    nColumnAdvanceState = UnknownAdvanceState;
+    // column advance and scribble icons are initialized by other function.
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -171,6 +171,23 @@
     tbEnableUpdate(ertoolbarChannel, ER_PDF_VIEWER_UA_ID);   
 }
 
+void CChannels::initColumnAdvanceState(const GBool enable)
+{
+    nColumnAdvanceState = iconState_normal;
+
+    if (enable == gTrue)
+    {
+        nColumnAdvanceState = iconState_selected;
+    }
+
+    tbDisableUpdate(ertoolbarChannel, ER_PDF_VIEWER_UA_ID);
+    // next page = next column if not at the horizontal end of the page
+    // I have no mouth and I must scream - steal the icon "start_reading"
+    tbAppendPlatformIcon(  ertoolbarChannel, ER_PDF_VIEWER_UA_ID, iconID_start_reading, ccVwrToolbar);
+    tbSetStatePlatformIcon(ertoolbarChannel, ER_PDF_VIEWER_UA_ID, iconID_start_reading, nColumnAdvanceState);
+    tbEnableUpdate(ertoolbarChannel, ER_PDF_VIEWER_UA_ID);
+}
+
 GBool CChannels::isScribbleIcon(const int id)
 {
     if ((iconID_pen == id) ||
@@ -374,6 +390,20 @@
         }  
         PV_TBPRINTF("Pan %d\n", nPanState);          
     }
+    else if (iconID == iconID_start_reading)
+    {
+	if (iconState_normal == nColumnAdvanceState)
+	{
+	    setToolbarDirty();
+	    setColumnAdvanceState(iconState_selected);
+	}
+	else if (iconState_selected == nColumnAdvanceState)
+	{
+	    setToolbarDirty();
+	    setColumnAdvanceState(iconState_normal);
+	}
+	PV_TBPRINTF("ColumnAdvance %d\n", nPanState);
+    }
     else if ((iconID == iconID_pen) || 
              (iconID >= iconID_pen1pixel && iconID <= iconID_pen7pixel) ||
              (iconID >= iconID_pen1pixelLow && iconID <= iconID_pen7pixelLow) ||
@@ -436,6 +466,11 @@
         tbAppendPlatformIcon(  ertoolbarChannel, ER_PDF_VIEWER_UA_ID, iconID_pan, ccVwrToolbar);
         tbSetStatePlatformIcon(ertoolbarChannel, ER_PDF_VIEWER_UA_ID, iconID_pan, nPanState );
         
+        // column advance
+        // I have no mouth and I must scream - steal the icon "start_reading"
+        tbAppendPlatformIcon(  ertoolbarChannel, ER_PDF_VIEWER_UA_ID, iconID_start_reading, ccVwrToolbar);
+        tbSetStatePlatformIcon(ertoolbarChannel, ER_PDF_VIEWER_UA_ID, iconID_start_reading, nColumnAdvanceState );
+
         // scribble icons        
         updateScribbleIcons(doc);
         
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/src/PDFApp.cpp ipdf-new/src/PDFApp.cpp
--- ipdf-svn23-RJenhanced-070612.trunk/src/PDFApp.cpp	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/src/PDFApp.cpp	2007-08-31 14:35:51.000000000 +0200
@@ -74,6 +74,9 @@
 // by viewer and terminate handler
 void CPDFApp::quit(GBool bNormal)
 {
+    // update columnadvance setting from current toolbar
+    controller.settings.setColumnAdvance(controller.view->isColumnAdvanceEnable());
+
     // clear viewer 
     clear();
 
@@ -178,6 +181,9 @@
         // load settings
         loadSettings(fileName);
 
+	// setup columnadvance
+	controller.channels.initColumnAdvanceState(controller.settings.isColumnAdvanceEnable());
+
         // load scribble
         loadScribble(fileName, controller.settings.isScribbleEnabled());                
 
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/src/PDFLandscapeView.cpp ipdf-new/src/PDFLandscapeView.cpp
--- ipdf-svn23-RJenhanced-070612.trunk/src/PDFLandscapeView.cpp	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/src/PDFLandscapeView.cpp	2007-08-31 20:18:31.000000000 +0200
@@ -142,7 +142,14 @@
         getPageScreenPosition(pn, x, y);
         view->ctrl->scbMgr.onErasePress(pn, view->ctrl, 
             x, y, ox, oy);
+        return FALSE;
+    }
+    else if (view->isColumnAdvanceEnable())
+    {
+	view->initColumnAdvance(x, y);
+	return FALSE;
     }
+
     return FALSE;
 }          
 
@@ -228,7 +235,7 @@
             view->zoomRect.top,
             view->zoomRect.right,
             view->zoomRect.bottom);
-
+        return FALSE;
     }	            
     else if (view->isZoomOutEnable())                    
     {
@@ -237,7 +244,24 @@
             view->zoomRect.top,
             view->zoomRect.right,
             view->zoomRect.bottom);
+        return FALSE;
+    }
+    else if (view->isColumnAdvanceEnable())
+    {
+	/* set y as column seperator */
+	view->ctrl->settings.setColumnWidth(
+	    ((view->colPt.y < y) ? (y - view->colPt.y) : (view->colPt.y - y)));
+	view->ctrl->gtkMgr.setLineColor(0);
+	view->ctrl->gtkMgr.setLineAttributes(4, 0);
+	view->ctrl->gtkMgr.drawLine(view->colPt.x - 100, y, view->colPt.x + 100, y);
+	view->ctrl->gtkMgr.drawLine(x - 100, y, x + 100, y);
+
+        XSync(view->ctrl->gtkMgr.display, gTrue);
+        view->refreshDeviceScreen(dmQFull, gFalse);
+
+	return FALSE;
     }
+
     return FALSE;
 }
 
@@ -764,7 +788,13 @@
 // 2. calcuate which page is current page (max area)
 void CPDFLandscapeView::getPagesRange(int & start, int & end, const int pageNumber, const ContinousModeScroll scroll)
 {
+    int dy = view->ctrl->settings.getScreenHeight();
+    int dx = view->ctrl->settings.getScreenWidth();
+    int sx = view->ctrl->settings.getScreenX();
+    int sy = view->ctrl->settings.getScreenY();
     rectangle rect;
+    int currentPage = view->ctrl->settings.getCurrentPage();
+
     if (scroll == ScrollToPage)
     {
         layout.getPageRect(pageNumber,rect);
@@ -774,8 +804,70 @@
         return;
     }
 
+    /* seek current working page */
+    layout.getPageRect(currentPage, rect);
+
     if (scroll == ScrollToNextPage)
     {
+	if (view->isColumnAdvanceEnable() &&
+            ((rect.right - rect.left) > dy))
+	{
+            dy = view->ctrl->settings.getColumnWidth();
+
+	    PV_LOGPRINTF("CAL1: start=%d, end=%d, pn=%d, pagerect=[%d-%d,%d-%d], x,y,dx,dy=%d,%d,%d,%d",
+			 start, end, currentPage, rect.left, rect.top, rect.right, rect.bottom,
+			 sx, sy, dx, dy);
+
+	    if ((sx + dx) >= rect.bottom)
+	    {
+		/* can we advance a column ? */
+		PV_LOGPRINTF("CAL2: next page is in view");
+
+		if ((sy + dy + dy - ColumnMargin) <= rect.right)
+		{
+		    /* advance one column */
+		    PV_LOGPRINTF("CAL2: advance to next column, top");
+
+		    sx = rect.top;
+		    sy += dy;
+		}
+		else
+		{
+		    /* no; at end of column, set to first column next page */
+		    PV_LOGPRINTF("CAL2: advance to first column, next page");
+
+		    layout.getPageRect(++currentPage, rect);
+		    sx = rect.top;
+		    while ((sy + dy) > view->ctrl->settings.getScreenWidth()) sy -= dy;
+                    if (sy < rect.left) sy = rect.left;
+		}
+	    }
+	    else
+	    {
+		PV_LOGPRINTF("CAL2: advance down");
+		/* have not shown total page yet, move down */
+		sx += (dx - PageRepeat);
+	    }
+
+	    if ((sx + dx) > rect.bottom) sx = rect.bottom - dx;
+	    view->ctrl->settings.setScreenX(sx);
+	    if ((sy + dy) > rect.right) sy = rect.right - dy;
+	    view->ctrl->settings.setScreenY(sy);
+
+	    validatePosition();
+	    view->ctrl->settings.getScreenRect(rect);
+	    view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
+
+	    /* debug */
+	    layout.getPageRect(view->ctrl->settings.getCurrentPage(), rect);
+	    PV_LOGPRINTF("CAL3: pagerect=[%d-%d,%d-%d], x,y,dx,dy=%d,%d,%d,%d",
+			 rect.left, rect.top, rect.right, rect.bottom,
+			 sx, sy, dx, dy);
+
+	    return;
+	}
+
+	/* column advance not enabled */
         view->ctrl->settings.moveScreenX(view->ctrl->settings.getScreenWidth() - PageRepeat);
         validatePosition();     
         view->ctrl->settings.getScreenRect(rect);
@@ -785,6 +877,64 @@
 
     if (scroll == ScrollToPrevPage)
     {
+	if (view->isColumnAdvanceEnable() &&
+             ((rect.right - rect.left) > dy))
+	{
+            dy = view->ctrl->settings.getColumnWidth();
+
+	    PV_LOGPRINTF("CAL1: start=%d, end=%d, pn=%d, pagerect=[%d-%d,%d-%d], x,y,dx,dy=%d,%d,%d,%d",
+			 start, end, currentPage, rect.left, rect.top, rect.right, rect.bottom,
+			 sx, sy, dx, dy);
+
+	    if ((sx - PageRepeat) <= rect.top)
+	    {
+		/* can we retreat a column ? */
+		PV_LOGPRINTF("CAL2: prev page is in view");
+
+		if ((sy - dy + ColumnMargin) >= rect.left)
+		{
+		    /* retreat one column */
+		    PV_LOGPRINTF("CAL2: retreat to prev column, bottom");
+
+		    sx = rect.bottom - dx;
+		    sy -= dy;
+		}
+		else
+		{
+		    /* no; at first column, set to last column prev page */
+		    PV_LOGPRINTF("CAL2: retreat to last column, prev page");
+
+		    layout.getPageRect(--currentPage, rect);
+		    sx = rect.bottom - dx;
+		    while ((sy + dy + dy) < rect.right) sy += dy;
+		}
+	    }
+	    else
+	    {
+		/* have not shown total page yet, move up */
+		PV_LOGPRINTF("CAL2: retreat up");
+		sx -= (dx - PageRepeat);
+	    }
+
+	    if (sx < rect.top) sx = rect.top;
+	    view->ctrl->settings.setScreenX(sx);
+	    if (sy < rect.left) sy = rect.left;
+	    view->ctrl->settings.setScreenY(sy);
+
+	    validatePosition();
+	    view->ctrl->settings.getScreenRect(rect);
+	    view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
+
+	    /* debug */
+	    layout.getPageRect(view->ctrl->settings.getCurrentPage(), rect);
+	    PV_LOGPRINTF("CAL3: pagerect=[%d-%d,%d-%d], x,y,dx,dy=%d,%d,%d,%d",
+			 rect.left, rect.top, rect.right, rect.bottom,
+			 sx, sy, dx, dy);
+
+	    return;
+	}
+
+	/* column advance not enabled */
         view->ctrl->settings.moveScreenX(PageRepeat - view->ctrl->settings.getScreenWidth());
         validatePosition();     
         view->ctrl->settings.getScreenRect(rect);
@@ -814,7 +964,7 @@
     
     if (scroll == ScrollToNextPages)
     {
-        view->ctrl->settings.moveScreenX(view->ctrl->settings.getScreenWidth() * JumpWidth);
+	view->ctrl->settings.moveScreenX(dx * JumpWidth);
         validatePosition();     
         view->ctrl->settings.getScreenRect(rect);
         view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect)); 
@@ -823,14 +973,13 @@
 
     if (scroll == ScrollToPrevPages)
     {
-        view->ctrl->settings.moveScreenX(- JumpWidth * view->ctrl->settings.getScreenWidth());
+	view->ctrl->settings.moveScreenX(- JumpWidth * dx);
         validatePosition();     
         view->ctrl->settings.getScreenRect(rect);
         view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect)); 
         return;
     }
     
-    
     if (scroll == ScrollRedraw)
     {
         start = nStart; end = nEnd;
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/src/PDFPortraitView.cpp ipdf-new/src/PDFPortraitView.cpp
--- ipdf-svn23-RJenhanced-070612.trunk/src/PDFPortraitView.cpp	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/src/PDFPortraitView.cpp	2007-08-31 20:18:10.000000000 +0200
@@ -149,6 +149,12 @@
         }
         view->ctrl->scbMgr.onErasePress(pn, view->ctrl, 
                     x, y, ox, oy);
+	return FALSE;
+    }
+    else if (view->isColumnAdvanceEnable())
+    {
+	view->initColumnAdvance(x, y);
+	return FALSE;
     }          
     
     return FALSE;
@@ -246,7 +252,7 @@
             view->zoomRect.top,
             view->zoomRect.right,
             view->zoomRect.bottom);
-
+	return FALSE;
     }	            
     else if (view->isZoomOutEnable())                    
     {
@@ -255,6 +261,23 @@
             view->zoomRect.top,
             view->zoomRect.right,
             view->zoomRect.bottom);
+
+	return FALSE;
+    }
+    else if (view->isColumnAdvanceEnable())
+    {
+	/* set x as column seperator */
+	view->ctrl->settings.setColumnWidth(
+	    ((view->colPt.x < x) ? (x - view->colPt.x) : (view->colPt.x - x)));
+	view->ctrl->gtkMgr.setLineColor(0);
+	view->ctrl->gtkMgr.setLineAttributes(4, 0);
+	view->ctrl->gtkMgr.drawLine(view->colPt.x, y - 100, view->colPt.x, y + 100);
+	view->ctrl->gtkMgr.drawLine(x, y - 100, x, y + 100);
+
+        XSync(view->ctrl->gtkMgr.display, gTrue);
+        view->refreshDeviceScreen(dmQFull, gFalse);
+
+	return FALSE;
     }
     return FALSE;
 }
@@ -332,6 +355,9 @@
 	    view->ctrl->settings.setPenAttributes(doc->context.curStrokeStyle.attributes);
 	}
 
+        // and column advance state
+        view->ctrl->settings.setColumnAdvance(view->ctrl->channels.isColumnAdvanceEnable());
+
         view->quit();
         break;  
     case GDK_Page_Up:
@@ -781,19 +807,92 @@
 // 2. calcuate which page is current page (max area)
 void CPDFPortraitView::getPagesRange(int & start, int & end, const int pageNumber, const ContinousModeScroll scroll)
 {
+    int dy = view->ctrl->settings.getScreenHeight();
+    int dx = view->ctrl->settings.getScreenWidth();
+    int sx = view->ctrl->settings.getScreenX();
+    int sy = view->ctrl->settings.getScreenY();
     rectangle rect;
+    int currentPage = view->ctrl->settings.getCurrentPage();
+
+    /* ensure that column adjustment is set to a sensible default */
+    if (dx <= 0) {
+        dx = view->ctrl->settings.getScreenWidth();
+    }
+
     if (scroll == ScrollToPage)
     {
         layout.getPageRect(pageNumber,rect);
-        rect.bottom = rect.top + view->ctrl->settings.getScreenHeight();
+	rect.bottom = rect.top + dy;
         view->ctrl->settings.setScreenY(rect.top);
         view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
         return;
     }
 
+    /* seek current working page */
+    layout.getPageRect(currentPage, rect);
+
     if (scroll == ScrollToNextPage)
     {
-        view->ctrl->settings.moveScreenY(view->ctrl->settings.getScreenHeight() - PageRepeat);
+	if (view->isColumnAdvanceEnable() &&
+             ((rect.right - rect.left) > dx))
+	{
+            dx = view->ctrl->settings.getColumnWidth();
+
+	    PV_LOGPRINTF("CAP1: start=%d, end=%d, pn=%d, pagerect=[%d-%d,%d-%d], x,y,dx,dy=%d,%d,%d,%d",
+			 start, end, currentPage, rect.left, rect.top, rect.right, rect.bottom,
+			 sx, sy, dx, dy);
+
+	    if ((sy + dy) >= rect.bottom)
+	    {
+		/* can we advance a column ? */
+		PV_LOGPRINTF("CAP2: next page is in view");
+
+		if ((sx + dx + dx - ColumnMargin) <= rect.right)
+		{
+		    /* advance one column */
+		    PV_LOGPRINTF("CAP2: advance to next column, top");
+
+                    sy = rect.top;
+                    sx += dx;
+		}
+		else
+		{
+		    /* no; at end of column, set to first column next page */
+		    PV_LOGPRINTF("CAP2: advance to first column, next page");
+		    layout.getPageRect(++currentPage, rect);
+                    sy = rect.top;
+		    while ((sx + dx) > view->ctrl->settings.getScreenWidth()) sx -= dx;
+                    if (sx < rect.left) sx = rect.left;
+		}
+	    }
+	    else
+	    {
+		/* have not shown total page yet, move down */
+		PV_LOGPRINTF("CAP2: advance down");
+
+                sy += (dy - PageRepeat);
+	    }
+
+            if ((sy + dy) > rect.bottom) sy = rect.bottom - dy;
+            view->ctrl->settings.setScreenY(sy);
+            if ((sx + dx) > rect.right) sx = rect.right - dx;
+            view->ctrl->settings.setScreenX(sx);
+
+	    validatePosition();
+	    view->ctrl->settings.getScreenRect(rect);
+	    view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
+
+	    /* debug */
+	    layout.getPageRect(view->ctrl->settings.getCurrentPage(), rect);
+	    PV_LOGPRINTF("CAP3: pagerect=[%d-%d,%d-%d], x,y,dx,dy=%d,%d,%d,%d",
+			 rect.left, rect.top, rect.right, rect.bottom,
+			 sx, sy, dx, dy);
+
+	    return;
+	}
+
+	/* column advance not enabled */
+	view->ctrl->settings.moveScreenY(dy - PageRepeat);
         validatePosition();     
         view->ctrl->settings.getScreenRect(rect);
         view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect)); 
@@ -802,7 +901,66 @@
 
     if (scroll == ScrollToPrevPage)
     {
-        view->ctrl->settings.moveScreenY(PageRepeat - view->ctrl->settings.getScreenHeight());
+	if (view->isColumnAdvanceEnable() &&
+            ((rect.right - rect.left) > dx))
+	{
+            dx = view->ctrl->settings.getColumnWidth();
+
+	    PV_LOGPRINTF("CAP1: start=%d, end=%d, pn=%d, pagerect=[%d-%d,%d-%d], x,y,dx,dy=%d,%d,%d,%d",
+			 start, end, currentPage, rect.left, rect.top, rect.right, rect.bottom,
+			 sx, sy, dx, dy);
+
+	    if ((sy - PageRepeat) <= rect.top)
+	    {
+		/* can we retreat a column ? */
+		PV_LOGPRINTF("CAP2: prev page is in view");
+
+		if ((sx - dx + ColumnMargin) >= rect.left)
+		{
+		    /* retreat one column */
+		    PV_LOGPRINTF("CAP2: retreat to prev column, bottom");
+
+		    sy = rect.bottom - dy;
+		    sx -= dx;
+		}
+		else
+		{
+		    /* no; at first column, set to last column prev page */
+		    PV_LOGPRINTF("CAP2: retreat to last column, prev page");
+
+		    layout.getPageRect(--currentPage, rect);
+                    sy = rect.bottom - dy;
+		    while ((sx + dx + dx) < rect.right) sx += dx;
+		}
+	    }
+	    else
+	    {
+		/* have not shown total page yet, move up */
+		PV_LOGPRINTF("CAP2: retreat up");
+
+                sy -= (dy - PageRepeat);
+	    }
+
+            if (sy < rect.top) sy = rect.top;
+            view->ctrl->settings.setScreenY(sy);
+            if (sx < rect.left) sx = rect.left;
+            view->ctrl->settings.setScreenX(sx);
+
+	    validatePosition();
+	    view->ctrl->settings.getScreenRect(rect);
+	    view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
+
+            /* debug */
+	    layout.getPageRect(view->ctrl->settings.getCurrentPage(), rect);
+	    PV_LOGPRINTF("CAP3: pagerect=[%d-%d,%d-%d], x,y,dx,dy=%d,%d,%d,%d",
+			 rect.left, rect.top, rect.right, rect.bottom,
+			 sx, sy, dx, dy);
+
+	    return;
+	}
+
+        /* column advance not enabled */
+	view->ctrl->settings.moveScreenY(PageRepeat - dy);
         validatePosition();     
         view->ctrl->settings.getScreenRect(rect);
         view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect)); 
@@ -831,7 +989,7 @@
     
     if (scroll == ScrollToNextPages)
     {
-        view->ctrl->settings.moveScreenY(view->ctrl->settings.getScreenHeight() * JumpWidth);
+	view->ctrl->settings.moveScreenY(dy * JumpWidth);
         validatePosition();     
         view->ctrl->settings.getScreenRect(rect);
         view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect)); 
@@ -840,7 +998,7 @@
 
     if (scroll == ScrollToPrevPages)
     {
-        view->ctrl->settings.moveScreenY(- JumpWidth * view->ctrl->settings.getScreenHeight());
+	view->ctrl->settings.moveScreenY(- JumpWidth * dy);
         validatePosition();     
         view->ctrl->settings.getScreenRect(rect);
         view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect)); 
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/src/PDFView.cpp ipdf-new/src/PDFView.cpp
--- ipdf-svn23-RJenhanced-070612.trunk/src/PDFView.cpp	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/src/PDFView.cpp	2007-08-31 14:18:03.000000000 +0200
@@ -61,6 +61,7 @@
     // others
     panPt.x = panPt.y = 0;
     zoomRect.left = zoomRect.top = zoomRect.right = zoomRect.bottom = 0;
+    colPt.x = colPt.y = 0;
     portraitView.setView(this);
     landscapeView.setView(this);
     
@@ -121,6 +122,11 @@
     ctrl->scbMgr.close();
 }
 
+void CPDFView::initColumnAdvance(const int x, const int y)
+{
+    colPt.x = x; colPt.y = y;
+}
+
 void CPDFView::initPan(const int x, const int y)
 {
     panPt.x = x; panPt.y = y;
@@ -218,6 +224,17 @@
     return (ctrl->settings.getMode() & ModeContinous);
 }
 
+GBool CPDFView::isColumnAdvanceEnable()
+{
+    // read current value from toolbar and store it in settings
+    // for settings save in manifest
+    if (ctrl->channels.isColumnAdvanceInit())
+    {
+        ctrl->settings.setColumnAdvance(ctrl->channels.isColumnAdvanceEnable());
+    }
+    return ctrl->settings.isColumnAdvanceEnable();
+}
+
 void CPDFView::setPageMode()
 {
     ctrl->settings.setMode(ModePage);
diff -bBurdw ipdf-svn23-RJenhanced-070612.trunk/src/Settings.cpp ipdf-new/src/Settings.cpp
--- ipdf-svn23-RJenhanced-070612.trunk/src/Settings.cpp	2007-06-12 23:17:49.000000000 +0200
+++ ipdf-new/src/Settings.cpp	2007-08-31 13:41:37.000000000 +0200
@@ -44,6 +44,7 @@
     penSize = penColor = penLineStyle = penAttributes = -1;
 
     enableScb = gTrue;
+    enableColumnAdvance = gFalse;
 }
 
 CSettings::~CSettings(void)
@@ -138,6 +139,9 @@
         }
         
         // rotation , position and mode
+	int c;
+	ermXmlGetInt(&manifest, "/package/viewer-settings/columnwidth", &c);
+	setColumnWidth(c);
         ermXmlGetInt(&manifest, "/package/viewer-settings/rotation", &rotate);
         ermXmlGetInt(&manifest, "/package/viewer-settings/positionx", &screenX);
         ermXmlGetInt(&manifest, "/package/viewer-settings/positiony", &screenY);
@@ -154,6 +158,14 @@
             mode = ModePage;
         }
 
+	// Check column advance mode
+	ermXmlGetString(&manifest, "/package/viewer-settings/columnadvance", tmp, MAX);
+
+	if (0 == strncmp(tmp, "true", MAX) != 0)
+	{
+	    enableColumnAdvance = gTrue;
+	}
+
 	// Load pen style
 	if (RET_OK == ermXmlExist(&manifest, "/package/pen-settings/size")) 
 	{
@@ -226,6 +238,12 @@
             ermXmlSetString(&manifest, "/package/viewer-settings/zoomfactor", tmp);                    
         }
         
+	if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/columnwidth"))
+	{
+	    ermXmlNewString(&manifest, "/package/viewer-settings", "columnwidth", "");
+	}
+	ermXmlSetInt(&manifest, "/package/viewer-settings/columnwidth", getColumnWidth());
+
         // rotation
         if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/rotation"))
         {
@@ -261,6 +279,13 @@
             ermXmlSetString(&manifest, "/package/viewer-settings/mode", "page");
         }
 
+	// columnadvance
+	if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/columnadvance"))
+	{
+	    ermXmlNewString(&manifest, "/package/viewer-settings", "columnadvance", "");
+	}
+        ermXmlSetString(&manifest, "/package/viewer-settings/columnadvance", (enableColumnAdvance ? "true" : "false"));
+
         // fullscreen
         if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/modefullscreen"))
         {

