0
0
mirror of https://github.com/fralx/LimeReport.git synced 2025-09-23 08:29:07 +03:00
# Conflicts:
#	3rdparty/zint-2.4.4/backend_qt4/Zint.pro
#	demo_r1/demo_r1.pro
#	demo_r2/demo_r2.pro
#	designer/designer.pro
#	translations/limereport_ru.ts
This commit is contained in:
arne krüger
2018-03-09 19:01:07 +01:00
72 changed files with 9216 additions and 712 deletions

View File

@@ -151,10 +151,11 @@ bool GroupBandHeader::isNeedToClose(DataSourceManager* dataManager)
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));
dataManager->putError(tr("Datasource \"%1\" not found!").arg(datasourceName));
}
}

View File

@@ -46,6 +46,7 @@ class SubDetailBand : public DataBandDesignIntf
public:
SubDetailBand(QObject* owner = 0, QGraphicsItem* parent=0);
bool isUnique() const {return false;}
int bandNestingLevel(){ return 1;}
bool isHasHeader() const;
bool isHasFooter() const;
private:
@@ -63,6 +64,8 @@ class SubDetailHeaderBand : public BandDesignIntf
public:
SubDetailHeaderBand(QObject* owner = 0, QGraphicsItem* parent=0);
bool isUnique() const;
bool isHeader() const {return true;}
int bandNestingLevel(){ return 1;}
protected:
QColor bandColor() const;
private:
@@ -79,6 +82,7 @@ public:
SubDetailFooterBand(QObject* owner = 0, QGraphicsItem* parent=0);
virtual bool isUnique() const;
bool isFooter() const{return true;}
int bandNestingLevel(){ return 1;}
protected:
QColor bandColor() const;
private:

View File

