/* This file is part of the KDE project
   Copyright (C) 2001-2005 David Faure <faure@kde.org>
   Copyright (C) 2005 Thomas Zander <zander@kde.org>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
*/

#include "KWViewMode.h"
#include "KWCanvas.h"
#include "KWView.h"
#include "KWDocument.h"
#include "KWTextFrameSet.h"
#include "KWFrameSet.h"
#include "KWTableFrameSet.h"
#include "KWPageManager.h"
#include "KWPage.h"
#include "KWFrameViewManager.h"
#include "KWFrameView.h"
#include <tqapplication.h>
#include <kdebug.h>

const unsigned short KWViewMode::s_shadowOffset = 3;

TQSize KWViewMode::availableSizeForText( KWTextFrameSet* textfs )
{
    KWFrame* frame = textfs->frameIterator().getLast();
    return m_doc->zoomSize( KoSize( frame->innerWidth(), frame->internalY() + frame->innerHeight() ) );

}

void KWViewMode::drawOnePageBorder( TQPainter * painter, const TQRect & crect, const TQRect & _pageRect,
                                    const TQRegion & emptySpaceRegion )
{
    if ( !crect.intersects( _pageRect ) )
        return;

    TQRect pageRect( _pageRect );
    //kdDebug() << "KWViewMode::drawOnePageBorder drawing page rect " << pageRect << endl;
    painter->drawRect( pageRect );
    // Exclude page border line, to get the page contents rect (avoids flicker)
    pageRect.rLeft() += 1;
    pageRect.rTop() += 1;
    pageRect.rRight() -= 1;
    pageRect.rBottom() -= 1;
    // The empty space to clear up inside this page
    TQRect pagecrect = pageRect.intersect( crect );
    if ( !pagecrect.isEmpty() )
    {
        //kdDebug() << "KWViewMode::drawOnePageBorder : pagecrect=" << pagecrect << " emptySpaceRegion: " << emptySpaceRegion << endl;
        TQRegion pageEmptyRegion = emptySpaceRegion.intersect( pagecrect );
        //kdDebug() << "RESULT: pageEmptyRegion: " << pageEmptyRegion << endl;
        if ( !pageEmptyRegion.isEmpty() )
            m_doc->eraseEmptySpace( painter, pageEmptyRegion, TQApplication::palette().active().brush( TQColorGroup::Base ) );
    }
}

TQRect KWViewMode::drawRightShadow( TQPainter * painter, const TQRect & crect, const TQRect & pageRect, int topOffset )
{
    TQRect shadowRect( pageRect.right() + 1, pageRect.top() + topOffset, s_shadowOffset, pageRect.height() - topOffset );
    shadowRect &= crect; // intersect
    if ( !shadowRect.isEmpty() )
    {
        painter->fillRect( shadowRect,
                           TQApplication::palette().active().brush( TQColorGroup::Shadow ) );
    }
    return shadowRect;
}

TQRect KWViewMode::drawBottomShadow( TQPainter * painter, const TQRect & crect, const TQRect & pageRect, int leftOffset )
{
    TQRect shadowRect( pageRect.left() + leftOffset, pageRect.bottom() + 1, pageRect.width(), s_shadowOffset );
    shadowRect &= crect; // intersect
    if ( !shadowRect.isEmpty() )
        painter->fillRect( shadowRect,
                           TQApplication::palette().active().brush( TQColorGroup::Shadow ) );
    return shadowRect;
}

TQPoint KWViewMode::pageCorner()
{
    // Same code as KWView::slotUpdateRuler
    KWFrame * frame = 0L;
    // Use the currently edited (fallback: the first selected) frame
    if( m_canvas->currentFrameSetEdit() && m_canvas->currentFrameSetEdit()->currentFrame() )
        frame = m_canvas->currentFrameSetEdit()->currentFrame();
    else {
        KWFrameView *view = m_canvas->frameViewManager()->selectedFrame();
        frame = view == 0 ? 0 : view->frame();
    }

    int pageNum = 0;
    if ( frame )
        pageNum = frame->pageNumber();
    TQPoint nPoint( 0, m_doc->pageTop(pageNum) + 1 );
    TQPoint cPoint( normalToView( nPoint ) );
    /*kdDebug() << "KWViewMode::pageCorner frame=" << frame << " pagenum=" << pageNum
              << " nPoint=" << nPoint.x() << "," << nPoint.y()
              << " cPoint=" << cPoint.x() << "," << cPoint.y() << endl;*/
    return cPoint;
}

