diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
commit | 8362bf63dea22bbf6736609b0f49c152f975eb63 (patch) | |
tree | 0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kugar/kudesigner_lib/kugartemplate.cpp | |
download | koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip |
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kugar/kudesigner_lib/kugartemplate.cpp')
-rw-r--r-- | kugar/kudesigner_lib/kugartemplate.cpp | 411 |
1 files changed, 411 insertions, 0 deletions
diff --git a/kugar/kudesigner_lib/kugartemplate.cpp b/kugar/kudesigner_lib/kugartemplate.cpp new file mode 100644 index 00000000..500bc419 --- /dev/null +++ b/kugar/kudesigner_lib/kugartemplate.cpp @@ -0,0 +1,411 @@ +/* This file is part of the KDE project +Copyright (C) 2003-2004 Alexander Dymo <adymo@mksat.net> + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public License +along with this library; see the file COPYING.LIB. If not, write to +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ +#include "kugartemplate.h" + +#include <klocale.h> + +#include <qcanvas.h> +#include <qpainter.h> +#include <qprinter.h> +#include <qpaintdevicemetrics.h> + +#include <koproperty/property.h> + +#include "propertyserializer.h" + +#include "canvas.h" +#include "reportitem.h" + +#include "reportheader.h" +#include "reportfooter.h" +#include "pageheader.h" +#include "pagefooter.h" +#include "detailheader.h" +#include "detailfooter.h" +#include "detail.h" + +#include <kdebug.h> + +namespace Kudesigner +{ + +KugarTemplate::KugarTemplate( int x, int y, int width, int height, Canvas *canvas ) + : Section( x, y, width, height, canvas ) +{ + detailsCount = 0; + + setZ( 1 ); + m_canvas->setKugarTemplate( this ); + + reportHeader = 0; + reportFooter = 0; + pageHeader = 0; + pageFooter = 0; + + props.setGroupDescription( "DocumentSettings", i18n( "Document Settings" ) ); + + QMap<QString, QString> m; + m[ "A4" ] = "0"; + m[ "B5" ] = "1"; + m[ "Letter" ] = "2"; + m[ "Legal" ] = "3"; + m[ "Executive" ] = "4"; + m[ "A0" ] = "5"; + m[ "A1" ] = "6"; + m[ "A2" ] = "7"; + m[ "A3" ] = "8"; + m[ "A5" ] = "9"; + m[ "A6" ] = "10"; + m[ "A7" ] = "11"; + m[ "A8" ] = "12"; + m[ "A9" ] = "13"; + m[ "B0" ] = "14"; + m[ "B1" ] = "15"; + m[ "B10" ] = "16"; + m[ "B2" ] = "17"; + m[ "B3" ] = "18"; + m[ "B4" ] = "19"; + m[ "B6" ] = "20"; + m[ "B7" ] = "21"; + m[ "B8" ] = "22"; + m[ "B9" ] = "23"; + m[ "C5E" ] = "24"; + m[ "Comm10E" ] = "25"; + m[ "DLE" ] = "26"; + m[ "Folio" ] = "27"; + m[ "Ledger" ] = "28"; + m[ "Tabloid" ] = "29"; + m[ "NPageSize" ] = "30"; + props.addProperty( new Property( "PageSize", m.values(), m.keys(), "0", i18n( "Page Size" ), i18n( "Page Size" ) ), "DocumentSettings" ); + m.clear(); + + m[ i18n( "Portrait" ) ] = "0"; + m[ i18n( "Landscape" ) ] = "1"; + props.addProperty( new Property( "PageOrientation", m.values(), m.keys(), "0", i18n( "Page Orientation" ), i18n( "Page Orientation" ) ), "DocumentSettings" ); + m.clear(); + + props.addProperty( new Property( "TopMargin", 0, i18n( "Top Margin" ), i18n( "Top Margin" ), KoProperty::Integer ), "DocumentSettings" ); + props.addProperty( new Property( "BottomMargin", 0, i18n( "Bottom Margin" ), i18n( "Bottom Margin" ), KoProperty::Integer ), "DocumentSettings" ); + props.addProperty( new Property( "LeftMargin", 0, i18n( "Left Margin" ), i18n( "Left Margin" ), KoProperty::Integer ), "DocumentSettings" ); + props.addProperty( new Property( "RightMargin", 0, i18n( "Right Margin" ), i18n( "Right Margin" ), KoProperty::Integer ), "DocumentSettings" ); +} + +KugarTemplate::~KugarTemplate() +{ + if ( reportHeader ) + delete reportHeader; + if ( pageHeader ) + delete pageHeader; + + std::map<int, DetailBand>::const_iterator it; + for ( it = details.begin(); it != details.end(); ++it ) + { + if ( it->second.first.first ) + delete it->second.first.first; + if ( it->second.second ) + delete it->second.second; + if ( it->second.first.second ) + delete it->second.first.second; + } + if ( pageFooter ) + delete pageFooter; + if ( reportFooter ) + delete reportFooter; +} + +void KugarTemplate::draw( QPainter &painter ) +{ + updatePaperProps(); + painter.setPen( QPen( QColor( 160, 160, 160 ), 0, Qt::SolidLine ) ); + QPoint p1( ( int ) ( x() + props[ "LeftMargin" ].value().toInt() ), + ( int ) ( y() + props[ "TopMargin" ].value().toInt() ) ); + QPoint p2( ( int ) ( x() + props[ "LeftMargin" ].value().toInt() ), + ( int ) y() + height() - props[ "BottomMargin" ].value().toInt() ); + QPoint p3( ( int ) x() + width() - props[ "RightMargin" ].value().toInt(), + ( int ) y() + height() - props[ "BottomMargin" ].value().toInt() ); + QPoint p4( ( int ) x() + width() - props[ "RightMargin" ].value().toInt(), + ( int ) ( y() + props[ "TopMargin" ].value().toInt() ) ); + painter.moveTo( p1 ); + painter.lineTo( p2 ); + painter.lineTo( p3 ); + painter.lineTo( p4 ); + painter.lineTo( p1 ); + /* painter.drawRect((int)(x()+props["LeftMargin"].first.toInt()), + (int)(y()+props["TopMargin"].first.toInt()), + width() - props["LeftMargin"].first.toInt() - props["RightMargin"].first.toInt(), + height() - props["TopMargin"].first.toInt() - props["BottomMargin"].first.toInt());*/ + + if ( Config::gridSize() > 1 ) + { + int x = Config::gridSize(); + while ( x < width() ) + { + int y = Config::gridSize(); + while ( y < height() ) + { + painter.drawPoint( x, y ); + y += Config::gridSize(); + } + x += Config::gridSize(); + } + } + + Section::draw( painter ); +} + +void KugarTemplate::updatePaperProps() +{ + QPrinter * printer; + + // Set the page size + printer = new QPrinter(); + printer->setFullPage( true ); + printer->setPageSize( ( QPrinter::PageSize ) props[ "PageSize" ].value().toInt() ); + printer->setOrientation( ( QPrinter::Orientation ) props[ "PageOrientation" ].value().toInt() ); + + // Get the page metrics and set appropriate wigth and height + QPaintDeviceMetrics pdm( printer ); + canvas() ->resize( pdm.width(), pdm.height() ); + setSize( pdm.width(), pdm.height() ); + + //this is not needed anymore + delete printer; +} + +/*arrange sections on page automatically*/ +void KugarTemplate::arrangeSections( bool destructive ) +{ + int base = props[ "TopMargin" ].value().toInt(); + if ( reportHeader ) + { + reportHeader->arrange( base, destructive ); + base += reportHeader->props[ "Height" ].value().toInt(); + reportHeader->show(); + } + if ( pageHeader ) + { + pageHeader->arrange( base, destructive ); + base += pageHeader->props[ "Height" ].value().toInt(); + pageHeader->show(); + } + + std::map<int, DetailBand>::const_iterator it; + for ( it = details.begin(); it != details.end(); ++it ) + { + //arranging detail header + if ( it->second.first.first ) + { + it->second.first.first->arrange( base, destructive ); + base += it->second.first.first->props[ "Height" ].value().toInt(); + it->second.first.first->show(); + } + //arranging detail + if ( it->second.second ) + { + it->second.second->arrange( base, destructive ); + base += it->second.second->props[ "Height" ].value().toInt(); + it->second.second->show(); + } + } + std::map<int, DetailBand>::reverse_iterator itr; + for ( itr = details.rbegin(); itr != details.rend(); ++itr ) + { + //arranging detail footer + if ( itr->second.first.second ) + { + itr->second.first.second->arrange( base, destructive ); + base += itr->second.first.second->props[ "Height" ].value().toInt(); + itr->second.first.second->show(); + } + } + + if ( pageFooter ) + { + pageFooter->arrange( base, destructive ); + base += pageFooter->props[ "Height" ].value().toInt(); + pageFooter->show(); + } + if ( reportFooter ) + { + reportFooter->arrange( base, destructive ); + base += reportFooter->props[ "Height" ].value().toInt(); + reportFooter->show(); + } +} + +QString KugarTemplate::getXml() +{ + QString result = ""; + result += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n"; + result += "<!DOCTYPE KugarTemplate SYSTEM \"kugartemplate.dtd\">\n\n"; + result += "<KugarTemplate"; + + for ( Set::Iterator it( props ); it.current(); ++it ) + { + QString attribute = it.currentKey(); + QString value = PropertySerializer::toString( it.current() ); + if ( !attribute.isEmpty() && !value.isEmpty() ) + result += " " + attribute + "=" + "\"" + value + "\""; + } + + result += " PageWidth=\"" + QString::number( width() ) + + "\" PageHeight=\"" + QString::number( height() ) + "\""; + + result += ">\n"; + + if ( reportHeader ) + result += reportHeader->getXml(); + if ( pageHeader ) + result += pageHeader->getXml(); + + std::map<int, DetailBand>::const_iterator it; + for ( it = details.begin(); it != details.end(); ++it ) + { + //getting xml from detail header + if ( it->second.first.first ) + result += it->second.first.first->getXml(); + //getting xml from detail + if ( it->second.second ) + result += it->second.second->getXml(); + //getting xml from detail footer + if ( it->second.first.second ) + result += it->second.first.second->getXml(); + } + if ( pageFooter ) + result += pageFooter->getXml(); + if ( reportFooter ) + result += reportFooter->getXml(); + + result += "</KugarTemplate>\n"; + + return result; +} + +bool KugarTemplate::removeReportItem( QCanvasItem *item ) +{ + if ( item->rtti() > 2000 ) + { + + item->hide(); + ReportItem *ritem = dynamic_cast<ReportItem*>( item ); + if ( ritem != 0 ) + { + ritem->section() ->items.remove( ritem ); + qWarning( "good" ); + } + //delete item; + // section = 0; + canvas() ->update(); + + return true; + } + if ( item->rtti() > 1800 ) + { + /* if ((*it)->rtti() == Detail) + { + CanvasDetail *det = (CanvasDetail*)(*it); + if ( det->props["Level"].first.toInt() < + ((MyCanvas*)(canvas()))->templ->detailsCount - 1) + return; + }*/ + + Band * section = dynamic_cast<Band *>( item ); + + DetailHeader *header = 0; + DetailFooter *footer = 0; + removeSection( section, &header, &footer ); + section->hide(); + delete section; + + if ( header ) + { + header->hide(); + delete header; + } + if ( footer ) + { + footer->hide(); + delete footer; + } + arrangeSections(); + canvas() ->update(); + + return true; + } + + return false; +} + +void KugarTemplate::removeSection( Band *section, + DetailHeader **header, DetailFooter **footer ) +{ + *header = 0; + *footer = 0; + if ( section == reportHeader ) + reportHeader = 0; + if ( section == reportFooter ) + reportFooter = 0; + if ( section == pageHeader ) + pageHeader = 0; + if ( section == pageFooter ) + pageFooter = 0; + for ( std::map<int, DetailBand>::iterator i = details.begin(); i != details.end(); ++i ) + { + if ( i->second.second == section ) + { + //delete not only detail but it's header and footer + i->second.second = 0; + *header = i->second.first.first; + i->second.first.first = 0; + *footer = i->second.first.second; + i->second.first.second = 0; + detailsCount--; + } + if ( i->second.first.first == section ) + i->second.first.first = 0; + if ( i->second.first.second == section ) + i->second.first.second = 0; + } +} + +Band *KugarTemplate::band( Kudesigner::RttiValues type, int level ) +{ + switch ( type ) + { + case Rtti_ReportHeader: + return reportHeader; + case Rtti_PageHeader: + return pageHeader; + case Rtti_DetailHeader: + return details[ level ].first.first; + case Rtti_Detail: + return details[ level ].second; + case Rtti_DetailFooter: + return details[ level ].first.second; + case Rtti_PageFooter: + return pageFooter; + case Rtti_ReportFooter: + return reportFooter; + default: + return 0; + } + return 0; +} + +} |