@@ -1,5 +1,5 @@
#ifndef TEAROFFBAND_H
#define TEAROFFBAND_H
#ifndef LRTEAROFFBAND_H
#define LRTEAROFFBAND_H
#include "lrbanddesignintf.h"
namespace LimeReport {

View File

@@ -95,7 +95,7 @@ void ConnectionDialog::checkFieldsFill()
{
if (ui->leConnectionName->text().isEmpty()){throw LimeReport::ReportError(tr("Connection Name is empty"));}
if (!m_changeMode&&QSqlDatabase::connectionNames().contains(ui->leConnectionName->text())) {
throw LimeReport::ReportError(tr("Connection with name ")+ui->leConnectionName->text()+tr(" already exists "));
throw LimeReport::ReportError(tr("Connection with name ")+ui->leConnectionName->text()+tr(" already exists! "));
}
}
@@ -117,6 +117,8 @@ ConnectionDesc *ConnectionDialog::uiToConnection(LimeReport::ConnectionDesc* con
result = new LimeReport::ConnectionDesc();
result ->setName(ConnectionDesc::connectionNameForReport(ui->leConnectionName->text()));
result ->setHost(ui->leServerName->text());
if (!ui->lePort->text().isEmpty())
result->setPort(ui->lePort->text().toInt());
result ->setDriver(ui->cbbDrivers->currentText());
result ->setUserName(ui->leUserName->text());
result ->setPassword(ui->lePassword->text());
@@ -139,6 +141,7 @@ void ConnectionDialog::connectionToUI()
ui->cbbDrivers->setCurrentIndex(ui->cbbDrivers->findText(m_connection->driver()));
ui->cbAutoConnect->setChecked(m_connection->autoconnect());
ui->cbbKeepCredentials->setChecked(!m_connection->keepDBCredentials());
ui->lePort->setText(m_connection->port()!=-1?QString::number(m_connection->port()):"");
}
void ConnectionDialog::on_toolButton_clicked()

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>420</width>
<height>294</height>
<height>323</height>
</rect>
</property>
<property name="windowTitle">
@@ -17,7 +17,7 @@
<iconset resource="lrdatabrowser.qrc">
<normaloff>:/databrowser/images/database_disconnected</normaloff>:/databrowser/images/database_disconnected</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
@@ -44,88 +44,106 @@
</widget>
</item>
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="lbDriver">
<property name="text">
<string>Driver</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="cbbDrivers"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lbServer">
<property name="text">
<string>Server </string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="leServerName">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lbUser">
<property name="text">
<string>User</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="leUserName">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="lbPassword">
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="lePassword">
<property name="text">
<string/>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="lbDatabase">
<property name="text">
<string>Database</string>
</property>
</widget>
</item>
<item row="4" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>2</number>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLineEdit" name="leDataBase">
<widget class="QLabel" name="lbDriver">
<property name="text">
<string>Driver</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lbServer">
<property name="text">
<string>Server </string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Port</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lbUser">
<property name="text">
<string>User</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lbPassword">
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lbDatabase">
<property name="text">
<string>Database</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QComboBox" name="cbbDrivers"/>
</item>
<item>
<widget class="QLineEdit" name="leServerName">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButton">
<widget class="QLineEdit" name="lePort"/>
</item>
<item>
<widget class="QLineEdit" name="leUserName">
<property name="text">
<string>...</string>
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lePassword">
<property name="text">
<string/>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>2</number>
</property>
<item>
<widget class="QLineEdit" name="leDataBase">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>

View File

@@ -131,7 +131,7 @@ void DataBrowser::slotDeleteConnection()
QMessageBox::critical(
this,
tr("Attention"),
tr("Do you really want to delete \"%1\" connection ?").arg(getConnectionName(NameForUser)),
tr("Do you really want to delete \"%1\" connection?").arg(getConnectionName(NameForUser)),
QMessageBox::Ok|QMessageBox::No,
QMessageBox::No
) == QMessageBox::Ok
@@ -395,7 +395,7 @@ void DataBrowser::slotDeleteDatasource()
QMessageBox::critical(
this,
tr("Attention"),
tr("Do you really want to delete \"%1\" datasource ?").arg(datasourceName),
tr("Do you really want to delete \"%1\" datasource?").arg(datasourceName),
QMessageBox::Ok|QMessageBox::No,
QMessageBox::No
) == QMessageBox::Ok
@@ -702,7 +702,7 @@ void DataBrowser::on_dataTree_currentItemChanged(QTreeWidgetItem *current, QTree
Q_UNUSED(previous)
if (current&&(current->type() == DataBrowserTree::Connection)) {
bool internalConnection = m_report->dataManager()->connectionByName(ConnectionDesc::connectionNameForReport(current->text(0)));
if (m_report->dataManager()->isConnectionConnected(current->text(0))){
if (m_report->dataManager()->isConnectionConnected(ConnectionDesc::connectionNameForReport(current->text(0)))){
ui->pbConnect->setIcon(QIcon(":/databrowser/images/plug-connect.png"));
} else {
ui->pbConnect->setIcon(QIcon(":/databrowser/images/plug-disconnect.png"));
@@ -766,7 +766,7 @@ void DataBrowser::on_deleteVariable_clicked()
{
QString varName = getVariable();
if (!varName.isEmpty()){
if (QMessageBox::critical(this,tr("Attention"),QString(tr("Do you really want to delete variable \"%1\" ?")).arg(varName),
if (QMessageBox::critical(this,tr("Attention"),QString(tr("Do you really want to delete variable \"%1\"?")).arg(varName),
QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel
)==QMessageBox::Ok){
m_report->dataManager()->deleteVariable(varName);

View File

@@ -147,11 +147,11 @@ void SQLEditDialog::hideEvent(QHideEvent *)
void SQLEditDialog::check()
{
if (ui->leDatasourceName->text().isEmpty()) throw LimeReport::ReportError(tr("Datasource Name is empty !"));
if (ui->textEditSQL->toPlainText().isEmpty() && (!ui->rbProxy) ) throw LimeReport::ReportError(tr("SQL is empty !"));
if (ui->leDatasourceName->text().isEmpty()) throw LimeReport::ReportError(tr("Datasource Name is empty!"));
if (ui->textEditSQL->toPlainText().isEmpty() && (!ui->rbProxy) ) throw LimeReport::ReportError(tr("SQL is empty!"));
if (m_dialogMode==AddMode){
if (m_datasources->containsDatasource(ui->leDatasourceName->text())){
throw LimeReport::ReportError(QString(tr("Datasource with name: \"%1\" already exists !")).arg(ui->leDatasourceName->text()));
throw LimeReport::ReportError(QString(tr("Datasource with name: \"%1\" already exists!")).arg(ui->leDatasourceName->text()));
}
}
}

View File

@@ -63,7 +63,7 @@ bool lessThen(BaseDesignIntf *c1, BaseDesignIntf* c2){
HorizontalLayout::HorizontalLayout(QObject *owner, QGraphicsItem *parent)
: LayoutDesignIntf(xmlTag, owner, parent),m_isRelocating(false),m_layoutType(Layout)
{
setPossibleResizeDirectionFlags(ResizeBottom);
setPossibleResizeDirectionFlags(AllDirections);
m_layoutMarker = new LayoutMarker(this);
m_layoutMarker->setParentItem(this);
m_layoutMarker->setColor(Qt::red);
@@ -86,6 +86,7 @@ BaseDesignIntf *HorizontalLayout::createSameTypeItem(QObject *owner, QGraphicsIt
void HorizontalLayout::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event)
LayoutDesignIntf::hoverEnterEvent(event);
// if ((itemMode() & LayoutEditMode) || isSelected()){
// setChildVisibility(false);
// }
@@ -94,6 +95,7 @@ void HorizontalLayout::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
void HorizontalLayout::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event)
LayoutDesignIntf::hoverLeaveEvent(event);
// setChildVisibility(true);
}
@@ -101,7 +103,7 @@ void HorizontalLayout::geometryChangedEvent(QRectF newRect, QRectF )
{
m_layoutMarker->setHeight(newRect.height());
relocateChildren();
if (m_layoutType == Table && !m_isRelocating){
if (/*m_layoutType == Table && */!m_isRelocating){
divideSpace();
}
}
@@ -203,6 +205,36 @@ void HorizontalLayout::setBorderLinesFlags(BaseDesignIntf::BorderLines flags)
relocateChildren();
}
QVariant HorizontalLayout::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value)
{
if (change == QGraphicsItem::ItemSelectedHasChanged){
m_isRelocating = true;
foreach(BaseDesignIntf* item, m_children){
item->setVisible(!value.toBool());
}
m_isRelocating = false;
}
return LayoutDesignIntf::itemChange(change, value);
}
void HorizontalLayout::paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
if (isSelected()){
foreach( BaseDesignIntf* item, m_children){
ppainter->save();
ppainter->setPen(Qt::red);
ppainter->drawRect(
QRectF(item->pos().x(),item->pos().y(),
item->rect().bottomRight().rx(),
item->rect().bottomRight().ry()
)
);
ppainter->restore();
}
}
LayoutDesignIntf::paint(ppainter, option, widget);
}
void HorizontalLayout::restoreChild(BaseDesignIntf* item){
if (m_children.contains(item)) return;
@@ -257,9 +289,22 @@ void HorizontalLayout::addChild(BaseDesignIntf *item, bool updateSize)
item->setFixedPos(true);
item->setPossibleResizeDirectionFlags(ResizeRight | ResizeBottom);
connect(item,SIGNAL(destroyed(QObject*)),this,SLOT(slotOnChildDestroy(QObject*)));
connect(item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)),this,SLOT(slotOnChildGeometryChanged(QObject*,QRectF,QRectF)));
connect(item, SIGNAL(itemVisibleHasChanged(BaseDesignIntf*)),this,SLOT(slotOnChildVisibleHasChanged(BaseDesignIntf*)));
connect(
item, SIGNAL(destroyed(QObject*)),
this, SLOT(slotOnChildDestroy(QObject*))
);
connect(
item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)),
this,SLOT(slotOnChildGeometryChanged(QObject*,QRectF,QRectF))
);
connect(
item, SIGNAL(itemVisibleHasChanged(BaseDesignIntf*)),
this,SLOT(slotOnChildVisibleHasChanged(BaseDesignIntf*))
);
connect(
item, SIGNAL(itemSelectedHasBeenChanged(BaseDesignIntf*,bool)),
this, SLOT(slotOnChildSelectionHasChanged(BaseDesignIntf*,bool))
);
if (updateSize){
relocateChildren();
@@ -292,7 +337,8 @@ void HorizontalLayout::objectLoadFinished()
void HorizontalLayout::updateLayoutSize()
{
int w = ((borderLines() != 0) ? borderLineSize() : 0)*2;
int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0;
int w = spaceBorder*2;
qreal h = 0;
foreach(BaseDesignIntf* item, m_children){
if (item->isVisible()){
@@ -300,7 +346,7 @@ void HorizontalLayout::updateLayoutSize()
w+=item->width();
}
}
if (h>0) setHeight(h);
if (h>0) setHeight(h+spaceBorder*2);
setWidth(w);
}
@@ -317,7 +363,7 @@ void HorizontalLayout::relocateChildren()
qreal curX = spaceBorder;
m_isRelocating = true;
foreach (BaseDesignIntf* item, m_children) {
if (item->isVisible()){
if (item->isVisible() || itemMode() == DesignMode){
item->setPos(curX,spaceBorder);
curX+=item->width();
item->setHeight(height()-(spaceBorder * 2));
@@ -418,14 +464,23 @@ BaseDesignIntf* HorizontalLayout::findPrior(BaseDesignIntf* item){
void HorizontalLayout::divideSpace(){
m_isRelocating = true;
qreal itemsSumSize = 0;
int visibleItemsCount = 0;
int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0;
foreach(BaseDesignIntf* item, m_children){
itemsSumSize += item->width();
if (item->isVisible() || itemMode() == DesignMode ){
itemsSumSize += item->width();
visibleItemsCount++;
}
}
qreal delta = (width() - itemsSumSize)/m_children.size();
qreal delta = (width() - (itemsSumSize+spaceBorder*2)) / (visibleItemsCount!=0 ? visibleItemsCount : 1);
for (int i=0; i<m_children.size(); ++i){
m_children[i]->setWidth(m_children[i]->width()+(delta));
if (m_children[i]->isVisible() || itemMode() == DesignMode)
m_children[i]->setWidth(m_children[i]->width()+delta);
if ((i+1)<m_children.size())
m_children[i+1]->setPos(m_children[i+1]->pos().x()+delta*(i+1),m_children[i+1]->pos().y());
if (m_children[i+1]->isVisible() || itemMode() == DesignMode)
m_children[i+1]->setPos(m_children[i+1]->pos().x()+delta*(i+1),m_children[i+1]->pos().y());
}
m_isRelocating = false;
}
@@ -463,6 +518,11 @@ void HorizontalLayout::slotOnChildVisibleHasChanged(BaseDesignIntf *)
}
}
void HorizontalLayout::slotOnChildSelectionHasChanged(BaseDesignIntf* item, bool value)
{
item->setZValue(value ? item->zValue()+1 : item->zValue()-1);
}
HorizontalLayout::LayoutType HorizontalLayout::layoutType() const
{
return m_layoutType;

View File

@@ -74,6 +74,7 @@ public:
bool isEmpty() const;
LayoutType layoutType() const;
void setLayoutType(const LayoutType &layoutType);
bool isSplittable() const { return true;}
protected:
void collectionLoadFinished(const QString &collectionName);
void objectLoadFinished();
@@ -95,11 +96,15 @@ protected:
void setItemAlign(const ItemAlign &itemAlign);
void setBorderLinesFlags(BorderLines flags);
QVariant itemChange(GraphicsItemChange change, const QVariant &value);
void paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget);
private slots:
void slotOnChildDestroy(QObject *child);
void slotOnChildGeometryChanged(QObject*item, QRectF newGeometry, QRectF oldGeometry);
void slotOnChildItemAlignChanged(BaseDesignIntf* item, const ItemAlign&, const ItemAlign&);
void slotOnChildVisibleHasChanged(BaseDesignIntf*);
void slotOnChildSelectionHasChanged(BaseDesignIntf* item, bool value);
//void slotOnPosChanged(QObject*, QPointF newPos, QPointF );
private:
void divideSpace();

View File

@@ -47,7 +47,7 @@ bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instanc
namespace LimeReport{
ImageItem::ImageItem(QObject* owner,QGraphicsItem* parent)
:ItemDesignIntf(xmlTag,owner,parent),m_autoSize(false), m_scale(true), m_keepAspectRatio(true), m_center(true){}
:ItemDesignIntf(xmlTag,owner,parent),m_autoSize(false), m_scale(true), m_keepAspectRatio(true), m_center(true), m_format(Binary){}
BaseDesignIntf *ImageItem::createSameTypeItem(QObject *owner, QGraphicsItem *parent)
{
@@ -65,8 +65,21 @@ void ImageItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass,
if (data.isValid()){
if (data.type()==QVariant::Image){
m_picture = data.value<QImage>();
} else
m_picture.loadFromData(data.toByteArray());
} else {
switch (m_format) {
default:
case Binary:
m_picture.loadFromData(data.toByteArray());
break;
case Hex:
m_picture.loadFromData(QByteArray::fromHex(data.toByteArray()));
break;
case Base64:
m_picture.loadFromData(QByteArray::fromBase64(data.toByteArray()));
break;
}
}
}
}
} else if (!m_resourcePath.isEmpty()){
@@ -267,6 +280,19 @@ void ImageItem::setImage(QImage value)
}
}
ImageItem::Format ImageItem::format() const
{
return m_format;
}
void ImageItem::setFormat(Format format)
{
if (m_format!=format){
Format oldValue = m_format;
m_format=format;
update();
notify("format",oldValue,format);
}
}
}

View File

@@ -36,16 +36,24 @@ namespace LimeReport{
class ImageItem : public LimeReport::ItemDesignIntf
{
Q_OBJECT
Q_ENUMS(Format)
Q_PROPERTY(QImage image READ image WRITE setImage)
Q_PROPERTY(int opacity READ opacity WRITE setOpacity)
Q_PROPERTY(QString datasource READ datasource WRITE setDatasource)
Q_PROPERTY(QString field READ field WRITE setField)
Q_PROPERTY(Format format READ format WRITE setFormat)
Q_PROPERTY(bool autoSize READ autoSize WRITE setAutoSize)
Q_PROPERTY(bool scale READ scale WRITE setScale)
Q_PROPERTY(bool keepAspectRatio READ keepAspectRatio WRITE setKeepAspectRatio)
Q_PROPERTY(bool center READ center WRITE setCenter)
Q_PROPERTY(QString resourcePath READ resourcePath WRITE setResourcePath)
public:
enum Format {
Binary = 0,
Hex = 1,
Base64 = 2
};
ImageItem(QObject *owner, QGraphicsItem *parent);
virtual void paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void setImage(QImage value);
@@ -65,6 +73,8 @@ public:
void setKeepAspectRatio(bool keepAspectRatio);
bool center() const;
void setCenter(bool center);
Format format() const;
void setFormat(Format format);
qreal minHeight() const;
@@ -82,6 +92,7 @@ private:
bool m_scale;
bool m_keepAspectRatio;
bool m_center;
Format m_format;
};
}

View File

@@ -48,8 +48,8 @@ namespace{
LimeReport::ItemLocationPropItem::ItemLocationPropItem(QObject* object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem* parent, bool readonly)
:LimeReport::ObjectPropItem(object, objects, name, displayName, value, parent, readonly){
m_locationMap.insert("Band",LimeReport::ItemDesignIntf::Band);
m_locationMap.insert("Page",LimeReport::ItemDesignIntf::Page);
m_locationMap.insert(tr("Band"),LimeReport::ItemDesignIntf::Band);
m_locationMap.insert(tr("Page"),LimeReport::ItemDesignIntf::Page);
}

View File

@@ -113,16 +113,16 @@ void TextItem::processPopUpAction(QAction *action)
this->showEditorDialog();
}
if (action->text().compare(tr("Auto height")) == 0){
setProperty("autoHeight",action->isChecked());
page()->setPropertyToSelectedItems("autoHeight",action->isChecked());
}
if (action->text().compare(tr("Allow HTML")) == 0){
setProperty("allowHTML",action->isChecked());
page()->setPropertyToSelectedItems("allowHTML",action->isChecked());
}
if (action->text().compare(tr("Allow HTML in fields")) == 0){
setProperty("allowHTMLInFields",action->isChecked());
page()->setPropertyToSelectedItems("allowHTMLInFields",action->isChecked());
}
if (action->text().compare(tr("Stretch to max height")) == 0){
setProperty("stretchToMaxHeight",action->isChecked());
page()->setPropertyToSelectedItems("stretchToMaxHeight",action->isChecked());
}
}
@@ -576,7 +576,7 @@ void TextItem::setFollowTo(const QString &followTo)
QMessageBox::critical(
0,
tr("Error"),
tr("TextItem \" %1 \" not found !")
tr("TextItem \" %1 \" not found!")
.arg(m_followTo)
);
notify("followTo",followTo,"");
@@ -777,46 +777,48 @@ bool TextItem::canBeSplitted(int height) const
return height > m_firstLineSize;
}
QString TextItem::getTextPart(int height, int skipHeight){
int linesHeight = 0;
QString TextItem::extractText(QTextBlock& curBlock, int height){
int curLine = 0;
int textPos = 0;
int linesHeight = 0;
QString resultText;
for (;curBlock != curBlock.document()->end() || curLine<=curBlock.lineCount(); curBlock = curBlock.next(), curLine = 0, resultText += '\n' ){
linesHeight+=curBlock.blockFormat().topMargin();
for (;curLine < curBlock.layout()->lineCount(); curLine++){
linesHeight += curBlock.layout()->lineAt(curLine).height() + lineSpacing();
if (height > 0 && linesHeight > (height-borderLineSize() * 2)) {goto loop_exit;}
resultText += curBlock.text().mid(curBlock.layout()->lineAt(curLine).textStart(),
curBlock.layout()->lineAt(curLine).textLength());
}
}
loop_exit: return resultText;
}
TextPtr text = textDocument();
QString TextItem::getTextPart(int height, int skipHeight){
QTextBlock curBlock = text->begin();
QString resultText = "";
TextPtr text = textDocument();
text->size().height();
QTextBlock curBlock = text->begin();
QTextCursor cursor(text.data());
cursor.movePosition(QTextCursor::Start);
if (skipHeight > 0){
for (;curBlock != text->end(); curBlock=curBlock.next()){
for (curLine = 0; curLine < curBlock.layout()->lineCount(); curLine++){
linesHeight += curBlock.layout()->lineAt(curLine).height() + lineSpacing();
if (linesHeight > (skipHeight-(/*fakeMarginSize()*2+*/borderLineSize() * 2))) {goto loop_exit;}
}
}
loop_exit:;
resultText = extractText(curBlock, skipHeight);
cursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, resultText.length());
}
linesHeight = 0;
resultText = extractText(curBlock, height);
cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, resultText.length());
for (;curBlock != text->end() || curLine<curBlock.lineCount(); curBlock = curBlock.next(), curLine = 0, resultText += '\n'){
for (; curLine<curBlock.layout()->lineCount(); curLine++){
if (resultText == "") textPos= curBlock.layout()->lineAt(curLine).textStart();
linesHeight += curBlock.layout()->lineAt(curLine).height() + lineSpacing();
if ( (height>0) && (linesHeight>(height-(/*fakeMarginSize()*2+*/borderLineSize()*2))) ) {
linesHeight-=curBlock.layout()->lineAt(curLine).height();
goto loop_exit1;
}
resultText+=curBlock.text().mid(curBlock.layout()->lineAt(curLine).textStart(),
curBlock.layout()->lineAt(curLine).textLength());
}
if (allowHTML()){
resultText = cursor.selection().toHtml();
resultText.remove("<!--StartFragment-->");
resultText.remove("<!--EndFragment-->");
} else {
resultText = cursor.selection().toPlainText();
}
loop_exit1:;
resultText.chop(1);
QScopedPointer<HtmlContext> context(new HtmlContext(m_strText));
return context->extendTextByTags(resultText,textPos);
return resultText;
}
void TextItem::restoreLinksEvent()

View File

@@ -181,7 +181,7 @@ private:
QString formatDateTime(const QDateTime &value);
QString formatNumber(const double value);
QString formatFieldValue();
QString extractText(QTextBlock& curBlock, int height);
TextPtr textDocument() const;
private:
QString m_strText;
@@ -208,6 +208,7 @@ private:
TextItem* m_follower;
qreal m_textIndent;
Qt::LayoutDirection m_textLayoutDirection;
};
}

View File

@@ -91,6 +91,10 @@ SOURCES += \
$$REPORT_PATH/lrsettingdialog.cpp \
$$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \
$$REPORT_PATH/lritemscontainerdesignitf.cpp
contains(CONFIG, staticlib){
SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp
}
contains(CONFIG, zint){
SOURCES += $$REPORT_PATH/items/lrbarcodeitem.cpp
@@ -159,6 +163,7 @@ HEADERS += \
$$REPORT_PATH/items/lrshapeitem.h \
$$REPORT_PATH/items/lrimageitem.h \
$$REPORT_PATH/items/lrsimpletagparser.h \
$$REPORT_PATH/lrfactoryinitializer.h \
$$REPORT_PATH/lrbanddesignintf.h \
$$REPORT_PATH/lrpageitemdesignintf.h \
$$REPORT_PATH/lrbandsmanager.h \
@@ -191,7 +196,11 @@ HEADERS += \
$$REPORT_PATH/lrpreviewreportwidget_p.h \
$$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \
$$REPORT_PATH/lritemscontainerdesignitf.h
contains(CONFIG, staticlib){
HEADERS += $$REPORT_PATH/lrfactoryinitializer.h
}
contains(CONFIG,zint){
HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h
}
@@ -209,8 +218,6 @@ FORMS += \
$$REPORT_PATH/lrsettingdialog.ui \
$$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \
RESOURCES += \
$$REPORT_PATH/objectinspector/lobjectinspector.qrc \
$$REPORT_PATH/databrowser/lrdatabrowser.qrc \

View File

@@ -10,8 +10,15 @@ CONFIG(debug, debug|release) {
TEMPLATE = lib
CONFIG += lib
CONFIG += dll
contains(CONFIG, static_build){
CONFIG += staticlib
}
!contains(CONFIG, staticlib){
CONFIG += lib
CONFIG += dll
}
CONFIG += create_prl
CONFIG += link_prl
@@ -23,6 +30,12 @@ macx{
DEFINES += LIMEREPORT_EXPORTS
contains(CONFIG, staticlib){
DEFINES += HAVE_STATIC_BUILD
message(STATIC_BUILD)
DEFINES -= LIMEREPORT_EXPORTS
}
EXTRA_FILES += \
$$PWD/lrglobal.cpp \
$$PWD/lrglobal.h \
@@ -83,7 +96,7 @@ contains(CONFIG,zint){
####Automatically build required translation files (*.qm)
contains(CONFIG,build_translations){
LANGUAGES = ru es_ES ar
LANGUAGES = ru es_ES ar fr zh
defineReplace(prependAll) {
for(a,$$1):result += $$2$${a}$$3

View File

@@ -99,6 +99,11 @@ void BandMarker::mousePressEvent(QGraphicsSceneMouseEvent *event)
}
}
void BandMarker::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
m_band->contextMenuEvent(event);
}
BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, QObject* owner, QGraphicsItem *parent) :
ItemsContainerDesignInft(xmlTypeName, owner,parent),
m_bandType(bandType),
@@ -122,7 +127,8 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q
m_startNewPage(false),
m_startFromNewPage(false),
m_printAlways(false),
m_repeatOnEachRow(false)
m_repeatOnEachRow(false),
m_bottomSpace()
{
setPossibleResizeDirectionFlags(ResizeBottom);
setPossibleMoveFlags(TopBotom);
@@ -145,6 +151,8 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q
m_bandNameLabel->setVisible(false);
if (scene()) scene()->addItem(m_bandNameLabel);
m_alternateBackgroundColor = backgroundColor();
connect(this, SIGNAL(propertyObjectNameChanged(QString, QString)),
this, SLOT(slotPropertyObjectNameChanged(const QString&,const QString&)));
}
BandDesignIntf::~BandDesignIntf()
@@ -159,6 +167,21 @@ BandDesignIntf::~BandDesignIntf()
delete m_bandNameLabel;
}
int extractItemIndex(const BaseDesignIntf* item){
QString objectName = extractClassName(item->metaObject()->className());
QString value = item->objectName().right(item->objectName().size() - objectName.size());
return value.toInt();
}
QString BandDesignIntf::translateBandName(const BaseDesignIntf* item) const{
QString defaultBandName = extractClassName(item->metaObject()->className()).toLatin1()+QString::number(extractItemIndex(item));
if (item->objectName().compare(defaultBandName) == 0){
return tr(extractClassName(item->metaObject()->className()).toLatin1())+QString::number(extractItemIndex(item));
} else {
return item->objectName();
}
}
void BandDesignIntf::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
@@ -170,8 +193,7 @@ void BandDesignIntf::paint(QPainter *painter, const QStyleOptionGraphicsItem *op
if (itemMode() & DesignMode){
painter->save();
QString bandText = objectName();
if (parentBand()) bandText+=QLatin1String(" connected to ")+parentBand()->objectName();
QString bandText = bandTitle();
QFont font("Arial", 7 * Const::fontFACTOR, -1, true);
QFontMetrics fontMetrics(font);
@@ -202,6 +224,23 @@ void BandDesignIntf::paint(QPainter *painter, const QStyleOptionGraphicsItem *op
BaseDesignIntf::paint(painter,option,widget);
}
void BandDesignIntf::translateBandsName()
{
tr("DataBand");
tr("DataHeaderBand");
tr("DataFooterBand");
tr("ReportHeader");
tr("ReportFooter");
tr("PageHeader");
tr("PageFooter");
tr("SubDetailBand");
tr("SubDetailHeaderBand");
tr("SubDetailFooterBand");
tr("GroupBandHeader");
tr("GroupBandFooter");
tr("TearOffBand");
}
BandDesignIntf::BandsType BandDesignIntf::bandType() const
{
return m_bandType;
@@ -209,8 +248,8 @@ BandDesignIntf::BandsType BandDesignIntf::bandType() const
QString BandDesignIntf::bandTitle() const
{
QString result = objectName();
if (parentBand()) result +=tr(" connected to ")+parentBand()->objectName();
QString result = translateBandName(this);
if (parentBand()) result +=tr(" connected to ") + translateBandName(parentBand());
return result;
}
@@ -229,9 +268,15 @@ void BandDesignIntf::setBandIndex(int value)
m_bandIndex=value;
}
void BandDesignIntf::changeBandIndex(int value)
void BandDesignIntf::changeBandIndex(int value, bool firstTime)
{
int indexOffset = value - m_bandIndex;
int indexOffset;
if (firstTime && bandHeader())
value += 1;
indexOffset = value - m_bandIndex;
foreach(BandDesignIntf* band, childBands()){
int newIndex = band->bandIndex()+indexOffset;
band->changeBandIndex(newIndex);
@@ -252,6 +297,14 @@ void BandDesignIntf::setDataSourceName(const QString &datasource){
m_dataSourceName=datasource;
}
void BandDesignIntf::setKeepBottomSpaceOption(bool value){
if (m_keepBottomSpace!=value){
m_keepBottomSpace=value;
if (!isLoading())
notify("keepBottomSpace",!value,value);
}
}
void BandDesignIntf::addChildBand(BandDesignIntf *band)
{
m_childBands.append(band);
@@ -293,6 +346,16 @@ bool BandDesignIntf::isConnectedToBand(BandDesignIntf::BandsType bandType) const
return false;
}
int BandDesignIntf::maxChildIndex(BandDesignIntf::BandsType bandType) const{
int curIndex = bandIndex();
foreach(BandDesignIntf* childBand, childBands()){
if ( (childBand->bandIndex() > bandIndex()) && (childBand->bandType() < bandType) ){
curIndex = std::max(curIndex,childBand->maxChildIndex());
}
}
return curIndex;
}
int BandDesignIntf::maxChildIndex(QSet<BandDesignIntf::BandsType> ignoredBands) const{
int curIndex = bandIndex();
foreach(BandDesignIntf* childBand, childBands()){
@@ -416,13 +479,25 @@ void BandDesignIntf::preparePopUpMenu(QMenu &menu)
}
menu.addSeparator();
QAction* autoHeightAction = menu.addAction(tr("Auto height"));
autoHeightAction->setCheckable(true);
autoHeightAction->setChecked(autoHeight());
QAction* currAction = menu.addAction(tr("Auto height"));
currAction->setCheckable(true);
currAction->setChecked(autoHeight());
QAction* autoSplittableAction = menu.addAction(tr("Splittable"));
autoSplittableAction->setCheckable(true);
autoSplittableAction->setChecked(isSplittable());
currAction = menu.addAction(tr("Splittable"));
currAction->setCheckable(true);
currAction->setChecked(isSplittable());
currAction = menu.addAction(tr("Keep bottom space"));
currAction->setCheckable(true);
currAction->setChecked(keepBottomSpaceOption());
currAction = menu.addAction(tr("Start from new page"));
currAction->setCheckable(true);
currAction->setChecked(startFromNewPage());
currAction = menu.addAction(tr("Start new page"));
currAction->setCheckable(true);
currAction->setChecked(startNewPage());
}
void BandDesignIntf::processPopUpAction(QAction *action)
@@ -433,13 +508,23 @@ void BandDesignIntf::processPopUpAction(QAction *action)
if (action->text().compare(tr("Splittable")) == 0){
setProperty("splittable",action->isChecked());
}
if (action->text().compare(tr("Keep bottom space")) == 0){
setProperty("keepBottomSpace",action->isChecked());
}
if (action->text().compare(tr("Start new page")) == 0){
setProperty("startNewPage",action->isChecked());
}
if (action->text().compare(tr("Start from new page")) == 0){
setProperty("startFromNewPage",action->isChecked());
}
}
BaseDesignIntf* BandDesignIntf::cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent)
{
int maxBottom = 0;
BandDesignIntf* upperPart = dynamic_cast<BandDesignIntf*>(createSameTypeItem(owner,parent));
BaseDesignIntf* upperItem;
upperPart->m_bottomSpace = this->bottomSpace();
BaseDesignIntf* upperItem = 0;
upperPart->initFromItem(this);
@@ -485,6 +570,7 @@ bool itemLessThen(QGraphicsItem* i1, QGraphicsItem* i2){
BaseDesignIntf *BandDesignIntf::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent)
{
BandDesignIntf* bottomPart = dynamic_cast<BandDesignIntf*>(createSameTypeItem(owner,parent));
bottomPart->m_bottomSpace = this->bottomSpace();
bottomPart->initFromItem(this);
QList<QGraphicsItem*> bandItems;
@@ -497,30 +583,28 @@ BaseDesignIntf *BandDesignIntf::cloneBottomPart(int height, QObject *owner, QGra
if (item){
if (item->geometry().top()>height){
BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart);
tmpItem->setPos(tmpItem->pos().x(),tmpItem->pos().y()-height);
tmpItem->setPos(tmpItem->pos().x(), (tmpItem->pos().y()-height)+borderLineSize());
}
else if ((item->geometry().top()<height) && (item->geometry().bottom()>height)){
int sliceHeight = height-item->geometry().top();
if (item->canBeSplitted(sliceHeight)) {
if (item->isSplittable() && item->canBeSplitted(sliceHeight)) {
BaseDesignIntf* tmpItem=item->cloneBottomPart(sliceHeight,bottomPart,bottomPart);
tmpItem->setPos(tmpItem->pos().x(),0);
if (tmpItem->pos().y()<0) tmpItem->setPos(tmpItem->pos().x(),0);
qreal sizeOffset = (m_slicedItems.value(tmpItem->objectName())->height()+tmpItem->height()) - item->height();
qreal bottomOffset = (height - m_slicedItems.value(tmpItem->objectName())->pos().y())-m_slicedItems.value(tmpItem->objectName())->height();
moveItemsDown(item->pos().y()+item->height(), sizeOffset + bottomOffset);
}
else if (item->isSplittable()){
BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart);
tmpItem->setPos(tmpItem->pos().x(),0);
tmpItem->setPos(tmpItem->pos().x(),borderLineSize());
BaseDesignIntf* slicedItem = m_slicedItems.value(tmpItem->objectName());
if (slicedItem){
qreal sizeOffset = (slicedItem->height()+tmpItem->height()) - item->height();
qreal bottomOffset = (height - slicedItem->pos().y())-m_slicedItems.value(tmpItem->objectName())->height();
moveItemsDown(item->pos().y()+item->height(), sizeOffset + bottomOffset);
}
} else {
if ((item->geometry().bottom()-height)>height){
BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart);
tmpItem->setPos(tmpItem->pos().x(),0);
tmpItem->setPos(tmpItem->pos().x(),borderLineSize());
tmpItem->setHeight((this->height()-height));
} else {
BaseDesignIntf* tmpItem = item->cloneEmpty((this->height()-height),bottomPart,bottomPart);
if (tmpItem)
tmpItem->setPos(tmpItem->pos().x(),0);
tmpItem->setPos(tmpItem->pos().x(),borderLineSize());
}
}
}
@@ -570,7 +654,7 @@ void BandDesignIntf::trimToMaxHeight(int maxHeight)
void BandDesignIntf::setBandTypeText(const QString &value){
m_bandTypeText=value;
m_bandNameLabel->updateLabel();
m_bandNameLabel->updateLabel(bandTitle());
}
QSet<BandDesignIntf::BandsType> BandDesignIntf::groupBands()
@@ -628,7 +712,7 @@ QVariant BandDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, co
m_bandMarker->update(0,0,
m_bandMarker->boundingRect().width(),
m_bandMarker->boundingRect().width());
m_bandNameLabel->updateLabel();
m_bandNameLabel->updateLabel(bandTitle());
m_bandNameLabel->setVisible(value.toBool());
}
@@ -682,6 +766,18 @@ void BandDesignIntf::setAlternateBackgroundColor(const QColor &alternateBackgrou
m_alternateBackgroundColor = alternateBackgroundColor;
}
qreal BandDesignIntf::bottomSpace() const
{
return m_bottomSpace.isValid() ? m_bottomSpace.value() : height()-findMaxBottom();
}
void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QString& newName)
{
update();
if (m_bandNameLabel)
m_bandNameLabel->updateLabel(newName);
}
bool BandDesignIntf::repeatOnEachRow() const
{
return m_repeatOnEachRow;
@@ -709,7 +805,11 @@ bool BandDesignIntf::startFromNewPage() const
void BandDesignIntf::setStartFromNewPage(bool startWithNewPage)
{
m_startFromNewPage = startWithNewPage;
if (m_startFromNewPage != startWithNewPage){
m_startFromNewPage = startWithNewPage;
if (!isLoading())
notify("startFromNewPage", !startWithNewPage, startWithNewPage);
}
}
bool BandDesignIntf::startNewPage() const
@@ -719,7 +819,11 @@ bool BandDesignIntf::startNewPage() const
void BandDesignIntf::setStartNewPage(bool startNewPage)
{
m_startNewPage = startNewPage;
if (m_startNewPage != startNewPage){
m_startNewPage = startNewPage;
if (!isLoading())
notify("startNewPage", !startNewPage, startNewPage);
}
}
void BandDesignIntf::setAutoHeight(bool value){
@@ -816,7 +920,8 @@ void BandDesignIntf::setKeepFooterTogether(bool value)
void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight)
{
qreal spaceBorder=0;
if (keepBottomSpaceOption()) spaceBorder=height()-findMaxBottom();
if (keepBottomSpaceOption()) spaceBorder = bottomSpace();
spaceBorder = spaceBorder>0 ? spaceBorder : 0;
if (borderLines()!=0){
spaceBorder += borderLineSize();
}
@@ -836,7 +941,7 @@ void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass p
void BandDesignIntf::updateBandNameLabel()
{
if (m_bandNameLabel) m_bandNameLabel->updateLabel();
if (m_bandNameLabel) m_bandNameLabel->updateLabel(bandTitle());
}
QColor BandDesignIntf::selectionColor() const
@@ -879,7 +984,7 @@ QRectF BandNameLabel::boundingRect() const
return m_rect;
}
void BandNameLabel::updateLabel()
void BandNameLabel::updateLabel(const QString& bandName)
{
QFont font("Arial",7*Const::fontFACTOR,-1,true);
QFontMetrics fontMetrics(font);
@@ -887,7 +992,7 @@ void BandNameLabel::updateLabel()
m_rect = QRectF(
m_band->pos().x()+10,
m_band->pos().y()-(fontMetrics.height()+10),
fontMetrics.width(m_band->bandTitle())+20,fontMetrics.height()+10
fontMetrics.width(bandName)+20,fontMetrics.height()+10
);
update();
}

View File

@@ -63,6 +63,7 @@ public:
qreal height(){return m_rect.height();}
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
private:
QRectF m_rect;
QColor m_color;
@@ -74,7 +75,7 @@ public:
explicit BandNameLabel(BandDesignIntf* band, QGraphicsItem* parent=0);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
QRectF boundingRect() const;
void updateLabel();
void updateLabel(const QString &bandName);
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
private:
QRectF m_rect;
@@ -82,6 +83,18 @@ private:
BandDesignIntf* m_band;
};
class InitializedValue{
public:
InitializedValue(): m_value(-1), m_isInitialized(false){}
InitializedValue(qreal value): m_value(value), m_isInitialized(true){}
qreal value() const { return m_value;}
void setValue( qreal value){ m_value = value; m_isInitialized = true;}
bool isValid() const{ return m_isInitialized;}
private:
qreal m_value;
bool m_isInitialized;
};
class BandDesignIntf : public ItemsContainerDesignInft
{
Q_OBJECT
@@ -121,6 +134,7 @@ public:
~BandDesignIntf();
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void translateBandsName();
virtual BandsType bandType() const;
virtual QString bandTitle() const;
virtual QIcon bandIcon() const;
@@ -131,13 +145,13 @@ public:
virtual QColor selectionColor() const;
int bandIndex() const;
void setBandIndex(int value);
void changeBandIndex(int value);
void changeBandIndex(int value, bool firstTime = false);
void setBandType(BandsType value){m_bandType=value;}
QString datasourceName();
void setDataSourceName(const QString& datasourceName);
void setKeepBottomSpaceOption(bool value){m_keepBottomSpace=value;}
void setKeepBottomSpaceOption(bool value);
bool keepBottomSpaceOption() const {return m_keepBottomSpace;}
void addChildBand(BandDesignIntf* band);
@@ -151,8 +165,10 @@ public:
bool isConnectedToBand(BandDesignIntf::BandsType bandType) const;
int minChildIndex(BandsType bandType);
int maxChildIndex(BandDesignIntf::BandsType bandType) const;
int maxChildIndex(QSet<BandsType> ignoredBands = QSet<BandDesignIntf::BandsType>()) const;
BandDesignIntf* parentBand() const {return m_parentBand;}
QList<BandDesignIntf*> childBands() const{return m_childBands;}
@@ -165,6 +181,7 @@ public:
virtual bool isHeader() const {return false;}
virtual bool isGroupHeader() const {return false;}
virtual bool isData() const {return false;}
virtual int bandNestingLevel(){return 0;}
bool isBand(){return true;}
void setTryToKeepTogether(bool value);
@@ -217,9 +234,9 @@ public:
void setRepeatOnEachRow(bool repeatOnEachRow);
QColor alternateBackgroundColor() const;
void setAlternateBackgroundColor(const QColor &alternateBackgroundColor);
qreal bottomSpace() const;
signals:
void bandRendered(BandDesignIntf* band);
void bandRendered(BandDesignIntf* band);
protected:
void trimToMaxHeight(int maxHeight);
void setBandTypeText(const QString& value);
@@ -240,8 +257,10 @@ protected:
void moveItemsDown(qreal startPos, qreal offset);
void preparePopUpMenu(QMenu &menu);
void processPopUpAction(QAction *action);
QString translateBandName(const BaseDesignIntf *item) const;
private slots:
void childBandDeleted(QObject* band);
void slotPropertyObjectNameChanged(const QString&,const QString&);
private:
QString m_bandTypeText;
BandsType m_bandType;
@@ -270,7 +289,8 @@ private:
bool m_printAlways;
bool m_repeatOnEachRow;
QMap<QString,BaseDesignIntf*> m_slicedItems;
QColor m_alternateBackgroundColor;
QColor m_alternateBackgroundColor;
InitializedValue m_bottomSpace;
};
class DataBandDesignIntf : public BandDesignIntf{

View File

@@ -628,10 +628,10 @@ QPointF BaseDesignIntf::modifyPosForAlignedItem(const QPointF& pos){
result.setX(leftBorder);
break;
case RightItemAlign:
result.setX(parent->width()-rightBorder);
result.setX(parent->width() - (rightBorder + width()));
break;
case CenterItemAlign:
result.setX((avaibleSpace-width())/2);
result.setX((avaibleSpace-width()) / 2 + leftBorder);
break;
case ParentWidthItemAlign:
result.setX(leftBorder);
@@ -1008,6 +1008,7 @@ QVariant BaseDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, co
}
if (change == QGraphicsItem::ItemSelectedChange) {
turnOnSelectionMarker(value.toBool());
emit itemSelectedHasBeenChanged(this, value.toBool());
}
if (change == QGraphicsItem::ItemParentHasChanged) {
parentChangedEvent(dynamic_cast<BaseDesignIntf*>(value.value<QGraphicsItem*>()));
@@ -1152,6 +1153,7 @@ void BaseDesignIntf::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
if (!(flags() & QGraphicsItem::ItemIsSelectable)) return;
PageDesignIntf* page = dynamic_cast<PageDesignIntf*>(scene());
if (!page->selectedItems().contains(this)){
page->clearSelection();

View File

@@ -341,7 +341,6 @@ protected:
virtual void preparePopUpMenu(QMenu& menu){Q_UNUSED(menu)}
virtual void processPopUpAction(QAction* action){Q_UNUSED(action)}
private:
void updateSelectionMarker();
int resizeDirectionFlags(QPointF position);
@@ -401,6 +400,7 @@ signals:
void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry);
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);

View File

@@ -57,21 +57,21 @@ IDataSource * ModelHolder::dataSource(IDataSource::DatasourceMode mode)
}
QueryHolder::QueryHolder(QString queryText, QString connectionName, DataSourceManager *dataManager)
: m_query(0), m_queryText(queryText), m_connectionName(connectionName),
: m_queryText(queryText), m_connectionName(connectionName),
m_mode(IDataSource::RENDER_MODE), m_dataManager(dataManager), m_prepared(true)
{
extractParams();
}
QueryHolder::~QueryHolder()
{
if (m_query) delete m_query;
}
QueryHolder::~QueryHolder(){}
bool QueryHolder::runQuery(IDataSource::DatasourceMode mode)
{
m_mode = mode;
QSqlDatabase db = QSqlDatabase::database(m_connectionName);
QSqlQuery query(db);
if (!db.isValid()) {
setLastError(QObject::tr("Invalid connection! %1").arg(m_connectionName));
return false;
@@ -82,16 +82,12 @@ bool QueryHolder::runQuery(IDataSource::DatasourceMode mode)
if (!m_prepared) return false;
}
if (!m_query){
m_query = new QSqlQuery(db);
m_query->prepare(m_preparedSQL);
}
fillParams(m_query);
m_query->exec();
query.prepare(m_preparedSQL);
fillParams(&query);
query.exec();
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery(*m_query);
model->setQuery(query);
while (model->canFetchMore())
model->fetchMore();
@@ -102,7 +98,7 @@ bool QueryHolder::runQuery(IDataSource::DatasourceMode mode)
setLastError(model->lastError().text());
delete model;
return false;
} else setLastError("");
} else { setLastError("");}
setDatasource(IDataSource::Ptr(new ModelToDataSource(model,true)));
return true;
@@ -118,11 +114,10 @@ void QueryHolder::setConnectionName(QString connectionName)
m_connectionName=connectionName;
}
void QueryHolder::invalidate(IDataSource::DatasourceMode mode){
void QueryHolder::invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed){
QSqlDatabase db = QSqlDatabase::database(m_connectionName);
if (!db.isValid()){
if (!db.isValid() || dbWillBeClosed){
setLastError(QObject::tr("Invalid connection! %1").arg(m_connectionName));
delete m_query;
m_dataSource.clear();
} else {
runQuery(mode);
@@ -197,10 +192,6 @@ void QueryHolder::setQueryText(QString queryText)
{
m_queryText=queryText;
m_prepared = false;
if (m_query) {
delete m_query;
m_query = 0;
}
}
IDataSource* QueryHolder::dataSource(IDataSource::DatasourceMode mode)
@@ -350,13 +341,13 @@ void ModelToDataSource::slotModelDestroed()
ConnectionDesc::ConnectionDesc(QSqlDatabase db, QObject *parent)
: QObject(parent), m_connectionName(db.connectionName()), m_connectionHost(db.hostName()), m_connectionDriver(db.driverName()),
m_databaseName(db.databaseName()), m_user(db.userName()), m_password(db.password()), m_autoconnect(false),
m_databaseName(db.databaseName()), m_user(db.userName()), m_password(db.password()), m_port(-1), m_autoconnect(false),
m_internal(false), m_keepDBCredentials(true)
{}
ConnectionDesc::ConnectionDesc(QObject *parent)
:QObject(parent),m_connectionName(""),m_connectionHost(""),m_connectionDriver(""),
m_databaseName(""), m_user(""), m_password(""), m_autoconnect(false),
:QObject(parent),m_connectionName(""),m_connectionHost(""), m_connectionDriver(""),
m_databaseName(""), m_user(""), m_password(""), m_port(-1), m_autoconnect(false),
m_internal(false), m_keepDBCredentials(true)
{}
@@ -391,6 +382,16 @@ QString ConnectionDesc::connectionNameForReport(const QString &connectionName)
return connectionName.compare(tr("defaultConnection")) == 0 ? QSqlDatabase::defaultConnection : connectionName;
}
int ConnectionDesc::port() const
{
return m_port;
}
void ConnectionDesc::setPort(int port)
{
m_port = port;
}
bool ConnectionDesc::keepDBCredentials() const
{
return m_keepDBCredentials;
@@ -421,7 +422,7 @@ void SubQueryHolder::setMasterDatasource(const QString &value)
void SubQueryHolder::extractParams()
{
if (!dataManager()->containsDatasource(m_masterDatasource)){
setLastError(QObject::tr("Master datasource \"%1\" not found!!!").arg(m_masterDatasource));
setLastError(QObject::tr("Master datasource \"%1\" not found!").arg(m_masterDatasource));
setPrepared(false);
} else {
m_preparedSQL = replaceFields(replaceVariables(queryText()));
@@ -552,9 +553,10 @@ IDataSource *ProxyHolder::dataSource(IDataSource::DatasourceMode mode)
return m_datasource.data();
}
void ProxyHolder::invalidate(IDataSource::DatasourceMode mode)
void ProxyHolder::invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed)
{
Q_UNUSED(mode)
Q_UNUSED(dbWillBeClosed);
if (m_model && m_model->isInvalid()){
m_invalid = true;
m_lastError = tr("Datasource has been invalidated");
@@ -638,11 +640,26 @@ QVariant MasterDetailProxyModel::masterData(QString fieldName) const
bool CallbackDatasource::next(){
if (!m_eof){
bool nextRowExists = checkNextRecord(m_currentRow);
if (m_currentRow>-1){
if (!m_getDataFromCache && nextRowExists){
for (int i = 0; i < m_columnCount; ++i ){
m_valuesCache[columnNameByIndex(i)] = data(columnNameByIndex(i));
}
}
}
if (!nextRowExists){
m_eof = true;
return false;
}
m_currentRow++;
bool result = false;
emit changePos(CallbackInfo::Next,result);
bool result = true;
if (!m_getDataFromCache)
emit changePos(CallbackInfo::Next,result);
m_getDataFromCache = false;
if (m_rowCount != -1){
if (m_rowCount>0 && m_currentRow<m_rowCount){
if (m_rowCount > 0 && m_currentRow < m_rowCount){
m_eof = false;
} else {
m_eof = true;
@@ -655,6 +672,21 @@ bool CallbackDatasource::next(){
} else return false;
}
bool CallbackDatasource::prior(){
if (m_currentRow !=-1) {
if (!m_getDataFromCache && !m_valuesCache.isEmpty()){
m_getDataFromCache = true;
m_currentRow--;
m_eof = false;
return true;
} else {
return false;
}
} else {
return false;
}
}
void CallbackDatasource::first(){
m_currentRow = 0;
m_eof=checkIfEmpty();
@@ -673,12 +705,19 @@ void CallbackDatasource::first(){
QVariant CallbackDatasource::data(const QString& columnName)
{
CallbackInfo info;
info.dataType = CallbackInfo::ColumnData;
info.columnName = columnName;
info.index = m_currentRow;
QVariant result;
emit getCallbackData(info,result);
if (!bof())
{
if (!m_getDataFromCache){
CallbackInfo info;
info.dataType = CallbackInfo::ColumnData;
info.columnName = columnName;
info.index = m_currentRow;
emit getCallbackData(info,result);
} else {
result = m_valuesCache[columnName];
}
}
return result;
}
@@ -728,7 +767,7 @@ QString CallbackDatasource::columnNameByIndex(int columnIndex)
int CallbackDatasource::columnIndexByName(QString name)
{
for (int i=0;i<m_headers.size();++i) {
if (m_headers[i].compare(name) == 0)
if (m_headers[i].compare(name, Qt::CaseInsensitive) == 0)
return i;
}
// if (m_headers.size()==0){
@@ -741,8 +780,9 @@ int CallbackDatasource::columnIndexByName(QString name)
}
bool CallbackDatasource::checkNextRecord(int recordNum){
if (m_rowCount>0 && m_currentRow<m_rowCount){
return true;
if (bof()) checkIfEmpty();
if (m_rowCount > 0) {
return (m_currentRow < (m_rowCount-1));
} else {
QVariant result = false;
CallbackInfo info;
@@ -762,7 +802,10 @@ bool CallbackDatasource::checkIfEmpty(){
CallbackInfo info;
info.dataType = CallbackInfo::RowCount;
emit getCallbackData(info, recordCount);
if (recordCount.toInt()>0) return false;
if (recordCount.toInt()>0) {
m_rowCount = recordCount.toInt();
return false;
}
info.dataType = CallbackInfo::IsEmpty;
emit getCallbackData(info,isEmpty);
return isEmpty.toBool();

View File

@@ -74,7 +74,7 @@ public:
virtual bool isOwned() const = 0;
virtual bool isEditable() const = 0;
virtual bool isRemovable() const = 0;
virtual void invalidate(IDataSource::DatasourceMode mode) = 0;
virtual void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false) = 0;
virtual void update() = 0;
virtual void clearErrors() = 0;
virtual ~IDataSourceHolder(){}
@@ -91,7 +91,7 @@ public:
QString lastError() const { return m_dataSource->lastError(); }
bool isEditable() const { return false; }
bool isRemovable() const { return false; }
void invalidate(IDataSource::DatasourceMode mode){Q_UNUSED(mode)}
void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false){Q_UNUSED(mode) Q_UNUSED(dbWillBeClosed)}
void update(){}
void clearErrors(){}
signals:
@@ -111,6 +111,7 @@ class ConnectionDesc : public QObject{
Q_PROPERTY(QString host READ host WRITE setHost)
Q_PROPERTY(bool autoconnect READ autoconnect WRITE setAutoconnect)
Q_PROPERTY(bool keepDBCredentials READ keepDBCredentials WRITE setKeepDBCredentials)
Q_PROPERTY(int port READ port WRITE setPort)
public:
typedef QSharedPointer<ConnectionDesc> Ptr;
ConnectionDesc(QSqlDatabase db, QObject* parent=0);
@@ -135,6 +136,8 @@ public:
void setInternal(bool value) {m_internal = value;}
bool keepDBCredentials() const;
void setKeepDBCredentials(bool keepDBCredentials);
int port() const;
void setPort(int port);
public:
static QString connectionNameForUser(const QString& connectionName);
static QString connectionNameForReport(const QString& connectionName);
@@ -147,6 +150,7 @@ private:
QString m_databaseName;
QString m_user;
QString m_password;
int m_port;
bool m_autoconnect;
bool m_internal;
bool m_keepDBCredentials;
@@ -199,8 +203,8 @@ public:
bool isRemovable() const { return true; }
bool isPrepared() const {return m_prepared;}
QString lastError() const { return m_lastError; }
void setLastError(QString value){m_lastError=value; if (m_query) {delete m_query; m_query=0;}}
void invalidate(IDataSource::DatasourceMode mode);
void setLastError(QString value){m_lastError=value;}
void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false);
void update();
void clearErrors(){setLastError("");}
DataSourceManager* dataManager() const {return m_dataManager;}
@@ -211,7 +215,6 @@ protected:
virtual void extractParams();
QString replaceVariables(QString query);
QMap<QString,QString> m_aliasesToParam;
QSqlQuery* m_query;
QString m_preparedSQL;
private:
QString m_queryText;
@@ -330,7 +333,7 @@ public:
bool isEditable() const { return true; }
bool isRemovable() const { return true; }
QString lastError() const { return m_lastError; }
void invalidate(IDataSource::DatasourceMode mode);
void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false);
void update(){}
void clearErrors(){m_lastError = "";}
DataSourceManager* dataManager() const {return m_dataManger;}
@@ -380,10 +383,11 @@ private:
class CallbackDatasource :public ICallbackDatasource, public IDataSource {
Q_OBJECT
public:
CallbackDatasource(): m_currentRow(-1), m_eof(false), m_columnCount(-1), m_rowCount(-1){}
CallbackDatasource(): m_currentRow(-1), m_eof(false), m_columnCount(-1),
m_rowCount(-1), m_getDataFromCache(false){}
bool next();
bool hasNext(){ if (!m_eof) return checkNextRecord(m_currentRow); else return false;}
bool prior(){ if (m_currentRow !=-1) {m_currentRow--; return true;} else return false;}
bool prior();
void first();
void last(){}
bool bof(){return m_currentRow == -1;}
@@ -404,6 +408,8 @@ private:
bool m_eof;
int m_columnCount;
int m_rowCount;
QHash<QString, QVariant> m_valuesCache;
bool m_getDataFromCache;
};
class CallbackDatasourceHolder :public QObject, public IDataSourceHolder{
@@ -417,7 +423,7 @@ public:
bool isOwned() const {return m_owned;}
bool isEditable() const {return false;}
bool isRemovable() const {return false;}
void invalidate(IDataSource::DatasourceMode mode){Q_UNUSED(mode)}
void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false){Q_UNUSED(mode) Q_UNUSED(dbWillBeClosed)}
~CallbackDatasourceHolder(){delete m_datasource;}
void update(){}
void clearErrors(){}

View File

@@ -226,6 +226,18 @@ DataSourceManager::DataSourceManager(QObject *parent) :
m_groupFunctionFactory.registerFunctionCreator(QLatin1String("MAX"),new ConstructorGroupFunctionCreator<MaxGroupFunction>);
setSystemVariable(QLatin1String("#PAGE"),1,FirstPass);
setSystemVariable(QLatin1String("#PAGE_COUNT"),0,SecondPass);
setSystemVariable(QLatin1String("#IS_LAST_PAGEFOOTER"),false,FirstPass);
setSystemVariable(QLatin1String("#IS_FIRST_PAGEFOOTER"),false,FirstPass);
connect(&m_reportVariables, SIGNAL(variableHasBeenAdded(QString)),
this, SLOT(slotVariableHasBeenAdded(QString)) );
connect(&m_reportVariables, SIGNAL(variableHasBeenChanged(QString)),
this, SLOT(slotVariableHasBeenChanged(QString)));
connect(&m_userVariables, SIGNAL(variableHasBeenAdded(QString)),
this, SLOT(slotVariableHasBeenAdded(QString)) );
connect(&m_userVariables, SIGNAL(variableHasBeenChanged(QString)),
this, SLOT(slotVariableHasBeenChanged(QString)));
m_datasourcesModel.setDataSourceManager(this);
}
@@ -258,7 +270,11 @@ void DataSourceManager::clearGroupFuntionsExpressions()
QString DataSourceManager::getExpression(QString index)
{
return m_groupFunctionsExpressions.at(index.toInt());
bool ok = false;
int i = index.toInt(&ok);
if (ok && m_groupFunctionsExpressions.size()>i)
return m_groupFunctionsExpressions.at(index.toInt());
else return "";
}
bool DataSourceManager::designTime() const
@@ -580,7 +596,7 @@ QList<ConnectionDesc *>& DataSourceManager::conections()
bool DataSourceManager::dataSourceIsValid(const QString &name)
{
if (m_datasources.value(name.toLower())) return !m_datasources.value(name.toLower())->isInvalid();
else throw ReportError(tr("Datasource \"%1\" not found !").arg(name));
else throw ReportError(tr("Datasource \"%1\" not found!").arg(name));
}
bool DataSourceManager::isQuery(const QString &dataSourceName)
@@ -634,15 +650,18 @@ void DataSourceManager::removeConnection(const QString &connectionName)
{
QList<ConnectionDesc*>::iterator cit = m_connections.begin();
while( cit != m_connections.end() ){
if ( ((*cit)->name().compare(connectionName) == 0) && (*cit)->isInternal() ){
if ( ((*cit)->name().compare(connectionName) == 0) ){
if ((*cit)->isInternal())
{
QSqlDatabase db = QSqlDatabase::database(connectionName);
db.close();
}
QSqlDatabase::removeDatabase(connectionName);
delete (*cit);
cit = m_connections.erase(cit);
} else {
cit++;
}
delete (*cit);
cit = m_connections.erase(cit);
}
emit datasourcesChanged();
}
@@ -660,7 +679,7 @@ void DataSourceManager::addConnectionDesc(ConnectionDesc * connection)
}
}
} else {
throw ReportError(tr("connection with name \"%1\" already exists !").arg(connection->name()));
throw ReportError(tr("Connection with name \"%1\" already exists!").arg(connection->name()));
}
}
@@ -685,7 +704,7 @@ void DataSourceManager::putHolder(const QString& name, IDataSourceHolder *dataSo
name.toLower(),
dataSource
);
} else throw ReportError(tr("datasource with name \"%1\" already exists !").arg(name));
} else throw ReportError(tr("Datasource with name \"%1\" already exists!").arg(name));
}
void DataSourceManager::putQueryDesc(QueryDesc* queryDesc)
@@ -694,7 +713,7 @@ void DataSourceManager::putQueryDesc(QueryDesc* queryDesc)
m_queries.append(queryDesc);
connect(queryDesc, SIGNAL(queryTextChanged(QString,QString)),
this, SLOT(slotQueryTextChanged(QString,QString)));
} else throw ReportError(tr("datasource with name \"%1\" already exists !").arg(queryDesc->queryName()));
} else throw ReportError(tr("Datasource with name \"%1\" already exists!").arg(queryDesc->queryName()));
}
void DataSourceManager::putSubQueryDesc(SubQueryDesc *subQueryDesc)
@@ -703,14 +722,14 @@ void DataSourceManager::putSubQueryDesc(SubQueryDesc *subQueryDesc)
m_subqueries.append(subQueryDesc);
connect(subQueryDesc, SIGNAL(queryTextChanged(QString,QString)),
this, SLOT(slotQueryTextChanged(QString,QString)));
} else throw ReportError(tr("datasource with name \"%1\" already exists !").arg(subQueryDesc->queryName()));
} else throw ReportError(tr("Datasource with name \"%1\" already exists!").arg(subQueryDesc->queryName()));
}
void DataSourceManager::putProxyDesc(ProxyDesc *proxyDesc)
{
if (!containsDatasource(proxyDesc->name())){
m_proxies.append(proxyDesc);
} else throw ReportError(tr("datasource with name \"%1\" already exists !").arg(proxyDesc->name()));
} else throw ReportError(tr("Datasource with name \"%1\" already exists!").arg(proxyDesc->name()));
}
bool DataSourceManager::initAndOpenDB(QSqlDatabase& db, ConnectionDesc& connectionDesc){
@@ -721,6 +740,8 @@ bool DataSourceManager::initAndOpenDB(QSqlDatabase& db, ConnectionDesc& connecti
db.setHostName(replaceVariables(connectionDesc.host()));
db.setUserName(replaceVariables(connectionDesc.userName()));
db.setPassword(replaceVariables(connectionDesc.password()));
if (connectionDesc.port()!=-1)
db.setPort(connectionDesc.port());
if (!connectionDesc.keepDBCredentials() && m_dbCredentialsProvider){
if (!m_dbCredentialsProvider->getUserName(connectionDesc.name()).isEmpty())
@@ -942,7 +963,7 @@ IDataSource *DataSourceManager::dataSource(const QString &name)
return holder->dataSource(designTime()?IDataSource::DESIGN_MODE:IDataSource::RENDER_MODE);
}
} else {
setLastError(tr("Datasource \"%1\" not found !").arg(name));
setLastError(tr("Datasource \"%1\" not found!").arg(name));
return 0;
}
}
@@ -1229,6 +1250,32 @@ void DataSourceManager::slotQueryTextChanged(const QString &queryName, const QSt
}
}
void DataSourceManager::invalidateQueriesContainsVariable(const QString& variableName)
{
if (!variableIsSystem(variableName)){
foreach (const QString& datasourceName, dataSourceNames()){
QueryHolder* holder = dynamic_cast<QueryHolder*>(m_datasources.value(datasourceName));
if (holder){
QRegExp rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName));
if (holder->queryText().contains(rx))
holder->invalidate(designTime()?IDataSource::DESIGN_MODE:IDataSource::RENDER_MODE);
}
}
}
}
void DataSourceManager::slotVariableHasBeenAdded(const QString& variableName)
{
//qDebug()<< "variable has been added"<< variableName;
invalidateQueriesContainsVariable(variableName);
}
void DataSourceManager::slotVariableHasBeenChanged(const QString& variableName)
{
//qDebug()<< "variable has been changed"<< variableName;
invalidateQueriesContainsVariable(variableName);
}
void DataSourceManager::clear(ClearMethod method)
{
DataSourcesMap::iterator dit;

View File

@@ -224,9 +224,12 @@ protected:
void setLastError(const QString& value);
void invalidateLinkedDatasources(QString datasourceName);
bool checkConnection(QSqlDatabase db);
void invalidateQueriesContainsVariable(const QString& variableName);
private slots:
void slotConnectionRenamed(const QString& oldName,const QString& newName);
void slotQueryTextChanged(const QString& queryName, const QString& queryText);
void slotVariableHasBeenAdded(const QString& variableName);
void slotVariableHasBeenChanged(const QString& variableName);
private:
explicit DataSourceManager(QObject *parent = 0);
bool initAndOpenDB(QSqlDatabase &db, ConnectionDesc &connectionDesc);

View File

@@ -0,0 +1,430 @@
#include "bands/lrdataband.h"
#include "bands/lrgroupbands.h"
#include "bands/lrpagefooter.h"
#include "bands/lrpageheader.h"
#include "bands/lrreportheader.h"
#include "bands/lrreportfooter.h"
#include "bands/lrsubdetailband.h"
#include "bands/lrtearoffband.h"
#include "items/lrtextitem.h"
#ifdef HAVE_ZINT
#include "items/lrbarcodeitem.h"
#endif
#include "items/lrhorizontallayout.h"
#include "items/lrimageitem.h"
#include "items/lrshapeitem.h"
#include "lrdesignelementsfactory.h"
#include "objectinspector/lrobjectpropitem.h"
#include "objectinspector/propertyItems/lrboolpropitem.h"
#include "objectinspector/propertyItems/lrcolorpropitem.h"
#include "objectinspector/propertyItems/lrcontentpropitem.h"
#include "objectinspector/propertyItems/lrdatasourcepropitem.h"
#include "objectinspector/propertyItems/lrenumpropitem.h"
#include "objectinspector/propertyItems/lrflagspropitem.h"
#include "objectinspector/propertyItems/lrfontpropitem.h"
#include "objectinspector/propertyItems/lrgroupfieldpropitem.h"
#include "objectinspector/propertyItems/lrimagepropitem.h"
#include "objectinspector/propertyItems/lrintpropitem.h"
#include "objectinspector/propertyItems/lrqrealpropitem.h"
#include "objectinspector/propertyItems/lrrectproptem.h"
#include "objectinspector/propertyItems/lrstringpropitem.h"
#include "items/lralignpropitem.h"
#include "items/lrsubitemparentpropitem.h"
#include "serializators/lrxmlbasetypesserializators.h"
#include "serializators/lrxmlqrectserializator.h"
#include "serializators/lrxmlserializatorsfactory.h"
void initResources(){
Q_INIT_RESOURCE(report);
Q_INIT_RESOURCE(lobjectinspector);
Q_INIT_RESOURCE(lrdatabrowser);
Q_INIT_RESOURCE(items);
Q_INIT_RESOURCE(lrscriptbrowser);
}
namespace LimeReport{
BaseDesignIntf * createDataBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::DataBand(owner,parent);
}
BaseDesignIntf * createHeaderDataBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::DataHeaderBand(owner,parent);
}
BaseDesignIntf * createFooterDataBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::DataFooterBand(owner,parent);
}
BaseDesignIntf* createGroupHeaderBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::GroupBandHeader(owner,parent);
}
BaseDesignIntf * createGroupFooterBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::GroupBandFooter(owner,parent);
}
BaseDesignIntf * createPageHeaderBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::PageHeader(owner,parent);
}
BaseDesignIntf * createPageFooterBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::PageFooter(owner,parent);
}
BaseDesignIntf * createSubDetailBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::SubDetailBand(owner,parent);
}
BaseDesignIntf * createSubDetailHeaderBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::SubDetailHeaderBand(owner,parent);
}
BaseDesignIntf * createSubDetailFooterBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::SubDetailFooterBand(owner,parent);
}
BaseDesignIntf * createTearOffBand(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::TearOffBand(owner,parent);
}
BaseDesignIntf * createTextItem(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new LimeReport::TextItem(owner,parent);
}
#ifdef HAVE_ZINT
BaseDesignIntf * createBarcodeItem(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new BarcodeItem(owner,parent);
}
#endif
BaseDesignIntf* createHLayout(QObject *owner, LimeReport::BaseDesignIntf *parent)
{
return new HorizontalLayout(owner, parent);
}
BaseDesignIntf * createImageItem(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new ImageItem(owner,parent);
}
BaseDesignIntf * createShapeItem(QObject* owner, LimeReport::BaseDesignIntf* parent){
return new ShapeItem(owner,parent);
}
void initReportItems(){
initResources();
DesignElementsFactory::instance().registerCreator(
"TextItem",
LimeReport::ItemAttribs(QObject::tr("Text Item"),"TextItem"),
createTextItem
);
#ifdef HAVE_ZINT
DesignElementsFactory::instance().registerCreator(
"BarcodeItem",
LimeReport::ItemAttribs(QObject::tr("Barcode Item"),"Item"),
createBarcodeItem
);
#endif
DesignElementsFactory::instance().registerCreator(
"HLayout",
LimeReport::ItemAttribs(QObject::tr("HLayout"), LimeReport::Const::bandTAG),
createHLayout
);
DesignElementsFactory::instance().registerCreator(
"ImageItem", LimeReport::ItemAttribs(QObject::tr("Image Item"),"Item"), createImageItem
);
DesignElementsFactory::instance().registerCreator(
"ShapeItem", LimeReport::ItemAttribs(QObject::tr("Shape Item"),"Item"), createShapeItem
);
DesignElementsFactory::instance().registerCreator(
"Data",
LimeReport::ItemAttribs(QObject::tr("Data"),LimeReport::Const::bandTAG),
createDataBand
);
DesignElementsFactory::instance().registerCreator(
"DataHeader",
LimeReport::ItemAttribs(QObject::tr("DataHeader"),LimeReport::Const::bandTAG),
createHeaderDataBand
);
DesignElementsFactory::instance().registerCreator(
"DataFooter",
LimeReport::ItemAttribs(QObject::tr("DataFooter"),LimeReport::Const::bandTAG),
createFooterDataBand
);
DesignElementsFactory::instance().registerCreator(
"GroupHeader",
LimeReport::ItemAttribs(QObject::tr("GroupHeader"),LimeReport::Const::bandTAG),
createGroupHeaderBand
);
DesignElementsFactory::instance().registerCreator(
"GroupFooter",
LimeReport::ItemAttribs(QObject::tr("GroupFooter"),LimeReport::Const::bandTAG),
createGroupFooterBand
);
DesignElementsFactory::instance().registerCreator(
"PageFooter",
LimeReport::ItemAttribs(QObject::tr("Page Footer"),LimeReport::Const::bandTAG),
createPageFooterBand
);
DesignElementsFactory::instance().registerCreator(
"PageHeader",
LimeReport::ItemAttribs(QObject::tr("Page Header"),LimeReport::Const::bandTAG),
createPageHeaderBand
);
DesignElementsFactory::instance().registerCreator(
"SubDetail",
LimeReport::ItemAttribs(QObject::tr("SubDetail"),LimeReport::Const::bandTAG),
createSubDetailBand
);
DesignElementsFactory::instance().registerCreator(
"SubDetailHeader",
LimeReport::ItemAttribs(QObject::tr("SubDetailHeader"),LimeReport::Const::bandTAG),
createSubDetailHeaderBand
);
DesignElementsFactory::instance().registerCreator(
"SubDetailFooter",
LimeReport::ItemAttribs(QObject::tr("SubDetailFooter"),LimeReport::Const::bandTAG),
createSubDetailFooterBand
);
DesignElementsFactory::instance().registerCreator(
"TearOffBand",
LimeReport::ItemAttribs(QObject::tr("Tear-off Band"),LimeReport::Const::bandTAG),
createTearOffBand
);
}
ObjectPropItem * createBoolPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::BoolPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createColorPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new ColorPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createContentPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new ContentPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createDatasourcePropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::DatasourcePropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem* createFieldPropItem(QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly){
return new LimeReport::FieldPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createEnumPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::EnumPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createFlagsPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::FlagsPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createFontPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::FontPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem* createGroupFieldPropItem(QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly){
return new LimeReport::GroupFieldPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createImagePropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::ImagePropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createIntPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::IntPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createQRealPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::QRealPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createReqtItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly
){
return new LimeReport::RectPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createReqtMMItem(
QObject*object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly
){
return new LimeReport::RectMMPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createStringPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::StringPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createAlignItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly
){
return new LimeReport::AlignmentPropItem(object, objects, name, displayName, data, parent, readonly);
}
ObjectPropItem * createLocationPropItem(
QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly)
{
return new LimeReport::ItemLocationPropItem(object, objects, name, displayName, data, parent, readonly);
}
void initObjectInspectorProperties()
{
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("bool",""),QObject::tr("bool"),createBoolPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("QColor",""),QObject::tr("QColor"),createColorPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("content","LimeReport::TextItem"),QObject::tr("content"),createContentPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("datasource","LimeReport::DataBandDesignIntf"),QObject::tr("datasource"),createDatasourcePropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("datasource","LimeReport::ImageItem"),QObject::tr("datasource"),createDatasourcePropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("field","LimeReport::ImageItem"),QObject::tr("field"),createFieldPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("enum",""),QObject::tr("enum"),createEnumPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("flags",""),QObject::tr("flags"),createFlagsPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("QFont",""),QObject::tr("QFont"),createFontPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("groupFieldName","LimeReport::GroupBandHeader"),QObject::tr("field"),createGroupFieldPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("QImage",""),QObject::tr("QImage"),createImagePropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("int",""),QObject::tr("int"),createIntPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("qreal",""),QObject::tr("qreal"),createQRealPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("double",""),QObject::tr("qreal"),createQRealPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("QRect",""),QObject::tr("QRect"),createReqtItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("QRectF",""),QObject::tr("QRectF"),createReqtItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("geometry","LimeReport::BaseDesignIntf"),QObject::tr("geometry"),createReqtMMItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("QString",""),QObject::tr("QString"),createStringPropItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("alignment","LimeReport::TextItem"),QObject::tr("alignment"),createAlignItem
);
ObjectPropFactory::instance().registerCreator(
LimeReport::APropIdent("itemLocation","LimeReport::ItemDesignIntf"),QObject::tr("itemLocation"),createLocationPropItem
);
}
SerializatorIntf * createIntSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlIntSerializator(doc,node);
}
SerializatorIntf * createQRealSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlQRealSerializator(doc,node);
}
SerializatorIntf * createQStringSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlQStringSerializator(doc,node);
}
SerializatorIntf * createEnumAndFlagsSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlEnumAndFlagsSerializator(doc,node);
}
SerializatorIntf * createBoolSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlBoolSerializator(doc,node);
}
SerializatorIntf * createFontSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlFontSerializator(doc,node);
}
SerializatorIntf * createQSizeFSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlQSizeFSerializator(doc,node);
}
SerializatorIntf * createQImageSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlQImageSerializator(doc,node);
}
SerializatorIntf * createQColorSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlColorSerializator(doc,node);
}
SerializatorIntf* createQByteArraySerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlQByteArraySerializator(doc,node);
}
SerializatorIntf* createQVariantSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XmlQVariantSerializator(doc,node);
}
SerializatorIntf * createQRectSerializator(QDomDocument *doc, QDomElement *node){
return new LimeReport::XMLQRectSerializator(doc,node);
}
void initSerializators()
{
XMLAbstractSerializatorFactory::instance().registerCreator("QString", createQStringSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("int", createIntSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("enumAndFlags",createEnumAndFlagsSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("bool", createBoolSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("QFont", createFontSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("QSizeF", createQSizeFSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("QImage", createQImageSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("qreal", createQRealSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("double", createQRealSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("QColor", createQColorSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("QByteArray", createQByteArraySerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("QVariant", createQVariantSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("QRect", createQRectSerializator);
XMLAbstractSerializatorFactory::instance().registerCreator("QRectF", createQRectSerializator);
}
} //namespace LimeReport

View File

@@ -0,0 +1,6 @@
void initResources();
namespace LimeReport{
void initReportItems();
void initObjectInspectorProperties();
void initSerializators();
} // namespace LimeReport

View File

@@ -27,8 +27,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
****************************************************************************/
#ifndef GLOBAL_H
#define GLOBAL_H
#ifndef LRGLOBAL_H
#define LRGLOBAL_H
#include "qglobal.h"
#include <stdexcept>
#include <QString>
@@ -76,6 +76,7 @@ namespace Const{
const qreal SELECTION_OPACITY = 0.3;
const QString FIELD_RX = "\\$D\\s*\\{\\s*([^{}]*)\\s*\\}";
const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}";
const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}";
const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}";
//const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(((?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"))(\\w+\\.?\\w+)((?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,\\s*\\\"(\\w+)\\\"\\s*\\)";
@@ -84,7 +85,8 @@ namespace Const{
//const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:((?:(?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"?\\$S\\s*\\{\\s*)|(?:\\\"))((?:\\w+\\.?\\w+)|(?:\\w+))(?:(?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,)|(?:))\\s*\\\"(\\w+)\\\"\\s*\\)";
//const QString GROUP_FUNCTION_PARAM_RX = "\\((?:(.+),(.+))|(?:\\\"(\\w+)\\\")\\)";
const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:)))|(?:(?:(?:\\\")|(?:))(\\s*\\$\\w\\s*\\{.+\\}\\s*)(?:(?:\\\")|(?:))\\s*,\\s*(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:))))\\)";
//const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:)))|(?:(?:(?:\\\")|(?:))(\\s*\\$\\w\\s*\\{.+\\}\\s*)(?:(?:\\\")|(?:))\\s*,\\s*(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:))))\\)";
const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))\\)";
const int DATASOURCE_INDEX = 3;//4;
const int VALUE_INDEX = 2; //2;
const int EXPRESSION_ARGUMENT_INDEX = 1;//3;

View File

@@ -1,5 +1,5 @@
#ifndef GRAPHICSVIEWZOOM_H
#define GRAPHICSVIEWZOOM_H
#ifndef LRGRAPHICSVIEWZOOM_H
#define LRGRAPHICSVIEWZOOM_H
#include <QObject>
#include <QGraphicsView>

View File

@@ -59,6 +59,7 @@ void ItemDesignIntf::setItemLocation(LocationType location)
setParentItem(parentBand);
setParent(dynamic_cast<BandDesignIntf*>(parentBand));
setPos(parentPos);
emit itemLocationChanged(this, dynamic_cast<BandDesignIntf*>(parentBand));
} else {
m_itemLocation=Page;
}
@@ -69,6 +70,7 @@ void ItemDesignIntf::setItemLocation(LocationType location)
setParentItem(page);
setParent(page);
setPos(parentPos);
emit itemLocationChanged(this, page);
}
}
notify("locationType",oldValue,location);
@@ -95,8 +97,8 @@ BaseDesignIntf *ItemDesignIntf::cloneEmpty(int height, QObject *owner, QGraphics
QGraphicsItem * ItemDesignIntf::bandByPos()
{
foreach(QGraphicsItem *item,collidingItems()){
if (dynamic_cast<BandDesignIntf*>(item)){
foreach(QGraphicsItem *item, scene()->items()){
if (dynamic_cast<BandDesignIntf*>(item) && item->collidesWithItem(this)){
return item;
}
}

View File

@@ -50,6 +50,8 @@ public:
void setStretchToMaxHeight(bool value);
bool stretchToMaxHeight(){return m_stretchToMaxHeight;}
BaseDesignIntf* cloneEmpty(int height, QObject *owner, QGraphicsItem *parent);
signals:
void itemLocationChanged(BaseDesignIntf* item, BaseDesignIntf* parent);
protected:
QGraphicsItem* bandByPos();
virtual void initFlags();

View File

@@ -91,7 +91,7 @@ void ItemsContainerDesignInft::arrangeSubItems(RenderPass pass, DataSourceManage
}
}
qreal ItemsContainerDesignInft::findMaxBottom()
qreal ItemsContainerDesignInft::findMaxBottom() const
{
qreal maxBottom=0;
foreach(QGraphicsItem* item,childItems()){
@@ -103,7 +103,7 @@ qreal ItemsContainerDesignInft::findMaxBottom()
return maxBottom;
}
qreal ItemsContainerDesignInft::findMaxHeight()
qreal ItemsContainerDesignInft::findMaxHeight() const
{
qreal maxHeight=0;
foreach(QGraphicsItem* item,childItems()){

View File

@@ -1,5 +1,5 @@
#ifndef ITEMSCONTAINERDESIGNITF_H
#define ITEMSCONTAINERDESIGNITF_H
#ifndef LRITEMSCONTAINERDESIGNITF_H
#define LRITEMSCONTAINERDESIGNITF_H
#include "lrbasedesignintf.h"
@@ -44,8 +44,8 @@ public:
protected:
void snapshotItemsLayout();
void arrangeSubItems(RenderPass pass, DataSourceManager *dataManager, ArrangeType type = AsNeeded);
qreal findMaxBottom();
qreal findMaxHeight();
qreal findMaxBottom() const;
qreal findMaxHeight() const;
private:
QVector<PItemSortContainer> m_containerItems;

View File

@@ -125,7 +125,7 @@ void PageDesignIntf::updatePageRect()
m_pageItem->setRightMargin(5);
m_pageItem->setObjectName("ReportPage1");
connect(m_pageItem.data(), SIGNAL(itemSelected(LimeReport::BaseDesignIntf *)), this, SIGNAL(itemSelected(LimeReport::BaseDesignIntf *)));
connect(m_pageItem.data(), SIGNAL(geometryChanged(QObject *, QRectF, QRectF)), this, SLOT(slotPageGeomertyChanged(QObject *, QRectF, QRectF)));
connect(m_pageItem.data(), SIGNAL(geometryChanged(QObject *, QRectF, QRectF)), this, SLOT(slotPageGeometryChanged(QObject *, QRectF, QRectF)));
connect(m_pageItem.data(), SIGNAL(objectLoaded(QObject *)), this, SLOT(slotPageItemLoaded(QObject *)));
}
this->setSceneRect(-Const::SCENE_MARGIN, -Const::SCENE_MARGIN,
@@ -777,7 +777,7 @@ QStringList PageDesignIntf::possibleParentItems()
return itemsList;
}
void PageDesignIntf::slotPageGeomertyChanged(QObject *, QRectF /*newGeometry*/, QRectF)
void PageDesignIntf::slotPageGeometryChanged(QObject *, QRectF /*newGeometry*/, QRectF)
{
if (!m_isLoading){
pageItem()->relocateBands();
@@ -1071,6 +1071,14 @@ void PageDesignIntf::setReportSettings(ReportSettings *reportSettings)
m_pageItem->setReportSettings(m_reportSettings);
}
void PageDesignIntf::setPropertyToSelectedItems(const char* name, const QVariant& value)
{
foreach(QGraphicsItem* gi, selectedItems()){
BaseDesignIntf* item = dynamic_cast<BaseDesignIntf*>(gi);
if(item && item->metaObject()->indexOfProperty(name) != -1 ) item->setProperty(name,value);
}
}
bool PageDesignIntf::magneticMovement() const
{
return m_magneticMovement;

View File

@@ -182,6 +182,8 @@ namespace LimeReport {
ReportSettings *getReportSettings() const;
void setReportSettings(ReportSettings *reportSettings);
void setPropertyToSelectedItems(const char *name, const QVariant &value);
protected:
virtual void keyPressEvent(QKeyEvent *event);
@@ -252,7 +254,7 @@ namespace LimeReport {
void setTextAlign(const Qt::Alignment& alignment);
void setBorders(const BaseDesignIntf::BorderLines& border);
private slots:
void slotPageGeomertyChanged(QObject*, QRectF, QRectF );
void slotPageGeometryChanged(QObject*, QRectF, QRectF );
void slotItemPropertyChanged(QString propertyName, const QVariant &oldValue, const QVariant &newValue);
void slotItemPropertyObjectNameChanged(const QString& oldName, const QString& newName);
void bandDeleted(QObject* band);

View File

@@ -202,10 +202,16 @@ int PageItemDesignIntf::calcBandIndex(BandDesignIntf::BandsType bandType, BandDe
int bandIndex=-1;
qSort(m_bands.begin(),m_bands.end(),bandSortBandLessThenByIndex);
foreach(BandDesignIntf* band,m_bands){
if ((band->bandType()==BandDesignIntf::GroupHeader)&&(band->bandType()>bandType)) break;
if ((band->bandType()<=bandType)){
if (bandIndex<=band->bandIndex()) bandIndex=band->maxChildIndex()+1;
}
if ((band->bandType() == BandDesignIntf::GroupHeader) && ( band->bandType() > bandType)) break;
if ((band->bandType() <= bandType)){
if (bandIndex <= band->bandIndex()) {
if (bandType != BandDesignIntf::Data){
bandIndex=band->maxChildIndex(bandType)+1;
} else {
bandIndex=band->maxChildIndex()+1;
}
}
} else { increaseBandIndex = true; break;}
}
if (bandIndex==-1) {
@@ -222,7 +228,7 @@ int PageItemDesignIntf::calcBandIndex(BandDesignIntf::BandsType bandType, BandDe
switch (bandType) {
case BandDesignIntf::SubDetailBand:
bandIndex = parentBand->maxChildIndex() + 1;
bandIndex = parentBand->maxChildIndex(bandType) + 1;
increaseBandIndex = true;
break;
case BandDesignIntf::SubDetailHeader:
@@ -364,7 +370,8 @@ void PageItemDesignIntf::relocateBands()
if (!(itemMode() & DesignMode)){
while ( (bandIndex < m_bands.count()) &&
((m_bands[bandIndex]->bandType() == BandDesignIntf::TearOffBand) ||
(m_bands[bandIndex]->bandType() == BandDesignIntf::PageFooter))
(m_bands[bandIndex]->bandType() == BandDesignIntf::PageFooter) ||
m_bands[bandIndex]->bandType() == BandDesignIntf::ReportFooter )
){
bandIndex++;
}
@@ -588,8 +595,9 @@ void PageItemDesignIntf::bandGeometryChanged(QObject* object, QRectF newGeometry
}
}
if (curIndex != band->bandIndex()){
bandToSwap->changeBandIndex(band->bandIndex());
band->changeBandIndex(curIndex);
int swapIndex = bandToSwap->maxChildIndex();
bandToSwap->changeBandIndex(band->bandIndex(),true);
band->changeBandIndex(swapIndex,true);
}
relocateBands();

View File

@@ -51,8 +51,16 @@ namespace LimeReport {
ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) :
QWidget(parent), m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false)
{
#ifdef HAVE_QT5
m_tabWidget = new QTabWidget(this);
#endif
#ifdef HAVE_QT4
m_tabWidget = new LimeReportTabWidget(this);
#endif
m_tabWidget->setTabPosition(QTabWidget::South);
m_tabWidget->setMovable(true);
connect(m_tabWidget->tabBar(), SIGNAL(tabMoved(int,int)), this, SLOT(slotTabMoved(int,int)));
QVBoxLayout* mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(m_tabWidget);
setLayout(mainLayout);
@@ -152,7 +160,9 @@ void ReportDesignWidget::createTabs(){
view->centerOn(0,0);
view->scale(0.5,0.5);
connectPage(m_report->pageAt(i));
m_tabWidget->addTab(view,QIcon(),tr("Page")+QString::number(i+1));
m_tabWidget->addTab(view,QIcon(),m_report->pageAt(i)->pageItem()->objectName());
connect(m_report->pageAt(i)->pageItem(), SIGNAL(propertyObjectNameChanged(QString,QString)),
this, SLOT(slotPagePropertyObjectNameChanged(QString,QString)));
}
m_scriptEditor = new QTextEdit(this);
m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script"));
@@ -257,7 +267,7 @@ void ReportDesignWidget::slotItemSelected(BaseDesignIntf *item){
}
void ReportDesignWidget::saveToFile(const QString &fileName){
m_report->scriptContext()->setInitScript(m_scriptEditor->toPlainText());
prepareReport();
if (m_report->saveToFile(fileName)) {
m_report->emitSaveFinished();
}
@@ -265,7 +275,7 @@ void ReportDesignWidget::saveToFile(const QString &fileName){
bool ReportDesignWidget::save()
{
m_report->scriptContext()->setInitScript(m_scriptEditor->toPlainText());
prepareReport();
if (!m_report->reportFileName().isEmpty()){
if (m_report->saveToFile()){
m_report->emitSaveFinished();
@@ -454,15 +464,21 @@ void ReportDesignWidget::setBorders(const BaseDesignIntf::BorderLines& borders)
activePage()->setBorders(borders);
}
void ReportDesignWidget::prepareReport()
{
m_report->scriptContext()->setInitScript(m_scriptEditor->toPlainText());
report()->clearSelection();
}
void ReportDesignWidget::previewReport()
{
report()->scriptContext()->setInitScript(m_scriptEditor->toPlainText());
prepareReport();
report()->previewReport();
}
void ReportDesignWidget::printReport()
{
report()->scriptContext()->setInitScript(m_scriptEditor->toPlainText());
prepareReport();
setCursor(Qt::WaitCursor);
report()->printReport();
setCursor(Qt::ArrowCursor);
@@ -476,8 +492,10 @@ void ReportDesignWidget::addPage()
PageDesignIntf* page = m_report->appendPage("page"+QString::number(m_report->pageCount()+1));
view->setScene(page);
int index = m_report->pageCount()-1;
m_tabWidget->insertTab(index,view,QIcon(),tr("Page")+QString::number(m_report->pageCount()));
m_tabWidget->insertTab(index,view,QIcon(),page->pageItem()->objectName());
m_tabWidget->setCurrentIndex(index);
connect(page->pageItem(), SIGNAL(propertyObjectNameChanged(QString,QString)),
this, SLOT(slotPagePropertyObjectNameChanged(QString,QString)));
connectPage(page);
view->scale(0.5,0.5);
view->centerOn(0,0);
@@ -608,6 +626,41 @@ void ReportDesignWidget::slotCurrentTabChanged(int index)
emit activePageChanged();
}
void ReportDesignWidget::slotPagePropertyObjectNameChanged(const QString &oldValue, const QString &newValue)
{
for (int i = 0; i < m_tabWidget->count(); ++i ){
if (m_tabWidget->tabText(i).compare(oldValue) == 0){
QGraphicsView* view = dynamic_cast<QGraphicsView*>(m_tabWidget->widget(i));
if (view){
PageDesignIntf* page = dynamic_cast<PageDesignIntf*>(view->scene());
if (page->pageItem() == sender())
m_tabWidget->setTabText(i, newValue);
}
}
}
}
void ReportDesignWidget::slotTabMoved(int from, int to)
{
Q_UNUSED(from)
Q_UNUSED(to)
QList<PageDesignIntf*> pages;
for ( int i = 0; i < m_tabWidget->tabBar()->count(); ++i){
QGraphicsView* view = dynamic_cast<QGraphicsView*>(m_tabWidget->widget(i));
if (view){
PageDesignIntf* page = dynamic_cast<PageDesignIntf*>(view->scene());
if (page){
pages.append(page);
}
}
}
m_report->reorderPages(pages);
}
bool ReportDesignWidget::eventFilter(QObject *target, QEvent *event)
{
if (event->type() == QEvent::Wheel){

View File

@@ -42,6 +42,16 @@
#include "lrreportengine_p.h"
#include "lrgraphicsviewzoom.h"
#ifdef HAVE_QT4
QT_BEGIN_NAMESPACE
class LimeReportTabWidget: public QTabWidget{
Q_OBJECT
public:
explicit LimeReportTabWidget(QWidget *parent = 0):QTabWidget(parent){}
QTabBar* tabBar() const{ return QTabWidget::tabBar();}
};
QT_END_NAMESPACE
#endif
namespace LimeReport {
@@ -128,6 +138,8 @@ private slots:
void slotDatasourceCollectionLoaded(const QString&);
void slotSceneRectChanged(QRectF);
void slotCurrentTabChanged(int index);
void slotPagePropertyObjectNameChanged(const QString& oldValue, const QString& newValue);
void slotTabMoved(int from, int to);
signals:
void insertModeStarted();
void itemInserted(LimeReport::PageDesignIntf*,QPointF,const QString&);
@@ -156,7 +168,12 @@ private:
QGraphicsView *m_view;
QTextEdit* m_scriptEditor;
QMainWindow *m_mainWindow;
#ifdef HAVE_QT5
QTabWidget* m_tabWidget;
#endif
#ifdef HAVE_QT4
LimeReportTabWidget* m_tabWidget;
#endif
GraphicsViewZoomer* m_zoomer;
QFont m_defaultFont;
int m_verticalGridStep;
@@ -164,6 +181,7 @@ private:
bool m_useGrid;
bool m_useMagnet;
// static ReportDesignWidget* m_instance;
void prepareReport();
};
}

View File

@@ -217,16 +217,16 @@ void ReportDesignWindow::createActions()
m_aboutAction->setIcon(QIcon(":/report/images/copyright"));
connect(m_aboutAction,SIGNAL(triggered()),this,SLOT(slotShowAbout()));
m_hideLeftPanel = new QAction(tr("Hide left panel"),this);
m_hideLeftPanel = new QAction(tr("Hide left panel | Alt+L"),this);
m_hideLeftPanel->setCheckable(true);
// m_hideLeftPanel->setChecked(true);
m_hideLeftPanel->setIcon(QIcon(":/report/images/hideLeftPanel"));
m_hideLeftPanel->setShortcut(QKeySequence(Qt::ALT + Qt::Key_L));
connect(m_hideLeftPanel,SIGNAL(toggled(bool)), this, SLOT(slotHideLeftPanel(bool)));
m_hideRightPanel = new QAction(tr("Hide right panel"),this);
m_hideRightPanel = new QAction(tr("Hide right panel | Alt+R"),this);
m_hideRightPanel->setCheckable(true);
// m_hideRightPanel->setChecked(true);
m_hideRightPanel->setIcon(QIcon(":/report/images/hideRightPanel"));
m_hideRightPanel->setShortcut(QKeySequence(Qt::ALT + Qt::Key_R));
connect(m_hideRightPanel,SIGNAL(toggled(bool)), this, SLOT(slotHideRightPanel(bool)));
}
@@ -683,7 +683,7 @@ bool ReportDesignWindow::checkNeedToSave()
{
if (m_reportDesignWidget->isNeedToSave()){
QMessageBox::StandardButton button = QMessageBox::question(
this,"",tr("Report has been modified ! Do you want save the report ?"),
this,"",tr("Report has been modified! Do you want save the report?"),
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, QMessageBox::Yes
);
switch (button) {
@@ -1058,8 +1058,10 @@ void ReportDesignWindow::slotBandAdded(PageDesignIntf *, BandDesignIntf * band)
break;
case BandDesignIntf::ReportFooter:
m_newReportFooter->setDisabled(true);
break;
case BandDesignIntf::TearOffBand:
m_newTearOffBand->setDisabled(true);
break;
default:
break;
}
@@ -1267,7 +1269,7 @@ bool ObjectNameValidator::validate(const QString &propName, const QVariant &prop
BaseDesignIntf* bd = dynamic_cast<BaseDesignIntf*>(object);
if (bd){
if (bd->page()->reportItemByName(propValue.toString())){
msg = QString(QObject::tr("Object with name %1 already exists").arg(propValue.toString()));
msg = QString(QObject::tr("Object with name %1 already exists!").arg(propValue.toString()));
return false;
} else (bd->emitObjectNamePropertyChanged(object->objectName(),propValue.toString()));
}

View File

@@ -50,7 +50,9 @@
#include "lrpreviewreportwindow.h"
#include "lrpreviewreportwidget.h"
#include "lrpreviewreportwidget_p.h"
#ifdef HAVE_STATIC_BUILD
#include "lrfactoryinitializer.h"
#endif
namespace LimeReport{
QSettings* ReportEngine::m_settings = 0;
@@ -63,8 +65,15 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) :
m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"),
m_fileWatcher( new QFileSystemWatcher( this ) )
{
#ifdef HAVE_STATIC_BUILD
initResources();
initReportItems();
initObjectInspectorProperties();
initSerializators();
#endif
m_datasources = new DataSourceManager(this);
m_datasources->setReportSettings(&m_reportSettings);
scriptManager()->setDataManager(m_datasources);
m_scriptEngineContext = new ScriptEngineContext(this);
m_datasources->setObjectName("datasources");
connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString)));
@@ -98,6 +107,7 @@ PageDesignIntf *ReportEnginePrivate::createPage(const QString &pageName)
{
PageDesignIntf* page =new PageDesignIntf();
page->setObjectName(pageName);
page->pageItem()->setObjectName("Report"+pageName);
page->setReportEditor(this);
page->setReportSettings(&m_reportSettings);
return page;
@@ -355,7 +365,7 @@ bool ReportEnginePrivate::printToPDF(const QString &fileName)
void ReportEnginePrivate::previewReport(PreviewHints hints)
{
QTime start = QTime::currentTime();
// QTime start = QTime::currentTime();
try{
dataManager()->setDesignTime(false);
ReportPages pages = renderToPages();
@@ -370,6 +380,7 @@ void ReportEnginePrivate::previewReport(PreviewHints hints)
w->setWindowTitle(m_previewWindowTitle);
w->setSettings(settings());
w->setPages(pages);
w->setLayoutDirection(m_previewLayoutDirection);
if (!dataManager()->errorsList().isEmpty()){
w->setErrorMessages(dataManager()->errorsList());
}
@@ -384,7 +395,6 @@ void ReportEnginePrivate::previewReport(PreviewHints hints)
m_activePreview = w;
connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*)));
qDebug()<<"render time ="<<start.msecsTo(QTime::currentTime());
w->exec();
}
} catch (ReportError &exception){
@@ -707,11 +717,38 @@ QString ReportEnginePrivate::renderToString()
}else return QString();
}
Qt::LayoutDirection ReportEnginePrivate::previewLayoutDirection()
{
return m_previewLayoutDirection;
}
void ReportEnginePrivate::setPreviewLayoutDirection(const Qt::LayoutDirection& layoutDirection)
{
m_previewLayoutDirection = layoutDirection;
}
void ReportEnginePrivate::setPassPhrase(const QString &passPhrase)
{
m_passPhrase = passPhrase;
}
void ReportEnginePrivate::reorderPages(const QList<PageDesignIntf *>& reorderedPages)
{
m_pages.clear();
foreach(PageDesignIntf* page, reorderedPages){
m_pages.append(page);
}
}
void ReportEnginePrivate::clearSelection()
{
foreach (PageDesignIntf* page, m_pages) {
foreach(QGraphicsItem* item, page->selectedItems()){
item->setSelected(false);
}
}
}
bool ReportEnginePrivate::resultIsEditable() const
{
return m_resultIsEditable;
@@ -896,6 +933,18 @@ void ReportEngine::setPassPharse(QString &passPharse)
d->setPassPhrase(passPharse);
}
Qt::LayoutDirection ReportEngine::previewLayoutDirection()
{
Q_D(ReportEngine);
return d->previewLayoutDirection();
}
void ReportEngine::setPreviewLayoutDirection(const Qt::LayoutDirection& layoutDirection)
{
Q_D(ReportEngine);
return d->setPreviewLayoutDirection(layoutDirection);
}
void ReportEngine::setShowProgressDialog(bool value)
{
Q_D(ReportEngine);

View File

@@ -102,6 +102,8 @@ public:
bool resultIsEditable();
bool isBusy();
void setPassPharse(QString& passPharse);
Qt::LayoutDirection previewLayoutDirection();
void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection);
signals:
void renderStarted();
void renderFinished();

View File

@@ -128,7 +128,10 @@ public:
void setResultEditable(bool value);
void setPassPhrase(const QString &passPhrase);
void reorderPages(const QList<PageDesignIntf *> &reorderedPages);
void clearSelection();
Qt::LayoutDirection previewLayoutDirection();
void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection);
signals:
void pagesLoadFinished();
void datasourceCollectionLoadFinished(const QString& collectionName);
@@ -181,8 +184,8 @@ private:
bool m_reportRendering;
bool m_resultIsEditable;
QString m_passPhrase;
QFileSystemWatcher *m_fileWatcher;
Qt::LayoutDirection m_previewLayoutDirection;
};
}

View File

@@ -148,7 +148,7 @@ void ReportRender::renameChildItems(BaseDesignIntf *item){
ReportRender::ReportRender(QObject *parent)
:QObject(parent), m_renderPageItem(0), m_pageCount(0),
m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0)
m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false)
{
initColumns();
}
@@ -247,8 +247,6 @@ void ReportRender::renderPage(PageDesignIntf* patternPage)
clearPageMap();
startNewPage();
renderBand(m_patternPageItem->bandByType(BandDesignIntf::ReportHeader), 0, StartNewPageAsNeeded);
BandDesignIntf* lastRenderedBand = 0;
@@ -311,6 +309,8 @@ 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);
}
#ifdef HAVE_UI_LOADER
@@ -330,68 +330,87 @@ void ReportRender::clearPageMap()
m_renderedPages.clear();
}
void ReportRender::extractGroupsFunction(BandDesignIntf *band)
{
foreach(BaseDesignIntf* item,band->childBaseItems()){
ContentItemDesignIntf* contentItem = dynamic_cast<ContentItemDesignIntf*>(item);
if (contentItem&&(contentItem->content().contains(QRegExp("\\$S\\s*\\{.*\\}")))){
foreach(const QString &functionName, m_datasources->groupFunctionNames()){
QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName));
QRegExp rxName(QString(Const::GROUP_FUNCTION_NAME_RX).arg(functionName));
if (rx.indexIn(contentItem->content())>=0){
int pos = 0;
while ( (pos = rx.indexIn(contentItem->content(),pos)) != -1){
QVector<QString> 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*)));
}
} 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)));
void ReportRender::extractGroupFuntionsFromItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band){
if ( contentItem && contentItem->content().contains(QRegExp("\\$S\\s*\\{.*\\}"))){
foreach(const QString &functionName, m_datasources->groupFunctionNames()){
QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName));
QRegExp rxName(QString(Const::GROUP_FUNCTION_NAME_RX).arg(functionName));
if (rx.indexIn(contentItem->content())>=0){
int pos = 0;
while ( (pos = rx.indexIn(contentItem->content(),pos)) != -1){
QVector<QString> 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*)));
}
} 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));
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));
}
}
}
}
void ReportRender::replaceGroupsFunction(BandDesignIntf *band)
{
foreach(BaseDesignIntf* item,band->childBaseItems()){
void ReportRender::extractGroupFunctionsFromContainer(BaseDesignIntf* baseItem, BandDesignIntf* band){
foreach (BaseDesignIntf* item, baseItem->childBaseItems()) {
ContentItemDesignIntf* contentItem = dynamic_cast<ContentItemDesignIntf*>(item);
if (contentItem){
QString content = contentItem->content();
foreach(const QString &functionName, m_datasources->groupFunctionNames()){
QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName));
if (rx.indexIn(content)>=0){
int pos = 0;
while ( (pos = rx.indexIn(content,pos))!= -1 ){
QVector<QString> captures = normalizeCaptures(rx);
if (captures.size() >= 3){
QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX));
content.replace(captures.at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"'));
}
pos += rx.matchedLength();
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){
QString content = contentItem->content();
foreach(const QString &functionName, m_datasources->groupFunctionNames()){
QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName));
if (rx.indexIn(content)>=0){
int pos = 0;
while ( (pos = rx.indexIn(content,pos))!= -1 ){
QVector<QString> captures = normalizeCaptures(rx);
if (captures.size() >= 3){
QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX));
content.replace(captures.at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"'));
}
contentItem->setContent(content);
pos += rx.matchedLength();
}
contentItem->setContent(content);
}
}
}
}
void ReportRender::replaceGroupFunctionsInContainer(BaseDesignIntf* baseItem, BandDesignIntf* band)
{
foreach(BaseDesignIntf* item, baseItem->childBaseItems()){
ContentItemDesignIntf* contentItem = dynamic_cast<ContentItemDesignIntf*>(item);
if (contentItem) replaceGroupFunctionsInItem(contentItem, band);
else replaceGroupFunctionsInContainer(item, band);
}
}
void ReportRender::replaceGroupsFunction(BandDesignIntf *band)
{
replaceGroupFunctionsInContainer(band, band);
}
BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesignIntf* bandData, ReportRender::DataRenderMode mode, bool isLast)
{
QApplication::processEvents();
@@ -413,7 +432,6 @@ BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesign
if (patternBand->isFooter())
m_lastRenderedFooter = patternBand;
bandClone->setBackgroundColor(
(datasources()->variable(QLatin1String("line_")+patternBand->objectName().toLower()).toInt() %2 !=0 ?
bandClone->backgroundColor():
@@ -431,6 +449,8 @@ BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesign
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);
} else {
@@ -488,6 +508,7 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand)
IDataSource* bandDatasource = 0;
m_lastRenderedFooter = 0;
if (!dataBand->datasourceName().isEmpty())
bandDatasource = datasources()->dataSource(dataBand->datasourceName());
@@ -507,7 +528,7 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand)
if (dataBand->bandHeader() && dataBand->bandHeader()->reprintOnEachPage())
m_reprintableBands.append(dataBand->bandHeader());
renderChildHeader(dataBand,PrintNotAlwaysPrintable);
//renderChildHeader(dataBand,PrintNotAlwaysPrintable);
renderGroupHeader(dataBand, bandDatasource, true);
bool firstTime = true;
@@ -537,6 +558,7 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand)
renderBand(header, 0, StartNewPageAsNeeded);
renderBand(dataBand, rawData, StartNewPageAsNeeded, !bandDatasource->hasNext());
m_newPageStarted = false;
renderChildBands(dataBand);
}
@@ -557,7 +579,10 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand)
m_reprintableBands.removeOne(dataBand->bandHeader());
renderGroupFooter(dataBand);
if (bandDatasource->prior()){
renderGroupFooter(dataBand);
bandDatasource->next();
}
if (footer && !footer->printAlways())
renderBand(footer, 0, StartNewPageAsNeeded);
@@ -614,9 +639,9 @@ void ReportRender::renderPageItems(PageItemDesignIntf* patternPage)
}
m_renderPageItem->restoreLinks();
m_renderPageItem->updateSubItemsSize(FirstPass,m_datasources);
// foreach(BaseDesignIntf* item, pageItems){
// item->updateItemSize(m_datasources);
// }
foreach(BaseDesignIntf* item, pageItems){
item->setZValue(item->zValue()-100000);
}
}
qreal ReportRender::calcPageFooterHeight(PageItemDesignIntf *patternPage)
@@ -638,7 +663,8 @@ void ReportRender::renderChildHeader(BandDesignIntf *parent, BandPrintMode print
if (band->metaObject()->indexOfProperty("printAlways")>0){
printAlways=band->property("printAlways").toBool();
}
if (printAlways == (printMode==PrintAlwaysPrintable) ) renderBand(band, 0, StartNewPageAsNeeded);
if (printAlways == (printMode == PrintAlwaysPrintable))
renderBand(band, 0, StartNewPageAsNeeded);
}
}
@@ -662,9 +688,9 @@ void ReportRender::renderChildBands(BandDesignIntf *parentBand)
if (!band->datasourceName().isEmpty())
ds = m_datasources->dataSource(band->datasourceName());
if (ds) ds->first();
renderChildHeader(band,PrintAlwaysPrintable);
//renderChildHeader(band,PrintAlwaysPrintable);
renderDataBand(band);
renderChildFooter(band,PrintAlwaysPrintable);
//renderChildFooter(band,PrintAlwaysPrintable);
closeFooterGroup(band);
}
}
@@ -675,7 +701,7 @@ void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* da
IGroupBand* gb = dynamic_cast<IGroupBand*>(band);
if (gb&&gb->isNeedToClose(m_datasources)){
if (band->childBands().count()>0){
dataSource->prior();
bool didGoBack = dataSource->prior();
foreach (BandDesignIntf* subBand, band->childrenByType(BandDesignIntf::GroupHeader)) {
foreach(BandDesignIntf* footer, subBand->childrenByType(BandDesignIntf::GroupFooter)){
renderBand(footer, 0);
@@ -687,7 +713,9 @@ void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* da
renderBand(footer, 0, StartNewPageAsNeeded);
}
dataSource->next();
if (didGoBack){
dataSource->next();
}
}
closeDataGroup(band);
// if (gb->isNeedToStartNewPage()){
@@ -697,13 +725,19 @@ void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* da
}
if (gb && !gb->isStarted()){
if (band->reprintOnEachPage())
if (band->reprintOnEachPage()){
m_reprintableBands.append(band);
}
gb->startGroup(m_datasources);
openDataGroup(band);
if (!firstTime && gb->startNewPage()){
if (!firstTime && gb->startNewPage() && !m_newPageStarted){
if (gb->resetPageNumber()) resetPageNumber(BandReset);
renderBand(band, 0, ForcedStartPage);
if (band->reprintOnEachPage()){
savePage();
startNewPage();
} else {
renderBand(band, 0, ForcedStartPage);
}
} else {
renderBand(band, 0, StartNewPageAsNeeded);
}
@@ -743,7 +777,7 @@ void ReportRender::initGroups()
{
m_datasources->clearGroupFunction();
foreach(BandDesignIntf* band, m_patternPageItem->childBands()){
if (band->isFooter()) extractGroupsFunction(band);
if (band->isFooter()) extractGroupFunctions(band);
if (band->isHeader()){
IGroupBand* gb = dynamic_cast<IGroupBand*>(band);
if (gb) gb->closeGroup();
@@ -818,6 +852,14 @@ void ReportRender::closeDataGroup(BandDesignIntf *band)
if (groupBand){
groupBand->closeGroup();
if (band->reprintOnEachPage()) m_reprintableBands.removeOne(band);
QList<BandDesignIntf*>::Iterator it = m_reprintableBands.begin();
while (it != m_reprintableBands.end()){
if ((*it)->bandIndex()>band->bandIndex())
it = m_reprintableBands.erase(it);
else
it++;
}
}
closeGroup(band);
}
@@ -857,7 +899,8 @@ bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren)
}
}
if ( (band->columnsCount()>1) && !band->isHeader()){
if ( (band->columnsCount()>1) &&
(!band->isHeader() || (band->bandNestingLevel()>0 && band->columnsFillDirection() != BandDesignIntf::Horizontal ))){
if (m_maxHeightByColumn.size()!=band->columnsCount()){
for(int i=1;i<band->columnsCount();++i){
@@ -885,7 +928,8 @@ bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren)
m_maxHeightByColumn[m_currentColumn]-=band->height();
}
if (band->isHeader() && band->columnsCount()>1){
if ( (band->columnsCount()>1) &&
(band->isHeader() && (band->bandNestingLevel()==0 || band->columnsFillDirection()==BandDesignIntf::Horizontal))){
qreal bandPos = m_currentStartDataPos[m_currentColumn];
m_currentStartDataPos[m_currentColumn]+=band->height();
@@ -1042,8 +1086,9 @@ void ReportRender::startNewColumn(){
void ReportRender::startNewPage()
{
m_renderPageItem=0;
m_currentColumn=0;
m_renderPageItem = 0;
m_currentColumn = 0;
m_newPageStarted = true;
initColumns();
initRenderPage();
@@ -1065,14 +1110,13 @@ void ReportRender::startNewPage()
m_dataAreaSize = m_maxHeightByColumn[m_currentColumn];
m_renderedDataBandCount = 0;
foreach (BandDesignIntf* band, m_reprintableBands) {
renderBand(band, 0);
}
checkLostHeadersOnPrevPage();
pasteGroups();
renderPageItems(m_patternPageItem);
}
void ReportRender::resetPageNumber(ResetPageNuberType resetType)
@@ -1205,6 +1249,11 @@ void ReportRender::moveTearOffBand(){
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);
checkFooterGroup(m_lastDataBand);
cutGroups();
rearrangeColumnsItems();

View File

@@ -40,6 +40,7 @@ namespace LimeReport{
class PageDesignIntf;
class BandDesignIntf;
class ContentItemDesignIntf;
class GroupBandsHolder: public QList<BandDesignIntf*>{
public:
@@ -86,9 +87,7 @@ signals:
public slots:
void cancelRender();
private:
void baseDesignIntfToScript(BaseDesignIntf* item);
void renderPage(PageDesignIntf *patternPage);
void initDatasources();
void initDatasource(const QString &name);
@@ -112,9 +111,12 @@ private:
void renderChildBands(BandDesignIntf* parentBand);
void renderGroupHeader(BandDesignIntf* parentBand, IDataSource* dataSource, bool firstTime);
void renderGroupFooter(BandDesignIntf* parentBand);
void initGroups();
void extractGroupsFunction(BandDesignIntf* band);
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);
void popPageFooterGroupValues(BandDesignIntf* dataBand);
@@ -183,6 +185,8 @@ private:
QList<PagesRange> m_ranges;
QVector<BandDesignIntf*> m_columnedBandItems;
unsigned long long m_curentNameIndex;
bool m_newPageStarted;
};
} // namespace LimeReport

View File

@@ -216,7 +216,11 @@ QScriptValue setVariable(QScriptContext* pcontext, QScriptEngine* /*pengine*/){
ScriptEngineManager* sm = qscriptvalue_cast<ScriptEngineManager*>(pcontext->callee().data());
DataSourceManager* dm = sm->dataManager();
dm->changeVariable(name,value);
if (dm->containsVariable(name))
dm->changeVariable(name,value);
else
dm->addVariable(name, value);
return QScriptValue();
}
@@ -268,6 +272,35 @@ QScriptValue currencyUSBasedFormat(QScriptContext* pcontext, QScriptEngine* peng
return pengine->newVariant(vTempStr);
}
#endif
/*
* sectotimeFormat(int seconds, string format)
* - convert seconds to time format without day border!
*
* examples (base: 60 days 7 Minutes 2 Seconds = 5184422 seconds):
* (3600 * 24 * 60) + (7 * 60) + 2 seconds with format hh:mm:ss = 1440:07:02
* (3600 * 24 * 60) + (7 * 60) + 2 seconds with format mm:s = 86407:2
* (3600 * 24 * 60) + (7 * 60) + 2 seconds with format ss = 5184422
*/
QScriptValue sectotimeFormat(QScriptContext* pcontext, QScriptEngine* pengine){
// simplify values
QVariant value = pcontext->argument(0).toVariant();
QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"hh:mm:ss";
// algorithm adapted from: https://stackoverflow.com/a/25697134/4954370
int seconds = value.toInt();
int minutes = seconds / 60;
int hours = minutes / 60;
// replace the following formats: hh, mm, ss, h, m, s
bool hasHour = format.contains("h");
bool hasMinute = format.contains("m");
for(int len = 2; len; len--) {
if(hasHour) format.replace(QString('h').repeated(len), QString::number(hours).rightJustified(len, '0'));
if(hasMinute) format.replace(QString('m').repeated(len), QString::number(hasHour ? minutes % 60 : minutes).rightJustified(len, '0'));
format.replace(QString('s').repeated(len), QString::number(hasMinute ? seconds % 60 : seconds).rightJustified(len, '0'));
}
return QScriptValue(format);
}
QScriptValue dateFormat(QScriptContext* pcontext, QScriptEngine* pengine){
QVariant value = pcontext->argument(0).toVariant();
QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"dd.MM.yyyy";
@@ -427,7 +460,7 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){
if (m_dataManager){
foreach(QString func, m_dataManager->groupFunctionNames()){
if (isFunctionExists(func)) deleteFunction(func);
addFunction(func, groupFunction,"GROUP FUNCTIONS", func+"(\""+tr("Value")+"\",\""+tr("BandName")+"\")");
addFunction(func, groupFunction,tr("GROUP FUNCTIONS"), func+"(\""+tr("Value")+"\",\""+tr("BandName")+"\")");
}
foreach(ScriptFunctionDesc func, m_functions){
if (func.type==ScriptFunctionDesc::Native)
@@ -551,9 +584,9 @@ QString ScriptEngineManager::expandScripts(QString context, QVariant& varValue,
if (reportItem){
QScriptValue svThis = se->globalObject().property("THIS");
if (svThis.isValid()){
se->newQObject(svThis, this);
se->newQObject(svThis, reportItem);
} else {
svThis = se->newQObject(this);
svThis = se->newQObject(reportItem);
se->globalObject().setProperty("THIS",svThis);
}
}
@@ -612,22 +645,23 @@ ScriptEngineManager::ScriptEngineManager()
m_scriptEngine = new QScriptEngine;
//addFunction("dateToStr",dateToStr,"DATE", "dateToStr(\"value\",\"format\")");
addFunction("line",line,"SYSTEM", "line(\""+tr("BandName")+"\")");
addFunction("numberFormat",numberFormat,"NUMBER", "numberFormat(\""+tr("Value")+"\",\""+tr("Format")+"\",\""+
addFunction("line",line,tr("SYSTEM"), "line(\""+tr("BandName")+"\")");
addFunction("numberFormat",numberFormat,tr("NUMBER"), "numberFormat(\""+tr("Value")+"\",\""+tr("Format")+"\",\""+
tr("Precision")+"\",\""+
tr("Locale")+"\")");
addFunction("dateFormat",dateFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")");
addFunction("timeFormat",timeFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")");
addFunction("dateTimeFormat", dateTimeFormat, "DATE&TIME", "dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")");
addFunction("date",date,"DATE&TIME","date()");
addFunction("now",now,"DATE&TIME","now()");
addFunction("sectotimeFormat",sectotimeFormat,tr("DATE&TIME"), "sectotimeFormat(\""+tr("Seconds")+"\",\""+tr("Format")+"\")");
addFunction("dateFormat",dateFormat,tr("DATE&TIME"), "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")");
addFunction("timeFormat",timeFormat,tr("DATE&TIME"), "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")");
addFunction("dateTimeFormat", dateTimeFormat, tr("DATE&TIME"), "dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")");
addFunction("date",date,tr("DATE&TIME"),"date()");
addFunction("now",now,tr("DATE&TIME"),"now()");
#if QT_VERSION>0x040800
addFunction("currencyFormat",currencyFormat,"NUMBER","currencyFormat(\""+tr("Value")+"\",\""+tr("Locale")+"\")");
addFunction("currencyUSBasedFormat",currencyUSBasedFormat,"NUMBER","currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")");
addFunction("currencyFormat",currencyFormat,tr("NUMBER"),"currencyFormat(\""+tr("Value")+"\",\""+tr("Locale")+"\")");
addFunction("currencyUSBasedFormat",currencyUSBasedFormat,tr("NUMBER"),"currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")");
#endif
addFunction("setVariable", setVariable, "GENERAL", "setVariable(\""+tr("Name")+"\",\""+tr("Value")+"\")");
addFunction("getVariable", getVariable, "GENERAL", "getVariable(\""+tr("Name")+"\")");
addFunction("getField", getField, "GENERAL", "getField(\""+tr("Name")+"\")");
addFunction("setVariable", setVariable, tr("GENERAL"), "setVariable(\""+tr("Name")+"\",\""+tr("Value")+"\")");
addFunction("getVariable", getVariable, tr("GENERAL"), "getVariable(\""+tr("Name")+"\")");
addFunction("getField", getField, tr("GENERAL"), "getField(\""+tr("Name")+"\")");
QScriptValue colorCtor = m_scriptEngine->newFunction(constructColor);
m_scriptEngine->globalObject().setProperty("QColor", colorCtor);

View File

@@ -61,8 +61,9 @@ void VariablesHolder::addVariable(const QString& name, const QVariant& value, Va
m_varNames.insert(name,varValue);
if (type==VarDesc::Report)
m_userVariables.append(varValue);
emit variableHasBeenAdded(name);
} else {
throw ReportError(tr("variable with name ")+name+tr(" already exists !!"));
throw ReportError(tr("variable with name ")+name+tr(" already exists!"));
}
}
@@ -77,7 +78,7 @@ VarDesc::VarType VariablesHolder::variableType(const QString &name)
{
if (m_varNames.contains(name))
return m_varNames.value(name)->varType();
else throw ReportError(tr("variable with name ")+name+tr(" does not exists !!"));
else throw ReportError(tr("variable with name ")+name+tr(" does not exists!"));
}
void VariablesHolder::deleteVariable(const QString &name)
@@ -86,6 +87,7 @@ void VariablesHolder::deleteVariable(const QString &name)
m_userVariables.removeOne(m_varNames.value(name));
delete m_varNames.value(name);
m_varNames.remove(name);
emit variableHasBennDeleted(name);
}
}
@@ -93,8 +95,9 @@ void VariablesHolder::changeVariable(const QString &name, const QVariant &value)
{
if(m_varNames.contains(name)) {
m_varNames.value(name)->setValue(value);
emit variableHasBeenChanged(name);
} else
throw ReportError(tr("variable with name ")+name+tr(" does not exists !!"));
throw ReportError(tr("variable with name ")+name+tr(" does not exists!"));
}
void VariablesHolder::clearUserVariables()
@@ -142,7 +145,7 @@ RenderPass VariablesHolder::variablePass(const QString &name)
{
if (m_varNames.contains(name))
return m_varNames.value(name)->renderPass();
else throw ReportError(tr("variable with name ")+name+tr(" does not exists !!"));
else throw ReportError(tr("variable with name ")+name+tr(" does not exists!"));
}
}// namespace LimeReport

View File

@@ -27,8 +27,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
****************************************************************************/
#ifndef VARIABLEHOLDER_H
#define VARIABLEHOLDER_H
#ifndef LRVARIABLEHOLDER_H
#define LRVARIABLEHOLDER_H
#include <QObject>
#include <QMap>
@@ -92,6 +92,9 @@ public:
int userVariablesCount();
VarDesc* userVariableAt(int index);
signals:
void variableHasBeenAdded(const QString& variableName);
void variableHasBeenChanged(const QString& variableName);
void variableHasBennDeleted(const QString& variableName);
private:
QMap<QString,VarDesc*> m_varNames;
QList<VarDesc*> m_userVariables;

View File

@@ -27,8 +27,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
****************************************************************************/
#ifndef ATEXTITEMPROPERTYEDITOR_H
#define ATEXTITEMPROPERTYEDITOR_H
#ifndef LRTEXTITEMPROPERTYEDITOR_H
#define LRTEXTITEMPROPERTYEDITOR_H
#include <QDialog>
#include <QWidget>

View File

@@ -83,6 +83,57 @@ void QObjectPropertyModel::translatePropertyName()
tr("shape");
tr("shapeBrush");
tr("shapeBrushColor");
tr("gridStep");
tr("fullPage");
tr("oldPrintMode");
tr("borderColor");
tr("resetPageNumber");
tr("alternateBackgroundColor");
tr("backgroundBrushStyle");
tr("columnCount");
tr("startFromNewPage");
tr("startNewPage");
tr("adaptFontToSize");
tr("allowHTML");
tr("allowHTMLInFields");
tr("backgroundBrushStyle");
tr("followTo");
tr("format");
tr("lineSpacing");
tr("textIndent");
tr("textLayoutDirection");
tr("underlineLineSize");
tr("underlines");
tr("valueType");
tr("securityLevel");
tr("testValue");
tr("whitespace");
tr("resourcePath");
tr("scale");
tr("cornerRadius");
tr("shapeColor");
tr("layoutType");
tr("barcodeType");
tr("barcodeWidth");
tr("foregroundColor");
tr("inputMode");
tr("pdf417CodeWords");
tr("autoSize");
tr("center");
tr("field");
tr("image");
tr("keepAspectRatio");
tr("columnsCount");
tr("useAlternateBackgroundColor");
tr("printBeforePageHeader");
tr("maxScalePercent");
tr("printOnFirstPage");
tr("printOnLastPage");
tr("printAlways");
tr("repeatOnEachRow");
tr("condition");
tr("groupFieldName");
tr("keepGroupTogether");
}
void QObjectPropertyModel::clearObjectsList()

View File

@@ -74,7 +74,8 @@ void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionVi
option.rect.y()+option.rect.height()
);
painter->save();
painter->setPen(option.palette.color(QPalette::Dark));
QColor color = static_cast<QRgb>(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &option));
painter->setPen(color);
painter->drawLine(start,end);
painter->restore();
}

View File

@@ -1,5 +1,5 @@
#ifndef CONTENTPROPITEM_H
#define CONTENTPROPITEM_H
#ifndef LRCONTENTPROPITEM_H
#define LRCONTENTPROPITEM_H
#include "lrstringpropitem.h"
#include "objectinspector/editors/lrbuttonlineeditor.h"

View File

@@ -54,10 +54,10 @@ QWidget *EnumPropItem::createProperyEditor(QWidget *parent) const
QStringList enumValues;
QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator();
for (int i=0;i<propEnum.keyCount();i++){
if (m_acceptableValues.isEmpty()) enumValues.append(propEnum.key(i));
if (m_acceptableValues.isEmpty()) enumValues.append(tr(propEnum.key(i)));
else {
if (m_acceptableValues.contains(propEnum.value(i))){
enumValues.append(propEnum.key(i));
enumValues.append(tr(propEnum.key(i)));
}
}
}
@@ -75,6 +75,65 @@ void EnumPropItem::slotEnumChanged(const QString &text)
}
}
void EnumPropItem::initTranslation()
{
QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator();
for (int i=0;i<propEnum.keyCount();i++){
m_translation.insert(QString(tr(propEnum.key(i))), QString(propEnum.key(i)));
}
}
void EnumPropItem::translateEnumItemName()
{
tr("Default");
tr("Portrait");
tr("Landscape");
tr("NoneAutoWidth");
tr("MaxWordLength");
tr("MaxStringLength");
tr("TransparentMode");
tr("OpaqueMode");
tr("Angle0");
tr("Angle90");
tr("Angle180");
tr("Angle270");
tr("Angle45");
tr("Angle315");
tr("DateTime");
tr("Double");
tr("NoBrush");
tr("SolidPattern");
tr("Dense1Pattern");
tr("Dense2Pattern");
tr("Dense3Pattern");
tr("Dense4Pattern");
tr("Dense5Pattern");
tr("Dense6Pattern");
tr("Dense7Pattern");
tr("HorPattern");
tr("VerPattern");
tr("CrossPattern");
tr("BDiagPattern");
tr("FDiagPattern");
tr("LeftToRight");
tr("RightToLeft");
tr("LayoutDirectionAuto");
tr("LeftItemAlign");
tr("RightItemAlign");
tr("CenterItemAlign");
tr("ParentWidthItemAlign");
tr("DesignedItemAlign");
tr("HorizontalLine");
tr("VerticalLine");
tr("Ellipse");
tr("Rectangle");
tr("Page");
tr("Band");
tr("Horizontal");
tr("Vertical");
tr("VerticalUniform");
}
void EnumPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const
{
ComboBoxEditor *editor=qobject_cast<ComboBoxEditor *>(propertyEditor);
@@ -90,13 +149,13 @@ void EnumPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *mod
QString EnumPropItem::nameByType(int value) const
{
QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator();
return propEnum.valueToKey(value);
return tr(propEnum.valueToKey(value));
}
int EnumPropItem::typeByName(const QString &value) const
{
QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator();
return propEnum.keyToValue(value.toLatin1());
return propEnum.keyToValue(m_translation.value(value).toLatin1());
}
QString EnumPropItem::displayValue() const

View File

@@ -31,17 +31,18 @@
#define LRENUMPROPITEM_H
#include "lrobjectpropitem.h"
#include <QMap>
namespace LimeReport{
class EnumPropItem : public ObjectPropItem
{
Q_OBJECT
public:
EnumPropItem():ObjectPropItem(), m_settingValue(false){}
EnumPropItem():ObjectPropItem(), m_settingValue(false){initTranslation();}
EnumPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly)
:ObjectPropItem(object, objects, name, displayName, value, parent, readonly),m_settingValue(false){}
:ObjectPropItem(object, objects, name, displayName, value, parent, readonly),m_settingValue(false){initTranslation();}
EnumPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly, QVector<int> acceptableValues)
:ObjectPropItem(object, objects, name, displayName, value, parent, readonly),m_acceptableValues(acceptableValues),m_settingValue(false){}
:ObjectPropItem(object, objects, name, displayName, value, parent, readonly),m_acceptableValues(acceptableValues),m_settingValue(false){initTranslation();}
QWidget* createProperyEditor(QWidget *parent) const;
QString displayValue() const;
void setPropertyEditorData(QWidget * propertyEditor, const QModelIndex &) const;
@@ -52,9 +53,13 @@ protected:
int typeByName(const QString& propertyValue) const;
private slots:
void slotEnumChanged(const QString& text);
private:
void initTranslation();
void translateEnumItemName();
private:
QVector<int> m_acceptableValues;
bool m_settingValue;
QMap<QString, QString> m_translation;
};
}
#endif // LRENUMPROPITEM_H