TQRect KWViewMode::rulerFrameRect()
{
    // Set the "frame start" in the ruler (tabs are relative to that position)
    KWFrameSetEdit * edit = m_canvas->currentFrameSetEdit();
    KWFrame * frame = 0L;
    // Use the currently edited (fallback: the first selected) frame
    if ( edit && edit->currentFrame() )
        frame = edit->currentFrame();
    else {
        KWFrameView *view = m_canvas->frameViewManager()->selectedFrame();
        frame = view == 0 ? 0 : view->frame();
    }
    if( !frame) {
        KWFrameSet *fs= m_doc->frameSet(0);
        if(fs) frame=fs->frame(0);
    }
    if ( frame )
    {
        TQRect r = normalToView( m_doc->zoomRect( frame->innerRect() ) );

        // Calculate page corner (see pageCorner above)
        int pageNum = frame->pageNumber();
        TQPoint nPoint( 0, m_doc->pageTop(pageNum) + 1 );
        TQPoint cPoint( normalToView( nPoint ) );

        // Frame start/end is relative to page corner.
        r.moveBy( -cPoint.x(), -cPoint.y() );
        return r;
    }
    return TQRect();
}

void KWViewMode::setPageLayout( KoRuler* hRuler, KoRuler* vRuler, const KoPageLayout& layout )
{
    hRuler->setPageLayout( layout );
    vRuler->setPageLayout( layout );
}

// static
KWViewMode * KWViewMode::create( const TQString & viewModeType, KWDocument *doc, KWCanvas* canvas )
{
    Q_ASSERT(doc);
    if(viewModeType=="ModeNormal")
    {
        return new KWViewModeNormal( doc, canvas, doc->viewFrameBorders() );
    }
    else if(viewModeType=="ModeEmbedded")
    {
        return new KWViewModeEmbedded( doc, canvas );
    }
    else if(viewModeType=="ModePreview")
    {
        return new KWViewModePreview( doc, canvas, doc->viewFrameBorders(), doc->nbPagePerRow() );
    }
    else if(viewModeType=="ModeText")
    {
        KWTextFrameSet* fs = KWViewModeText::determineTextFrameSet( doc ); // could be 0
        return new KWViewModeText( doc, canvas, fs );
    }
    else
    {
        kdDebug() << viewModeType << " mode type is unknown\n";
        return 0;
    }
}

////

TQSize KWViewModeNormal::contentsSize()
{
    return TQSize( m_doc->paperWidth(m_doc->startPage()),
                  m_doc->zoomItY( m_doc->pageManager()->bottomOfPage(m_doc->lastPage()) ) );
}

TQRect KWViewModeNormal::viewPageRect( int pgNum )
{
    KWPage* page = m_doc->pageManager()->page( pgNum );
    TQRect r = page->zoomedRect( m_doc );
    r.moveBy( xOffset( page ), 0 );
    return r;
}

TQPoint KWViewModeNormal::normalToView( const TQPoint & nPoint )
{
    double unzoomedY = m_doc->unzoomItY( nPoint.y() );
    KWPage *page = m_doc->pageManager()->page(unzoomedY);   // quotient
    if( !page) {
        kdWarning(31001) << "KWViewModeNormal::normalToView request for conversion out of the document! Check your input data.. ("<< nPoint << ")" << endl;
        return TQPoint(0,0);
    }
    Q_ASSERT(canvas());
    return TQPoint( xOffset(page) + nPoint.x(), nPoint.y() );
}

TQPoint KWViewModeNormal::viewToNormal( const TQPoint & vPoint )
{
    // Opposite of the above
    // The Y is unchanged by the centering so we can use it to get the page.
    double unzoomedY = m_doc->unzoomItY( vPoint.y() );
    KWPage *page = m_doc->pageManager()->page(unzoomedY);   // quotient
    if( !page) {
        kdWarning(31001) << "KWViewModeNormal::normalToView request for conversion out of the document! Check your input data.. ("<< vPoint << ")" << endl;
        return TQPoint(-1,-1); // yes this is an ugly way to mark this as an excetional state...
    }
    Q_ASSERT(canvas());
    return TQPoint( vPoint.x() - xOffset(page), vPoint.y() );
}

