aboutsummaryrefslogtreecommitdiffstats
path: root/Plugins/PdfExport/pdfexport.h
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
commit7167ce41b61d2ba2cdb526777a4233eb84a3b66a (patch)
treea35c14143716e1f2c98f808c81f89426045a946f /Plugins/PdfExport/pdfexport.h
Imported Upstream version 2.99.6upstream/2.99.6
Diffstat (limited to 'Plugins/PdfExport/pdfexport.h')
-rw-r--r--Plugins/PdfExport/pdfexport.h225
1 files changed, 225 insertions, 0 deletions
diff --git a/Plugins/PdfExport/pdfexport.h b/Plugins/PdfExport/pdfexport.h
new file mode 100644
index 0000000..9c7cc62
--- /dev/null
+++ b/Plugins/PdfExport/pdfexport.h
@@ -0,0 +1,225 @@
+#ifndef PDFEXPORT_H
+#define PDFEXPORT_H
+
+#include "pdfexport_global.h"
+#include "plugins/genericexportplugin.h"
+#include "config_builder.h"
+#include <QPdfWriter>
+#include <QFont>
+#include <QColor>
+
+class QPagedPaintDevice;
+class QPainter;
+class QTextOption;
+class QFont;
+
+namespace Cfg
+{
+ PDFEXPORTSHARED_EXPORT QFont getPdfExportDefaultFont();
+ PDFEXPORTSHARED_EXPORT QStringList getPdfPageSizes();
+}
+
+CFG_CATEGORIES(PdfExportConfig,
+ CFG_CATEGORY(PdfExport,
+ CFG_ENTRY(QString, PageSize, "A4")
+ CFG_ENTRY(QStringList, PageSizes, Cfg::getPdfPageSizes())
+ CFG_ENTRY(int, Padding, 1)
+ CFG_ENTRY(bool, PrintRowNum, true)
+ CFG_ENTRY(bool, PrintPageNumbers, true)
+ CFG_ENTRY(int, TopMargin, 20)
+ CFG_ENTRY(int, RightMargin, 20)
+ CFG_ENTRY(int, BottomMargin, 20)
+ CFG_ENTRY(int, LeftMargin, 20)
+ CFG_ENTRY(int, MaxCellBytes, 100)
+ CFG_ENTRY(QFont, Font, Cfg::getPdfExportDefaultFont())
+ CFG_ENTRY(int, FontSize, 10)
+ CFG_ENTRY(QColor, HeaderBgColor, QColor(Qt::lightGray))
+ CFG_ENTRY(QColor, NullValueColor, QColor(Qt::gray))
+ )
+)
+
+class PDFEXPORTSHARED_EXPORT PdfExport : public GenericExportPlugin
+{
+ Q_OBJECT
+ SQLITESTUDIO_PLUGIN("pdfexport.json")
+
+ public:
+ QString getFormatName() const;
+ ExportManager::StandardConfigFlags standardOptionsToEnable() const;
+ ExportManager::ExportProviderFlags getProviderFlags() const;
+ void validateOptions();
+ CfgMain* getConfig();
+ QString getExportConfigFormName() const;
+ QString defaultFileExtension() const;
+ bool beforeExportQueryResults(const QString& query, QList<QueryExecutor::ResultColumnPtr>& columns,
+ const QHash<ExportManager::ExportProviderFlag,QVariant> providedData);
+ bool exportQueryResultsRow(SqlResultsRowPtr row);
+ bool exportTable(const QString& database, const QString& table, const QStringList& columnNames, const QString& ddl, SqliteCreateTablePtr createTable,
+ const QHash<ExportManager::ExportProviderFlag,QVariant> providedData);
+ bool exportVirtualTable(const QString& database, const QString& table, const QStringList& columnNames, const QString& ddl, SqliteCreateVirtualTablePtr createTable,
+ const QHash<ExportManager::ExportProviderFlag,QVariant> providedData);
+ bool afterExport();
+ bool afterExportTable();
+ bool afterExportQueryResults();
+ bool exportTableRow(SqlResultsRowPtr data);
+ bool beforeExportDatabase(const QString& database);
+ bool exportIndex(const QString& database, const QString& name, const QString& ddl, SqliteCreateIndexPtr createIndex);
+ bool exportTrigger(const QString& database, const QString& name, const QString& ddl, SqliteCreateTriggerPtr createTrigger);
+ bool exportView(const QString& database, const QString& name, const QString& ddl, SqliteCreateViewPtr view);
+ void cleanupAfterExport();
+ bool isBinaryData() const;
+ bool init();
+ void deinit();
+
+ protected:
+ virtual QPagedPaintDevice* createPaintDevice(const QString& documentTitle);
+
+ int lineWidth = 15;
+
+ private:
+ struct DataCell
+ {
+ QString contents;
+ Qt::Alignment alignment = Qt::AlignLeft;
+ bool isNull = false;
+ bool isRowNum = false;
+ };
+
+ struct DataRow
+ {
+ enum class Type
+ {
+ NORMAL,
+ TOP_HEADER,
+ COLUMNS_HEADER
+ };
+
+ QList<DataCell> cells;
+ int height = 0;
+ Type type = Type::NORMAL;
+ };
+
+ struct ObjectCell
+ {
+ enum class Type
+ {
+ NORMAL,
+ LIST
+ };
+
+ QStringList contents;
+ Qt::Alignment alignment = Qt::AlignLeft;
+ bool headerBackground = false;
+ bool bold = false;
+ bool italic = false;
+ Type type = Type::NORMAL;
+ };
+
+ struct ObjectRow
+ {
+ enum class Type
+ {
+ MULTI,
+ SINGLE
+ };
+
+ QList<ObjectCell> cells;
+ int height = 0;
+ Type type = Type::SINGLE;
+ bool recalculateColumnWidths = false;
+ };
+
+ void prepareTableDataExport(const QString& table, const QStringList& columnNames, const QHash<ExportManager::ExportProviderFlag,QVariant> providedData);
+ QList<int> getColumnDataLengths(int columnCount, const QHash<ExportManager::ExportProviderFlag,QVariant> providedData);
+ bool beginDoc(const QString& title);
+ void endDoc();
+ void setupConfig();
+ void updateMargins();
+ void drawDdl(const QString& objName, const QString& ddl);
+ void clearDataHeaders();
+ void resetDataTable();
+ void exportDataHeader(const QString& contents);
+ void exportDataColumnsHeader(const QStringList& columns);
+ void exportDataRow(const QList<QVariant>& data);
+ void exportObjectHeader(const QString& contents);
+ void exportObjectColumnsHeader(const QStringList& columns);
+ void exportTableColumnRow(SqliteCreateTable::Column* column);
+ void exportTableConstraintsRow(const QList<SqliteCreateTable::Constraint*>& constrList);
+ void exportObjectRow(const QStringList& values);
+ void exportObjectRow(const QString& values);
+ void checkForDataRender();
+ void flushObjectPages();
+ void drawObjectTopLine(int y);
+ void drawObjectCellHeaderBackground(int x1, int y1, int x2, int y2);
+ void drawFooter();
+ void flushObjectRow(const ObjectRow& row, int y);
+ void flushObjectCell(const ObjectCell& cell, int x, int y, int w, int h);
+ void flushDataPages(bool forceRender = false);
+ void flushDataRowsPage(int columnStart, int columnEndBefore, int rowsToRender);
+ void flushDataRow(const DataRow& row, int& y, int columnStart, int columnEndBefore, int localRowNum);
+ void flushDataCell(const QRect& rect, const DataCell& cell);
+ void flushDataCell(const QRect& rect, const QString& contents, QTextOption* opt);
+ void flushDataHeaderRow(const DataRow& row, int& y, int totalColsWidth, int columnStart, int columnEndBefore);
+ void flushDataHeaderCell(int& x, int y, const DataRow& row, int col, QTextOption* opt);
+ void renderPageNumber();
+ int getPageNumberHeight();
+ void newPage();
+ void calculateDataColumnWidths(const QStringList& columnNames, const QList<int>& columnDataLengths, int columnToExpand = -1);
+ void calculateDataRowHeights();
+ int calculateRowHeight(int textWidth, const QString& contents);
+ int calculateRowHeight(int maxTextWidth, const QStringList& listContents);
+ int calculateBulletPrefixWidth();
+ void calculateObjectColumnWidths(int columnToExpand = -1);
+ int correctMaxObjectColumnWidths(int colCount, int columnToExpand);
+ void calculateObjectRowHeights();
+ int getDataColumnsWidth() const;
+ int getDataColumnsStartX() const;
+ int getContentsLeft() const;
+ int getContentsTop() const;
+ int getContentsRight() const;
+ int getContentsBottom() const;
+ qreal mmToPoints(qreal sizeMM);
+
+ CFG_LOCAL(PdfExportConfig, cfg)
+ QPagedPaintDevice* pagedWriter = nullptr;
+ QPainter* painter = nullptr;
+ QTextOption* textOption = nullptr;
+ QFont stdFont;
+ QFont boldFont;
+ QFont italicFont;
+ int totalRows = 0;
+ QList<ObjectRow> bufferedObjectRows; // object rows (for exporting ddl of all object)
+ QList<DataRow> bufferedDataRows; // data rows
+ int totalHeaderRowsHeight = 0; // total height of all current header rows
+ int currentHeaderMinWidth = 0; // minimum width of the object header, required to extend data columns when hey are slimmer than this
+ QList<int> calculatedObjectColumnWidths; // object column widths calculated basing on header column widths and columns from other object rows
+ QList<int> calculatedDataColumnWidths; // data column widths calculated basing on header column widths and data column widths
+ QList<int> columnsPerPage; // number of columns that will fit on each page
+ QScopedPointer<DataRow> headerRow; // Top level header (object name)
+ QScopedPointer<DataRow> columnsHeaderRow; // columns header for data tables
+ int rowNumColumnWidth = 0;
+ int pageWidth = 0;
+ int pageHeight = 0;
+ int minRowHeight = 0;
+ int rowsToPrebuffer = 0;
+ int currentPage = -1;
+ int rowNum = 0;
+ int lastRowY = 0;
+ qreal pointsPerMm = 1.0;
+ int maxColWidth = 0;
+ int maxRowHeight = 0;
+ int cellDataLimit = 100;
+
+ static QString bulletChar;
+
+ // Configurable fields
+ int padding = 0;
+ bool printRowNum = true;
+ bool printPageNumbers = true;
+ int topMargin = 0;
+ int rightMargin = 0;
+ int leftMargin = 0;
+ int bottomMargin = 0;
+};
+
+#endif // PDFEXPORT_H