Index: scribus/pagepalette.cpp
===================================================================
--- scribus/pagepalette.cpp	(révision 16614)
+++ scribus/pagepalette.cpp	(copie de travail)
@@ -643,8 +643,8 @@
 	{
 		bool oldMPMode = currView->Doc->masterPageMode();
 		int  storedPageNum = currView->Doc->currentPageNumber();
-		int  storedViewXCoor = currView->horizontalScrollBar()->value();
-		int  storedViewYCoor = currView->verticalScrollBar()->value();
+		int  storedViewXCoor = currView->viewportPos().x();
+		int  storedViewYCoor = currView->viewportPos().y();
 
 		currView->Doc->setMasterPageMode(true);
 		currView->Doc->scMW()->DeletePage2(currView->Doc->MasterNames[tmp]);
Index: scribus/canvasgesture_rulermove.cpp
===================================================================
--- scribus/canvasgesture_rulermove.cpp	(révision 16614)
+++ scribus/canvasgesture_rulermove.cpp	(copie de travail)
@@ -159,7 +159,7 @@
 {
 	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
 	const int page = m_doc->OnPage(mousePointDoc.x(), mousePointDoc.y());
-	QRect viewport(m_view->viewport()->mapToGlobal(QPoint(0,0)), QSize(m_view->visibleWidth(), m_view->visibleHeight()));
+	QRect viewport(m_view->widget()->mapToGlobal(QPoint(0,0)), QSize(m_view->visibleWidth(), m_view->visibleHeight()));
 	QPoint newMousePoint = m->globalPos() - (m_canvas->mapToParent(QPoint(0, 0)) + m_canvas->parentWidget()->mapToGlobal(QPoint(0, 0)));
 	switch (m_mode)
 	{
Index: scribus/scribusview.h
===================================================================
--- scribus/scribusview.h	(révision 16614)
+++ scribus/scribusview.h	(copie de travail)
@@ -56,6 +56,8 @@
 #include <QWheelEvent>
 #include <QRubberBand>
 #include <QList>
+#include <QScrollBar>
+#include <QGridLayout>
 
 class QEvent;
 class QMimeData;
@@ -81,11 +83,42 @@
 class TransactionSettings;
 
 
+class SCRIBUS_API ScribusViewWidget : public QWidget
+{
+	Q_OBJECT
+
+	QGridLayout * viewLayout;
+	Canvas * canvas;
+	QSizeF canvasSize;
+	QScrollBar * m_verticalScrollBar;
+	QScrollBar * m_horizontalScrollBar;
+
+public:
+	ScribusViewWidget(QWidget * parent);
+	~ScribusViewWidget();
+
+	QScrollBar * verticalScrollBar() const{return m_verticalScrollBar;}
+	QScrollBar * horizontalScrollBar() const{return m_horizontalScrollBar;}
+
+	void setWidget(Canvas * c);
+	Canvas * widget() const;
+
+	void ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50);
+	QPoint viewportPos() const;
+
+protected:
+	void scrollContentsBy ( int dx, int dy );
+
+private slots:
+	void viewportPosChange(int);
+
+};
+
 /**
  * This class provides an incomplete base for your application view.
  */
 
-class SCRIBUS_API ScribusView : public QScrollArea, public Observer<QRectF>
+class SCRIBUS_API ScribusView : public ScribusViewWidget, public Observer<QRectF>
 {
 	Q_OBJECT
 
@@ -257,8 +290,8 @@
 	int contentsWidth();
 	int contentsHeight();
 	void setContentsPos(int x, int y);
-	int visibleWidth() { return viewport()->size().width(); } ;
-	int visibleHeight() { return viewport()->size().height(); } ;
+	int visibleWidth() ;
+	int visibleHeight();
 	void stopAllDrags();
 	void scrollBy(int x, int y);
 	void zoom(double scale = 0.0);
Index: scribus/scribusview.cpp
===================================================================
--- scribus/scribusview.cpp	(révision 16614)
+++ scribus/scribusview.cpp	(copie de travail)
@@ -129,9 +129,68 @@
 using namespace std;
 
 
+ScribusViewWidget::ScribusViewWidget(QWidget *parent):
+		QWidget(parent),
+		canvas(0)
+{
+	m_verticalScrollBar = new QScrollBar(Qt::Vertical, this);
+	m_horizontalScrollBar = new QScrollBar(Qt::Horizontal, this);
+	viewLayout = new QGridLayout(this);
 
+	viewLayout->addWidget(m_verticalScrollBar, 0, 1);
+	viewLayout->addWidget(m_horizontalScrollBar, 1,0);
+
+	connect(m_horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(viewportPosChange(int)));
+	connect(m_verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(viewportPosChange(int)));
+}
+
+ScribusViewWidget::~ScribusViewWidget()
+{
+
+}
+
+void ScribusViewWidget::setWidget(Canvas *c)
+{
+	canvas = c;
+	viewLayout->addWidget(canvas, 0,0);
+}
+
+Canvas * ScribusViewWidget::widget() const
+{
+	return canvas;
+}
+
+void ScribusViewWidget::ensureVisible(int x, int y, int xmargin, int ymargin)
+{
+	m_horizontalScrollBar->setValue(x - xmargin);
+	m_verticalScrollBar->setValue(y - ymargin);
+}
+
+QPoint ScribusViewWidget::viewportPos() const
+{
+	return QPoint(m_horizontalScrollBar->value(), m_verticalScrollBar->value());
+}
+
+
+void ScribusViewWidget::scrollContentsBy(int dx, int dy)
+{
+	if(dx != 0)
+		m_horizontalScrollBar->setValue(m_horizontalScrollBar->value() + dx);
+	if(dy != 0)
+		m_verticalScrollBar->setValue(m_verticalScrollBar->value() + dy);
+}
+
+void ScribusViewWidget::viewportPosChange(int)
+{
+	QRect uRect(m_horizontalScrollBar->value(), m_verticalScrollBar->value(),
+		    width(), height());
+	canvas->update(uRect);
+}
+
+
+
 ScribusView::ScribusView(QWidget* win, ScribusMainWindow* mw, ScribusDoc *doc) :
-	QScrollArea(win),
+	ScribusViewWidget(win),
 	Doc(doc),
 	m_canvas(new Canvas(doc, this)),
 	Prefs(&(PrefsManager::instance()->appPrefs)),
@@ -161,15 +220,15 @@
 	setObjectName("s");
 	setAttribute(Qt::WA_StaticContents);
 	setAttribute(Qt::WA_InputMethodEnabled, true);
-	setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
-	setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
-	setViewportMargins(m_vhRulerHW, m_vhRulerHW, 0, 0);
-	setWidgetResizable(false);
+//	setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+//	setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+//	setViewportMargins(m_vhRulerHW, m_vhRulerHW, 0, 0);
+//	setWidgetResizable(false);
 	m_canvasMode = CanvasMode::createForAppMode(this, Doc->appMode);
 	setWidget(m_canvas);
 	//already done by QScrollArea: widget()->installEventFilter(this);
 	installEventFilter(this); // FIXME:av
-//	viewport()->setBackgroundMode(Qt::PaletteBackground);
+//	widget()->setBackgroundMode(Qt::PaletteBackground);
 	setFocusPolicy(Qt::ClickFocus);
 	QFont fo = QFont(font());
 	// #8058: Better not use too small font size on Windows
@@ -456,16 +515,16 @@
 	if (!re.isValid() && // dont check this all the time
 		( m_oldCanvasWidth != newCanvasWidth || m_oldCanvasHeight != newCanvasHeight))
 	{
-		QSize maxViewport = maximumViewportSize();
+//		QSize maxViewport = maximumViewportSize();
 		horizontalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.x() * scale),
-										qRound(Doc->maxCanvasCoordinate.x() * scale) - maxViewport.width());
+										qRound(Doc->maxCanvasCoordinate.x() * scale)/* - maxViewport.width()*/);
 		verticalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.y() * scale),
