From 2c2fc4cff5fc4bd6c47bd4dbf0408f828b961d40 Mon Sep 17 00:00:00 2001 From: yanis60 <30592254+yanis60@users.noreply.github.com> Date: Sun, 23 Jun 2024 20:20:13 +0100 Subject: [PATCH] removed 'Nouveau dossier' folder --- Nouveau dossier/lrbasedesignintf.cpp | 2069 -------------------------- Nouveau dossier/lrbasedesignintf.h | 536 ------- Nouveau dossier/lrbordereditor.cpp | 162 -- Nouveau dossier/lrbordereditor.h | 50 - Nouveau dossier/lrgroupbands.cpp | 229 --- Nouveau dossier/lrgroupbands.h | 99 -- Nouveau dossier/lrreportrender.cpp | 1808 ---------------------- Nouveau dossier/lrreportrender.h | 227 --- 8 files changed, 5180 deletions(-) delete mode 100644 Nouveau dossier/lrbasedesignintf.cpp delete mode 100644 Nouveau dossier/lrbasedesignintf.h delete mode 100644 Nouveau dossier/lrbordereditor.cpp delete mode 100644 Nouveau dossier/lrbordereditor.h delete mode 100644 Nouveau dossier/lrgroupbands.cpp delete mode 100644 Nouveau dossier/lrgroupbands.h delete mode 100644 Nouveau dossier/lrreportrender.cpp delete mode 100644 Nouveau dossier/lrreportrender.h diff --git a/Nouveau dossier/lrbasedesignintf.cpp b/Nouveau dossier/lrbasedesignintf.cpp deleted file mode 100644 index 90fca96..0000000 --- a/Nouveau dossier/lrbasedesignintf.cpp +++ /dev/null @@ -1,2069 +0,0 @@ -/*************************************************************************** - * This file is part of the Lime Report project * - * Copyright (C) 2021 by Alexander Arin * - * arin_a@bk.ru * - * * - ** GNU General Public License Usage ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - ** GNU Lesser General Public License ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * 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 General Public License for more details. * - ****************************************************************************/ -#include -#include "lrbasedesignintf.h" -#include "lrglobal.h" -#include "lrpagedesignintf.h" -#include "lrreportdesignwidget.h" -#include "qgraphicsitem.h" -#include "lrdesignelementsfactory.h" -#include "lrhorizontallayout.h" -#include "serializators/lrstorageintf.h" -#include "serializators/lrxmlreader.h" -#include "lrbordereditor.h" -#include -#include -#include -#include -#include -#include -#include -#include - -namespace LimeReport -{ - -BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, QGraphicsItem *parent) : - QObject(owner), QGraphicsItem(parent), - m_resizeHandleSize(Const::RESIZE_HANDLE_SIZE*2), - m_selectionPenSize(Const::SELECTION_PEN_SIZE), - m_possibleResizeDirectionFlags(ResizeTop | ResizeBottom | ResizeLeft | ResizeRight), - m_possibleMoveDirectionFlags(All), - m_resizeDirectionFlags(0), - m_width(200), - m_height(50), - m_fontColor(Qt::black), - m_fixedPos(false), - m_borderLineSize(1), - m_BGMode(OpaqueMode), - m_opacity(100), - m_borderLinesFlags(BorderLines()), - m_borderStyle(BorderStyle::Solid), - m_storageTypeName(storageTypeName), - m_itemMode(DesignMode), - m_objectState(ObjectCreated), - m_backgroundBrushStyle(SolidPattern), - m_backgroundColor(Qt::white), - m_margin(4), - m_itemAlign(DesignedItemAlign), - m_changingItemAlign(false), - m_borderColor(Qt::black), - m_reportSettings(0), - m_patternName(""), - m_patternItem(0), - m_fillInSecondPass(false), - m_watermark(false), - m_hovered(false), - m_joinMarkerOn(false), - m_selectionMarker(0), - m_fillTransparentInDesignMode(true), - m_unitType(Millimeters), - m_itemGeometryLocked(false), - m_isChangingPos(false), - m_isMoveable(false), - m_shadow(false) - - -{ - setGeometry(QRectF(0, 0, m_width, m_height)); - if (BaseDesignIntf *item = dynamic_cast(parent)) { - m_font = item->font(); - } else{ - m_font = QFont("Arial",10); - } - initFlags(); -} - -QRectF BaseDesignIntf::boundingRect() const -{ - qreal halfpw = pen().widthF() / 2; - halfpw += 2; - return rect().adjusted(-halfpw, -halfpw, halfpw, halfpw); -} - -BaseDesignIntf::~BaseDesignIntf(void) { - -} - -void BaseDesignIntf::setParentReportItem(const QString &value) -{ - if (page() && !value.isEmpty()) { - BaseDesignIntf *p = page()->reportItemByName(value); - if (p) { - setParentItem(p); - setParent(p); - } - } -} - -QString BaseDesignIntf::parentReportItemName() const -{ - BaseDesignIntf *parent = dynamic_cast(parentItem()); - if (parent) return parent->objectName(); - else return ""; -} - -void BaseDesignIntf::setBackgroundBrushStyle(BrushStyle value) -{ - if ( value != m_backgroundBrushStyle ){ - BrushStyle oldValue = m_backgroundBrushStyle; - m_backgroundBrushStyle=value; - if (!isLoading()) update(); - notify("backgroundBrushStyle", static_cast(oldValue), static_cast(value)); - } -} - -void BaseDesignIntf::setBackgroundColor(QColor value) -{ - if (value != m_backgroundColor){ - QColor oldValue = m_backgroundColor; - m_backgroundColor=value; - if (!isLoading()) update(); - notify("backgroundColor", oldValue, value); - } -} - -QPen BaseDesignIntf::pen() const -{ - return m_pen; -} - -void BaseDesignIntf::setPen(QPen &pen) -{ - m_pen = pen; - update(); -} - -QFont BaseDesignIntf::font() const -{ - return m_font; -} - -void BaseDesignIntf::setFont(QFont &font) -{ - if (m_font != font){ - m_font = font; - if (!isLoading()) update(); - } -} - -qreal BaseDesignIntf::width() const -{ - return rect().width(); -} - -void BaseDesignIntf::setWidth(qreal width) -{ - setGeometry(QRectF(rect().x(), rect().y(), width, rect().height())); - if (!m_changingItemAlign) - updateItemAlign(); -} - -QString BaseDesignIntf::setItemWidth(qreal width) -{ - setWidth(width * unitFactor()); - return QString(); -} - -qreal BaseDesignIntf::height() const -{ - return rect().height(); -} - -QRect BaseDesignIntf::geometry() const -{ - return QRect(pos().x(), pos().y(), width(), height()); -} - -void BaseDesignIntf::setHeight(qreal height) -{ - setGeometry(QRectF(rect().x(), rect().y(), rect().width(), height)); -} - -QString BaseDesignIntf::setItemHeight(qreal height) -{ - setHeight(height * unitFactor()); - return QString(); -} - -qreal BaseDesignIntf::getItemWidth() -{ - return width() / unitFactor(); -} - -qreal BaseDesignIntf::getItemHeight() -{ - return height() / unitFactor(); -} - -qreal BaseDesignIntf::getItemPosX() -{ - return x() / unitFactor(); -} - -qreal BaseDesignIntf::getItemPosY() -{ - return y() / unitFactor(); -} - -qreal BaseDesignIntf::getAbsolutePosX() -{ - return calcAbsolutePosX(0,this); -} - -qreal BaseDesignIntf::getAbsolutePosY() -{ - return calcAbsolutePosY(0,this); -} - -QString BaseDesignIntf::setItemPosX(qreal xValue) -{ - setItemPos(xValue * unitFactor(),y()); - return QString(); -} - -QString BaseDesignIntf::setItemPosY(qreal yValue) -{ - setItemPos(x(),yValue * unitFactor()); - return QString(); -} - -QFont BaseDesignIntf::transformToSceneFont(const QFont& value) const -{ - QFont f = value; - f.setPixelSize(f.pointSize()*Const::fontFACTOR); - return f; -} - -QString BaseDesignIntf::expandDataFields(QString context, ExpandType expandType, DataSourceManager* dataManager) -{ - ScriptEngineManager& sm = ScriptEngineManager::instance(); - if (sm.dataManager() != dataManager) sm.setDataManager(dataManager); - return sm.expandDataFields(context, expandType, m_varValue, this); -} - -QString BaseDesignIntf::expandUserVariables(QString context, RenderPass pass, ExpandType expandType, DataSourceManager* dataManager) -{ - - ScriptEngineManager& sm = ScriptEngineManager::instance(); - if (sm.dataManager() != dataManager) sm.setDataManager(dataManager); - return sm.expandUserVariables(context, pass, expandType, m_varValue); - -} - -QString BaseDesignIntf::expandScripts(QString context, DataSourceManager* dataManager) -{ - - ScriptEngineManager& sm = ScriptEngineManager::instance(); - if (sm.dataManager() != dataManager) sm.setDataManager(dataManager); - return sm.expandScripts(context,m_varValue,this); - -} - -void BaseDesignIntf::setupPainter(QPainter *painter) const -{ - if (!painter) { - return; - } - painter->setFont(m_font); - painter->setPen(m_fontColor); -} - -BaseDesignIntf::BGMode BaseDesignIntf::backgroundMode() const -{ - return m_BGMode; -} -void BaseDesignIntf::setBackgroundMode(BGMode bgMode) -{ - m_BGMode = bgMode; - update(boundingRect()); -} - -int BaseDesignIntf::opacity() const -{ - return m_opacity; -} - -void BaseDesignIntf::setOpacity(int opacity) -{ - if (m_opacity!=opacity){ - if (opacity < 0) { - m_opacity = 0; - } - else if (opacity > 100) { - m_opacity = 100; - } - else { - m_opacity = opacity; - } - update(); - } -} - -void BaseDesignIntf::setSize(QSizeF size) -{ - setWidth(size.width()); - setHeight(size.height()); -} - -QSizeF BaseDesignIntf::size() const -{ - return QSizeF(width(), height()); -} - -QSizeF BaseDesignIntf::sizeMM() const -{ - return QSizeF(width() / Const::mmFACTOR, height() / Const::mmFACTOR); -} - -qreal BaseDesignIntf::widthMM() const -{ - return width() / Const::mmFACTOR; -} - -qreal BaseDesignIntf::heightMM() const -{ - return height() / Const::mmFACTOR; -} - -//void BaseDesignIntf::setUnitFactor(qreal unitFactor) -//{ -// m_unitFactor = unitFactor; -//} - -qreal BaseDesignIntf::unitFactor() const -{ - if (m_unitType == Millimeters) - return Const::mmFACTOR; - else return Const::mmFACTOR * 2.54; -} - -void BaseDesignIntf::setUnitType(BaseDesignIntf::UnitType value) -{ - foreach(BaseDesignIntf* child, childBaseItems()) - child->setUnitType(value); - m_unitType = value; -} - -BaseDesignIntf::UnitType BaseDesignIntf::unitType() -{ - return m_unitType; -} - -QPointF BaseDesignIntf::posMM() const -{ - return QPointF(pos().x() / Const::mmFACTOR, pos().y() / Const::mmFACTOR); -} - -QRectF BaseDesignIntf::rect() const -{ - return m_rect; -} - -void BaseDesignIntf::setFixedPos(bool fixedPos) -{ - m_fixedPos = fixedPos; -} - -void BaseDesignIntf::onChangeGeometryTimeOut(){ - m_isMoveable = true; -} - -void BaseDesignIntf::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - if (event->button() == Qt::LeftButton) { - m_isChangingPos = true; - m_resizeDirectionFlags = resizeDirectionFlags(event->pos()); - m_startPos = pos(); - m_oldGeometry = geometry(); - QGraphicsItem::mousePressEvent(event); - emit itemSelected(this); - m_isMoveable = false; - QTimer::singleShot(200, this, SLOT(onChangeGeometryTimeOut())); - } - else QGraphicsItem::mousePressEvent(event); -} - -void BaseDesignIntf::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - removeGuideLines(); - QRectF newGeometry = geometry(); - m_isChangingPos = false; - if (newGeometry != m_oldGeometry) { - geometryChangedEvent(newGeometry, m_oldGeometry); - emit posChanged(this, newGeometry.topLeft(), m_oldGeometry.topLeft()); - } - QGraphicsItem::mouseReleaseEvent(event); -} - -void BaseDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget) -{ - Q_UNUSED(option); - Q_UNUSED(widget); - - ppainter->save(); - setupPainter(ppainter); - if(!isPageItem()) - drawBorder(ppainter, rect()); - else - drawBorder(ppainter, page()->pageItem()->pageRect()); - if(m_shadow) - drawShadow(ppainter, rect(), 6); - // if (m_joinMarkerOn) { drawMarker(ppainter, Const::JOIN_COLOR);} - // if (isSelected() && !m_joinMarkerOn) {drawMarker(ppainter, Const::SELECTION_COLOR);} - drawResizeZone(ppainter); - ppainter->restore(); - // if (m_hovered) ppainter->drawImage( - // QRectF(QPointF(rect().topRight().x()-24, rect().bottomLeft().y()-24), - // QSizeF(24, 24)),QImage(":/items/images/settings.png")); -} - -QColor calcColor(QColor color){ - - int R = color.red(); - int G = color.green(); - int B = color.blue(); - - if (0.222*R + 0.707*G + 0.071*B <= 127) - return Qt::white; - else - return Qt::black; -} - -void BaseDesignIntf::prepareRect(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) -{ - painter->save(); - - QRectF r = rect().adjusted(0, 0, borderLineSize(), borderLineSize()); - QBrush brush(m_backgroundColor,static_cast(m_backgroundBrushStyle)); - brush.setTransform(painter->worldTransform().inverted()); - - if (isSelected() && (opacity() == 100) && (m_BGMode!=TransparentMode)) { - painter->fillRect(r, brush); - } - else { - if (m_BGMode == OpaqueMode) { - qreal o = (itemMode() & DesignMode) ? 0.5 : qreal(m_opacity) / 100; - painter->setOpacity(o); - painter->fillRect(r, brush); - } else if ((itemMode() & DesignMode) && fillTransparentInDesignMode()){ - painter->setOpacity(0.1); - painter->fillRect(r, QBrush(QPixmap(":/report/images/empty"))); - } - } - painter->restore(); -} - -void BaseDesignIntf::hoverMoveEvent(QGraphicsSceneHoverEvent *event) -{ - if (page()) { - if (!page()->isItemInsertMode() && isSelected()) { - if (m_resizeDirectionFlags != resizeDirectionFlags(event->pos())) { - m_resizeDirectionFlags = resizeDirectionFlags(event->pos()); - QVectoroldResizeAreas(m_resizeAreas); - initResizeZones(); - invalidateRects(oldResizeAreas); - invalidateRects(m_resizeAreas); - switch (m_resizeDirectionFlags) { - case ResizeRight: - case ResizeLeft: - setCursor(Qt::SizeHorCursor); - break; - case ResizeBottom: - case ResizeTop: - setCursor(Qt::SizeVerCursor); - break; - case ResizeRight | ResizeBottom: - case ResizeLeft | ResizeTop: - setCursor(Qt::SizeFDiagCursor); - break; - case ResizeLeft | ResizeBottom: - case ResizeRight | ResizeTop: - setCursor(Qt::SizeBDiagCursor); - break; - default: - setCursor(Qt::ArrowCursor); - break; - } - } - } - } -} - -void BaseDesignIntf::invalidateRects(QVector rects) -{ - foreach(QRectF * rect, rects) - scene()->update(mapToScene(*rect).boundingRect()); -} - -void BaseDesignIntf::hoverLeaveEvent(QGraphicsSceneHoverEvent *) -{ - setCursor(QCursor(Qt::ArrowCursor)); - m_resizeDirectionFlags = 0; - scene()->update(sceneBoundingRect()); - m_resizeAreas.clear(); - m_hovered = false; - update(); -} - -void BaseDesignIntf::hoverEnterEvent(QGraphicsSceneHoverEvent * /*event*/) -{ - m_hovered = true; - update(); -} - - -void BaseDesignIntf::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - if (!m_isMoveable) return; - if (!isSelected()){ - QGraphicsItem::mouseMoveEvent(event); - return; - } - - - int hStep = dynamic_cast(scene())->horizontalGridStep(); - int vStep = dynamic_cast(scene())->verticalGridStep(); - - if (m_resizeDirectionFlags & ResizeLeft) { - if ((event->scenePos().x()) <= (mapToScene(0, 0).x() + (width() - Const::MINIMUM_ITEM_WIDTH)) && - (width() + (event->lastScenePos().x() - event->scenePos().x()) > Const::MINIMUM_ITEM_WIDTH) - ) { - qreal posRightCorner = mapToScene(0, 0).x() + width(); - qreal posLeftCorner = div(mapToParent(event->pos()).x(), hStep).quot * hStep; - if (posLeftCorner < 0 ) - posLeftCorner = 0; - setItemPos(posLeftCorner, y()); - setWidth(div(posRightCorner - mapToScene(0, 0).x(), hStep).quot * hStep); - } - } - - if (m_resizeDirectionFlags & ResizeRight) { - if ((event->scenePos().x() >= (mapToScene(0, 0).x() + Const::MINIMUM_ITEM_WIDTH)) || - (event->scenePos().x() >= (mapToScene(0, 0).x() + width()))) { - setWidth(div(event->scenePos().x() - mapToScene(0, 0).x(), hStep).quot * hStep); - } - } - - if (m_resizeDirectionFlags & ResizeTop) { - if ((event->scenePos().y()) <= (mapToScene(0, 0).y() + (height() - Const::MINIMUM_ITEM_HEIGHT)) && - (height() + (event->lastScenePos().y() - event->scenePos().y()) > Const::MINIMUM_ITEM_HEIGHT) - ) { - qreal posBottomCorner = mapToScene(0, 0).y() + height(); - qreal posTopCorner = div(mapToParent(event->pos()).y(), vStep).quot * vStep; - if (posTopCorner < 0 ) - posTopCorner = 0; - setItemPos(x(), posTopCorner); - setHeight(div(posBottomCorner - mapToScene(0, 0).y(), vStep).quot * vStep); - } - } - - if (m_resizeDirectionFlags & ResizeBottom) { - if ((event->scenePos().y() > (mapToScene(0, 0).y() + height())) || - (event->scenePos().y() > (mapToScene(0, 0).y() + Const::MINIMUM_ITEM_HEIGHT)) - ) { - setHeight(div(event->scenePos().y() - mapToScene(0, 0).y(), vStep).quot * vStep); - } - } - - if ((m_resizeDirectionFlags == Fixed) && !m_fixedPos) { - - QPointF tmpPos = pos(); - QPointF delta; - switch (possibleMoveDirectionFlags()) { - case LeftRight: { - delta = QPoint(div(event->buttonDownScenePos(Qt::LeftButton).x() - event->scenePos().x(), hStep).quot * hStep, 0); - break; - } - case TopBotom: { - delta = QPoint(0, div(event->buttonDownScenePos(Qt::LeftButton).y() - event->scenePos().y(), vStep).quot * vStep); - break; - } - case All: { - delta = QPoint(div(event->buttonDownScenePos(Qt::LeftButton).x() - event->scenePos().x(), hStep).quot * hStep, - div(event->buttonDownScenePos(Qt::LeftButton).y() - event->scenePos().y(), vStep).quot * vStep); - break; - } - }; - - setItemPos(QPointF(div(m_startPos.x(), hStep).quot * hStep, div(m_startPos.y(), vStep).quot * vStep) - delta); - - if (page()){ - if (!isBand() && page()->selectedItems().count()>1) - moveSelectedItems(tmpPos - pos()); - if (page()->selectedItems().count()==1 && (page()->magneticMovement())) - page()->itemMoved(this); - - } - } - if (scene() && !scene()->selectedItems().isEmpty()) { - QGraphicsItem *movingItem = scene()->selectedItems().first(); - removeGuideLines(); - - for (QGraphicsItem *item : scene()->items()) { - if (item != movingItem) { - qreal topDiff = qAbs(item->sceneBoundingRect().bottom() - movingItem->sceneBoundingRect().bottom()); - qreal bottomDiff = qAbs(item->sceneBoundingRect().top() - movingItem->sceneBoundingRect().top()); - qreal leftDiff = qAbs(item->sceneBoundingRect().left() - movingItem->sceneBoundingRect().left()); - qreal rightDiff = qAbs(item->sceneBoundingRect().right() - movingItem->sceneBoundingRect().right()); - - if (topDiff == 0) - addGuideLine(item->sceneBoundingRect().left(), item->sceneBoundingRect().top(), - movingItem->sceneBoundingRect().left(), movingItem->sceneBoundingRect().top()); - if (bottomDiff == 0) - addGuideLine(item->sceneBoundingRect().left(), item->sceneBoundingRect().bottom(), - movingItem->sceneBoundingRect().left(), movingItem->sceneBoundingRect().bottom()); - if (leftDiff == 0) - addGuideLine(item->sceneBoundingRect().left(), item->sceneBoundingRect().top(), - movingItem->sceneBoundingRect().left(), movingItem->sceneBoundingRect().top()); - if (rightDiff == 0) - addGuideLine(item->sceneBoundingRect().right(), item->sceneBoundingRect().top(), - movingItem->sceneBoundingRect().right(), movingItem->sceneBoundingRect().top()); - } - } - } -} - -int BaseDesignIntf::possibleResizeDirectionFlags() const -{ - return m_possibleResizeDirectionFlags; -} - -int BaseDesignIntf::resizeHandleSize() const -{ - return m_resizeHandleSize; -} - -int BaseDesignIntf::resizeDirectionFlags(QPointF position) -{ - int flags = Fixed; - - if (possibleResizeDirectionFlags()&ResizeTop && m_topRect.contains(position)) { - flags |= ResizeTop; - } - - if (possibleResizeDirectionFlags()&ResizeLeft && m_leftRect.contains(position)) { - flags |= ResizeLeft; - } - - if (possibleResizeDirectionFlags()&ResizeBottom && m_bottomRect.contains(position)) { - flags |= ResizeBottom; - } - - if (possibleResizeDirectionFlags()&ResizeRight && m_rightRect.contains(position)) { - flags |= ResizeRight; - } - - return flags; -} - -Qt::CursorShape BaseDesignIntf::getPossibleCursor(int cursorFlags) -{ - - if ((cursorFlags == Fixed) || (scene()->selectedItems().count() > 1)) return Qt::ArrowCursor; - - if (((cursorFlags & ResizeRight) && (cursorFlags & ResizeTop)) || - ((cursorFlags & ResizeLeft) && (cursorFlags & ResizeBottom))) { - return Qt::SizeBDiagCursor; - } - if (((cursorFlags & ResizeLeft) && (cursorFlags & ResizeTop)) || - ((cursorFlags & ResizeRight) && (cursorFlags & ResizeBottom))) { - return Qt::SizeFDiagCursor; - } - if ((cursorFlags & ResizeLeft) || (cursorFlags & ResizeRight)) { return Qt::SizeHorCursor; } - if ((cursorFlags & ResizeBottom) || (cursorFlags & ResizeTop)) { return Qt::SizeVerCursor; } - - return Qt::ArrowCursor; -} - -void BaseDesignIntf::setZValueProperty(qreal value) -{ - if (zValue()!=value){ - qreal oldValue = zValue(); - setZValue(value); - notify("zOrder",oldValue,value); - } -} - -BaseDesignIntf::ItemAlign BaseDesignIntf::itemAlign() const -{ - return m_itemAlign; -} - -QPointF BaseDesignIntf::modifyPosForAlignedItem(const QPointF& pos){ - QPointF result = pos; - BaseDesignIntf* parent = dynamic_cast(parentItem()); - PageItemDesignIntf* parentPage = dynamic_cast(parentItem()); - if (parent){ - qreal leftBorder = parentPage ? parentPage->leftMargin() * Const::mmFACTOR : 0; - qreal rightBorder = parentPage ? parentPage->rightMargin() * Const::mmFACTOR : 0; - qreal avaibleSpace = parent->width()-(leftBorder+rightBorder); - - switch(m_itemAlign){ - case LeftItemAlign: - result.setX(leftBorder); - break; - case RightItemAlign: - result.setX(parent->width() - (rightBorder + width())); - break; - case CenterItemAlign: - result.setX((avaibleSpace-width()) / 2 + leftBorder); - break; - case ParentWidthItemAlign: - result.setX(leftBorder); - case DesignedItemAlign: - break; - } - } - return result; -} - -void BaseDesignIntf::turnOnJoinMarker(bool value) -{ - m_joinMarkerOn = value; - if (value){ - m_joinMarker = new Marker(this, this); - m_joinMarker->setColor(Const::JOIN_COLOR); - m_joinMarker->setRect(rect()); - m_joinMarker->setVisible(true); - } else { - delete m_joinMarker; - m_joinMarker = 0; - } -} - -void BaseDesignIntf::updateItemAlign(){ - BaseDesignIntf* parent = dynamic_cast(parentItem()); - PageItemDesignIntf* parentPage = dynamic_cast(parentItem()); - m_changingItemAlign = true; - if (parent){ - qreal leftBorder = parentPage ? parentPage->leftMargin() * Const::mmFACTOR : 0; - qreal rightBorder = parentPage ? parentPage->rightMargin() * Const::mmFACTOR : 0; - qreal aviableSpace = parent->width()-(leftBorder+rightBorder); - setPos(modifyPosForAlignedItem(pos())); - if (m_itemAlign == ParentWidthItemAlign) - setWidth(aviableSpace); - } - m_changingItemAlign = false; -} - -void BaseDesignIntf::updatePossibleDirectionFlags(){ - setPossibleResizeDirectionFlags(AllDirections); - switch(m_itemAlign){ - case LeftItemAlign: - setPossibleResizeDirectionFlags(AllDirections^ResizeLeft); - break; - case RightItemAlign: - setPossibleResizeDirectionFlags(AllDirections^ResizeRight); - break; - case ParentWidthItemAlign: - setPossibleResizeDirectionFlags(ResizeBottom|ResizeTop); - case CenterItemAlign: - case DesignedItemAlign: - break; - } -} - -void BaseDesignIntf::addGuideLine(qreal x1, qreal y1, qreal x2, qreal y2) -{ - QGraphicsLineItem *line = new QGraphicsLineItem(x1, y1, x2, y2); - line->setPen(QPen(Qt::red,2,Qt::DashLine)); - if(scene())scene()->addItem(line); - guideLines.append(line); -} - -void BaseDesignIntf::removeGuideLines() -{ - for (QGraphicsLineItem *line : guideLines) { - if(scene())scene()->removeItem(line); - delete line; - } - guideLines.clear(); -} - -bool BaseDesignIntf::isChangingPos() const -{ - return m_isChangingPos; -} - -void BaseDesignIntf::setIsChangingPos(bool isChangingPos) -{ - m_isChangingPos = isChangingPos; -} - -bool BaseDesignIntf::isShapeItem() const -{ - return QString(metaObject()->className()) == "LimeReport::ShapeItem"; -} - -bool BaseDesignIntf::isPageItem() const -{ -return QString(metaObject()->className()) == "LimeReport::PageItemDesignIntf"; -} - -bool BaseDesignIntf::hasShadow() -{ - return m_shadow; -} - -void BaseDesignIntf::setShadow(bool sh) -{ - if (m_shadow != sh){ - bool oldValue = m_shadow; - m_shadow = sh; - notify("shadow",oldValue,m_shadow); - update(); - } -} - -bool BaseDesignIntf::isGeometryLocked() const -{ - return m_itemGeometryLocked; -} - -void BaseDesignIntf::setGeometryLocked(bool itemLocked) -{ - if (m_itemGeometryLocked != itemLocked){ - m_itemGeometryLocked = itemLocked; - if (itemLocked){ - m_savedPossibleMoveDirectionFlags = m_possibleMoveDirectionFlags; - m_savedPossibleResizeDirectionFlags = m_possibleResizeDirectionFlags; - m_possibleMoveDirectionFlags = None; - m_possibleResizeDirectionFlags = Fixed; - m_savedFixedPos = m_fixedPos; - m_fixedPos = true; - } else { - m_possibleMoveDirectionFlags = m_savedPossibleMoveDirectionFlags; - m_possibleResizeDirectionFlags = m_savedPossibleResizeDirectionFlags; - m_fixedPos = m_savedFixedPos; - } - if (!isLoading()){ - update(); - m_selectionMarker->update(); - notify("geometryLocked", !itemLocked, itemLocked); - } - } -} - -bool BaseDesignIntf::fillTransparentInDesignMode() const -{ - return m_fillTransparentInDesignMode; -} - -void BaseDesignIntf::setFillTransparentInDesignMode(bool fillTransparentInDesignMode) -{ - m_fillTransparentInDesignMode = fillTransparentInDesignMode; -} - -void BaseDesignIntf::emitPosChanged(QPointF oldPos, QPointF newPos) -{ - emit posChanged(this, oldPos, newPos); -} - -bool BaseDesignIntf::fillInSecondPass() const -{ - return m_fillInSecondPass; -} - -void BaseDesignIntf::setFillInSecondPass(bool fillInSecondPass) -{ - - if (m_fillInSecondPass != fillInSecondPass){ - m_fillInSecondPass = fillInSecondPass; - notify("fillInSecondPass",!fillInSecondPass,fillInSecondPass); - } - -} - -bool BaseDesignIntf::isWatermark() const -{ - return m_watermark; -} - -void BaseDesignIntf::setWatermark(bool watermark) -{ - if (m_watermark != watermark){ - m_watermark = watermark; - notify("watermark",!watermark,watermark); - } -} - -void BaseDesignIntf::updateSelectionMarker() -{ - if (m_selectionMarker && (itemMode() & DesignMode || itemMode() & EditMode)) { - if ((!m_selectionMarker->scene()) && scene()) scene()->addItem(m_selectionMarker); - if (parentItem()) { - m_selectionMarker->setRect(rect()); - m_selectionMarker->setPos(0,0); - } - } -} - -void BaseDesignIntf::turnOnSelectionMarker(bool value) -{ - if (value && !m_selectionMarker){ - m_selectionMarker = new SelectionMarker(this, this); - m_selectionMarker->setColor(selectionMarkerColor()); - updateSelectionMarker(); - m_selectionMarker->setVisible(true); - } else { - delete m_selectionMarker; - m_selectionMarker = 0; - } -} - -QString BaseDesignIntf::patternName() const -{ - return (m_patternName.isEmpty()) ? objectName() : m_patternName; -} - -void BaseDesignIntf::setPatternName(const QString &patternName) -{ - m_patternName = patternName; -} - -BaseDesignIntf* BaseDesignIntf::patternItem() const -{ - return m_patternItem; -} - -void BaseDesignIntf::setPatternItem(BaseDesignIntf *patternItem) -{ - m_patternItem = patternItem; -} - -ReportSettings *BaseDesignIntf::reportSettings() const -{ - return m_reportSettings; -} - -void BaseDesignIntf::setReportSettings(ReportSettings *reportSettings) -{ - m_reportSettings = reportSettings; - foreach(BaseDesignIntf* child, childBaseItems()){ - child->setReportSettings(reportSettings); - } -} - -QColor BaseDesignIntf::borderColor() const -{ - return m_borderColor; -} - -void BaseDesignIntf::setBorderColor(const QColor &borderColor) -{ - if (m_borderColor != borderColor){ - QColor oldValue = m_borderColor; - m_borderColor = borderColor; - notify("borderColor",oldValue,borderColor); - update(); - } -} - -void BaseDesignIntf::setItemVisible(const bool &value) -{ - if (isVisible()!=value){ - setVisible(value); - emit itemVisibleHasChanged(this); - } -} - -void BaseDesignIntf::setItemAlign(const ItemAlign &itemAlign) -{ - if (m_itemAlign != itemAlign){ - ItemAlign oldValue = m_itemAlign; - m_itemAlign = itemAlign; - notify("itemAlign",oldValue,itemAlign); - updatePossibleDirectionFlags(); - updateItemAlign(); - emit itemAlignChanged(this, oldValue, itemAlign); - } -} - -QString BaseDesignIntf::itemTypeName() const -{ - return m_itemTypeName; -} - -void BaseDesignIntf::setItemTypeName(const QString &itemTypeName) -{ - m_itemTypeName = itemTypeName; -} - -void BaseDesignIntf::emitObjectNamePropertyChanged(const QString &oldName, const QString &newName) -{ - emit propertyObjectNameChanged(oldName,newName); -} - -qreal BaseDesignIntf::borderLineSize() const -{ - return m_borderLineSize; -} - -void BaseDesignIntf::setBorderStyle(BorderStyle b) -{ - BorderStyle oldValue = m_borderStyle; - m_borderStyle = b; - update(); - notify("borderStyle",(BorderStyle)oldValue,(BorderStyle)b); -} - -void BaseDesignIntf::setBorderLineSize(qreal value) -{ - qreal oldValue = m_borderLineSize; - m_borderLineSize = value; - update(); - notify("borderLineSize",oldValue,value); -} - - -void BaseDesignIntf::moveRight() -{ - if (!m_fixedPos && page()) setItemPos(pos().x() + page()->horizontalGridStep(), pos().y()); -} - -void BaseDesignIntf::moveLeft() -{ - if (!m_fixedPos && page()) setItemPos(pos().x() - page()->horizontalGridStep(), pos().y()); -} - -void BaseDesignIntf::moveDown() -{ - if (!m_fixedPos && page()) setItemPos(pos().x(), pos().y() + page()->verticalGridStep()); -} - -void BaseDesignIntf::moveUp() -{ - if (!m_fixedPos && page()) setItemPos(pos().x(), pos().y() - page()->verticalGridStep()); -} - -void BaseDesignIntf::sizeRight() -{ - if ((m_possibleResizeDirectionFlags & ResizeLeft) || - (m_possibleResizeDirectionFlags & ResizeRight)) { - if (page()) setWidth(width() + page()->horizontalGridStep()); - } -} - -void BaseDesignIntf::sizeLeft() -{ - if ((m_possibleResizeDirectionFlags & ResizeLeft) || - (m_possibleResizeDirectionFlags & ResizeRight)) { - if(page()) setWidth(width() - page()->horizontalGridStep()); - } -} - -void BaseDesignIntf::sizeUp() -{ - if ((m_possibleResizeDirectionFlags & ResizeTop) || - (m_possibleResizeDirectionFlags & ResizeBottom)) { - if (page()) setHeight(height() - page()->verticalGridStep()); - } -} - -void BaseDesignIntf::sizeDown() -{ - if ((m_possibleResizeDirectionFlags & ResizeTop) || - (m_possibleResizeDirectionFlags & ResizeBottom)) { - if (page()) setHeight(height() + page()->verticalGridStep()); - } -} - -void BaseDesignIntf::setBorderLinesFlags(BorderLines flags) -{ - if (m_borderLinesFlags!=flags){ - BorderLines oldValue = m_borderLinesFlags; - m_borderLinesFlags = flags; - if (!isLoading()) { - update(rect()); - notify("borders",QVariant(oldValue),QVariant(flags)); - } - } -} - -BaseDesignIntf::BorderLines BaseDesignIntf::borderLines() const -{ - return m_borderLinesFlags; -} - - -void BaseDesignIntf::drawTopLine(QPainter *painter, QRectF rect) const -{ - if(isShapeItem()) - return; - painter->setPen(borderPen(TopLine)); - if(!isPageItem()) - { - if(borderStyle() == BorderStyle::Doubled) - painter->drawLine(rect.x()+3+m_borderLineSize, - rect.y()+3+m_borderLineSize, - rect.width()-3-m_borderLineSize, - rect.y()+3+m_borderLineSize); - - painter->drawLine(rect.x(), rect.y(), rect.width(), rect.y()); - - } - else - { - - painter->drawLine(page()->pageItem()->pageRect().x(), - page()->pageItem()->pageRect().y(), - page()->pageItem()->pageRect().width() + (page()->pageItem()->leftMargin()*10), - page()->pageItem()->pageRect().y()); - if(borderStyle() == BorderStyle::Doubled) - painter->drawLine(page()->pageItem()->pageRect().x()+3+m_borderLineSize, - page()->pageItem()->pageRect().y()+3+m_borderLineSize, - page()->pageItem()->pageRect().width()-3-m_borderLineSize + (page()->pageItem()->leftMargin()*10), - page()->pageItem()->pageRect().y()+3+m_borderLineSize); - - } - -} - -void BaseDesignIntf::drawBootomLine(QPainter *painter, QRectF rect) const -{ - if(isShapeItem()) - return; - - painter->setPen(borderPen(BottomLine)); - if(!isPageItem()) - { - painter->drawLine(rect.x(), rect.height(), rect.width(), rect.height()); - if(borderStyle() == BorderStyle::Doubled) - painter->drawLine(rect.x()+3+m_borderLineSize, - rect.height()-3-m_borderLineSize, - rect.width()-3-m_borderLineSize, - rect.height()-3-m_borderLineSize); - } - else - { - - painter->drawLine(page()->pageItem()->pageRect().x(), - page()->pageItem()->pageRect().height() + (page()->pageItem()->topMargin()*10) - , page()->pageItem()->pageRect().width() + (page()->pageItem()->leftMargin()*10), - page()->pageItem()->pageRect().height() + (page()->pageItem()->topMargin()*10)); - if(borderStyle() == BorderStyle::Doubled) - painter->drawLine(page()->pageItem()->pageRect().x()+3+m_borderLineSize, - page()->pageItem()->pageRect().height()-3-m_borderLineSize + (page()->pageItem()->topMargin()*10), - page()->pageItem()->pageRect().width()-3-m_borderLineSize + (page()->pageItem()->leftMargin()*10), - page()->pageItem()->pageRect().height()-3-m_borderLineSize + (page()->pageItem()->topMargin()*10)); - } - -} - -void BaseDesignIntf::drawRightLine(QPainter *painter, QRectF rect) const -{ - if(isShapeItem()) - return; - painter->setPen(borderPen(RightLine)); - if(!isPageItem()) - { - painter->drawLine(rect.width(), rect.y(), rect.width(), rect.height()); - if(borderStyle() == BorderStyle::Doubled) - painter->drawLine(rect.width()-3 - m_borderLineSize, - rect.y()+3+m_borderLineSize, - rect.width()-3-m_borderLineSize, - rect.height()-3-m_borderLineSize); - } - else - { - painter->drawLine(page()->pageItem()->pageRect().width() + (page()->pageItem()->leftMargin()*10), page()->pageItem()->pageRect().y(), - page()->pageItem()->pageRect().width() + (page()->pageItem()->leftMargin()*10), - page()->pageItem()->pageRect().height() + (page()->pageItem()->topMargin()*10)); - if(borderStyle() == BorderStyle::Doubled) - painter->drawLine(page()->pageItem()->pageRect().width()-3 - m_borderLineSize + (page()->pageItem()->leftMargin()*10), - page()->pageItem()->pageRect().y()+3+m_borderLineSize, - page()->pageItem()->pageRect().width()-3-m_borderLineSize + (page()->pageItem()->leftMargin()*10), - page()->pageItem()->pageRect().height()-3-m_borderLineSize + (page()->pageItem()->topMargin()*10)); - } - - -} - -void BaseDesignIntf::drawLeftLine(QPainter *painter, QRectF rect) const -{ - if(isShapeItem()) - return; - painter->setPen(borderPen(LeftLine)); - if(!isPageItem()) - { - painter->drawLine(rect.x(), rect.y(), rect.x(), rect.height()); - if(borderStyle() == BorderStyle::Doubled) - painter->drawLine(page()->pageItem()->pageRect().x()+3+m_borderLineSize, - page()->pageItem()->pageRect().y()+3+m_borderLineSize, - page()->pageItem()->pageRect().x()+3+m_borderLineSize, - page()->pageItem()->pageRect().height()-3-m_borderLineSize); - } - else - { - painter->drawLine(page()->pageItem()->pageRect().x(), - page()->pageItem()->pageRect().y(), - page()->pageItem()->pageRect().x(), - page()->pageItem()->pageRect().height() + (page()->pageItem()->topMargin()*10)); - if(borderStyle() == BorderStyle::Doubled) - painter->drawLine(page()->pageItem()->pageRect().x()+3+m_borderLineSize, - page()->pageItem()->pageRect().y()+3+m_borderLineSize, - page()->pageItem()->pageRect().x()+3+m_borderLineSize, - page()->pageItem()->pageRect().height()-3-m_borderLineSize + (page()->pageItem()->topMargin()*10)); - } - - -} - -void BaseDesignIntf::drawDesignModeBorder(QPainter *painter, QRectF rect) const -{ - if(isShapeItem()) - return; - drawTopLine(painter, rect); - drawBootomLine(painter, rect); - drawLeftLine(painter, rect); - drawRightLine(painter, rect); -} - -void BaseDesignIntf::drawRenderModeBorder(QPainter *painter, QRectF rect) const -{ - if(isShapeItem()) - return; - if (m_borderLinesFlags & RightLine) drawRightLine(painter, rect); - if (m_borderLinesFlags & LeftLine) drawLeftLine(painter, rect); - if (m_borderLinesFlags & TopLine ) drawTopLine(painter, rect); - if (m_borderLinesFlags & BottomLine) drawBootomLine(painter, rect); -} - -void BaseDesignIntf::drawBorder(QPainter *painter, QRectF rect) const -{ - painter->save(); - if (itemMode() & DesignMode && drawDesignBorders()) { - drawDesignModeBorder(painter, rect); - } - else drawRenderModeBorder(painter, rect); - painter->restore(); -} - -void BaseDesignIntf::drawShadow(QPainter *painter, QRectF rect, qreal shadowSize) const -{ - qreal shWidth = shadowSize; - QRectF rshadow(rect.topRight() + QPointF(0, shWidth), - rect.bottomRight() + QPointF(shWidth, 0)); - QLinearGradient rgrad(rshadow.topLeft(), rshadow.topRight()); - rgrad.setColorAt(0.0, QColor(0,0,0,255)); - rgrad.setColorAt(1.0, QColor(0,0,0,0)); - painter->fillRect(rshadow, QBrush(rgrad)); - QRectF bshadow(rect.bottomLeft() + QPointF(shWidth, 0), - rect.bottomRight() + QPointF(0, shWidth)); - QLinearGradient bgrad(bshadow.topLeft(), bshadow.bottomLeft()); - bgrad.setColorAt(0.0, QColor(0,0,0,255)); - bgrad.setColorAt(1.0, QColor(0,0,0,0)); - painter->fillRect(bshadow, QBrush(bgrad)); - QRectF cshadow(rect.bottomRight(), - rect.bottomRight() + QPointF(shWidth, shWidth)); - QRadialGradient cgrad(cshadow.topLeft(), shWidth, cshadow.topLeft()); - cgrad.setColorAt(0.0, QColor(0,0,0,255)); - cgrad.setColorAt(1.0, QColor(0,0,0,0)); - painter->fillRect(cshadow, QBrush(cgrad)); -} - -void BaseDesignIntf::setGeometry(QRectF rect) -{ - if (m_rect == rect) return; - m_oldGeometry = m_rect; - if (!isLoading()) - prepareGeometryChange(); - m_rect = rect; - m_topRect = QRectF(0-resizeHandleSize(), 0-resizeHandleSize(), width()+resizeHandleSize()*2, resizeHandleSize()*2); - m_bottomRect = QRectF(0-resizeHandleSize(), height() - resizeHandleSize(), width()+resizeHandleSize()*2, resizeHandleSize()*2); - m_leftRect = QRectF(0-resizeHandleSize(), 0-resizeHandleSize(), resizeHandleSize()*2, height()+resizeHandleSize()*2); - m_rightRect = QRectF(width() - resizeHandleSize(), 0-resizeHandleSize(), resizeHandleSize()*2, height()+resizeHandleSize()*2); - m_boundingRect = QRectF(); - updateSelectionMarker(); - if (!isLoading()){ - geometryChangedEvent(geometry(), m_oldGeometry); - emit geometryChanged(this, geometry(), m_oldGeometry); - } -} - -void BaseDesignIntf::geometryChangedEvent(QRectF newRect, QRectF oldRect) -{ - Q_UNUSED(oldRect); - Q_UNUSED(newRect); -} - -void BaseDesignIntf::beforeDelete() -{ - -} - -void BaseDesignIntf::setGeometryProperty(QRect rect) -{ - if ( rect != m_itemGeometry ){ - QRectF oldValue = geometry(); - if ((rect.x() != geometry().x()) || (rect.y() != geometry().y())) - setPos(rect.x(), rect.y()); - if (rect.width() != geometry().width()) - setWidth(rect.width()); - if (rect.height() != geometry().height()) - setHeight(rect.height()); - if (!isLoading()) { - notify("geometry",oldValue,rect); - } - } -} - -PageDesignIntf *BaseDesignIntf::page() const -{ - return dynamic_cast(scene()); -} - -void BaseDesignIntf::setPossibleResizeDirectionFlags(int directionsFlags) -{ - m_possibleResizeDirectionFlags = directionsFlags; -} - -QPen BaseDesignIntf::borderPen(BorderSide side/*, bool selected*/) const -{ - QPen pen; - if (m_borderLinesFlags & side) { - pen.setColor(m_borderColor); - if(borderStyle() != BorderStyle::Doubled) - pen.setStyle(static_cast(m_borderStyle)); - //pen.setCosmetic(true); - pen.setWidthF(m_borderLineSize+1); //To draw with point precision (By default: 2px = 1 pt) - - } else { - pen.setColor(Qt::darkGray); - pen.setStyle(Qt::SolidLine); - pen.setWidth(1); - } - return pen; -} - -QColor BaseDesignIntf::selectionColor() const -{ - return Const::SELECTION_COLOR; -} - -void BaseDesignIntf::initFlags() -{ - if ((itemMode()&DesignMode) || (itemMode()&EditMode)) { - setFlag(QGraphicsItem::ItemIsSelectable); - setFlag(QGraphicsItem::ItemSendsGeometryChanges); - setAcceptHoverEvents(true); - } - else { - setFlag(QGraphicsItem::ItemIsSelectable, false); - setAcceptHoverEvents(false); - } - -} - -void BaseDesignIntf::initMode(ItemMode mode) -{ - Q_UNUSED(mode); -} - -QVariant BaseDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) -{ - - if (change == QGraphicsItem::ItemPositionHasChanged) { - updateSelectionMarker(); - emit geometryChanged(this, geometry(), geometry()); - } - - if (change == QGraphicsItem::ItemSelectedChange) { - turnOnSelectionMarker(value.toBool()); - emit itemSelectedHasBeenChanged(this, value.toBool()); - } - if (change == QGraphicsItem::ItemParentHasChanged) { - parentChangedEvent(dynamic_cast(value.value())); - } - - return QGraphicsItem::itemChange(change, value); -} - -void BaseDesignIntf::childAddedEvent(BaseDesignIntf *child) -{ - Q_UNUSED(child) -} - -void BaseDesignIntf::parentChangedEvent(BaseDesignIntf *) -{ - -} - -void BaseDesignIntf::restoreLinks() -{ -#ifdef HAVE_QT5 - foreach(QObject * child, children()) { -#else - foreach(QObject * child, QObject::children()) { -#endif - BaseDesignIntf *childItem = dynamic_cast(child); - if (childItem) {childItem->restoreLinks();} - } - restoreLinksEvent(); -} - -QPainterPath BaseDesignIntf::shape() const -{ - QPainterPath path; - path.addRect(this->boundingRect()); - return path; -} - -void BaseDesignIntf::drawMarker(QPainter *painter, QColor color) const -{ - painter->save(); - - QPen pen(color, m_selectionPenSize); - painter->setPen(pen); - painter->setBrush(QBrush(color)); - painter->setOpacity(1); - const int markerSize = Const::RESIZE_HANDLE_SIZE; - painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize,rect().top()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()-markerSize, - rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize, - rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, - rect().top()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, - rect().bottom()-markerSize,markerSize*2,markerSize*2)); - - pen.setStyle(Qt::DotLine); - painter->setPen(pen); - painter->setBrush(QBrush(Qt::transparent)); - painter->drawRect(rect()); - painter->restore(); -} - -void BaseDesignIntf::moveSelectedItems(QPointF delta) -{ - QList selectedItems; - selectedItems = scene()->selectedItems(); - BaseDesignIntf *selectedItem; - foreach(QGraphicsItem * item, selectedItems) { - if (item != this) { - selectedItem = dynamic_cast(item); - if (selectedItem && !selectedItem->isBand()) { - if (!selectedItem->m_fixedPos) - selectedItem->setItemPos(selectedItem->pos() - delta); - } - } - } -} - -void BaseDesignIntf::setItemPos(qreal x, qreal y) -{ - setItemPos(QPointF(x, y)); -} - -void BaseDesignIntf::setItemMode(ItemMode mode) -{ - m_itemMode = mode; - foreach(QGraphicsItem * item, childItems()) { - BaseDesignIntf *ri = dynamic_cast(item); - if (ri) ri->setItemMode(mode); - } - initMode(mode); - initFlags(); -} -void BaseDesignIntf::setItemPos(const QPointF &newPos) -{ - QPointF oldPos = pos(); - QPointF finalPos = modifyPosForAlignedItem(newPos); - QGraphicsItem::setPos(finalPos); - emit posChanging(this, finalPos, oldPos); -} - - -QWidget* BaseDesignIntf::findRootWidget(QWidget* widget) -{ - while (widget->parentWidget()) { - widget = widget->parentWidget(); - } - return widget; -} - -void BaseDesignIntf::showDialog(QWidget *widget) -{ - if (!widget) { - return; - } - widget->setStyleSheet(findRootWidget(scene()->views().at(0))->styleSheet()); - QDialog *dialog = new QDialog(QApplication::activeWindow()); - widget->setParent(dialog); - widget->setAttribute(Qt::WA_DeleteOnClose); -#ifdef Q_OS_MAC - dialog->setWindowModality(Qt::WindowModal); -#else - dialog->setWindowModality(Qt::ApplicationModal); -#endif - dialog->setLayout(new QVBoxLayout()); - dialog->resize(widget->size()); - dialog->layout()->setContentsMargins(2,2,2,2); - dialog->layout()->addWidget(widget); - connect(widget,SIGNAL(destroyed()),dialog,SLOT(close())); - dialog->setWindowTitle(widget->windowTitle()); - dialog->exec(); - dialog->deleteLater(); -} - -void BaseDesignIntf::showEditorDialog() -{ - showDialog(defaultEditor()); -} - -void BaseDesignIntf::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -{ - if (event->button() == Qt::LeftButton && - ((itemMode()&EditMode)||(itemMode()&DesignMode)) - ) { - showEditorDialog(); - } - QGraphicsItem::mouseDoubleClickEvent(event); -} - -void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) -{ - if (!(flags() & QGraphicsItem::ItemIsSelectable)) return; - PageDesignIntf* page = dynamic_cast(scene()); - if (!page->selectedItems().contains(this)){ - page->clearSelection(); - this->setSelected(true); - } - QMenu menu(event->widget()); - - QAction* lockGeometryAction = menu.addAction(tr("Lock item geometry")); - lockGeometryAction->setCheckable(true); - - lockGeometryAction->setChecked(isGeometryLocked()); - menu.addSeparator(); - - QAction* copyAction = menu.addAction(QIcon(":/report/images/copy"), tr("Copy")); - QAction* cutAction = menu.addAction(QIcon(":/report/images/cut"), tr("Cut")); - QAction* pasteAction = menu.addAction(QIcon(":/report/images/paste"), tr("Paste")); - pasteAction->setEnabled(false); - -#if QT_VERSION >=QT_VERSION_CHECK(5,0,0) - lockGeometryAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_L)); - copyAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_C)); - cutAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_X)); - pasteAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_V)); -#else - lockGeometryAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L)); - copyAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_C)); - cutAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_X)); - pasteAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_V)); -#endif - - QClipboard *clipboard = QApplication::clipboard(); - ItemsReaderIntf::Ptr reader = StringXMLreader::create(clipboard->text()); - if (reader->first() && reader->itemType() == "Object"){ - pasteAction->setEnabled(true); - } - menu.addSeparator(); - QAction* bringToTopAction = menu.addAction(QIcon(":/report/images/bringToTop"), tr("Bring to top")); - QAction* sendToBackAction = menu.addAction(QIcon(":/report/images/sendToBack"), tr("Send to back")); - QAction* createHLayout = 0; - if( page->selectedItems().count()>1){ - createHLayout = menu.addAction(QIcon(":/report/images/hlayout"), tr("Create Horizontal Layout")); - } - QAction* createVLayout = 0; - if( page->selectedItems().count()>1){ - createVLayout = menu.addAction(QIcon(":/report/images/vlayout"), tr("Create Vertical Layout")); - } - menu.addSeparator(); - QAction* noBordersAction = menu.addAction(QIcon(":/report/images/noLines"), tr("No borders")); - QAction* allBordersAction = menu.addAction(QIcon(":/report/images/allLines"), tr("All borders")); - QAction* editBorderAction = menu.addAction(QIcon(":/report/images/borderEditor"), tr("Edit borders...")); - QMenu *alignement = menu.addMenu(tr("Align items")); - QAction* alignLeft = new QAction(QIcon(":/report/images/alignToLeft"),tr("Align to left")); - QAction* alignRight = new QAction(QIcon(":/report/images/alignToRight"),tr("Align to right")); - QAction* alignTop = new QAction(QIcon(":/report/images/alignToTop"),tr("Align to top")); - QAction* alignBottom = new QAction(QIcon(":/report/images/alignToBottom"),tr("Align to bottom")); - QAction* alignHCenter = new QAction(QIcon(":/report/images/alignToHCenter"),tr("Align to horizontal center")); - QAction* alignVCenter = new QAction(QIcon(":/report/images/alignToHCenter"),tr("Align to vertical center")); - QMenu *resize = menu.addMenu(tr("Resize items")); - QAction* toSameWidth = new QAction(QIcon(":/report/images/sameWidth"),tr("Same width")); - QAction* toSameHeight = new QAction(QIcon(":/report/images/sameHeight"),tr("Same height")); - QMenu *itemAlign = menu.addMenu(tr("Align items to page")); - QAction* itemAlignToLeft = new QAction(tr("Align to left")); - QAction* itemAlignToRight = new QAction(tr("Align to right")); - QAction* itemAlignToCenter = new QAction(tr("Align to center")); - QAction* cancelItemAlign = new QAction(tr("cancel alignement")); - QAction* itemAlignParent = new QAction(tr("Align to page width")); - menu.addMenu(itemAlign); - itemAlign->addAction(itemAlignToLeft); - itemAlignToLeft->setChecked(m_itemAlign == LeftItemAlign); - itemAlignToRight->setChecked(m_itemAlign == RightItemAlign); - itemAlignToCenter->setChecked(m_itemAlign == CenterItemAlign); - itemAlignParent->setChecked(m_itemAlign == ParentWidthItemAlign); - cancelItemAlign->setChecked(m_itemAlign == DesignedItemAlign); - itemAlign->addAction(itemAlignToRight); - itemAlign->addAction(itemAlignToCenter); - itemAlign->addAction(itemAlignParent); - itemAlign->addAction(cancelItemAlign); - resize->addAction(toSameWidth); - resize->addAction(toSameHeight); - alignement->addAction(alignLeft); - alignement->addAction(alignRight); - alignement->addAction(alignTop); - alignement->addAction(alignBottom); - - connect(alignLeft,&QAction::triggered,this,[=](){page->alignToLeft();}); - connect(alignRight,&QAction::triggered,this,[=](){page->alignToRigth();}); - connect(alignTop,&QAction::triggered,this,[=](){page->alignToTop();}); - connect(alignBottom,&QAction::triggered,this,[=](){page->alignToBottom();}); - connect(alignHCenter,&QAction::triggered,this,[=](){page->alignToHCenter();}); - connect(alignVCenter,&QAction::triggered,this,[=](){page->alignToVCenter();}); - connect(toSameWidth,&QAction::triggered,this,[=](){page->sameWidth();}); - connect(toSameHeight,&QAction::triggered,this,[=](){page->sameHeight();}); - connect(itemAlignToLeft,&QAction::triggered,this,[=](){page->setItemAlign(BaseDesignIntf::LeftItemAlign);}); - connect(itemAlignToRight,&QAction::triggered,this,[=](){page->setItemAlign(BaseDesignIntf::RightItemAlign);}); - connect(itemAlignToCenter,&QAction::triggered,this,[=](){page->setItemAlign(BaseDesignIntf::CenterItemAlign);}); - connect(itemAlignParent,&QAction::triggered,this,[=](){page->setItemAlign(BaseDesignIntf::ParentWidthItemAlign);}); - connect(cancelItemAlign,&QAction::triggered,this,[=](){page->setItemAlign(BaseDesignIntf::DesignedItemAlign);}); - - preparePopUpMenu(menu); - QAction* a = menu.exec(event->screenPos()); - if (a){ - if (a == cutAction) - { - page->cut(); - return; - } - if (a == copyAction) - page->copy(); - if (a == pasteAction) - page->paste(); - if (a == bringToTopAction) - page->bringToFront(); - if (a == sendToBackAction) - page->sendToBack(); - if (a == noBordersAction) - page->setBorders(BaseDesignIntf::NoLine); - if (a == allBordersAction) - page->setBorders(BaseDesignIntf::AllLines); - if (a == editBorderAction) - { - BorderEditor be; - be.loadItem(this); - if (be.exec() == QDialog::Rejected) return; - page->setBordersExt(be.borderSides(), be.borderWidth(), (LimeReport::BaseDesignIntf::BorderStyle)be.borderStyle(), be.borderColor()); - } - if (a == createHLayout) - page->addHLayout(); - if (a == createVLayout) - page->addVLayout(); - - processPopUpAction(a); - } - - - -} - -int BaseDesignIntf::possibleMoveDirectionFlags() const -{ - return m_possibleMoveDirectionFlags; -} - -void BaseDesignIntf::setPossibleMoveFlags(int directionsFlags) -{ - m_possibleMoveDirectionFlags = directionsFlags; -} - -void BaseDesignIntf::setMarginSize(int value) -{ - if (m_margin!=value){ - int oldValue = m_margin; - m_margin=value; - if (!isLoading()){ - update(rect()); - notify("margin", oldValue, value); - } - } -} - -void BaseDesignIntf::drawResizeZone(QPainter* /*painter*/) -{ - - // if (m_resizeAreas.count() > 0) { - // painter->save(); - // painter->setPen(QPen(Const::RESIZE_ZONE_COLOR)); - // (isSelected()) ? painter->setOpacity(Const::SELECTED_RESIZE_ZONE_OPACITY) : painter->setOpacity(Const::RESIZE_ZONE_OPACITY); - // painter->setBrush(QBrush(Qt::green, Qt::SolidPattern)); - // foreach(QRectF * resizeArea, m_resizeAreas) painter->drawRect(*resizeArea); - // painter->restore(); - // } - -} - -void BaseDesignIntf::initResizeZones() -{ - m_resizeAreas.clear(); - if (m_resizeDirectionFlags & ResizeBottom) m_resizeAreas.append(&m_bottomRect); - if (m_resizeDirectionFlags & ResizeTop) m_resizeAreas.append(&m_topRect); - if (m_resizeDirectionFlags & ResizeLeft) m_resizeAreas.append(&m_leftRect); - if (m_resizeDirectionFlags & ResizeRight) m_resizeAreas.append(&m_rightRect); -} - -void BaseDesignIntf::invalidateRect(const QRectF &rect) -{ - if (scene()) - scene()->update(mapToScene(rect).boundingRect()); -} - -ReportEnginePrivate *BaseDesignIntf::reportEditor() -{ - PageDesignIntf *page = dynamic_cast(scene()); - if (page) return page->reportEditor(); - else return 0; -} - -void BaseDesignIntf::updateItemSize(DataSourceManager *dataManager, RenderPass pass, int maxHeight) -{ - Q_UNUSED(maxHeight); - Q_UNUSED(dataManager); - m_currentPass = pass; - updateItemAlign(); -} - -bool BaseDesignIntf::isNeedUpdateSize(RenderPass /*pass*/) const -{return false;} - -void BaseDesignIntf::drawPinArea(QPainter *painter) const -{ - painter->drawRect(QRect(0, 0, 16, 16)); -} - -QObject *BaseDesignIntf::createElement(const QString& /*collectionName*/, const QString &elementType) -{ - BaseDesignIntf* obj = 0; - try{ - if (LimeReport::DesignElementsFactory::instance().objectCreator(elementType)){ - obj = LimeReport::DesignElementsFactory::instance().objectCreator(elementType)(this, this); - if (page()) - connect(obj, SIGNAL(propertyChanged(QString,QVariant,QVariant)), - page(), SLOT(slotItemPropertyChanged(QString,QVariant,QVariant))); - } - } catch (ReportError &error){ - qDebug()<(obj); - if (item && page()) { - page()->registerItem(item); - } - } - } - } - emit loadCollectionFinished(collectionName); -} - -BaseDesignIntf *BaseDesignIntf::cloneItem(ItemMode mode, QObject *owner, QGraphicsItem *parent) -{ - BaseDesignIntf *clone = cloneItemWOChild(mode, owner, parent); - clone->setPatternName(this->objectName()); - clone->setPatternItem(this); -#ifdef HAVE_QT5 - foreach(QObject * child, children()) { -#else - foreach(QObject * child, QObject::children()) { -#endif - BaseDesignIntf *childItem = dynamic_cast(child); - if (childItem) {clone->childAddedEvent(childItem->cloneItem(mode, clone, clone));} - } - return clone; -} - -BaseDesignIntf *BaseDesignIntf::cloneItemWOChild(ItemMode mode, QObject *owner, QGraphicsItem *parent) -{ - BaseDesignIntf *clone = createSameTypeItem(owner, parent); - clone->setObjectName(this->objectName()); - clone->setItemMode(mode); - clone->objectLoadStarted(); - clone->setReportSettings(this->reportSettings()); - for (int i = 0; i < clone->metaObject()->propertyCount(); i++) { - if (clone->metaObject()->property(i).isWritable()) - clone->setProperty(clone->metaObject()->property(i).name(), property(clone->metaObject()->property(i).name())); - } - clone->objectLoadFinished(); - return clone; -} - -void BaseDesignIntf::initFromItem(BaseDesignIntf *source) -{ - objectLoadStarted(); - for (int i = 0; i < metaObject()->propertyCount(); i++) { - if (strcmp(metaObject()->property(i).name(),"objectName")!=0) - if (source->property(metaObject()->property(i).name()).isValid()) { - if (metaObject()->property(i).isWritable()) - setProperty(metaObject()->property(i).name(), source->property(metaObject()->property(i).name())); - } - } - objectLoadFinished(); -} - -bool BaseDesignIntf::canBeSplitted(int height) const -{Q_UNUSED(height); return false;} - -bool BaseDesignIntf::isEmpty() const -{return false;} - -BaseDesignIntf *BaseDesignIntf::cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent) -{Q_UNUSED(height); Q_UNUSED(owner); Q_UNUSED(parent); return 0;} - -BaseDesignIntf *BaseDesignIntf::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent) -{Q_UNUSED(height); Q_UNUSED(owner); Q_UNUSED(parent); return 0;} - -BaseDesignIntf *BaseDesignIntf::cloneEmpty(int height, QObject *owner, QGraphicsItem *parent) -{Q_UNUSED(height); Q_UNUSED(owner); Q_UNUSED(parent); return 0;} - - -void BaseDesignIntf::objectLoadStarted() -{ - m_objectState = ObjectLoading; -} - -void BaseDesignIntf::objectLoadFinished() -{ - m_objectState = ObjectLoaded; - emit objectLoaded(this); -} - -void BaseDesignIntf::parentObjectLoadFinished() -{} - -QList BaseDesignIntf::childBaseItems() const -{ - QList resList; - foreach(QGraphicsItem * item, childItems()) { - BaseDesignIntf *baseItem = dynamic_cast(item); - if (baseItem) resList << baseItem; - } - return resList; -} - - -void BaseDesignIntf::addChildItems(QList* list){ - foreach(BaseDesignIntf* item, childBaseItems()){ - list->append(item); - item->addChildItems(list); - } -} - -qreal BaseDesignIntf::calcAbsolutePosY(qreal currentOffset, BaseDesignIntf *item) -{ - BaseDesignIntf* parent = dynamic_cast(item->parent()); - if (parent) - return calcAbsolutePosY(currentOffset + item->getItemPosY(), parent); - else - return currentOffset + item->getItemPosY(); -} - -qreal BaseDesignIntf::calcAbsolutePosX(qreal currentOffset, BaseDesignIntf *item) -{ - BaseDesignIntf* parent = dynamic_cast(item->parent()); - if (parent) - return calcAbsolutePosX(currentOffset + item->getItemPosX(), parent); - else - return currentOffset + item->getItemPosX(); -} - -QList BaseDesignIntf::allChildBaseItems() -{ - QList resList; - addChildItems(&resList); - return resList; -} - -BaseDesignIntf *BaseDesignIntf::childByName(const QString &name) -{ - foreach(BaseDesignIntf* item, childBaseItems()){ - if (item->objectName().compare(name,Qt::CaseInsensitive)==0){ - return item; - } else { - BaseDesignIntf* child = item->childByName(name); - if (child) return child; - } - } - return 0; -} - -QWidget *BaseDesignIntf::defaultEditor() -{ - return 0; -} - -void BaseDesignIntf::notify(const QString &propertyName, const QVariant& oldValue, const QVariant& newValue) -{ - if (!isLoading()) - emit propertyChanged(propertyName, oldValue, newValue); -} - -void BaseDesignIntf::notify(const QVector& propertyNames) -{ - if (!isLoading()) - emit propertyesChanged(propertyNames); -} - - -QMap BaseDesignIntf::getStringForTranslation(){ - return QMap(); -} - -QVariant BookmarkContainerDesignIntf::getBookMark(const QString& key) -{ - if (m_bookmarks.contains(key)) - return m_bookmarks.value(key); - else return QVariant(); -} - -void BookmarkContainerDesignIntf::copyBookmarks(BookmarkContainerDesignIntf* source) -{ - foreach(QString key, source->bookmarks()){ - addBookmark(key,source->getBookMark(key)); - } -} - -QRectF Marker::boundingRect() const -{ - return m_rect.adjusted(-15,-15,15,15); -} - -void Marker::paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*) -{ - QPen pen; - const int markerSize = 5; - pen.setColor(color()); - pen.setWidth(2); - pen.setStyle(Qt::DotLine); - painter->setPen(pen); - painter->setOpacity(Const::SELECTION_COLOR_OPACITY); - painter->drawRect(rect()); - painter->setBrush(color()); - painter->setPen(Qt::transparent); - - painter->setOpacity(1); - painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize,rect().top()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()-markerSize, - rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize, - rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, - rect().top()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, - rect().bottom()-markerSize,markerSize*2,markerSize*2)); -} - -QColor Marker::color() const { - return m_color; -} - -SelectionMarker::SelectionMarker(QGraphicsItem* parent, BaseDesignIntf* owner) - : Marker(parent, owner) -{ - setAcceptHoverEvents(true); -} - -QColor SelectionMarker::color() const -{ - return owner()->isGeometryLocked() ? Qt::darkGray : Marker::color(); -} - -void SelectionMarker::hoverMoveEvent(QGraphicsSceneHoverEvent *event) -{ - if (owner()) owner()->hoverMoveEvent(event); - QGraphicsItem::hoverMoveEvent(event); -} - -void SelectionMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - if (owner()){ - owner()->setSelected(true); - owner()->mousePressEvent(event); - } - QGraphicsItem::mousePressEvent(event); -} - -void SelectionMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - if (owner()) owner()->mouseReleaseEvent(event); -} - -void SelectionMarker::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -{ - if (owner()) owner()->mouseDoubleClickEvent(event); - QGraphicsItem::mouseDoubleClickEvent(event); -} - -void SelectionMarker::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - qDebug() << "mouse move"; - if (owner()) owner()->mouseMoveEvent(event); -} - -void BaseDesignIntf::processPopUpAction(QAction *action){ - if (page()){ - if (action->text().compare(tr("Lock item geometry")) == 0){ - page()->setPropertyToSelectedItems("geometryLocked",action->isChecked()); - } - } -} - -} //namespace LimeReport diff --git a/Nouveau dossier/lrbasedesignintf.h b/Nouveau dossier/lrbasedesignintf.h deleted file mode 100644 index fa820ab..0000000 --- a/Nouveau dossier/lrbasedesignintf.h +++ /dev/null @@ -1,536 +0,0 @@ -/*************************************************************************** - * This file is part of the Lime Report project * - * Copyright (C) 2021 by Alexander Arin * - * arin_a@bk.ru * - * * - ** GNU General Public License Usage ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - ** GNU Lesser General Public License ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * 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 General Public License for more details. * - ****************************************************************************/ -#ifndef LRBASEDESIGNINTF_H -#define LRBASEDESIGNINTF_H -#include -#include -#include -#include -#include -#include -#include "lrcollection.h" -#include "lrglobal.h" -#include "serializators/lrstorageintf.h" - -Q_DECLARE_METATYPE(QList*) - -namespace LimeReport { - -enum ItemModes{ DesignMode=1, PreviewMode=2, PrintMode=4, EditMode=8, LayoutEditMode=16 }; - -class ReportEnginePrivate; -class PageDesignIntf; -class BaseDesignIntf; - -class LIMEREPORT_EXPORT Marker : public QGraphicsItem{ -public: - Marker(QGraphicsItem* parent = 0, BaseDesignIntf* owner = 0): QGraphicsItem(parent), m_owner(owner){} - QRectF boundingRect() const; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); - void setRect(QRectF rect){prepareGeometryChange();m_rect=rect;} - void setColor(QColor color){m_color=color;} - QRectF rect() const {return m_rect;} - virtual QColor color() const; - BaseDesignIntf* owner() const {return m_owner;} -private: - QRectF m_rect; - QColor m_color; - BaseDesignIntf* m_owner; -}; - -class LIMEREPORT_EXPORT SelectionMarker : public Marker{ -public: - SelectionMarker(QGraphicsItem* parent=0, BaseDesignIntf* owner = 0); - QColor color() const; -protected: - void hoverMoveEvent(QGraphicsSceneHoverEvent *event); - void mousePressEvent(QGraphicsSceneMouseEvent *event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); - void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -}; - -class DataSourceManager; -class ReportRender; - -class LIMEREPORT_EXPORT BaseDesignIntf : - public QObject, public QGraphicsItem, public ICollectionContainer, public ObjectLoadingStateIntf { - Q_OBJECT - Q_INTERFACES(QGraphicsItem) - Q_FLAGS(BorderLines) - Q_PROPERTY(QRect geometry READ geometry WRITE setGeometryProperty NOTIFY geometryChanged) - Q_PROPERTY(ACollectionProperty children READ fakeCollectionReader DESIGNABLE false) - Q_PROPERTY(qreal zOrder READ zValue WRITE setZValueProperty DESIGNABLE false) - Q_PROPERTY(BorderLines borders READ borderLines WRITE setBorderLinesFlags) - Q_PROPERTY(QString parentName READ parentReportItemName WRITE setParentReportItem DESIGNABLE false) - Q_PROPERTY(qreal borderLineSize READ borderLineSize WRITE setBorderLineSize) - Q_PROPERTY(bool isVisible READ isVisible WRITE setItemVisible DESIGNABLE false) - Q_PROPERTY(bool shadow READ hasShadow WRITE setShadow) - Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor) - Q_PROPERTY(bool geometryLocked READ isGeometryLocked WRITE setGeometryLocked) - Q_PROPERTY(BorderStyle borderStyle READ borderStyle WRITE setBorderStyle) - - friend class ReportRender; -public: - enum BGMode { TransparentMode, OpaqueMode}; - enum BorderStyle { NoStyle = Qt::NoPen, - Solid = Qt::SolidLine, - Dashed = Qt::DashLine, - Dot = Qt::DotLine, - - DashDot = Qt::DashDotLine, - DashDotDot = Qt::DashDotDotLine, - Doubled = 7 - }; - - - enum BrushStyle{ NoBrush, - SolidPattern, - Dense1Pattern, - Dense2Pattern, - Dense3Pattern, - Dense4Pattern, - Dense5Pattern, - Dense6Pattern, - Dense7Pattern, - HorPattern, - VerPattern, - CrossPattern, - BDiagPattern, - FDiagPattern }; - - - enum ResizeFlags { Fixed = 0, - ResizeLeft = 1, - ResizeRight = 2, - ResizeTop = 4, - ResizeBottom = 8, - AllDirections = 15 - }; - - enum MoveFlags { None = 0, - LeftRight=1, - TopBotom=2, - All=3 - }; - - enum BorderSide { - NoLine = 0, - TopLine = 1, - BottomLine = 2, - LeftLine = 4, - RightLine = 8, - AllLines = 15 - }; - - enum ObjectState {ObjectLoading, ObjectLoaded, ObjectCreated}; - - enum ItemAlign {LeftItemAlign,RightItemAlign,CenterItemAlign,ParentWidthItemAlign,DesignedItemAlign}; - - enum UnitType {Millimeters, Inches}; -#if QT_VERSION >= 0x050500 - Q_ENUM(BGMode) - Q_ENUM(BrushStyle) - Q_ENUM(BorderStyle) - Q_ENUM(ResizeFlags) - Q_ENUM(MoveFlags) - Q_ENUM(BorderSide) - Q_ENUM(ObjectState) - Q_ENUM(ItemAlign) - Q_ENUM(UnitType) - -#else - Q_ENUMS(BGMode) - Q_ENUMS(BrushStyle) - Q_ENUM(BorderStyle) - Q_ENUMS(ResizeFlags) - Q_ENUMS(MoveFlags) - Q_ENUMS(BorderSide) - Q_ENUMS(ObjectState) - Q_ENUMS(ItemAlign) - Q_ENUMS(UnitType) - -#endif -// enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols}; - Q_DECLARE_FLAGS(BorderLines, BorderSide) - Q_DECLARE_FLAGS(ItemMode,ItemModes) - friend class SelectionMarker; -public: - BaseDesignIntf(const QString& storageTypeName, QObject* owner = 0, QGraphicsItem* parent = 0); - virtual ~BaseDesignIntf(); - - void setParentReportItem(const QString& value); - QString parentReportItemName() const; - - BrushStyle backgroundBrushStyle() const {return m_backgroundBrushStyle;} - BorderStyle borderStyle() const {return m_borderStyle;} - void setBackgroundBrushStyle(BrushStyle value); - QColor backgroundColor() const {return m_backgroundColor;} - void setBackgroundColor(QColor value); - - QPen pen() const; - void setPen(QPen& pen); - QFont font() const; - void setFont(QFont& font); - QColor fontColor() const {return m_fontColor;} - void setFontColor(QColor value){m_fontColor=value;} - - virtual BGMode backgroundMode() const; - virtual void setBackgroundMode(BGMode bgMode); - virtual qreal width() const; - virtual qreal widthMM() const; - virtual void setWidth(qreal width); - virtual qreal height() const; - virtual qreal heightMM() const; - virtual void setHeight(qreal height); - virtual QPointF posMM() const; - virtual int opacity() const; - virtual void setOpacity(int opacity); - virtual void setSize(QSizeF size); - virtual QSizeF size() const; - virtual QSizeF sizeMM() const; - - void paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget); - void prepareRect(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*); - virtual QPainterPath shape() const; - - void setFixedPos(bool fixedPos); - bool isFixedPos(){return m_fixedPos;} - int resizeHandleSize() const; - - qreal unitFactor() const; - void setUnitType(UnitType unitType); - UnitType unitType(); - virtual QRect geometry() const; - void setGeometry(QRectF rect); - - QRectF rect() const; - void setupPainter(QPainter* painter) const; - virtual QRectF boundingRect() const; - - virtual void moveRight(); - virtual void moveLeft(); - virtual void moveDown(); - virtual void moveUp(); - - virtual void sizeRight(); - virtual void sizeLeft(); - virtual void sizeUp(); - virtual void sizeDown(); - - void setItemPos(const QPointF &newPos); - void setItemPos(qreal x, qreal y); - - virtual void setItemMode(LimeReport::BaseDesignIntf::ItemMode mode); - ItemMode itemMode() const {return m_itemMode;} - - virtual void setBorderLinesFlags(LimeReport::BaseDesignIntf::BorderLines flags); - void setGeometryProperty(QRect rect); - PageDesignIntf* page() const; - - BorderLines borderLines() const; - - QString storageTypeName() const {return m_storageTypeName;} - ReportEnginePrivate *reportEditor(); - - virtual void updateItemSize(DataSourceManager* dataManager, RenderPass pass=FirstPass, int maxHeight=0); - virtual bool isNeedUpdateSize(RenderPass) const; - virtual BaseDesignIntf* cloneItem(LimeReport::BaseDesignIntf::ItemMode mode, QObject* owner=0, QGraphicsItem* parent=0); - virtual BaseDesignIntf* cloneItemWOChild(LimeReport::BaseDesignIntf::ItemMode mode, QObject* owner=0, QGraphicsItem* parent=0); - virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0) = 0; - virtual void initFromItem(BaseDesignIntf* source); - - virtual bool canBeSplitted(int height) const; - virtual qreal minHeight() const {return 0;} - virtual bool isSplittable() const {return false;} - virtual bool isEmpty() const; - virtual BaseDesignIntf* cloneUpperPart(int height, QObject* owner=0, QGraphicsItem* parent=0); - virtual BaseDesignIntf* cloneBottomPart(int height, QObject* owner=0, QGraphicsItem* parent=0); - virtual BaseDesignIntf* cloneEmpty(int height, QObject* owner=0, QGraphicsItem* parent=0); - - bool isLoaded(){return m_objectState==ObjectLoaded;} - bool isLoading(){return m_objectState==ObjectLoading;} - void objectLoadStarted(); - void objectLoadFinished(); - virtual void parentObjectLoadFinished(); - virtual void beforeDelete(); - - QList childBaseItems() const; - QList allChildBaseItems(); - BaseDesignIntf* childByName(const QString& name); - - virtual QWidget *defaultEditor(); - void notify(const QString &propertyName, const QVariant &oldValue, const QVariant &newValue); - void notify(const QVector &propertyNames); - - int possibleResizeDirectionFlags() const; - void setPossibleResizeDirectionFlags(int directionsFlags); - int possibleMoveDirectionFlags() const; - void setPossibleMoveFlags(int directionsFlags); - - int marginSize() const {return m_margin;} - void setMarginSize(int value); - - QString itemTypeName() const; - void setItemTypeName(const QString &itemTypeName); - - qreal borderLineSize() const; - void setBorderStyle(BorderStyle b); - void setBorderLineSize(qreal value); - void showEditorDialog(); - ItemAlign itemAlign() const; - virtual void setItemAlign(const ItemAlign &itemAlign); - void updateItemAlign(); - QPointF modifyPosForAlignedItem(const QPointF &pos); - void turnOnJoinMarker(bool value); - virtual bool isBand(){return false;} - QColor borderColor() const; - void setBorderColor(const QColor &borderColor); - void setItemVisible(const bool& value); - virtual bool canContainChildren() const { return false;} - virtual bool canAcceptPaste() const{ return false;} - ReportSettings* reportSettings() const; - void setReportSettings(ReportSettings *reportSettings); - void setZValueProperty(qreal value); - QString patternName() const; - void setPatternName(const QString &patternName); - BaseDesignIntf* patternItem() const; - void setPatternItem(BaseDesignIntf* patternItem); - virtual QMap getStringForTranslation(); - bool fillInSecondPass() const; - void setFillInSecondPass(bool fillInSecondPass); - bool isWatermark() const; - virtual void setWatermark(bool watermark); - void updateSelectionMarker(); - void turnOnSelectionMarker(bool value); - bool fillTransparentInDesignMode() const; - void setFillTransparentInDesignMode(bool fillTransparentInDesignMode); - void emitPosChanged(QPointF oldPos, QPointF newPos); - void emitObjectNamePropertyChanged(const QString& oldName, const QString& newName); - bool isGeometryLocked() const; - void setGeometryLocked(bool itemLocked); - bool isChangingPos() const; - void setIsChangingPos(bool isChangingPos); - bool isShapeItem() const; - bool isPageItem() const; - bool hasShadow(); - void setShadow(bool sh); - Q_INVOKABLE QString setItemWidth(qreal width); - Q_INVOKABLE QString setItemHeight(qreal height); - Q_INVOKABLE qreal getItemWidth(); - Q_INVOKABLE qreal getItemHeight(); - Q_INVOKABLE qreal getItemPosX(); - Q_INVOKABLE qreal getItemPosY(); - Q_INVOKABLE qreal getAbsolutePosX(); - Q_INVOKABLE qreal getAbsolutePosY(); - Q_INVOKABLE QString setItemPosX(qreal xValue); - Q_INVOKABLE QString setItemPosY(qreal yValue); - -protected: - - //ICollectionContainer - QObject* createElement(const QString&, const QString& elementType); - int elementsCount(const QString&); - QObject* elementAt(const QString&, int index); - void collectionLoadFinished(const QString& collectionName); - //ICollectionContainer - - void mousePressEvent(QGraphicsSceneMouseEvent* event); - void hoverMoveEvent(QGraphicsSceneHoverEvent* event); - void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); - void hoverEnterEvent(QGraphicsSceneHoverEvent* ); - void mouseMoveEvent(QGraphicsSceneMouseEvent* event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); - - void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); - - virtual void geometryChangedEvent(QRectF newRect, QRectF oldRect); - virtual QPen borderPen(BorderSide side) const; - virtual QColor selectionColor() const; - virtual void initFlags(); - virtual void initMode(LimeReport::BaseDesignIntf::ItemMode mode); - virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); - virtual void childAddedEvent(BaseDesignIntf* child); - virtual void parentChangedEvent(BaseDesignIntf*); - void restoreLinks(); - virtual void restoreLinksEvent(){} - - void drawTopLine(QPainter *painter, QRectF rect) const; - void drawBootomLine(QPainter *painter, QRectF rect) const; - void drawRightLine(QPainter *painter, QRectF rect) const; - void drawLeftLine(QPainter *painter, QRectF rect) const; - - - void drawBorder(QPainter* painter, QRectF rect) const; - void drawShadow(QPainter* painter, QRectF rect, qreal shadowSize) const; - void drawDesignModeBorder(QPainter* painter, QRectF rect) const; - void drawRenderModeBorder(QPainter *painter, QRectF rect) const; - void drawResizeZone(QPainter*); - void drawMarker(QPainter* painter, QColor color) const; - void drawPinArea(QPainter* painter) const; - - void initResizeZones(); - void invalidateRect(const QRectF &rect); - void invalidateRects(QVector rects); - QFont transformToSceneFont(const QFont &value) const; - - RenderPass currentRenderPass(){return m_currentPass;} - - virtual bool drawDesignBorders() const {return true;} - virtual QColor selectionMarkerColor(){ return Const::SELECTION_COLOR;} - - QString expandUserVariables(QString context, RenderPass pass, ExpandType expandType, DataSourceManager *dataManager); - QString expandDataFields(QString context, ExpandType expandType, DataSourceManager *dataManager); - QString expandScripts(QString context, DataSourceManager *dataManager); - - QVariant m_varValue; - - virtual void preparePopUpMenu(QMenu& menu){Q_UNUSED(menu)} - virtual void processPopUpAction(QAction* action); - - void addChildItems(QList* list); - qreal calcAbsolutePosY(qreal currentOffset, BaseDesignIntf* item); - qreal calcAbsolutePosX(qreal currentOffset, BaseDesignIntf* item); - - QWidget* findRootWidget(QWidget* widget); - void showDialog(QWidget *widget); - -private: - int resizeDirectionFlags(QPointF position); - void moveSelectedItems(QPointF delta); - Qt::CursorShape getPossibleCursor(int cursorFlags); - void updatePossibleDirectionFlags(); - void addGuideLine(qreal x1, qreal y1, qreal x2, qreal y2); - void removeGuideLines(); -private slots: - void onChangeGeometryTimeOut(); - -private: - QPointF m_startPos; - int m_resizeHandleSize; - int m_selectionPenSize; - int m_possibleResizeDirectionFlags; - int m_possibleMoveDirectionFlags; - int m_savedPossibleResizeDirectionFlags; - int m_savedPossibleMoveDirectionFlags; - int m_savedFixedPos; - int m_resizeDirectionFlags; - qreal m_width; - qreal m_height; - QPen m_pen; - QFont m_font; - QColor m_fontColor; - bool m_fixedPos; - qreal m_borderLineSize; - - - QRectF m_rect; - mutable QRectF m_boundingRect; - - QRectF m_oldGeometry; - BGMode m_BGMode; - int m_opacity; - BorderLines m_borderLinesFlags; - BorderStyle m_borderStyle; - - QRectF m_bottomRect; - QRectF m_topRect; - QRectF m_leftRect; - QRectF m_rightRect; - - QVector m_resizeAreas; - QString m_storageTypeName; - ItemMode m_itemMode; - - ObjectState m_objectState; - - BrushStyle m_backgroundBrushStyle; - QColor m_backgroundColor; - - RenderPass m_currentPass; - int m_margin; - QString m_itemTypeName; - ItemAlign m_itemAlign; - bool m_changingItemAlign; - QColor m_borderColor; - ReportSettings* m_reportSettings; - QString m_patternName; - BaseDesignIntf* m_patternItem; - bool m_fillInSecondPass; - bool m_watermark; - bool m_hovered; - bool m_joinMarkerOn; - SelectionMarker* m_selectionMarker; - Marker* m_joinMarker; - bool m_fillTransparentInDesignMode; - QRect m_itemGeometry; - UnitType m_unitType; - bool m_itemGeometryLocked; - bool m_isChangingPos; - bool m_isMoveable; - bool m_shadow; - QList guideLines; - -signals: - void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); - void posChanging(QObject* object, QPointF newPos, QPointF oldPos); - void posChanged(QObject* object, QPointF newPos, QPointF oldPos); - void itemSelected(LimeReport::BaseDesignIntf *item); - void itemSelectedHasBeenChanged(BaseDesignIntf *item, bool value); - void loadCollectionFinished(const QString& collectionName); - void objectLoaded(QObject* object); - void objectChanged(QObject* object); - void propertyChanged(const QString& propertName, const QVariant& oldValue,const QVariant& newValue); - void propertyObjectNameChanged(const QString& oldValue, const QString& newValue); - void propertyesChanged(QVector propertyNames); - void itemAlignChanged(BaseDesignIntf* item, const ItemAlign& oldValue, const ItemAlign& newValue); - void itemVisibleHasChanged(BaseDesignIntf* item); - void beforeRender(); - void afterData(); - void afterRender(); -}; - -class LIMEREPORT_EXPORT BookmarkContainerDesignIntf: public BaseDesignIntf{ - Q_OBJECT -public: - BookmarkContainerDesignIntf(const QString& storageTypeName, QObject* owner = 0, QGraphicsItem* parent = 0) - :BaseDesignIntf(storageTypeName, owner, parent){} - void addBookmark(const QString& key, const QVariant& value){ m_bookmarks.insert(key, value);} - QList bookmarks(){ return m_bookmarks.keys();} - QVariant getBookMark(const QString& key); - void copyBookmarks(BookmarkContainerDesignIntf* source); -private: - QHash m_bookmarks; -}; - -} //namespace LimeReport - -#endif // LRBASEDESIGNINTF_H diff --git a/Nouveau dossier/lrbordereditor.cpp b/Nouveau dossier/lrbordereditor.cpp deleted file mode 100644 index ce923ef..0000000 --- a/Nouveau dossier/lrbordereditor.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "lrbordereditor.h" -#include "ui_lrbordereditor.h" -#include -#include "lrbasedesignintf.h" - -namespace LimeReport{ - -BorderEditor::BorderEditor(QWidget *parent) : - QDialog(parent), - ui(new Ui::BorderEditor), - m_borderStyle(1), - m_borderWidth(1) -{ - ui->setupUi(this); - connect( - ui->borderFrame, SIGNAL(borderSideClicked(LimeReport::BaseDesignIntf::BorderSide, bool)), - this, SLOT(checkToolButtons(LimeReport::BaseDesignIntf::BorderSide, bool)) - ); -} - -void BorderEditor::loadItem(LimeReport::BaseDesignIntf *item) -{ - m_item = item; - qDebug()<metaObject()->className(); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::TopLine, - item->borderLines() & LimeReport::BaseDesignIntf::TopLine); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::LeftLine, - item->borderLines() & LimeReport::BaseDesignIntf::LeftLine); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::RightLine, - item->borderLines() & LimeReport::BaseDesignIntf::RightLine); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::BottomLine, - item->borderLines() & LimeReport::BaseDesignIntf::BottomLine); - - QPen pen; - pen.setWidthF(item->borderLineSize()); - pen.setColor(item->borderColor()); - pen.setStyle((Qt::PenStyle)item->borderStyle()); - ui->borderFrame->setPen(pen); - m_borderColor = item->borderColor().name(); - ui->listWidget->setCurrentRow((Qt::PenStyle)item->borderStyle()); - ui->comboBox->setCurrentText(QString::number(item->borderLineSize())); - m_borderWidth = ui->comboBox->currentText().toDouble(); - m_borderStyle =ui->listWidget->currentRow(); - ui->colorIndicator->setStyleSheet(QString("background-color:%1;").arg(m_borderColor)); -} - -LimeReport::BaseDesignIntf::BorderLines BorderEditor::borderSides() -{ - int borders = 0; - borders += (ui->topLine->isChecked()) ? LimeReport::BaseDesignIntf::TopLine : 0; - borders += (ui->bottomLine->isChecked()) ? LimeReport::BaseDesignIntf::BottomLine : 0; - borders += (ui->leftLine->isChecked()) ? LimeReport::BaseDesignIntf::LeftLine : 0; - borders += (ui->rightLine->isChecked()) ? LimeReport::BaseDesignIntf::RightLine : 0; - return (LimeReport::BaseDesignIntf::BorderLines) borders; -} - -LimeReport::BaseDesignIntf::BorderStyle BorderEditor::borderStyle() -{ - return (LimeReport::BaseDesignIntf::BorderStyle) m_borderStyle; -} - -QString BorderEditor::borderColor() -{ - return m_borderColor; -} - -double BorderEditor::borderWidth() -{ - return m_borderWidth; -} - -bool BorderEditor::isPage() -{ - return QString(m_item->metaObject()->className()) == "LimeReport::PageItemDesignIntf"; -} - -BorderEditor::~BorderEditor() -{ - delete ui; -} - -void BorderEditor::on_listWidget_currentRowChanged(int currentRow) -{ - QPen pen = ui->borderFrame->pen(); - pen.setStyle((Qt::PenStyle)currentRow); - m_borderStyle = currentRow; - ui->borderFrame->setPen(pen); -} - -void BorderEditor::on_comboBox_currentTextChanged(const QString &arg1) -{ - QPen pen = ui->borderFrame->pen(); - pen.setWidthF(arg1.toDouble()); - ui->borderFrame->setPen(pen); - m_borderWidth = arg1.toDouble(); -} - -void BorderEditor::checkToolButtons(LimeReport::BaseDesignIntf::BorderSide side, bool check) -{ - switch(side) - { - case BaseDesignIntf::BorderSide::TopLine: - ui->topLine->setChecked(check); - break; - case BaseDesignIntf::BorderSide::BottomLine: - ui->bottomLine->setChecked(check); - break; - case BaseDesignIntf::BorderSide::LeftLine: - ui->leftLine->setChecked(check); - break; - case BaseDesignIntf::BorderSide::RightLine: - ui->rightLine->setChecked(check); - break; - } -} - -void BorderEditor::on_topLine_clicked(bool checked){ - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::TopLine, checked); -} - -void BorderEditor::on_bottomLine_clicked(bool checked){ - emit ui->borderFrame->borderSideClicked(BaseDesignIntf::BorderSide::BottomLine, checked); -} - -void BorderEditor::on_leftLine_clicked(bool checked){ - emit ui->borderFrame->borderSideClicked(BaseDesignIntf::BorderSide::LeftLine, checked); -} - -void BorderEditor::on_rightLine_clicked(bool checked){ - emit ui->borderFrame->borderSideClicked(BaseDesignIntf::BorderSide::RightLine, checked); -} - - -void BorderEditor::on_allLines_clicked() -{ - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::TopLine, true); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::BottomLine, true); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::LeftLine, true); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::RightLine, true); -} - -void BorderEditor::on_noLines_clicked() -{ - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::TopLine, false); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::BottomLine, false); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::LeftLine, false); - emit ui->borderFrame->borderSideClicked(LimeReport::BaseDesignIntf::BorderSide::RightLine, false); -} - - -void BorderEditor::on_selectColor_clicked() -{ - QColorDialog cd(this); - if(cd.exec() == QDialog::Rejected) return; - QPen pen = ui->borderFrame->pen(); - pen.setColor(cd.selectedColor().name()); - m_borderColor = pen.color().name(); - ui->colorIndicator->setStyleSheet(QString("background-color:%1;").arg(m_borderColor)); - ui->borderFrame->setPen(pen); -} - -} // namespace LimeReport diff --git a/Nouveau dossier/lrbordereditor.h b/Nouveau dossier/lrbordereditor.h deleted file mode 100644 index 7906024..0000000 --- a/Nouveau dossier/lrbordereditor.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef LRBORDEREDITOR_H -#define LRBORDEREDITOR_H - -#include -#include "lrbasedesignintf.h" - -namespace LimeReport{ - -namespace Ui { - class BorderEditor; -} - - -class LIMEREPORT_EXPORT BorderEditor : public QDialog -{ - Q_OBJECT - -public: - explicit BorderEditor(QWidget *parent = nullptr); - void loadItem(LimeReport::BaseDesignIntf *item); - LimeReport::BaseDesignIntf::BorderLines borderSides(); - LimeReport::BaseDesignIntf::BorderStyle borderStyle(); - QString borderColor(); - double borderWidth(); - bool isPage(); - ~BorderEditor(); - -private slots: - void on_listWidget_currentRowChanged(int currentRow); - void on_comboBox_currentTextChanged(const QString &arg1); - void on_noLines_clicked(); - void on_topLine_clicked(bool checked); - void on_bottomLine_clicked(bool checked); - void on_leftLine_clicked(bool checked); - void on_rightLine_clicked(bool checked); - void on_allLines_clicked(); - void checkToolButtons(LimeReport::BaseDesignIntf::BorderSide side, bool check); - void on_selectColor_clicked(); - -private: - Ui::BorderEditor *ui; - LimeReport::BaseDesignIntf *m_item; - QString m_borderColor; - int m_borderStyle; - double m_borderWidth; -}; - -} // namespace LimeReport - -#endif // LRBORDEREDITOR_H diff --git a/Nouveau dossier/lrgroupbands.cpp b/Nouveau dossier/lrgroupbands.cpp deleted file mode 100644 index 3eedb6a..0000000 --- a/Nouveau dossier/lrgroupbands.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/*************************************************************************** - * This file is part of the Lime Report project * - * Copyright (C) 2021 by Alexander Arin * - * arin_a@bk.ru * - * * - ** GNU General Public License Usage ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - ** GNU Lesser General Public License ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * 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 General Public License for more details. * - ****************************************************************************/ -#include "lrgroupbands.h" -#include "lrglobal.h" -#include "lrdatasourcemanager.h" - -const QString xmlTagHeader = QLatin1String("GroupHeader"); -const QString xmlTagFooter = QLatin1String("GroupFooter"); - -namespace{ - -LimeReport::BaseDesignIntf* createHeader(QObject* owner, LimeReport::BaseDesignIntf* parent){ - return new LimeReport::GroupBandHeader(owner,parent); -} - -bool VARIABLE_IS_NOT_USED registredHeader = LimeReport::DesignElementsFactory::instance().registerCreator( - xmlTagHeader, - LimeReport::ItemAttribs(QObject::tr("GroupHeader"),LimeReport::Const::bandTAG), - createHeader - ); - -LimeReport::BaseDesignIntf * createFooter(QObject* owner, LimeReport::BaseDesignIntf* parent){ - return new LimeReport::GroupBandFooter(owner,parent); -} - -bool VARIABLE_IS_NOT_USED registredFooter = LimeReport::DesignElementsFactory::instance().registerCreator( - xmlTagFooter, - LimeReport::ItemAttribs(QObject::tr("GroupFooter"),LimeReport::Const::bandTAG), - createFooter - ); - -} - -namespace LimeReport{ - -GroupBandHeader::GroupBandHeader(QObject *owner, QGraphicsItem *parent) - : BandDesignIntf(BandDesignIntf::GroupHeader, xmlTagHeader, owner,parent), - m_groupFiledName(""), m_groupStarted(false), m_resetPageNumber(false),m_sortFieldNameBy(Qt::AscendingOrder) -{ - setBandTypeText(tr("GroupHeader")); - setFixedPos(false); - setMarkerColor(bandColor()); -} - -bool GroupBandHeader::isUnique() const -{ - return false; -} - -//bool GroupBandHeader::tryToKeepTogether() -//{ -// return m_tryToKeepTogether; -//} - -BaseDesignIntf *GroupBandHeader::createSameTypeItem(QObject *owner, QGraphicsItem *parent) -{ - return new GroupBandHeader(owner, parent); -} - -void GroupBandHeader::startGroup(DataSourceManager* dataManager) -{ - m_groupStarted=true; - - QString lineVar = QLatin1String("line_")+objectName().toLower(); - dataManager->setReportVariable(lineVar,1); - - QString datasourceName = findDataSourceName(parentBand()); - if (dataManager->containsDatasource(datasourceName)){ - IDataSource* ds = dataManager->dataSource(datasourceName); - if (ds && ds->columnIndexByName(m_groupFiledName)!=-1) - { - m_groupFieldValue=ds->data(m_groupFiledName); - - } - } - - if (!m_condition.isEmpty()) m_conditionValue = calcCondition(dataManager); -} - -QColor GroupBandHeader::bandColor() const -{ - return QColor(Qt::darkBlue); -} - -QString GroupBandHeader::findDataSourceName(BandDesignIntf* parentBand){ - if (!parentBand) return ""; - if (!parentBand->datasourceName().isEmpty()) - return parentBand->datasourceName(); - else - return findDataSourceName(parentBand->parentBand()); - -} - -QString GroupBandHeader::condition() const -{ - return m_condition; -} - -void GroupBandHeader::setCondition(const QString &condition) -{ - m_condition = condition; -} - -QString GroupBandHeader::calcCondition(DataSourceManager* dataManager){ - QString result = m_condition; - if (!m_condition.isEmpty()){ - result=expandUserVariables(result, FirstPass, NoEscapeSymbols, dataManager); - result=expandScripts(result, dataManager); - result=expandDataFields(result, NoEscapeSymbols, dataManager); - } - return result; -} - -bool GroupBandHeader::isNeedToClose(DataSourceManager* dataManager) -{ - if (!m_groupStarted) return false; - if ((m_groupFiledName.isNull() || m_groupFiledName.isEmpty()) && condition().isEmpty()){ - dataManager->putError(tr("Group field not found")); - return false; - } - - if (!m_condition.isEmpty()){ - return m_conditionValue != calcCondition(dataManager); - } else { - QString datasourceName = findDataSourceName(parentBand()); - if (dataManager->containsDatasource(datasourceName)){ - IDataSource* ds = dataManager->dataSource(datasourceName); - - if (ds){ - if (ds->data(m_groupFiledName).isNull() && m_groupFieldValue.isNull()) return false; - if (!ds->data(m_groupFiledName).isValid()) return false; - return ds->data(m_groupFiledName)!=m_groupFieldValue; - } - } else { - dataManager->putError(tr("Datasource \"%1\" not found!").arg(datasourceName)); - } - } - - return false; -} - -bool GroupBandHeader::isStarted() -{ - return m_groupStarted;//!m_groupFieldValue.isNull(); -} - -void GroupBandHeader::closeGroup() -{ - m_groupFieldValue=QVariant(); - m_conditionValue=""; - m_groupStarted=false; -} - -int GroupBandHeader::index() -{ - return bandIndex(); -} - -bool GroupBandHeader::startNewPage() const -{ - return BandDesignIntf::startNewPage(); -} - -void GroupBandHeader::setStartNewPage(bool startNewPage) -{ - BandDesignIntf::setStartNewPage(startNewPage); -} - -bool GroupBandHeader::resetPageNumber() const -{ - return m_resetPageNumber; -} - -void GroupBandHeader::setResetPageNumber(bool resetPageNumber) -{ - m_resetPageNumber = resetPageNumber; -} - -GroupBandFooter::GroupBandFooter(QObject *owner, QGraphicsItem *parent) - :BandDesignIntf(BandDesignIntf::GroupFooter, xmlTagFooter, owner,parent) -{ - setBandTypeText(tr("GroupFooter")); - setFixedPos(false); - setMarkerColor(bandColor()); -} - -bool GroupBandFooter::isUnique() const -{ - return false; -} - -QColor GroupBandFooter::bandColor() const -{ - return QColor(Qt::darkBlue); -} - -BaseDesignIntf *GroupBandFooter::createSameTypeItem(QObject *owner, QGraphicsItem *parent) -{ - return new GroupBandFooter(owner,parent); -} - -} //namespace LimeReport diff --git a/Nouveau dossier/lrgroupbands.h b/Nouveau dossier/lrgroupbands.h deleted file mode 100644 index 5ab89f3..0000000 --- a/Nouveau dossier/lrgroupbands.h +++ /dev/null @@ -1,99 +0,0 @@ -/*************************************************************************** - * This file is part of the Lime Report project * - * Copyright (C) 2021 by Alexander Arin * - * arin_a@bk.ru * - * * - ** GNU General Public License Usage ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - ** GNU Lesser General Public License ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * 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 General Public License for more details. * - ****************************************************************************/ -#ifndef LRGROUPBANDS_H -#define LRGROUPBANDS_H - -#include "lrbanddesignintf.h" -#include "lrdesignelementsfactory.h" -#include "qnamespace.h" - -namespace LimeReport{ - -class GroupBandHeader : public BandDesignIntf, public IGroupBand{ - Q_OBJECT - Q_PROPERTY(QString groupFieldName READ groupFieldName WRITE setGroupFieldName) - Q_PROPERTY(Qt::SortOrder SortFieldNameBy READ SortFieldNameBy WRITE setSortFieldNameBy) - Q_PROPERTY(bool splittable READ isSplittable WRITE setSplittable ) - Q_PROPERTY(bool keepGroupTogether READ tryToKeepTogether WRITE setTryToKeepTogether) - Q_PROPERTY(bool startNewPage READ startNewPage WRITE setStartNewPage) - Q_PROPERTY(bool resetPageNumber READ resetPageNumber WRITE setResetPageNumber) - Q_PROPERTY(bool reprintOnEachPage READ reprintOnEachPage WRITE setReprintOnEachPage) - Q_PROPERTY(QString condition READ condition WRITE setCondition) -public: - GroupBandHeader(QObject* owner = 0, QGraphicsItem* parent=0); - virtual bool isUnique() const; - QVariant groupFieldValue(){return m_groupFieldValue;} - void setGroupFieldValue(QVariant value){m_groupFieldValue=value;} - QString groupFieldName(){return m_groupFiledName;} - void setGroupFieldName(QString fieldName){m_groupFiledName=fieldName;} - QColor bandColor() const; - bool startNewPage() const; - void setStartNewPage(bool startNewPage); - bool resetPageNumber() const; - void setResetPageNumber(bool resetPageNumber); - bool isHeader() const{return true;} - bool isGroupHeader() const {return true;} - QString condition() const; - void setCondition(const QString &condition); - Qt::SortOrder SortFieldNameBy(){return m_sortFieldNameBy;}; - void setSortFieldNameBy(Qt::SortOrder sortOrder){m_sortFieldNameBy = sortOrder;} -private: - virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); - void startGroup(DataSourceManager* dataManager); - bool isNeedToClose(DataSourceManager *dataManager); - bool isStarted(); - void closeGroup(); - int index(); - QString findDataSourceName(BandDesignIntf *parentBand); - QString calcCondition(DataSourceManager *dataManager); -private: - QVariant m_groupFieldValue; - QString m_groupFiledName; - bool m_groupStarted; - //bool m_startNewPage; - bool m_resetPageNumber; - QString m_condition; - QString m_conditionValue; - Qt::SortOrder m_sortFieldNameBy = Qt::AscendingOrder; -}; - -class GroupBandFooter : public BandDesignIntf{ - Q_OBJECT -public: - GroupBandFooter(QObject* owner = 0, QGraphicsItem* parent=0); - virtual bool isUnique() const; - QColor bandColor() const; - virtual bool isFooter() const{return true;} -private: - virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); -}; - -} // namespace LimeReport -#endif // LRGROUPBANDS_H diff --git a/Nouveau dossier/lrreportrender.cpp b/Nouveau dossier/lrreportrender.cpp deleted file mode 100644 index b7ef936..0000000 --- a/Nouveau dossier/lrreportrender.cpp +++ /dev/null @@ -1,1808 +0,0 @@ -/*************************************************************************** - * This file is part of the Lime Report project * - * Copyright (C) 2021 by Alexander Arin * - * arin_a@bk.ru * - * * - ** GNU General Public License Usage ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - ** GNU Lesser General Public License ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * 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 General Public License for more details. * - ****************************************************************************/ -#include -#include - -#include "lrglobal.h" -#include "lrreportrender.h" -#include "lrgroupbands.h" -#include "lrpagedesignintf.h" -#include "lrbanddesignintf.h" -#include "lritemdesignintf.h" -#include "lrscriptenginemanager.h" - -#include "serializators/lrxmlreader.h" -#include "serializators/lrxmlwriter.h" - -namespace LimeReport{ - -void ReportRender::initColumns(){ - m_maxHeightByColumn.clear(); - m_currentStartDataPos.clear(); - m_maxHeightByColumn.append(0); - m_currentStartDataPos.append(0); - m_currentColumn = 0; -} - -bool ReportRender::isNeedToRearrangeColumnsItems() -{ - if (m_columnedBandItems.size()<=1) return false; - if (m_columnedBandItems[0]->columnsFillDirection()!=BandDesignIntf::VerticalUniform) - return false; - - int avg = m_columnedBandItems.size()/m_columnedBandItems[0]->columnsCount(); - - for (int i=0;imaxHeight){ - maxHeight = m_maxHeightByColumn[i]; - maxHeightColumn = i; - } - if (maxHeightColumn>0 && columnItemsCount(maxHeightColumn) lastColumnItem(maxHeightColumn-1)->height() - ){ - return true; - } - } - return false; -} - -BandDesignIntf *ReportRender::lastColumnItem(int columnIndex) -{ - if (columnIndex<0) return 0; - for(int i=0;icolumnIndex()>columnIndex) - return m_columnedBandItems[i-1]; - } - return m_columnedBandItems.last(); -} - -void ReportRender::rearrangeColumnsItems() -{ - if (isNeedToRearrangeColumnsItems()){ - qreal startHeight = columnHeigth(0); - int avg = m_columnedBandItems.size() / m_columnedBandItems[0]->columnsCount(); - for (int i = 1; i < m_columnedBandItems[0]->columnsCount(); ++i){ - if (columnItemsCount(i) < avg){ - int getCount = avg * (m_columnedBandItems[0]->columnsCount()-i) - columnItemsCount(i); - for (int j = 0; j < getCount; ++j){ - BandDesignIntf* band = lastColumnItem(i-1); - band->setPos(band->pos().x()-30,m_columnedBandItems[0]->pos().y()); - band->setColumnIndex(i); - } - - } - } - m_renderPageItem->relocateBands(); - m_maxHeightByColumn[0]+=startHeight-maxColumnHeight(); - m_currentStartDataPos[0]-=startHeight-maxColumnHeight(); - m_columnedBandItems.clear(); - } -} - -int ReportRender::columnItemsCount(int columnIndex) -{ - int result = 0; - foreach(BandDesignIntf* band, m_columnedBandItems){ - if (band->columnIndex()==columnIndex) - ++result; - if (band->columnIndex()>columnIndex) break; - } - return result; -} - -qreal ReportRender::columnHeigth(int columnIndex) -{ - qreal result = 0; - for(int i=0;icolumnIndex()==columnIndex) - result += m_columnedBandItems[i]->height(); - if (m_columnedBandItems[i]->columnIndex()>columnIndex) break; - } - return result; -} - -qreal ReportRender::maxColumnHeight() -{ - qreal result = 0; - for (int i=0;icolumnsCount();++i){ - qreal curColumnHeight = columnHeigth(i); - if (curColumnHeight>result) result = curColumnHeight; - } - return result; -} - -void ReportRender::renameChildItems(BaseDesignIntf *item){ - foreach(BaseDesignIntf* child, item->childBaseItems()){ - if (!child->childBaseItems().isEmpty()) renameChildItems(child); - child->setObjectName(child->metaObject()->className()+QString::number(++m_currentNameIndex)); - } -} - -ReportRender::ReportRender(QObject *parent) - :QObject(parent), m_renderPageItem(0), m_pageCount(0), - m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), - m_lastRenderedBand(0), m_currentColumn(0), m_newPageStarted(false), - m_lostHeadersMoved(false) -{ - initColumns(); -} - -void ReportRender::setDatasources(DataSourceManager *value) -{ - m_datasources=value; - initVariables(); - resetPageNumber(BandReset); -} - -void ReportRender::setScriptContext(ScriptEngineContext* scriptContext) -{ - m_scriptEngineContext=scriptContext; -} - -void ReportRender::initDatasources(){ - try{ - datasources()->setAllDatasourcesToFirst(); - } catch(ReportError &exception){ - //TODO possible should thow exeption - QMessageBox::critical(0,tr("Error"),exception.what()); - return; - } -} - -void ReportRender::initDatasource(const QString& name){ - try{ - if (datasources()->containsDatasource(name)){ - if(m_dataSourceSorted)return; - IDataSource* ds = datasources()->dataSource(name); - if (ds) - ds->first(); - } - } catch(ReportError &exception){ - QMessageBox::critical(0,tr("Error"),exception.what()); - return; - } -} - -void ReportRender::analizeItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band){ - Q_UNUSED(band) - if (contentItem){ - QString content = contentItem->content(); - QVector functions; - foreach(const QString &functionName, m_datasources->groupFunctionNames()){ -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 1) - QRegularExpression rx = getGroupFunctionRegEx(functionName); - if(content.indexOf(rx)>=0){ - functions.append(functionName); - } -#else - QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); - rx.setMinimal(true); - if (rx.indexIn(content)>=0){ - functions.append(functionName); - } -#endif - } - if (functions.size()>0) - m_groupfunctionItems.insert(contentItem->patternName(), functions); - } -} - -void ReportRender::analizeContainer(BaseDesignIntf* item, BandDesignIntf* band){ - if (item){ - foreach(BaseDesignIntf* child, item->childBaseItems()){ - ContentItemDesignIntf* contentItem = dynamic_cast(child); - if (contentItem) analizeItem(contentItem, band); - else analizeContainer(child, band); - } - } -} - -void ReportRender::analizePage(PageItemDesignIntf* patternPage){ - m_groupfunctionItems.clear(); - foreach(BandDesignIntf* band, patternPage->bands()){ - if (band->isFooter() || band->isHeader()){ - analizeContainer(band,band); - } - } -} - -void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool /*isFirst*/, bool /*resetPageNumbers*/) -{ - m_currentNameIndex = 0; - m_patternPageItem = patternPage; - - analizePage(patternPage); - - if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { - resetPageNumber(PageReset); - } - - if (m_patternPageItem->resetPageNumber() && !isTOC && m_pageCount == 0){ - m_pagesRanges.startNewRange(); - } - - m_renderCanceled = false; - BandDesignIntf* reportFooter = m_patternPageItem->bandByType(BandDesignIntf::ReportFooter); - m_reportFooterHeight = 0; - if (reportFooter) - m_reportFooterHeight = reportFooter->height(); - - initGroups(); - clearPageMap(); - - try{ - - datasources()->setAllDatasourcesToFirst(); - datasources()->clearGroupFuntionsExpressions(); - - } catch(ReportError &exception){ - //TODO possible should thow exeption - QMessageBox::critical(0,tr("Error"),exception.what()); - return; - } - - clearPageMap(); - startNewPage(true); - - renderReportHeader(m_patternPageItem, AfterPageHeader); - m_dataSourceSorted = false; - BandDesignIntf* lastRenderedBand = 0; - for (int i=0;idataBandCount() && !m_renderCanceled; i++){ - - lastRenderedBand = m_patternPageItem->dataBandAt(i); - initDatasource(lastRenderedBand->datasourceName()); - renderDataBand(lastRenderedBand); - if (i < m_patternPageItem->dataBandCount()-1) closeFooterGroup(lastRenderedBand); - } - - if (reportFooter) - renderBand(reportFooter, 0, StartNewPageAsNeeded); - if (lastRenderedBand && lastRenderedBand->keepFooterTogether()) - closeFooterGroup(lastRenderedBand); - - BandDesignIntf* tearOffBand = m_patternPageItem->bandByType(BandDesignIntf::TearOffBand); - if (tearOffBand) - renderBand(tearOffBand, 0, StartNewPageAsNeeded); - - savePage(true); - -} - -int ReportRender::pageCount() -{ - return m_renderedPages.count(); -} - -PageItemDesignIntf::Ptr ReportRender::pageAt(int index) -{ - if ((index>m_renderedPages.count()-1)||(index<0)) throw ReportError(tr("page index out of range")); - else return m_renderedPages.at(index); -} - -QString ReportRender::renderPageToString(PageItemDesignIntf *patternPage) -{ - renderPage(patternPage); - return toString(); -} - -ReportPages ReportRender::renderPageToPages(PageItemDesignIntf *patternPage) -{ - renderPage(patternPage); - return m_renderedPages; -} - -ReportPages ReportRender::renderTOC(PageItemDesignIntf* patternPage, bool first, bool resetPages){ - renderPage(patternPage, true, first, resetPages); - return m_renderedPages; -} - -void ReportRender::initRenderPage() -{ - if (!m_renderPageItem) { - m_renderPageItem = new PageItemDesignIntf(m_patternPageItem->pageSize(), m_patternPageItem->pageRect()); - m_renderPageItem->initFromItem(m_patternPageItem); - m_renderPageItem->setItemMode(PreviewMode); - m_renderPageItem->setPatternName(m_patternPageItem->objectName()); - m_renderPageItem->setPatternItem(m_patternPageItem); - - ScriptValueType svCurrentPage; - ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); - -#ifdef USE_QJSENGINE - svCurrentPage = getJSValue(*se, m_renderPageItem); - se->globalObject().setProperty("currentPage", svCurrentPage); -#else - svCurrentPage = se->globalObject().property("currentPage"); - if (svCurrentPage.isValid()){ - se->newQObject(svCurrentPage, m_renderPageItem); - } else { - svCurrentPage = se->newQObject(m_renderPageItem); - se->globalObject().setProperty("currentPage", svCurrentPage); - } -#endif - - - } -} - -void ReportRender::initVariables() -{ - m_datasources->setReportVariable("#PAGE",1); - m_datasources->setReportVariable("#PAGE_COUNT",0); - m_datasources->setReportVariable("#IS_LAST_PAGEFOOTER",false); - m_datasources->setReportVariable("#IS_FIRST_PAGEFOOTER",false); -} - -void ReportRender::clearPageMap() -{ - m_renderedPages.clear(); -} - - -bool checkContentItem(ContentItemDesignIntf* item, DataSourceManager* datasources){ - QString content = item->content(); - foreach(QString functionName, datasources->groupFunctionNames()){ -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 1) - QRegularExpression rx = getGroupFunctionRegEx(functionName); - if(content.indexOf(rx)>=0){ - return true; - } -#else - QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); - if (rx.indexIn(content)>=0){ - return true; - } -#endif - } - return false; -} - -bool ReportRender::containsGroupFunctions(BaseDesignIntf *container){ - if (container){ - foreach (BaseDesignIntf* item, container->childBaseItems()) { - ContentItemDesignIntf* contentItem = dynamic_cast(item); - if (contentItem){ - if (checkContentItem(contentItem, m_datasources)) return true; - } else { - if (containsGroupFunctions(item)) return true; - } - } - } - return false; -} - -void ReportRender::extractGroupFuntionsFromItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band){ -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 1) - if ( contentItem && contentItem->content().contains(getScriptRegEx())){ - foreach(const QString &functionName, m_datasources->groupFunctionNames()){ - - QRegularExpression rx = getGroupFunctionRegEx(functionName); - QRegularExpression rxName = getGroupFunctionNameRegEx(functionName); - QRegularExpressionMatch match = rx.match(contentItem->content()); - - if (match.hasMatch()){ - - QRegularExpressionMatchIterator iter = rx.globalMatch(contentItem->content()); - while(iter.hasNext()){ - match = iter.next(); - QVector captures = normalizeCaptures(match); - if (captures.size() >= 3){ - int dsIndex = captures.size() == 3 ? Const::DATASOURCE_INDEX - 1 : Const::DATASOURCE_INDEX; - BandDesignIntf* dataBand = m_patternPageItem->bandByName(captures.at(dsIndex)); - if (dataBand){ - GroupFunction* gf = datasources()->addGroupFunction( - functionName, captures.at(Const::VALUE_INDEX), band->objectName(), dataBand->objectName() - ); - if (gf){ - connect(dataBand, SIGNAL(bandRendered(BandDesignIntf*)), - gf, SLOT(slotBandRendered(BandDesignIntf*))); - connect(dataBand, SIGNAL(bandReRendered(BandDesignIntf*, BandDesignIntf*)), - gf, SLOT(slotBandReRendered(BandDesignIntf*, BandDesignIntf*))); - } - } else { - GroupFunction* gf = datasources()->addGroupFunction( - functionName, captures.at(Const::VALUE_INDEX), band->objectName(), captures.at(dsIndex) - ); - gf->setInvalid(tr("Databand \"%1\" not found").arg(captures.at(dsIndex))); - } - } - } - - } else if (contentItem->content().indexOf(rxName)>=0){ - match = rxName.match(contentItem->content()); - GroupFunction* gf = datasources()->addGroupFunction(functionName, match.captured(1), band->objectName(), ""); - gf->setInvalid(tr("Wrong using function %1").arg(functionName)); - } - } - } - -#else - if ( contentItem && contentItem->content().contains(QRegExp("\\$S\\s*\\{.*\\}"))){ - foreach(const QString &functionName, m_datasources->groupFunctionNames()){ - QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); - rx.setMinimal(true); - QRegExp rxName(QString(Const::GROUP_FUNCTION_NAME_RX).arg(functionName)); - rxName.setMinimal(true); - if (rx.indexIn(contentItem->content())>=0){ - int pos = 0; - while ( (pos = rx.indexIn(contentItem->content(),pos)) != -1){ - QVector captures = normalizeCaptures(rx); - if (captures.size()>=3){ - int dsIndex = captures.size() == 3 ? Const::DATASOURCE_INDEX - 1 : Const::DATASOURCE_INDEX; - BandDesignIntf* dataBand = m_patternPageItem->bandByName(captures.at(dsIndex)); - if (dataBand){ - GroupFunction* gf = datasources()->addGroupFunction(functionName,captures.at(Const::VALUE_INDEX),band->objectName(),dataBand->objectName()); - if (gf){ - connect(dataBand, SIGNAL(bandRendered(BandDesignIntf*)), - gf, SLOT(slotBandRendered(BandDesignIntf*))); - connect(dataBand, SIGNAL(bandReRendered(BandDesignIntf*, BandDesignIntf*)), - gf, SLOT(slotBandReRendered(BandDesignIntf*, BandDesignIntf*))); - } - } else { - GroupFunction* gf = datasources()->addGroupFunction(functionName,captures.at(Const::VALUE_INDEX),band->objectName(),captures.at(dsIndex)); - gf->setInvalid(tr("Databand \"%1\" not found").arg(captures.at(dsIndex))); - } - } - pos += rx.matchedLength(); - } - } else if (rxName.indexIn(contentItem->content())>=0){ - GroupFunction* gf = datasources()->addGroupFunction(functionName,rxName.cap(1),band->objectName(),""); - gf->setInvalid(tr("Wrong using function %1").arg(functionName)); - } - } - } -#endif -} - -void ReportRender::extractGroupFunctionsFromContainer(BaseDesignIntf* baseItem, BandDesignIntf* band){ - if (baseItem){ - foreach (BaseDesignIntf* item, baseItem->childBaseItems()) { - ContentItemDesignIntf* contentItem = dynamic_cast(item); - if (contentItem) extractGroupFuntionsFromItem(contentItem, band); - else extractGroupFunctionsFromContainer(item, band); - } - } -} - -void ReportRender::extractGroupFunctions(BandDesignIntf *band) -{ - extractGroupFunctionsFromContainer(band, band); -} - -void ReportRender::replaceGroupFunctionsInItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band){ - if (contentItem){ - if (m_groupfunctionItems.contains(contentItem->patternName())){ - QString content = contentItem->content(); - foreach(QString functionName, m_groupfunctionItems.value(contentItem->patternName())){ -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 1) - QRegularExpression rx = getGroupFunctionRegEx(functionName); - QRegularExpressionMatch match = rx.match(content); - - if (match.capturedStart() != -1){ - int pos = 0; - while ( (pos = match.capturedStart()) != -1 ){ - QVector captures = normalizeCaptures(match); - if (captures.size() >= 3){ - QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX)); - if (captures.size()<5){ - content.replace(captures.at(0), QString("%1(%2,%3)") - .arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"')); - } else { - content.replace(captures.at(0), QString("%1(%2,%3,%4)").arg( - functionName, - '"'+expressionIndex+'"', - '"'+band->objectName()+'"', - captures.at(4) - )); - } - } - match = rx.match(content, pos + match.capturedLength()); - } - } -#else - QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); - rx.setMinimal(true); - if (rx.indexIn(content)>=0){ - int pos = 0; - while ( (pos = rx.indexIn(content,pos))!= -1 ){ - QVector captures = normalizeCaptures(rx); - if (captures.size() >= 3){ - QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX)); - if (captures.size()<5){ - content.replace(captures.at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"')); - } else { - content.replace(captures.at(0),QString("%1(%2,%3,%4)").arg( - functionName, - '"'+expressionIndex+'"', - '"'+band->objectName()+'"', - captures.at(4) - )); - } - } - pos += rx.matchedLength(); - } - } - -#endif - } - contentItem->setContent(content); - } - } -} - -void ReportRender::replaceGroupFunctionsInContainer(BaseDesignIntf* baseItem, BandDesignIntf* band) -{ - if (baseItem){ - foreach(BaseDesignIntf* item, baseItem->childBaseItems()){ - ContentItemDesignIntf* contentItem = dynamic_cast(item); - if (contentItem) replaceGroupFunctionsInItem(contentItem, band); - else replaceGroupFunctionsInContainer(item, band); - } - } -} - -void ReportRender::replaceGroupsFunction(BandDesignIntf *band) -{ - replaceGroupFunctionsInContainer(band, band); -} - -QColor ReportRender::makeBackgroundColor(BandDesignIntf* band){ - if (band->useAlternateBackgroundColor()){ - return datasources()->variable(QLatin1String("line_") + band->objectName().toLower()).toInt() %2 == 0 ? - band->backgroundColor() : - band->alternateBackgroundColor(); - } - return band->backgroundColor(); -} - -BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesignIntf* bandData, ReportRender::DataRenderMode mode, bool isLast) -{ - QCoreApplication::processEvents(); - bool bandIsSliced = false; - if (patternBand){ - - if (patternBand->isHeader()) - m_lastRenderedHeader = patternBand; - - BandDesignIntf* bandClone = 0; - - if (bandData){ - bandClone = bandData; - } else { - bandClone = renderData(patternBand); - } - - if (isLast) bandClone->setBottomSpace(1); - - if (mode == ForcedStartPage){ - savePage(); - startNewPage(); - } - - if (patternBand->isFooter()) - m_lastRenderedFooter = patternBand; - - bandClone->setBackgroundColor(makeBackgroundColor(patternBand)); - patternBand->emitBandRendered(bandClone); - m_scriptEngineContext->setCurrentBand(bandClone); - - if ( isLast && bandClone->keepFooterTogether() && bandClone->sliceLastRow() ){ - if (m_maxHeightByColumn[m_currentColumn] < (bandClone->height()+m_reportFooterHeight)) - m_maxHeightByColumn[m_currentColumn] -= ((m_maxHeightByColumn[m_currentColumn]-bandClone->height())+(bandClone->height()*calcSlicePercent(bandClone->height()))); - } - - if (!bandClone->isEmpty() || patternBand->printIfEmpty()){ - if (!registerBand(bandClone)){ - if (patternBand && patternBand->isHeader() && patternBand->reprintOnEachPage()) - m_reprintableBands.removeOne(patternBand); - if (bandClone->canBeSplitted(m_maxHeightByColumn[m_currentColumn])){ - bandClone = sliceBand(bandClone, patternBand, isLast); - bandIsSliced = true; - } else { - qreal percent = (bandClone->height()-m_maxHeightByColumn[m_currentColumn])/(bandClone->height()/100); - if (bandClone->maxScalePercent()>=percent){ - if (percentmaxScalePercent()){ - percent += 2; - bandClone->setScale((100-percent)/100); - BandDesignIntf* upperPart = dynamic_cast(bandClone->cloneUpperPart(m_maxHeightByColumn[m_currentColumn])); - registerBand(upperPart); - delete bandClone; - bandClone = NULL; - } - } else { - - if (mode==StartNewPageAsNeeded){ - if (bandClone->columnsCount()>1 && - (bandClone->columnsFillDirection()==BandDesignIntf::Vertical || - bandClone->columnsFillDirection()==BandDesignIntf::VerticalUniform)) - { - startNewColumn(); - if (patternBand->bandHeader() && - patternBand->bandHeader()->columnsCount()>1 && - !m_lostHeadersMoved && - patternBand->bandNestingLevel() == 0 - ){ - renderBand(patternBand->bandHeader(), 0, mode); - } - } else { - savePage(); - startNewPage(); - if (!bandIsSliced){ - BandDesignIntf* t = renderData(patternBand, false); - t->copyBandAttributes(bandClone); - patternBand->emitBandReRendered(bandClone, t); - delete bandClone; - bandClone = t; - } - } - if (!registerBand(bandClone)) { - BandDesignIntf* upperPart = dynamic_cast(bandClone->cloneUpperPart(m_maxHeightByColumn[m_currentColumn])); - registerBand(upperPart); - patternBand->emitBandReRendered(bandClone, upperPart); - delete bandClone; - bandClone = NULL; - }; - } else { - bandClone->setHeight(m_maxHeightByColumn[m_currentColumn]); - registerBand(bandClone); - } - } - } - } - } else { - delete bandClone; - return 0; - } - - if (patternBand->isFooter()){ - datasources()->clearGroupFunctionValues(patternBand->objectName()); - } - - emit(patternBand->afterRender()); - return bandClone; - } - return 0; -} - -void ReportRender::renderDataBand(BandDesignIntf *dataBand) -{ - if (dataBand == NULL ) - return; - - IDataSource* bandDatasource = 0; - m_lastRenderedFooter = 0; - if (!dataBand->datasourceName().isEmpty()) - bandDatasource = datasources()->dataSource(dataBand->datasourceName()); - - BandDesignIntf* header = dataBand->bandHeader(); - BandDesignIntf* footer = dataBand->bandFooter(); - - if (header && header->printAlways()) renderDataHeader(header); - - if(bandDatasource && !bandDatasource->eof() && !m_renderCanceled){ - - QString varName = QLatin1String("line_")+dataBand->objectName().toLower(); - datasources()->setReportVariable(varName,1); - - if (header && header->reprintOnEachPage()) - m_reprintableBands.append(dataBand->bandHeader()); - - if (header && !header->printAlways()) - renderDataHeader(header); - - renderGroupHeader(dataBand, bandDatasource, true); - - bool firstTime = true; - - - while(!bandDatasource->eof() && !m_renderCanceled){ - - datasources()->updateChildrenData(dataBand->datasourceName()); - - BandDesignIntf* rawData = renderData(dataBand); - - if (!rawData->isEmpty() || dataBand->printIfEmpty()){ - - if ((firstTime && dataBand->startFromNewPage()) || - (!firstTime && dataBand->startNewPage())) { - savePage(); - startNewPage(); - } - - if (dataBand->tryToKeepTogether()) openDataGroup(dataBand); - - if (dataBand->keepFooterTogether() && !bandDatasource->hasNext()) - openFooterGroup(dataBand); - - m_lastDataBand = dataBand; - - if (header && !firstTime && header->repeatOnEachRow()) - renderBand(header, 0, StartNewPageAsNeeded); - - renderBand(dataBand, rawData, StartNewPageAsNeeded, !bandDatasource->hasNext()); - m_newPageStarted = false; - renderChildBands(dataBand); - - } - - bandDatasource->next(); - - datasources()->setReportVariable(varName,datasources()->variable(varName).toInt()+1); - - QList bandList; - QList childList; - - bandList = dataBand->childrenByType(BandDesignIntf::GroupHeader); - while (bandList.size() > 0) - { - childList.clear(); - foreach (BandDesignIntf* band, bandList) - { - childList.append(band->childrenByType(BandDesignIntf::GroupHeader)); - - QString groupLineVar = QLatin1String("line_")+band->objectName().toLower(); - if (datasources()->containsVariable(groupLineVar)) - datasources()->setReportVariable(groupLineVar,datasources()->variable(groupLineVar).toInt()+1); - } - bandList = childList; - } - - renderGroupHeader(dataBand, bandDatasource, false); - if (dataBand->tryToKeepTogether()) closeDataGroup(dataBand); - firstTime = false; - } - - if (!dataBand->keepFooterTogether()) - m_reprintableBands.removeOne(header); - if (header) recalcIfNeeded(header); - - bool didGoBack = !bandDatasource->eof() && bandDatasource->prior(); - renderGroupFooterByHeader(dataBand); - if (didGoBack){ - bandDatasource->next(); - } - - if (footer && !footer->printAlways()){ - renderBand(footer, 0, StartNewPageAsNeeded); - if (dataBand->keepFooterTogether()) - m_reprintableBands.removeOne(dataBand); - } - - datasources()->deleteVariable(varName); - - } else if (bandDatasource==0) { - renderBand(dataBand, 0, StartNewPageAsNeeded); - } - - if (footer && footer->printAlways()){ - renderBand(footer, 0, StartNewPageAsNeeded); - if (dataBand->keepFooterTogether()) - m_reprintableBands.removeOne(dataBand); - } -} - -void ReportRender::renderPageHeader(PageItemDesignIntf *patternPage) -{ - BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::PageHeader); - if (band){ - if (m_datasources->variable("#PAGE").toInt()!=1 || - band->property("printOnFirstPage").toBool() - ) - renderBand(band, 0); - } -} - -void ReportRender::renderReportHeader(PageItemDesignIntf *patternPage, PageRenderStage stage) -{ - BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::ReportHeader); - BandDesignIntf* resBand = 0; - if (band){ - if (band->property("printBeforePageHeader").toBool() && stage == BeforePageHeader ) - resBand = renderBand(band, 0, StartNewPageAsNeeded); - if (!band->property("printBeforePageHeader").toBool() && stage == AfterPageHeader ) - resBand = renderBand(band, 0, StartNewPageAsNeeded); - if (resBand && containsGroupFunctions(band)) m_recalcBands.append(resBand); - } -} - -void ReportRender::renderPageFooter(PageItemDesignIntf *patternPage) -{ - BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::PageFooter); - if (band){ - BandDesignIntf* bandClone = dynamic_cast(band->cloneItem(PreviewMode, m_renderPageItem, m_renderPageItem)); - replaceGroupsFunction(bandClone); - bandClone->updateItemSize(m_datasources); - bandClone->setItemPos(m_renderPageItem->pageRect().x(),m_renderPageItem->pageRect().bottom()-bandClone->height()); - bandClone->setHeight(m_pageFooterHeight); - for(int i=0;isetPageFooter(bandClone); - registerBand(bandClone); - datasources()->clearGroupFunctionValues(band->objectName()); - } -} - -void ReportRender::renderPageItems(PageItemDesignIntf* patternPage) -{ - QList pageItems; - foreach (BaseDesignIntf* item, patternPage->childBaseItems()) { - ItemDesignIntf* id = dynamic_cast(item); - if (id&&id->itemLocation()==ItemDesignIntf::Page){ - BaseDesignIntf* cloneItem = item->cloneItem(m_renderPageItem->itemMode(), - m_renderPageItem, - m_renderPageItem); - pageItems.append(cloneItem); - } - } - m_renderPageItem->restoreLinks(); - m_renderPageItem->updateSubItemsSize(FirstPass,m_datasources); - foreach(BaseDesignIntf* item, pageItems){ - if (!item->isWatermark()) - item->setZValue(item->zValue()-100000); - else - item->setZValue(item->zValue()+100000); - } -} - -qreal ReportRender::calcPageFooterHeight(PageItemDesignIntf *patternPage) -{ - BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::PageFooter); - if (band){ - if (m_datasources->variable("#PAGE")!=1) - return band->height(); - else if (band->property("printOnFirstPage").toBool()) - return band->height(); - } - return 0; -} - -void ReportRender::renderChildHeader(BandDesignIntf *parent, BandPrintMode printMode) -{ - foreach(BandDesignIntf* band,parent->childrenByType(BandDesignIntf::SubDetailHeader)){ - bool printAlways=false; - if (band->metaObject()->indexOfProperty("printAlways")>0){ - printAlways=band->property("printAlways").toBool(); - } - if (printAlways == (printMode == PrintAlwaysPrintable)) - renderBand(band, 0, StartNewPageAsNeeded); - } -} - -void ReportRender::renderChildFooter(BandDesignIntf *parent, BandPrintMode printMode) -{ - foreach(BandDesignIntf* band,parent->childrenByType(BandDesignIntf::SubDetailFooter)){ - bool printAlways=false; - if (band->metaObject()->indexOfProperty("printAlways")>0){ - printAlways=band->property("printAlways").toBool(); - } - - if ( (band != m_lastRenderedFooter) && (printAlways == (printMode == PrintAlwaysPrintable)) ) - renderBand(band, 0, StartNewPageAsNeeded); - } -} - -void ReportRender::renderChildBands(BandDesignIntf *parentBand) -{ - foreach(BandDesignIntf* band,parentBand->childrenByType(BandDesignIntf::SubDetailBand)){ - IDataSource* ds = 0; - if (!band->datasourceName().isEmpty()) - ds = m_datasources->dataSource(band->datasourceName()); - if (ds) ds->first(); - renderDataBand(band); - closeFooterGroup(band); - } -} - -BandDesignIntf* ReportRender::findRecalcableBand(BandDesignIntf* patternBand){ - - QList::iterator it = m_recalcBands.begin(); - for (;it !=m_recalcBands.end() ;++it){ - if ((*it)->patternItem() == patternBand){ - BandDesignIntf* result = (*it); - m_recalcBands.erase(it); - return result; - } - } - return 0; -} - -void restoreItemsWithGroupFunctions(BaseDesignIntf* container, DataSourceManager* datasources){ - foreach(BaseDesignIntf* bi, container->childBaseItems()){ - ContentItemDesignIntf* pci = dynamic_cast(bi->patternItem()); - if (pci && checkContentItem(pci, datasources)){ - ContentItemDesignIntf* ci = dynamic_cast(bi); - ci->setContent(pci->content()); - } else restoreItemsWithGroupFunctions(bi, datasources); - } -} - -void ReportRender::recalcIfNeeded(BandDesignIntf* band){ - BandDesignIntf* recalcBand = findRecalcableBand(band); - if (recalcBand){ - QString bandName = recalcBand->objectName(); - restoreItemsWithGroupFunctions(recalcBand, m_datasources); - recalcBand->setObjectName(recalcBand->patternItem()->objectName()); - replaceGroupsFunction(recalcBand); - recalcBand->updateItemSize(datasources()); - recalcBand->setObjectName(bandName); - datasources()->clearGroupFunctionValues(recalcBand->patternItem()->objectName()); - } -} - -void ReportRender::renderDataHeader(BandDesignIntf *header) -{ - recalcIfNeeded(header); - BandDesignIntf* renderedHeader = renderBand(header, 0, StartNewPageAsNeeded); - if (containsGroupFunctions(header)) - m_recalcBands.append(renderedHeader); -} - -void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* dataSource, bool firstTime) -{ - GroupBandHeader *group = dynamic_cast(parentBand); - if(dataSource->model() && group && !group->groupFieldName().isEmpty() && !m_dataSourceSorted) - { - - MasterDetailProxyModel *proxyModel = static_cast(dataSource->model()); - - if(proxyModel) - { - //proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); - - proxyModel->sort(dataSource->columnIndexByName(group->groupFieldName()),group->SortFieldNameBy()); - m_dataSourceSorted = true; - } - } - - foreach(BandDesignIntf* band,parentBand->childrenByType(BandDesignIntf::GroupHeader)){ - IGroupBand* gb = dynamic_cast(band); - if (gb&&gb->isNeedToClose(datasources())){ - if (band->childBands().count()>0){ - bool didGoBack = !dataSource->eof() && dataSource->prior(); - renderGroupFooterByHeader(band); - if (didGoBack){ - dataSource->next(); - } - } - closeDataGroup(band); - } - - if (gb && !gb->isStarted()){ - if (band->reprintOnEachPage()){ - m_reprintableBands.append(band); - } - gb->startGroup(m_datasources); - openDataGroup(band); - BandDesignIntf* renderedHeader = 0; - if (!firstTime && gb->startNewPage() && !m_newPageStarted){ - if (gb->resetPageNumber()) resetPageNumber(BandReset); - if (band->reprintOnEachPage()){ - savePage(); - startNewPage(); - } else { - renderedHeader = renderBand(band, 0, ForcedStartPage); - } - } else { - renderedHeader = renderBand(band, 0, StartNewPageAsNeeded); - } - if (containsGroupFunctions(band)) - m_recalcBands.append(renderedHeader); - } - - renderGroupHeader(band, dataSource, firstTime); - } -} - -void ReportRender::renderGroupFooterByHeader(BandDesignIntf* groupHeader){ - if (groupHeader->reprintOnEachPage()) m_reprintableBands.removeOne(groupHeader); - foreach (BandDesignIntf* header, groupHeader->childrenByType(BandDesignIntf::GroupHeader)){ - renderGroupFooterByHeader(header); - } - foreach (BandDesignIntf* footer, groupHeader->childrenByType(BandDesignIntf::GroupFooter)){ - renderBand(footer, 0, StartNewPageAsNeeded); - } - closeDataGroup(groupHeader); -} - -void ReportRender::renderGroupFooter(BandDesignIntf *parentBand) -{ - foreach(BandDesignIntf* band,parentBand->childrenByType(BandDesignIntf::GroupHeader)){ - IGroupBand* gb = dynamic_cast(band); - if (gb && gb->isStarted()){ - renderGroupFooterByHeader(band); - } - } -} - -void ReportRender::initGroups() -{ - m_datasources->clearGroupFunction(); - foreach(BandDesignIntf* band, m_patternPageItem->childBands()){ - if (band->isFooter()) extractGroupFunctions(band); - if (band->isHeader()){ - IGroupBand* gb = dynamic_cast(band); - if (gb) gb->closeGroup(); - extractGroupFunctions(band); - } - } -} - -void ReportRender::popPageFooterGroupValues(BandDesignIntf *dataBand) -{ - BandDesignIntf* pageFooter = m_patternPageItem->bandByType(BandDesignIntf::PageFooter); - if (pageFooter){ - foreach(GroupFunction* gf, datasources()->groupFunctionsByBand(pageFooter->objectName())){ - if ((gf->dataBandName()==dataBand->objectName())){ - // FIXME Probably coincidence Field and Variables - if ((!m_popupedExpression.contains(dataBand))||(!m_popupedExpression.values(dataBand).contains(gf->data()))){ - m_popupedExpression.insert(dataBand,gf->data()); - m_popupedValues.insert(QString("%1").arg((quintptr)dataBand)+'|'+gf->data(), gf->values()[gf->values().count()-1]); - gf->values().pop_back(); - } - } - } - } -} - -void ReportRender::pushPageFooterGroupValues(BandDesignIntf *dataBand) -{ - BandDesignIntf* pageFooter = m_patternPageItem->bandByType(BandDesignIntf::PageFooter); - if (pageFooter){ - foreach(GroupFunction* gf, datasources()->groupFunctionsByBand(pageFooter->objectName())){ - if ((gf->dataBandName()==dataBand->objectName())){ - // FIXME Probably coincidence Field and Variables - if ((m_popupedExpression.contains(dataBand))&&(m_popupedExpression.values(dataBand).contains(gf->data()))){ - gf->values().push_back(m_popupedValues.value(QString("%1").arg((quintptr)dataBand)+'|'+gf->data())); - } - } - } - } -} - -void ReportRender::closeGroup(BandDesignIntf *band) -{ - QMultiMap< BandDesignIntf*, GroupBandsHolder* >::iterator it; - it = m_childBands.find(band); - - while (it!=m_childBands.end()&&it.key()==band){ - GroupBandsHolder* bl = it.value(); - if (bl){ - bl->clear(); - delete bl; - } - ++it; - } - - m_childBands.remove(band); -} - -void ReportRender::openDataGroup(BandDesignIntf *band) -{ - m_childBands.insert(band,new GroupBandsHolder(band->tryToKeepTogether())); -} - -void ReportRender::openFooterGroup(BandDesignIntf *band) -{ - GroupBandsHolder* holder = new GroupBandsHolder(true); - holder->setIsFooterGroup(); - m_childBands.insert(band,holder); -} - -void ReportRender::closeDataGroup(BandDesignIntf *band) -{ - IGroupBand* groupBand = dynamic_cast(band); - if (groupBand){ - groupBand->closeGroup(); - if (band->reprintOnEachPage()) m_reprintableBands.removeOne(band); - - QList::Iterator it = m_reprintableBands.begin(); - while (it != m_reprintableBands.end()){ - if ((*it)->bandIndex()>band->bandIndex()) - it = m_reprintableBands.erase(it); - else - ++it; - } - } - recalcIfNeeded(band); - closeGroup(band); -} - -void ReportRender::closeFooterGroup(BandDesignIntf *band){ - closeGroup(band); -} - -qreal maxVectorValue(QVector vector){ - qreal curValue = 0; - foreach (qreal value, vector) { - if (curValue vector){ - qreal curValue = vector[0]; - foreach (qreal value, vector) { - if (curValue>value) curValue=value; - } - return curValue; -} - -void ReportRender::placeBandOnPage(BandDesignIntf* band, int columnIndex){ - - qreal bandPos = m_currentStartDataPos[columnIndex]; - - m_currentStartDataPos[columnIndex] += band->height(); - m_maxHeightByColumn[columnIndex] -= band->height(); - band->setPos(m_renderPageItem->pageRect().x()+band->width()*columnIndex, bandPos); - band->setBandIndex(++m_currentIndex); - band->setColumnIndex(columnIndex); - - m_renderPageItem->registerBand(band); - m_currentColumn = columnIndex; -} - -bool isMultiColumnHeader(BandDesignIntf* band){ - return ( (band->columnsCount() > 1 ) && - (band->isHeader() && - ((band->bandNestingLevel() == 0) || (band->columnsFillDirection() == BandDesignIntf::Horizontal)))); -} - -bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren) -{ - - if (band->columnsCount() == 1 && m_maxHeightByColumn.size() > 1 ){ - if (band->bandType() != BandDesignIntf::PageFooter){ - rearrangeColumnsItems(); - m_currentColumn = 0; - qreal minValue = minVectorValue(m_maxHeightByColumn); - m_maxHeightByColumn.clear(); - m_maxHeightByColumn.append(minValue); - qreal maxValue = maxVectorValue(m_currentStartDataPos); - m_currentStartDataPos.clear(); - m_currentStartDataPos.append(maxValue); - } - } - - if (band->columnsCount() != m_maxHeightByColumn.size()){ - for(int i=1;icolumnsCount();++i){ - m_maxHeightByColumn.append(m_maxHeightByColumn[0]); - m_currentStartDataPos.append(m_currentStartDataPos[0]); - } - m_currentColumn = -1; - } - - if ( (band->columnsCount() > 1) && - (!band->isHeader() || (band->bandNestingLevel() > 0 && band->columnsFillDirection() != BandDesignIntf::Horizontal ))){ - - if (band->columnsFillDirection() == BandDesignIntf::Horizontal){ - if (m_currentColumn < band->columnsCount()-1) - m_currentColumn = m_currentColumn+1; - else - m_currentColumn = 0; - } else { - m_currentColumn = m_currentColumn == -1 ? 0: m_currentColumn; - if ((m_currentColumn !=0) && - (m_maxHeightByColumn[0] == m_maxHeightByColumn[m_currentColumn]) && - (m_maxHeightByColumn[0] >= band->height()) - ){ - m_currentColumn = 0; - } - } - } - - m_currentColumn = m_currentColumn == -1 ? 0: m_currentColumn; - - if ( (band->height() <= m_maxHeightByColumn[m_currentColumn]) || - m_patternPageItem->endlessHeight() || - (isMultiColumnHeader(band) && (band->height() <= m_maxHeightByColumn[0])) - ){ - - if ( (band->bandType() == BandDesignIntf::PageFooter) ){ - for (int i=0; i < m_maxHeightByColumn.size(); ++i) - m_maxHeightByColumn[i]+=band->height(); - } - - if ( isMultiColumnHeader(band)){ - - if (!band->parent()){ - for (int i = 0; i < band->columnsCount(); ++i){ - m_currentColumn = i; - if (i != 0) band = dynamic_cast(band->cloneItem(PreviewMode)); - placeBandOnPage(band, i); - } - } else { - placeBandOnPage(band, band->columnIndex()); - } - - - } else { - - if (band->bandType() != BandDesignIntf::PageFooter){ - placeBandOnPage(band, m_currentColumn); - } - - if (band->columnsCount() > 1){ - m_columnedBandItems.append(band); - } - - } - - foreach(QList* list, m_childBands.values()){ - if (registerInChildren && - band->bandType()!=BandDesignIntf::PageHeader && - band->bandType()!=BandDesignIntf::PageFooter && - band->bandType()!=BandDesignIntf::ReportHeader && - band->bandType()!=BandDesignIntf::ReportFooter && - !list->contains(band) && - !band->reprintOnEachPage() - ) - list->append(band); - } - - if (band->isData()) m_renderedDataBandCount++; - band->setObjectName(band->objectName()+QString::number(++m_currentNameIndex)); - renameChildItems(band); - if (m_lastDataBand){ -#if QT_VERSION < 0x050000 - m_lastDataBand->metaObject()->invokeMethod(m_lastDataBand,"bandRegistred"); -#else - emit m_lastDataBand->bandRegistred(); -#endif - } - if (band->bandType() != BandDesignIntf::PageFooter) - m_lastRenderedBand = band; - return true; - } else return false; -} - -qreal ReportRender::calcSlicePercent(qreal height){ - return (height*3/(m_dataAreaSize))/100; -} - -BandDesignIntf* ReportRender::sliceBand(BandDesignIntf *band, BandDesignIntf* patternBand, bool isLast) -{ - while (band->height()>m_maxHeightByColumn[m_currentColumn]) { - band = saveUppperPartReturnBottom(band,m_maxHeightByColumn[m_currentColumn],patternBand); - if (!band->isEmpty()) { - if (band->autoHeight()){ - if (band->isNeedUpdateSize(FirstPass)){ - band->setHeight(0); - } - band->updateItemSize(m_datasources); - } - DataBandDesignIntf* data = dynamic_cast(band); - if (isLast && data && data->keepFooterTogether() && - band->height()sliceLastRow() - ){ - if (band->height()>(m_maxHeightByColumn[m_currentColumn]-m_reportFooterHeight)){ - m_maxHeightByColumn[m_currentColumn] -= ((m_maxHeightByColumn[m_currentColumn]-band->height())+(band->height()*calcSlicePercent(band->height()))); - } - } - if (registerBand(band)) break; - } else break; - } - - if (band->isEmpty()) { - delete band; - band = 0; - } - - return band; - -} - -void ReportRender::updateTOC(BaseDesignIntf* item, int pageNumber){ - BookmarkContainerDesignIntf* bookmarkContainer = dynamic_cast(item); - if (bookmarkContainer){ - TableOfContents* toc = m_scriptEngineContext->tableOfContents(); - foreach (QString key, bookmarkContainer->bookmarks()){ - toc->setItem(key, bookmarkContainer->getBookMark(key).toString(), pageNumber); - } - } -} - -void ReportRender::secondRenderPass(ReportPages renderedPages) -{ - if (!m_scriptEngineContext->tableOfContents()->isEmpty()){ - for(int i = 0; i < renderedPages.count(); ++i){ - PageItemDesignIntf::Ptr page = renderedPages.at(i); - updateTOC(page.data(), m_pagesRanges.findPageNumber(i)); - foreach(BaseDesignIntf* item, page->childBaseItems()){ - updateTOC(item, m_pagesRanges.findPageNumber(i)); - } - } - } - - for(int i = 0; i < renderedPages.count(); ++i){ - PageItemDesignIntf::Ptr page = renderedPages.at(i); - m_datasources->setReportVariable("#PAGE",m_pagesRanges.findPageNumber(i)); - m_datasources->setReportVariable("#PAGE_COUNT",m_pagesRanges.findLastPageNumber(i)); - foreach(BaseDesignIntf* item, page->childBaseItems()){ - if (item->isNeedUpdateSize(SecondPass)) - item->updateItemSize(m_datasources, SecondPass); - } - } -} - -void ReportRender::createTOCMarker(bool startNewRange) -{ - m_pagesRanges.addTOCMarker(startNewRange); -} - -BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf* patternBand) -{ - //int sliceHeight = height; - BandDesignIntf* upperBandPart = dynamic_cast(band->cloneUpperPart(height)); - BandDesignIntf* bottomBandPart = dynamic_cast(band->cloneBottomPart(height)); - if (!bottomBandPart->isEmpty()){ - if (patternBand->keepFooterTogether()) - closeFooterGroup(patternBand); - if (upperBandPart->isEmpty()) - bottomBandPart->copyBookmarks(band); - } - if (!upperBandPart->isEmpty()){ - upperBandPart->setBottomSpace(0); - upperBandPart->updateItemSize(m_datasources, FirstPass, height); - registerBand(upperBandPart); - upperBandPart->copyBookmarks(band); - if (patternBand->isFooter()) - closeFooterGroup(m_lastDataBand); - } else delete upperBandPart; - - if (band->columnsCount()>1 && - (band->columnsFillDirection()==BandDesignIntf::Vertical || - band->columnsFillDirection()==BandDesignIntf::VerticalUniform)){ - startNewColumn(); - if (patternBand->bandHeader() && - patternBand->bandHeader()->columnsCount()>1 && - !m_lostHeadersMoved && - patternBand->bandNestingLevel() == 0 - ){ - renderBand(patternBand->bandHeader(), 0, StartNewPageAsNeeded); - } - - } else { - savePage(); - startNewPage(); - } - - delete band; - return bottomBandPart; -} - -BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand, bool emitBeforeRender) -{ - BandDesignIntf* bandClone = dynamic_cast(patternBand->cloneItem(PreviewMode)); - - m_scriptEngineContext->baseDesignIntfToScript(patternBand->parent()->objectName(), bandClone); - m_scriptEngineContext->setCurrentBand(bandClone); - if (emitBeforeRender) - emit(patternBand->beforeRender()); - - if (patternBand->isFooter()){ - replaceGroupsFunction(bandClone); - } - - if (patternBand->isHeader()){ - replaceGroupsFunction(bandClone); - } - - emit(patternBand->preparedForRender()); - bandClone->updateItemSize(m_datasources); - bandClone->setBottomSpace(patternBand->height() - patternBand->findMaxBottom()); - - //m_scriptEngineContext->baseDesignIntfToScript(bandClone); - emit(patternBand->afterData()); - - return bandClone; -} - -void ReportRender::startNewColumn(){ - if (m_currentColumn < m_maxHeightByColumn.size()-1){ - m_currentColumn++; - checkLostHeadersInPrevColumn(); - } else { - savePage(); - startNewPage(); - } -} - -void ReportRender::startNewPage(bool isFirst) -{ - m_renderPageItem = 0; - m_newPageStarted = true; - initColumns(); - initRenderPage(); - m_scriptEngineContext->setCurrentPage(m_renderPageItem); - m_scriptEngineContext->baseDesignIntfToScript(m_renderPageItem->patternName(), m_renderPageItem); - emit m_patternPageItem->beforeRender(); - - m_renderPageItem->setObjectName(QLatin1String("ReportPage")+QString::number(m_pageCount)); - m_maxHeightByColumn[m_currentColumn] = m_renderPageItem->pageRect().height(); - m_currentStartDataPos[m_currentColumn] = m_patternPageItem->topMargin() * Const::mmFACTOR; - m_currentIndex = 0; - - if (isFirst) { - renderReportHeader(m_patternPageItem, BeforePageHeader); - emit m_patternPageItem->beforeFirstPageRendered(); - } - - renderPageHeader(m_patternPageItem); - - m_pageFooterHeight = calcPageFooterHeight(m_patternPageItem)+2; - m_maxHeightByColumn[m_currentColumn] -= m_pageFooterHeight; - m_currentIndex = 10; - m_dataAreaSize = m_maxHeightByColumn[m_currentColumn]; - m_renderedDataBandCount = 0; - - foreach (BandDesignIntf* band, m_reprintableBands) { - renderBand(band, 0); - } - - checkLostHeadersOnPrevPage(); - pasteGroups(); - -} - -void ReportRender::resetPageNumber(ResetPageNuberType resetType) -{ - m_pagesRanges.startNewRange(); - if (resetType == PageReset) - m_datasources->setReportVariable("#PAGE",1); -} - -void ReportRender::cutGroups() -{ - m_popupedExpression.clear(); - m_popupedValues.clear(); - //foreach(BandDesignIntf* groupBand,m_childBands.keys()){ - foreach(BandDesignIntf* groupBand, m_childBands.keys()){ - if (m_childBands.value(groupBand)->tryToKeepTogether()){ - foreach(BandDesignIntf* band, *m_childBands.value(groupBand)){ - m_renderPageItem->removeBand(band); - popPageFooterGroupValues(band); - band->setParent(0); - band->setParentItem(0); - } - } - } - -} - -void ReportRender::checkFooterGroup(BandDesignIntf *groupBand) -{ - if (m_childBands.contains(groupBand)){ - GroupBandsHolder* holder = m_childBands.value(groupBand); - foreach(BandDesignIntf* band, *holder){ - qreal percent = band->height()*100 / m_dataAreaSize; - if (m_renderedDataBandCount<=1 || percent>20 ){ - holder->removeAll(band); - } - } - } -} - -void ReportRender::pasteGroups() -{ - BandDesignIntf* groupBand = findEnclosingGroup(); - if (groupBand){ - foreach(BandDesignIntf* band, *m_childBands.value(groupBand)){ - registerBand(band,false); - if (band->isData()) m_renderedDataBandCount++; - pushPageFooterGroupValues(band); - } - foreach(GroupBandsHolder* holder, m_childBands.values()) - holder->setTryToKeepTogether(false); - } - m_popupedExpression.clear(); - m_popupedValues.clear(); -} - -bool bandLessThen(BandDesignIntf* b1, BandDesignIntf* b2){ - return b1->bandIndex() < b2->bandIndex(); -} - -void ReportRender::checkLostHeadersOnPrevPage() -{ - QVector lostHeaders; - - if (m_renderedPages.isEmpty()) return; - PageItemDesignIntf::Ptr page = m_renderedPages.last(); - if (page->bands().isEmpty()) return; - - QMutableListIteratorit(page->bands()); - - it.toBack(); - if (it.hasPrevious()){ - if (it.previous()->isFooter()){ - if (it.hasPrevious()) it.previous(); - else return; - } - } - - while (it.hasPrevious()){ - if (it.value()->isHeader()){ - if (it.value()->reprintOnEachPage()){ - delete it.value(); - } else { lostHeaders.append(it.value());} - it.remove(); - it.previous(); - } else break; - } - - if (lostHeaders.size() > 0){ - m_lostHeadersMoved = true; - //std::sort(lostHeaders.begin(), lostHeaders.end(), bandLessThen); - std::sort(lostHeaders.begin(), lostHeaders.end(), bandLessThen); - foreach(BandDesignIntf* header, lostHeaders){ - registerBand(header); - } - } else { - m_lostHeadersMoved = false; - } - - -} - -void ReportRender::checkLostHeadersInPrevColumn() -{ - QVector lostHeaders; - - QMutableListIteratorit(m_renderPageItem->bands()); - - it.toBack(); - if (it.hasPrevious()){ - if (it.previous()->isFooter()){ - if (it.hasPrevious()) it.previous(); - else return; - } - } - - while (it.hasPrevious()){ - if (it.value()->isHeader()){ - if (it.value()->reprintOnEachPage()){ - delete it.value(); - } else { lostHeaders.append(it.value());} - it.remove(); - it.previous(); - } else break; - } - - if (lostHeaders.size() > 0){ - m_lostHeadersMoved = true; - // std::sort(lostHeaders.begin(), lostHeaders.end(), bandLessThen); - std::sort(lostHeaders.begin(), lostHeaders.end(), bandLessThen); - foreach(BandDesignIntf* header, lostHeaders){ - registerBand(header); - } - } else { - m_lostHeadersMoved = false; - } -} - -BandDesignIntf* ReportRender::findEnclosingGroup() -{ - BandDesignIntf* result=0; - int groupIndex = -1; - if (!m_childBands.isEmpty()){ - foreach(BandDesignIntf* gb, m_childBands.keys()){ - if (m_childBands.value(gb)->tryToKeepTogether()&& - ((gb->bandIndex()bandIndex(); - } - } - } - return result; -} - -void ReportRender::savePage(bool isLast) -{ - - m_datasources->setReportVariable("#IS_LAST_PAGEFOOTER",isLast); - m_datasources->setReportVariable("#IS_FIRST_PAGEFOOTER",m_datasources->variable("#PAGE").toInt()==1); - - renderPageItems(m_patternPageItem); - - if (m_renderPageItem->isEmpty() && m_renderPageItem->notPrintIfEmpty()) return; - - if (m_renderPageItem->isTOC()) - m_pagesRanges.addTOCPage(); - else - m_pagesRanges.addPage(); - - checkFooterGroup(m_lastDataBand); - cutGroups(); - rearrangeColumnsItems(); - m_columnedBandItems.clear(); - - BandDesignIntf* pf = m_patternPageItem->bandByType(BandDesignIntf::PageFooter); - if (pf && m_datasources->variable("#PAGE").toInt()!=1 && !isLast){ - renderPageFooter(m_patternPageItem); - } else { - if (pf && pf->property("printOnFirstPage").toBool() && m_datasources->variable("#PAGE").toInt()==1){ - renderPageFooter(m_patternPageItem); - } else if(pf && pf->property("printOnLastPage").toBool() && isLast){ - renderPageFooter(m_patternPageItem); - } - } - - if (m_pagesRanges.currentRange(m_patternPageItem->isTOC()).firstPage == 0) { - m_datasources->setReportVariable("#PAGE",1); - } else { - m_datasources->setReportVariable("#PAGE",m_datasources->variable("#PAGE").toInt()+1); - } - - m_renderedPages.append(PageItemDesignIntf::Ptr(m_renderPageItem)); - m_pageCount++; - emit pageRendered(m_pageCount); - - if (isLast){ - BandDesignIntf* ph = m_renderPageItem->bandByType(BandDesignIntf::PageHeader); - if (ph && !ph->property("printOnLastPage").toBool()){ - delete ph; - } - } - - if (m_renderPageItem->pageFooter()){ - m_renderPageItem->pageFooter()->setBandIndex(++m_currentIndex); - if (m_renderPageItem->pageFooter()->property("removeGap").toBool()){ - m_renderPageItem->pageFooter()->setPos(m_lastRenderedBand->geometry().bottomLeft()); - } - } - m_renderPageItem->placeTearOffBand(); - - //m_scriptEngineContext->setCurrentPage(m_renderPageItem); - emit m_patternPageItem->afterRender(); - if (isLast) - emit m_patternPageItem->afterLastPageRendered(); - if (isLast && m_patternPageItem->endlessHeight()){ - qreal pageHeight = 0; - foreach (BandDesignIntf* band, m_renderPageItem->bands()) { - pageHeight += band->height(); - } - m_renderPageItem->setHeight(pageHeight + 10 + - (m_patternPageItem->topMargin() + m_patternPageItem->bottomMargin()) * Const::mmFACTOR); - } -} - -QString ReportRender::toString() -{ - QScopedPointer writer(new XMLWriter()); - foreach(PageItemDesignIntf::Ptr page,m_renderedPages){ - writer->putItem(page.data()); - } - return writer->saveToString(); -} - -ReportRender::~ReportRender(){ - m_renderedPages.clear(); -} - -void ReportRender::cancelRender(){ - m_renderCanceled = true; -} - -int PagesRanges::findLastPageNumber(int index) -{ - index++; - foreach (PagesRange range, m_ranges) { - if ( range.firstPage <= (index) && range.lastPage>= (index) ) - return (range.lastPage-(range.firstPage))+1; - } - return 0; -} - -int PagesRanges::findPageNumber(int index) -{ - index++; - foreach (PagesRange range, m_ranges) { - if ( range.firstPage <= (index) && range.lastPage >= (index) ) - return (index - range.firstPage)+1; - } - return 0; -} - -PagesRange&PagesRanges::currentRange(bool isTOC) -{ - Q_ASSERT( (isTOC && m_TOCRangeIndex!=-1) || !isTOC); - if (isTOC && m_TOCRangeIndex !=-1) return m_ranges[m_TOCRangeIndex]; - return m_ranges.last(); -} - -void PagesRanges::startNewRange(bool isTOC) -{ - PagesRange range; - if (!m_ranges.isEmpty()){ - range.firstPage = 0; - range.lastPage = m_ranges.last().lastPage + 1; - } else { - range.firstPage = 0; - range.lastPage = 0; - } - range.isTOC = isTOC; - m_ranges.append(range); - if (isTOC) m_TOCRangeIndex = m_ranges.size()-1; -} - -void PagesRanges::addTOCMarker(bool addNewRange) -{ - if ( addNewRange || m_ranges.isEmpty()){ - startNewRange(true); - } else { - m_TOCRangeIndex = m_ranges.size()-1; - m_ranges.last().isTOC = true; - } -} - -void PagesRanges::addPage() -{ - if (m_ranges.isEmpty()) startNewRange(); - if (m_ranges.last().firstPage == 0){ - m_ranges.last().firstPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage; - m_ranges.last().lastPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage; - } else { - m_ranges.last().lastPage++; - } -} - -void PagesRanges::shiftRangesNextToTOC(){ - for(int i = m_TOCRangeIndex+1; i < m_ranges.size(); ++i){ - m_ranges[i].firstPage++; - m_ranges[i].lastPage++; - } -} - -void PagesRanges::addTOCPage() -{ - Q_ASSERT(m_TOCRangeIndex != -1); - if (m_TOCRangeIndex != -1){ - PagesRange& tocRange = m_ranges[m_TOCRangeIndex]; - if (tocRange.firstPage == 0) { - tocRange.firstPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; - tocRange.lastPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; - if (tocRange.firstPage == 1 && tocRange.lastPage == 1) - shiftRangesNextToTOC(); - } else { - tocRange.lastPage++; - shiftRangesNextToTOC(); - } - } -} - -void PagesRanges::clear() -{ - m_ranges.clear(); -} - -} // namespace LimeReport diff --git a/Nouveau dossier/lrreportrender.h b/Nouveau dossier/lrreportrender.h deleted file mode 100644 index 7529c5f..0000000 --- a/Nouveau dossier/lrreportrender.h +++ /dev/null @@ -1,227 +0,0 @@ -/*************************************************************************** - * This file is part of the Lime Report project * - * Copyright (C) 2021 by Alexander Arin * - * arin_a@bk.ru * - * * - ** GNU General Public License Usage ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - ** GNU Lesser General Public License ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * 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 General Public License for more details. * - ****************************************************************************/ -#ifndef LRREPORTRENDER_H -#define LRREPORTRENDER_H -#include -#include "lrcollection.h" -#include "lrdatasourcemanager.h" -#include "lrpageitemdesignintf.h" -#include "lrscriptenginemanager.h" -#include "serializators/lrstorageintf.h" - -namespace LimeReport{ - -class PageDesignIntf; -class BandDesignIntf; -class ContentItemDesignIntf; - -class GroupBandsHolder: public QList{ -public: - GroupBandsHolder(bool tryToKeepTogether):QList(),m_tryToKeepTogether(tryToKeepTogether), - m_dataGroup(true), m_footerGroup(false){} - bool tryToKeepTogether(){return m_tryToKeepTogether;} - void setTryToKeepTogether(bool value){m_tryToKeepTogether=value;} - bool isDataGroup(){return m_dataGroup;} - bool isFooterGroup(){ return m_footerGroup;} - void setIsFooterGroup(){m_footerGroup=true;m_dataGroup=false;} -private: - bool m_tryToKeepTogether; - bool m_dataGroup; - bool m_footerGroup; -}; - - -struct PagesRange{ - int firstPage; - int lastPage; - bool isTOC; -}; - -class PagesRanges{ -public: - PagesRanges(): m_TOCRangeIndex(-1) {} - int findLastPageNumber(int index); - int findPageNumber(int index); - PagesRange& currentRange(bool isTOC); - void startNewRange(bool isTOC = false); - void addTOCMarker(bool addNewRange); - void addPage(); - void addTOCPage(); - void clear(); -private: - void shiftRangesNextToTOC(); -private: - QVector m_ranges; - int m_TOCRangeIndex; -}; - - -class ReportRender: public QObject -{ - Q_OBJECT - Q_PROPERTY(QObject* datasourcesManager READ datasources) -public: - enum DataRenderMode {StartNewPageAsNeeded, NotStartNewPage, ForcedStartPage}; - enum BandPrintMode {PrintAlwaysPrintable, PrintNotAlwaysPrintable }; - enum ResetPageNuberType{BandReset, PageReset}; - enum PageRenderStage{BeforePageHeader, AfterPageHeader}; - typedef QSharedPointer Ptr; - ~ReportRender(); - ReportRender(QObject *parent = 0); - void setDatasources(DataSourceManager* value); - void setScriptContext(ScriptEngineContext* scriptContext); - DataSourceManager* datasources(){return m_datasources;} - int pageCount(); - PageItemDesignIntf::Ptr pageAt(int index); - QString renderPageToString(PageItemDesignIntf *patternPage); - ReportPages renderPageToPages(PageItemDesignIntf *patternPage); - ReportPages renderTOC(PageItemDesignIntf *patternPage, bool first, bool resetPages); - void secondRenderPass(ReportPages renderedPages); - void createTOCMarker(bool startNewRange); -signals: - void pageRendered(int renderedPageCount); -public slots: - void cancelRender(); -private: - void analizeContainer(BaseDesignIntf *item, BandDesignIntf *band); - void analizeItem(ContentItemDesignIntf *item, BandDesignIntf *band); - void analizePage(PageItemDesignIntf *patternPage); - - void initDatasources(); - void initDatasource(const QString &name); - void initRenderPage(); - void initVariables(); - void initGroups(); - void clearPageMap(); - - void renderPage(PageItemDesignIntf *patternPage, bool isTOC = false, bool isFirst = false, bool = false); - BandDesignIntf* renderBand(BandDesignIntf *patternBand, BandDesignIntf *bandData, DataRenderMode mode = NotStartNewPage, bool isLast = false); - void renderDataBand(BandDesignIntf* dataBand); - void renderPageHeader(PageItemDesignIntf* patternPage); - void renderReportHeader(PageItemDesignIntf* patternPage, PageRenderStage stage); - void renderPageFooter(PageItemDesignIntf* patternPage); - void renderPageItems(PageItemDesignIntf* patternPage); - void renderChildHeader(BandDesignIntf* parent, BandPrintMode printMode); - void renderChildFooter(BandDesignIntf* parent, BandPrintMode printMode); - void renderChildBands(BandDesignIntf* parentBand); - void recalcIfNeeded(BandDesignIntf *band); - void renderDataHeader(BandDesignIntf* header); - void renderGroupHeader(BandDesignIntf* parentBand, IDataSource* dataSource, bool firstTime); - void renderGroupFooter(BandDesignIntf* parentBand); - void moveTearOffBand(); - qreal calcPageFooterHeight(PageItemDesignIntf* patternPage); - qreal calcSlicePercent(qreal height); - - bool containsGroupFunctions(BaseDesignIntf *container); - void extractGroupFuntionsFromItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band); - void extractGroupFunctionsFromContainer(BaseDesignIntf* baseItem, BandDesignIntf* band); - void extractGroupFunctions(BandDesignIntf* band); - void replaceGroupFunctionsInItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band); - void replaceGroupFunctionsInContainer(BaseDesignIntf* baseItem, BandDesignIntf* band); - void replaceGroupsFunction(BandDesignIntf* band); - - BandDesignIntf *findRecalcableBand(BandDesignIntf *patternBand); - - void popPageFooterGroupValues(BandDesignIntf* dataBand); - void pushPageFooterGroupValues(BandDesignIntf* dataBand); - - enum GroupType{DATA,FOOTER}; - void closeGroup(BandDesignIntf* band); - void openDataGroup(BandDesignIntf* band); - void closeDataGroup(BandDesignIntf* band); - void openFooterGroup(BandDesignIntf* band); - void closeFooterGroup(BandDesignIntf* band); - void cutGroups(); - void checkFooterGroup(BandDesignIntf* groupBand); - void pasteGroups(); - void checkLostHeadersOnPrevPage(); - void checkLostHeadersInPrevColumn(); - - BandDesignIntf* findEnclosingGroup(); - bool registerBand(BandDesignIntf* band, bool registerInChildren=true); - BandDesignIntf *sliceBand(BandDesignIntf* band, BandDesignIntf *patternBand, bool isLast); - - BandDesignIntf* saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf *patternBand); - BandDesignIntf* renderData(BandDesignIntf* patternBand, bool emitBeforeRender = true); - void startNewColumn(); - void startNewPage(bool isFirst = false); - void resetPageNumber(ResetPageNuberType resetType); - void savePage(bool isLast = false); - QString toString(); - void initColumns(); - bool isNeedToRearrangeColumnsItems(); - BandDesignIntf* lastColumnItem(int columnIndex); - void rearrangeColumnsItems(); - int columnItemsCount(int columnIndex); - qreal columnHeigth(int columnIndex); - qreal maxColumnHeight(); - void renameChildItems(BaseDesignIntf *item); - void renderGroupFooterByHeader(BandDesignIntf *groupHeader); - void updateTOC(BaseDesignIntf* item, int pageNumber); - void placeBandOnPage(BandDesignIntf *band, int columnIndex); - QColor makeBackgroundColor(BandDesignIntf *band); -private: - DataSourceManager* m_datasources; - ScriptEngineContext* m_scriptEngineContext; - PageItemDesignIntf* m_renderPageItem; - PageItemDesignIntf* m_patternPageItem; - QList m_renderedPages; - QMultiMap< BandDesignIntf*, GroupBandsHolder* > m_childBands; - QList m_reprintableBands; - QList m_recalcBands; - QMap > m_groupfunctionItems; - int m_currentIndex; - int m_pageCount; - - QMap m_popupedValues; - QMultiMap m_popupedExpression; - - qreal m_pageFooterHeight; - qreal m_dataAreaSize; - qreal m_reportFooterHeight; - int m_renderedDataBandCount; - BandDesignIntf* m_lastRenderedHeader; - BandDesignIntf* m_lastDataBand; - BandDesignIntf* m_lastRenderedFooter; - BandDesignIntf* m_lastRenderedBand; - bool m_renderCanceled; - QVector m_maxHeightByColumn; - QVector m_currentStartDataPos; - int m_currentColumn; - PagesRanges m_pagesRanges; - QVector m_columnedBandItems; - unsigned long long m_currentNameIndex; - bool m_newPageStarted; - bool m_lostHeadersMoved; - bool m_dataSourceSorted = false; - -}; -} // namespace LimeReport -#endif // LRREPORTRENDER_H