View File

@@ -59,12 +59,14 @@ void FlagsPropItem::createChildren()
QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator();
for (int i=0;i<propEnum.keyCount();i++)
{
this->appendItem(new LimeReport::FlagPropItem(
object(), objects(), QString(propEnum.key(i)), QString(propEnum.key(i)),
bool((propertyValue().toInt() & propEnum.keyToValue(propEnum.key(i)))==propEnum.keyToValue(propEnum.key(i))),
this, false
)
);
if ( propEnum.keyToValue(propEnum.key(i)) !=0 ) {
this->appendItem(new LimeReport::FlagPropItem(
object(), objects(), QString(propEnum.key(i)), tr(propEnum.key(i)),
bool((propertyValue().toInt() & propEnum.keyToValue(propEnum.key(i)))==propEnum.keyToValue(propEnum.key(i))),
this, false
)
);
}
}
}
@@ -94,10 +96,10 @@ QString FlagsPropItem::displayValue() const
QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator();
for (int i=0;i<propEnum.keyCount();i++)
{
if ( (propertyValue().toInt() & propEnum.keyToValue(propEnum.key(i)))==propEnum.keyToValue(propEnum.key(i) ))
if ((propEnum.keyToValue(propEnum.key(i)) == 0) ? propertyValue().toInt() == 0 : (propertyValue().toInt() & propEnum.keyToValue(propEnum.key(i))) == propEnum.keyToValue(propEnum.key(i)))
{
if (result.isEmpty()) result+=propEnum.key(i);
else result=result+" | "+propEnum.key(i);
if (result.isEmpty()) result+= tr(propEnum.key(i));
else result=result+" | "+tr(propEnum.key(i));
}
}
@@ -114,6 +116,15 @@ void FlagsPropItem::slotEnumChanged(QString /*text*/)
{
}
void FlagsPropItem::translateFlagsItem()
{
tr("NoLine");
tr("TopLine");
tr("BottomLine");
tr("LeftLine");
tr("RightLine");
}
FlagPropItem::FlagPropItem(QObject* object, ObjectsList* objects, const QString &propName, const QString &displayName, const QVariant &value, ObjectPropItem* parent, bool readonly)
:BoolPropItem(object, objects, propName,displayName,value,parent,readonly)
{
@@ -130,8 +141,8 @@ void FlagPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *mod
bool value = qobject_cast<CheckBoxEditor*>(propertyEditor)->isChecked();
model->setData(index,value);
int flags = object()->property(parent()->propertyName().toLatin1()).toInt();
if (value) flags=flags | valueByName(displayName());
else if (flags&valueByName(displayName())) flags=flags ^ valueByName(displayName());
if (value) flags = flags | valueByName(propertyName());
else if (flags & valueByName(propertyName())) flags = flags ^ valueByName(propertyName());
setValueToObject(parent()->propertyName(),flags);
parent()->setPropertyValue(flags);
}