int KWViewModeNormal::xOffset(KWPage *page, int canvasWidth /* = -1 */) {
    // Center horizontally
    if(canvasWidth < 0)
        canvasWidth = canvas()->visibleWidth();
    return kMax( 0, ( canvasWidth - m_doc->zoomItX( page->width() ) ) / 2 );
}

void KWViewModeNormal::drawPageBorders( TQPainter * painter, const TQRect & crect, const TQRegion & emptySpaceRegion )
{
    painter->save();
    painter->setPen( TQApplication::palette().active().color( TQColorGroup::Dark ) );
    painter->setBrush( TQt::NoBrush );
    TQRect pageRect;

    int lastPage = m_doc->lastPage();
    Q_ASSERT(canvas());
    const int canvasWidth = canvas()->visibleWidth();
    double pagePosPt = 0;
    int topOfPage = 0; // in pixels
    for ( int pageNr = m_doc->startPage(); pageNr <= lastPage; pageNr++ )
    {
        KWPage *page = m_doc->pageManager()->page(pageNr);

        int pageWidth = m_doc->zoomItX( page->width() );
        int pageHeight = m_doc->zoomItY( pagePosPt + page->height() ) - topOfPage;
        if ( crect.bottom() < topOfPage )
            break;
        // Center horizontally
        int x = xOffset(page, canvasWidth);
        // Draw page border (and erase empty area inside page)
        pageRect = TQRect( x, topOfPage, pageWidth, pageHeight );
        drawOnePageBorder( painter, crect, pageRect, emptySpaceRegion );

        // The area on the left of the page
        TQRect leftArea( 0, topOfPage, x, pageHeight );
        leftArea &= crect;
        if ( !leftArea.isEmpty() ) {
            painter->fillRect( leftArea,
                               TQApplication::palette().active().brush( TQColorGroup::Mid ) );
        }

        // The area on the right of the page
        TQRect rightArea( x + pageWidth, topOfPage, crect.right() - pageWidth + 1, pageHeight );
        rightArea &= crect;
        if ( !rightArea.isEmpty() )
        {
            painter->fillRect( rightArea,
                               TQApplication::palette().active().brush( TQColorGroup::Mid ) );

            // Draw a shadow
            int topOffset = ( page==0 ) ? s_shadowOffset : 0; // leave a few pixels on top, only for first page
            drawRightShadow( painter, crect, pageRect, topOffset );
        }
        pagePosPt += page->height(); // for next page already..
        topOfPage += pageHeight;
    }
    // Take care of the area at the bottom of the last page
    if ( crect.bottom() > topOfPage )
    {
        TQRect bottomArea( 0, topOfPage, crect.right() + 1, crect.bottom() - topOfPage + 1 );
        TQRect repaintRect = bottomArea.intersect( crect );
        if ( !repaintRect.isEmpty() )
        {
            painter->fillRect( repaintRect,
                    TQApplication::palette().active().brush( TQColorGroup::Mid ) );
            // Draw a shadow
            drawBottomShadow( painter, crect, pageRect, s_shadowOffset );
        }
    }
    painter->restore();
}

////

TQRect KWViewModeEmbedded::viewPageRect( int pgNum )
{
    // Only one page makes sense in embedded mode though
    return m_doc->pageManager()->page( pgNum )->zoomedRect( m_doc );
}

//////////////////////// Preview mode ////////////////////////////////

KWViewModePreview::KWViewModePreview( KWDocument * doc, KWCanvas* canvas,
                                      bool drawFrameBorders, int _nbPagePerRow )
    : KWViewMode( doc, canvas, drawFrameBorders ),
      m_pagesPerRow(_nbPagePerRow),
      m_spacing(10)
{}

int KWViewModePreview::leftSpacing()
{
    if ( canvas() )
    {
        int pagesPerRow;
        if ( m_doc->pageCount() < m_pagesPerRow )
            pagesPerRow = m_doc->pageCount();
        else
            pagesPerRow = m_pagesPerRow;

        int pagesWidth = ( m_spacing + ( m_doc->paperWidth(m_doc->startPage()) + m_spacing ) * pagesPerRow );
        if ( pagesWidth < canvas()->visibleWidth() )
            return ( m_spacing + ( canvas()->visibleWidth() / 2 ) - ( pagesWidth / 2 ) );
    }
    return m_spacing;
}

