/*************************************************************************** ksprojectxml.cpp ------------------- begin : Sun Feb 13 2000 copyright : (C) 2000 by Kamil Dobkowski email : kamildobk@friko.onet.pl ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "ksprojectxml.h" #include "ksmatrix.h" #include "widgets/qsconsole.h" #include "widgets/qsaxis.h" #include "widgets/qsaxes2d.h" #include "widgets/qsaxes3d.h" #include "widgets/qsplot.h" #include "widgets/qscurve.h" #include "widgets/qsimage.h" #include "widgets/qscontour.h" #include "widgets/qssurface.h" #include "widgets/qsfigure.h" #include "widgets/qsclegend.h" #include "formula/mpformula.h" #include "ksdatasymbolfactory.h" #include "qscobjects.h" #include "ksglobalmatrixlist.h" #include "ksworkbook.h" #include "kmatplotshell.h" #include #include #include #include #include #include #include // // Funkcja do zapisywania stringow // typedef QMap attribute_names; #define MIMETYPE "application/x-kmatplot" // some tag-name ( not all ) #define KMATPLOT "kmatplot" #define CANVAS "canvas" #define PAGE "page" #define AXES2D "axes2d" #define AXES3D "axes3d" #define CURVE "curve" #define IMAGE "image" #define CONTOUR "contour" #define GCONTOUR "gridded-contour" #define NGCONTOUR "non-gridded-contour" #define SURFACE "surface" #define FIGURE "figure" #define KMATPLOT "kmatplot" #define CANVAS "canvas" #define PAGE "page" // reading // writing: class ksprojectxml_runtime_data : public QXmlDefaultHandler { public: ksprojectxml_runtime_data(); ~ksprojectxml_runtime_data(); QFile *f; KSWorkbook *workbook; KMatplotShell *shell; ///////////////////////////////// reading //////////////////////////////////////////////// enum ParserState { ParseKMatplot, ParseCanvas, ParseSheets, ParseSheet, ParsePage, ParseAxes2d, ParseAxes3d, ParseAxis, ParseAxesBackground, ParseAxesTitle, ParseMatrix, ParseMatrixRef, ParseMatrixColRef, ParseMatrixString, ParseMatrixFormula, ParseCurve, ParseImage, ParseContour, ParseSurface, ParseFigure, ParseGradient, ParseCLegend, ParseCLabel, ParseCArrow, ParseCRect, ParseCGroup }; QValueStack parser_state; QString chars; QString error_string; void set_error_string( const QString& string ); int initial_sheets; QSPage *curr_page; KSSheet *curr_sheet; QSAxes *curr_axes; QSAxis *curr_axis; QSPlot *curr_plot; QSCurve *curr_curve; QSImage *curr_image; QSContour *curr_contour; QSSurface *curr_surface; QSFigure *curr_figure; QSMatrix *curr_matrix; int curr_row; QSGFill curr_gradient_fill[5]; int curr_gradient_type; QSCLegend *curr_clegend; QSCLabel *curr_clabel; QSCArrow *curr_carrow; QSCRect *curr_crect; QValueStack curr_cgroup; QSAxes2D *curr_axes2d; QSAxes3D *curr_axes3d; virtual bool startDocument(); virtual bool startElement( const QString&, const QString&, const QString&, const QXmlAttributes& ); virtual bool endElement( const QString&, const QString&, const QString& ); virtual bool characters( const QString& ch ); virtual bool endDocument(); virtual bool warning ( const QXmlParseException & exception ); virtual bool error ( const QXmlParseException & exception ); virtual bool fatalError ( const QXmlParseException & exception ); bool read_sheets_stag( const QString& name, const QXmlAttributes& attr ); bool read_sheet_stag( const QString& name, const QXmlAttributes& attr ); bool read_kmatplot_stag( const QString& name, const QXmlAttributes& attr ); bool read_canvas_stag( const QString& name, const QXmlAttributes& attr ); bool read_page_stag( const QString& name, const QXmlAttributes& attr ); bool read_axis_background_stag( const QString& name, const QXmlAttributes& attr ); bool read_axis_title_stag( const QString& name, const QXmlAttributes& attr ); bool read_axis_stag( const QString& name, const QXmlAttributes& attr ); bool read_curve_stag( const QString& name, const QXmlAttributes& attr ); bool read_image_stag( const QString& name, const QXmlAttributes& attr ); bool read_contour_stag( const QString& name, const QXmlAttributes& attr ); bool read_surface_stag( const QString& name, const QXmlAttributes& attr ); bool read_figure_stag( const QString& name, const QXmlAttributes& attr ); bool read_gradient_stag( const QString& name, const QXmlAttributes& attr ); bool read_axes_2d_stag( const QString& name, const QXmlAttributes& attr ); bool read_axes_3d_stag( const QString& name, const QXmlAttributes& attr ); bool read_clegend_stag( const QString& name, const QXmlAttributes& attr ); bool read_clabel_stag( const QString& name, const QXmlAttributes& attr ); bool read_carrow_stag( const QString& name, const QXmlAttributes& attr ); bool read_crect_stag( const QString& name, const QXmlAttributes& attr ); bool read_cgroup_stag( const QString& name, const QXmlAttributes& attr ); bool read_cobject_stag( QSCObject *object, const QString& name, const QXmlAttributes& attr ); bool read_some_object_stag( QSCObjectCollection *collection, const QString& name, const QXmlAttributes& attr ); bool read_matrix_stag( const QString& name, const QXmlAttributes& attr ); bool read_matrix_ref_stag( const QString& name, const QXmlAttributes& attr ); bool read_matrix_col_ref_stag( const QString& name, const QXmlAttributes& attr ); bool read_matrix_string_stag( const QString& name, const QXmlAttributes& attr ); bool read_matrix_formula_stag( const QString& name, const QXmlAttributes& attr ); bool read_sheets_etag( const QString& name ); bool read_sheet_etag( const QString& name ); bool read_kmatplot_etag( const QString& name ); bool read_canvas_etag( const QString& name ); bool read_page_etag( const QString& name ); bool read_axis_background_etag( const QString& name ); bool read_axis_title_etag( const QString& name ); bool read_axis_etag( const QString& name ); bool read_curve_etag( const QString& name ); bool read_image_etag( const QString& name ); bool read_contour_etag( const QString& name ); bool read_surface_etag( const QString& name ); bool read_figure_etag( const QString& name ); bool read_gradient_etag( const QString& name ); bool read_clegend_etag( const QString& name ); bool read_clabel_etag( const QString& name ); bool read_carrow_etag( const QString& name ); bool read_crect_etag( const QString& name ); bool read_axes_2d_etag( const QString& name ); bool read_axes_3d_etag( const QString& name ); bool read_cgroup_etag( const QString& name ); bool read_matrix_etag( const QString& name ); bool read_matrix_ref_etag( const QString& name ); bool read_matrix_col_ref_etag( const QString& name ); bool read_matrix_string_etag( const QString& name ); bool read_matrix_formula_etag( const QString& name ); bool read_axes( QSAxes *a, const QString& name, const QXmlAttributes& attr ); bool read_plot( QSPlot *p, const QString& name, const QXmlAttributes& attr ); bool read_plot_3d( QSPlot3D *p, const QString& name, const QXmlAttributes& attr ); bool read_base( QSGraphicalData *b, const QString& name, const QXmlAttributes& attr ); bool read_data( QSData *d, const QString& name, const QXmlAttributes& attr ); QSPt2 read_pt2( const QXmlAttributes& attr ); QSPt3 read_pt3( const QXmlAttributes& attr ); QSPt3f read_pt3f( const QXmlAttributes& attr ); QSGFill read_fill( const QXmlAttributes& attr ); QSGLine read_line( const QXmlAttributes& attr ); QSGFont read_font( const QXmlAttributes& attr ); QSGArrow read_arrow( const QXmlAttributes& attr ); QSGPoint read_point( const QXmlAttributes& attr ); int element_number( const QXmlAttributes& attr ); int sheet_number( int sheet ) { return sheet+initial_sheets; } void create_matrix( QSData *d, const QString& name, const QXmlAttributes& attr ); QSAxes *cobject_parent_axes( const QXmlAttributes& attr ); QObject *cobject_parent( const QXmlAttributes& attr ); void cobject_set_default_axes( QSCObject *object, const QXmlAttributes& attr ); bool remove_default_axes( QSAxes *axes ); ///////////////////////////////// writing //////////////////////////////////////////////// int indent; void xml( const QString& line ); void write_data( QSData *data ); void write_base( QSGraphicalData *base ); void write_axes( QSAxes *axes ); void write_dataset( QSPlot *plot, int stack_order ); void write_plot_3d( QSPlot3D *plot_3d ); void write_some_object( QSCObject *object ); void write_object( QSCObject *object ); void write_group( QSCGroup *object ); void write_matrix( QSMatrix *m, int channel_nr ); void write_line( const QSGLine& l, int element ); void write_fill( const QSGFill& f, int element ); void write_font( const QSGFont& f, int element ); void write_point( const QSGPoint& p, int element ); void write_arrow( const QSGArrow& a, int element ); void write_point( const QSPt3f& p, const QString& name ); void write_point( const QSPt3& p, const QString& name ); void write_point( const QSPt2& p, const QString& name ); void write_gradient( const QSGGradient& g ); void write_global_matrix_list( KSSheetList *sheets ); void write_global_matrix( int sheetNumber ); //////////////////////// utilities ////////////////////////////////////////////////// attribute_names etype; attribute_names page_size; attribute_names orientation; attribute_names line_style; attribute_names fill_style; attribute_names point_style; attribute_names point_fill_style; attribute_names arrow_style; attribute_names axis_scale; attribute_names axis_type; attribute_names series_type; attribute_names gradient_type; attribute_names column_type; QString xml_from_string( QString text ); QString xml_to_string( QString text ); QString get_attr_name( attribute_names& attr, int value ); int get_attr_value( attribute_names& attr, const QString& name ); }; //-----------------------------------------------------------// KSProjectXML::KSProjectXML( KMatplotShell *shell ) { m_shell = shell; d = NULL; } //-----------------------------------------------------------// KSProjectXML::~KSProjectXML() { free_runtime_data(); } //-----------------------------------------------------------// void KSProjectXML::alloc_runtime_data() { d = new ksprojectxml_runtime_data(); d->shell = m_shell; d->workbook = m_shell->workbook(); d->initial_sheets = m_shell->workbook()->sheets()->childCount(); } //-----------------------------------------------------------// void KSProjectXML::free_runtime_data() { delete d; d = NULL; } //-----------------------------------------------------------// ksprojectxml_runtime_data::ksprojectxml_runtime_data() { indent = 0; page_size.insert( "A4", QPrinter::A4 ); page_size.insert( "B5", QPrinter::B5 ); page_size.insert( "Letter", QPrinter::Letter ); page_size.insert( "Legal", QPrinter::Legal ); page_size.insert( "Executive", QPrinter::Executive ); page_size.insert( "A0", QPrinter::A0 ); page_size.insert( "A1", QPrinter::A1 ); page_size.insert( "A2", QPrinter::A2 ); page_size.insert( "A3", QPrinter::A3 ); page_size.insert( "A5", QPrinter::A5 ); page_size.insert( "A6", QPrinter::A6 ); page_size.insert( "A7", QPrinter::A7 ); page_size.insert( "A8", QPrinter::A8 ); page_size.insert( "A9", QPrinter::A9 ); page_size.insert( "B0", QPrinter::B0 ); page_size.insert( "B1", QPrinter::B1 ); page_size.insert( "B10", QPrinter::B10 ); page_size.insert( "B2", QPrinter::B2 ); page_size.insert( "B3", QPrinter::B3 ); page_size.insert( "B4", QPrinter::B4 ); page_size.insert( "B6", QPrinter::B6 ); page_size.insert( "B7", QPrinter::B7 ); page_size.insert( "B8", QPrinter::B8 ); page_size.insert( "B9", QPrinter::B9 ); page_size.insert( "C5E", QPrinter::C5E ); page_size.insert( "Comm10E", QPrinter::Comm10E ); page_size.insert( "DLE", QPrinter::DLE ); page_size.insert( "Folio", QPrinter::Folio ); page_size.insert( "Ledger", QPrinter::Ledger ); page_size.insert( "Tabloid", QPrinter::Tabloid ); page_size.insert( "NPageSize", QPrinter::NPageSize ); orientation.insert( "Portrait", QPrinter::Portrait ); orientation.insert( "Landscape", QPrinter::Landscape ); etype.insert( "double", EDouble ); etype.insert( "float", EFloat ); etype.insert( "long", ELong ); etype.insert( "unsigned short", EUShort ); etype.insert( "short", EShort ); etype.insert( "unsigned char", EUChar ); fill_style.insert( "transparent", QSGFill::Transparent ); fill_style.insert( "solid", QSGFill::Solid ); fill_style.insert( "hlines", QSGFill::Horiz ); fill_style.insert( "vlines", QSGFill::Vert ); fill_style.insert( "crossing", QSGFill::Cross ); fill_style.insert( "fdiag", QSGFill::BDiag ); fill_style.insert( "bdiag", QSGFill::FDiag ); fill_style.insert( "diagcross", QSGFill::DiagCross ); fill_style.insert( "half", QSGFill::Half ); line_style.insert( "invisible", QSGLine::Invisible ); line_style.insert( "solid", QSGLine::Solid ); line_style.insert( "dash", QSGLine::Dash ); line_style.insert( "dash-dot", QSGLine::DashDot ); line_style.insert( "dot", QSGLine::Dot ); line_style.insert( "dash-dot-dot", QSGLine::DashDotDot ); point_style.insert( "invisible", QSGPoint::Invisible ); point_style.insert( "circle", QSGPoint::Circle ); point_style.insert( "rectangle", QSGPoint::Rect ); point_style.insert( "triangle", QSGPoint::Triangle ); point_style.insert( "diamond", QSGPoint::Diamond ); point_style.insert( "cross", QSGPoint::Cross ); point_style.insert( "plus", QSGPoint::Plus ); point_style.insert( "hline", QSGPoint::HLine ); point_style.insert( "vline", QSGPoint::VLine ); point_fill_style.insert( "transparent", QSGPoint::Transparent ); point_fill_style.insert( "opaque", QSGPoint::Opaque ); point_fill_style.insert( "filled", QSGPoint::Filled ); arrow_style.insert( "none", QSGArrow::None ); arrow_style.insert( "normal", QSGArrow::Arrow ); arrow_style.insert( "filled", QSGArrow::FArrow ); arrow_style.insert( "narrow", QSGArrow::NArrow ); arrow_style.insert( "reversed", QSGArrow::RArrow ); arrow_style.insert( "reversed-filled", QSGArrow::RFArrow ); arrow_style.insert( "reversed-narrow", QSGArrow::RNArrow ); arrow_style.insert( "rectangle", QSGArrow::Rect ); arrow_style.insert( "diamond", QSGArrow::Diamond ); arrow_style.insert( "circle", QSGArrow::Circle ); arrow_style.insert( "line", QSGArrow::Line ); arrow_style.insert( "fdiag", QSGArrow::FDiagLine ); arrow_style.insert( "bdiag", QSGArrow::BDiagLine ); axis_type.insert( "X", QSAxis::XAxisType ); axis_type.insert( "Y", QSAxis::YAxisType ); axis_type.insert( "Z", QSAxis::ZAxisType ); axis_type.insert( "V", QSAxis::VAxisType ); axis_type.insert( "?", QSAxis::UnknownAxisType ); axis_scale.insert( "linear", QSAxis::LinearScale ); axis_scale.insert( "log", QSAxis::LogScale ); series_type.insert( "lines", QSCurve::Lines ); series_type.insert( "area", QSCurve::Area ); series_type.insert( "ribbon", QSCurve::Ribbon ); series_type.insert( "bars", QSCurve::Bars ); series_type.insert( "vectors", QSCurve::Vectors ); series_type.insert( "flux", QSCurve::Flux ); series_type.insert( "rectangles", QSCurve::Rectangles ); series_type.insert( "ellipses", QSCurve::Ellipses ); series_type.insert( "left-stairs", QSCurve::LeftStairs ); series_type.insert( "middle-stairs", QSCurve::MiddleStairs ); series_type.insert( "right-stairs", QSCurve::RightStairs ); gradient_type.insert( "default", QSGGradient::GDefault ); gradient_type.insert( "gray", QSGGradient::GGray ); gradient_type.insert( "strange", QSGGradient::GStrange ); gradient_type.insert( "two-colors", QSGGradient::GTwoColors ); gradient_type.insert( "five-colors", QSGGradient::GFiveColors ); column_type.insert("unknown",KSSheet::ColumnUnknown ); column_type.insert("x",KSSheet::ColumnX ); column_type.insert("y",KSSheet::ColumnY ); column_type.insert("z",KSSheet::ColumnZ ); column_type.insert("v",KSSheet::ColumnV ); column_type.insert("dx",KSSheet::ColumnDX ); column_type.insert("dy",KSSheet::ColumnDY ); } //-----------------------------------------------------------// ksprojectxml_runtime_data::~ksprojectxml_runtime_data() { } //-----------------------------------------------------------// int ksprojectxml_runtime_data::get_attr_value( attribute_names& attr, const QString& name ) { if ( attr.contains(name) ) return attr[name]; return attr.begin().data(); } //-----------------------------------------------------------// QString ksprojectxml_runtime_data::get_attr_name( attribute_names& attr, int value ) { attribute_names::Iterator it; for( it = attr.begin(); it != attr.end(); it++ ) { if ( it.data() == value ) return it.key(); } return attr.begin().key(); } //-----------------------------------------------------------// //-----------------------------------------------------------// //-----------------------------------------------------------// //-----------------------------------------------------------// //-----------------------------------------------------------// bool KSProjectXML::saveToFile( QFile& f ) { QString l; //os.precision(9); //os.setEncoding( QTextStream::UnicodeUTF8 ); alloc_runtime_data(); d->f = &f; // write header xml( "" ); xml( "" ); xml( "" ); d->indent++; // write canvas header l = ""; l = l.arg( d->get_attr_name( d->page_size, d->workbook->printer()->pageSize()) ); l = l.arg( d->get_attr_name( d->orientation, d->workbook->printer()->orientation()) ); l = l.arg( 72.0 ); xml( l ); d->indent++; // write sheets d->write_global_matrix_list( m_shell->workbook()->sheets() ); for( int page_nr=0; page_nrworkbook->pageCount(); page_nr++ ) { d->curr_page = d->workbook->page(page_nr); l = ""; l = l.arg( page_nr ); l = l.arg( d->xml_from_string(d->curr_page->title()) ); xml( l ); d->indent++; // write objects for( int object_nr=0; object_nrcurr_page->objects()->count(); object_nr++ ) { d->write_some_object( d->curr_page->objects()->object(object_nr) ); } d->indent--; xml(""); } d->indent--; xml(""); d->indent--; xml( ""); free_runtime_data(); return true; } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_global_matrix_list( KSSheetList *sheets ) { QString l = ""; l = l.arg( sheets->childCount() ); xml( l ); indent++; for( int sheet_nr=0; sheet_nrchildCount(); sheet_nr++ ) { write_global_matrix( sheet_nr ); } indent--; xml(""); // no write_data } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_global_matrix( int sheetNumber ) { KSSheet *sheet = workbook->sheets()->child(sheetNumber); QString l = ""; l = l.arg( sheetNumber ); l = l.arg( sheet->objectName() ); xml( l ); indent++; // write column types const KSSheet::ColumnInfo *columns = sheet->columnInfo(); KSSheet::ColumnInfo::ConstIterator curr_col; for( curr_col = columns->begin(); curr_col != columns->end(); ++curr_col ) { l = ""; l = l.arg( curr_col.key() ); l = l.arg( xml_from_string(curr_col.data().title) ); l = l.arg( get_attr_name(column_type,curr_col.data().type) ); xml(l); } write_data( sheet ); indent--; xml(""); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_axes( QSAxes *axes ) { QString l; QSAxes2D *axes_2d = dynamic_cast(axes); QSAxes3D *axes_3d = dynamic_cast(axes); QString type = axes_2d ? AXES2D : AXES3D; // position and type l = "<%1>"; l = l.arg( type ); xml( l ); indent++; // area l = ""; l = l.arg(axes->posMM().x); l = l.arg(axes->posMM().y); l = l.arg(axes->sizeMM().x); l = l.arg(axes->sizeMM().y); xml( l ); // draw in background l = ""; l = l.arg( axes->drawInBackground() ); xml( l ); // title xml( ""); indent++; indent--; xml( ""); // background xml(""); indent++; write_fill( axes->background(), -1 ); indent--; xml(""); // write 2d axes properties if ( axes_2d ) { l = ""; l = l.arg( axes_2d->frameWidth() ); xml( l ); } // write 3d axes if ( axes_3d ) { // OpenGL l = ""; l = l.arg( axes_3d->openGL() ); l = l.arg( axes_3d->glTransparency() ); l = l.arg( axes_3d->glGlobalTransparency() ); l = l.arg( axes_3d->glShadeWalls() ); l = l.arg( axes_3d->glMeshAutoStroke() ); l = l.arg( axes_3d->glAutoStrokeLightness() ); xml( l ); // walls l = ""; l = l.arg( axes_3d->xyWallThickness() ); l = l.arg( axes_3d->xzWallThickness() ); l = l.arg( axes_3d->yzWallThickness() ); xml( l ); // edges l = ""; l = l.arg( axes_3d->xEdgeLength() ); l = l.arg( axes_3d->yEdgeLength() ); l = l.arg( axes_3d->zEdgeLength() ); xml( l ); // viewpoint l = ""; l = l.arg( axes_3d->azimuth() ); l = l.arg( axes_3d->elevation() ); l = l.arg( axes_3d->distance() ); xml( l ); // light l = ""; l = l.arg( axes_3d->light() ); l = l.arg( axes_3d->lightAzimuth() ); l = l.arg( axes_3d->lightElevation() ); l = l.arg( axes_3d->ambientLight() ); l = l.arg( axes_3d->directLight() ); xml( l ); // projection l = ""; l = l.arg( axes_3d->perspective() ); l = l.arg( axes_3d->focusDistance() ); xml( l ); //autoscale l = ""; l = l.arg( axes_3d->autoscale() ); xml( l ); } // axes for( int axis_nr=0; axis_nraxisCount(); axis_nr++ ) { QSAxis *axis = axes->axis(axis_nr); l = ""; l = l.arg( get_attr_name( axis_type, axis->type() ) ); l = l.arg( axis->visible() ); l = l.arg( axis->scrollable() ); xml( l ); indent++; write_arrow( axis->arrow1(), 1 ); write_arrow( axis->arrow2(), 2 ); l = ""; l = l.arg( axis->position() ); l = l.arg( axis->defaultPosition() ); l = l.arg( axis->oppositePosition() ); xml( l ); l = ""; l = l.arg( axis->min() ); l = l.arg( axis->max() ); l = l.arg( axis->roundRangeToTicStep() ); xml( l ); l = ""; l = l.arg( get_attr_name(axis_scale,axis->scaleType()) ); l = l.arg( axis->scaleBase() ); l = l.arg( axis->reversed() ); xml( l ); l = ""; l = l.arg( axis->majorGridStep() ); l = l.arg( axis->minorGridStep() ); xml( l ); l = ""; l = l.arg( xml_from_string(axis->ticsFormat()) ); l = l.arg( axis->ticsVisible() ); l = l.arg( axis->ticsOuter() ); l = l.arg( axis->ticsAngle() ); l = l.arg( axis->ticLabelPos1() ); l = l.arg( axis->ticLabelPos2() ); xml( l ); l = ""; l = l.arg( axis->titlePosition() ); l = l.arg( axis->titleDistance() ); xml( l ); for( int i=0; i<3; i++ ) { l = ""; l = l.arg( i ); l = l.arg( axis->rememberedViews[i].min ); l = l.arg( axis->rememberedViews[i].max ); l = l.arg( get_attr_name(axis_scale,axis->rememberedViews[i].scale) ); l = l.arg( axis->rememberedViews[i].base ); l = l.arg( axis->rememberedViews[i].reversed ); l = l.arg( axis->rememberedViews[i].round ); xml( l ); } write_base( axis ); indent--; xml(""); } // write base object write_base( axes ); // write datasets for( int dataset_nr=0; dataset_nrplotCount(); dataset_nr++ ) { write_dataset( axes->plot(dataset_nr), dataset_nr ); } // write group object write_group( axes->shadowObject() ); indent--; l = ""; l = l.arg( type ); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_dataset( QSPlot *plot, int stack_order ) { QString l; QString type; QSCurve *cr = dynamic_cast(plot); QSImage *im = dynamic_cast(plot); QSContour *ct = dynamic_cast(plot); QSSurface *sf = dynamic_cast(plot); QSFigure *fg = dynamic_cast(plot); QSGriddedContour *gct = dynamic_cast(plot); QSNonGriddedContour *ngct = dynamic_cast(plot); if ( cr ) type = CURVE; else if ( im ) type = IMAGE; else if ( gct ) type = GCONTOUR; else if ( ngct ) type = NGCONTOUR; else if ( sf ) type = SURFACE; else if ( fg ) type = FIGURE; else type = "unknown"; l = "<%1 stack-order='%2'>"; l = l.arg( type ); l = l.arg( stack_order ); xml( l ); indent++; // legend item l = ""; l = l.arg( plot->legendItemVisible() ); xml( l ); // default axes l = ""; l = l.arg( plot->parentAxes()->axisIndex(plot->defaultAxis(QSAxis::XAxisType)) ); l = l.arg( plot->parentAxes()->axisIndex(plot->defaultAxis(QSAxis::YAxisType)) ); l = l.arg( plot->parentAxes()->axisIndex(plot->defaultAxis(QSAxis::ZAxisType)) ); l = l.arg( plot->parentAxes()->axisIndex(plot->defaultAxis(QSAxis::VAxisType)) ); xml( l ); // gradient write_gradient( plot->gradient() ); // curve if ( cr ) { l = ""; l = l.arg( get_attr_name(series_type,cr->type()) ); xml( l ); l = ""; l = l.arg( cr->fixedDelta().x ); l = l.arg( cr->fixedDelta().y ); l = l.arg( cr->percentDelta().x ); l = l.arg( cr->percentDelta().y ); xml( l ); l = ""; l = l.arg( cr->zeroPoint().x ); l = l.arg( cr->zeroPoint().y ); xml( l ); write_arrow( cr->arrow1(), 1 ); write_arrow( cr->arrow2(), 2 ); } else // image if ( im ) { l = ""; l = l.arg( im->rawMode() ); xml( l ); l = ""; l = l.arg( im->useGradient() ); xml( l );; } else // contour if ( ct ) { l = ""; l = l.arg( ct->contourFills() ); xml( l ); l = ""; l = l.arg( ct->contourLines() ); xml( l ); l = ""; l = l.arg( ct->contourLabels() ); l = l.arg( ct->labelSpacing() ); xml( l ); } else // surface if ( sf ) { l = ""; l = l.arg( sf->xGridStep() ); l = l.arg( sf->yGridStep() ); xml( l ); write_plot_3d( sf ); } else // figure if ( fg ) { l = ""; l = l.arg( fg->vertexCompareAccuracy() ); xml( l ); write_plot_3d( fg ); } write_base( plot ); indent--; l = ""; l = l.arg( type ); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_plot_3d( QSPlot3D *plot_3d ) { QString l; //autodivide l = ""; l = l.arg( plot_3d->autoDivide() ); xml( l ); // colored l = ""; l = l.arg( plot_3d->colored() ); xml( l ); // topBottom l = ""; l = l.arg( plot_3d->topBottom() ); xml( l ); l = ""; l = l.arg( plot_3d->edgeAutoColor() ); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_base( QSGraphicalData *base ) { QString l = ""; l = l.arg( xml_from_string(base->title()) ); xml( l ); for( int line_nr=0; line_nr<base->lineCount(); line_nr ++ ) write_line( base->line(line_nr), line_nr ); for( int fill_nr=0; fill_nr<base->fillCount(); fill_nr ++ ) write_fill( base->fill(fill_nr), fill_nr ); for( int font_nr=0; font_nr<base->fontCount(); font_nr ++ ) write_font( base->font(font_nr), font_nr ); for( int point_nr=0; point_nr<base->pointCount(); point_nr ++ ) write_point( base->point(point_nr), point_nr ); write_data( base ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_data( QSData *data ) { for( int channel_nr=0; channel_nr<data->channelCount(); channel_nr++ ) write_matrix( data->matrix(channel_nr), channel_nr ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_gradient( const QSGGradient& g ) { QString l = "<gradient type='%1'>"; l = l.arg( get_attr_name( gradient_type, g.type() ) ); xml( l ); indent++; write_fill( g.fill(0), 0 ); write_fill( g.fill(1), 1 ); write_fill( g.fill(2), 2 ); write_fill( g.fill(3), 3 ); write_fill( g.fill(4), 4 ); indent--; xml("</gradient>"); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_some_object( QSCObject *object ) { QSCLegend *legend = dynamic_cast<QSCLegend *>(object); QSCLabel *label = dynamic_cast<QSCLabel*>(object); QSCArrow *arrow = dynamic_cast<QSCArrow*>(object); QSCRect *rectangle = dynamic_cast<QSCRect*>(object); QSCGroup *group = dynamic_cast<QSCGroup*>(object); QString l; // axes if ( object->isAxesShadow() ) { write_axes( object->parentAxes() ); } // legend else if ( legend ) { xml( "<legend>" ); indent++; l = "<align frame='%1'/>"; l = l.arg( legend->align() ); xml( l ); l = "<format columns='%1'/>"; l = l.arg( legend->columns() ); xml( l ); write_point( legend->pos(), "pos" ); write_point( legend->coord(), "coord-system" ); write_point( legend->shadowPos(), "shadow-shift" ); write_font( legend->font(), 1 ); write_fill( legend->fill(), 1 ); write_line( legend->frame(), 1 ); write_fill( legend->shadowFill(), 2 ); write_object( legend ); indent--; xml( "</legend>" ); } // label else if ( label ) { xml( "<label>" ); indent++; l = "<text>%1</text>"; l = l.arg( xml_from_string(label->text()) ); xml( l ); l = "<angle deg='%1'/>"; l = l.arg( label->angle() ); xml( l ); l = "<align text='%1' frame='%2'/>"; l = l.arg( label->textAlign() ); l = l.arg( label->frameAlign() ); xml( l ); write_point( label->pos(), "pos" ); write_point( label->coord(), "coord-system" ); write_point( label->shadowPos(), "shadow-shift" ); write_font( label->font(), 1 ); write_fill( label->fill(), 1 ); write_line( label->frame(), 1 ); write_fill( label->shadowFill(), 2 ); write_object( label ); indent--; xml( "</label>" ); } // arrow else if ( arrow ) { xml( "<arrow>" ); indent++; write_point( arrow->originPos(), "begin" ); write_point( arrow->endPos(), "end" ); write_point( arrow->originCoord(), "coord-system-begin" ); write_point( arrow->endCoord(), "coord-system-end" ); write_line( arrow->line(), 1 ); write_arrow( arrow->originArrow(), 1 ); write_arrow( arrow->endArrow(), 2 ); write_point( arrow->originPoint(), 1 ); write_point( arrow->endPoint(), 2 ); write_object( arrow ); indent--; xml( "</arrow>" ); } // rectangle else if ( rectangle ) { xml( "<rectangle>" ); indent++; l = "<type ellipse='%1'/>"; l = l.arg( rectangle->ellipse() ); xml( l ); write_point( rectangle->originPos(), "begin" ); write_point( rectangle->endPos(), "end" ); write_point( rectangle->originCoord(), "coord-system-begin" ); write_point( rectangle->endCoord(), "coord-system-end" ); write_point( rectangle->shadowPos(), "shadow-shift" ); write_fill( rectangle->fill(), 1 ); write_line( rectangle->frame(), 1 ); write_fill( rectangle->shadowFill(), 2 ); write_object( rectangle ); indent--; xml("</rectangle>"); } // group else if ( group ) { xml( "<group>" ); indent++; write_group( group ); indent--; xml( "</group>" ); } } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_object( QSCObject *object ) { QString l = "<axes-bindings x-axis='%1' y-axis='%2' z-axis='%3'/>"; l = l.arg( object->defaultXAxis() ); l = l.arg( object->defaultYAxis() ); l = l.arg( object->defaultZAxis() ); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_group( QSCGroup *group ) { for ( int i=0; i<group->objects()->count(); i++ ) { write_some_object( group->objects()->object(i) ); } } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_line( const QSGLine& line, int element ) { QString l = "<line element-number='%1' style='%2' width='%3' color='%4'/>"; l = l.arg(element); l = l.arg(get_attr_name(line_style,line.style)); l = l.arg(line.width); l = l.arg(toQString(line.color)); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_fill( const QSGFill& f, int element ) { QString l = "<fill element-number='%1' style='%2' color='%3'/>"; l = l.arg(element); l = l.arg(get_attr_name(fill_style,f.style)); l = l.arg(toQString(f.color)); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_font( const QSGFont& f, int element ) { QString l = "<font element-number='%1' family='%2' size='%3' bold='%4' italic='%5' color='%6'/>"; l = l.arg(element); l = l.arg(f.family); l = l.arg(f.size); l = l.arg(f.bold); l = l.arg(f.italic); l = l.arg(toQString(f.color)); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_point( const QSGPoint& p, int element ) { QString l = "<point element-number='%1' style='%2' fill='%3' size='%4' color='%5'/>"; l = l.arg(element); l = l.arg(get_attr_name(point_style,p.style)); l = l.arg(get_attr_name(point_fill_style,p.fill)); l = l.arg(p.size); l = l.arg(toQString(p.color)); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_arrow( const QSGArrow& a, int element ) { QString l = "<dart element-number='%1' style='%2' size='%3' />"; l = l.arg(element); l = l.arg(get_attr_name(arrow_style,a.style)); l = l.arg(a.size); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_point( const QSPt3f& p, const QString& name ) { QString l = "<%1 x='%2' y='%3' z='%4'/>"; l = l.arg( name ); l = l.arg( p.x ); l = l.arg( p.y ); l = l.arg( p.z ); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_point( const QSPt3& p, const QString& name ) { QString l = "<%1 x='%2' y='%3' z='%4'/>"; l = l.arg( name ); l = l.arg( p.x ); l = l.arg( p.y ); l = l.arg( p.z ); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_point( const QSPt2& p, const QString& name ) { QString l = "<%1 x='%2' y='%3'/>"; l = l.arg( name ); l = l.arg( p.x ); l = l.arg( p.y ); xml( l ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::write_matrix( QSMatrix *m, int channel ) { if ( m == NULL ) return; KSMatrix *ks_matrix = dynamic_cast<KSMatrix *>(m); KSMatrixString *ks_matrix_string = dynamic_cast<KSMatrixString *>(m); KSMatrixFormula *ks_matrix_formula = dynamic_cast<KSMatrixFormula *>(m); KSMatrixWorksheetCellRange *ks_matrix_ref = dynamic_cast<KSMatrixWorksheetCellRange *>(m); // Write subclass shell if ( ks_matrix ) { QString l = "<matrix title='%1' rows='%2' cols='%3' element-type='%4' data-channel='%5'>"; l = l.arg( xml_from_string(ks_matrix->name()) ); l = l.arg( ks_matrix->rows() ); l = l.arg( ks_matrix->cols() ); l = l.arg( get_attr_name(etype,ks_matrix->type()) ); l = l.arg( channel ); xml( l ); indent++; QCString e; for( int row=0;row<ks_matrix->rows();row++ ) { for( int i=0; i<indent; i++ ) f->putch( '\t' ); f->writeBlock("<row>",5); for( int col=0;col<ks_matrix->cols();col++ ) { e.sprintf("%.9g ",ks_matrix->value(row,col)); f->writeBlock( e.data(), e.size()-1 ); } f->writeBlock("</row>",6); f->putch( '\n' ); } indent--; xml("</matrix>"); } else if ( ks_matrix_ref ) { // don't write ref channel as it is always 0 QString l = "<matrixref title='%1' sheet='%1' row-from='%2' row-step='%3' row-to='%4' col-from='%5' col-step='%6' col-to='%7' transposition='%8' data-channel='%9'/>"; l = l.arg( xml_from_string(ks_matrix_ref->name()) ); l = l.arg( ks_matrix_ref->worksheet() ); l = l.arg( ks_matrix_ref->rowFrom() ); l = l.arg( ks_matrix_ref->rowStep() ); l = l.arg( ks_matrix_ref->rowTo() ); l = l.arg( ks_matrix_ref->colFrom() ); l = l.arg( ks_matrix_ref->colStep() ); l = l.arg( ks_matrix_ref->colTo() ); l = l.arg( ks_matrix_ref->transposition() ); l = l.arg( channel ); xml( l ); } else if ( ks_matrix_string ) { QString l = "<matrix-string title='%1' rows='%2' cols='%3' data-channel='%4'>"; l = l.arg( xml_from_string(ks_matrix_string->name()) ); l = l.arg( ks_matrix_string->rows() ); l = l.arg( ks_matrix_string->cols() ); l = l.arg( channel ); xml( l ); indent++; for( int row=0;row<ks_matrix_string->rows();row++ ) for( int col=0;col<ks_matrix_string->cols();col++ ) if ( !ks_matrix_string->string(row,col).isEmpty() ) { l = "<e row='%1' col='%2' string='%3'/>"; l = l.arg( row ); l = l.arg( col ); l = l.arg( xml_from_string(ks_matrix_string->string(row,col)) ); xml( l ); } indent--; xml( "</matrix-string>" ); } else if ( ks_matrix_formula ) { QString l = "<matrix-formula title='%1' formula='%2' transposition='%3' data-channel='%4'/>"; l = l.arg( xml_from_string(ks_matrix_formula->name()) ); l = l.arg( xml_from_string(ks_matrix_formula->formula()) ); l = l.arg( ks_matrix_formula->transposition() ); l = l.arg( channel ); xml( l ); } } //-----------------------------------------------------------// void ksprojectxml_runtime_data::xml( const QString& line ) { assert( indent >= 0 ); for ( int i=0; i<indent; i++ ) f->putch( '\t' ); QCString chars = line.utf8(); f->writeBlock( chars.data(), chars.size()-1 ); f->putch( '\n' ); //(*s) << line << endl; } //-----------------------------------------------------------// void KSProjectXML::xml( const QString& line ) { d->xml( line ); } //-----------------------------------------------------------// QString ksprojectxml_runtime_data::xml_from_string( QString text ) { text.replace( QRegExp("&"), "&" ); text.replace( QRegExp("'"), "'" ); text.replace( QRegExp(">"), ">" ); text.replace( QRegExp("<"), "<" ); text.replace( QRegExp("\""), """ ); text.replace( QRegExp("\n"), " " ); return text; } //-----------------------------------------------------------// QString ksprojectxml_runtime_data::xml_to_string( QString text ) { text.replace( QRegExp("\\&"), "&" ); text.replace( QRegExp("\\'"), "'" ); text.replace( QRegExp("\\>"), ">" ); text.replace( QRegExp("\\<"), "<" ); text.replace( QRegExp("\\""), "\"" ); text.replace( QRegExp(" "), "\n" ); return text; } //-----------------------------------------------------------// //-----------------------------------------------------------// //-----------------------------------------------------------// //-----------------------------------------------------------// bool KSProjectXML::loadFromFile( QFile& f ) { m_shell->workbook()->commandHistory()->clear(); alloc_runtime_data(); d->f = &f; QXmlInputSource src( f ); QXmlSimpleReader reader; reader.setContentHandler( d ); reader.setErrorHandler( d ); bool result = reader.parse( src ); free_runtime_data(); return result; } //-----------------------------------------------------------// void ksprojectxml_runtime_data::set_error_string( const QString& string ) { error_string += string; //cout << "##################### ERROR: " << string << " ####################" << endl; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::warning ( const QXmlParseException & ) { error_string += QObject::tr("<br/> Warning: ") + errorString(); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::error ( const QXmlParseException & ) { error_string += QObject::tr("<br/> <b>Error:</b> ") + errorString(); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::fatalError ( const QXmlParseException & ) { error_string += QObject::tr("<br/> <b>Fatal error:</b> ") + errorString(); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::startDocument() { parser_state.clear(); parser_state.push( ParseKMatplot ); error_string = QString::null; return TRUE; } //-----------------------------------------------------------// // There is a pair of functions of each object which is loaded !!!! // To add a new object: // - add a new ksprojectxml_runtime_data::ParserState value // - add a new pair of funtions to handle start and end elements. // - add expression to the top level read_?_stag function which starts parsing the given element. // remeber that a begining tag belongs to the higher level read_tag_function // <page number='1'> // <arrow stack-order='1'> // WARNING: read_page_stag - read_page_stag must handle 'arrow' and turn 'ParserState' to 'ParseArrow' // <begin ... // read_arrow_stag // <end ... // read_arrow_stag // </arrow> // read_arrow_etag // bool ksprojectxml_runtime_data::startElement( const QString&, const QString& name, const QString&, const QXmlAttributes& attr ) { // cout << " Start tag " << (const char *)name << endl; bool result = TRUE; switch( parser_state.top() ) { case ParseSheets: result = read_sheets_stag( name, attr ); break; case ParseSheet: result = read_sheet_stag( name, attr ); break; case ParseMatrix: result = read_matrix_stag( name, attr ); break; case ParseMatrixRef: result = read_matrix_ref_stag( name, attr ); break; case ParseMatrixColRef: result = read_matrix_col_ref_stag( name, attr ); break; case ParseMatrixString: result = read_matrix_string_stag( name, attr ); break; case ParseMatrixFormula: result = read_matrix_formula_stag( name, attr ); break; case ParseKMatplot: result = read_kmatplot_stag( name, attr ); break; case ParseCanvas: result = read_canvas_stag( name, attr ); break; case ParsePage: result = read_page_stag( name, attr ); break; case ParseAxes2d: result = read_axes_2d_stag( name, attr ); break; case ParseAxes3d: result = read_axes_3d_stag( name, attr ); break; case ParseAxis: result = read_axis_stag( name, attr ); break; case ParseAxesBackground: result = read_axis_background_stag( name, attr ); break; case ParseAxesTitle: result = read_axis_title_stag( name, attr ); break; case ParseCurve: result = read_curve_stag( name, attr ); break; case ParseImage: result = read_image_stag( name, attr ); break; case ParseContour: result = read_contour_stag( name, attr ); break; case ParseSurface: result = read_surface_stag( name, attr ); break; case ParseFigure: result = read_figure_stag( name, attr ); break; case ParseGradient: result = read_gradient_stag( name, attr ); break; case ParseCLegend: result = read_clegend_stag( name, attr ); break; case ParseCLabel: result = read_clabel_stag( name, attr ); break; case ParseCArrow: result = read_carrow_stag( name, attr ); break; case ParseCRect: result = read_crect_stag( name, attr ); break; case ParseCGroup: result = read_cgroup_stag( name, attr ); break; } chars = QString::null; // cout << " End tag " << (const char *)name << endl; return result; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::endElement( const QString&, const QString& name, const QString& ) { bool result = TRUE; switch( parser_state.top() ) { case ParseSheets: result = read_sheets_etag( name ); break; case ParseSheet: result = read_sheet_etag( name ); break; case ParseMatrix: result = read_matrix_etag( name ); break; case ParseMatrixRef: result = read_matrix_ref_etag( name ); break; case ParseMatrixColRef: result = read_matrix_col_ref_etag( name ); break; case ParseMatrixString: result = read_matrix_string_etag( name ); break; case ParseMatrixFormula: result = read_matrix_formula_etag( name ); break; case ParseKMatplot: result = read_kmatplot_etag( name ); break; case ParseCanvas: result = read_canvas_etag( name ); break; case ParsePage: result = read_page_etag( name ); break; case ParseAxes2d: result = read_axes_2d_etag( name ); break; case ParseAxes3d: result = read_axes_3d_etag( name ); break; case ParseAxis: result = read_axis_etag( name ); break; case ParseAxesBackground: result = read_axis_background_etag( name ); break; case ParseAxesTitle: result = read_axis_title_etag( name ); break; case ParseCurve: result = read_curve_etag( name ); break; case ParseImage: result = read_image_etag( name ); break; case ParseContour: result = read_contour_etag( name ); break; case ParseSurface: result = read_surface_etag( name ); break; case ParseFigure: result = read_figure_etag( name ); break; case ParseGradient: result = read_gradient_etag( name ); break; case ParseCLegend: result = read_clegend_etag( name ); break; case ParseCLabel: result = read_clabel_etag( name ); break; case ParseCArrow: result = read_carrow_etag( name ); break; case ParseCRect: result = read_crect_etag( name ); break; case ParseCGroup: result = read_cgroup_etag( name ); break; } chars = QString::null; return result; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::characters( const QString& new_chars ) { chars += new_chars; return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::endDocument() { shell->refreshSettings(); parser_state.clear(); if ( error_string != QString::null ) QSConsole::write( " XML parser returned :<br/><br/>" + error_string ); // object is auto delete list, so each remaining object // is deleted return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_kmatplot_stag( const QString& name,const QXmlAttributes& attr ) { if ( name == "kmatplot" ) { if ( attr.value("mime") != MIMETYPE ) set_error_string( QObject::tr("<br> <br> KMatplot(XML): Incorrect MIME-TYPE ") ); } else if ( name == "canvas" ) { parser_state.push( ParseCanvas ); QPrinter *p = workbook->printer(); QPrinter::PageSize ps = (QPrinter::PageSize)get_attr_value( page_size, attr.value("page-size") ); QPrinter::Orientation po = (QPrinter::Orientation)get_attr_value( orientation,attr.value("orientation") ); p->setPageSize( ps ); p->setOrientation( po ); workbook->setPrinter( p ); } else { set_error_string( QObject::tr("<br> XML(kmatplot): Unexpected tag: ")+name ); } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_kmatplot_etag( const QString& name ) { if ( name == "kmatplot" ) parser_state.pop(); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_canvas_stag( const QString& name, const QXmlAttributes& attr ) { if ( name == "page" ) { parser_state.push( ParsePage ); curr_page = new QSPage( workbook ); curr_page->setTitle( xml_to_string(attr.value("title")) ); workbook->pageAdd( curr_page ); } else if ( name == "sheets" ) { int sheet_number = attr.value("number").toInt(); for ( int curr_sheet=0; curr_sheet<sheet_number; curr_sheet++ ) { workbook->sheets()->sheetAdd( new KSSheet( workbook->sheets() ) ); } parser_state.push( ParseSheets ); } else { set_error_string( QObject::tr("<br> XML(canvas): Unexpected tag: ")+name); } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_canvas_etag( const QString& name ) { if ( name == "canvas" ) parser_state.pop(); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_sheets_stag( const QString& name, const QXmlAttributes& attr ) { if ( name == "sheet" ) { curr_sheet = workbook->sheets()->child(sheet_number(attr.value("number").toInt())); curr_sheet->setObjectName( attr.value("name") ); parser_state.push( ParseSheet ); } else set_error_string( QObject::tr("<br> XML(sheets): Unexpected tag: ")+name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_sheets_etag( const QString& name ) { if ( name == "sheets" ) parser_state.pop(); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_sheet_stag( const QString& name, const QXmlAttributes& attr ) { if ( name == "column" ) { if ( curr_sheet ) curr_sheet->setColumnData( attr.value("number").toInt(), (KSSheet::ColumnType )get_attr_value(column_type,attr.value("type")), xml_to_string(attr.value("title")) ); } else read_data( curr_sheet, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_sheet_etag( const QString& name ) { if ( name == "sheet" ) { parser_state.pop(); curr_sheet = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_some_object_stag( QSCObjectCollection *collection, const QString& name, const QXmlAttributes& ) { if ( name == AXES2D ) { parser_state.push( ParseAxes2d ); curr_axes = curr_axes2d = new QSAxes2D(); collection->add( curr_axes2d->shadowObject() ); } else if ( name == AXES3D ) { parser_state.push( ParseAxes3d ); curr_axes = curr_axes3d = new QSAxes3D(); collection->add( curr_axes3d->shadowObject() ); } else if ( name == "legend" ) { parser_state.push( ParseCLegend ); curr_clegend = new QSCLegend( NULL ); collection->add( curr_clegend ); } else if ( name == "label" ) { parser_state.push( ParseCLabel ); curr_clabel = new QSCLabel( "" ); collection->add( curr_clabel ); } else if ( name == "arrow" ) { parser_state.push( ParseCArrow ); curr_carrow = new QSCArrow(); collection->add( curr_carrow ); } else if ( name == "rectangle" ) { parser_state.push( ParseCRect ); curr_crect = new QSCRect(); collection->add( curr_crect ); } else if ( name == "group" ) { parser_state.push( ParseCGroup ); curr_cgroup.push( new QSCGroup() ); collection->add( curr_cgroup.top() ); } else return false; return true; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_page_stag( const QString& name, const QXmlAttributes& attr ) { if ( read_some_object_stag( curr_page->objects(), name, attr ) ) { } else set_error_string( QObject::tr("<br> XML(page): Unexpected tag: ")+name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_page_etag( const QString& name ) { if ( name == "page" ) { parser_state.pop(); curr_page = NULL; } return TRUE; } //-----------------------------------------------------------// /* QSAxes *ksprojectxml_runtime_data::cobject_parent_axes( const QXmlAttributes& attr ) { int parent_stack_order = attr.value("parent-axes").toInt(); QSCObject *o = objects[parent_stack_order]; return ( o ? o->parentAxes() : NULL ); } //-----------------------------------------------------------// QObject *ksprojectxml_runtime_data::cobject_parent( const QXmlAttributes& ) { return NULL; } //-----------------------------------------------------------// void ksprojectxml_runtime_data::cobject_set_default_axes( QSCObject *object, const QXmlAttributes& attr ) { if ( object->parentAxes() ) { object->setDefaultAxis( object->parentAxes()->axis(attr.value("x-axis").toInt()) ); object->setDefaultAxis( object->parentAxes()->axis(attr.value("y-axis").toInt()) ); object->setDefaultAxis( object->parentAxes()->axis(attr.value("z-axis").toInt()) ); } } */ //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axes_2d_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_axes2d ) return TRUE; if ( name == "frame" ) { curr_axes2d->setFrameWidth( attr.value("width").toInt() ); } else return read_axes( curr_axes2d, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axes_2d_etag( const QString& name ) { if ( name == AXES2D ) { parser_state.pop(); // we read all axes from file so we don't need default axes remove_default_axes( curr_axes2d ); curr_axes = curr_axes2d = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axes_3d_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_axes3d ) return TRUE; if ( name == "opengl" ) { curr_axes3d->setOpenGL( (bool )attr.value("enabled").toInt() ); curr_axes3d->glSetTransparency( (bool )attr.value("enable-transparency").toInt() ); curr_axes3d->glSetGlobalTransparency( attr.value("global-transparency").toInt() ); curr_axes3d->glSetShadeWalls( (bool )attr.value("shade-walls").toInt() ); curr_axes3d->glSetMeshAutoStroke( (bool )attr.value("auto-stroke").toInt() ); curr_axes3d->glSetAutoStrokeLightness( attr.value("auto-stroke-lightness").toInt() ); } else if ( name == "wall-thickness" ) { curr_axes3d->setWallThickness( attr.value("xy").toDouble(), attr.value("xz").toDouble(), attr.value("yz").toDouble() ); } else if ( name == "edge-length" ) { curr_axes3d->setEdgeLength( attr.value("x").toDouble(), attr.value("y").toDouble(), attr.value("z").toDouble() ); } else if ( name == "viewpoint" ) { curr_axes3d->setAzimuth( attr.value("azimuth").toInt() ); curr_axes3d->setElevation( attr.value("elevation").toInt() ); curr_axes3d->setDistance( attr.value("distance").toInt() ); } else if ( name == "perspective" ) { curr_axes3d->setPerspective( attr.value("enabled").toInt() ); curr_axes3d->setFocusDistance( attr.value("focus-distance").toInt() ); } else if ( name == "light" ) { curr_axes3d->setLight( attr.value("enabled").toInt() ); curr_axes3d->setLightAzimuth( attr.value("azimuth").toInt() ); curr_axes3d->setLightElevation( attr.value("elevation").toInt() ); curr_axes3d->setDirectLight( attr.value("directed-intensity").toInt() ); curr_axes3d->setAmbientLight( attr.value("ambient-intensity").toInt() ); } else if ( name == "autoscale" ) { curr_axes3d->setAutoscale( (bool )attr.value("enabled").toInt() ); } else return read_axes( curr_axes3d, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axes_3d_etag( const QString& name ) { if ( name == AXES3D ) { parser_state.pop(); remove_default_axes( curr_axes3d ); curr_axes = curr_axes3d = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axes( QSAxes *axes, const QString& name, const QXmlAttributes& attr ) { if ( name == "area" ) { axes->setPosMM( QSPt2f( attr.value("xmm").toDouble(), attr.value("ymm").toDouble() ) ); axes->setSizeMM( QSPt2f( attr.value("wmm").toDouble(), attr.value("hmm").toDouble() ) ); } else if ( name == "axis" ) { parser_state.push( ParseAxis ); curr_axes = axes; curr_axis = new QSAxis( (QSAxis::AxisType )get_attr_value(axis_type,attr.value("type")), curr_axes ); curr_axis->setVisible( (bool )attr.value("visible").toInt() ); curr_axis->setScrollable( (bool )attr.value("scrollable").toInt() ); curr_axes->axisAdd( curr_axis ); } else if ( name == "draw-in-background" ) { axes->setDrawInBackground( (bool )attr.value("enabled").toInt() ); } else if ( name == "title-attributes" ) { curr_axes = axes; parser_state.push( ParseAxesTitle ); } else if ( name == "background-attributes" ) { curr_axes = axes; parser_state.push( ParseAxesBackground ); } else if ( name == CURVE ) { parser_state.push( ParseCurve ); curr_plot = curr_curve = new QSCurve( axes ); axes->plotAdd( curr_curve ); } else if ( name == IMAGE ) { parser_state.push( ParseImage ); curr_plot = curr_image = new QSImage( axes ); axes->plotAdd( curr_image ); } else if ( name == CONTOUR || name == GCONTOUR ) { parser_state.push( ParseContour ); curr_plot = curr_contour = new QSGriddedContour( axes ); axes->plotAdd( curr_contour ); } else if ( name == NGCONTOUR ) { parser_state.push( ParseContour ); curr_plot = curr_contour = new QSNonGriddedContour( axes ); axes->plotAdd( curr_contour ); } else if ( name == SURFACE ) { parser_state.push( ParseSurface ); curr_plot = curr_surface = new QSSurface( axes ); axes->plotAdd( curr_surface ); } else if ( name == FIGURE ) { parser_state.push( ParseFigure ); curr_plot = curr_figure = new QSFigure( axes ); axes->plotAdd( curr_figure ); } else if ( read_some_object_stag( axes->shadowObject()->objects(), name, attr ) ) { } else return read_base( axes, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axis_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_axis ) return TRUE; if ( name == "display" ) { curr_axis->setPosition( attr.value("position").toDouble() ); curr_axis->setDefaultPosition( (bool )attr.value("default").toInt() ); curr_axis->setOppositePosition( (bool )attr.value("opposite").toInt() ); } else if ( name == "range" ) { curr_axis->setRange( attr.value("min").toDouble(), attr.value("max").toDouble() ); curr_axis->setRoundRangeToTicStep( (bool )attr.value("rounded").toInt() ); } else if ( name == "scale" ) { curr_axis->setScale( (QSAxis::AxisScale )get_attr_value( axis_scale, attr.value("type") ), attr.value("base").toDouble() ); curr_axis->setReversed( (bool )attr.value("reversed").toInt() ); } else if ( name == "grid-step" ) { curr_axis->setGridStep( attr.value("major").toDouble(), attr.value("minor").toDouble() ); } else if ( name == "tics" ) { curr_axis->setTicsFormat( xml_to_string(attr.value("format")) ); curr_axis->setTicsVisible( (bool )attr.value("visible").toInt() ); curr_axis->setTicsOuter( (bool )attr.value("outer").toInt() ); curr_axis->setTicsAngle( (bool )attr.value("angle").toInt() ); curr_axis->setTicLabelPos1( attr.value("pos1").toDouble() ); curr_axis->setTicLabelPos2( attr.value("pos2").toDouble() ); } else if ( name == "title-position" ) { curr_axis->setTitlePosition( attr.value("pos").toDouble() ); curr_axis->setTitleDistance( attr.value("distance").toDouble() ); } else if ( name == "dart" ) { if ( element_number( attr ) == 1 ) curr_axis->setArrow1( read_arrow( attr ) ); else curr_axis->setArrow2( read_arrow( attr ) ); } else if ( name == "remembered-view" ) { int nr = attr.value("number").toInt(); if ( nr>=0 && nr<3 ) { curr_axis->rememberedViews[nr].min = attr.value("min").toDouble(); curr_axis->rememberedViews[nr].max = attr.value("max").toDouble(); curr_axis->rememberedViews[nr].scale = (QSAxis::AxisScale )get_attr_value( axis_scale, attr.value("scale") ); curr_axis->rememberedViews[nr].base = attr.value("base").toDouble(); curr_axis->rememberedViews[nr].reversed = (bool )attr.value("reversed").toInt(); curr_axis->rememberedViews[nr].round = (bool )attr.value("rounded").toInt(); } } else read_base( curr_axis, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axis_etag( const QString& name ) { if ( name == "axis" ) { parser_state.pop(); curr_axis = NULL; curr_axes = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::remove_default_axes( QSAxes *axes ) // axis object when created always contains a set of default axes ( they are first on the list - // getAxisOfType() returns always first axis of the given type ) we have all axes written // to the file and want the axis set to be exactly the same as written so after we read axes from a // file, we have to delete those default ones. { axes->axisDelete( axes->axisOfType(QSAxis::XAxisType) ); axes->axisDelete( axes->axisOfType(QSAxis::YAxisType) ); axes->axisDelete( axes->axisOfType(QSAxis::ZAxisType) ); axes->axisDelete( axes->axisOfType(QSAxis::VAxisType) ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axis_background_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_axes ) return TRUE; if ( name == "fill" ) { curr_axes->setBackground( read_fill( attr ) ); } else set_error_string( QObject::tr("<br> KMatplot(XML): Background-attributes - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axis_title_stag( const QString& name, const QXmlAttributes& ) { if ( !curr_axes ) return TRUE; set_error_string( QObject::tr("<br> KMatplot(XML): Title-attributes - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axis_background_etag( const QString& name ) { if ( name == "background-attributes" ) { parser_state.pop(); curr_axes = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_axis_title_etag( const QString& name ) { if ( name == "title-attributes" ) { parser_state.pop(); curr_axes = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_curve_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_curve ) return TRUE; if ( name == "series" ) { curr_curve->setType( (QSCurve::SeriesType )get_attr_value(series_type,attr.value("type")) ); } else if ( name == "delta" ) { curr_curve->setFixedDelta( QSPt2f( attr.value("fixed-x").toDouble(), attr.value("fixed-y").toDouble() ) ); curr_curve->setPercentDelta( QSPt2f( attr.value("percent-x").toDouble(), attr.value("percent-y").toDouble() ) ); } else if ( name == "zero" ) { curr_curve->setZeroPoint( QSPt2f( attr.value("x").toDouble(), attr.value("y").toDouble() ) ); } else if ( name == "dart" ) { if ( element_number( attr ) == 1 ) curr_curve->setArrow1( read_arrow( attr ) ); else curr_curve->setArrow2( read_arrow( attr ) ); } else return read_plot( curr_curve, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_curve_etag( const QString& name ) { if ( name == CURVE ) { parser_state.pop(); curr_plot = curr_curve = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_image_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_image ) return TRUE; if ( name == "raw-mode" ) { curr_image->setRawMode( (bool )attr.value("enabled").toInt() ); } else if ( name == "use-gradient" ) { curr_image->setUseGradient( (bool )attr.value("enabled").toInt() ); } else return read_plot( curr_image, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_image_etag( const QString& name ) { if ( name == IMAGE ) { parser_state.pop(); curr_plot = curr_image = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_contour_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_contour ) return TRUE; if ( name == "filled" ) { curr_contour->setContourFills( (bool )attr.value("enabled").toInt() ); } else if ( name == "lines" ) { curr_contour->setContourLines( (bool )attr.value("enabled").toInt() ); } else if ( name == "labels" ) { curr_contour->setContourLabels( (bool )attr.value("enabled").toInt() ); curr_contour->setLabelSpacing( attr.value("spacing").toDouble() ); } /* else if ( name == "grid-labels" ) { curr_contour->setContourGridLabelsFormat( xml_to_string( attr.value("format") ) ); } */ else return read_plot( curr_contour, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_contour_etag( const QString& name ) { if ( name == CONTOUR || name == GCONTOUR || name == NGCONTOUR ) { parser_state.pop(); curr_plot = curr_contour = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_surface_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_surface ) return TRUE; if ( name == "labels" ) { curr_surface->setXGridStep( attr.value("x-step").toInt() ); curr_surface->setYGridStep( attr.value("y-step").toInt() ); } return read_plot_3d( curr_surface, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_surface_etag( const QString& name ) { if ( name == SURFACE ) { parser_state.pop(); curr_plot = curr_surface = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_figure_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_figure ) return TRUE; if ( name == "vertex-compare" ) { curr_figure->setVertexCompareAccuracy( attr.value("accuracy").toInt() ); } else return read_plot_3d( curr_figure, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_figure_etag( const QString& name ) { if ( name == FIGURE ) { parser_state.pop(); curr_plot = curr_figure = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_plot_3d( QSPlot3D *p, const QString& name, const QXmlAttributes& attr ) { if ( name == "colored" ) { p->setColored( (bool )attr.value("enabled").toInt() ); } else if ( name == "topbottom" ) { p->setTopBottom( (bool )attr.value("enabled").toInt() ); } else if ( name == "autodivide" ) { p->setAutoDivide( (bool )attr.value("enabled").toInt() ); } else if ( name == "edges" ) { p->setEdgeAutoColor( attr.value("autocolor").toInt() ); } else return read_plot( p, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_plot( QSPlot *p, const QString& name, const QXmlAttributes& attr ) { if ( name == "legend-item" ) { p->setLegendItemVisible( (bool )attr.value("visible").toInt() ); } else if ( name == "default-axis" ) { // ups we have four initial axes, which we remove after reading an axes object. // our new read axes starts from 4 then. if ( !attr.value("x-axis").isEmpty() ) p->setDefaultAxis( p->parentAxes()->axis(attr.value("x-axis").toInt()+4) ); if ( !attr.value("y-axis").isEmpty() ) p->setDefaultAxis( p->parentAxes()->axis(attr.value("y-axis").toInt()+4) ); if ( !attr.value("z-axis").isEmpty() ) p->setDefaultAxis( p->parentAxes()->axis(attr.value("z-axis").toInt()+4) ); if ( !attr.value("v-axis").isEmpty() ) p->setDefaultAxis( p->parentAxes()->axis(attr.value("v-axis").toInt()+4) ); } else if ( name == "gradient" ) { parser_state.push( ParseGradient ); curr_gradient_type = get_attr_value( gradient_type, attr.value("type") ); return TRUE; } else return read_base( p, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_base( QSGraphicalData *b, const QString& name, const QXmlAttributes& attr ) { if ( name == "fill" ) { b->setFill( element_number(attr), read_fill(attr) ); } else if ( name == "font" ) { b->setFont( element_number(attr), read_font(attr) ); } else if ( name == "line" ) { b->setLine( element_number(attr), read_line(attr) ); } else if ( name == "point" ) { b->setPoint( element_number(attr), read_point(attr) ); } else if ( name == "title" ) { b->setTitle( xml_to_string(attr.value("text")) ); } else return read_data( b, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_data( QSData *d, const QString& name, const QXmlAttributes& attr ) { if ( name == "matrix" ) { parser_state.push( ParseMatrix ); create_matrix( d, name, attr ); } else if ( name == "matrixref" ) { parser_state.push( ParseMatrixRef ); create_matrix( d, name, attr ); } else if ( name == "matrixcolref" ) { parser_state.push( ParseMatrixColRef ); create_matrix( d, name, attr ); } else if ( name == "matrix-string" ) { parser_state.push( ParseMatrixString ); create_matrix( d, name, attr ); } else if ( name == "matrix-formula" ) { parser_state.push( ParseMatrixFormula ); create_matrix( d, name, attr ); } else set_error_string( QObject::tr("<br> KMatplot(XML): QSData - Unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_clegend_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_clegend ) return TRUE; if ( name == "align" ) { curr_clegend->setAlign( attr.value("frame").toInt() ); } else if ( name == "format" ) { curr_clegend->setColumns( attr.value("columns").toInt() ); } else if ( name == "pos" ) { curr_clegend->setPos( read_pt3f(attr) ); } else if ( name == "coord-system" ) { curr_clegend->setCoord( read_pt3(attr) ); } else if ( name == "shadow-shift" ) { curr_clegend->setShadowPos( read_pt2(attr) ); } else if ( name == "font" ) { curr_clegend->setFont( read_font(attr) ); } else if ( name == "fill" ) { if ( element_number( attr ) == 1 ) curr_clegend->setFill( read_fill(attr) ); else curr_clegend->setShadowFill( read_fill(attr) ); } else if ( name == "line" ) { curr_clegend->setFrame( read_line(attr) ); } else read_cobject_stag( curr_clegend, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_clegend_etag( const QString& name ) { if ( name == "legend" ) { parser_state.pop(); curr_clegend = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_clabel_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_clabel ) return TRUE; if ( name == "text" ) { // see end tag } else if ( name == "angle" ) { curr_clabel->setAngle( attr.value("deg").toInt() ); } else if ( name == "align" ) { curr_clabel->setFrameAlign( attr.value("frame").toInt() ); curr_clabel->setTextAlign( attr.value("text").toInt() ); } else if ( name == "pos" ) { curr_clabel->setPos( read_pt3f(attr) ); } else if ( name == "coord-system" ) { curr_clabel->setCoord( read_pt3(attr) ); } else if ( name == "shadow-shift" ) { curr_clabel->setShadowPos( read_pt2(attr) ); } else if ( name == "font" ) { curr_clabel->setFont( read_font(attr) ); } else if ( name == "fill" ) { if ( element_number( attr ) == 1 ) curr_clabel->setFill( read_fill(attr) ); else curr_clabel->setShadowFill( read_fill(attr) ); } else if ( name == "line" ) { curr_clabel->setFrame( read_line(attr) ); } else read_cobject_stag( curr_clabel, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_clabel_etag( const QString& name ) { if ( name == "text" ) { curr_clabel->setText( chars ); } else if ( name == "label" ) { parser_state.pop(); curr_clabel = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_carrow_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_carrow ) return TRUE; if ( name == "begin" ) { curr_carrow->setOriginPos( read_pt3f(attr) ); } else if ( name == "end" ) { curr_carrow->setEndPos( read_pt3f(attr) ); } else if ( name == "coord-system-begin" ) { curr_carrow->setOriginCoord( read_pt3(attr) ); } else if ( name == "coord-system-end" ) { curr_carrow->setEndCoord( read_pt3(attr) ); } else if ( name == "dart" ) { if ( element_number( attr ) == 1 ) curr_carrow->setOriginArrow( read_arrow(attr) ); else curr_carrow->setEndArrow( read_arrow(attr) ); } else if ( name == "point" ) { if ( element_number( attr ) == 1 ) curr_carrow->setOriginPoint( read_point(attr) ); else curr_carrow->setEndPoint( read_point(attr) ); } else if ( name == "line" ) { curr_carrow->setLine( read_line(attr) ); } else read_cobject_stag( curr_carrow, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_carrow_etag( const QString& name ) { if ( name == "arrow" ) { parser_state.pop(); curr_carrow = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_crect_stag( const QString& name, const QXmlAttributes& attr ) { if ( !curr_crect ) return TRUE; if ( name == "type" ) { curr_crect->setEllipse( (bool )attr.value("ellipse").toInt() ); } else if ( name == "begin" ) { curr_crect->setOriginPos( read_pt3f(attr) ); } else if ( name == "end" ) { curr_crect->setEndPos( read_pt3f(attr) ); } else if ( name == "coord-system-begin" ) { curr_crect->setOriginCoord( read_pt3(attr) ); } else if ( name == "coord-system-end" ) { curr_crect->setEndCoord( read_pt3(attr) ); } else if ( name == "shadow-shift" ) { curr_crect->setShadowPos( read_pt2(attr) ); } else if ( name == "fill" ) { if ( element_number( attr ) == 1 ) curr_crect->setFill( read_fill(attr) ); else curr_crect->setShadowFill( read_fill(attr) ); } else if ( name == "line" ) { curr_crect->setFrame( read_line(attr) ); } else read_cobject_stag( curr_crect, name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_crect_etag( const QString& name ) { if ( name == "rectangle" ) { parser_state.pop(); curr_crect = NULL; } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_cgroup_stag( const QString& name, const QXmlAttributes& attr ) { if ( read_some_object_stag( curr_cgroup.top()->objects(), name, attr ) ) { } else read_cobject_stag( curr_cgroup.top(), name, attr ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_cgroup_etag( const QString& name ) { if ( name == "group" ) { parser_state.pop(); curr_cgroup.pop(); } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_cobject_stag( QSCObject *object, const QString& name, const QXmlAttributes& attr ) { if ( name == "axes-bindings" ) { object->setDefaultXAxis( attr.value("x-axis").toInt() ); object->setDefaultYAxis( attr.value("y-axis").toInt() ); object->setDefaultZAxis( attr.value("z-axis").toInt() ); } else set_error_string( QObject::tr("<br> KMatplot(XML): QSCObject - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_stag( const QString& , const QXmlAttributes& ) { return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_etag( const QString& name ) { if ( name == "row" ) { if ( curr_matrix && curr_row < curr_matrix->rows() ) { double value; QTextIStream line(&chars); for( int col=0; col<curr_matrix->cols(); col++ ) { value = 0.0; line >> value; curr_matrix->setValue( curr_row, col, value ); } } curr_row += 1; } else if ( name == "matrix" ) { curr_matrix = NULL; curr_row = 0; parser_state.pop(); } else set_error_string( QObject::tr("<br> KMatplot(XML): Matrix - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_ref_stag( const QString& , const QXmlAttributes& ) { return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_ref_etag( const QString& name ) { if ( name == "matrixref" ) { curr_matrix = NULL; parser_state.pop(); } else set_error_string( QObject::tr("<br> KMatplot(XML): MatrixRef - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_formula_stag( const QString& , const QXmlAttributes& ) { return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_formula_etag( const QString& name ) { if ( name == "matrix-formula" ) { curr_matrix = NULL; parser_state.pop(); } else set_error_string( QObject::tr("<br> KMatplot(XML): MatrixFormula - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_col_ref_stag( const QString& , const QXmlAttributes& ) { return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_col_ref_etag( const QString& name ) { if ( name == "matrixcolref" ) { curr_matrix = NULL; parser_state.pop(); } else set_error_string( QObject::tr("<br> KMatplot(XML): MatrixColRef - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_string_stag( const QString& name, const QXmlAttributes& attr ) { if ( name == "e" ) { curr_matrix->setString( attr.value("row").toInt(), attr.value("col").toInt(), xml_to_string(attr.value("string")) ); } else set_error_string( QObject::tr("<br> KMatplot(XML): MatrixString - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_matrix_string_etag( const QString& name ) { if ( name == "matrix-string" ) { curr_matrix = NULL; parser_state.pop(); } return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_gradient_stag( const QString& name, const QXmlAttributes& attr ) { if ( name == "fill" ) { int f_number = element_number( attr ); curr_gradient_fill[QMIN(4,QMAX(f_number,0))] = read_fill( attr ); } else set_error_string( QObject::tr("<br> KMatplot(XML): Gradient - unexpected tag ") + name ); return TRUE; } //-----------------------------------------------------------// bool ksprojectxml_runtime_data::read_gradient_etag( const QString& name ) { if ( name == "gradient" ) { parser_state.pop(); curr_plot->setGradient( QSGGradient( curr_gradient_fill[0], curr_gradient_fill[1], curr_gradient_fill[2], curr_gradient_fill[3], curr_gradient_fill[4], (QSGGradient::Type )curr_gradient_type) ); } return TRUE; } //-----------------------------------------------------------// int ksprojectxml_runtime_data::element_number( const QXmlAttributes& attr ) { return attr.value("element-number").toInt(); } //-----------------------------------------------------------// QSGFill ksprojectxml_runtime_data::read_fill( const QXmlAttributes& attr ) { QSGFill result; result.style = (QSGFill::Style )get_attr_value( fill_style, attr.value("style") ); result.color = toQSGColor( attr.value("color") ); return result; } //-----------------------------------------------------------// QSGLine ksprojectxml_runtime_data::read_line( const QXmlAttributes& attr ) { QSGLine result; result.style = (QSGLine::Style )get_attr_value( line_style, attr.value("style") ); result.width = attr.value("width").toInt(); result.color = toQSGColor( attr.value("color") ); return result; } //-----------------------------------------------------------// QSGFont ksprojectxml_runtime_data::read_font( const QXmlAttributes& attr ) { QSGFont result; result.family = xml_to_string( attr.value("family") ); result.size = attr.value("size").toInt(); result.bold = (bool )attr.value("bold").toInt(); result.italic = (bool )attr.value("italic").toInt(); result.color = toQSGColor( attr.value("color") ); return result; } //-----------------------------------------------------------// QSGArrow ksprojectxml_runtime_data::read_arrow( const QXmlAttributes& attr ) { QSGArrow result; result.style = (QSGArrow::Style )get_attr_value( arrow_style, attr.value("style") ); result.size = attr.value("size").toInt(); return result; } //-----------------------------------------------------------// QSGPoint ksprojectxml_runtime_data::read_point( const QXmlAttributes& attr ) { QSGPoint result; result.style = (QSGPoint::Style )get_attr_value( point_style, attr.value("style") ); result.fill = (QSGPoint::Fill )get_attr_value( point_fill_style, attr.value("fill") ); result.size = attr.value("size").toInt(); result.color = toQSGColor( attr.value("color") ); return result; } //-----------------------------------------------------------// QSPt2 ksprojectxml_runtime_data::read_pt2( const QXmlAttributes& attr ) { return QSPt2( attr.value("x").toInt(), attr.value("y").toInt() ); } //-----------------------------------------------------------// QSPt3 ksprojectxml_runtime_data::read_pt3( const QXmlAttributes& attr ) { return QSPt3( attr.value("x").toInt(), attr.value("y").toInt(), attr.value("z").toInt() ); } //-----------------------------------------------------------// QSPt3f ksprojectxml_runtime_data::read_pt3f( const QXmlAttributes& attr ) { return QSPt3f( attr.value("x").toDouble(), attr.value("y").toDouble(), attr.value("z").toDouble() ); } //-----------------------------------------------------------// void ksprojectxml_runtime_data::create_matrix( QSData *d, const QString& name, const QXmlAttributes& attr ) { if ( d == NULL ) { curr_matrix = NULL; set_error_string( QObject::tr("KMatplot(create_matrix): No data object allocated - skipping matrix.<br>") ); return; } QString title = xml_to_string( attr.value("title") ); int channel = attr.value("data-channel").toInt(); if ( name == "matrix" ) { int rows = attr.value("rows").toInt(); int cols = attr.value("cols").toInt(); KSMatrix *new_matrix = KSMatrix::create( (EType )get_attr_value(etype,attr.value("element-type")) ); new_matrix->resize( rows, cols ); curr_matrix = new_matrix; } else if ( name == "matrixref" ) { KSMatrixWorksheetCellRange *new_matrix = new KSMatrixWorksheetCellRange( workbook ); new_matrix->setWorksheet( sheet_number(attr.value("sheet").toInt()) ); new_matrix->setRowFrom( attr.value("row-from").toInt() ); new_matrix->setRowStep( attr.value("row-step").toInt() ); new_matrix->setRowTo( attr.value("row-to").toInt() ); new_matrix->setColFrom( attr.value("col-from").toInt() ); new_matrix->setColStep( attr.value("col-step").toInt() ); new_matrix->setColTo( attr.value("col-to").toInt() ); new_matrix->setTransposition( (bool )attr.value("transposition").toInt() ); curr_matrix = new_matrix; } else if ( name == "matrixcolref" ) { KSMatrixWorksheetCellRange *new_matrix = new KSMatrixWorksheetCellRange( workbook ); new_matrix->setWorksheet( sheet_number(attr.value("sheet").toInt()) ); new_matrix->setColumn( attr.value("column").toInt() ); new_matrix->setTransposition( (bool )attr.value("transposition").toInt() ); curr_matrix = new_matrix; } else if ( name == "matrix-string" ) { int rows = attr.value("rows").toInt(); int cols = attr.value("cols").toInt(); KSMatrixString *new_matrix = new KSMatrixString(); new_matrix->resize( rows, cols ); curr_matrix = new_matrix; } else if ( name == "matrix-formula" ) { KSMatrixFormula *new_matrix = new KSMatrixFormula(); new_matrix->setFormula( xml_to_string( attr.value("formula") ) ); new_matrix->setTransposition( (bool )attr.value("transposition").toInt() ); curr_matrix = new_matrix; } if ( curr_matrix ) { curr_matrix->setName(title); curr_matrix->setDataObject( d, channel ); d->setMatrix( channel, curr_matrix ); // setting matrix failed - nonexistient channel ? if ( d->matrix(channel) != curr_matrix ) { delete curr_matrix; curr_matrix = NULL; } // recalculate formula matrix -> add output to console if ( dynamic_cast<KSMatrixFormula*>(curr_matrix) ) { KSMatrixFormula *formula_matrix = dynamic_cast<KSMatrixFormula*>(curr_matrix); MPFactoryList factory( new KSDataSymbolFactory( workbook, formula_matrix->dataObject() ) ); MPFormulaError error; formula_matrix->init( error, &factory ); if ( error.hasError() ) QSConsole::write( QObject::tr("Error parsing formula :")+formula_matrix->formula()+"<br>"+error.message() ); } } curr_row = 0; } //-----------------------------------------------------------//