-									  qRound(Doc->maxCanvasCoordinate.y() * scale) - maxViewport.height());
+									  qRound(Doc->maxCanvasCoordinate.y() * scale) /*- maxViewport.height()*/);
 		/*	qDebug() << "adjustCanvas [" << m_oldCanvasWidth << m_oldCanvasHeight << " ] -> [" << newCanvasWidth << newCanvasHeight 
 				<< "] (" << Doc->minCanvasCoordinate.x() << Doc->minCanvasCoordinate.y() << ") - ("
 				<< Doc->maxCanvasCoordinate.x() << Doc->maxCanvasCoordinate.y() << ") @" << scale << maxViewport;
 		*/
-		widget()->resize(newCanvasWidth, newCanvasHeight);
+//		widget()->resize(newCanvasWidth, newCanvasHeight);
 		m_oldCanvasWidth = newCanvasWidth;
 		m_oldCanvasHeight = newCanvasHeight;
 	}
@@ -637,7 +696,7 @@
 		evSpon = true;
 	#endif
 	QScrollArea::paintEvent(p);
-//	QPainter qp(viewport());
+//	QPainter qp(widget());
 //	drawContents(&qp, p->rect().x(), p->rect().y(), p->rect().width(), p->rect().height());
 }
 */
@@ -773,7 +832,7 @@
 			DraggedGroup = true;
 			DraggedGroupFirst = true;
 			getDragRectScreen(&gx, &gy, &gw, &gh);
