diff options
Diffstat (limited to 'filters/kspread/gnumeric/gnumericexport.cpp')
-rw-r--r-- | filters/kspread/gnumeric/gnumericexport.cpp | 1574 |
1 files changed, 1574 insertions, 0 deletions
diff --git a/filters/kspread/gnumeric/gnumericexport.cpp b/filters/kspread/gnumeric/gnumericexport.cpp new file mode 100644 index 000000000..28f5453e9 --- /dev/null +++ b/filters/kspread/gnumeric/gnumericexport.cpp @@ -0,0 +1,1574 @@ +/* This file is part of the KDE project + Copyright (C) 2000 David Faure <faure@kde.org> + Copyright (C) 2005 Laurent Montel <montel@kde.org> + + 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. +*/ + +/* Gnumeric export filter by Phillip Ezolt (phillipezolt@hotmail.com) + 2004 - Some updates by Tim Beaulen (tbscope@gmail.com) */ + +#include <gnumericexport.h> +#include <kdebug.h> +#include <kfilterdev.h> +#include <tdemessagebox.h> +#include <kgenericfactory.h> +#include <KoFilterChain.h> +#include <tqapplication.h> +#include <tqptrlist.h> +#include <tqsortedlist.h> +#include <tqfile.h> +#include <tqtextstream.h> + +#include <kspread_map.h> +#include <kspread_sheet.h> +#include <kspread_doc.h> +#include <kspread_view.h> +#include <kspread_canvas.h> +#include <kspread_sheetprint.h> +#include <KoDocumentInfo.h> + +using namespace KSpread; + +typedef KGenericFactory<GNUMERICExport, KoFilter> GNUMERICExportFactory; +K_EXPORT_COMPONENT_FACTORY( libgnumericexport, GNUMERICExportFactory( "kofficefilters" ) ) + +GNUMERICExport::GNUMERICExport(KoFilter *, const char *, const TQStringList&) : +KoFilter() +{ + isLink = false; + isLinkBold = false; + isLinkItalic = false; +} + +/** + * This function will check if a cell has any type of border. + */ +bool GNUMERICExport::hasBorder(Cell *cell, int currentcolumn, int currentrow) +{ + if ( ( (cell->format()->leftBorderWidth(currentcolumn, currentrow) != 0) && + (cell->format()->leftBorderStyle(currentcolumn, currentrow) != TQt::NoPen ) ) || + ( (cell->format()->rightBorderWidth(currentcolumn, currentrow) != 0) && + (cell->format()->rightBorderStyle(currentcolumn, currentrow) != TQt::NoPen ) ) || + ( (cell->format()->topBorderWidth(currentcolumn, currentrow) != 0) && + (cell->format()->topBorderStyle(currentcolumn, currentrow) != TQt::NoPen ) ) || + ( (cell->format()->bottomBorderWidth(currentcolumn, currentrow) != 0) && + (cell->format()->bottomBorderStyle(currentcolumn, currentrow) != TQt::NoPen ) ) || + ( (cell->format()->fallDiagonalWidth(currentcolumn, currentrow) != 0) && + (cell->format()->fallDiagonalStyle(currentcolumn, currentrow) != TQt::NoPen ) ) || + ( (cell->format()->goUpDiagonalWidth(currentcolumn, currentrow) != 0) && + (cell->format()->goUpDiagonalStyle(currentcolumn, currentrow) != TQt::NoPen ) ) ) + return true; + else + return false; +} + +const TQString GNUMERICExport::ColorToString(int red, int green, int blue) +{ + return TQString::number(red,16)+":"+TQString::number(green,16)+":"+TQString::number(blue,16); +} + +TQDomElement GNUMERICExport::GetBorderStyle(TQDomDocument gnumeric_doc,Cell * cell, int currentcolumn, int currentrow) +{ + TQDomElement border_style; + TQDomElement border; + + int red, green, blue; + TQColor color; + + border_style = gnumeric_doc.createElement("gmr:StyleBorder"); + + if ( (cell->format()->leftBorderWidth(currentcolumn, currentrow) != 0) && + (cell->format()->leftBorderStyle(currentcolumn, currentrow) != TQt::NoPen ) ) + { + border = gnumeric_doc.createElement("gmr:Left"); + border.setAttribute("Style","1"); + + color = cell->format()->leftBorderColor(currentcolumn, currentrow); + red = color.red()<<8; + green = color.green()<<8; + blue = color.blue()<<8; + + border.setAttribute("Color", TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16)); + } + else + { + border = gnumeric_doc.createElement("gmr:Left"); + border.setAttribute("Style","0"); + } + + border_style.appendChild(border); + + if ( (cell->format()->rightBorderWidth(currentcolumn, currentrow) != 0) && + (cell->format()->rightBorderStyle(currentcolumn, currentrow) != TQt::NoPen ) ) + { + border = gnumeric_doc.createElement("gmr:Right"); + border.setAttribute("Style","1"); + + color = cell->format()->rightBorderColor(currentcolumn, currentrow); + red = color.red()<<8; + green = color.green()<<8; + blue = color.blue()<<8; + + border.setAttribute("Color", TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16)); + } + else + { + border = gnumeric_doc.createElement("gmr:Right"); + border.setAttribute("Style","0"); + } + + border_style.appendChild(border); + + if ( (cell->format()->topBorderWidth(currentcolumn, currentrow) != 0) && + (cell->format()->topBorderStyle(currentcolumn, currentrow) != TQt::NoPen ) ) + { + border = gnumeric_doc.createElement("gmr:Top"); + border.setAttribute("Style","1"); + + color = cell->format()->topBorderColor(currentcolumn, currentrow); + red = color.red()<<8; + green = color.green()<<8; + blue = color.blue()<<8; + + border.setAttribute("Color", TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16)); + } + else + { + border = gnumeric_doc.createElement("gmr:Top"); + border.setAttribute("Style","0"); + } + + border_style.appendChild(border); + + if ( (cell->format()->bottomBorderWidth(currentcolumn, currentrow) != 0) && + (cell->format()->bottomBorderStyle(currentcolumn, currentrow) != TQt::NoPen ) ) + { + border = gnumeric_doc.createElement("gmr:Bottom"); + border.setAttribute("Style","1"); + + color = cell->format()->bottomBorderColor(currentcolumn, currentrow); + red = color.red()<<8; + green = color.green()<<8; + blue = color.blue()<<8; + + border.setAttribute("Color", TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16)); + } + else + { + border = gnumeric_doc.createElement("gmr:Bottom"); + border.setAttribute("Style","0"); + } + + border_style.appendChild(border); + + if ( (cell->format()->fallDiagonalWidth(currentcolumn, currentrow) != 0) && + (cell->format()->fallDiagonalStyle(currentcolumn, currentrow) != TQt::NoPen ) ) + { + border = gnumeric_doc.createElement("gmr:Diagonal"); + border.setAttribute("Style","1"); + + color = cell->format()->fallDiagonalColor(currentcolumn, currentrow); + red = color.red()<<8; + green = color.green()<<8; + blue = color.blue()<<8; + + border.setAttribute("Color", TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16)); + } + else + { + border = gnumeric_doc.createElement("gmr:Diagonal"); + border.setAttribute("Style","0"); + } + + border_style.appendChild(border); + + if ( (cell->format()->goUpDiagonalWidth(currentcolumn, currentrow) != 0) && + (cell->format()->goUpDiagonalStyle(currentcolumn, currentrow) != TQt::NoPen ) ) + { + border = gnumeric_doc.createElement("gmr:Rev-Diagonal"); + border.setAttribute("Style","1"); + + color = cell->format()->goUpDiagonalColor(currentcolumn, currentrow); + red = color.red()<<8; + green = color.green()<<8; + blue = color.blue()<<8; + + border.setAttribute("Color", TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16)); + } + else + { + border = gnumeric_doc.createElement("gmr:Rev-Diagonal"); + border.setAttribute("Style","0"); + } + + border_style.appendChild(border); + + return border_style; +} + +TQDomElement GNUMERICExport::GetValidity( TQDomDocument gnumeric_doc, Cell * cell ) +{ + //<gmr:Validation Style="1" Type="1" Operator="7" AllowBlank="true" UseDropdown="false" Title="ghhg" Message="ghghhhjfhfghjfghj fg hjgf hj"> + // <gmr:Expression0>45</gmr:Expression0> + // </gmr:Validation> + Validity *kspread_validity = cell->getValidity(); + TQDomElement val = gnumeric_doc.createElement( "gmr:Validation" ); + val.setAttribute( "Title", kspread_validity->title ); + val.setAttribute( "Message", kspread_validity->message ); + val.setAttribute( "AllowBlank", kspread_validity->allowEmptyCell ? "true":"false" ); + if ( !kspread_validity->displayMessage ) + { + val.setAttribute("Style", "0" ); + } + else + { + switch( kspread_validity->m_action ) + { + case Action::Stop: + val.setAttribute("Style", "1" ); + break; + case Action::Warning: + val.setAttribute("Style", "2" ); + break; + case Action::Information: + val.setAttribute("Style", "3" ); + break; + } + } + + switch( kspread_validity->m_cond ) + { + case Conditional::None: + //Nothing + break; + case Conditional::Equal: + val.setAttribute("Operator", "2" ); + break; + case Conditional::Superior: + val.setAttribute("Operator", "4" ); + break; + case Conditional::Inferior: + val.setAttribute("Operator", "5" ); + break; + case Conditional::SuperiorEqual: + val.setAttribute("Operator", "6" ); + break; + case Conditional::InferiorEqual: + val.setAttribute("Operator", "7" ); + break; + case Conditional::Between: + val.setAttribute("Operator", "0" ); + break; + case Conditional::Different: + val.setAttribute("Operator", "3" ); + break; + case Conditional::DifferentTo: + val.setAttribute("Operator", "1" ); + break; + } + switch( kspread_validity->m_restriction ) + { + case Restriction::None: + val.setAttribute("Type", "0" ); + break; + case Restriction::Number: + { + val.setAttribute("Type", "2" ); + switch( kspread_validity->m_cond ) + { + case Conditional::None: + //Nothing + break; + case Conditional::Equal: + case Conditional::Superior: + case Conditional::Inferior: + case Conditional::SuperiorEqual: + case Conditional::InferiorEqual: + case Conditional::Different: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number( kspread_validity->valMin ) ) ); + val.appendChild( tmp ); + } + break; + case Conditional::Between: + case Conditional::DifferentTo: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number(kspread_validity->valMin ) ) ); + val.appendChild( tmp ); + tmp = gnumeric_doc.createElement( "gmr:Expression1" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number(kspread_validity->valMax ) ) ); + val.appendChild( tmp ); + } + break; + } + + break; + } + case Restriction::Text: + //Not supported into gnumeric + //val.setAttribute("Type", "1" ); + break; + case Restriction::Time: + val.setAttribute("Type", "5" ); + switch( kspread_validity->m_cond ) + { + case Conditional::None: + //Nothing + break; + case Conditional::Equal: + case Conditional::Superior: + case Conditional::Inferior: + case Conditional::SuperiorEqual: + case Conditional::InferiorEqual: + case Conditional::Different: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( kspread_validity->timeMin.toString() ) ); + val.appendChild( tmp ); + } + break; + case Conditional::Between: + case Conditional::DifferentTo: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( kspread_validity->timeMin.toString() ) ); + val.appendChild( tmp ); + tmp = gnumeric_doc.createElement( "gmr:Expression1" ); + tmp.appendChild( gnumeric_doc.createTextNode( kspread_validity->timeMax.toString() ) ); + val.appendChild( tmp ); + } + break; + } + + break; + case Restriction::Date: + val.setAttribute("Type", "4" ); + switch( kspread_validity->m_cond ) + { + case Conditional::None: + //Nothing + break; + case Conditional::Equal: + case Conditional::Superior: + case Conditional::Inferior: + case Conditional::SuperiorEqual: + case Conditional::InferiorEqual: + case Conditional::Different: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( kspread_validity->dateMin.toString() ) ); + val.appendChild( tmp ); + } + break; + case Conditional::Between: + case Conditional::DifferentTo: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( kspread_validity->dateMin.toString() ) ); + val.appendChild( tmp ); + tmp = gnumeric_doc.createElement( "gmr:Expression1" ); + tmp.appendChild( gnumeric_doc.createTextNode( kspread_validity->dateMax.toString() ) ); + val.appendChild( tmp ); + } + break; + } + + break; + case Restriction::Integer: + val.setAttribute("Type", "1" ); + switch( kspread_validity->m_cond ) + { + case Conditional::None: + //Nothing + break; + case Conditional::Equal: + case Conditional::Superior: + case Conditional::Inferior: + case Conditional::SuperiorEqual: + case Conditional::InferiorEqual: + case Conditional::Different: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number(kspread_validity->valMin ) ) ); + val.appendChild( tmp ); + } + break; + case Conditional::Between: + case Conditional::DifferentTo: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number(kspread_validity->valMin ) ) ); + val.appendChild( tmp ); + tmp = gnumeric_doc.createElement( "gmr:Expression1" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number(kspread_validity->valMax ) ) ); + val.appendChild( tmp ); + } + break; + } + break; + case Restriction::TextLength: + val.setAttribute("Type", "6" ); + switch( kspread_validity->m_cond ) + { + case Conditional::None: + //Nothing + break; + case Conditional::Equal: + case Conditional::Superior: + case Conditional::Inferior: + case Conditional::SuperiorEqual: + case Conditional::InferiorEqual: + case Conditional::Different: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number(kspread_validity->valMin ) ) ); + val.appendChild( tmp ); + } + break; + case Conditional::Between: + case Conditional::DifferentTo: + { + TQDomElement tmp = gnumeric_doc.createElement( "gmr:Expression0" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number(kspread_validity->valMin ) ) ); + val.appendChild( tmp ); + tmp = gnumeric_doc.createElement( "gmr:Expression1" ); + tmp.appendChild( gnumeric_doc.createTextNode( TQString::number(kspread_validity->valMax ) ) ); + val.appendChild( tmp ); + } + break; + } + break; + case Restriction::List: + val.setAttribute("Type", "3" ); + switch( kspread_validity->m_cond ) + { + case Conditional::None: + //Nothing + break; + case Conditional::Equal: + case Conditional::Superior: + case Conditional::Inferior: + case Conditional::SuperiorEqual: + case Conditional::InferiorEqual: + case Conditional::Different: + break; + case Conditional::Between: + case Conditional::DifferentTo: + break; + } + break; + } + + return val; +} + +TQDomElement GNUMERICExport::GetFontStyle( TQDomDocument gnumeric_doc,Cell * cell, int currentcolumn, int currentrow) +{ + TQDomElement font_style; + kdDebug()<<" currentcolumn :"<<currentcolumn<<" currentrow :"<<currentrow<<endl; + font_style = gnumeric_doc.createElement("gmr:Font"); + font_style.appendChild(gnumeric_doc.createTextNode(cell->format()->textFontFamily(currentcolumn, currentrow))); + + if (cell->format()->textFontItalic(currentcolumn,currentrow) || (isLink && isLinkItalic)) + { + font_style.setAttribute("Italic","1"); + } + if (cell->format()->textFontBold(currentcolumn,currentrow) || (isLink && isLinkBold)) + { + font_style.setAttribute("Bold","1"); + } + if (cell->format()->textFontUnderline(currentcolumn,currentrow)) + { + font_style.setAttribute("Underline","1"); + } + if (cell->format()->textFontStrike(currentcolumn,currentrow)) + { + font_style.setAttribute("StrikeThrough","1"); + } + if (cell->format()->textFontSize(currentcolumn,currentrow)) + { + font_style.setAttribute("Unit",TQString::number(cell->format()->textFontSize(currentcolumn,currentrow))); + } + + return font_style; +} + +TQDomElement GNUMERICExport::GetLinkStyle(TQDomDocument gnumeric_doc) +{ + TQDomElement link_style; + + link_style = gnumeric_doc.createElement("gmr:HyperLink"); + + TQString path; + + path = linkUrl; + + if (path.section(":",0,0).lower() == "http") + link_style.setAttribute("type","GnmHLinkURL"); + else if (path.section(":",0,0).lower() == "mailto") + link_style.setAttribute("type","GnmHLinkEMail"); + else if (path.section(":",0,0).lower() == "file") + link_style.setAttribute("type","GnmHLinkExternal"); + else if (path.left(5).lower() == "sheet") + link_style.setAttribute("type","GnmHLinkCurWB"); + else + link_style.setAttribute("type",""); + + link_style.setAttribute("target",path); + + // KSpread doesn't support link tips. + link_style.setAttribute("tip",""); + + return link_style; +} + +TQDomElement GNUMERICExport::GetCellStyle(TQDomDocument gnumeric_doc,Cell * cell, int currentcolumn, int currentrow) +{ + TQColorGroup defaultColorGroup = TQApplication::palette().active(); + + TQDomElement cell_style; + + cell_style = gnumeric_doc.createElement("gmr:Style"); + + int red, green, blue; + + TQColor bgColor = cell->bgColor(currentcolumn, currentrow); + red = bgColor.red()<<8; + green = bgColor.green()<<8; + blue = bgColor.blue()<<8; + + switch (cell->format()->backGroundBrushStyle(currentcolumn, currentrow)) + { + case TQt::NoBrush: + cell_style.setAttribute("Shade","0"); + break; + case TQt::SolidPattern: + // 100% + cell_style.setAttribute("Shade","1"); + break; + case TQt::Dense1Pattern: + // 87.5% + cell_style.setAttribute("Shade","25"); + break; + case TQt::Dense2Pattern: + // 75% + cell_style.setAttribute("Shade","2"); + break; + case TQt::Dense3Pattern: + // 62.5% + // Not supported by GNumeric + // Fall back to 50% + cell_style.setAttribute("Shade","3"); + break; + case TQt::Dense4Pattern: + // 50% + cell_style.setAttribute("Shade","3"); + break; + case TQt::Dense5Pattern: + // 25% + cell_style.setAttribute("Shade","4"); + break; + case TQt::Dense6Pattern: + // 12.5% + cell_style.setAttribute("Shade","5"); + break; + case TQt::Dense7Pattern: + // 6.25% + cell_style.setAttribute("Shade","6"); + break; + case TQt::HorPattern: + cell_style.setAttribute("Shade","13"); + break; + case TQt::VerPattern: + cell_style.setAttribute("Shade","14"); + break; + case TQt::CrossPattern: + cell_style.setAttribute("Shade","17"); + break; + case TQt::BDiagPattern: + cell_style.setAttribute("Shade","16"); + break; + case TQt::FDiagPattern: + cell_style.setAttribute("Shade","15"); + break; + case TQt::DiagCrossPattern: + cell_style.setAttribute("Shade","18"); + break; + case TQt::CustomPattern: + // Not supported by Gnumeric + cell_style.setAttribute("Shade","0"); + break; + } + + cell_style.setAttribute("Back",TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16) ); + + + TQColor textColor = cell->format()->textColor(currentcolumn, currentrow); + red = textColor.red()<<8; + green = textColor.green()<<8; + blue = textColor.blue()<<8; + + cell_style.setAttribute("Fore",TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16) ); + + if (cell->format()->align(currentcolumn,currentrow) == Format::Undefined) + { + cell_style.setAttribute("HAlign","1"); + } + else if (cell->format()->align(currentcolumn,currentrow) == Format::Left) + { + cell_style.setAttribute("HAlign","2"); + } + else if (cell->format()->align(currentcolumn,currentrow) == Format::Right) + { + cell_style.setAttribute("HAlign","4"); + } + else if (cell->format()->align(currentcolumn,currentrow) == Format::Center) + { + cell_style.setAttribute("HAlign","8"); + } + + if (cell->format()->alignY(currentcolumn,currentrow) == Format::Top) + { + cell_style.setAttribute("VAlign","1"); + } + else if (cell->format()->alignY(currentcolumn,currentrow) == Format::Bottom) + { + cell_style.setAttribute("VAlign","2"); + } + else if (cell->format()->alignY(currentcolumn,currentrow) == Format::Middle) + { + cell_style.setAttribute("VAlign","4"); + } + + if (cell->format()->multiRow(currentcolumn,currentrow)) + cell_style.setAttribute("WrapText","1"); + else + cell_style.setAttribute("WrapText","0"); + + // ShrinkToFit not supported by KSpread (?) + cell_style.setAttribute("ShrinkToFit","0"); + + // I'm not sure about the rotation values. + // I never got it to work in GNumeric. + cell_style.setAttribute("Rotation", TQString::number(-1*cell->format()->getAngle(currentcolumn,currentrow))); + + // The indentation in GNumeric is an integer value. In KSpread, it's a double. + // Save the double anyway, makes it even better when importing the document back in KSpread. + // TODO verify if it's correct, in import we "* 10.0" + cell_style.setAttribute("Indent", TQString::number(cell->format()->getIndent(currentcolumn,currentrow))); + + cell_style.setAttribute("Locked", !cell->format()->notProtected(currentcolumn,currentrow)); + + // A KSpread cell can have two options to hide: only formula hidden, or everything hidden. + // I only consider a cell with everything hidden as hidden. + // Gnumeric hides everything or nothing. + cell_style.setAttribute("Hidden", cell->format()->isHideAll(currentcolumn,currentrow)); + + TQColor patColor = cell->format()->backGroundBrushColor(currentcolumn, currentrow); + red = patColor.red()<<8; + green = patColor.green()<<8; + blue = patColor.blue()<<8; + + cell_style.setAttribute("PatternColor", TQString::number(red,16)+":"+TQString::number(green,16) +":"+TQString::number(blue,16)); + + if (isLink) + cell_style.appendChild(GetLinkStyle(gnumeric_doc)); + + cell_style.appendChild(GetFontStyle(gnumeric_doc, cell, currentcolumn, currentrow)); + + if ( cell->getValidity() ) + { + cell_style.appendChild( GetValidity( gnumeric_doc, cell ) ); + } + + TQString stringFormat; + + Format::Currency c; + Currency currency; + + switch( cell->format()->getFormatType(currentcolumn, currentrow)) + { + case Number_format: + stringFormat="0.00"; + break; + case Text_format: + stringFormat="general"; + break; + case Money_format: + + if (!cell->format()->currencyInfo(c)) + { + stringFormat = "0.00"; + break; + } + + if (currency.getCurrencyCode(c.type).isEmpty()) + stringFormat = "0.00"; + else if (currency.getCurrencyCode(c.type) == "$") + stringFormat = "$0.00"; + else if (currency.getCurrencyCode(c.type) == TQString::fromUtf8("€")) + stringFormat = "[$€-2]0.00"; + else if (currency.getCurrencyCode(c.type) == TQString::fromUtf8("£")) + stringFormat = "£0.00"; + else if (currency.getCurrencyCode(c.type) == TQString::fromUtf8("¥")) + stringFormat = "¥0.00"; + else + stringFormat="[$" + currency.getCurrencyCode(c.type) + "]0.00"; + + break; + case Percentage_format: + stringFormat="0.00%"; + break; + case Scientific_format: + stringFormat="0.00E+00"; + break; + case ShortDate_format: + stringFormat=cell->locale()->dateFormatShort(); + break; + case TextDate_format: + stringFormat=cell->locale()->dateFormat(); + break; + case date_format1: + stringFormat="dd-mmm-yy"; + break; + case date_format2: + stringFormat="dd-mmm-yyyy"; + break; + case date_format3: + stringFormat="dd-mmm"; + break; + case date_format4: + stringFormat="dd-mm"; + break; + case date_format5: + stringFormat="dd/mm/yy"; + break; + case date_format6: + stringFormat="dd/mm/yyyy"; + break; + case date_format7: + stringFormat="mmm-yy"; + break; + case date_format8: + stringFormat="mmmm-yy"; + break; + case date_format9: + stringFormat="mmmm-yyyy"; + break; + case date_format10: + stringFormat="m-yy"; + break; + case date_format11: + stringFormat="dd/mmm"; + break; + case date_format12: + stringFormat="dd/mm"; + break; + case date_format13: + stringFormat="dd/mmm/yyyy"; + break; + case date_format14: + stringFormat="yyyy/mmm/dd"; + break; + case date_format15: + stringFormat="yyyy-mmm-dd"; + break; + case date_format16: + stringFormat="yyyy-mm-dd"; + break; + case date_format17: + stringFormat="d mmmm yyyy"; + break; + case date_format18: + stringFormat="mm/dd/yyyy"; + break; + case date_format19: + stringFormat="mm/dd/yy"; + break; + case date_format20: + stringFormat="mmm/dd/yy"; + break; + case date_format21: + stringFormat="mmm/dd/yyyy"; + break; + case date_format22: + stringFormat="mmm-yyyy"; + break; + case date_format23: + stringFormat="yyyy"; + break; + case date_format24: + stringFormat="yy"; + break; + case date_format25: + stringFormat="yyyy/mm/dd"; + break; + case date_format26: + stringFormat="yyyy/mmm/dd"; + break; + case Time_format: + case SecondeTime_format: + stringFormat=cell->locale()->timeFormat(); + break; + case Time_format1: + stringFormat = "h:mm AM/PM"; + break; + case Time_format2: + stringFormat = "h:mm:ss AM/PM"; + break; + case Time_format3: + stringFormat = "h \"h\" mm \"min\" ss \"s\""; + break; + case Time_format4: + stringFormat = "h:mm"; + break; + case Time_format5: + stringFormat = "h:mm:ss"; + break; + case Time_format6: + stringFormat = "mm:ss"; + break; + case Time_format7: + stringFormat = "[h]:mm:ss"; + break; + case Time_format8: + stringFormat = "[h]:mm"; + break; + case fraction_half: + stringFormat="# ?/2"; + break; + case fraction_quarter: + stringFormat="# ?/4"; + break; + case fraction_eighth: + stringFormat="# ?/8"; + break; + case fraction_sixteenth: + stringFormat="# ?/16"; + break; + case fraction_tenth: + stringFormat="# ?/10"; + break; + case fraction_hundredth: + stringFormat="# ?/100"; + break; + case fraction_one_digit: + stringFormat="# ?/?"; + break; + case fraction_two_digits: + stringFormat="# ?\?/?\?"; + break; + case fraction_three_digits: + stringFormat="# ?\?\?/?\?\?"; + break; + case Custom_format: + stringFormat = cell->format()->getFormatString(currentcolumn,currentrow); + break; + default: + break; + } + cell_style.setAttribute("Format",stringFormat); + + if(hasBorder(cell, currentcolumn, currentrow)) + cell_style.appendChild(GetBorderStyle(gnumeric_doc, cell, currentcolumn, currentrow)); + + return cell_style; +} + + +void GNUMERICExport::addAttributeItem(TQDomDocument gnumeric_doc, TQDomElement attributes, const TQString& type, const TQString& name, bool value) +{ + TQDomElement gmr_attribute, gmr_type, gmr_name, gmr_value; + + gmr_attribute = gnumeric_doc.createElement("gmr:Attribute"); + attributes.appendChild(gmr_attribute); + + gmr_type = gnumeric_doc.createElement("gmr:type"); + gmr_type.appendChild(gnumeric_doc.createTextNode(type)); + gmr_attribute.appendChild(gmr_type); + + gmr_name = gnumeric_doc.createElement("gmr:name"); + gmr_name.appendChild(gnumeric_doc.createTextNode(name)); + gmr_attribute.appendChild(gmr_name); + + TQString txtValue; + if (value) + txtValue = "true"; + else + txtValue = "false"; + + gmr_value = gnumeric_doc.createElement("gmr:value"); + gmr_value.appendChild(gnumeric_doc.createTextNode(txtValue)); + gmr_attribute.appendChild(gmr_value); +} + +void GNUMERICExport::addSummaryItem(TQDomDocument gnumeric_doc, TQDomElement summary, const TQString& name, const TQString& value) +{ + if ( value.isEmpty() ) + return; + TQDomElement gmr_item, gmr_name, gmr_val_string; + + gmr_item = gnumeric_doc.createElement("gmr:Item"); + summary.appendChild(gmr_item); + + gmr_name = gnumeric_doc.createElement("gmr:name"); + gmr_name.appendChild(gnumeric_doc.createTextNode(name)); + gmr_item.appendChild(gmr_name); + + gmr_val_string = gnumeric_doc.createElement("gmr:val-string"); + gmr_val_string.appendChild(gnumeric_doc.createTextNode(value)); + gmr_item.appendChild(gmr_val_string); +} + +// The reason why we use the KoDocument* approach and not the TQDomDocument +// approach is because we don't want to export formulas but values ! +KoFilter::ConversionStatus GNUMERICExport::convert( const TQCString& from, const TQCString& to ) +{ + kdDebug(30521) << "Exporting GNUmeric" << endl; + + TQDomDocument gnumeric_doc=TQDomDocument(); + + Sheet* table; + KoDocument* document = m_chain->inputDocument(); + + if (!document) + return KoFilter::StupidError; + + if ( !::tqqt_cast<const KSpread::Doc *>( document ) ) // it's safer that way :) + { + kdWarning(30521) << "document isn't a KSpread::Doc but a " << document->className() << endl; + return KoFilter::NotImplemented; + } + if (to != "application/x-gnumeric" || from != "application/x-kspread") + { + kdWarning(30521) << "Invalid mimetypes " << to << " " << from << endl; + return KoFilter::NotImplemented; + } + + Doc* ksdoc = (Doc*)document; + + if (ksdoc->mimeType() != "application/x-kspread") + { + kdWarning(30521) << "Invalid document mimetype " << ksdoc->mimeType() << endl; + return KoFilter::NotImplemented; + } + + /* This could be Made into a function */ + + gnumeric_doc.appendChild( gnumeric_doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ) ); + + TQDomElement workbook = gnumeric_doc.createElement("gmr:Workbook"); + workbook.setAttribute("xmlns:gmr","http://www.gnumeric.org/v10.dtd"); + workbook.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance"); + workbook.setAttribute("xmlns:schemaLocation", "http://www.gnumeric.org/v8.xsd"); + gnumeric_doc.appendChild(workbook); + + /* End Made into a function */ + + TQDomElement sheets,sheet,tmp,cells,selections, cols,rows,styles,merged, margins, top, left, bottom, right, orientation, paper, header, footer, customSize, cellComment, objects, repeatColumns, repeatRows; + + KoDocumentInfo *DocumentInfo = document->documentInfo(); + KoDocumentInfoAbout *aboutPage = static_cast<KoDocumentInfoAbout *>(DocumentInfo->page( "about" )); + + KoDocumentInfoAuthor *authorPage = static_cast<KoDocumentInfoAuthor*>(DocumentInfo->page( "author" )); + + /* + * Attributes + */ + TQDomElement attributes = gnumeric_doc.createElement("gmr:Attributes"); + workbook.appendChild(attributes); + + addAttributeItem(gnumeric_doc, attributes, "4", "WorkbookView::show_horizontal_scrollbar", ksdoc->showHorizontalScrollBar()); + addAttributeItem(gnumeric_doc, attributes, "4", "WorkbookView::show_vertical_scrollbar", ksdoc->showVerticalScrollBar()); + addAttributeItem(gnumeric_doc, attributes, "4", "WorkbookView::show_notebook_tabs", ksdoc->showTabBar()); + if (ksdoc->completionMode() == TDEGlobalSettings::CompletionAuto) + addAttributeItem(gnumeric_doc, attributes, "4", "WorkbookView::do_auto_completion", "true"); + else + addAttributeItem(gnumeric_doc, attributes, "4", "WorkbookView::do_auto_completion", "false"); + addAttributeItem(gnumeric_doc, attributes, "4", "WorkbookView::is_protected", ksdoc->map()->isProtected()); + + /* + * Doccument summary + */ + TQDomElement summary = gnumeric_doc.createElement("gmr:Summary"); + workbook.appendChild(summary); + + addSummaryItem(gnumeric_doc, summary, "title", aboutPage->title()); + addSummaryItem(gnumeric_doc, summary, "company", authorPage->company()); + addSummaryItem(gnumeric_doc, summary, "author", authorPage->fullName()); + addSummaryItem(gnumeric_doc, summary, "comments", aboutPage->abstract()); + addSummaryItem(gnumeric_doc, summary, "keywords", aboutPage->keywords()); + + addSummaryItem(gnumeric_doc, summary, "application", "KSpread"); + + /* + * Sheet name index (necessary for the gnumeric xml_sax importer) + */ + TQDomElement sheetNameIndex = gnumeric_doc.createElement("gmr:SheetNameIndex"); + workbook.appendChild(sheetNameIndex); + + for (table = ksdoc->map()->firstSheet(); table != 0L; table =ksdoc->map()->nextSheet()) + { + TQDomElement sheetName = gnumeric_doc.createElement("gmr:SheetName"); + sheetName.appendChild(gnumeric_doc.createTextNode(table->tableName())); + sheetNameIndex.appendChild(sheetName); + } + + /* + * Area Names + */ + /* + <gmr:Names> + <gmr:Name> + <gmr:name>test</gmr:name> + <gmr:value>Sheet2!$A$2:$D$10</gmr:value> + <gmr:position>A1</gmr:position> + </gmr:Name> + <gmr:Name> + <gmr:name>voiture</gmr:name> + <gmr:value>Sheet2!$A$2:$D$8</gmr:value> + <gmr:position>A1</gmr:position> + </gmr:Name> + </gmr:Names> + */ + if ( ksdoc->listArea().count()>0 ) + { + TQDomElement areaNames = gnumeric_doc.createElement("gmr:Names"); + const TQValueList<Reference> &area = ksdoc->listArea(); // copying by value is slow! + TQValueList<Reference>::ConstIterator it = area.begin(); + TQValueList<Reference>::ConstIterator end = area.end(); + for ( ; it != end; ++it ) + { + TQDomElement areaName = gnumeric_doc.createElement("gmr:Name"); + TQDomElement areaNameElement = gnumeric_doc.createElement("gmr:name"); + areaNameElement.appendChild(gnumeric_doc.createTextNode(( *it ).ref_name) ); + areaName.appendChild( areaNameElement ); + TQDomElement areaNameValue = gnumeric_doc.createElement("gmr:value"); + areaNameValue.appendChild(gnumeric_doc.createTextNode( convertRefToRange( ( *it ).sheet_name, ( *it ).rect ) ) ); + areaName.appendChild( areaNameValue ); + areaNames.appendChild( areaName ); + //TODO <gmr:position>A1</gmr:position> I don't know what is it. + } + workbook.appendChild(areaNames); + } + + + /* + * Sheets + */ + sheets = gnumeric_doc.createElement("gmr:Sheets"); + workbook.appendChild(sheets); + + TQString str; + + View * view = static_cast<View*>( ksdoc->views().getFirst()); + Canvas * canvas=0L; + TQString activeTableName; + if (view) + { + canvas = view->canvasWidget(); + activeTableName = canvas->activeSheet()->sheetName(); + } + int i = 0; + int indexActiveTable=0; + for (table = ksdoc->map()->firstSheet(); table != 0L; table =ksdoc->map()->nextSheet(), i++) + { + if ( table->print()->paperFormat()==PG_CUSTOM ) + { + customSize = gnumeric_doc.createElement( "gmr:Geometry" ); + customSize.setAttribute( "Width", POINT_TO_MM ( table->print()->paperWidth() )); + customSize.setAttribute( "Height", POINT_TO_MM (table->print()->paperWidth() )); + sheets.appendChild(customSize); + //<gmr:Geometry Width="768" Height="365"/> + } + + sheet = gnumeric_doc.createElement("gmr:Sheet"); + sheets.appendChild(sheet); + + sheet.setAttribute("DisplayFormulas", table->getShowFormula() ? "true" : "false" ); + sheet.setAttribute("HideZero", table->getHideZero()? "true" : "false"); + sheet.setAttribute("HideGrid", !table->getShowGrid()? "true" : "false"); + sheet.setAttribute("HideColHeader", ( !ksdoc->showColumnHeader() ? "true" : "false" )); + sheet.setAttribute("HideRowHeader", ( !ksdoc->showRowHeader()? "true" : "false" )); + /* Not available in KSpread ? + * sheet.setAttribute("DisplayOutlines", "true"); + * sheet.setAttribute("OutlineSymbolsBelow", "true"); + * sheet.setAttribute("OutlineSymbolsRight", "true"); + * sheet.setAttribute("TabColor", ""); + * sheet.setAttribute("TabTextColor", ""); + */ + + tmp = gnumeric_doc.createElement("gmr:Name"); + if ( table->tableName()==activeTableName ) + indexActiveTable = i; + + tmp.appendChild(gnumeric_doc.createTextNode(table->tableName())); + + sheet.appendChild(tmp); + + tmp = gnumeric_doc.createElement("gmr:MaxCol"); + tmp.appendChild(gnumeric_doc.createTextNode(TQString::number(table->maxColumn()))); + sheet.appendChild(tmp); + + tmp = gnumeric_doc.createElement("gmr:MaxRow"); + + tmp.appendChild(gnumeric_doc.createTextNode(TQString::number(table->maxRow()))); + sheet.appendChild(tmp); + + // Zoom value doesn't appear to be correct + // KSpread 200% gives zoom() = 2.5, this in GNumeric = 250% + tmp = gnumeric_doc.createElement("gmr:Zoom"); + if (view) + tmp.appendChild(gnumeric_doc.createTextNode(TQString::number(canvas->zoom()))); + else + tmp.appendChild(gnumeric_doc.createTextNode("1.0")); + sheet.appendChild(tmp); + + //Print Info + tmp = gnumeric_doc.createElement( "gmr:PrintInformation" ); + margins = gnumeric_doc.createElement( "gmr:Margins" ); + + top = gnumeric_doc.createElement( "gmr:top" ); + top.setAttribute("Points", table->print()->topBorder()); + top.setAttribute("PrefUnit", "mm"); + margins.appendChild( top ); + + bottom = gnumeric_doc.createElement( "gmr:bottom" ); + bottom.setAttribute("Points", table->print()->bottomBorder()); + bottom.setAttribute("PrefUnit", "mm"); + margins.appendChild( bottom ); + + left = gnumeric_doc.createElement( "gmr:left" ); + left.setAttribute("Points", table->print()->leftBorder()); + left.setAttribute("PrefUnit", "mm"); + margins.appendChild( left ); + + right = gnumeric_doc.createElement( "gmr:right" ); + right.setAttribute("Points", table->print()->rightBorder()); + right.setAttribute("PrefUnit", "mm"); + margins.appendChild( right ); + + tmp.appendChild( margins ); + sheet.appendChild(tmp); + + orientation = gnumeric_doc.createElement( "gmr:orientation" ); + TQString orientString = table->print()->orientation() == PG_LANDSCAPE ? "landscape" : "portrait"; + orientation.appendChild( gnumeric_doc.createTextNode(orientString) ); + tmp.appendChild( orientation ); + + //TODO for future + //<gmr:repeat_top value="A1:IV5"/> + //<gmr:repeat_left value="B1:D65536"/> + + int _tmpRepeatColumnStart = table->print()->printRepeatColumns().first; + int _tmpRepeatColumnEnd = table->print()->printRepeatColumns().second; + if ( _tmpRepeatColumnStart!=0 ) + { + repeatColumns = gnumeric_doc.createElement( "gmr:repeat_left" ); + TQString value = Cell::columnName( _tmpRepeatColumnStart )+"1:"+Cell::columnName(_tmpRepeatColumnEnd )+"65536"; + repeatColumns.setAttribute( "value", value ); + tmp.appendChild( repeatColumns ); + } + int _tmpRepeatRowStart = table->print()->printRepeatRows().first; + int _tmpRepeatRowEnd = table->print()->printRepeatRows().second; + if ( _tmpRepeatRowStart!=0 ) + { + repeatRows = gnumeric_doc.createElement( "gmr:repeat_top" ); + TQString value = "A"+ TQString::number(_tmpRepeatRowStart ) +":IV"+TQString::number( _tmpRepeatRowEnd ); + repeatRows.setAttribute( "value", value ); + tmp.appendChild( repeatRows ); + } + + header = gnumeric_doc.createElement( "gmr:Header" ); + header.setAttribute( "Left", convertVariable(table->print()->headLeft() ) ); + header.setAttribute( "Middle", convertVariable(table->print()->headMid() ) ); + header.setAttribute( "Right", convertVariable(table->print()->headRight() ) ); + tmp.appendChild( header ); + + footer = gnumeric_doc.createElement( "gmr:Footer" ); + footer.setAttribute( "Left", convertVariable( table->print()->footLeft() ) ); + footer.setAttribute( "Middle", convertVariable( table->print()->footMid() ) ); + footer.setAttribute( "Right", convertVariable( table->print()->footRight() )); + tmp.appendChild( footer ); + + paper = gnumeric_doc.createElement( "gmr:paper" ); + paper.appendChild( gnumeric_doc.createTextNode( table->print()->paperFormatString() ) ); + tmp.appendChild( paper ); + + styles = gnumeric_doc.createElement("gmr:Styles"); + sheet.appendChild(styles); + + cells = gnumeric_doc.createElement("gmr:Cells"); + sheet.appendChild(cells); + + objects = gnumeric_doc.createElement("gmr:Objects"); + sheet.appendChild(objects); + + merged = gnumeric_doc.createElement("gmr:MergedRegions"); + bool mergedCells = false; // if there are no merged cells in this sheet, don't write an + // empty mergedRegions to the file. + // So, depending on the value of mergedCells, + // the merged dom element is added or not. + + cols = gnumeric_doc.createElement("gmr:Cols"); + sheet.appendChild(cols); + + rows = gnumeric_doc.createElement("gmr:Rows"); + sheet.appendChild(rows); + + /* + selections = gnumeric_doc.createElement("gmr:Selections"); + sheet.appendChild(selections); + */ + // Ah ah ah - the document is const, but the map and table aren't. Safety: 0. + // Either we get hold of Sheet::m_dctCells and apply the old method below + // (for sorting) or, cleaner and already sorted, we use Sheet's API + // (slower probably, though) + int iMaxColumn = table->maxColumn(); + int iMaxRow = table->maxRow(); + + // this is just a bad approximation which fails for documents with less than 50 rows, but + // we don't need any progress stuff there anyway :) (Werner) + int value=0; + int step=iMaxRow > 50 ? iMaxRow/50 : 1; + int i=1; + + TQString emptyLines; + + /* Save selection info. */ + + /* can't save selection anymore -- part of the view, not table */ + /* + TQDomElement selection = gnumeric_doc.createElement("gmr:Selection"); + TQRect table_selection(table->selection()); + + selections.appendChild(selection); + */ + /* <gmr:Selection startCol="3" startRow="2" endCol="3" endRow="2"/>*/ + /* + selection.setAttribute("startCol", TQString::number(table_selection.left()-1)); + selection.setAttribute("startRow", TQString::number(table_selection.top()-1)); + + selection.setAttribute("endCol", TQString::number(table_selection.right()-1)); + selection.setAttribute("endRow", TQString::number(table_selection.bottom()-1)); + */ + /* End selection info. */ + + + /* Start COLS */ + ColumnFormat *cl=table->firstCol(); + while (cl) + { + TQDomElement colinfo = gnumeric_doc.createElement("gmr:ColInfo"); + cols.appendChild(colinfo); + colinfo.setAttribute("No", TQString::number(cl->column()-1)); + colinfo.setAttribute("Hidden", TQString::number(cl->isHide())); + colinfo.setAttribute("Unit", TQString::number(cl->dblWidth())); + + cl=cl->next(); + } + + /* End COLS */ + + // RowFormat *rl=table->m_cells.firstCell; + // <gmr:ColInfo No="1" Unit="96.75" MarginA="2" MarginB="2" HardSize="-1" Hidden="0"/> + + /* Start ROWS */ + RowFormat *rl=table->firstRow(); + while (rl) + { + TQDomElement rowinfo = gnumeric_doc.createElement("gmr:RowInfo"); + rows.appendChild(rowinfo); + rowinfo.setAttribute("No", TQString::number(rl->row()-1)); + rowinfo.setAttribute("Hidden", TQString::number(rl->isHide())); + rowinfo.setAttribute("Unit", TQString::number(rl->dblHeight())); + + rl=rl->next(); + } + + /* End ROWS */ + + //rl->setHeight + // colinfo.info(); + /* + <gmr:ColInfo No="1" Unit="96.75" MarginA="2" MarginB="2" HardSize="-1" Hidden="0"/> + <gmr:ColInfo No="3" Unit="113.25" MarginA="2" MarginB="2" HardSize="-1" + Hidden="0"/> + */ + + /* End COLS */ + + for (int currentrow = 1; currentrow <= iMaxRow; ++currentrow, ++i) + { + if(i>step) + { + value+=2; + emit sigProgress(value); + i=0; + } + + TQString line; + for (int currentcolumn = 1; currentcolumn <= iMaxColumn; currentcolumn++) + { + TQDomElement cell_contents; + Cell * cell = table->cellAt( currentcolumn, currentrow, false ); + + TQString text, style; + TQDomDocument domLink; + TQDomElement domRoot; + TQDomNode domNode; + TQDomNodeList childNodes; + + if (!cell->isDefault() && !cell->isEmpty()) + { + if ( cell->isFormula() ) + { + TQString tmp = cell->text(); + if ( tmp.contains( "==" ) ) + tmp=tmp.replace( "==", "=" ); + text = tmp; + isLink = false; + } + else if ( !cell->link().isEmpty() ) + { + isLink = true; + isLinkBold = false; + isLinkItalic = false; + //TODO FIXME + linkUrl = cell->link(); + linkText = cell->text(); + + } + else + { + text = cell->text(); + isLink = false; + } +#if 0 + switch (cell->content()) + { + case Cell::Text: + text = cell->text(); + isLink = false; + break; + case Cell::RichText: + // hyperlinks + // Extract the cell text + isLink = true; + isLinkBold = false; + isLinkItalic = false; + domLink.setContent(cell->text().section("!",1,1)); + + domNode = domLink.firstChild(); + domRoot = domNode.toElement(); + text = domNode.toElement().text(); + + while (!domNode.isNull()) + { + style = domNode.toElement().tagName(); + + if (style == "b") + isLinkBold = true; + + if (style == "i") + isLinkItalic = true; + + domNode = domNode.firstChild(); + } + + //kdDebug(30521) << "---> link, text = " << text << endl; + + linkUrl = domRoot.attribute("href"); + linkText = text; + + break; + case Cell::VisualFormula: + isLink = false; + text = cell->text(); // untested + break; + case Cell::Formula: + isLink = false; + TQString tmp = cell->text(); + if ( tmp =="==" ) + tmp=replace( "==", "=" ); + /* cell->calc( TRUE ); // Incredible, cells are not calculated if the document was just opened text = cell->valueString(); */ + text = tmp; + break; + } +#endif + } + + if (!cell->isDefault()) + { + + // Check if the cell is merged + // Only cells with content are interesting? + // Otherwise it can take a while to parse a large sheet + + if (cell->doesMergeCells()) + { + // The cell is forced to occupy other cells + TQDomElement merge = gnumeric_doc.createElement("gmr:Merge"); + + // Set up the range + TQString fromCol, toCol, fromRow, toRow; + fromCol = cell->columnName(currentcolumn); + fromRow = TQString::number(currentrow); + toCol = cell->columnName(currentcolumn + cell->mergedXCells()); + toRow = TQString::number(currentrow + cell->mergedYCells()); + + merge.appendChild(gnumeric_doc.createTextNode(fromCol + fromRow + ":" + toCol + toRow)); + mergedCells = true; + merged.appendChild(merge); + } + // --- + if ( !cell->format()->comment( currentcolumn, currentrow ).isEmpty() ) + { + //<gmr:CellComment Author="" Text="cvbcvbxcvb cb xc vbxcv " ObjectBound="A1" ObjectOffset="0 0 0 0" ObjectAnchorType="17 16 17 16" Direction="17"/> + cellComment = gnumeric_doc.createElement("gmr:CellComment"); + cellComment.setAttribute( "Text", cell->format()->comment( currentcolumn, currentrow ) ); + TQString sCell=TQString( "%1%2" ).arg( Cell::columnName(currentcolumn ) ).arg( currentrow ); + + cellComment.setAttribute("ObjectBound", sCell ); + objects.appendChild(cellComment); + + } + TQDomElement gnumeric_cell = gnumeric_doc.createElement("gmr:Cell"); + TQDomElement cell_style; + + TQDomElement style_region = gnumeric_doc.createElement("gmr:StyleRegion"); + + cells.appendChild(gnumeric_cell); + + gnumeric_cell.setAttribute("Col", TQString::number(currentcolumn-1)); + gnumeric_cell.setAttribute("Row", TQString::number(currentrow-1)); + + /* Right now, we create a single region for each cell.. This is inefficient, + * but the implementation is quicker.. Probably later we will have to + * consolidate styles into style regions. + */ + + style_region.setAttribute("startCol", TQString::number(currentcolumn-1)); + style_region.setAttribute("startRow", TQString::number(currentrow-1)); + style_region.setAttribute("endCol", TQString::number(currentcolumn-1)); + style_region.setAttribute("endRow", TQString::number(currentrow-1)); + + cell_style = GetCellStyle(gnumeric_doc,cell,currentcolumn,currentrow); + + style_region.appendChild(cell_style); + + styles.appendChild(style_region); + + //cell_contents = gnumeric_doc.createElement("gmr:Content"); + gnumeric_cell.appendChild(gnumeric_doc.createTextNode(text)); + //gnumeric_cell.appendChild(cell_contents); + } + + // Append a delimiter, but in a temp string -> if no other real cell in this line, + // then those will be dropped + } + } + + if (mergedCells) + sheet.appendChild(merged); + } + TQDomElement uidata = gnumeric_doc.createElement("gmr:UIData"); + uidata.setAttribute( "SelectedTab", indexActiveTable ); + workbook.appendChild(uidata); + + str = gnumeric_doc.toString (); + + emit sigProgress(100); + + // Ok, now write to export file + + TQIODevice* out = KFilterDev::deviceForFile(m_chain->outputFile(),"application/x-gzip"); + + if (!out) + { + kdError(30521) << "No output file! Aborting!" << endl; + return KoFilter::FileNotFound; + } + + if (!out->open(IO_WriteOnly)) + { + kdError(30521) << "Unable to open output file! Aborting!" << endl; + delete out; + return KoFilter::FileNotFound; + } + + TQTextStream streamOut(out); + + streamOut << str; + + out->close(); + delete out; + + return KoFilter::OK; +} + + +TQString GNUMERICExport::convertRefToRange( const TQString & table, const TQRect & rect ) +{ + TQPoint topLeft( rect.topLeft() ); + TQPoint bottomRight( rect.bottomRight() ); + if ( topLeft == bottomRight ) + return convertRefToBase( table, rect ); + TQString s; + s += table; + s += "!$"; + s += Cell::columnName( topLeft.x() ); + s += '$'; + s += TQString::number( topLeft.y() ); + s += ":$"; + s += Cell::columnName( bottomRight.x() ); + s += '$'; + s += TQString::number( bottomRight.y() ); + + return s; +} + + +TQString GNUMERICExport::convertRefToBase( const TQString & table, const TQRect & rect ) +{ + TQPoint bottomRight( rect.bottomRight() ); + + TQString s; + s = table; + s += "!$"; + s += Cell::columnName( bottomRight.x() ); + s += '$'; + s += TQString::number( bottomRight.y() ); + + return s; +} + +TQString GNUMERICExport::convertVariable( TQString headerFooter ) +{ + headerFooter = headerFooter.replace( "<sheet>", "&[TAB]" ); + headerFooter = headerFooter.replace( "<date>", "&[DATE]" ); + headerFooter = headerFooter.replace( "<page>", "&[PAGE]" ); + headerFooter = headerFooter.replace( "<pages>", "&[PAGES]" ); + headerFooter = headerFooter.replace( "<time>", "&[TIME]" ); + headerFooter = headerFooter.replace( "<file>", "&[FILE]" ); + + return headerFooter; +} + +#include "gnumericexport.moc" |