View File

@@ -46,6 +46,8 @@ public:
virtual void setPropertyValue(QVariant propertyValue);
private slots:
void slotEnumChanged(QString);
private:
void translateFlagsItem();
private:
QSet<int> m_acceptableValues;
QString nameByType(int propertyValue) const;

View File

@@ -94,6 +94,11 @@ void ObjectBrowser::fillNode(QTreeWidgetItem* parentNode, BaseDesignIntf* report
treeItem->setIcon(0,QIcon(":/items/"+extractClassName(item->metaObject()->className())));
connect(item, SIGNAL(propertyObjectNameChanged(QString,QString)),
this, SLOT(slotPropertyObjectNameChanged(QString,QString)));
ItemDesignIntf* i = dynamic_cast<ItemDesignIntf*>(item);
if (i){
connect(i, SIGNAL(itemLocationChanged(BaseDesignIntf*,BaseDesignIntf*)),
this, SLOT(slotItemParentChanged(BaseDesignIntf*,BaseDesignIntf*)));
}
m_itemsMap.insert(item,treeItem);
parentNode->addChild(treeItem);
if (!item->childBaseItems().isEmpty())
@@ -278,6 +283,19 @@ void ObjectBrowser::slotActivePageUpdated(LimeReport::PageDesignIntf *)
buildTree();
}
void ObjectBrowser::slotItemParentChanged(BaseDesignIntf* item, BaseDesignIntf* parent)
{
if (m_itemsMap.contains(item) && m_itemsMap.contains(parent)){
m_itemsMap.value(item)->parent()->removeChild(m_itemsMap.value(item));
m_itemsMap.value(parent)->addChild(m_itemsMap.value(item));
m_changingItemSelection = true;
m_itemsMap.value(item)->setSelected(true);
item->setSelected(true);
m_changingItemSelection = false;
}
}
void ObjectBrowserNode::setObject(QObject *value)
{
m_object = value;

View File

@@ -75,6 +75,7 @@ private slots:
void slotMultiItemSelected();
void slotItemDoubleClicked(QTreeWidgetItem* item,int);
void slotActivePageUpdated(LimeReport::PageDesignIntf*);
void slotItemParentChanged(BaseDesignIntf* item, BaseDesignIntf* parent);
private:
ReportDesignWidget* m_report;
QMainWindow* m_mainWindow;