-//			QPoint evP = viewport()->mapToGlobal(e->pos());
+//			QPoint evP = widget()->mapToGlobal(e->pos());
 //			evP -= QPoint(contentsX(), contentsY());
 //			redrawMarker->setGeometry(QRect(evP.x() + 1, evP.y() + 1, qRound(gw), qRound(gh)).normalized());
 //			if (!redrawMarker->isVisible())
@@ -800,7 +859,7 @@
 			dragX = dragPosDoc.x(); //e->pos().x() / m_canvas->scale();
 			dragY = dragPosDoc.y(); //e->pos().y() / m_canvas->scale();
 //			getDragRectScreen(&gx, &gy, &gw, &gh);
-//			QPoint evP = viewport()->mapToGlobal(e->pos());
+//			QPoint evP = widget()->mapToGlobal(e->pos());
 //			evP -= QPoint(contentsX(), contentsY());
 //			redrawMarker->setGeometry(QRect(evP.x() + 2, evP.y() + 2, qRound(gw - 2), qRound(gh - 2)).normalized());
 //			if (!redrawMarker->isVisible())
@@ -2314,7 +2373,7 @@
 void ScribusView::resizeEvent ( QResizeEvent * event )
 {
 // 	qDebug() << "ScribusView::resizeEvent";
-	QScrollArea::resizeEvent(event);
+	ScribusViewWidget::resizeEvent(event);
 	horizRuler->setGeometry(m_vhRulerHW, 1, width()-m_vhRulerHW-1, m_vhRulerHW);
 	vertRuler->setGeometry(1, m_vhRulerHW, m_vhRulerHW, height()-m_vhRulerHW-1);
 	rulerMover->setGeometry(1, 1, m_vhRulerHW, m_vhRulerHW);
@@ -2527,7 +2586,7 @@
 {
 	updateOn = on;
 	setUpdatesEnabled(on);
-	viewport()->setUpdatesEnabled(on);
+	widget()->setUpdatesEnabled(on);
 }
 
 
@@ -2573,12 +2632,12 @@
 		}
 		// enlarge the rectangle when rounding to int:
 		m_canvas->update(static_cast<int>(x), static_cast<int>(y),
-						 qMin(qRound(h + 0.5), viewport()->width()),
-						 qMin(qRound(w + 0.5), viewport()->height()));
+						 qMin(qRound(h + 0.5), widget()->width()),
+						 qMin(qRound(w + 0.5), widget()->height()));
 */	}
 	else
 	{
-		m_canvas->update(horizontalScrollBar()->value(), verticalScrollBar()->value(), viewport()->width(), viewport()->height());
+		m_canvas->update(horizontalScrollBar()->value(), verticalScrollBar()->value(), widget()->width(), widget()->height());
 	}
 }
 
@@ -2592,11 +2651,11 @@
 	horizontalScrollBar()->setValue(qRound(x * scale));
 	verticalScrollBar()->setValue(qRound(y * scale));
 	// fix ranges
-	QSize maxViewport = maximumViewportSize();
+//	QSize maxViewport = maximumViewportSize();
 	horizontalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.x() * scale),
-									qRound(Doc->maxCanvasCoordinate.x() * scale) - maxViewport.width());
+									qRound(Doc->maxCanvasCoordinate.x() * scale) /*- maxViewport.width()*/);
 	verticalScrollBar()->setRange(qRound(Doc->minCanvasCoordinate.y() * scale),
-								  qRound(Doc->maxCanvasCoordinate.y() * scale) - maxViewport.height());
+								  qRound(Doc->maxCanvasCoordinate.y() * scale) /*- maxViewport.height()*/);
 }
 
 