int KWViewModePreview::topSpacing()
{
    if ( canvas() )
    {
        int pagesHeight = ( m_spacing + ( m_doc->paperHeight(m_doc->startPage()) + m_spacing ) * numRows() );
        if ( pagesHeight < canvas()->visibleHeight() )
            return ( m_spacing + ( canvas()->visibleHeight() / 2 ) - ( pagesHeight / 2 ) );
    }
    return m_spacing;
}

int KWViewModePreview::numRows() const
{
    return ( m_doc->pageCount() ) / m_pagesPerRow + 1;
}

TQSize KWViewModePreview::contentsSize()
{
    int pages = m_doc->pageCount();
    int rows = (pages-1) / m_pagesPerRow + 1;
    int hPages = rows > 1 ? m_pagesPerRow : pages;
    return TQSize( m_spacing + hPages * ( m_doc->paperWidth(m_doc->startPage()) + m_spacing ),
                  m_spacing + rows * ( m_doc->paperHeight(m_doc->startPage()) + m_spacing ) /* bottom of last row */ );
}

TQPoint KWViewModePreview::normalToView( const TQPoint & nPoint )
{
    // Can't use nPoint.y() / m_doc->paperHeight() since this would be a rounding problem
    double unzoomedY = m_doc->unzoomItY( nPoint.y() );
    KWPage *page = m_doc->pageManager()->page(unzoomedY);   // quotient
    if( !page) {
        kdWarning(31001) << "KWViewModePreview::normalToView request for conversion out of the document! Check your input data.. ("<< nPoint << ")" << endl;
        return TQPoint(0,0);
    }

    double yInPagePt = unzoomedY - page->offsetInDocument();// and rest
    int row = (page->pageNumber() - m_doc->startPage()) / m_pagesPerRow;
    int col = (page->pageNumber() - m_doc->startPage()) % m_pagesPerRow;
    /*kdDebug() << "KWViewModePreview::normalToView nPoint=" << nPoint
                << " unzoomedY=" << unzoomedY
                << " page=" << page->pageNumber() << " row=" << row << " col=" << col
                << " yInPagePt=" << yInPagePt << endl;*/
    return TQPoint( leftSpacing() + col * ( m_doc->paperWidth(page->pageNumber()) +
                                           m_spacing ) + nPoint.x(),
                   topSpacing() + row * ( m_doc->paperHeight(page->pageNumber()) +
                                          m_spacing ) + m_doc->zoomItY( yInPagePt ) );
}

TQRect KWViewModePreview::viewPageRect( int pgNum )
{
    int row = (pgNum - m_doc->startPage()) / m_pagesPerRow;
    int col = (pgNum - m_doc->startPage()) % m_pagesPerRow;
    const int paperWidth = m_doc->paperWidth( pgNum );
    const int paperHeight = m_doc->paperHeight( pgNum );
    return TQRect( leftSpacing() + col * ( paperWidth + m_spacing ),
                  topSpacing() + row * ( paperHeight + m_spacing ),
                  paperWidth,
                  paperHeight );
}

TQPoint KWViewModePreview::viewToNormal( const TQPoint & vPoint )
{
    // Well, just the opposite of the above.... hmm.... headache....
    int paperWidth = m_doc->paperWidth(m_doc->startPage());
    int paperHeight = m_doc->paperHeight(m_doc->startPage());
    TQPoint p( vPoint.x() - leftSpacing(), vPoint.y() - topSpacing() );
    int col = static_cast<int>( p.x() / ( paperWidth + m_spacing ) );
    int xInPage = p.x() - col * ( paperWidth + m_spacing );
    int row = static_cast<int>( p.y() / ( paperHeight + m_spacing ) );
    int yInPage = p.y() - row * ( paperHeight + m_spacing );
    int page = row * m_pagesPerRow + col + m_doc->startPage();
    if ( page > m_doc->lastPage() ) // [this happens when moving frames around and going out of the pages]
        return TQPoint( paperWidth, m_doc->pageTop( m_doc->lastPage() ) );
    else // normal case
        return TQPoint( xInPage, yInPage + m_doc->pageTop( page ) );
}

