0
0
mirror of https://github.com/fralx/LimeReport.git synced 2025-09-23 08:29:07 +03:00

TOC generation has been changed

This commit is contained in:
Arin Alexander
2017-08-31 02:53:34 +03:00
parent 2c50a9a791
commit 992c53e19a
21 changed files with 515 additions and 177 deletions

View File

@@ -339,7 +339,7 @@ void TextItem::updateLayout()
bool TextItem::isNeedExpandContent() const
{
QRegExp rx("$*\\{[^{]*\\}");
return content().contains(rx);
return content().contains(rx) || isContentBackedUp();
}
QString TextItem::replaceBR(QString text)
@@ -733,23 +733,35 @@ void TextItem::setAlignment(Qt::Alignment value)
void TextItem::expandContent(DataSourceManager* dataManager, RenderPass pass)
{
QString context=content();
ExpandType expandType = (allowHTML() && !allowHTMLInFields())?ReplaceHTMLSymbols:NoEscapeSymbols;
foreach (QString variableName, dataManager->variableNamesByRenderPass(SecondPass)) {
QRegExp rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName));
if (context.contains(rx) && pass == FirstPass){
backupContent();
break;
}
}
ExpandType expandType = (allowHTML() && !allowHTMLInFields()) ? ReplaceHTMLSymbols : NoEscapeSymbols;
switch(pass){
case FirstPass:
if (!fillInSecondPass()){
context=expandUserVariables(context, pass, expandType, dataManager);
context=expandScripts(context, dataManager);
context=expandDataFields(context, expandType, dataManager);
} else {
context=expandDataFields(context, expandType, dataManager);
}
break;
case SecondPass:;
case SecondPass:
if (isContentBackedUp()) {
restoreContent();
context = content();
}
context=expandUserVariables(context, pass, expandType, dataManager);
context=expandScripts(context, dataManager);
if (fillInSecondPass())
context=expandDataFields(context, expandType, dataManager);
}
if (expandType == NoEscapeSymbols && !m_varValue.isNull() &&m_valueType!=Default) {
if (expandType == NoEscapeSymbols && !m_varValue.isNull() &&m_valueType != Default) {
setContent(formatFieldValue());
} else {
setContent(context);

View File

@@ -71,6 +71,7 @@ class TextItem : public LimeReport::ContentItemDesignIntf, IPageInit {
Q_PROPERTY(BrushStyle backgroundBrushStyle READ backgroundBrushStyle WRITE setBackgroundBrushStyle)
Q_PROPERTY(qreal textIndent READ textIndent WRITE setTextIndent)
Q_PROPERTY(Qt::LayoutDirection textLayoutDirection READ textLayoutDirection WRITE setTextLayoutDirection)
Q_PROPERTY(bool fillInSecondPass READ fillInSecondPass WRITE setFillInSecondPass)
public:
enum AutoWidth{NoneAutoWidth,MaxWordLength,MaxStringLength};

View File

@@ -96,7 +96,7 @@ class BaseDesignIntf :
Q_PROPERTY(int borderLineSize READ borderLineSize WRITE setBorderLineSize)
Q_PROPERTY(bool isVisible READ isVisible WRITE setItemVisible DESIGNABLE false)
Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor)
Q_PROPERTY(bool fillInSecondPass READ fillInSecondPass WRITE setFillInSecondPass)
friend class ReportRender;
public:
enum BGMode { TransparentMode, OpaqueMode};

View File

@@ -291,6 +291,16 @@ QVariant ModelToDataSource::data(const QString &columnName)
return m_model->data(m_model->index(currentRow(),columnIndexByName(columnName)));
}
QVariant ModelToDataSource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData)
{
for( int i=0; i < m_model->rowCount(); ++i ){
if (m_model->data(m_model->index(i, columnIndexByName(keyColumnName))) == keyData){
return m_model->data(m_model->index(i, columnIndexByName(columnName)));
}
}
return QVariant();
}
int ModelToDataSource::columnCount()
{
if (isInvalid()) return 0;
@@ -702,17 +712,24 @@ void CallbackDatasource::first(){
else m_eof = !result;
}
QVariant CallbackDatasource::callbackData(const QString& columnName, int row)
{
CallbackInfo info;
QVariant result;
info.dataType = CallbackInfo::ColumnData;
info.columnName = columnName;
info.index = row;
emit getCallbackData(info, result);
return result;
}
QVariant CallbackDatasource::data(const QString& columnName)
{
QVariant result;
if (!bof())
{
if (!m_getDataFromCache){
CallbackInfo info;
info.dataType = CallbackInfo::ColumnData;
info.columnName = columnName;
info.index = m_currentRow;
emit getCallbackData(info,result);
result = callbackData(columnName, m_currentRow);
} else {
result = m_valuesCache[columnName];
}
@@ -720,6 +737,31 @@ QVariant CallbackDatasource::data(const QString& columnName)
return result;
}
QVariant CallbackDatasource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData)
{
int backupCurrentRow = m_currentRow;
int currentRow = 0;
QVariant result = QVariant();
first();
if (!checkIfEmpty()){
do {
QVariant key = callbackData(keyColumnName, currentRow);
if (key == keyData){
result = callbackData(columnName, currentRow);
break;
}
currentRow++;
} while (next());
}
first();
if (backupCurrentRow != -1){
for (int i = 0; i < backupCurrentRow; ++i)
next();
}
return result;
}
int CallbackDatasource::columnCount(){
CallbackInfo info;
if (m_columnCount == -1){
@@ -781,7 +823,7 @@ int CallbackDatasource::columnIndexByName(QString name)
bool CallbackDatasource::checkNextRecord(int recordNum){
if (bof()) checkIfEmpty();
if (m_rowCount > 0) {
return (m_currentRow < (m_rowCount-1));
return (recordNum < (m_rowCount-1));
} else {
QVariant result = false;
CallbackInfo info;

View File

@@ -58,6 +58,7 @@ public:
virtual bool bof() = 0;
virtual bool eof() = 0;
virtual QVariant data(const QString& columnName) = 0;
virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0;
virtual int columnCount() = 0;
virtual QString columnNameByIndex(int columnIndex) = 0;
virtual int columnIndexByName(QString name) = 0;
@@ -359,6 +360,7 @@ public:
bool eof();
bool bof();
QVariant data(const QString& columnName);
QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData);
int columnCount();
QString columnNameByIndex(int columnIndex);
int columnIndexByName(QString name);
@@ -390,6 +392,7 @@ public:
bool bof(){return m_currentRow == -1;}
bool eof(){return m_eof;}
QVariant data(const QString &columnName);
QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData);
int columnCount();
QString columnNameByIndex(int columnIndex);
int columnIndexByName(QString name);
@@ -407,6 +410,7 @@ private:
int m_rowCount;
QHash<QString, QVariant> m_valuesCache;
bool m_getDataFromCache;
QVariant callbackData(const QString& columnName, int row);
};
class CallbackDatasourceHolder :public QObject, public IDataSourceHolder{

View File

@@ -224,7 +224,7 @@ DataSourceManager::DataSourceManager(QObject *parent) :
m_groupFunctionFactory.registerFunctionCreator(QLatin1String("AVG"),new ConstructorGroupFunctionCreator<AvgGroupFunction>);
m_groupFunctionFactory.registerFunctionCreator(QLatin1String("MIN"),new ConstructorGroupFunctionCreator<MinGroupFunction>);
m_groupFunctionFactory.registerFunctionCreator(QLatin1String("MAX"),new ConstructorGroupFunctionCreator<MaxGroupFunction>);
setSystemVariable(QLatin1String("#PAGE"),1,FirstPass);
setSystemVariable(QLatin1String("#PAGE"),1,SecondPass);
setSystemVariable(QLatin1String("#PAGE_COUNT"),0,SecondPass);
setSystemVariable(QLatin1String("#IS_LAST_PAGEFOOTER"),false,FirstPass);
setSystemVariable(QLatin1String("#IS_FIRST_PAGEFOOTER"),false,FirstPass);
@@ -1377,6 +1377,15 @@ QVariant DataSourceManager::fieldData(const QString &fieldName)
return QVariant();
}
QVariant DataSourceManager::fieldDataByKey(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue)
{
IDataSource* ds = dataSource(datasourceName);
if (ds){
return ds->dataByKeyField(valueFieldName, keyFieldName, keyValue);
}
return QVariant();
}
QVariant DataSourceManager::variable(const QString &variableName)
{
if (m_userVariables.containsVariable(variableName))
@@ -1403,6 +1412,17 @@ QStringList DataSourceManager::variableNames()
return m_reportVariables.variableNames();
}
QStringList DataSourceManager::variableNamesByRenderPass(RenderPass pass)
{
QStringList result;
foreach(QString variableName, m_reportVariables.variableNames()){
if (m_reportVariables.variablePass(variableName) == pass){
result.append(variableName);
}
}
return result;
}
QStringList DataSourceManager::namesOfUserVariables(){
return m_userVariables.variableNames();
}

View File

@@ -126,6 +126,7 @@ public:
QVariant variable(const QString& variableName);
RenderPass variablePass(const QString& name);
QStringList variableNames();
QStringList variableNamesByRenderPass(RenderPass pass);
QStringList namesOfUserVariables();
VarDesc::VarType variableType(const QString& name);
bool variableIsSystem(const QString& name);
@@ -161,6 +162,12 @@ public:
QStringList fieldNames(const QString& datasourceName);
bool containsField(const QString& fieldName);
QVariant fieldData(const QString& fieldName);
QVariant fieldDataByKey(
const QString& datasourceName,
const QString& valueFieldName,
const QString& keyFieldName,
QVariant keyValue
);
QString extractDataSource(const QString& fieldName);
QString extractFieldName(const QString& fieldName);

View File

@@ -56,7 +56,6 @@ public:
virtual void clearUserVariables()=0;
virtual ICallbackDatasource* createCallbackDatasource(const QString& name) = 0;
virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0;
//virtual void addCallbackDatasource(ICallbackDatasource* datasource, const QString& name) = 0;
};
}