@@ -2606,8 +2665,8 @@
 void ScribusView::setCanvasCenter(double x, double y)
 {
 	double scale = m_canvas->scale();
-	setCanvasOrigin(x - viewport()->width() / scale,
-					y - viewport()->height() / scale);
+	setCanvasOrigin(x - widget()->width() / scale,
+					y - widget()->height() / scale);
 }
 
 /*!
@@ -2640,8 +2699,8 @@
 	double scale = m_canvas->scale();
 	return QRectF(horizontalScrollBar()->value() / scale,
 				  verticalScrollBar()->value() / scale,
-				  viewport()->width() / scale,
-				  viewport()->height() / scale);
+				  widget()->width() / scale,
+				  widget()->height() / scale);
 }
 
 
@@ -2811,7 +2870,7 @@
 	if (m_ScMW->scriptIsRunning())
 		return;
 	QPoint nx = m_canvas->canvasToLocal(FPoint(x, y));
-	QSize viewsize = viewport()->size();
+	QSize viewsize = widget()->size();
 //	qDebug() << "setCCPo" << nx << viewsize;
 	setContentsPos(nx.x() - viewsize.width() / 2, nx.y() - viewsize.height() / 2);
 }
@@ -3132,7 +3191,7 @@
 #if 0
 void ScribusView::rulerMove(QMouseEvent *m)
 {
-	QPoint py(viewport()->mapFromGlobal(m->globalPos()));
+	QPoint py(widget()->mapFromGlobal(m->globalPos()));
 	int newY = py.y();
 	int newX = py.x();
 	QPoint out = viewportToContents(py);
@@ -3148,7 +3207,7 @@
 
 void ScribusView::setNewRulerOrigin(QMouseEvent *m)
 {
-	QPoint py = viewport()->mapFromGlobal(m->globalPos());
+	QPoint py = widget()->mapFromGlobal(m->globalPos());
 	Doc->rulerXoffset = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x();
 	Doc->rulerYoffset = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y();
 	if (Doc->guidesSettings.rulerMode)
@@ -3176,7 +3235,7 @@
 #if 0
 void ScribusView::FromHRuler(QMouseEvent *m)
 {
-	QPoint py = viewport()->mapFromGlobal(m->globalPos());
+	QPoint py = widget()->mapFromGlobal(m->globalPos());
 	int newY = py.y();
 	QPoint out = viewportToContents(py);
 	emit MousePos((py.x() + contentsX())/m_canvas->scale(), (py.y() + 2 + contentsY())/m_canvas->scale());
@@ -3185,7 +3244,7 @@
 	if (!redrawMarker->isVisible())
 		redrawMarker->show();
 	if (QRect(0, 0, visibleWidth(), visibleHeight()).contains(py))
-		redrawMarker->setGeometry(QRect(viewport()->mapToGlobal(QPoint(0, 0)).x(), m->globalPos().y(), visibleWidth(), 1));
+		redrawMarker->setGeometry(QRect(widget()->mapToGlobal(QPoint(0, 0)).x(), m->globalPos().y(), visibleWidth(), 1));
 	DrHY = newY;
 	double newXp = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x();
 	double newYp = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y();
@@ -3198,7 +3257,7 @@
 
 void ScribusView::FromVRuler(QMouseEvent *m)
 {
-	QPoint py = viewport()->mapFromGlobal(m->globalPos());
+	QPoint py = widget()->mapFromGlobal(m->globalPos());
 	int newY = py.x();
 	QPoint out = viewportToContents(py);
 	emit MousePos((py.x() + 2 + contentsX())/m_canvas->scale(), (py.y() + contentsY())/m_canvas->scale());
@@ -3207,7 +3266,7 @@
 	if (!redrawMarker->isVisible())
 		redrawMarker->show();
 	if (QRect(0, 0, visibleWidth(), visibleHeight()).contains(py))
-		redrawMarker->setGeometry(QRect(m->globalPos().x(), viewport()->mapToGlobal(QPoint(0, 0)).y(), 1, visibleHeight()));
+		redrawMarker->setGeometry(QRect(m->globalPos().x(), widget()->mapToGlobal(QPoint(0, 0)).y(), 1, visibleHeight()));
 	DrVX = newY;
 	double newXp = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x();
 	double newYp = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y();
@@ -3223,7 +3282,7 @@
 // TODO: PV - guides refactoring
 void ScribusView::SetYGuide(QMouseEvent *m, int oldIndex)
 {
-	QPoint py = viewport()->mapFromGlobal(m->globalPos());
+	QPoint py = widget()->mapFromGlobal(m->globalPos());
 	double newX = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x();
 	double newY = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y();
 	int pg = Doc->OnPage(newX, newY);
@@ -3286,7 +3345,7 @@
 
 void ScribusView::SetXGuide(QMouseEvent *m, int oldIndex)
 {
-	QPoint py = viewport()->mapFromGlobal(m->globalPos());
+	QPoint py = widget()->mapFromGlobal(m->globalPos());
 	double newX = (py.x() + contentsX()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.x();
 	double newY = (py.y() + contentsY()) / m_canvas->scale() + 0*Doc->minCanvasCoordinate.y();
 	int pg = Doc->OnPage(newX, newY);
@@ -4720,7 +4779,7 @@
 	horizRuler->setShown(isShown);
 	rulerMover->setShown(isShown);
 	int newTopLeftMargin = isShown ? m_vhRulerHW : 0;
-	setViewportMargins(newTopLeftMargin, newTopLeftMargin, 0, 0);
+//	setViewportMargins(newTopLeftMargin, newTopLeftMargin, 0, 0);
 }
 
 void ScribusView::slotUpdateContents()  // deprecated
@@ -4840,7 +4899,7 @@
 	// hruler events
 	// vruler events
 
-	return QScrollArea::eventFilter(obj, event);
+	return ScribusViewWidget::eventFilter(obj, event);
 }
 
 //Legacy
@@ -4876,12 +4935,12 @@
 
 QPoint ScribusView::contentsToViewport(QPoint p) // deprecated
 {
-	return p + viewport()->pos();
+	return p + widget()->pos();
 }
 
 QPoint ScribusView::viewportToContents(QPoint p) // deprecated
 {
-	return p - viewport()->pos();
+	return p - widget()->pos();
 }
 
 int ScribusView::contentsX() // deprecated
@@ -4913,10 +4972,19 @@
 	setRulerPos(contentsX(), contentsY());
 }
 
+int ScribusView::visibleWidth()
+{
+	return widget()->size().width();
+}
 
+int ScribusView::visibleHeight()
+{
+	return widget()->size().height();
+}
+
 void ScribusView::scrollContentsBy(int dx, int dy)
 {
-	QScrollArea::scrollContentsBy (dx, dy);
+	scrollContentsBy (dx, dy);
 	setRulerPos(contentsX(), contentsY());
 }
 
@@ -4952,10 +5020,10 @@
 	int nh = qMax(qRound((Doc->maxCanvasCoordinate.y() - Doc->minCanvasCoordinate.y()) * m_canvas->scale()), visibleHeight());
 	resizeContents(nw, nh); // FIXME : should be avoided here, cause an unnecessary paintEvent despite updates disabled
 	if (preservePoint)
-		canvasPoint = viewport()->mapFromGlobal(globalPoint);
+		canvasPoint = widget()->mapFromGlobal(globalPoint);
 	else
 	{
-		QSize viewsize = viewport()->size();
+		QSize viewsize = widget()->size();
 		canvasPoint = QPoint(viewsize.width() / 2, viewsize.height() / 2);
 	}
 	setContentsPos(localPoint.x() - canvasPoint.x(), localPoint.y() - canvasPoint.y());
Index: scribus/pageitem_textframe.cpp
===================================================================
--- scribus/pageitem_textframe.cpp	(révision 16614)
+++ scribus/pageitem_textframe.cpp	(copie de travail)
@@ -1907,8 +1907,8 @@
 							}
 							else
 							{
-								--a;
-								--current.itemsInLine;
+								a = current.line.firstItem - 1;
+								current.itemsInLine = 0;
 							}
 						}
 						if (a >= 0)
Index: scribus/canvas.cpp
===================================================================
--- scribus/canvas.cpp	(révision 16614)
+++ scribus/canvas.cpp	(copie de travail)
@@ -585,7 +585,7 @@
 bool Canvas::adjustBuffer()
 {
 	bool ret = false;
-	QRect viewport(-x(), -y(), m_view->viewport()->width(), m_view->viewport()->height());
+	QRect viewport(-x(), -y(), m_view->widget()->width(), m_view->widget()->height());
 // 	qDebug()<<"Canvas::adjustBuffer"<<viewport<<m_viewMode.forceRedraw<<m_viewMode.operItemSelecting;
 	QPoint minCanvasCoordinate = canvasToLocal(QPointF(0.0, 0.0));
 	if (minCanvasCoordinate != m_oldMinCanvasCoordinate)