void KWViewModePreview::drawPageBorders( TQPainter * painter, const TQRect & crect, const TQRegion & emptySpaceRegion )
{
    painter->save();
    painter->setPen( TQApplication::palette().active().color( TQColorGroup::Dark ) );
    painter->setBrush( TQt::NoBrush );
    //kdDebug() << "KWViewModePreview::drawPageBorders crect=" << DEBUGRECT( crect ) << endl;
    TQRegion grayRegion( crect );
    int pageCount = m_doc->pageCount();
    for ( int counter = 0; counter < pageCount; counter++ )
    {
        int row = counter / m_pagesPerRow;
        int col = counter % m_pagesPerRow;
        int page = m_doc->startPage() + counter;
        int paperWidth = m_doc->paperWidth(page);
        int paperHeight = m_doc->paperHeight(page);
        TQRect pageRect( leftSpacing() + col * ( paperWidth + m_spacing ),
                        topSpacing() + row * ( paperHeight + m_spacing ),
                        paperWidth, paperHeight );
        drawOnePageBorder( painter, crect, pageRect, emptySpaceRegion );
        if( pageRect.top() > crect.bottom())
            break;
        if ( pageRect.intersects( crect ) )
            grayRegion -= pageRect;
        TQRect rightShadow = drawRightShadow( painter, crect, pageRect, s_shadowOffset );
        if ( !rightShadow.isEmpty() )
            grayRegion -= rightShadow;
        TQRect bottomShadow = drawBottomShadow( painter, crect, pageRect, s_shadowOffset );
        if ( !bottomShadow.isEmpty() )
            grayRegion -= bottomShadow;

        //kdDebug() << "KWViewModePreview::drawPageBorders grayRegion is now : " << endl;
        //DEBUGREGION( grayRegion );
    }
    if ( !grayRegion.isEmpty() )
    {
        //kdDebug() << "KWViewModePreview::drawPageBorders grayRegion's bounding Rect = " << DEBUGRECT( grayRegion.boundingRect() ) << endl;
        m_doc->eraseEmptySpace( painter, grayRegion, TQApplication::palette().active().brush( TQColorGroup::Mid ) );
    }
    painter->restore();
}

//////////////////

KWViewModeText::KWViewModeText( KWDocument * doc, KWCanvas* canvas, KWTextFrameSet* fs )
    : KWViewMode( doc, canvas, false )
{
    m_textFrameSet = fs;
}

KWTextFrameSet * KWViewModeText::textFrameSet() const
{
    if ( !m_textFrameSet ) // e.g. when we set this mode before we had any frames (doc not loaded yet)
        m_textFrameSet = determineTextFrameSet( m_doc );
    return m_textFrameSet;
}

KWTextFrameSet * KWViewModeText::determineTextFrameSet( KWDocument* doc ) // static
{
    KWTextFrameSet* fs = 0L;

    if(!doc->getAllViews().empty()) { // try the one that is selected
        KWView *view = doc->getAllViews()[0];
        KWFrameView *fv = view->getGUI()->canvasWidget()->frameViewManager()->selectedFrame();
        KWFrame *f = fv == 0 ? 0 : fv->frame();
        if(f)
            fs = dynamic_cast<KWTextFrameSet *>( f->frameSet() );

        if (!fs) { // try the one I am editing
            KWFrameSetEdit *fse = view->getGUI()->canvasWidget()->currentFrameSetEdit();
            if(fse)
                fs = dynamic_cast<KWTextFrameSet *>( fse->frameSet() );
        }
    }

    if (!fs || fs->isHeaderOrFooter() || fs->isFootEndNote())
        // if not a textFS, or header/footer/footnote: fallback to fs 0
        if ( doc->frameSetCount() > 0 && doc->frameSet( 0 )->isVisible() )
            fs = dynamic_cast<KWTextFrameSet *>( doc->frameSet( 0 ) );

    return fs;
}

TQPoint KWViewModeText::normalToView( const TQPoint & nPoint )
{
    TQPoint r (nPoint);
    r.setX(r.x() + OFFSET);
    return r;
}

TQPoint KWViewModeText::viewToNormal( const TQPoint & vPoint )
{
    TQPoint r (vPoint);
    r.setX(r.x() - OFFSET);
    return r;
}

