|
|
|
/* This file is part of the KDE project
|
|
|
|
Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>,
|
|
|
|
2003 Philipp Mller <philipp.mueller@gmx.de>
|
|
|
|
2005 Raphael Langerhorst <raphael.langerhorst@kdemail.net>
|
|
|
|
|
|
|
|
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 "kspread_sheet.h"
|
|
|
|
#include "selection.h"
|
|
|
|
#include "kspread_locale.h"
|
|
|
|
#include "kspread_doc.h"
|
|
|
|
#include "kspread_undo.h"
|
|
|
|
|
|
|
|
#include "kspread_sheetprint.h"
|
|
|
|
|
|
|
|
#include "commands.h"
|
|
|
|
#include <KoDocumentInfo.h>
|
|
|
|
|
|
|
|
#include <tdemessagebox.h>
|
|
|
|
#include <kprinter.h>
|
|
|
|
#include <kdebug.h>
|
|
|
|
|
|
|
|
#include <tqregexp.h>
|
|
|
|
|
|
|
|
#include <pwd.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#include "kspread_sheetprint.moc"
|
|
|
|
|
|
|
|
#define NO_MODIFICATION_POSSIBLE \
|
|
|
|
do { \
|
|
|
|
KMessageBox::error( 0, i18n ( "You cannot change a protected sheet" ) ); return; \
|
|
|
|
} while(0)
|
|
|
|
|
|
|
|
using namespace KSpread;
|
|
|
|
|
|
|
|
SheetPrint::SheetPrint( Sheet* sheet )
|
|
|
|
{
|
|
|
|
m_pSheet = sheet;
|
|
|
|
m_pDoc = m_pSheet->doc();
|
|
|
|
|
|
|
|
m_bPrintGrid = false;
|
|
|
|
m_bPrintCommentIndicator = false;
|
|
|
|
m_bPrintFormulaIndicator = false;
|
|
|
|
m_bPrintObjects = true;
|
|
|
|
m_bPrintCharts = true;
|
|
|
|
m_bPrintGraphics = true;
|
|
|
|
|
|
|
|
m_leftBorder = 20.0;
|
|
|
|
m_rightBorder = 20.0;
|
|
|
|
m_topBorder = 20.0;
|
|
|
|
m_bottomBorder = 20.0;
|
|
|
|
|
|
|
|
m_paperFormat = KoPageFormat::defaultFormat();
|
|
|
|
m_orientation = PG_PORTRAIT;
|
|
|
|
m_paperWidth = MM_TO_POINT( KoPageFormat::width( m_paperFormat, m_orientation ) );
|
|
|
|
m_paperHeight = MM_TO_POINT( KoPageFormat::height( m_paperFormat, m_orientation ) );
|
|
|
|
m_printRange = TQRect( TQPoint( 1, 1 ), TQPoint( KS_colMax, KS_rowMax ) );
|
|
|
|
m_lnewPageListX.append( 1 );
|
|
|
|
m_lnewPageListY.append( 1 );
|
|
|
|
m_maxCheckedNewPageX = 1;
|
|
|
|
m_maxCheckedNewPageY = 1;
|
|
|
|
m_dPrintRepeatColumnsWidth = 0.0;
|
|
|
|
m_dPrintRepeatRowsHeight = 0.0;
|
|
|
|
m_printRepeatColumns = tqMakePair( 0, 0 );
|
|
|
|
m_printRepeatRows = tqMakePair( 0, 0 );
|
|
|
|
m_dZoom = 1.0;
|
|
|
|
m_iPageLimitX = 0;
|
|
|
|
m_iPageLimitY = 0;
|
|
|
|
|
|
|
|
calcPaperSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
SheetPrint::~SheetPrint()
|
|
|
|
{
|
|
|
|
// nothing todo yet
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString SheetPrint::saveOasisSheetStyleLayout( KoGenStyles &mainStyles )
|
|
|
|
{
|
|
|
|
KoGenStyle pageLayout( KoGenStyle::STYLE_PAGELAYOUT );
|
|
|
|
//pageLayout.addAttribute( "style:page-usage", "all" ); FIXME
|
|
|
|
pageLayout.addPropertyPt( "fo:page-width", MM_TO_POINT( paperWidth() ) );
|
|
|
|
pageLayout.addPropertyPt( "fo:page-height", MM_TO_POINT( paperHeight() ) );
|
|
|
|
pageLayout.addProperty( "style:print-orientation", orientation() == PG_LANDSCAPE ? "landscape" : "portrait" );
|
|
|
|
pageLayout.addPropertyPt( "fo:margin-left", MM_TO_POINT(leftBorder() ) );
|
|
|
|
pageLayout.addPropertyPt( "fo:margin-top", MM_TO_POINT(topBorder() ) );
|
|
|
|
pageLayout.addPropertyPt( "fo:margin-right", MM_TO_POINT(rightBorder() ) );
|
|
|
|
pageLayout.addPropertyPt( "fo:margin-bottom", MM_TO_POINT(bottomBorder() ) );
|
|
|
|
//necessary for print setup
|
|
|
|
m_pSheet->saveOasisPrintStyleLayout( pageLayout );
|
|
|
|
|
|
|
|
return mainStyles.lookup( pageLayout, "pm" );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TQRect SheetPrint::cellsPrintRange()
|
|
|
|
{
|
|
|
|
// Find maximum right/bottom cell with content
|
|
|
|
TQRect cell_range;
|
|
|
|
cell_range.setCoords( 1, 1, 1, 1 );
|
|
|
|
|
|
|
|
Cell* c = m_pSheet->firstCell();
|
|
|
|
for( ;c; c = c->nextCell() )
|
|
|
|
{
|
|
|
|
if ( c->needsPrinting() )
|
|
|
|
{
|
|
|
|
if ( c->column() > cell_range.right() )
|
|
|
|
cell_range.setRight( c->column() );
|
|
|
|
if ( c->row() > cell_range.bottom() )
|
|
|
|
cell_range.setBottom( c->row() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now look at the children
|
|
|
|
TQPtrListIterator<KoDocumentChild> cit( m_pDoc->children() );
|
|
|
|
double dummy;
|
|
|
|
int i;
|
|
|
|
for( ; cit.current(); ++cit )
|
|
|
|
{
|
|
|
|
//TQRect, because KoChild doesn't use KoRect yet
|
|
|
|
TQRect bound = cit.current()->boundingRect();
|
|
|
|
|
|
|
|
i = m_pSheet->leftColumn( bound.right(), dummy );
|
|
|
|
if ( i > cell_range.right() )
|
|
|
|
cell_range.setRight( i );
|
|
|
|
|
|
|
|
i = m_pSheet->topRow( bound.bottom(), dummy );
|
|
|
|
if ( i > cell_range.bottom() )
|
|
|
|
cell_range.setBottom( i );
|
|
|
|
}
|
|
|
|
cell_range = cell_range.intersect( m_printRange );
|
|
|
|
|
|
|
|
return cell_range;
|
|
|
|
}
|
|
|
|
|
|
|
|
int SheetPrint::pagesX( const TQRect& cellsPrintRange )
|
|
|
|
{
|
|
|
|
int pages = 0;
|
|
|
|
|
|
|
|
updateNewPageX( m_pSheet->rightColumn( m_pSheet->dblColumnPos( cellsPrintRange.right() ) + prinsheetWidthPts() ) );
|
|
|
|
|
|
|
|
for( int i = cellsPrintRange.left(); i <= cellsPrintRange.right(); i++ )
|
|
|
|
{
|
|
|
|
if( isOnNewPageX( i ) )
|
|
|
|
pages++;
|
|
|
|
}
|
|
|
|
return pages;
|
|
|
|
}
|
|
|
|
|
|
|
|
int SheetPrint::pagesY( const TQRect& cellsPrintRange )
|
|
|
|
{
|
|
|
|
int pages = 0;
|
|
|
|
|
|
|
|
updateNewPageY( m_pSheet->bottomRow( m_pSheet->dblRowPos( cellsPrintRange.bottom() ) + prinsheetHeightPts() ) );
|
|
|
|
|
|
|
|
for( int i = cellsPrintRange.top(); i <= cellsPrintRange.bottom(); i++ )
|
|
|
|
{
|
|
|
|
if( isOnNewPageY( i ) )
|
|
|
|
pages++;
|
|
|
|
}
|
|
|
|
return pages;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool SheetPrint::pageNeedsPrinting( TQRect& page_range )
|
|
|
|
{
|
|
|
|
// bool filled = false;
|
|
|
|
|
|
|
|
// Look at the cells
|
|
|
|
for( int r = page_range.top(); r <= page_range.bottom() ; ++r )
|
|
|
|
for( int c = page_range.left(); c <= page_range.right() ; ++c )
|
|
|
|
if ( m_pSheet->cellAt( c, r )->needsPrinting() )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
// filled = true;
|
|
|
|
|
|
|
|
//Page empty, but maybe children on it?
|
|
|
|
|
|
|
|
TQRect intView = TQRect( TQPoint( m_pDoc->zoomItX( m_pSheet->dblColumnPos( page_range.left() ) ),
|
|
|
|
m_pDoc->zoomItY( m_pSheet->dblRowPos( page_range.top() ) ) ),
|
|
|
|
TQPoint( m_pDoc->zoomItX( m_pSheet->dblColumnPos( page_range.right() ) +
|
|
|
|
m_pSheet->columnFormat( page_range.right() )->dblWidth() ),
|
|
|
|
m_pDoc->zoomItY( m_pSheet->dblRowPos( page_range.bottom() ) +
|
|
|
|
m_pSheet->rowFormat( page_range.bottom() )->dblHeight() ) ) );
|
|
|
|
|
|
|
|
TQPtrListIterator<KoDocumentChild> it( m_pDoc->children() );
|
|
|
|
for( ;it.current(); ++it )
|
|
|
|
{
|
|
|
|
TQRect bound = it.current()->boundingRect();
|
|
|
|
if ( bound.intersects( intView ) )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
//filled = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//Page has no visible content on it, so we don't need to paint it
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SheetPrint::print( TQPainter &painter, KPrinter *_printer )
|
|
|
|
{
|
|
|
|
kdDebug(36001)<<"PRINTING ...."<<endl;
|
|
|
|
|
|
|
|
// Override the current grid pen setting, when set to disable
|
|
|
|
TQPen gridPen;
|
|
|
|
bool oldShowGrid = m_pSheet->getShowGrid();
|
|
|
|
m_pSheet->setShowGrid( m_bPrintGrid );
|
|
|
|
if ( !m_bPrintGrid )
|
|
|
|
{
|
|
|
|
gridPen = TQPen( m_pDoc->gridColor(), 1, TQt::SolidLine );
|
|
|
|
TQPen nopen;
|
|
|
|
nopen.setStyle( Qt::NoPen );
|
|
|
|
m_pDoc->setGridColor( TQt::white );
|
|
|
|
}
|
|
|
|
|
|
|
|
//Update m_dPrintRepeatColumnsWidth for repeated columns
|
|
|
|
//just in case it isn't done yet
|
|
|
|
if ( !m_pSheet->isShowPageBorders() && m_printRepeatColumns.first != 0 )
|
|
|
|
updatePrintRepeatColumnsWidth();
|
|
|
|
|
|
|
|
//Update m_dPrintRepeatRowsHeight for repeated rows
|
|
|
|
//just in case it isn't done yet
|
|
|
|
if ( !m_pSheet->isShowPageBorders() && m_printRepeatRows.first != 0 )
|
|
|
|
updatePrintRepeatRowsHeight();
|
|
|
|
|
|
|
|
//Calculate the range to be printed
|
|
|
|
TQRect cell_range = cellsPrintRange();
|
|
|
|
kdDebug()<<"cellsPrintRange() :"<<cellsPrintRange()<<endl;
|
|
|
|
//Ensure, that our newPage lists are generated for the whole sheet to print
|
|
|
|
//For this we add to the lists the width/height of 1 page
|
|
|
|
updateNewPageX( m_pSheet->rightColumn( m_pSheet->dblColumnPos( cell_range.right() ) + prinsheetWidthPts() ) );
|
|
|
|
updateNewPageY( m_pSheet->bottomRow( m_pSheet->dblRowPos( cell_range.bottom() ) + prinsheetHeightPts() ) );
|
|
|
|
|
|
|
|
// Find out how many pages need printing
|
|
|
|
// and which cells to print on which page.
|
|
|
|
TQValueList<TQRect> page_list; //contains the cols and rows of a page
|
|
|
|
TQValueList<KoRect> page_frame_list; //contains the coordinate range of a page
|
|
|
|
TQValueList<KoPoint> page_frame_list_offset; //contains the offset of the not repeated area
|
|
|
|
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator itX;
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator itY;
|
|
|
|
for( itX = m_lnewPageListX.begin(); itX != m_lnewPageListX.end(); ++itX )
|
|
|
|
{
|
|
|
|
for( itY = m_lnewPageListY.begin(); itY != m_lnewPageListY.end(); ++itY )
|
|
|
|
{
|
|
|
|
TQRect page_range( TQPoint( (*itX).startItem(), (*itY).startItem() ),
|
|
|
|
TQPoint( (*itX).endItem(), (*itY).endItem() ) );
|
|
|
|
kdDebug()<<" page_range :"<<page_range<<endl;
|
|
|
|
//Append page when there is something to print
|
|
|
|
if ( pageNeedsPrinting( page_range ) )
|
|
|
|
{
|
|
|
|
KoRect view = KoRect( KoPoint( m_pSheet->dblColumnPos( page_range.left() ),
|
|
|
|
m_pSheet->dblRowPos( page_range.top() ) ),
|
|
|
|
KoPoint( m_pSheet->dblColumnPos( page_range.right() ) +
|
|
|
|
m_pSheet->columnFormat( page_range.right() )->dblWidth(),
|
|
|
|
m_pSheet->dblRowPos( page_range.bottom() ) +
|
|
|
|
m_pSheet->rowFormat( page_range.bottom() )->dblHeight() ) );
|
|
|
|
page_list.append( page_range );
|
|
|
|
page_frame_list.append( view );
|
|
|
|
page_frame_list_offset.append( KoPoint( (*itX).offset(), (*itY).offset() ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
kdDebug(36001) << "PRINTING " << page_list.count() << " pages" << endl;
|
|
|
|
m_uprintPages = page_list.count();
|
|
|
|
|
|
|
|
|
|
|
|
//Cache all object so they only need to be repainted once.
|
|
|
|
TQPtrListIterator<EmbeddedObject> itObject( m_pDoc->embeddedObjects() );
|
|
|
|
for ( ; itObject.current(); ++itObject )
|
|
|
|
{
|
|
|
|
EmbeddedObject *obj = itObject.current();
|
|
|
|
if ( obj->sheet() != m_pSheet ||
|
|
|
|
!( (( obj->getType() == OBJECT_KOFFICE_PART || obj->getType() == OBJECT_PICTURE ) && m_bPrintObjects) ||
|
|
|
|
( obj->getType() == OBJECT_CHART && m_bPrintCharts ) ) )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
TQRect zoomRect = m_pDoc->zoomRect( itObject.current()->geometry() );
|
|
|
|
TQPixmap *p = new TQPixmap( zoomRect.size() );
|
|
|
|
TQPainter painter(p);
|
|
|
|
painter.fillRect( p->rect(), TQColor("white") );
|
|
|
|
painter.translate( -zoomRect.x(), -zoomRect.y() ); //we cant to paint at (0,0)
|
|
|
|
bool const isSelected = itObject.current()->isSelected();
|
|
|
|
itObject.current()->setSelected( false );
|
|
|
|
itObject.current()->draw( &painter );
|
|
|
|
painter.end();
|
|
|
|
itObject.current()->setSelected( isSelected );
|
|
|
|
|
|
|
|
PrintObject *po = new PrintObject();
|
|
|
|
m_printObjects.append( po );
|
|
|
|
po->obj = itObject.current();
|
|
|
|
po->p = p;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( page_list.count() == 0 )
|
|
|
|
{
|
|
|
|
// nothing to print
|
|
|
|
painter.setPen( TQPen( TQt::black, 1 ) );
|
|
|
|
painter.drawPoint( 1, 1 );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
|
|
|
|
int pageNo = 1;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Print all pages in the list
|
|
|
|
//
|
|
|
|
TQValueList<TQRect>::Iterator it = page_list.begin();
|
|
|
|
TQValueList<KoRect>::Iterator fit = page_frame_list.begin();
|
|
|
|
TQValueList<KoPoint>::Iterator fito = page_frame_list_offset.begin();
|
|
|
|
|
|
|
|
for( ; it != page_list.end(); ++it, ++fit, ++fito, ++pageNo )
|
|
|
|
{
|
|
|
|
painter.setClipRect( 0, 0, m_pDoc->zoomItX( paperWidthPts() ),
|
|
|
|
m_pDoc->zoomItY( paperHeightPts() ) );
|
|
|
|
printHeaderFooter( painter, pageNo );
|
|
|
|
|
|
|
|
painter.translate( m_pDoc->zoomItX( leftBorderPts() ),
|
|
|
|
m_pDoc->zoomItY( topBorderPts() ) );
|
|
|
|
|
|
|
|
// Print the page
|
|
|
|
printPage( painter, *it, *fit, *fito );
|
|
|
|
|
|
|
|
painter.translate( - m_pDoc->zoomItX( leftBorderPts() ),
|
|
|
|
- m_pDoc->zoomItY( topBorderPts() ) );
|
|
|
|
|
|
|
|
if ( pageNo < (int)page_list.count() )
|
|
|
|
_printer->newPage();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !m_bPrintGrid )
|
|
|
|
{
|
|
|
|
// Restore the grid pen
|
|
|
|
m_pDoc->setGridColor( gridPen.color() );
|
|
|
|
}
|
|
|
|
m_pSheet->setShowGrid( oldShowGrid );
|
|
|
|
|
|
|
|
TQValueList<PrintObject *>::iterator it;
|
|
|
|
for ( it = m_printObjects.begin(); it != m_printObjects.end(); ++it )
|
|
|
|
delete (*it)->p;
|
|
|
|
m_printObjects.clear();
|
|
|
|
|
|
|
|
return ( page_list.count() > 0 );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::printPage( TQPainter &_painter, const TQRect& page_range,
|
|
|
|
const KoRect& view, const KoPoint _childOffset )
|
|
|
|
{
|
|
|
|
kdDebug(36001) << "Rect x=" << page_range.left() << " y=" << page_range.top() << ", r="
|
|
|
|
<< page_range.right() << " b=" << page_range.bottom() << " offsetx: "<< _childOffset.x()
|
|
|
|
<< " offsety: " << _childOffset.y() <<" view-x: "<<view.x()<< endl;
|
|
|
|
|
|
|
|
//Don't paint on the page borders
|
|
|
|
TQRegion clipRegion( m_pDoc->zoomItX( leftBorderPts() ),
|
|
|
|
m_pDoc->zoomItY( topBorderPts() ),
|
|
|
|
m_pDoc->zoomItX( view.width() + _childOffset.x() ),
|
|
|
|
m_pDoc->zoomItY( view.height() + _childOffset.y() ) );
|
|
|
|
_painter.setClipRegion( clipRegion );
|
|
|
|
|
|
|
|
//
|
|
|
|
// Draw the cells.
|
|
|
|
//
|
|
|
|
//Check if we have to repeat some rows and columns (top left rect)
|
|
|
|
if ( ( _childOffset.x() != 0.0 ) && ( _childOffset.y() != 0.0 ) )
|
|
|
|
{
|
|
|
|
//TQRect(left,top,width,height) <<<< WIDTH AND HEIGHT!!!
|
|
|
|
TQRect _printRect( m_printRepeatColumns.first, m_printRepeatRows.first,
|
|
|
|
m_printRepeatColumns.second - m_printRepeatColumns.first + 1,
|
|
|
|
m_printRepeatRows.second - m_printRepeatRows.first + 1);
|
|
|
|
KoPoint _topLeft( 0.0, 0.0 );
|
|
|
|
|
|
|
|
printRect( _painter, _topLeft, _printRect, view, clipRegion );
|
|
|
|
}
|
|
|
|
|
|
|
|
//Check if we have to repeat some rows (left rect)
|
|
|
|
if ( _childOffset.y() != 0 )
|
|
|
|
{
|
|
|
|
TQRect _printRect( page_range.left(), m_printRepeatRows.first,
|
|
|
|
page_range.right() - page_range.left() + 1,
|
|
|
|
m_printRepeatRows.second - m_printRepeatRows.first + 1);
|
|
|
|
KoPoint _topLeft( _childOffset.x(), 0.0 );
|
|
|
|
|
|
|
|
printRect( _painter, _topLeft, _printRect, view, clipRegion );
|
|
|
|
}
|
|
|
|
|
|
|
|
//Check if we have to repeat some columns (top right rect)
|
|
|
|
if ( _childOffset.x() != 0 )
|
|
|
|
{
|
|
|
|
TQRect _printRect( m_printRepeatColumns.first, page_range.top(),
|
|
|
|
m_printRepeatColumns.second - m_printRepeatColumns.first + 1,
|
|
|
|
page_range.bottom() - page_range.top() + 1);
|
|
|
|
KoPoint _topLeft( 0.0, _childOffset.y() );
|
|
|
|
|
|
|
|
printRect( _painter, _topLeft, _printRect, view, clipRegion );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//Print the cells (right data rect)
|
|
|
|
KoPoint _topLeft( _childOffset.x(), _childOffset.y() );
|
|
|
|
|
|
|
|
printRect( _painter, _topLeft, page_range, view, clipRegion );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SheetPrint::printRect( TQPainter& painter, const KoPoint& topLeft,
|
|
|
|
const TQRect& printRect, const KoRect& view,
|
|
|
|
TQRegion &clipRegion )
|
|
|
|
{
|
|
|
|
//
|
|
|
|
// Draw the cells.
|
|
|
|
//
|
|
|
|
Cell *cell;
|
|
|
|
RowFormat *row_lay;
|
|
|
|
ColumnFormat *col_lay;
|
|
|
|
|
|
|
|
double xpos = 0;
|
|
|
|
double ypos = topLeft.y();
|
|
|
|
|
|
|
|
int regionBottom = printRect.bottom();
|
|
|
|
int regionRight = printRect.right();
|
|
|
|
int regionLeft = printRect.left();
|
|
|
|
int regionTop = printRect.top();
|
|
|
|
|
|
|
|
//Calculate the output rect
|
|
|
|
KoPoint bottomRight( topLeft );
|
|
|
|
for ( int x = regionLeft; x <= regionRight; ++x )
|
|
|
|
bottomRight.setX( bottomRight.x()
|
|
|
|
+ m_pSheet->columnFormat( x )->dblWidth() );
|
|
|
|
for ( int y = regionTop; y <= regionBottom; ++y )
|
|
|
|
bottomRight.setY( bottomRight.y()
|
|
|
|
+ m_pSheet->rowFormat( y )->dblHeight() );
|
|
|
|
KoRect rect( topLeft, bottomRight );
|
|
|
|
|
|
|
|
TQValueList<TQPoint> mergedCellsPainted;
|
|
|
|
for ( int y = regionTop; y <= regionBottom; ++y )
|
|
|
|
{
|
|
|
|
row_lay = m_pSheet->rowFormat( y );
|
|
|
|
xpos = topLeft.x();
|
|
|
|
|
|
|
|
for ( int x = regionLeft; x <= regionRight; ++x )
|
|
|
|
{
|
|
|
|
col_lay = m_pSheet->columnFormat( x );
|
|
|
|
|
|
|
|
cell = m_pSheet->cellAt( x, y );
|
|
|
|
|
|
|
|
bool paintBordersBottom = false;
|
|
|
|
bool paintBordersRight = false;
|
|
|
|
bool paintBordersLeft = false;
|
|
|
|
bool paintBordersTop = false;
|
|
|
|
|
|
|
|
TQPen rightPen = cell->effRightBorderPen( x, y );
|
|
|
|
TQPen leftPen = cell->effLeftBorderPen( x, y );
|
|
|
|
TQPen bottomPen = cell->effBottomBorderPen( x, y );
|
|
|
|
TQPen topPen = cell->effTopBorderPen( x, y );
|
|
|
|
|
|
|
|
// paint right border if rightmost cell or if the pen is more "worth" than the left border pen
|
|
|
|
// of the cell on the left or if the cell on the right is not painted. In the latter case get
|
|
|
|
// the pen that is of more "worth"
|
|
|
|
if ( x >= KS_colMax )
|
|
|
|
paintBordersRight = true;
|
|
|
|
else
|
|
|
|
if ( x == regionRight )
|
|
|
|
{
|
|
|
|
paintBordersRight = true;
|
|
|
|
if ( cell->effRightBorderValue( x, y ) < m_pSheet->cellAt( x + 1, y )->effLeftBorderValue( x + 1, y ) )
|
|
|
|
rightPen = m_pSheet->cellAt( x + 1, y )->effLeftBorderPen( x + 1, y );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
paintBordersRight = true;
|
|
|
|
if ( cell->effRightBorderValue( x, y ) < m_pSheet->cellAt( x + 1, y )->effLeftBorderValue( x + 1, y ) )
|
|
|
|
rightPen = m_pSheet->cellAt( x + 1, y )->effLeftBorderPen( x + 1, y );
|
|
|
|
}
|
|
|
|
|
|
|
|
// similiar for other borders...
|
|
|
|
// bottom border:
|
|
|
|
if ( y >= KS_rowMax )
|
|
|
|
paintBordersBottom = true;
|
|
|
|
else
|
|
|
|
if ( y == regionBottom )
|
|
|
|
{
|
|
|
|
paintBordersBottom = true;
|
|
|
|
if ( cell->effBottomBorderValue( x, y ) < m_pSheet->cellAt( x, y + 1 )->effTopBorderValue( x, y + 1) )
|
|
|
|
bottomPen = m_pSheet->cellAt( x, y + 1 )->effTopBorderPen( x, y + 1 );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
paintBordersBottom = true;
|
|
|
|
if ( cell->effBottomBorderValue( x, y ) < m_pSheet->cellAt( x, y + 1 )->effTopBorderValue( x, y + 1) )
|
|
|
|
bottomPen = m_pSheet->cellAt( x, y + 1 )->effTopBorderPen( x, y + 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
// left border:
|
|
|
|
if ( x == 1 )
|
|
|
|
paintBordersLeft = true;
|
|
|
|
else
|
|
|
|
if ( x == regionLeft )
|
|
|
|
{
|
|
|
|
paintBordersLeft = true;
|
|
|
|
if ( cell->effLeftBorderValue( x, y ) < m_pSheet->cellAt( x - 1, y )->effRightBorderValue( x - 1, y ) )
|
|
|
|
leftPen = m_pSheet->cellAt( x - 1, y )->effRightBorderPen( x - 1, y );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
paintBordersLeft = true;
|
|
|
|
if ( cell->effLeftBorderValue( x, y ) < m_pSheet->cellAt( x - 1, y )->effRightBorderValue( x - 1, y ) )
|
|
|
|
leftPen = m_pSheet->cellAt( x - 1, y )->effRightBorderPen( x - 1, y );
|
|
|
|
}
|
|
|
|
|
|
|
|
// top border:
|
|
|
|
if ( y == 1 )
|
|
|
|
paintBordersTop = true;
|
|
|
|
else
|
|
|
|
if ( y == regionTop )
|
|
|
|
{
|
|
|
|
paintBordersTop = true;
|
|
|
|
if ( cell->effTopBorderValue( x, y ) < m_pSheet->cellAt( x, y - 1 )->effBottomBorderValue( x, y - 1 ) )
|
|
|
|
topPen = m_pSheet->cellAt( x, y - 1 )->effBottomBorderPen( x, y - 1 );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
paintBordersTop = true;
|
|
|
|
if ( cell->effTopBorderValue( x, y ) < m_pSheet->cellAt( x, y - 1 )->effBottomBorderValue( x, y - 1 ) )
|
|
|
|
topPen = m_pSheet->cellAt( x, y - 1 )->effBottomBorderPen( x, y - 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
int paintBorder=Cell::Border_None;
|
|
|
|
if (paintBordersLeft) paintBorder |= Cell::Border_Left;
|
|
|
|
if (paintBordersRight) paintBorder |= Cell::Border_Right;
|
|
|
|
if (paintBordersTop) paintBorder |= Cell::Border_Top;
|
|
|
|
if (paintBordersBottom) paintBorder |= Cell::Border_Bottom;
|
|
|
|
|
|
|
|
TQPen highlightPen;
|
|
|
|
|
|
|
|
if ( m_pSheet->layoutDirection()==Sheet::RightToLeft )
|
|
|
|
cell->paintCell( rect, painter, NULL,
|
|
|
|
KoPoint( view.width() - xpos -
|
|
|
|
col_lay->dblWidth(), ypos ), TQPoint( x, y ),
|
|
|
|
paintBorder,
|
|
|
|
rightPen, bottomPen, leftPen, topPen,
|
|
|
|
mergedCellsPainted);
|
|
|
|
else
|
|
|
|
cell->paintCell( rect, painter, NULL,
|
|
|
|
KoPoint( xpos, ypos ), TQPoint( x, y ),
|
|
|
|
paintBorder,
|
|
|
|
rightPen, bottomPen, leftPen, topPen,
|
|
|
|
mergedCellsPainted);
|
|
|
|
|
|
|
|
xpos += col_lay->dblWidth();
|
|
|
|
}
|
|
|
|
|
|
|
|
ypos += row_lay->dblHeight();
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Draw the children
|
|
|
|
//
|
|
|
|
TQRect zoomedView = m_pDoc->zoomRect( view );
|
|
|
|
//TQPtrListIterator<KoDocumentChild> it( m_pDoc->children() );
|
|
|
|
//TQPtrListIterator<EmbeddedObject> itObject( m_pDoc->embeddedObjects() );
|
|
|
|
|
|
|
|
TQValueList<PrintObject *>::iterator itObject;
|
|
|
|
for ( itObject = m_printObjects.begin(); itObject != m_printObjects.end(); ++itObject ) {
|
|
|
|
EmbeddedObject *obj = (*itObject)->obj;
|
|
|
|
// TQString tmp=TQString("Testing child %1/%2 %3/%4 against view %5/%6 %7/%8")
|
|
|
|
// .arg(it.current()->contentRect().left())
|
|
|
|
// .arg(it.current()->contentRect().top())
|
|
|
|
// .arg(it.current()->contentRect().right())
|
|
|
|
// .arg(it.current()->contentRect().bottom())
|
|
|
|
// .arg(view.left()).arg(view.top()).arg(zoomedView.right()).arg(zoomedView.bottom());
|
|
|
|
// kdDebug(36001)<<tmp<<" offset "<<_childOffset.x()<<"/"<<_childOffset.y()<<endl;
|
|
|
|
|
|
|
|
KoRect const bound = obj->geometry();
|
|
|
|
TQRect zoomedBound = m_pDoc->zoomRect( KoRect(bound.left(), bound.top(),
|
|
|
|
bound.width(),
|
|
|
|
bound.height() ) );
|
|
|
|
#if 1
|
|
|
|
// kdDebug(36001) << "printRect(): Bounding rect of view: " << view
|
|
|
|
// << endl;
|
|
|
|
// kdDebug(36001) << "printRect(): Bounding rect of zoomed view: "
|
|
|
|
// << zoomedView << endl;
|
|
|
|
// kdDebug(36001) << "printRect(): Bounding rect of child: " << bound
|
|
|
|
// << endl;
|
|
|
|
// kdDebug(36001) << "printRect(): Bounding rect of zoomed child: "
|
|
|
|
// << zoomedBound << endl;
|
|
|
|
#endif
|
|
|
|
if ( obj->sheet() == m_pSheet && zoomedBound.intersects( zoomedView ) )
|
|
|
|
{
|
|
|
|
painter.save();
|
|
|
|
|
|
|
|
painter.translate( -zoomedView.left() + m_pDoc->zoomItX( topLeft.x() ),
|
|
|
|
-zoomedView.top() + m_pDoc->zoomItY( topLeft.y() ) );
|
|
|
|
|
|
|
|
//obj->draw( &painter );
|
|
|
|
painter.drawPixmap( m_pDoc->zoomRect( obj->geometry() ).topLeft(), *(*itObject)->p ); //draw the cached object
|
|
|
|
|
|
|
|
//painter.fillRect(zoomedBound, TQBrush("red")); //for debug purpose
|
|
|
|
painter.restore();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//Don't let obscuring cells and children overpaint this area
|
|
|
|
clipRegion -= TQRegion ( m_pDoc->zoomItX( leftBorderPts() + topLeft.x() ),
|
|
|
|
m_pDoc->zoomItY( topBorderPts() + topLeft.y() ),
|
|
|
|
m_pDoc->zoomItX( xpos ),
|
|
|
|
m_pDoc->zoomItY( ypos ) );
|
|
|
|
painter.setClipRegion( clipRegion );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SheetPrint::printHeaderFooter( TQPainter &painter, int pageNo )
|
|
|
|
{
|
|
|
|
double w;
|
|
|
|
double headFootDistance = MM_TO_POINT( 10.0 /*mm*/ ) / m_dZoom;
|
|
|
|
TQFont font( "Times" );
|
|
|
|
font.setPointSizeFloat( 0.01 * m_pDoc->zoom() *
|
|
|
|
/* Font size of 10 */ 10.0 / m_dZoom );
|
|
|
|
painter.setFont( font );
|
|
|
|
TQFontMetrics fm = painter.fontMetrics();
|
|
|
|
|
|
|
|
// print head line left
|
|
|
|
w = fm.width( headLeft( pageNo, m_pSheet->sheetName() ) ) / m_dZoom;
|
|
|
|
if ( w > 0 )
|
|
|
|
painter.drawText( m_pDoc->zoomItX( leftBorderPts() ),
|
|
|
|
m_pDoc->zoomItY( headFootDistance ),
|
|
|
|
headLeft( pageNo, m_pSheet->sheetName() ) );
|
|
|
|
// print head line middle
|
|
|
|
w = fm.width( headMid( pageNo, m_pSheet->sheetName() ) ) / m_dZoom;
|
|
|
|
if ( w > 0 )
|
|
|
|
painter.drawText( (int) ( m_pDoc->zoomItX( leftBorderPts() ) +
|
|
|
|
( m_pDoc->zoomItX( prinsheetWidthPts() ) -
|
|
|
|
w ) / 2.0 ),
|
|
|
|
m_pDoc->zoomItY( headFootDistance ),
|
|
|
|
headMid( pageNo, m_pSheet->sheetName() ) );
|
|
|
|
// print head line right
|
|
|
|
w = fm.width( headRight( pageNo, m_pSheet->sheetName() ) ) / m_dZoom;
|
|
|
|
if ( w > 0 )
|
|
|
|
painter.drawText( m_pDoc->zoomItX( leftBorderPts() +
|
|
|
|
prinsheetWidthPts() ) - (int) w,
|
|
|
|
m_pDoc->zoomItY( headFootDistance ),
|
|
|
|
headRight( pageNo, m_pSheet->sheetName() ) );
|
|
|
|
|
|
|
|
// print foot line left
|
|
|
|
w = fm.width( footLeft( pageNo, m_pSheet->sheetName() ) ) / m_dZoom;
|
|
|
|
if ( w > 0 )
|
|
|
|
painter.drawText( m_pDoc->zoomItX( leftBorderPts() ),
|
|
|
|
m_pDoc->zoomItY( paperHeightPts() - headFootDistance ),
|
|
|
|
footLeft( pageNo, m_pSheet->sheetName() ) );
|
|
|
|
// print foot line middle
|
|
|
|
w = fm.width( footMid( pageNo, m_pSheet->sheetName() ) ) / m_dZoom;
|
|
|
|
if ( w > 0 )
|
|
|
|
painter.drawText( (int) ( m_pDoc->zoomItX( leftBorderPts() ) +
|
|
|
|
( m_pDoc->zoomItX( prinsheetWidthPts() ) -
|
|
|
|
w ) / 2.0 ),
|
|
|
|
m_pDoc->zoomItY( paperHeightPts() - headFootDistance ),
|
|
|
|
footMid( pageNo, m_pSheet->sheetName() ) );
|
|
|
|
// print foot line right
|
|
|
|
w = fm.width( footRight( pageNo, m_pSheet->sheetName() ) ) / m_dZoom;
|
|
|
|
if ( w > 0 )
|
|
|
|
painter.drawText( m_pDoc->zoomItX( leftBorderPts() +
|
|
|
|
prinsheetWidthPts() ) -
|
|
|
|
(int) w,
|
|
|
|
m_pDoc->zoomItY( paperHeightPts() - headFootDistance ),
|
|
|
|
footRight( pageNo, m_pSheet->sheetName() ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool SheetPrint::isOnNewPageX( int _column )
|
|
|
|
{
|
|
|
|
if( _column > m_maxCheckedNewPageX )
|
|
|
|
updateNewPageX( _column );
|
|
|
|
|
|
|
|
//Are these the edges of the print range?
|
|
|
|
if ( _column == m_printRange.left() || _column == m_printRange.right() + 1 )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
//beyond the print range it's always false
|
|
|
|
if ( _column < m_printRange.left() || _column > m_printRange.right() )
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Now check if we find the column already in the list
|
|
|
|
if ( m_lnewPageListX.findIndex( _column ) != -1 )
|
|
|
|
{
|
|
|
|
if( _column > m_maxCheckedNewPageX )
|
|
|
|
m_maxCheckedNewPageX = _column;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SheetPrint::updateNewPageX( int _column )
|
|
|
|
{
|
|
|
|
float offset = 0.0;
|
|
|
|
|
|
|
|
//Are these the edges of the print range?
|
|
|
|
if ( _column == m_printRange.left() || _column == m_printRange.right() + 1 )
|
|
|
|
{
|
|
|
|
if( _column > m_maxCheckedNewPageX )
|
|
|
|
m_maxCheckedNewPageX = _column;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
//We don't check beyond the print range
|
|
|
|
if ( _column < m_printRange.left() || _column > m_printRange.right() )
|
|
|
|
{
|
|
|
|
if( _column > m_maxCheckedNewPageX )
|
|
|
|
m_maxCheckedNewPageX = _column;
|
|
|
|
if ( _column > m_printRange.right() )
|
|
|
|
{
|
|
|
|
if ( m_lnewPageListX.last().endItem()==0 )
|
|
|
|
m_lnewPageListX.last().setEndItem( m_printRange.right() );
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
//If we start, then add the left printrange
|
|
|
|
if ( m_lnewPageListX.empty() )
|
|
|
|
m_lnewPageListX.append( m_printRange.left() ); //Add the first entry
|
|
|
|
|
|
|
|
//If _column is greater than the last entry, we need to calculate the result
|
|
|
|
if ( _column > m_lnewPageListX.last().startItem() &&
|
|
|
|
_column > m_maxCheckedNewPageX ) //this columns hasn't been calculated before
|
|
|
|
{
|
|
|
|
int startCol = m_lnewPageListX.last().startItem();
|
|
|
|
int col = startCol;
|
|
|
|
double x = m_pSheet->columnFormat( col )->dblWidth();
|
|
|
|
|
|
|
|
//Add repeated column width, when necessary
|
|
|
|
if ( col > m_printRepeatColumns.first )
|
|
|
|
{
|
|
|
|
x += m_dPrintRepeatColumnsWidth;
|
|
|
|
offset = m_dPrintRepeatColumnsWidth;
|
|
|
|
}
|
|
|
|
|
|
|
|
while ( ( col <= _column ) && ( col < m_printRange.right() ) )
|
|
|
|
{
|
|
|
|
if ( x > prinsheetWidthPts() ) //end of page?
|
|
|
|
{
|
|
|
|
//We found a new page, so add it to the list
|
|
|
|
m_lnewPageListX.append( col );
|
|
|
|
|
|
|
|
//Now store into the previous entry the enditem and the width
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator it;
|
|
|
|
it = findNewPageColumn( startCol );
|
|
|
|
(*it).setEndItem( col - 1 );
|
|
|
|
(*it).setSize( x - m_pSheet->columnFormat( col )->dblWidth() );
|
|
|
|
(*it).setOffset( offset );
|
|
|
|
|
|
|
|
//start a new page
|
|
|
|
startCol = col;
|
|
|
|
if ( col == _column )
|
|
|
|
{
|
|
|
|
if( _column > m_maxCheckedNewPageX )
|
|
|
|
m_maxCheckedNewPageX = _column;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
x = m_pSheet->columnFormat( col )->dblWidth();
|
|
|
|
if ( col >= m_printRepeatColumns.first )
|
|
|
|
{
|
|
|
|
x += m_dPrintRepeatColumnsWidth;
|
|
|
|
offset = m_dPrintRepeatColumnsWidth;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
col++;
|
|
|
|
x += m_pSheet->columnFormat( col )->dblWidth();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( _column > m_maxCheckedNewPageX )
|
|
|
|
m_maxCheckedNewPageX = _column;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool SheetPrint::isOnNewPageY( int _row )
|
|
|
|
{
|
|
|
|
if( _row > m_maxCheckedNewPageY )
|
|
|
|
updateNewPageY( _row );
|
|
|
|
|
|
|
|
//Are these the edges of the print range?
|
|
|
|
if ( _row == m_printRange.top() || _row == m_printRange.bottom() + 1 )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
//beyond the print range it's always false
|
|
|
|
if ( _row < m_printRange.top() || _row > m_printRange.bottom() )
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Now check if we find the row already in the list
|
|
|
|
if ( m_lnewPageListY.findIndex( _row ) != -1 )
|
|
|
|
{
|
|
|
|
if( _row > m_maxCheckedNewPageY )
|
|
|
|
m_maxCheckedNewPageY = _row;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SheetPrint::updateNewPageY( int _row )
|
|
|
|
{
|
|
|
|
float offset = 0.0;
|
|
|
|
|
|
|
|
//Are these the edges of the print range?
|
|
|
|
if ( _row == m_printRange.top() || _row == m_printRange.bottom() + 1 )
|
|
|
|
{
|
|
|
|
if( _row > m_maxCheckedNewPageY )
|
|
|
|
m_maxCheckedNewPageY = _row;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
//beyond the print range it's always false
|
|
|
|
if ( _row < m_printRange.top() || _row > m_printRange.bottom() )
|
|
|
|
{
|
|
|
|
if( _row > m_maxCheckedNewPageY )
|
|
|
|
m_maxCheckedNewPageY = _row;
|
|
|
|
if ( _row > m_printRange.bottom() )
|
|
|
|
{
|
|
|
|
if ( m_lnewPageListY.last().endItem()==0 )
|
|
|
|
m_lnewPageListY.last().setEndItem( m_printRange.bottom() );
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
//If we start, then add the top printrange
|
|
|
|
if ( m_lnewPageListY.empty() )
|
|
|
|
m_lnewPageListY.append( m_printRange.top() ); //Add the first entry
|
|
|
|
|
|
|
|
//If _column is greater than the last entry, we need to calculate the result
|
|
|
|
if ( _row > m_lnewPageListY.last().startItem() &&
|
|
|
|
_row > m_maxCheckedNewPageY ) //this columns hasn't been calculated before
|
|
|
|
{
|
|
|
|
int startRow = m_lnewPageListY.last().startItem();
|
|
|
|
int row = startRow;
|
|
|
|
double y = m_pSheet->rowFormat( row )->dblHeight();
|
|
|
|
|
|
|
|
//Add repeated row height, when necessary
|
|
|
|
if ( row > m_printRepeatRows.first )
|
|
|
|
{
|
|
|
|
y += m_dPrintRepeatRowsHeight;
|
|
|
|
offset = m_dPrintRepeatRowsHeight;
|
|
|
|
}
|
|
|
|
|
|
|
|
while ( ( row <= _row ) && ( row < m_printRange.bottom() ) )
|
|
|
|
{
|
|
|
|
if ( y > prinsheetHeightPts() )
|
|
|
|
{
|
|
|
|
//We found a new page, so add it to the list
|
|
|
|
m_lnewPageListY.append( row );
|
|
|
|
|
|
|
|
//Now store into the previous entry the enditem and the width
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator it;
|
|
|
|
it = findNewPageRow( startRow );
|
|
|
|
(*it).setEndItem( row - 1 );
|
|
|
|
(*it).setSize( y - m_pSheet->rowFormat( row )->dblHeight() );
|
|
|
|
(*it).setOffset( offset );
|
|
|
|
|
|
|
|
//start a new page
|
|
|
|
startRow = row;
|
|
|
|
if ( row == _row )
|
|
|
|
{
|
|
|
|
if( _row > m_maxCheckedNewPageY )
|
|
|
|
m_maxCheckedNewPageY = _row;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
y = m_pSheet->rowFormat( row )->dblHeight();
|
|
|
|
if ( row >= m_printRepeatRows.first )
|
|
|
|
{
|
|
|
|
y += m_dPrintRepeatRowsHeight;
|
|
|
|
offset = m_dPrintRepeatRowsHeight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
row++;
|
|
|
|
y += m_pSheet->rowFormat( row )->dblHeight();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( _row > m_maxCheckedNewPageY )
|
|
|
|
m_maxCheckedNewPageY = _row;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SheetPrint::updateNewPageListX( int _col )
|
|
|
|
{
|
|
|
|
//If the new range is after the first entry, we need to delete the whole list
|
|
|
|
if ( m_lnewPageListX.first().startItem() != m_printRange.left() ||
|
|
|
|
_col == 0 )
|
|
|
|
{
|
|
|
|
m_lnewPageListX.clear();
|
|
|
|
m_maxCheckedNewPageX = m_printRange.left();
|
|
|
|
m_lnewPageListX.append( m_printRange.left() );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( _col < m_lnewPageListX.last().startItem() )
|
|
|
|
{
|
|
|
|
//Find the page entry for this column
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator it;
|
|
|
|
it = m_lnewPageListX.find( _col );
|
|
|
|
while ( ( it == m_lnewPageListX.end() ) && _col > 0 )
|
|
|
|
{
|
|
|
|
_col--;
|
|
|
|
it = m_lnewPageListX.find( _col );
|
|
|
|
}
|
|
|
|
|
|
|
|
//Remove later pages
|
|
|
|
while ( it != m_lnewPageListX.end() )
|
|
|
|
it = m_lnewPageListX.remove( it );
|
|
|
|
|
|
|
|
//Add default page when list is now empty
|
|
|
|
if ( m_lnewPageListX.empty() )
|
|
|
|
m_lnewPageListX.append( m_printRange.left() );
|
|
|
|
}
|
|
|
|
|
|
|
|
m_maxCheckedNewPageX = _col;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::updateNewPageListY( int _row )
|
|
|
|
{
|
|
|
|
//If the new range is after the first entry, we need to delete the whole list
|
|
|
|
if ( m_lnewPageListY.first().startItem() != m_printRange.top() ||
|
|
|
|
_row == 0 )
|
|
|
|
{
|
|
|
|
m_lnewPageListY.clear();
|
|
|
|
m_maxCheckedNewPageY = m_printRange.top();
|
|
|
|
m_lnewPageListY.append( m_printRange.top() );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( _row < m_lnewPageListY.last().startItem() )
|
|
|
|
{
|
|
|
|
//Find the page entry for this row
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator it;
|
|
|
|
it = m_lnewPageListY.find( _row );
|
|
|
|
while ( ( it == m_lnewPageListY.end() ) && _row > 0 )
|
|
|
|
{
|
|
|
|
_row--;
|
|
|
|
it = m_lnewPageListY.find( _row );
|
|
|
|
}
|
|
|
|
|
|
|
|
//Remove later pages
|
|
|
|
while ( it != m_lnewPageListY.end() )
|
|
|
|
it = m_lnewPageListY.remove( it );
|
|
|
|
|
|
|
|
//Add default page when list is now empty
|
|
|
|
if ( m_lnewPageListY.empty() )
|
|
|
|
m_lnewPageListY.append( m_printRange.top() );
|
|
|
|
}
|
|
|
|
|
|
|
|
m_maxCheckedNewPageY = _row;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::definePrintRange( Selection* selectionInfo )
|
|
|
|
{
|
|
|
|
if ( !selectionInfo->isSingular() )
|
|
|
|
{
|
|
|
|
KCommand* command = new DefinePrintRangeCommand( m_pSheet );
|
|
|
|
m_pDoc->addCommand( command );
|
|
|
|
setPrintRange( selectionInfo->selection() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::resetPrintRange ()
|
|
|
|
{
|
|
|
|
KCommand* command = new DefinePrintRangeCommand( m_pSheet );
|
|
|
|
m_pDoc->addCommand( command );
|
|
|
|
setPrintRange( TQRect( TQPoint( 1, 1 ), TQPoint( KS_colMax, KS_rowMax ) ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::replaceHeadFootLineMacro ( TQString &_text, const TQString &_search, const TQString &_replace )
|
|
|
|
{
|
|
|
|
if ( _search != _replace )
|
|
|
|
_text.replace ( TQString( "<" + _search + ">" ), "<" + _replace + ">" );
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString SheetPrint::localizeHeadFootLine ( const TQString &_text )
|
|
|
|
{
|
|
|
|
TQString tmp = _text;
|
|
|
|
|
|
|
|
/*
|
|
|
|
i18n:
|
|
|
|
Please use the same words (even upper/lower case) as in
|
|
|
|
KoPageLayoutDia.cc function setupTab2(), without the brakets "<" and ">"
|
|
|
|
*/
|
|
|
|
replaceHeadFootLineMacro ( tmp, "page", i18n("page") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "pages", i18n("pages") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "file", i18n("file") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "name", i18n("name") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "time", i18n("time") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "date", i18n("date") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "author", i18n("author") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "email", i18n("email") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "org", i18n("org") );
|
|
|
|
replaceHeadFootLineMacro ( tmp, "sheet", i18n("sheet") );
|
|
|
|
|
|
|
|
return tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TQString SheetPrint::delocalizeHeadFootLine ( const TQString &_text )
|
|
|
|
{
|
|
|
|
TQString tmp = _text;
|
|
|
|
|
|
|
|
/*
|
|
|
|
i18n:
|
|
|
|
Please use the same words (even upper/lower case) as in
|
|
|
|
KoPageLayoutDia.cc function setupTab2(), without the brakets "<" and ">"
|
|
|
|
*/
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("page"), "page" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("pages"), "pages" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("file"), "file" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("name"), "name" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("time"), "time" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("date"), "date" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("author"), "author" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("email"), "email" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("org"), "org" );
|
|
|
|
replaceHeadFootLineMacro ( tmp, i18n("sheet"), "sheet" );
|
|
|
|
|
|
|
|
return tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
KoHeadFoot SheetPrint::headFootLine() const
|
|
|
|
{
|
|
|
|
KoHeadFoot hf;
|
|
|
|
hf.headLeft = m_headLeft;
|
|
|
|
hf.headRight = m_headRight;
|
|
|
|
hf.headMid = m_headMid;
|
|
|
|
hf.footLeft = m_footLeft;
|
|
|
|
hf.footRight = m_footRight;
|
|
|
|
hf.footMid = m_footMid;
|
|
|
|
|
|
|
|
return hf;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SheetPrint::setHeadFootLine( const TQString &_headl, const TQString &_headm, const TQString &_headr,
|
|
|
|
const TQString &_footl, const TQString &_footm, const TQString &_footr )
|
|
|
|
{
|
|
|
|
if ( m_pSheet->isProtected() )
|
|
|
|
NO_MODIFICATION_POSSIBLE;
|
|
|
|
|
|
|
|
m_headLeft = _headl;
|
|
|
|
m_headRight = _headr;
|
|
|
|
m_headMid = _headm;
|
|
|
|
m_footLeft = _footl;
|
|
|
|
m_footRight = _footr;
|
|
|
|
m_footMid = _footm;
|
|
|
|
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPaperOrientation( KoOrientation _orient )
|
|
|
|
{
|
|
|
|
if ( m_pSheet->isProtected() )
|
|
|
|
NO_MODIFICATION_POSSIBLE;
|
|
|
|
|
|
|
|
m_orientation = _orient;
|
|
|
|
calcPaperSize();
|
|
|
|
updatePrintRepeatColumnsWidth();
|
|
|
|
updatePrintRepeatRowsHeight();
|
|
|
|
updateNewPageListX( m_printRange.left() ); //Reset the list
|
|
|
|
updateNewPageListY( m_printRange.top() ); //Reset the list
|
|
|
|
|
|
|
|
if( m_pSheet->isShowPageBorders() )
|
|
|
|
emit sig_updateView( m_pSheet );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
KoPageLayout SheetPrint::paperLayout() const
|
|
|
|
{
|
|
|
|
KoPageLayout pl;
|
|
|
|
pl.format = m_paperFormat;
|
|
|
|
pl.orientation = m_orientation;
|
|
|
|
pl.ptWidth = m_paperWidth;
|
|
|
|
pl.ptHeight = m_paperHeight;
|
|
|
|
pl.ptLeft = m_leftBorder;
|
|
|
|
pl.ptRight = m_rightBorder;
|
|
|
|
pl.ptTop = m_topBorder;
|
|
|
|
pl.ptBottom = m_bottomBorder;
|
|
|
|
return pl;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SheetPrint::setPaperLayout( float _leftBorder, float _topBorder,
|
|
|
|
float _rightBorder, float _bottomBorder,
|
|
|
|
KoFormat _paper,
|
|
|
|
KoOrientation _orientation )
|
|
|
|
{
|
|
|
|
if ( m_pSheet->isProtected() )
|
|
|
|
NO_MODIFICATION_POSSIBLE;
|
|
|
|
|
|
|
|
m_leftBorder = _leftBorder;
|
|
|
|
m_rightBorder = _rightBorder;
|
|
|
|
m_topBorder = _topBorder;
|
|
|
|
m_bottomBorder = _bottomBorder;
|
|
|
|
m_paperFormat = _paper;
|
|
|
|
|
|
|
|
setPaperOrientation( _orientation ); //calcPaperSize() is done here already
|
|
|
|
|
|
|
|
// TQPtrListIterator<KoView> it( views() );
|
|
|
|
// for( ;it.current(); ++it )
|
|
|
|
// {
|
|
|
|
// View *v = static_cast<View *>( it.current() );
|
|
|
|
// We need to trigger the appropriate repaintings in the cells near the
|
|
|
|
// border of the page. The easiest way for this is to turn the borders
|
|
|
|
// off and on (or on and off if they were off).
|
|
|
|
// bool bBorderWasShown = v->activeSheet()->isShowPageBorders();
|
|
|
|
// v->activeSheet()->setShowPageBorders( !bBorderWasShown );
|
|
|
|
// v->activeSheet()->setShowPageBorders( bBorderWasShown );
|
|
|
|
// }
|
|
|
|
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPaperLayout( float _leftBorder, float _topBorder,
|
|
|
|
float _rightBorder, float _bottomBorder,
|
|
|
|
const TQString& _paper,
|
|
|
|
const TQString& _orientation )
|
|
|
|
{
|
|
|
|
if ( m_pSheet->isProtected() )
|
|
|
|
NO_MODIFICATION_POSSIBLE;
|
|
|
|
|
|
|
|
KoFormat f = paperFormat();
|
|
|
|
KoOrientation newOrientation = orientation();
|
|
|
|
|
|
|
|
if ( _orientation == "Portrait" )
|
|
|
|
newOrientation = PG_PORTRAIT;
|
|
|
|
else if ( _orientation == "Landscape" )
|
|
|
|
newOrientation = PG_LANDSCAPE;
|
|
|
|
|
|
|
|
|
|
|
|
TQString paper( _paper );
|
|
|
|
if ( paper[0].isDigit() ) // Custom format
|
|
|
|
{
|
|
|
|
const int i = paper.find( 'x' );
|
|
|
|
if ( i < 0 )
|
|
|
|
{
|
|
|
|
// We have nothing useful, so assume ISO A4
|
|
|
|
f = PG_DIN_A4;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
f = PG_CUSTOM;
|
|
|
|
m_paperWidth = paper.left(i).toFloat();
|
|
|
|
m_paperHeight = paper.mid(i+1).toFloat();
|
|
|
|
if ( m_paperWidth < 10.0 )
|
|
|
|
m_paperWidth = KoPageFormat::width( PG_DIN_A4, newOrientation );
|
|
|
|
if ( m_paperHeight < 10.0 )
|
|
|
|
m_paperHeight = KoPageFormat::height( PG_DIN_A4, newOrientation );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
f = KoPageFormat::formatFromString( paper );
|
|
|
|
if ( f == PG_CUSTOM )
|
|
|
|
// We have no idea about height or width, therefore assume ISO A4
|
|
|
|
f = PG_DIN_A4;
|
|
|
|
}
|
|
|
|
setPaperLayout( _leftBorder, _topBorder, _rightBorder, _bottomBorder, f, newOrientation );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::calcPaperSize()
|
|
|
|
{
|
|
|
|
if ( m_paperFormat != PG_CUSTOM )
|
|
|
|
{
|
|
|
|
m_paperWidth = KoPageFormat::width( m_paperFormat, m_orientation );
|
|
|
|
m_paperHeight = KoPageFormat::height( m_paperFormat, m_orientation );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator SheetPrint::findNewPageColumn( int col )
|
|
|
|
{
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator it;
|
|
|
|
for( it = m_lnewPageListX.begin(); it != m_lnewPageListX.end(); ++it )
|
|
|
|
{
|
|
|
|
if( (*it).startItem() == col )
|
|
|
|
return it;
|
|
|
|
}
|
|
|
|
return it;
|
|
|
|
// TQValueList<PrintNewPageEntry>::iterator it;
|
|
|
|
// it = m_lnewPageListX.find( startCol );
|
|
|
|
}
|
|
|
|
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator SheetPrint::findNewPageRow( int row )
|
|
|
|
{
|
|
|
|
TQValueList<PrintNewPageEntry>::iterator it;
|
|
|
|
for( it = m_lnewPageListY.begin(); it != m_lnewPageListY.end(); ++it )
|
|
|
|
{
|
|
|
|
if( (*it).startItem() == row )
|
|
|
|
return it;
|
|
|
|
}
|
|
|
|
return it;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TQString SheetPrint::paperFormatString()const
|
|
|
|
{
|
|
|
|
if ( m_paperFormat == PG_CUSTOM )
|
|
|
|
{
|
|
|
|
TQString tmp;
|
|
|
|
tmp.sprintf( "%fx%f", m_paperWidth, m_paperHeight );
|
|
|
|
return tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
return KoPageFormat::formatString( m_paperFormat );
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* SheetPrint::orientationString() const
|
|
|
|
{
|
|
|
|
switch( m_orientation )
|
|
|
|
{
|
|
|
|
case KPrinter::Portrait:
|
|
|
|
return "Portrait";
|
|
|
|
case KPrinter::Landscape:
|
|
|
|
return "Landscape";
|
|
|
|
}
|
|
|
|
|
|
|
|
kdWarning(36001)<<"SheetPrint: Unknown orientation, using now portrait"<<endl;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString SheetPrint::completeHeading( const TQString &_data, int _page, const TQString &_sheet ) const
|
|
|
|
{
|
|
|
|
TQString page( TQString::number( _page) );
|
|
|
|
TQString pages( TQString::number( m_uprintPages ) );
|
|
|
|
|
|
|
|
TQString pathFileName(m_pDoc->url().path());
|
|
|
|
if ( pathFileName.isNull() )
|
|
|
|
pathFileName="";
|
|
|
|
|
|
|
|
TQString fileName(m_pDoc->url().fileName());
|
|
|
|
if( fileName.isNull())
|
|
|
|
fileName="";
|
|
|
|
|
|
|
|
TQString t(TQTime::currentTime().toString());
|
|
|
|
TQString d(TQDate::currentDate().toString());
|
|
|
|
TQString ta;
|
|
|
|
if ( !_sheet.isEmpty() )
|
|
|
|
ta = _sheet;
|
|
|
|
|
|
|
|
KoDocumentInfo * info = m_pDoc->documentInfo();
|
|
|
|
KoDocumentInfoAuthor * authorPage = static_cast<KoDocumentInfoAuthor *>(info->page( "author" ));
|
|
|
|
TQString full_name;
|
|
|
|
TQString email_addr;
|
|
|
|
TQString organization;
|
|
|
|
TQString tmp;
|
|
|
|
if ( !authorPage )
|
|
|
|
kdWarning() << "Author information not found in Document Info !" << endl;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
full_name = authorPage->fullName();
|
|
|
|
email_addr = authorPage->email();
|
|
|
|
organization = authorPage->company();
|
|
|
|
}
|
|
|
|
|
|
|
|
char hostname[80];
|
|
|
|
struct passwd *p;
|
|
|
|
|
|
|
|
p = getpwuid(getuid());
|
|
|
|
gethostname(hostname, sizeof(hostname));
|
|
|
|
|
|
|
|
if(full_name.isEmpty())
|
|
|
|
full_name=p->pw_gecos;
|
|
|
|
|
|
|
|
if( email_addr.isEmpty())
|
|
|
|
email_addr = TQString("%1@%2").arg(p->pw_name).arg(hostname);
|
|
|
|
|
|
|
|
tmp = _data;
|
|
|
|
int pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<page>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 6, page );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<pages>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 7, pages );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<file>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 6, pathFileName );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<name>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 6, fileName );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<time>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 6, t );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<date>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 6, d );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<author>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 8, full_name );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<email>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 7, email_addr );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<org>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 5, organization );
|
|
|
|
pos = 0;
|
|
|
|
while ( ( pos = tmp.find( "<sheet>", pos ) ) != -1 )
|
|
|
|
tmp.replace( pos, 7, ta );
|
|
|
|
|
|
|
|
return tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPrintRange( const TQRect &_printRange )
|
|
|
|
{
|
|
|
|
if ( m_pSheet->isProtected() )
|
|
|
|
NO_MODIFICATION_POSSIBLE;
|
|
|
|
|
|
|
|
|
|
|
|
if ( m_printRange == _printRange )
|
|
|
|
return;
|
|
|
|
|
|
|
|
int oldLeft = m_printRange.left();
|
|
|
|
int oldTop = m_printRange.top();
|
|
|
|
m_printRange = _printRange;
|
|
|
|
|
|
|
|
//Refresh calculation of stored page breaks, the lower one of old and new
|
|
|
|
if ( oldLeft != _printRange.left() )
|
|
|
|
updateNewPageListX( TQMIN( oldLeft, _printRange.left() ) );
|
|
|
|
if ( oldTop != _printRange.top() )
|
|
|
|
updateNewPageListY( TQMIN( oldTop, _printRange.top() ) );
|
|
|
|
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
|
|
|
|
emit sig_updateView( m_pSheet );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPageLimitX( int pages )
|
|
|
|
{
|
|
|
|
//We do want an update in any case because the sheet content
|
|
|
|
//could have changed, thus we need to recalculate although
|
|
|
|
//it's the same setting!
|
|
|
|
// if( m_iPageLimitX == pages )
|
|
|
|
// return;
|
|
|
|
|
|
|
|
m_iPageLimitX = pages;
|
|
|
|
|
|
|
|
if( pages == 0 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
calculateZoomForPageLimitX();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPageLimitY( int pages )
|
|
|
|
{
|
|
|
|
//We do want an update in any case because the sheet content
|
|
|
|
//could have changed, thus we need to recalculate although
|
|
|
|
//it's the same setting!
|
|
|
|
// if( m_iPageLimitY == pages )
|
|
|
|
// return;
|
|
|
|
|
|
|
|
m_iPageLimitY = pages;
|
|
|
|
|
|
|
|
if( pages == 0 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
calculateZoomForPageLimitY();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::calculateZoomForPageLimitX()
|
|
|
|
{
|
|
|
|
kdDebug() << "Calculating zoom for X limit" << endl;
|
|
|
|
if( m_iPageLimitX == 0 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
double origZoom = m_dZoom;
|
|
|
|
|
|
|
|
if( m_dZoom < 1.0 )
|
|
|
|
m_dZoom = 1.0;
|
|
|
|
|
|
|
|
TQRect printRange = cellsPrintRange();
|
|
|
|
updateNewPageX( m_pSheet->rightColumn( m_pSheet->dblColumnPos( printRange.right() ) + prinsheetWidthPts() ) );
|
|
|
|
int currentPages = pagesX( printRange );
|
|
|
|
|
|
|
|
if (currentPages <= m_iPageLimitX)
|
|
|
|
return;
|
|
|
|
|
|
|
|
//calculating a factor for scaling the zoom down makes it lots faster
|
|
|
|
double factor = (double)m_iPageLimitX/(double)currentPages +
|
|
|
|
1-(double)currentPages/((double)currentPages+1); //add possible error;
|
|
|
|
kdDebug() << "Calculated factor for scaling m_dZoom: " << factor << endl;
|
|
|
|
m_dZoom = m_dZoom*factor;
|
|
|
|
|
|
|
|
kdDebug() << "New exact zoom: " << m_dZoom << endl;
|
|
|
|
|
|
|
|
if (m_dZoom < 0.01)
|
|
|
|
m_dZoom = 0.01;
|
|
|
|
if (m_dZoom > 1.0)
|
|
|
|
m_dZoom = 1.0;
|
|
|
|
|
|
|
|
m_dZoom = (((int)(m_dZoom*100 + 0.5))/100.0);
|
|
|
|
|
|
|
|
kdDebug() << "New rounded zoom: " << m_dZoom << endl;
|
|
|
|
|
|
|
|
updatePrintRepeatColumnsWidth();
|
|
|
|
updateNewPageListX( 0 );
|
|
|
|
updateNewPageX( m_pSheet->rightColumn( m_pSheet->dblColumnPos( printRange.right() ) + prinsheetWidthPts() ) );
|
|
|
|
currentPages = pagesX( printRange );
|
|
|
|
|
|
|
|
kdDebug() << "Number of pages with this zoom: " << currentPages << endl;
|
|
|
|
|
|
|
|
while( ( currentPages > m_iPageLimitX ) && ( m_dZoom > 0.01 ) )
|
|
|
|
{
|
|
|
|
m_dZoom -= 0.01;
|
|
|
|
updatePrintRepeatColumnsWidth();
|
|
|
|
updateNewPageListX( 0 );
|
|
|
|
updateNewPageX( m_pSheet->rightColumn( m_pSheet->dblColumnPos( printRange.right() ) + prinsheetWidthPts() ) );
|
|
|
|
currentPages = pagesX( printRange );
|
|
|
|
kdDebug() << "Looping -0.01; current zoom: " << m_dZoom << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( m_dZoom < origZoom )
|
|
|
|
{
|
|
|
|
double newZoom = m_dZoom;
|
|
|
|
m_dZoom += 1.0; //set it to something different
|
|
|
|
setZoom( newZoom, false );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
m_dZoom = origZoom;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::calculateZoomForPageLimitY()
|
|
|
|
{
|
|
|
|
kdDebug() << "Calculating zoom for Y limit" << endl;
|
|
|
|
if( m_iPageLimitY == 0 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
double origZoom = m_dZoom;
|
|
|
|
|
|
|
|
if( m_dZoom < 1.0 )
|
|
|
|
m_dZoom = 1.0;
|
|
|
|
|
|
|
|
TQRect printRange = cellsPrintRange();
|
|
|
|
updateNewPageY( m_pSheet->bottomRow( m_pSheet->dblRowPos( printRange.bottom() ) + prinsheetHeightPts() ) );
|
|
|
|
int currentPages = pagesY( printRange );
|
|
|
|
|
|
|
|
if (currentPages <= m_iPageLimitY)
|
|
|
|
return;
|
|
|
|
|
|
|
|
double factor = (double)m_iPageLimitY/(double)currentPages +
|
|
|
|
1-(double)currentPages/((double)currentPages+1); //add possible error
|
|
|
|
kdDebug() << "Calculated factor for scaling m_dZoom: " << factor << endl;
|
|
|
|
m_dZoom = m_dZoom*factor;
|
|
|
|
|
|
|
|
kdDebug() << "New exact zoom: " << m_dZoom << endl;
|
|
|
|
|
|
|
|
if (m_dZoom < 0.01)
|
|
|
|
m_dZoom = 0.01;
|
|
|
|
if (m_dZoom > 1.0)
|
|
|
|
m_dZoom = 1.0;
|
|
|
|
|
|
|
|
m_dZoom = (((int)(m_dZoom*100 + 0.5))/100.0);
|
|
|
|
|
|
|
|
kdDebug() << "New rounded zoom: " << m_dZoom << endl;
|
|
|
|
|
|
|
|
updatePrintRepeatRowsHeight();
|
|
|
|
updateNewPageListY( 0 );
|
|
|
|
updateNewPageY( m_pSheet->bottomRow( m_pSheet->dblRowPos( printRange.bottom() ) + prinsheetHeightPts() ) );
|
|
|
|
currentPages = pagesY( printRange );
|
|
|
|
|
|
|
|
kdDebug() << "Number of pages with this zoom: " << currentPages << endl;
|
|
|
|
|
|
|
|
while( ( currentPages > m_iPageLimitY ) && ( m_dZoom > 0.01 ) )
|
|
|
|
{
|
|
|
|
m_dZoom -= 0.01;
|
|
|
|
updatePrintRepeatRowsHeight();
|
|
|
|
updateNewPageListY( 0 );
|
|
|
|
updateNewPageY( m_pSheet->bottomRow( m_pSheet->dblRowPos( printRange.bottom() ) + prinsheetHeightPts() ) );
|
|
|
|
currentPages = pagesY( printRange );
|
|
|
|
kdDebug() << "Looping -0.01; current zoom: " << m_dZoom << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( m_dZoom < origZoom )
|
|
|
|
{
|
|
|
|
double newZoom = m_dZoom;
|
|
|
|
m_dZoom += 1.0; //set it to something different
|
|
|
|
setZoom( newZoom, false );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
m_dZoom = origZoom;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPrintGrid( bool _printGrid )
|
|
|
|
{
|
|
|
|
if ( m_bPrintGrid == _printGrid )
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_bPrintGrid = _printGrid;
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPrintObjects( bool _printObjects )
|
|
|
|
{
|
|
|
|
if ( m_bPrintObjects == _printObjects )
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_bPrintObjects = _printObjects;
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPrintCharts( bool _printCharts )
|
|
|
|
{
|
|
|
|
if ( m_bPrintCharts == _printCharts )
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_bPrintCharts = _printCharts;
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPrintGraphics( bool _printGraphics )
|
|
|
|
{
|
|
|
|
if ( m_bPrintGraphics == _printGraphics )
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_bPrintGraphics = _printGraphics;
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPrintCommentIndicator( bool _printCommentIndicator )
|
|
|
|
{
|
|
|
|
if ( m_bPrintCommentIndicator == _printCommentIndicator )
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_bPrintCommentIndicator = _printCommentIndicator;
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPrintFormulaIndicator( bool _printFormulaIndicator )
|
|
|
|
{
|
|
|
|
if( m_bPrintFormulaIndicator == _printFormulaIndicator )
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_bPrintFormulaIndicator = _printFormulaIndicator;
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
void SheetPrint::updatePrintRepeatColumnsWidth()
|
|
|
|
{
|
|
|
|
m_dPrintRepeatColumnsWidth = 0.0;
|
|
|
|
if( m_printRepeatColumns.first != 0 )
|
|
|
|
{
|
|
|
|
for( int i = m_printRepeatColumns.first; i <= m_printRepeatColumns.second; i++ )
|
|
|
|
{
|
|
|
|
m_dPrintRepeatColumnsWidth += m_pSheet->columnFormat( i )->dblWidth();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::updatePrintRepeatRowsHeight()
|
|
|
|
{
|
|
|
|
m_dPrintRepeatRowsHeight = 0.0;
|
|
|
|
if ( m_printRepeatRows.first != 0 )
|
|
|
|
{
|
|
|
|
for ( int i = m_printRepeatRows.first; i <= m_printRepeatRows.second; i++)
|
|
|
|
{
|
|
|
|
m_dPrintRepeatRowsHeight += m_pSheet->rowFormat( i )->dblHeight();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SheetPrint::setPrintRepeatColumns( TQPair<int, int> _printRepeatColumns )
|
|
|
|
{
|
|
|
|
//Bring arguments in order
|
|
|
|
if ( _printRepeatColumns.first > _printRepeatColumns.second )
|
|
|
|
{
|
|
|
|
int tmp = _printRepeatColumns.first;
|
|
|
|
_printRepeatColumns.first = _printRepeatColumns.second;
|
|
|
|
_printRepeatColumns.second = tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
//If old are equal to the new setting, nothing is to be done at all
|
|
|
|
if ( m_printRepeatColumns == _printRepeatColumns )
|
|
|
|
return;
|
|
|
|
|
|
|
|
int oldFirst = m_printRepeatColumns.first;
|
|
|
|
m_printRepeatColumns = _printRepeatColumns;
|
|
|
|
|
|
|
|
//Recalcualte the space needed for the repeated columns
|
|
|
|
updatePrintRepeatColumnsWidth();
|
|
|
|
|
|
|
|
//Refresh calculation of stored page breaks, the lower one of old and new
|
|
|
|
updateNewPageListX( TQMIN( oldFirst, _printRepeatColumns.first ) );
|
|
|
|
|
|
|
|
//Refresh view, if page borders are shown
|
|
|
|
if ( m_pSheet->isShowPageBorders() )
|
|
|
|
emit sig_updateView( m_pSheet );
|
|
|
|
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setPrintRepeatRows( TQPair<int, int> _printRepeatRows )
|
|
|
|
{
|
|
|
|
//Bring arguments in order
|
|
|
|
if ( _printRepeatRows.first > _printRepeatRows.second )
|
|
|
|
{
|
|
|
|
int tmp = _printRepeatRows.first;
|
|
|
|
_printRepeatRows.first = _printRepeatRows.second;
|
|
|
|
_printRepeatRows.second = tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
//If old are equal to the new setting, nothing is to be done at all
|
|
|
|
if ( m_printRepeatRows == _printRepeatRows )
|
|
|
|
return;
|
|
|
|
|
|
|
|
int oldFirst = m_printRepeatRows.first;
|
|
|
|
m_printRepeatRows = _printRepeatRows;
|
|
|
|
|
|
|
|
//Recalcualte the space needed for the repeated rows
|
|
|
|
updatePrintRepeatRowsHeight();
|
|
|
|
|
|
|
|
//Refresh calculation of stored page breaks, the lower one of old and new
|
|
|
|
updateNewPageListY( TQMIN( oldFirst, _printRepeatRows.first ) );
|
|
|
|
|
|
|
|
//Refresh view, if page borders are shown
|
|
|
|
if ( m_pSheet->isShowPageBorders() )
|
|
|
|
emit sig_updateView( m_pSheet );
|
|
|
|
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::insertColumn( int col, int nbCol )
|
|
|
|
{
|
|
|
|
//update print range, when it has been defined
|
|
|
|
if ( m_printRange != TQRect( TQPoint(1, 1), TQPoint(KS_colMax, KS_rowMax) ) )
|
|
|
|
{
|
|
|
|
int left = m_printRange.left();
|
|
|
|
int right = m_printRange.right();
|
|
|
|
|
|
|
|
for( int i = 0; i <= nbCol; i++ )
|
|
|
|
{
|
|
|
|
if ( left >= col ) left++;
|
|
|
|
if ( right >= col ) right++;
|
|
|
|
}
|
|
|
|
//Validity checks
|
|
|
|
if ( left > KS_colMax ) left = KS_colMax;
|
|
|
|
if ( right > KS_colMax ) right = KS_colMax;
|
|
|
|
setPrintRange( TQRect( TQPoint( left, m_printRange.top() ),
|
|
|
|
TQPoint( right, m_printRange.bottom() ) ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::insertRow( int row, int nbRow )
|
|
|
|
{
|
|
|
|
//update print range, when it has been defined
|
|
|
|
if ( m_printRange != TQRect( TQPoint(1, 1), TQPoint(KS_colMax, KS_rowMax) ) )
|
|
|
|
{
|
|
|
|
int top = m_printRange.top();
|
|
|
|
int bottom = m_printRange.bottom();
|
|
|
|
|
|
|
|
for( int i = 0; i <= nbRow; i++ )
|
|
|
|
{
|
|
|
|
if ( top >= row ) top++;
|
|
|
|
if ( bottom >= row ) bottom++;
|
|
|
|
}
|
|
|
|
//Validity checks
|
|
|
|
if ( top > KS_rowMax ) top = KS_rowMax;
|
|
|
|
if ( bottom > KS_rowMax ) bottom = KS_rowMax;
|
|
|
|
setPrintRange( TQRect( TQPoint( m_printRange.left(), top ),
|
|
|
|
TQPoint( m_printRange.right(), bottom ) ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::removeColumn( int col, int nbCol )
|
|
|
|
{
|
|
|
|
//update print range, when it has been defined
|
|
|
|
if ( m_printRange != TQRect( TQPoint(1, 1), TQPoint(KS_colMax, KS_rowMax) ) )
|
|
|
|
{
|
|
|
|
int left = m_printRange.left();
|
|
|
|
int right = m_printRange.right();
|
|
|
|
|
|
|
|
for( int i = 0; i <= nbCol; i++ )
|
|
|
|
{
|
|
|
|
if ( left > col ) left--;
|
|
|
|
if ( right >= col ) right--;
|
|
|
|
}
|
|
|
|
//Validity checks
|
|
|
|
if ( left < 1 ) left = 1;
|
|
|
|
if ( right < 1 ) right = 1;
|
|
|
|
setPrintRange( TQRect( TQPoint( left, m_printRange.top() ),
|
|
|
|
TQPoint( right, m_printRange.bottom() ) ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
//update repeat columns, when it has been defined
|
|
|
|
if ( m_printRepeatColumns.first != 0 )
|
|
|
|
{
|
|
|
|
int left = m_printRepeatColumns.first;
|
|
|
|
int right = m_printRepeatColumns.second;
|
|
|
|
|
|
|
|
for( int i = 0; i <= nbCol; i++ )
|
|
|
|
{
|
|
|
|
if ( left > col ) left--;
|
|
|
|
if ( right >= col ) right--;
|
|
|
|
}
|
|
|
|
//Validity checks
|
|
|
|
if ( left < 1 ) left = 1;
|
|
|
|
if ( right < 1 ) right = 1;
|
|
|
|
setPrintRepeatColumns ( tqMakePair( left, right ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::removeRow( int row, int nbRow )
|
|
|
|
{
|
|
|
|
//update print range, when it has been defined
|
|
|
|
if ( m_printRange != TQRect( TQPoint(1, 1), TQPoint(KS_colMax, KS_rowMax) ) )
|
|
|
|
{
|
|
|
|
int top = m_printRange.top();
|
|
|
|
int bottom = m_printRange.bottom();
|
|
|
|
|
|
|
|
for( int i = 0; i <= nbRow; i++ )
|
|
|
|
{
|
|
|
|
if ( top > row ) top--;
|
|
|
|
if ( bottom >= row ) bottom--;
|
|
|
|
}
|
|
|
|
//Validity checks
|
|
|
|
if ( top < 1 ) top = 1;
|
|
|
|
if ( bottom < 1 ) bottom = 1;
|
|
|
|
setPrintRange( TQRect( TQPoint( m_printRange.left(), top ),
|
|
|
|
TQPoint( m_printRange.right(), bottom ) ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
//update repeat rows, when it has been defined
|
|
|
|
if ( m_printRepeatRows.first != 0 )
|
|
|
|
{
|
|
|
|
int top = m_printRepeatRows.first;
|
|
|
|
int bottom = m_printRepeatRows.second;
|
|
|
|
|
|
|
|
for( int i = 0; i <= nbRow; i++ )
|
|
|
|
{
|
|
|
|
if ( top > row ) top--;
|
|
|
|
if ( bottom >= row ) bottom--;
|
|
|
|
}
|
|
|
|
//Validity checks
|
|
|
|
if ( top < 1 ) top = 1;
|
|
|
|
if ( bottom < 1 ) bottom = 1;
|
|
|
|
setPrintRepeatRows( tqMakePair( top, bottom ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SheetPrint::setZoom( double _zoom, bool checkPageLimit )
|
|
|
|
{
|
|
|
|
if( m_dZoom == _zoom )
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_dZoom = _zoom;
|
|
|
|
updatePrintRepeatColumnsWidth();
|
|
|
|
updatePrintRepeatRowsHeight();
|
|
|
|
updateNewPageListX( 0 );
|
|
|
|
updateNewPageListY( 0 );
|
|
|
|
if( m_pSheet->isShowPageBorders() )
|
|
|
|
emit sig_updateView( m_pSheet );
|
|
|
|
|
|
|
|
if( checkPageLimit )
|
|
|
|
{
|
|
|
|
calculateZoomForPageLimitX();
|
|
|
|
calculateZoomForPageLimitY();
|
|
|
|
}
|
|
|
|
|
|
|
|
m_pDoc->setModified( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool PrintNewPageEntry::operator==( PrintNewPageEntry const & entry ) const
|
|
|
|
{
|
|
|
|
return m_iStartItem == entry.m_iStartItem;
|
|
|
|
}
|
|
|
|
|