View File

@@ -83,6 +83,7 @@ namespace Const{
const qreal SELECTION_OPACITY = 0.3;
const QString FIELD_RX = "\\$D\\s*\\{\\s*([^{}]*)\\s*\\}";
const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}";
const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}";
const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}";
//const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(((?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"))(\\w+\\.?\\w+)((?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,\\s*\\\"(\\w+)\\\"\\s*\\)";
@@ -108,7 +109,7 @@ namespace Const{
QVector<QString> normalizeCaptures(const QRegExp &reg);
enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols};
enum RenderPass {FirstPass, SecondPass};
enum RenderPass {FirstPass = 1, SecondPass = 2};
enum ArrangeType {AsNeeded, Force};
enum PreviewHint{ShowAllPreviewBars = 0,
HidePreviewToolBar = 1,

View File

@@ -122,4 +122,14 @@ QMap<QString, QString> ContentItemDesignIntf::getStringForTranslation(){
return map;
}
bool ContentItemDesignIntf::isContentBackedUp() const
{
return m_contentBackedUp;
}
void ContentItemDesignIntf::setContentBackedUp(bool contentBackedUp)
{
m_contentBackedUp = contentBackedUp;
}
}// namespace LimeReport

View File

@@ -61,6 +61,7 @@ private:
class Spacer :public ItemDesignIntf{
public:
Spacer(QObject* owner,QGraphicsItem* parent);
bool isEmpty() const {return true;}
protected:
BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent){
return new Spacer(owner, parent);
@@ -72,10 +73,17 @@ class ContentItemDesignIntf : public ItemDesignIntf
Q_OBJECT
public:
ContentItemDesignIntf(const QString& xmlTypeName, QObject* owner = 0,QGraphicsItem* parent = 0)
:ItemDesignIntf(xmlTypeName,owner,parent){}
:ItemDesignIntf(xmlTypeName,owner,parent), m_contentBackedUp(false){}
virtual QString content() const = 0;
virtual void setContent(const QString& value) = 0;
QMap<QString, QString> getStringForTranslation();
void backupContent(){ m_contentBackUp = content(); m_contentBackedUp = true;}
void restoreContent() {setContent(m_contentBackUp);}
bool isContentBackedUp() const;
void setContentBackedUp(bool contentBackedUp);
private:
QString m_contentBackUp;
bool m_contentBackedUp;
};
class LayoutDesignIntf : public ItemDesignIntf{

View File

@@ -331,7 +331,7 @@ void PageItemDesignIntf::initColumnsPos(QVector<qreal> &posByColumns, qreal pos,
}
}
bool PageItemDesignIntf::getIsTOC() const
bool PageItemDesignIntf::isTOC() const
{
return m_isTOC;
}