TQSize KWViewModeText::contentsSize()
{
    if (!textFrameSet())
        return TQSize();

    // The actual contents only depend on the amount of text.
    // The width is the one from the text, so that the placement of tabs makes a bit of sense, etc.
    // The minimum height is the one of a normal page though.

    int width = m_doc->layoutUnitToPixelX( m_textFrameSet->textDocument()->width() );

    int height = TQMAX((int)m_doc->paperHeight(m_doc->startPage()),
                      m_doc->layoutUnitToPixelY( m_textFrameSet->textDocument()->height() ) );
    //kdDebug() << "KWViewModeText::contentsSize " << width << "x" << height << endl;
    return TQSize( width, height );
}

TQSize KWViewModeText::availableSizeForText( KWTextFrameSet* /*textfs*/ )
{
    return contentsSize();
}

bool KWViewModeText::isFrameSetVisible( const KWFrameSet *fs )
{
    if(fs==NULL) return false; // assertion
    if(fs==textFrameSet()) return true;

    const KWFrameSet* parentFrameset = fs->groupmanager() ? fs->groupmanager() : fs;
    while ( parentFrameset->isFloating() ) {
        parentFrameset = parentFrameset->anchorFrameset();
        if ( parentFrameset == m_textFrameSet )
            return true;
    }
    return false;
}

void KWViewModeText::drawPageBorders( TQPainter * painter, const TQRect & crect,
                                      const TQRegion & /*emptySpaceRegion*/ )
{
    painter->save();
    TQRegion grayRegion( crect );
    //kdDebug() << "KWViewModeText::drawPageBorders crect=" << grayRegion << endl;
    painter->setPen( TQApplication::palette().active().color( TQColorGroup::Dark ) );
    TQSize cSize = contentsSize();
    // Draw a line on the right -- ## or a shadow?
    // +1 to be out of the contents, and +1 for TQRect
    TQRect frameRect( OFFSET, 0, cSize.width() + 2, cSize.height() );
    //kdDebug() << "KWViewModeText::drawPageBorders right line: "  << frameRect.topRight() << "   " << frameRect.bottomRight()<< endl;
    painter->drawLine( frameRect.topRight(), frameRect.bottomRight() );
    if ( frameRect.intersects( crect ) )
        grayRegion -= frameRect;

    //kdDebug() << "KWViewModeText::drawPageBorders grayRegion is now " << grayRegion << endl;
    if ( crect.bottom() >= cSize.height() )
    {
        // And draw a line at the bottom -- ## or a shadow?
        painter->drawLine( 0, cSize.height(),
                           cSize.width(), cSize.height() );
        grayRegion -= TQRect( 0, cSize.height(),
                             cSize.width(), cSize.height() );
    }
    //kdDebug() << "KWViewModeText::drawPageBorders erasing grayRegion " << grayRegion << endl;
    if ( !grayRegion.isEmpty() )
        m_doc->eraseEmptySpace( painter, grayRegion, TQApplication::palette().active().brush( TQColorGroup::Mid ) );
    painter->restore();
}

TQRect KWViewModeText::rulerFrameRect()
{
    return TQRect( TQPoint(OFFSET, 0), contentsSize() );
}

void KWViewModeText::setPageLayout( KoRuler* hRuler, KoRuler* vRuler, const KoPageLayout& /*layout*/ )
{
    // Create a dummy page-layout, as if we had a single page englobing the whole text.
    KoPageLayout layout;
    layout.format = PG_CUSTOM;
    layout.orientation = PG_PORTRAIT;
    TQSize cSize = contentsSize();
    layout.ptWidth = m_doc->unzoomItX( cSize.width() );
    layout.ptHeight = m_doc->unzoomItY( cSize.height() );
    //kdDebug() << "KWViewModeText::setPageLayout layout size " << layout.ptWidth << "x" << layout.ptHeight << endl;
    layout.ptLeft = OFFSET;
    layout.ptRight = 0;
    layout.ptTop = 0;
    layout.ptBottom = 0;
    layout.ptBindingSide = 0;
    layout.ptPageEdge = 0;
    hRuler->setPageLayout( layout );
    vRuler->setPageLayout( layout );
}

bool KWViewModeText::isTextModeFrameset(KWFrameSet *fs) const {
    return fs == textFrameSet();
}


int KWViewModePrint::xOffset(KWPage *page, int canvasWidth) {
    Q_UNUSED(page);
    Q_UNUSED(canvasWidth);
    return 0;
}
