You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kspread/kspread_sheetprint.h

720 lines
21 KiB

/* This file is part of the KDE project
Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>,
2003 Philipp Mller <philipp.mueller@gmx.de>
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.
*/
#ifndef __kspread_sheetprint_h__
#define __kspread_sheetprint_h__
#include <tqobject.h>
#include <koffice_export.h>
#include <KoUnit.h>
class KoGenStyles;
namespace KSpread
{
class Doc;
class Selection;
class PrintNewPageEntry;
class PrintObject;
class KSPREAD_EXPORT SheetPrint : public TQObject
{
Q_OBJECT
TQ_OBJECT
public:
SheetPrint( Sheet *sheet );
~SheetPrint();
TQString saveOasisSheetStyleLayout( KoGenStyles &mainStyles );
/**
* @return false if nothing to print.
*/
bool print( TQPainter &painter, KPrinter *_printer );
/**
* @return the prinsheet width of the paper in millimeters.
*/
float prinsheetWidth()const { return m_paperWidth - m_leftBorder - m_rightBorder; }
/**
* @return the prinsheet width of the paper in zoomed points.
*/
float prinsheetWidthPts()const { return MM_TO_POINT( prinsheetWidth() / m_dZoom ); }
/**
* @return the prinsheet height of the paper in millimeters.
*/
float prinsheetHeight()const { return m_paperHeight - m_topBorder - m_bottomBorder; }
/**
* @return the prinsheet height of the paper in zoomed points.
*/
float prinsheetHeightPts()const { return MM_TO_POINT( prinsheetHeight() / m_dZoom ); }
/**
* @return the height of the paper in millimeters.
*/
float paperHeight()const { return m_paperHeight; }
/**
* @return the height of the paper in zoomed points.
*/
float paperHeightPts()const { return MM_TO_POINT( m_paperHeight / m_dZoom ); }
/**
* @return the width of the paper in millimeters.
*/
float paperWidth()const { return m_paperWidth; }
/**
* @return the width of the paper in zoomed points.
*/
float paperWidthPts()const { return MM_TO_POINT( m_paperWidth / m_dZoom ); }
void setPaperHeight(float _val) { m_paperHeight=_val; }
void setPaperWidth(float _val) { m_paperWidth=_val; }
/**
* @return the left border in millimeters
*/
float leftBorder()const { return m_leftBorder; }
/**
* @return the left border in zoomed points
*/
float leftBorderPts()const { return MM_TO_POINT( m_leftBorder / m_dZoom ); }
/**
* @return the right border in millimeters
*/
float rightBorder()const { return m_rightBorder; }
/**
* @return the right border in zoomed points
*/
float rightBorderPts()const { return MM_TO_POINT( m_rightBorder / m_dZoom ); }
/**
* @return the top border in millimeters
*/
float topBorder()const { return m_topBorder; }
/**
* @return the top border in zoomed points
*/
float topBorderPts()const { return MM_TO_POINT( m_topBorder / m_dZoom ); }
/**
* @return the bottom border in millimeters
*/
float bottomBorder()const { return m_bottomBorder; }
/**
* @return the bottom border in zoomed points
*/
float bottomBorderPts()const { return MM_TO_POINT( m_bottomBorder / m_dZoom ); }
/**
* @return the orientation of the paper.
*/
KoOrientation orientation()const { return m_orientation; }
/**
* @return the ascii name of the paper orientation ( like Portrait, Landscape )
*/
const char* orientationString() const;
/**
* @return the paper format.
*/
KoFormat paperFormat()const { return m_paperFormat; }
/**
* @return the ascii name of the paper format ( like A4, Letter etc. )
*/
TQString paperFormatString()const;
void setPaperFormat(KoFormat _format) {m_paperFormat=_format;}
void setPaperOrientation(KoOrientation _orient);
/**
* Returns the page tqlayout
*/
KoPageLayout paperLayout() const;
/**
* Changes the paper tqlayout and repaints the currently displayed Sheet.
*/
void setPaperLayout( float _leftBorder, float _topBorder, float _rightBorder, float _bottomBoder,
KoFormat _paper, KoOrientation orientation );
/**
* A convenience function using a TQString as paper format and orientation.
*/
void setPaperLayout( float _leftBorder, float _topBorder, float _rightBorder, float _bottomBoder,
const TQString& _paper, const TQString& _orientation );
TQString headLeft( int _p, const TQString &_t )const { if ( m_headLeft.isNull() ) return "";
return completeHeading( m_headLeft, _p, _t ); }
TQString headMid( int _p, const TQString &_t )const { if ( m_headMid.isNull() ) return "";
return completeHeading( m_headMid, _p, _t ); }
TQString headRight( int _p, const TQString &_t )const { if ( m_headRight.isNull() ) return "";
return completeHeading( m_headRight, _p, _t ); }
TQString footLeft( int _p, const TQString &_t )const { if ( m_footLeft.isNull() ) return "";
return completeHeading( m_footLeft, _p, _t ); }
TQString footMid( int _p, const TQString &_t )const { if ( m_footMid.isNull() ) return "";
return completeHeading( m_footMid, _p, _t ); }
TQString footRight( int _p, const TQString &_t )const { if ( m_footRight.isNull() ) return "";
return completeHeading( m_footRight, _p, _t ); }
TQString headLeft()const { if ( m_headLeft.isNull() ) return ""; return m_headLeft; }
TQString headMid()const { if ( m_headMid.isNull() ) return ""; return m_headMid; }
TQString headRight()const { if ( m_headRight.isNull() ) return ""; return m_headRight; }
TQString footLeft()const { if ( m_footLeft.isNull() ) return ""; return m_footLeft; }
TQString footMid()const { if ( m_footMid.isNull() ) return ""; return m_footMid; }
TQString footRight()const { if ( m_footRight.isNull() ) return ""; return m_footRight; }
/**
* Returns the print range.
* Returns ( TQPoint (1, 1), TQPoint(KS_colMax, KS_rowMax) ) if nothing is defined
*/
TQRect printRange() const { return m_printRange; }
/**
* Sets the print range.
* Set it to ( TQPoint (1, 1), TQPoint(KS_colMax, KS_rowMax) ) to undefine it
*/
void setPrintRange( const TQRect &_printRange );
/**
* Return the page limit in X direction.
* 0 means no limit
*/
int pageLimitX() const { return m_iPageLimitX; }
/**
* Return the page limit in Y direction.
* 0 means no limit
*/
int pageLimitY() const { return m_iPageLimitY; }
/**
* Sets the page limit in X direction. The zoom factor will be adjusted,
* so that there is a maximum of @arg pages pages in X direction.
* 0 releases the limit
*/
void setPageLimitX( int pages );
/**
* Sets the page limit in Y direction. The zoom factor will be adjusted,
* so that there is a maximum of @arg pages pages in X direction.
* 0 releases the limit
*/
void setPageLimitY( int pages );
/**
* Calculates the zoom factor, so that the printout fits on pages in X direction.
*/
void calculateZoomForPageLimitX();
/**
* Calculates the zoom factor, so that the printout fits on pages in Y direction.
*/
void calculateZoomForPageLimitY();
/**
* Returns the columns, which are printed on each page.
* Returns TQPair (0, 0) if nothing is defined
*/
TQPair<int, int> printRepeatColumns() const { return m_printRepeatColumns; }
/**
* Sets the columns to be printed on each page.
* Only the x-values of the points are used
* Set it to TQPair (0, 0) to undefine it
*/
void setPrintRepeatColumns( TQPair<int, int> _printRepeatColumns );
/**
* Returns the rows, which are printed on each page.
* Returns TQPair (0, 0) if nothing is defined
*/
TQPair<int, int> printRepeatRows() const { return m_printRepeatRows; }
/**
* Sets the rows to be printed on each page.
* Only the y-values of the points are used
* Set it to TQPair (0, 0) to undefine it
*/
void setPrintRepeatRows( TQPair<int, int> _printRepeatRows );
/**
* Tests whether _column is the first column of a new page. In this
* case the left border of this column may be drawn highlighted to show
* that this is a page break.
*/
bool isOnNewPageX( int _column );
/**
* Updates the new page list up to @ref _column
*/
void updateNewPageX( int _column );
/**
* Tests whether _row is the first row of a new page. In this
* case the top border of this row may be drawn highlighted to show
* that this is a page break.
*/
bool isOnNewPageY( int _row );
/**
* Updates the new page list up to @ref _row
*/
void updateNewPageY( int _row );
/**
* Updates the new page list for columns starting at column @arg _col
*/
void updateNewPageListX( int _col );
/**
* Updates the new page list for rows starting at row @arg _row
*/
void updateNewPageListY( int _row );
/**
* Replaces in _text all _search text parts by _replace text parts.
* Included is a test to not change if _search == _replace.
* The arguments should not include neither the beginning "<" nor the leading ">", this is already
* included internally.
*/
void replaceHeadFootLineMacro ( TQString &_text, const TQString &_search, const TQString &_replace );
/**
* Replaces in _text all page macros by the i18n-version of the macros
*/
TQString localizeHeadFootLine ( const TQString &_text );
/**
* Replaces in _text all i18n-versions of the page macros by the internal version of the macros
*/
TQString delocalizeHeadFootLine ( const TQString &_text );
/**
* Returns the head and foot line of the print out
*/
KoHeadFoot headFootLine() const;
/**
* Sets the head and foot line of the print out
*/
void setHeadFootLine( const TQString &_headl, const TQString &_headm, const TQString &_headr,
const TQString &_footl, const TQString &_footm, const TQString &_footr );
/**
* Returns, if the grid shall be shown on printouts
*/
bool printGrid() const { return m_bPrintGrid; }
/**
* Sets, if the grid shall be shown on printouts
*/
void setPrintGrid( bool _printGrid );
/**
* Returns, if the objects shall be shown on printouts
*/
bool printObjects() const { return m_bPrintObjects; }
/**
* Sets, if the objects shall be shown on printouts
*/
void setPrintObjects( bool _printObjects );
/**
* Returns, if the charts shall be shown on printouts
*/
bool printCharts() const { return m_bPrintCharts; }
/**
* Sets, if the charts shall be shown on printouts
*/
void setPrintCharts( bool _printCharts );
/**
* Returns, if the graphics shall be shown on printouts
*/
bool printGraphics() const { return m_bPrintGraphics; }
/**
* Sets, if the graphics shall be shown on printouts
*/
void setPrintGraphics( bool _printGraphics );
/**
* Returns, if the comment rect shall be shown on printouts
*/
bool printCommentIndicator() const { return m_bPrintCommentIndicator; }
/**
* Sets, if the comment rect shall be shown on printouts
*/
void setPrintCommentIndicator( bool _printCommentIndicator );
/**
* Returns, if the formula rect shall be shown on printouts
*/
bool printFormulaIndicator() const { return m_bPrintFormulaIndicator; }
/**
* Sets, if the formula Rect shall be shown on printouts
*/
void setPrintFormulaIndicator( bool _printFormulaIndicator );
/**
* Updates m_dPrintRepeatColumnsWidth according to the new settings
*/
void updatePrintRepeatColumnsWidth();
/**
* Updates m_dPrintRepeatColumnsWidth according to the new settings
*/
void updatePrintRepeatRowsHeight();
/**
* Define the print range with the current selection
*/
void definePrintRange(Selection* selectionInfo);
/**
* Reset the print range to the standard definition (whole sheet)
*/
void resetPrintRange();
/**
* Updates the print range, according to the inserted columns
*/
void insertColumn( int col, int nbCol );
/**
* Updates the print range, according to the inserted columns
*/
void removeColumn( int col, int nbCol );
/**
* Updates the print range, according to the inserted rows
*/
void insertRow( int row, int nbRow );
/**
* Updates the print range, according to the inserted rows
*/
void removeRow( int row, int nbRow );
/**
* Sets the zoom level of the printout to _zoom
* If checkPageLimit is false, then the zoom will be set,
* without checking that this zoom level fits to an availabl page limit
*/
void setZoom( double _zoom, bool checkPageLimit = true );
/**
* Returns the zoom level of the printout as double
*/
double zoom() const { return m_dZoom; }
/**
* Checks wether the page has content to print
*/
bool pageNeedsPrinting( TQRect& page_range );
signals:
void sig_updateView( Sheet *_sheet );
private:
Sheet * m_pSheet;
Doc * m_pDoc;
/**
* Prints the page specified by 'page_range'.
* This for the printout it uses @ref printRect and @ref printHeaderFooter
*
* @return the last vertical line which was printed plus one.
*
* @param _page_range TQRect defines a rectangle of cells which should be
* painted to the device 'prn'.
*
* @param view KoRect defines the sourrounding rectangle which is
* the printing frame.
*
* @param _childOffset KoPoint used to calculate the correct position of
* children, if there are repeated columns/rows.
*/
void printPage( TQPainter &_painter, const TQRect& page_range,
const KoRect& view, const KoPoint _childOffset );
/**
* Prints a rect of cells defined by printRect at the position topLeft.
*/
void printRect( TQPainter &painter, const KoPoint& topLeft,
const TQRect& printRect, const KoRect& view,
TQRegion &clipRegion );
/**
* Prints the header and footer on a page
*/
void printHeaderFooter( TQPainter &painter, int pageNo );
/**
* Looks at @ref #m_paperFormat and calculates @ref #m_paperWidth and @ref #m_paperHeight.
*/
void calcPaperSize();
/**
* Returns the iterator for the column in the newPage list for columns
*/
TQValueList<PrintNewPageEntry>::iterator findNewPageColumn( int col );
/**
* Returns the iterator for the row in the newPage list for rows
*/
TQValueList<PrintNewPageEntry>::iterator findNewPageRow( int row );
/**
* Replaces macros like <name>, <file>, <date> etc. in the string and
* returns the modified one.
*
* @param _page is the page number for which the heading is produced.
* @param _Sheet is the name of the Sheet for which we generate the headings.
*/
TQString completeHeading( const TQString &_data, int _page, const TQString &_sheet ) const ;
/**
* Returns a rect, which contains the cols and rows to be printed.
* It respects the printrange and the children
*/
TQRect cellsPrintRange();
/**
* Returns the numbers of pages in x direction
*/
int pagesX( const TQRect& cellsPrintRange );
/**
* Returns the numbers of pages in y direction
*/
int pagesY( const TQRect& cellsPrintRange );
/**
* The orientation of the paper.
*/
KoOrientation m_orientation;
/**
* Tells about the currently seleced paper size.
*/
KoFormat m_paperFormat;
/**
* The paper width in millimeters. Dont change this value, it is calculated by
* @ref #calcPaperSize from the value @ref #m_paperFormat.
*/
float m_paperWidth;
/**
* The paper height in millimeters. Dont change this value, it is calculated by
* @ref #calcPaperSize from the value @ref #m_paperFormat.
*/
float m_paperHeight;
/**
* The left border in millimeters.
*/
float m_leftBorder;
/**
* The right border in millimeters.
*/
float m_rightBorder;
/**
* The top border in millimeters.
*/
float m_topBorder;
/**
* The right border in millimeters.
*/
float m_bottomBorder;
/**
* Header string. The string may contains makros. That means
* it has to be processed before printing.
*/
TQString m_headLeft;
/**
* Header string. The string may contains makros. That means
* it has to be processed before printing.
*/
TQString m_headRight;
/**
* Header string. The string may contains makros. That means
* it has to be processed before printing.
*/
TQString m_headMid;
/**
* Footer string. The string may contains makros. That means
* it has to be processed before printing.
*/
TQString m_footLeft;
/**
* Footer string. The string may contains makros. That means
* it has to be processed before printing.
*/
TQString m_footRight;
/**
* Footer string. The string may contains makros. That means
* it has to be processed before printing.
*/
TQString m_footMid;
/**
* Number of total pages, only calculated during printing
*/
uint m_uprintPages;
/**
* Defined prinsheet area
*/
TQRect m_printRange;
/**
* Repeated columns on printout
*/
TQPair<int, int> m_printRepeatColumns;
/**
* Repeated rows on printout
*/
TQPair<int, int> m_printRepeatRows;
/**
* Show the grid when making printout
*/
bool m_bPrintGrid;
/**
* Show the objects when making printout
*/
bool m_bPrintObjects;
/**
* Show the charts when making printout
*/
bool m_bPrintCharts;
/**
* Show the graphics when making printout
*/
bool m_bPrintGraphics;
/**
* Show the formula rect when making printout
*/
bool m_bPrintFormulaIndicator;
/**
* Show the comment rect when making printout
*/
bool m_bPrintCommentIndicator;
/**
* Width of repeated columns in points, stored for perfomance reasons
*/
double m_dPrintRepeatColumnsWidth;
/**
* Height of repeated rows in points, stored for perfomance reasons
*/
double m_dPrintRepeatRowsHeight;
/**
* Stores the new page columns
*/
TQValueList<PrintNewPageEntry> m_lnewPageListX;
/**
* Stores the new page columns
*/
TQValueList<PrintNewPageEntry> m_lnewPageListY;
/**
* Stores internally the maximum column that was checked already
*/
int m_maxCheckedNewPageX;
/**
* Stores internally the maximum row that was checked already
*/
int m_maxCheckedNewPageY;
/**
* Zoom level of printout
*/
double m_dZoom;
/**
* Limit of pages in X direction. 0 means no limit
*/
int m_iPageLimitX;
/**
* Limit of pages in Y direction. 0 means no limit
*/
int m_iPageLimitY;
TQValueList<PrintObject*> m_printObjects;
};
class PrintNewPageEntry
{
public:
PrintNewPageEntry() :
m_iStartItem( 0 ), m_iEndItem( 0 ), m_dSize( 0 ),
m_dOffset( 0 ){}
PrintNewPageEntry( int startItem, int endItem = 0, double size = 0,
double offset = 0 ) :
m_iStartItem( startItem ), m_iEndItem( endItem ), m_dSize( size ),
m_dOffset( offset ) {}
int startItem() const { return m_iStartItem; }
void setStartItem( int startItem ) { m_iStartItem = startItem; }
int endItem() const { return m_iEndItem; }
void setEndItem( int endItem ) { m_iEndItem = endItem; }
double size() const { return m_dSize; }
void setSize( double size ) { m_dSize = size; }
double offset() const { return m_dOffset; }
void setOffset( double offset ) { m_dOffset = offset; }
bool operator==( PrintNewPageEntry const & entry ) const;
private:
int m_iStartItem;
int m_iEndItem;
double m_dSize;
double m_dOffset;
};
class PrintObject
{
public:
PrintObject() : obj(0), p(0) {}
EmbeddedObject *obj;
TQPixmap *p;
};
} // namespace KSpread
#endif