View File

@@ -55,7 +55,7 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft
Q_PROPERTY(bool resetPageNumber READ resetPageNumber WRITE setResetPageNumber)
Q_PROPERTY(bool isExtendedInDesignMode READ isExtendedInDesignMode WRITE setExtendedInDesignMode)
Q_PROPERTY(int extendedHeight READ extendedHeight WRITE setExtendedHeight)
Q_PROPERTY(bool pageIsTOC READ getIsTOC WRITE setIsTOC)
Q_PROPERTY(bool pageIsTOC READ isTOC WRITE setIsTOC)
friend class ReportRender;
public:
enum Orientation { Portrait, Landscape };
@@ -127,7 +127,7 @@ public:
int extendedHeight() const;
void setExtendedHeight(int extendedHeight);
bool getIsTOC() const;
bool isTOC() const;
void setIsTOC(bool isTOC);
signals:
void beforeFirstPageRendered();

View File

@@ -914,29 +914,35 @@ ReportPages ReportEnginePrivate::renderToPages()
emit renderStarted();
foreach(PageDesignIntf* page , m_pages){
if (!page->pageItem()->getIsTOC()){
if (!page->pageItem()->isTOC()){
page->setReportSettings(&m_reportSettings);
result.append(m_reportRender->renderPageToPages(page));
}
}
bool isFirst = true;
// m_reportRender->secondRenderPass(result);
foreach(PageDesignIntf* page , m_pages){
if (page->pageItem()->getIsTOC()){
for (int i=0; i<m_pages.count(); ++i){
PageDesignIntf* page = m_pages.at(i);
if (page->pageItem()->isTOC()){
page->setReportSettings(&m_reportSettings);
if (isFirst){
ReportPages pages = m_reportRender->renderPageToPages(page);
for (int i=0; i<pages.count(); ++i){
result.insert(i,pages.at(i));
if (i==0){
PageDesignIntf* secondPage = 0;
if (m_pages.count()>1) secondPage = m_pages.at(1);
ReportPages pages = m_reportRender->renderTOC(
page,
true,
secondPage && secondPage->pageItem()->resetPageNumber()
);
for (int j=0; j<pages.count(); ++j){
result.insert(j,pages.at(j));
}
}
else
} else {
result.append(m_reportRender->renderPageToPages(page));
}
}
isFirst = false;
}
m_reportRender->secondRenderPass(result);

View File

@@ -148,7 +148,7 @@ void ReportRender::renameChildItems(BaseDesignIntf *item){
ReportRender::ReportRender(QObject *parent)
:QObject(parent), m_renderPageItem(0), m_pageCount(0),
m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0)
m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_renderingFirstTOC(false)
{
initColumns();
}
@@ -188,15 +188,24 @@ void ReportRender::initDatasource(const QString& name){
}
}
void ReportRender::renderPage(PageDesignIntf* patternPage)
void ReportRender::renderPage(PageDesignIntf* patternPage, bool isTOC, bool isFirst, bool resetPageNumbers)
{
m_curentNameIndex = 0;
m_patternPageItem = patternPage->pageItem();
m_renderingFirstTOC = isTOC && isFirst;
if (m_patternPageItem->resetPageNumber() && m_pageCount>0) {
if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) {
resetPageNumber(PageReset);
}
if (m_renderingFirstTOC && resetPageNumbers){
PagesRange range;
range.firstPage = 0;
range.lastPage = 0;
m_ranges.insert(0,range);
m_pageCount = 0;
}
m_renderCanceled = false;
BandDesignIntf* reportFooter = m_patternPageItem->bandByType(BandDesignIntf::ReportFooter);
m_reportFooterHeight = 0;
@@ -238,6 +247,12 @@ void ReportRender::renderPage(PageDesignIntf* patternPage)
renderBand(tearOffBand, 0, StartNewPageAsNeeded);
savePage(true);
if (m_renderingFirstTOC && resetPageNumbers && m_ranges.count()>1){
m_ranges[1].firstPage = m_ranges.at(0).lastPage+1;
m_ranges[1].lastPage += m_ranges.at(0).lastPage+1;
}
#ifndef USE_QJSENGINE
ScriptEngineManager::instance().scriptEngine()->popContext();
#endif
@@ -267,6 +282,11 @@ ReportPages ReportRender::renderPageToPages(PageDesignIntf *patternPage)
return m_renderedPages;
}
ReportPages ReportRender::renderTOC(PageDesignIntf* patternPage, bool first, bool resetPages){
renderPage(patternPage, true, first, resetPages);
return m_renderedPages;
}
void ReportRender::initRenderPage()
{
if (!m_renderPageItem) {
@@ -1038,11 +1058,21 @@ void ReportRender::updateTOC(BaseDesignIntf* item, int pageNumber){
void ReportRender::secondRenderPass(ReportPages renderedPages)
{
if (!m_scriptEngineContext->tableOfContens()->isEmpty()){
for(int i=0; i<renderedPages.count(); ++i){
PageItemDesignIntf::Ptr page = renderedPages.at(i);
foreach(BaseDesignIntf* item, page->childBaseItems()){
updateTOC(item, findPageNumber(i));
}
}
}
for(int i=0; i<renderedPages.count(); ++i){
PageItemDesignIntf::Ptr page = renderedPages.at(i);
m_datasources->setReportVariable("#PAGE",findPageNumber(i));
m_datasources->setReportVariable("#PAGE_COUNT",findLastPageNumber(i));
foreach(BaseDesignIntf* item, page->childBaseItems()){
if (!m_scriptEngineContext->tableOfContens()->isEmpty()) updateTOC(item, i+1);
item->updateItemSize(m_datasources, SecondPass);
}
}
@@ -1155,7 +1185,7 @@ void ReportRender::resetPageNumber(ResetPageNuberType resetType)
{
PagesRange range;
if (!m_ranges.isEmpty()){
m_ranges.last().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1;
currentRange().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1;
range.firstPage = m_pageCount+((resetType == BandReset)? 1 : 0);
} else {
range.firstPage = m_pageCount;
@@ -1175,6 +1205,15 @@ int ReportRender::findLastPageNumber(int currentPage)
return 0;
}
int ReportRender::findPageNumber(int currentPage)
{
foreach (PagesRange range, m_ranges) {
if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) )
return (currentPage - range.firstPage)+1;
}
return 0;
}
void ReportRender::cutGroups()
{
m_popupedExpression.clear();
@@ -1302,13 +1341,13 @@ void ReportRender::savePage(bool isLast)
}
}
if (m_ranges.last().lastPage==0 && m_ranges.count()>1) {
if (currentRange(m_renderingFirstTOC).lastPage==0 && m_ranges.count()>1) {
m_datasources->setReportVariable("#PAGE",1);
} else {
m_datasources->setReportVariable("#PAGE",m_datasources->variable("#PAGE").toInt()+1);
}
m_ranges.last().lastPage = m_pageCount;
currentRange(m_renderingFirstTOC).lastPage = m_pageCount;
BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter);
if (pageFooter) pageFooter->setBandIndex(++m_currentIndex);

View File

@@ -82,6 +82,7 @@ public:
PageItemDesignIntf::Ptr pageAt(int index);
QString renderPageToString(PageDesignIntf *patternPage);
ReportPages renderPageToPages(PageDesignIntf *patternPage);
ReportPages renderTOC(PageDesignIntf* patternPage, bool first, bool resetPages);
void secondRenderPass(ReportPages renderedPages);
signals:
void pageRendered(int renderedPageCount);
@@ -95,7 +96,7 @@ private:
void initGroups();
void clearPageMap();
void renderPage(PageDesignIntf *patternPage);
void renderPage(PageDesignIntf *patternPage, bool isTOC = false, bool isFirst = false, bool resetPageNumbers = false);
BandDesignIntf* renderBand(BandDesignIntf *patternBand, BandDesignIntf *bandData, DataRenderMode mode = NotStartNewPage, bool isLast = false);
void renderDataBand(BandDesignIntf* dataBand);
void renderPageHeader(PageItemDesignIntf* patternPage);
@@ -147,6 +148,7 @@ private:
void startNewPage(bool isFirst = false);
void resetPageNumber(ResetPageNuberType resetType);
int findLastPageNumber(int currentPage);
int findPageNumber(int currentPage);
void savePage(bool isLast = false);
QString toString();
void initColumns();
@@ -159,6 +161,7 @@ private:
void renameChildItems(BaseDesignIntf *item);
void renderGroupFooterByHeader(BandDesignIntf *groupHeader);
void updateTOC(BaseDesignIntf* item, int pageNumber);
PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();}
private:
DataSourceManager* m_datasources;
ScriptEngineContext* m_scriptEngineContext;
@@ -188,9 +191,7 @@ private:
QList<PagesRange> m_ranges;
QVector<BandDesignIntf*> m_columnedBandItems;
unsigned long long m_curentNameIndex;
bool m_renderingFirstTOC;
};
} // namespace LimeReport
#endif // LRREPORTRENDER_H

View File

@@ -364,21 +364,21 @@ QString ScriptEngineManager::expandUserVariables(QString context, RenderPass pas
pos += rx.matchedLength();
if (dataManager()->containsVariable(variable) ){
try {
if (pass==dataManager()->variablePass(variable)){
varValue = dataManager()->variable(variable);
switch (expandType){
case EscapeSymbols:
context.replace(rx.cap(0),escapeSimbols(varValue.toString()));
break;
case NoEscapeSymbols:
context.replace(rx.cap(0),varValue.toString());
break;
case ReplaceHTMLSymbols:
context.replace(rx.cap(0),replaceHTMLSymbols(varValue.toString()));
break;
}
pos=0;
varValue = dataManager()->variable(variable);
switch (expandType){
case EscapeSymbols:
context.replace(rx.cap(0),escapeSimbols(varValue.toString()));
break;
case NoEscapeSymbols:
context.replace(rx.cap(0),varValue.toString());
break;
case ReplaceHTMLSymbols:
context.replace(rx.cap(0),replaceHTMLSymbols(varValue.toString()));
break;
}
pos=0;
} catch (ReportError e){
dataManager()->putError(e.what());
if (!dataManager()->reportSettings() || dataManager()->reportSettings()->suppressAbsentFieldsAndVarsWarnings())
@@ -540,12 +540,12 @@ QVariant ScriptEngineManager::evaluateScript(const QString& script){
return QVariant();
}
void ScriptEngineManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent)
void ScriptEngineManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int indent)
{
Q_ASSERT(m_context != 0);
if (m_context){
BandDesignIntf* currentBand = m_context->getCurrentBand();
m_context->tableOfContens()->setItem(uniqKey, content, pageNumber, indent);
m_context->tableOfContens()->setItem(uniqKey, content, 0, indent);
if (currentBand)
currentBand->addBookmark(uniqKey, content);
}
@@ -764,6 +764,25 @@ bool ScriptEngineManager::createGetFieldFunction()
return addFunction(fd);
}
bool ScriptEngineManager::createGetFieldByKeyFunction()
{
JSFunctionDesc fd;
fd.setManager(m_functionManager);
fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME);
fd.setCategory(tr("GENERAL"));
fd.setName("getFieldByKeyField");
fd.setDescription("getFieldByKeyField(\""+tr("Datasource")+"\", \""+
tr("ValueField")+"\",\""+
tr("KeyField")+"\", \""+
tr("KeyFieldValue")+"\")"
);
fd.setScriptWrapper(QString("function getFieldByKeyField(datasource, valueFieldName, keyFieldName, keyValue){"
"return %1.getFieldByKeyField(datasource, valueFieldName, keyFieldName, keyValue);}"
).arg(LimeReport::Const::FUNCTION_MANAGER_NAME)
);
return addFunction(fd);
}
bool ScriptEngineManager::createAddTableOfContensItemFunction()
{
JSFunctionDesc fd;
@@ -771,9 +790,9 @@ bool ScriptEngineManager::createAddTableOfContensItemFunction()
fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME);
fd.setCategory(tr("GENERAL"));
fd.setName("addTableOfContensItem");
fd.setDescription("addTableOfContensItem(\""+tr("Unique identifier")+" \""+tr("Content")+"\", \""+tr("Page Number")+", \""+tr("Indent")+"\")");
fd.setScriptWrapper(QString("function addTableOfContensItem(uniqKey, content, pageNumber, indent){"
"return %1.addTableOfContensItem(uniqKey, content, pageNumber, indent);}"
fd.setDescription("addTableOfContensItem(\""+tr("Unique identifier")+" \""+tr("Content")+"\", \""+tr("Indent")+"\")");
fd.setScriptWrapper(QString("function addTableOfContensItem(uniqKey, content, indent){"
"return %1.addTableOfContensItem(uniqKey, content, indent);}"
).arg(LimeReport::Const::FUNCTION_MANAGER_NAME)
);
return addFunction(fd);
@@ -814,6 +833,7 @@ ScriptEngineManager::ScriptEngineManager()
#endif
createSetVariableFunction();
createGetFieldFunction();
createGetFieldByKeyFunction();
createGetVariableFunction();
#ifndef USE_QJSENGINE
QScriptValue colorCtor = m_scriptEngine->newFunction(constructColor);
@@ -1466,9 +1486,15 @@ QVariant ScriptFunctionsManager::getField(const QString &field)
return dm->fieldData(field);
}
void ScriptFunctionsManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent)
QVariant ScriptFunctionsManager::getFieldByKeyField(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue)
{
scriptEngineManager()->addTableOfContensItem(uniqKey, content, pageNumber, indent);
DataSourceManager* dm = scriptEngineManager()->dataManager();
return dm->fieldDataByKey(datasourceName, valueFieldName, keyFieldName, keyValue);
}
void ScriptFunctionsManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int indent)
{
scriptEngineManager()->addTableOfContensItem(uniqKey, content, indent);
}
void ScriptFunctionsManager::clearTableOfContens()
@@ -1532,6 +1558,7 @@ void TableOfContens::setItem(const QString& uniqKey, const QString& content, int
item->content = content;
item->pageNumber = pageNumber;
item->indent = indent;
item->uniqKey = uniqKey;
m_tableOfContens.append(item);
m_hash.insert(uniqKey, item);
}
@@ -1541,7 +1568,7 @@ void TableOfContens::setItem(const QString& uniqKey, const QString& content, int
void TableOfContens::slotOneSlotDS(CallbackInfo info, QVariant& data)
{
QStringList columns;
columns << "Content" << "Page number";
columns << "Content" << "Page number" << "Content Key";
switch (info.dataType) {
case LimeReport::CallbackInfo::RowCount:
@@ -1557,9 +1584,11 @@ void TableOfContens::slotOneSlotDS(CallbackInfo info, QVariant& data)
case LimeReport::CallbackInfo::ColumnData:
if (info.index < m_tableOfContens.count()){
ContentItem* item = m_tableOfContens.at(info.index);
if (info.columnName == "Content")
if (info.columnName.compare("Content",Qt::CaseInsensitive) == 0)
data = item->content.rightJustified(item->indent+item->content.size());
else
if (info.columnName.compare("Content Key",Qt::CaseInsensitive) == 0)
data = item->uniqKey;
if (info.columnName.compare("Page number",Qt::CaseInsensitive) == 0)
data = QString::number(item->pageNumber);
}
break;

View File

@@ -63,6 +63,7 @@ struct ContentItem {
QString content;
int indent;
int pageNumber;
QString uniqKey;
};
class TableOfContens : public QObject{
@@ -278,8 +279,9 @@ public:
Q_INVOKABLE void setVariable(const QString& name, QVariant value);
Q_INVOKABLE QVariant getVariable(const QString& name);
Q_INVOKABLE QVariant getField(const QString& field);
Q_INVOKABLE QVariant getFieldByKeyField(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue);
Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);}
Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent = 0);
Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent = 0);
Q_INVOKABLE void clearTableOfContens();
#ifdef USE_QJSENGINE
Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false);
@@ -320,7 +322,7 @@ public:
QString expandDataFields(QString context, ExpandType expandType, QVariant &varValue, QObject* reportItem);
QString expandScripts(QString context, QVariant &varValue, QObject* reportItem);
QVariant evaluateScript(const QString &script);
void addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent);
void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent);
void clearTableOfContens();
protected:
@@ -340,6 +342,7 @@ private:
bool createSetVariableFunction();
bool createGetVariableFunction();
bool createGetFieldFunction();
bool createGetFieldByKeyFunction();
bool createAddTableOfContensItemFunction();
bool createClearTableOfContensFunction();
private: