|
|
/* This file is part of the KDE project
|
|
|
Copyright (C) 1999 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 import filter by Phillip Ezolt 6-2-2001 */
|
|
|
/* phillipezolt@hotmail.com */
|
|
|
/* additions: Norbert Andres nandres@web.de */
|
|
|
|
|
|
#include <tqdict.h>
|
|
|
#include <tqfile.h>
|
|
|
#include <tqstringlist.h>
|
|
|
|
|
|
#include <gnumericimport.h>
|
|
|
#include <kmessagebox.h>
|
|
|
#include <kfilterdev.h>
|
|
|
#include <kdebug.h>
|
|
|
#include <kgenericfactory.h>
|
|
|
#include <KoFilterChain.h>
|
|
|
#include <KoGlobal.h>
|
|
|
|
|
|
// hehe >:->
|
|
|
#include <kspread_doc.h>
|
|
|
#include <kspread_map.h>
|
|
|
#include <kspread_sheet.h>
|
|
|
#include <kspread_sheetprint.h>
|
|
|
#include <kspread_cell.h>
|
|
|
#include <kspread_util.h>
|
|
|
#include <KoDocumentInfo.h>
|
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
#define SECS_PER_DAY 86400
|
|
|
#define HALF_SEC (0.5 / SECS_PER_DAY)
|
|
|
|
|
|
using namespace KSpread;
|
|
|
|
|
|
// copied from gnumeric: src/format.c:
|
|
|
static const int g_dateSerial_19000228 = 59;
|
|
|
/* One less that the Julian day number of 19000101. */
|
|
|
static int g_dateOrigin = 0;
|
|
|
|
|
|
// copied from gnumeric: src/formats.c:
|
|
|
static char const * cell_format_date [] = {
|
|
|
"m/d/yy", /* 0 Cell::date_format5*/
|
|
|
"m/d/yyyy", /* 1 Cell::date_format6*/
|
|
|
"d-mmm-yy", /* 2 Cell::date_format1 18-Feb-99 */
|
|
|
"d-mmm-yyyy", /* 3 Cell::date_format2 18-Feb-1999 */
|
|
|
"d-mmm", /* 4 Cell::date_format3 18-Feb */
|
|
|
"d-mm", /* 5 Cell::date_format4 18-05 */
|
|
|
"mmm/d", /* 6 Cell::date_format11*/
|
|
|
"mm/d", /* 7 Cell::date_format12*/
|
|
|
"mm/dd/yy", /* 8 Cell::date_format19*/
|
|
|
"mm/dd/yyyy", /* 9 Cell::date_format18*/
|
|
|
"mmm/dd/yy", /* 10 Cell::date_format20*/
|
|
|
"mmm/dd/yyyy", /* 11 Cell::date_format21*/
|
|
|
"mmm/ddd/yy", /* 12 */
|
|
|
"mmm/ddd/yyyy", /* 13 */
|
|
|
"mm/ddd/yy", /* 14 */
|
|
|
"mm/ddd/yyyy", /* 15 */
|
|
|
"mmm-yy", /* 16 Cell::date_format7*/
|
|
|
"mmm-yyyy", /* 17 Cell::date_format22*/
|
|
|
"mmmm-yy", /* 18 Cell::date_format8*/
|
|
|
"mmmm-yyyy", /* 19 Cell::date_format9*/
|
|
|
"m/d/yy h:mm", /* 20 */
|
|
|
"m/d/yyyy h:mm", /* 21 */
|
|
|
"yyyy/mm/d", /* 22 Cell::date_format25*/
|
|
|
"yyyy/mmm/d", /* 23 Cell::date_format14*/
|
|
|
"yyyy/mm/dd", /* 24 Cell::date_format25*/
|
|
|
"yyyy/mmm/dd", /* 25 Cell::date_format26*/
|
|
|
"yyyy-mm-d", /* 26 Cell::date_format16*/
|
|
|
"yyyy-mmm-d", /* 27 Cell::date_format15*/
|
|
|
"yyyy-mm-dd", /* 28 Cell::date_format16*/
|
|
|
"yyyy-mmm-dd", /* 29 Cell::date_format15*/
|
|
|
"yy", /* 30 Cell::date_format24*/
|
|
|
"yyyy", /* 31 Cell::date_format23*/
|
|
|
NULL
|
|
|
};
|
|
|
|
|
|
// copied from gnumeric: src/formats.c:
|
|
|
static char const * cell_format_time [] = {
|
|
|
"h:mm AM/PM", // Cell::Time_format1 9 : 01 AM
|
|
|
"h:mm:ss AM/PM", // Cell::Time_format2 9:01:05 AM
|
|
|
"h:mm", // Cell::Time_format4 9:01
|
|
|
"h:mm:ss", // Cell::Time_format5 9:01:12
|
|
|
"m/d/yy h:mm",
|
|
|
"mm:ss", // Cell::Time_format6 01:12
|
|
|
"mm:ss.0", // Cell::Time_format6 01:12
|
|
|
"[h]:mm:ss",
|
|
|
"[h]:mm",
|
|
|
"[mm]:ss",
|
|
|
"[ss]",
|
|
|
NULL
|
|
|
};
|
|
|
|
|
|
namespace gnumeric_import_LNS
|
|
|
{
|
|
|
TQStringList list1;
|
|
|
TQStringList list2;
|
|
|
}
|
|
|
|
|
|
using namespace gnumeric_import_LNS;
|
|
|
|
|
|
void GNUMERICFilter::dateInit()
|
|
|
{
|
|
|
// idea copied form gnumeric src/format.c:
|
|
|
/* Day 1 means 1st of January of 1900 */
|
|
|
g_dateOrigin = GnumericDate::greg2jul( 1900, 1, 1 ) - 1;
|
|
|
}
|
|
|
|
|
|
uint GNUMERICFilter::GnumericDate::greg2jul( int y, int m, int d )
|
|
|
{
|
|
|
return TQDate::gregorianToJulian( y, m, d );
|
|
|
}
|
|
|
|
|
|
void GNUMERICFilter::GnumericDate::jul2greg( double num, int & y, int & m, int & d )
|
|
|
{
|
|
|
int i = (int) floor( num + HALF_SEC );
|
|
|
if (i > g_dateSerial_19000228)
|
|
|
--i;
|
|
|
else if (i == g_dateSerial_19000228 + 1)
|
|
|
kdWarning(30521) << "Request for date 02/29/1900." << endl;
|
|
|
|
|
|
kdDebug(30521) << "***** Num: " << num << ", i: " << i << endl;
|
|
|
|
|
|
TQDate::julianToGregorian( i + g_dateOrigin, y, m, d );
|
|
|
kdDebug(30521) << "y: " << y << ", m: " << m << ", d: " << d << endl;
|
|
|
}
|
|
|
|
|
|
TQTime GNUMERICFilter::GnumericDate::getTime( double num )
|
|
|
{
|
|
|
// idea copied from gnumeric: src/datetime.c
|
|
|
num += HALF_SEC;
|
|
|
int secs = tqRound( (num - floor(num)) * SECS_PER_DAY );
|
|
|
|
|
|
kdDebug(30521) << "***** Num: " << num << ", secs " << secs << endl;
|
|
|
|
|
|
const int h = secs / 3600;
|
|
|
secs -= h * 3600;
|
|
|
const int m = secs / 60;
|
|
|
secs -= h * 60;
|
|
|
|
|
|
kdDebug(30521) << "****** h: " << h << ", m: " << m << ", secs: " << secs << endl;
|
|
|
const TQTime time( h, m, ( secs < 0 || secs > 59 ? 0 : secs ) );
|
|
|
|
|
|
return time;
|
|
|
}
|
|
|
|
|
|
typedef KGenericFactory<GNUMERICFilter, KoFilter> GNUMERICFilterFactory;
|
|
|
K_EXPORT_COMPONENT_FACTORY( libgnumericimport, GNUMERICFilterFactory( "kofficefilters" ) )
|
|
|
|
|
|
GNUMERICFilter::GNUMERICFilter( KoFilter *, const char *, const TQStringList & )
|
|
|
: KoFilter()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
/* This converts GNUmeric's color string "0:0:0" to a TQColor. */
|
|
|
void convert_string_to_qcolor(TQString color_string, TQColor * color)
|
|
|
{
|
|
|
int red, green, blue, first_col_pos, second_col_pos;
|
|
|
|
|
|
bool number_ok;
|
|
|
|
|
|
first_col_pos = color_string.tqfind(":", 0);
|
|
|
second_col_pos = color_string.tqfind(":", first_col_pos + 1);
|
|
|
|
|
|
/* Fore="0:0:FF00" */
|
|
|
/* If GNUmeric kicks out some invalid colors, we could crash. */
|
|
|
/* GNUmeric gives us two bytes of color data per element. */
|
|
|
/* We only care about the top byte. */
|
|
|
|
|
|
red = color_string.mid( 0, first_col_pos).toInt( &number_ok, 16 ) >> 8;
|
|
|
green = color_string.mid(first_col_pos + 1,
|
|
|
(second_col_pos-first_col_pos) - 1).toInt( &number_ok, 16) >> 8;
|
|
|
blue = color_string.mid(second_col_pos + 1,
|
|
|
(color_string.length() - first_col_pos) - 1).toInt( &number_ok, 16) >> 8;
|
|
|
color->setRgb(red, green, blue);
|
|
|
}
|
|
|
|
|
|
void areaNames( Doc * ksdoc, const TQString &_name, TQString _zone )
|
|
|
{
|
|
|
//Sheet2!$A$2:$D$8
|
|
|
TQString tableName;
|
|
|
int pos = _zone.tqfind( '!' );
|
|
|
if ( pos != -1 )
|
|
|
{
|
|
|
tableName = _zone.left( pos );
|
|
|
_zone = _zone.right( _zone.length()-pos-1 );
|
|
|
pos = _zone.tqfind( ':' );
|
|
|
TQRect rect;
|
|
|
if ( pos != -1 )
|
|
|
{
|
|
|
TQString left = _zone.mid( 1, pos-1 );
|
|
|
TQString right = _zone.mid( pos+2, _zone.length()-pos-2 );
|
|
|
int pos = left.tqfind( '$' );
|
|
|
|
|
|
rect.setLeft( util_decodeColumnLabelText(left.left(pos ) ) );
|
|
|
rect.setTop( left.right( left.length()-pos-1 ).toInt() );
|
|
|
|
|
|
pos = right.tqfind( '$' );
|
|
|
rect.setRight( util_decodeColumnLabelText(right.left(pos ) ) );
|
|
|
rect.setBottom( right.right( right.length()-pos-1 ).toInt() );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
TQString left = _zone;
|
|
|
int pos = left.tqfind( '$' );
|
|
|
int leftPos = util_decodeColumnLabelText(left.left(pos ) );
|
|
|
rect.setLeft( leftPos );
|
|
|
rect.setRight( leftPos );
|
|
|
|
|
|
int top = left.right( left.length()-pos-1 ).toInt();
|
|
|
rect.setTop( top );
|
|
|
rect.setBottom( top );
|
|
|
}
|
|
|
ksdoc->addAreaName( rect, _name ,tableName);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void set_document_area_names( Doc * ksdoc, TQDomElement * docElem )
|
|
|
{
|
|
|
TQDomNode areaNamesElement = docElem->namedItem( "gmr:Names" );
|
|
|
if ( areaNamesElement.isNull() )
|
|
|
return;
|
|
|
TQDomNode areaNameItem = areaNamesElement.namedItem( "gmr:Name" );
|
|
|
while ( !areaNameItem.isNull() )
|
|
|
{
|
|
|
TQDomNode gmr_name = areaNameItem.namedItem("gmr:name");
|
|
|
TQDomNode gmr_value = areaNameItem.namedItem("gmr:value");
|
|
|
TQString name = gmr_name.toElement().text();
|
|
|
areaNames( ksdoc, name, gmr_value.toElement().text() );
|
|
|
areaNameItem = areaNameItem.nextSibling();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void set_document_attributes( Doc * ksdoc, TQDomElement * docElem)
|
|
|
{
|
|
|
ksdoc->loadConfigFromFile();
|
|
|
TQDomNode attributes = docElem->namedItem("gmr:Attributes");
|
|
|
if ( attributes.isNull() )
|
|
|
return;
|
|
|
|
|
|
TQDomNode attributeItem = attributes.namedItem("gmr:Attribute");
|
|
|
while( !attributeItem.isNull() )
|
|
|
{
|
|
|
TQDomNode gmr_name = attributeItem.namedItem("gmr:name");
|
|
|
TQDomNode gmr_value = attributeItem.namedItem("gmr:value");
|
|
|
if (gmr_name.toElement().text() == "WorkbookView::show_horizontal_scrollbar")
|
|
|
{
|
|
|
ksdoc->setShowHorizontalScrollBar( gmr_value.toElement().text().lower()=="true"? true : false );
|
|
|
}
|
|
|
else if ( gmr_name.toElement().text() == "WorkbookView::show_vertical_scrollbar")
|
|
|
{
|
|
|
ksdoc->setShowVerticalScrollBar( gmr_value.toElement().text().lower()=="true"? true : false );
|
|
|
}
|
|
|
else if ( gmr_name.toElement().text() == "WorkbookView::show_notebook_tabs")
|
|
|
{
|
|
|
ksdoc->setShowTabBar(gmr_value.toElement().text().lower()=="true"? true : false );
|
|
|
}
|
|
|
else if ( gmr_name.toElement().text() == "WorkbookView::do_auto_completion")
|
|
|
{
|
|
|
ksdoc->setCompletionMode( KGlobalSettings::CompletionAuto);
|
|
|
}
|
|
|
else if ( gmr_name.toElement().text() == "WorkbookView::is_protected")
|
|
|
{
|
|
|
//TODO protect document ???
|
|
|
//ksdoc->map()->isProtected()
|
|
|
}
|
|
|
|
|
|
attributeItem = attributeItem.nextSibling();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* This sets the documentation information from the information stored in
|
|
|
the GNUmeric file. Particularly in the "gmr:Summary" subcategory.
|
|
|
*/
|
|
|
void set_document_info(KoDocument * document, TQDomElement * docElem)
|
|
|
{
|
|
|
/* Summary Handling START */
|
|
|
TQDomNode summary = docElem->namedItem("gmr:Summary");
|
|
|
TQDomNode gmr_item = summary.namedItem("gmr:Item");
|
|
|
|
|
|
while( !gmr_item.isNull() )
|
|
|
{
|
|
|
TQDomNode gmr_name = gmr_item.namedItem("gmr:name");
|
|
|
TQDomNode gmr_value = gmr_item.namedItem("gmr:val-string");
|
|
|
|
|
|
KoDocumentInfo * DocumentInfo = document->documentInfo();
|
|
|
KoDocumentInfoAbout * aboutPage = static_cast<KoDocumentInfoAbout *>(DocumentInfo->page( "about" ));
|
|
|
KoDocumentInfoAuthor * authorPage = static_cast<KoDocumentInfoAuthor*>(DocumentInfo->page( "author" ));
|
|
|
|
|
|
|
|
|
if (gmr_name.toElement().text() == "title")
|
|
|
{
|
|
|
aboutPage->setTitle(gmr_value.toElement().text());
|
|
|
}
|
|
|
else if (gmr_name.toElement().text() == "keywords")
|
|
|
{
|
|
|
aboutPage->setKeywords( gmr_value.toElement().text());
|
|
|
}
|
|
|
else if (gmr_name.toElement().text() == "comments")
|
|
|
{
|
|
|
aboutPage->setAbstract(gmr_value.toElement().text());
|
|
|
}
|
|
|
else if (gmr_name.toElement().text() == "category")
|
|
|
{
|
|
|
/* Not supported by KSpread */
|
|
|
}
|
|
|
else if (gmr_name.toElement().text() == "manager")
|
|
|
{
|
|
|
/* Not supported by KSpread */
|
|
|
}
|
|
|
else if (gmr_name.toElement().text() == "application")
|
|
|
{
|
|
|
/* Not supported by KSpread */
|
|
|
}
|
|
|
else if (gmr_name.toElement().text() == "author")
|
|
|
{
|
|
|
authorPage->setFullName(gmr_value.toElement().text());
|
|
|
}
|
|
|
else if (gmr_name.toElement().text() == "company")
|
|
|
{
|
|
|
authorPage->setCompany(gmr_value.toElement().text());
|
|
|
}
|
|
|
|
|
|
gmr_item = gmr_item.nextSibling();
|
|
|
}
|
|
|
|
|
|
/* Summany Handling STOP */
|
|
|
}
|
|
|
|
|
|
|
|
|
void setColInfo(TQDomNode * sheet, Sheet * table)
|
|
|
{
|
|
|
TQDomNode columns = sheet->namedItem("gmr:Cols");
|
|
|
TQDomNode columninfo = columns.namedItem("gmr:ColInfo");
|
|
|
|
|
|
TQDomElement def = columns.toElement();
|
|
|
if ( def.hasAttribute( "DefaultSizePts" ) )
|
|
|
{
|
|
|
bool ok = false;
|
|
|
double d = def.attribute( "DefaultSizePts" ).toDouble( &ok );
|
|
|
if ( ok )
|
|
|
{
|
|
|
Format::setGlobalColWidth( d );
|
|
|
table->setDefaultWidth( d );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
while( !columninfo.isNull() )
|
|
|
{
|
|
|
TQDomElement e = columninfo.toElement(); // try to convert the node to an element.
|
|
|
int column_number;
|
|
|
|
|
|
column_number = e.attribute("No").toInt()+1;
|
|
|
ColumnFormat *cl = new ColumnFormat(table, column_number);
|
|
|
if (e.hasAttribute("Hidden"))
|
|
|
{
|
|
|
if (e.attribute("Hidden")=="1")
|
|
|
{
|
|
|
cl->setHide(true);
|
|
|
}
|
|
|
}
|
|
|
if (e.hasAttribute("Unit"))
|
|
|
{
|
|
|
// xmm = (x_points) * (1 inch / 72 points) * (25.4 mm/ 1 inch)
|
|
|
cl->setDblWidth(e.attribute("Unit").toDouble());
|
|
|
//cl->setWidth(e.attribute("Unit").toInt());
|
|
|
}
|
|
|
table->insertColumnFormat(cl);
|
|
|
columninfo = columninfo.nextSibling();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void setRowInfo(TQDomNode *sheet, Sheet *table)
|
|
|
{
|
|
|
TQDomNode rows = sheet->namedItem("gmr:Rows");
|
|
|
TQDomNode rowinfo = rows.namedItem("gmr:RowInfo");
|
|
|
|
|
|
double d;
|
|
|
bool ok = false;
|
|
|
|
|
|
TQDomElement def = rows.toElement();
|
|
|
if ( def.hasAttribute( "DefaultSizePts" ) )
|
|
|
{
|
|
|
d = def.attribute( "DefaultSizePts" ).toDouble( &ok );
|
|
|
if ( ok )
|
|
|
{
|
|
|
Format::setGlobalRowHeight( d );
|
|
|
table->setDefaultHeight( d );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
while( !rowinfo.isNull() )
|
|
|
{
|
|
|
TQDomElement e = rowinfo.toElement(); // try to convert the node to an element.
|
|
|
int row_number;
|
|
|
row_number = e.attribute("No").toInt() + 1;
|
|
|
RowFormat *rl = new RowFormat(table, row_number);
|
|
|
|
|
|
if (e.hasAttribute("Hidden"))
|
|
|
{
|
|
|
if (e.attribute("Hidden") == "1")
|
|
|
{
|
|
|
rl->setHide(true);
|
|
|
}
|
|
|
}
|
|
|
if (e.hasAttribute("Unit"))
|
|
|
{
|
|
|
double dbl = e.attribute( "Unit" ).toDouble( &ok );
|
|
|
if ( ok )
|
|
|
rl->setDblHeight( dbl );
|
|
|
}
|
|
|
table->insertRowFormat(rl);
|
|
|
rowinfo = rowinfo.nextSibling();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void setSelectionInfo( TQDomNode * sheet, Sheet * /* table */ )
|
|
|
{
|
|
|
TQDomNode selections = sheet->namedItem("gmr:Selections");
|
|
|
TQDomNode selection = selections.namedItem("gmr:Selection");
|
|
|
|
|
|
/* Kspread does not support mutiple selections.. */
|
|
|
/* This code will set the selection to the last one GNUmeric's multiple
|
|
|
selections. */
|
|
|
while( !selection.isNull() )
|
|
|
{
|
|
|
TQDomElement e = selection.toElement(); // try to convert the node to an element.
|
|
|
TQRect kspread_selection;
|
|
|
|
|
|
kspread_selection.setLeft((e.attribute("startCol").toInt() + 1));
|
|
|
kspread_selection.setTop((e.attribute("startRow").toInt() + 1));
|
|
|
kspread_selection.setRight((e.attribute("endCol").toInt() + 1));
|
|
|
kspread_selection.setBottom((e.attribute("endRow").toInt() + 1));
|
|
|
|
|
|
/* can't set it in the table -- must set it to a view */
|
|
|
// table->setSelection(kspread_selection);
|
|
|
|
|
|
selection = selection.nextSibling();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void setObjectInfo(TQDomNode * sheet, Sheet * table)
|
|
|
{
|
|
|
TQDomNode gmr_objects = sheet->namedItem("gmr:Objects");
|
|
|
TQDomNode gmr_cellcomment = gmr_objects.namedItem("gmr:CellComment");
|
|
|
while( !gmr_cellcomment.isNull() )
|
|
|
{
|
|
|
TQDomElement e = gmr_cellcomment.toElement(); // try to convert the node to an element.
|
|
|
if (e.hasAttribute("Text"))
|
|
|
{
|
|
|
if (e.hasAttribute("ObjectBound"))
|
|
|
{
|
|
|
Point point(e.attribute("ObjectBound"));
|
|
|
Cell * cell = table->nonDefaultCell( point.pos().x(), point.pos().y() );
|
|
|
cell->format()->setComment(e.attribute("Text"));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
gmr_cellcomment = gmr_cellcomment.nextSibling();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void convertToPen( TQPen & pen, int style )
|
|
|
{
|
|
|
switch( style )
|
|
|
{
|
|
|
case 0:
|
|
|
break;
|
|
|
case 1:
|
|
|
pen.setStyle( Qt::SolidLine );
|
|
|
pen.setWidth( 1 );
|
|
|
break;
|
|
|
case 2:
|
|
|
pen.setStyle( Qt::SolidLine );
|
|
|
pen.setWidth( 2 );
|
|
|
break;
|
|
|
case 3:
|
|
|
pen.setStyle( Qt::DashLine );
|
|
|
pen.setWidth( 1 );
|
|
|
break;
|
|
|
case 4:
|
|
|
// width should be 1 but otherwise it would be the same as 7
|
|
|
pen.setStyle( Qt::DotLine );
|
|
|
pen.setWidth( 2 );
|
|
|
break;
|
|
|
case 5:
|
|
|
pen.setStyle( Qt::SolidLine );
|
|
|
pen.setWidth( 3 );
|
|
|
break;
|
|
|
case 6:
|
|
|
// TODO should be double
|
|
|
pen.setStyle( Qt::SolidLine );
|
|
|
pen.setWidth( 1 );
|
|
|
break;
|
|
|
case 7:
|
|
|
// very thin dots => no match in KSpread
|
|
|
pen.setStyle( Qt::DotLine );
|
|
|
pen.setWidth( 1 );
|
|
|
break;
|
|
|
case 8:
|
|
|
pen.setStyle( Qt::DashLine );
|
|
|
pen.setWidth( 2 );
|
|
|
break;
|
|
|
case 9:
|
|
|
pen.setStyle( Qt::DashDotLine );
|
|
|
pen.setWidth( 1 );
|
|
|
break;
|
|
|
case 10:
|
|
|
pen.setStyle( Qt::DashDotLine );
|
|
|
pen.setWidth( 2 );
|
|
|
break;
|
|
|
case 11:
|
|
|
pen.setStyle( Qt::DashDotDotLine );
|
|
|
pen.setWidth( 1 );
|
|
|
break;
|
|
|
case 12:
|
|
|
pen.setStyle( Qt::DashDotDotLine );
|
|
|
pen.setWidth( 2 );
|
|
|
break;
|
|
|
case 13:
|
|
|
// TODO: long dash, short dash, long dash,...
|
|
|
pen.setStyle( Qt::DashDotLine );
|
|
|
pen.setWidth( 3 );
|
|
|
break;
|
|
|
default:
|
|
|
pen.setStyle( Qt::SolidLine );
|
|
|
pen.setWidth( 1 );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void GNUMERICFilter::ParseBorder( TQDomElement & gmr_styleborder, Cell * kspread_cell )
|
|
|
{
|
|
|
TQDomNode gmr_diagonal = gmr_styleborder.namedItem("gmr:Diagonal");
|
|
|
TQDomNode gmr_rev_diagonal = gmr_styleborder.namedItem("gmr:Rev-Diagonal");
|
|
|
TQDomNode gmr_top = gmr_styleborder.namedItem("gmr:Top");
|
|
|
TQDomNode gmr_bottom = gmr_styleborder.namedItem("gmr:Bottom");
|
|
|
TQDomNode gmr_left = gmr_styleborder.namedItem("gmr:Left");
|
|
|
TQDomNode gmr_right = gmr_styleborder.namedItem("gmr:Right");
|
|
|
|
|
|
// NoPen - no line at all. For example,
|
|
|
// TQPainter::drawRect() fills but does not
|
|
|
// draw any explicit boundary
|
|
|
// line. SolidLine - a simple line. DashLine
|
|
|
// - dashes, separated by a few
|
|
|
// pixels. DotLine - dots, separated by a
|
|
|
// few pixels. DashDotLine - alternately
|
|
|
// dots and dashes. DashDotDotLine - one dash, two dots, one dash, two dots...
|
|
|
|
|
|
if ( !gmr_left.isNull() )
|
|
|
{
|
|
|
TQDomElement e = gmr_left.toElement(); // try to convert the node to an element.
|
|
|
importBorder( e, Left, kspread_cell);
|
|
|
}
|
|
|
|
|
|
if ( !gmr_right.isNull() )
|
|
|
{
|
|
|
TQDomElement e = gmr_right.toElement(); // try to convert the node to an element.
|
|
|
importBorder( e, Right, kspread_cell);
|
|
|
}
|
|
|
|
|
|
if ( !gmr_top.isNull() )
|
|
|
{
|
|
|
TQDomElement e = gmr_top.toElement(); // try to convert the node to an element.
|
|
|
importBorder( e, Top, kspread_cell);
|
|
|
}
|
|
|
|
|
|
if ( !gmr_bottom.isNull() )
|
|
|
{
|
|
|
TQDomElement e = gmr_bottom.toElement(); // try to convert the node to an element.
|
|
|
importBorder( e, Bottom, kspread_cell);
|
|
|
}
|
|
|
|
|
|
if ( !gmr_diagonal.isNull() )
|
|
|
{
|
|
|
TQDomElement e = gmr_diagonal.toElement(); // try to convert the node to an element.
|
|
|
importBorder( e, Diagonal, kspread_cell);
|
|
|
}
|
|
|
|
|
|
if ( !gmr_rev_diagonal.isNull() )
|
|
|
{
|
|
|
TQDomElement e = gmr_rev_diagonal.toElement(); // try to convert the node to an element.
|
|
|
importBorder( e, Revdiagonal, kspread_cell);
|
|
|
}
|
|
|
|
|
|
// TQDomElement gmr_styleborder_element = gmr_styleborder.toElement();
|
|
|
}
|
|
|
|
|
|
|
|
|
void GNUMERICFilter::importBorder( TQDomElement border, borderStyle _style, Cell *cell)
|
|
|
{
|
|
|
if ( !border.isNull() )
|
|
|
{
|
|
|
TQDomElement e = border.toElement(); // try to convert the node to an element.
|
|
|
if ( e.hasAttribute( "Style" ) )
|
|
|
{
|
|
|
int style = e.attribute( "Style" ).toInt();
|
|
|
|
|
|
TQPen pen;
|
|
|
convertToPen( pen, style );
|
|
|
|
|
|
if ( style > 0 )
|
|
|
{
|
|
|
switch( _style )
|
|
|
{
|
|
|
case Left:
|
|
|
cell->setLeftBorderPen( pen );
|
|
|
break;
|
|
|
case Right:
|
|
|
cell->setRightBorderPen( pen );
|
|
|
break;
|
|
|
case Top:
|
|
|
cell->setTopBorderPen( pen );
|
|
|
break;
|
|
|
case Bottom:
|
|
|
cell->setBottomBorderPen( pen );
|
|
|
break;
|
|
|
case Diagonal:
|
|
|
cell->format()->setFallDiagonalPen( pen ); // check if this is really Fall border
|
|
|
break;
|
|
|
case Revdiagonal:
|
|
|
cell->format()->setGoUpDiagonalPen( pen ); // check if this is really GoUp
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if ( e.hasAttribute( "Color" ) )
|
|
|
{
|
|
|
TQColor color;
|
|
|
TQString colorString = e.attribute( "Color" );
|
|
|
convert_string_to_qcolor( colorString, &color );
|
|
|
{
|
|
|
switch( _style )
|
|
|
{
|
|
|
case Left:
|
|
|
cell->format()->setLeftBorderColor( color );
|
|
|
break;
|
|
|
case Right:
|
|
|
cell->format()->setRightBorderColor( color );
|
|
|
break;
|
|
|
case Top:
|
|
|
cell->format()->setTopBorderColor( color );
|
|
|
break;
|
|
|
case Bottom:
|
|
|
cell->format()->setBottomBorderColor( color );
|
|
|
break;
|
|
|
case Diagonal:
|
|
|
cell->format()->setFallDiagonalColor( color );
|
|
|
break;
|
|
|
case Revdiagonal:
|
|
|
cell->format()->setGoUpDiagonalPen( color );
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
bool GNUMERICFilter::setType( Cell * kspread_cell,
|
|
|
TQString const & formatString,
|
|
|
TQString & cell_content )
|
|
|
{
|
|
|
int i = 0;
|
|
|
for ( i = 0; cell_format_date[i] ; ++i )
|
|
|
{
|
|
|
kdDebug(30521) << "Cell_format: " << cell_format_date[i] << ", FormatString: " << formatString << endl;
|
|
|
if ( ( formatString == "d/m/yy" ) || ( formatString == cell_format_date[i] ) )
|
|
|
{
|
|
|
kdDebug(30521) << " FormatString: Date: " << formatString << ", CellContent: " << cell_content << endl;
|
|
|
TQDate date;
|
|
|
if ( !kspread_cell->isDate() )
|
|
|
{
|
|
|
// convert cell_content to date
|
|
|
int y, m, d;
|
|
|
bool ok = true;
|
|
|
int val = cell_content.toInt( &ok );
|
|
|
|
|
|
kdDebug(30521) << "!!! FormatString: Date: " << formatString << ", CellContent: " << cell_content
|
|
|
<< ", Double: " << val << endl;
|
|
|
if ( !ok )
|
|
|
return false;
|
|
|
|
|
|
GnumericDate::jul2greg( val, y, m, d );
|
|
|
kdDebug(30521) << " num: " << val << ", y: " << y << ", m: " << m << ", d: " << d << endl;
|
|
|
|
|
|
date.setYMD( y, m, d );
|
|
|
}
|
|
|
else
|
|
|
date = kspread_cell->value().asDate();
|
|
|
|
|
|
FormatType type;
|
|
|
switch( i )
|
|
|
{
|
|
|
case 0: type = date_format5; break;
|
|
|
case 1: type = date_format6; break;
|
|
|
case 2: type = date_format1; break;
|
|
|
case 3: type = date_format2; break;
|
|
|
case 4: type = date_format3; break;
|
|
|
case 5: type = date_format4; break;
|
|
|
case 6: type = date_format11; break;
|
|
|
case 7: type = date_format12; break;
|
|
|
case 8: type = date_format19; break;
|
|
|
case 9: type = date_format18; break;
|
|
|
case 10: type = date_format20; break;
|
|
|
case 11: type = date_format21; break;
|
|
|
case 16: type = date_format7; break;
|
|
|
case 17: type = date_format22; break;
|
|
|
case 18: type = date_format8; break;
|
|
|
case 19: type = date_format9; break;
|
|
|
case 22: type = date_format25; break;
|
|
|
case 23: type = date_format14; break;
|
|
|
case 24: type = date_format25; break;
|
|
|
case 25: type = date_format26; break;
|
|
|
case 26: type = date_format16; break;
|
|
|
case 27: type = date_format15; break;
|
|
|
case 28: type = date_format16; break;
|
|
|
case 29: type = date_format15; break;
|
|
|
case 30: type = date_format24; break;
|
|
|
case 31: type = date_format23; break;
|
|
|
default:
|
|
|
type = ShortDate_format;
|
|
|
break;
|
|
|
/* 12, 13, 14, 15, 20, 21 */
|
|
|
}
|
|
|
|
|
|
kdDebug(30521) << "i: " << i << ", Type: " << type << ", Date: " << TQString(date.toString()) << endl;
|
|
|
|
|
|
kspread_cell->setValue( date );
|
|
|
kspread_cell->format()->setFormatType( type );
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for ( i = 0; cell_format_time[i] ; ++i )
|
|
|
{
|
|
|
if (formatString == cell_format_time[i])
|
|
|
{
|
|
|
TQTime time;
|
|
|
|
|
|
if ( !kspread_cell->isTime() )
|
|
|
{
|
|
|
bool ok = true;
|
|
|
double content = cell_content.toDouble( &ok );
|
|
|
|
|
|
kdDebug(30521) << " FormatString: Time: " << formatString << ", CellContent: " << cell_content
|
|
|
<< ", Double: " << content << endl;
|
|
|
|
|
|
if ( !ok )
|
|
|
return false;
|
|
|
|
|
|
time = GnumericDate::getTime( content );
|
|
|
}
|
|
|
else
|
|
|
time = kspread_cell->value().asTime();
|
|
|
|
|
|
FormatType type;
|
|
|
switch( i )
|
|
|
{
|
|
|
case 0: type = Time_format1; break;
|
|
|
case 1: type = Time_format2; break;
|
|
|
case 2: type = Time_format4; break;
|
|
|
case 3: type = Time_format5; break;
|
|
|
case 5: type = Time_format6; break;
|
|
|
case 6: type = Time_format6; break;
|
|
|
default:
|
|
|
type = Time_format1; break;
|
|
|
}
|
|
|
|
|
|
kdDebug(30521) << "i: " << i << ", Type: " << type << endl;
|
|
|
kspread_cell->setValue( time );
|
|
|
kspread_cell->format()->setFormatType( type );
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return false; // no date or time
|
|
|
}
|
|
|
|
|
|
TQString GNUMERICFilter::convertVars( TQString const & str, Sheet * table ) const
|
|
|
{
|
|
|
TQString result( str );
|
|
|
uint count = list1.count();
|
|
|
if ( count == 0 )
|
|
|
{
|
|
|
list1 << "&[TAB]" << "&[DATE]" << "&[PAGE]"
|
|
|
<< "&[PAGES]"<<"&[TIME]" << "&[FILE]";
|
|
|
list2 << "<sheet>" << "<date>" << "<page>"
|
|
|
<< "<pages>" << "<time>" << "<file>";
|
|
|
count = list1.count();
|
|
|
}
|
|
|
|
|
|
for ( uint i = 0; i < count; ++i )
|
|
|
{
|
|
|
int n = result.tqfind( list1[i] );
|
|
|
|
|
|
if ( n != -1 )
|
|
|
{
|
|
|
kdDebug(30521) << "Found var: " << list1[i] << endl;
|
|
|
if ( i == 0 )
|
|
|
result = result.tqreplace( list1[i], table->tableName() );
|
|
|
else
|
|
|
result = result.tqreplace( list1[i], list2[i] );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
double GNUMERICFilter::parseAttribute( const TQDomElement &_element )
|
|
|
{
|
|
|
TQString unit = _element.attribute( "PrefUnit" );
|
|
|
bool ok;
|
|
|
double value = _element.attribute("Points").toFloat( &ok );
|
|
|
if ( !ok )
|
|
|
value = 2.0;
|
|
|
if ( unit == "mm" )
|
|
|
return value;
|
|
|
else if ( unit == "cm" )
|
|
|
return ( value/10.0 );
|
|
|
else if ( unit == "in" )
|
|
|
return MM_TO_INCH( value );
|
|
|
else if ( unit == "Pt" || unit == "Px" || unit == "points" )
|
|
|
return MM_TO_POINT( value );
|
|
|
else
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
void GNUMERICFilter::ParsePrintInfo( TQDomNode const & printInfo, Sheet * table )
|
|
|
{
|
|
|
kdDebug(30521) << "Parsing print info " << endl;
|
|
|
|
|
|
float fleft = 2.0;
|
|
|
float fright = 2.0;
|
|
|
float ftop = 2.0;
|
|
|
float fbottom = 2.0;
|
|
|
|
|
|
TQString paperSize("A4");
|
|
|
TQString orientation("Portrait");
|
|
|
TQString footLeft, footMiddle, footRight;
|
|
|
TQString headLeft, headMiddle, headRight; // no we are zombies :-)
|
|
|
|
|
|
TQDomNode margins( printInfo.namedItem("gmr:Margins") );
|
|
|
if ( !margins.isNull() )
|
|
|
{
|
|
|
TQDomElement top( margins.namedItem( "gmr:top" ).toElement() );
|
|
|
if ( !top.isNull() )
|
|
|
ftop = parseAttribute( top );
|
|
|
|
|
|
TQDomElement bottom( margins.namedItem( "gmr:bottom" ).toElement() );
|
|
|
if ( !bottom.isNull() )
|
|
|
fbottom= parseAttribute( bottom );
|
|
|
|
|
|
TQDomElement left( margins.namedItem( "gmr:left" ).toElement() );
|
|
|
if ( !left.isNull() )
|
|
|
fleft = parseAttribute( left );
|
|
|
|
|
|
TQDomElement right( margins.namedItem( "gmr:right" ).toElement() );
|
|
|
if ( !right.isNull() )
|
|
|
fright = parseAttribute( right );
|
|
|
}
|
|
|
|
|
|
TQDomElement foot( printInfo.namedItem("gmr:Footer").toElement() );
|
|
|
if ( !foot.isNull() )
|
|
|
{
|
|
|
kdDebug(30521) << "Parsing footer: " << foot.attribute("Left") << ", " << foot.attribute("Middle") << ", "
|
|
|
<< foot.attribute("Right") << ", " <<endl;
|
|
|
if ( foot.hasAttribute("Left") )
|
|
|
footLeft = convertVars( foot.attribute("Left"), table );
|
|
|
if ( foot.hasAttribute("Middle") )
|
|
|
footMiddle = convertVars( foot.attribute("Middle"), table );
|
|
|
if ( foot.hasAttribute("Right") )
|
|
|
footRight = convertVars( foot.attribute("Right"), table );
|
|
|
}
|
|
|
|
|
|
TQDomElement head( printInfo.namedItem("gmr:Header").toElement() );
|
|
|
if ( !head.isNull() )
|
|
|
{
|
|
|
kdDebug(30521) << "Parsing header: " << head.attribute("Left") << ", " << head.attribute("Middle") << ", " << head.attribute("Right") << ", "<< endl;
|
|
|
if ( head.hasAttribute("Left") )
|
|
|
headLeft = convertVars( head.attribute("Left"), table );
|
|
|
if ( head.hasAttribute("Middle") )
|
|
|
headMiddle = convertVars( head.attribute("Middle"), table );
|
|
|
if ( head.hasAttribute("Right") )
|
|
|
headRight = convertVars( head.attribute("Right"), table );
|
|
|
}
|
|
|
|
|
|
TQDomElement repeateColumn( printInfo.namedItem("gmr:repeat_top").toElement() );
|
|
|
if ( !repeateColumn.isNull() )
|
|
|
{
|
|
|
TQString repeate = repeateColumn.attribute( "value" );
|
|
|
if ( !repeate.isEmpty() )
|
|
|
{
|
|
|
Range range(repeate);
|
|
|
//kdDebug()<<" repeate :"<<repeate<<"range. ::start row : "<<range.startRow ()<<" start col :"<<range.startCol ()<<" end row :"<<range.endRow ()<<" end col :"<<range.endCol ()<<endl;
|
|
|
table->print()->setPrintRepeatRows( tqMakePair( range.startRow (),range.endRow ()) );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
TQDomElement repeateRow( printInfo.namedItem("gmr:repeat_left").toElement() );
|
|
|
if ( !repeateRow.isNull() )
|
|
|
{
|
|
|
TQString repeate = repeateRow.attribute( "value" );
|
|
|
if ( !repeate.isEmpty() )
|
|
|
{
|
|
|
//fix row too high
|
|
|
repeate = repeate.tqreplace( "65536", "32500" );
|
|
|
Range range(repeate);
|
|
|
//kdDebug()<<" repeate :"<<repeate<<"range. ::start row : "<<range.startRow ()<<" start col :"<<range.startCol ()<<" end row :"<<range.endRow ()<<" end col :"<<range.endCol ()<<endl;
|
|
|
table->print()->setPrintRepeatColumns( tqMakePair( range.startCol (),range.endCol ()) );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
TQDomElement orient( printInfo.namedItem("gmr:orientation").toElement() );
|
|
|
if ( !orient.isNull() )
|
|
|
orientation = orient.text();
|
|
|
|
|
|
TQDomElement size( printInfo.namedItem("gmr:paper").toElement() );
|
|
|
if ( !size.isNull() )
|
|
|
paperSize = size.text();
|
|
|
|
|
|
table->print()->setPaperLayout( fleft, ftop, fright, fbottom,
|
|
|
paperSize, orientation );
|
|
|
|
|
|
table->print()->setHeadFootLine( headLeft, headMiddle, headRight,
|
|
|
footLeft, footMiddle, footRight );
|
|
|
}
|
|
|
|
|
|
void GNUMERICFilter::ParseFormat(TQString const & formatString, Cell * kspread_cell)
|
|
|
{
|
|
|
int l = formatString.length();
|
|
|
int lastPos = 0;
|
|
|
|
|
|
if (formatString[l - 1] == '%')
|
|
|
kspread_cell->format()->setFormatType(Percentage_format);
|
|
|
else if (formatString[0] == '$')
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType(Money_format);
|
|
|
kspread_cell->format()->setCurrency( 1, "$" );
|
|
|
lastPos = 1;
|
|
|
}
|
|
|
else if ((int)(formatString[0]) == '<EFBFBD>')
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType(Money_format);
|
|
|
kspread_cell->format()->setCurrency( 1, "<EFBFBD>" );
|
|
|
lastPos = 1;
|
|
|
}
|
|
|
else if ((int)(formatString[0]) == '<EFBFBD>')
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType(Money_format);
|
|
|
kspread_cell->format()->setCurrency( 1, "<EFBFBD>" );
|
|
|
lastPos = 1;
|
|
|
}
|
|
|
else if ((int)(formatString[0]) == '<EFBFBD>')
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType(Money_format);
|
|
|
kspread_cell->format()->setCurrency( 1, "<EFBFBD>" );
|
|
|
lastPos = 1;
|
|
|
}
|
|
|
else if (l > 1)
|
|
|
{
|
|
|
if ((formatString[0] == '[') && (formatString[1] == '$'))
|
|
|
{
|
|
|
int n = formatString.tqfind(']');
|
|
|
if (n != -1)
|
|
|
{
|
|
|
TQString currency = formatString.mid(2, n - 2);
|
|
|
kspread_cell->format()->setFormatType(Money_format);
|
|
|
kspread_cell->format()->setCurrency( 1, currency );
|
|
|
}
|
|
|
lastPos = ++n;
|
|
|
}
|
|
|
else if (formatString.tqfind("E+0") != -1)
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType(Scientific_format);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// do pattern matching with gnumeric formats
|
|
|
TQString content(kspread_cell->value().asString());
|
|
|
|
|
|
if ( setType(kspread_cell, formatString, content) )
|
|
|
return;
|
|
|
|
|
|
if (formatString.tqfind("?/?") != -1)
|
|
|
{
|
|
|
// TODO: fixme!
|
|
|
kspread_cell->format()->setFormatType( fraction_three_digits );
|
|
|
return;
|
|
|
}
|
|
|
// so it's nothing we want to understand:-)
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
while (formatString[lastPos] == ' ')
|
|
|
++lastPos;
|
|
|
|
|
|
// GetPrecision and decimal point, format of negative items...
|
|
|
|
|
|
// thousands separator
|
|
|
if (formatString[lastPos] == '#')
|
|
|
{
|
|
|
bool sep = true;
|
|
|
if (formatString[lastPos + 1] == ',')
|
|
|
lastPos += 2;
|
|
|
else
|
|
|
sep = false;
|
|
|
// since KSpread 1.3
|
|
|
// kspread_cell->setThousandsSeparator( sep );
|
|
|
}
|
|
|
|
|
|
while (formatString[lastPos] == ' ')
|
|
|
++lastPos;
|
|
|
|
|
|
int n = formatString.tqfind( '.', lastPos );
|
|
|
if ( n != -1)
|
|
|
{
|
|
|
lastPos = n + 1;
|
|
|
int precision = lastPos;
|
|
|
while (formatString[precision] == '0')
|
|
|
++precision;
|
|
|
|
|
|
int tmp = lastPos;
|
|
|
lastPos = precision;
|
|
|
precision -= tmp;
|
|
|
|
|
|
kspread_cell->format()->setPrecision( precision );
|
|
|
}
|
|
|
|
|
|
bool red = false;
|
|
|
if (formatString.tqfind("[RED]", lastPos) != -1)
|
|
|
{
|
|
|
red = true;
|
|
|
kspread_cell->format()->setFloatColor( Format::NegRed );
|
|
|
}
|
|
|
if ( formatString.tqfind('(', lastPos) != -1 )
|
|
|
{
|
|
|
if ( red )
|
|
|
kspread_cell->format()->setFloatColor( Format::NegRedBrackets );
|
|
|
else
|
|
|
kspread_cell->format()->setFloatColor( Format::NegBrackets );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void GNUMERICFilter::convertFormula( TQString & formula ) const
|
|
|
{
|
|
|
int n = formula.tqfind( '=', 1 );
|
|
|
|
|
|
// TODO: check if we do not screw something up here...
|
|
|
if ( n != -1 )
|
|
|
formula = formula.tqreplace( n, 1, "==" );
|
|
|
|
|
|
bool inQuote1 = false;
|
|
|
bool inQuote2 = false;
|
|
|
int l = formula.length();
|
|
|
for ( int i = 0; i < l; ++i )
|
|
|
{
|
|
|
if ( formula[i] == '\'' )
|
|
|
inQuote1 = !inQuote1;
|
|
|
else if ( formula[i] == '"' )
|
|
|
inQuote2 = !inQuote2;
|
|
|
else if ( formula[i] == ',' && !inQuote1 && !inQuote2 )
|
|
|
formula = formula.tqreplace( i, 1, ";" );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void GNUMERICFilter::setStyleInfo(TQDomNode * sheet, Sheet * table)
|
|
|
{
|
|
|
kdDebug(30521) << "SetStyleInfo entered " << endl;
|
|
|
|
|
|
int row, column;
|
|
|
TQDomNode styles = sheet->namedItem( "gmr:Styles" );
|
|
|
if ( !styles.isNull() )
|
|
|
{
|
|
|
// Get a style region within that sheet.
|
|
|
TQDomNode style_region = styles.namedItem( "gmr:StyleRegion" );
|
|
|
|
|
|
while ( !style_region.isNull() )
|
|
|
{
|
|
|
TQDomElement e = style_region.toElement(); // try to convert the node to an element.
|
|
|
|
|
|
TQDomNode style = style_region.namedItem( "gmr:Style" );
|
|
|
TQDomNode font = style.namedItem( "gmr:Font" );
|
|
|
TQDomNode validation = style.namedItem( "gmr:Validation" );
|
|
|
TQDomNode gmr_styleborder = style.namedItem( "gmr:StyleBorder" );
|
|
|
TQDomNode hyperlink = style.namedItem( "gmr:HyperLink" );
|
|
|
int startCol = e.attribute( "startCol" ).toInt() + 1;
|
|
|
int endCol = e.attribute( "endCol" ).toInt() + 1;
|
|
|
int startRow = e.attribute( "startRow" ).toInt() + 1;
|
|
|
int endRow = e.attribute( "endRow" ).toInt() + 1;
|
|
|
|
|
|
kdDebug(30521) << "------Style: " << startCol << ", "
|
|
|
<< startRow << " - " << endCol << ", " << endRow << endl;
|
|
|
|
|
|
if ( endCol - startCol > 200 || endRow - startRow > 200 )
|
|
|
{
|
|
|
style_region = style_region.nextSibling();
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
for ( column = startCol; column <= endCol; ++column )
|
|
|
{
|
|
|
for ( row = startRow; row <= endRow; ++row )
|
|
|
{
|
|
|
kdDebug(30521) << "Cell: " << column << ", " << row << endl;
|
|
|
Cell * kspread_cell = table->cellAt( column, row, false );
|
|
|
|
|
|
// don't create new cells -> don't apply format on empty cells, if bigger region
|
|
|
if ( ( kspread_cell->isDefault() || kspread_cell->isEmpty() )
|
|
|
&& ( ( endCol - startCol > 2 ) || ( endRow - startRow > 2 ) ) )
|
|
|
{
|
|
|
kdDebug(30521) << "CELL EMPTY OR RANGE TOO BIG " << endl;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
TQDomElement style_element = style.toElement(); // try to convert the node to an element.
|
|
|
|
|
|
kdDebug(30521) << "Style valid for kspread" << endl;
|
|
|
kspread_cell = table->nonDefaultCell( column, row, false );
|
|
|
|
|
|
if (style_element.hasAttribute("Fore"))
|
|
|
{
|
|
|
TQString color_string = style_element.attribute("Fore");
|
|
|
TQColor color;
|
|
|
convert_string_to_qcolor(color_string, &color);
|
|
|
kspread_cell->format()->setTextColor(color);
|
|
|
}
|
|
|
|
|
|
if (style_element.hasAttribute("Back"))
|
|
|
{
|
|
|
TQString color_string = style_element.attribute("Back");
|
|
|
TQColor color;
|
|
|
convert_string_to_qcolor(color_string, &color);
|
|
|
kspread_cell->format()->setBgColor(color);
|
|
|
}
|
|
|
|
|
|
if (style_element.hasAttribute("PatternColor"))
|
|
|
{
|
|
|
TQString color_string = style_element.attribute("PatternColor");
|
|
|
TQColor color;
|
|
|
convert_string_to_qcolor(color_string, &color);
|
|
|
kspread_cell->format()->setBackGroundBrushColor( color );
|
|
|
}
|
|
|
|
|
|
if (style_element.hasAttribute("Shade"))
|
|
|
{
|
|
|
/* Pattern's taken from: gnumeric's pattern.c */
|
|
|
/* if "TODO" added: doesn't match exactly the gnumeric one */
|
|
|
|
|
|
TQString shade = style_element.attribute("Shade");
|
|
|
if (shade == "0")
|
|
|
{
|
|
|
// nothing to do
|
|
|
}
|
|
|
else if (shade == "1")
|
|
|
{
|
|
|
/* 1 Solid */
|
|
|
//kspread_cell->format()->setBackGroundBrushStyle(Qt::SolidPattern);
|
|
|
//This is as empty
|
|
|
/* What should this be? */
|
|
|
|
|
|
}
|
|
|
else if (shade == "2")
|
|
|
{
|
|
|
/* 2 75% */
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::Dense2Pattern);
|
|
|
}
|
|
|
else if (shade == "3")
|
|
|
{
|
|
|
/* 3 50% */
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::Dense4Pattern);
|
|
|
}
|
|
|
else if (shade == "4")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::Dense5Pattern);
|
|
|
/* This should be 25%... All qt has is 37% */
|
|
|
|
|
|
/* 4 25% */
|
|
|
}
|
|
|
else if (shade == "5")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::Dense6Pattern);
|
|
|
/* 5 12.5% */
|
|
|
}
|
|
|
else if (shade == "6")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::Dense7Pattern);
|
|
|
/* 6 6.25% */
|
|
|
|
|
|
}
|
|
|
else if (shade == "7")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::HorPattern);
|
|
|
/* 7Qt::Horizontal Stripe */
|
|
|
}
|
|
|
else if (shade == "8")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::VerPattern);
|
|
|
/* 8Qt::Vertical Stripe */
|
|
|
}
|
|
|
else if (shade == "9")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::BDiagPattern);
|
|
|
/* 9 Reverse Diagonal Stripe */
|
|
|
}
|
|
|
else if (shade == "10")
|
|
|
{
|
|
|
/* 10 Diagonal Stripe */
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::FDiagPattern);
|
|
|
}
|
|
|
else if (shade == "11")
|
|
|
{
|
|
|
/* 11 Diagonal Crosshatch */
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::DiagCrossPattern);
|
|
|
}
|
|
|
else if (shade == "12")
|
|
|
{
|
|
|
/* 12 Thick Diagonal Crosshatch TODO!*/
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::DiagCrossPattern);
|
|
|
}
|
|
|
else if (shade == "13")
|
|
|
{
|
|
|
/* 13 ThinQt::Horizontal Stripe TODO: wrong: this is thick!*/
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::HorPattern);
|
|
|
}
|
|
|
else if (shade == "14")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::VerPattern);
|
|
|
}
|
|
|
else if (shade == "15")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::FDiagPattern);
|
|
|
}
|
|
|
else if (shade == "16")
|
|
|
{
|
|
|
/* 16 Thick Reverse Stripe TODO:*/
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::BDiagPattern);
|
|
|
}
|
|
|
else if (shade == "17")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::DiagCrossPattern);
|
|
|
}
|
|
|
else if (shade == "18")
|
|
|
{
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::DiagCrossPattern);
|
|
|
}
|
|
|
else if (shade == "19")
|
|
|
{
|
|
|
/* 19 Applix small circle */
|
|
|
}
|
|
|
else if (shade == "20")
|
|
|
{
|
|
|
/* 20 Applix semicircle */
|
|
|
}
|
|
|
else if (shade == "21")
|
|
|
{
|
|
|
/* 21 Applix small thatch */
|
|
|
}
|
|
|
else if (shade == "22")
|
|
|
{
|
|
|
/* 22 Applix round thatch */
|
|
|
}
|
|
|
else if (shade == "23")
|
|
|
{
|
|
|
/* 23 Applix Brick */
|
|
|
}
|
|
|
else if (shade == "24")
|
|
|
{
|
|
|
/* 24 100% */
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::SolidPattern);
|
|
|
}
|
|
|
else if (shade == "25")
|
|
|
{
|
|
|
/* 25 87.5% */
|
|
|
kspread_cell->format()->setBackGroundBrushStyle(Qt::Dense2Pattern);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if ( style_element.hasAttribute( "Rotation" ) )
|
|
|
{
|
|
|
int rot = style_element.attribute( "Rotation" ).toInt();
|
|
|
kspread_cell->format()->setAngle( -1* rot );
|
|
|
}
|
|
|
if (style_element.hasAttribute("Indent"))
|
|
|
{
|
|
|
double indent = style_element.attribute("Indent").toDouble();
|
|
|
// gnumeric saves indent in characters, we in points:
|
|
|
kspread_cell->format()->setIndent( indent * 10.0 );
|
|
|
}
|
|
|
|
|
|
if (style_element.hasAttribute("HAlign"))
|
|
|
{
|
|
|
TQString halign_string=style_element.attribute("HAlign");
|
|
|
|
|
|
if (halign_string == "1")
|
|
|
{
|
|
|
/* General: No equivalent in Kspread. */
|
|
|
}
|
|
|
else if (halign_string == "2")
|
|
|
{
|
|
|
kspread_cell->format()->setAlign(Format::Left);
|
|
|
}
|
|
|
else if (halign_string == "4")
|
|
|
{
|
|
|
kspread_cell->format()->setAlign(Format::Right);
|
|
|
}
|
|
|
else if (halign_string == "8")
|
|
|
{
|
|
|
kspread_cell->format()->setAlign(Format::Center);
|
|
|
}
|
|
|
else if (halign_string == "16")
|
|
|
{
|
|
|
/* Fill: No equivalent in Kspread. */
|
|
|
}
|
|
|
else if (halign_string == "32")
|
|
|
{
|
|
|
/* Justify: No equivalent in Kspread */
|
|
|
}
|
|
|
else if (halign_string == "64")
|
|
|
{
|
|
|
/* Centered across selection*/
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (style_element.hasAttribute("VAlign"))
|
|
|
{
|
|
|
TQString valign_string=style_element.attribute("VAlign");
|
|
|
|
|
|
if (valign_string == "1")
|
|
|
{
|
|
|
/* General: No equivalent in Kspread. */
|
|
|
kspread_cell->format()->setAlignY(Format::Top);
|
|
|
}
|
|
|
else if (valign_string == "2")
|
|
|
{
|
|
|
kspread_cell->format()->setAlignY(Format::Bottom);
|
|
|
}
|
|
|
else if (valign_string == "4")
|
|
|
{
|
|
|
kspread_cell->format()->setAlignY(Format::Middle);
|
|
|
}
|
|
|
else if (valign_string == "8")
|
|
|
{
|
|
|
/* Justify: No equivalent in Kspread */
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (style_element.hasAttribute("WrapText"))
|
|
|
{
|
|
|
TQString multiRow = style_element.attribute("WrapText");
|
|
|
|
|
|
if ( multiRow == "1" )
|
|
|
kspread_cell->format()->setMultiRow( true );
|
|
|
}
|
|
|
|
|
|
if (style_element.hasAttribute("Format"))
|
|
|
{
|
|
|
TQString formatString = style_element.attribute("Format");
|
|
|
|
|
|
kdDebug(30521) << "Format: " << formatString << endl;
|
|
|
ParseFormat(formatString, kspread_cell);
|
|
|
|
|
|
} // End "Format"
|
|
|
|
|
|
if (!gmr_styleborder.isNull())
|
|
|
{
|
|
|
TQDomElement style_element = gmr_styleborder.toElement(); // try to convert the node to an element.
|
|
|
ParseBorder( style_element, kspread_cell );
|
|
|
}
|
|
|
if ( !validation.isNull() )
|
|
|
{
|
|
|
TQDomElement validation_element = validation.toElement();
|
|
|
if ( !validation_element.isNull() )
|
|
|
{
|
|
|
kdDebug(30521)<<" Cell validation \n";
|
|
|
Validity* kspread_validity = kspread_cell->getValidity();
|
|
|
if ( validation_element.hasAttribute( "AllowBlank" ) && validation_element.attribute( "AllowBlank" )=="true" )
|
|
|
{
|
|
|
kspread_validity->allowEmptyCell=true;
|
|
|
}
|
|
|
if ( validation_element.hasAttribute( "Title" ))
|
|
|
{
|
|
|
kspread_validity->title=validation_element.attribute( "Title" );
|
|
|
}
|
|
|
if ( validation_element.hasAttribute( "Message" ))
|
|
|
{
|
|
|
kspread_validity->message=validation_element.attribute( "Message" );
|
|
|
}
|
|
|
if ( validation_element.hasAttribute( "Style" ) )
|
|
|
{
|
|
|
int value = validation_element.attribute( "Style" ).toInt();
|
|
|
switch( value )
|
|
|
{
|
|
|
case 0:
|
|
|
kspread_validity->displayMessage=false;
|
|
|
break;
|
|
|
case 1:
|
|
|
kspread_validity->m_action=Action::Stop;
|
|
|
break;
|
|
|
case 2:
|
|
|
kspread_validity->m_action=Action::Warning;
|
|
|
break;
|
|
|
case 3:
|
|
|
kspread_validity->m_action=Action::Information;
|
|
|
break;
|
|
|
default:
|
|
|
kdDebug()<<" Error in validation style :"<<value<<endl;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
TQDomNode expression0 = validation_element.namedItem( "gmr:Expression0" );
|
|
|
TQDomNode expression1 = validation_element.namedItem( "gmr:Expression1" );
|
|
|
//kdDebug()<<" expression0.isNull() "<<expression0.isNull()<<endl;
|
|
|
//kdDebug()<<" expression1.isNull() "<<expression1.isNull()<<endl;
|
|
|
if ( validation_element.hasAttribute( "Type" ) )
|
|
|
{
|
|
|
int valueOp = validation_element.attribute( "Type" ).toInt();
|
|
|
switch( valueOp )
|
|
|
{
|
|
|
case 0:
|
|
|
kspread_validity->m_restriction=Restriction::None;
|
|
|
break;
|
|
|
case 1:
|
|
|
{
|
|
|
kspread_validity->m_restriction=Restriction::Integer;
|
|
|
if ( validation_element.hasAttribute( "Operator" ) )
|
|
|
{
|
|
|
int value = validation_element.attribute( "Operator" ).toInt();
|
|
|
|
|
|
switch( value )
|
|
|
{
|
|
|
case 0:
|
|
|
kspread_validity->m_cond=Conditional::Between;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->valMax=expression1.toElement().text().toInt();
|
|
|
break;
|
|
|
case 1:
|
|
|
kspread_validity->m_cond=Conditional::DifferentTo;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->valMax=expression1.toElement().text().toInt();
|
|
|
break;
|
|
|
case 2:
|
|
|
kspread_validity->m_cond=Conditional::Equal;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 3:
|
|
|
kspread_validity->m_cond=Conditional::Different;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 4:
|
|
|
kspread_validity->m_cond=Conditional::Superior;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 5:
|
|
|
kspread_validity->m_cond=Conditional::Inferior;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 6:
|
|
|
kspread_validity->m_cond=Conditional::SuperiorEqual;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 7:
|
|
|
kspread_validity->m_cond=Conditional::InferiorEqual;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
default:
|
|
|
kdDebug()<<" Error in validation Operator :"<<value<<endl;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case 2:
|
|
|
kspread_validity->m_restriction=Restriction::Number;
|
|
|
if ( validation_element.hasAttribute( "Operator" ) )
|
|
|
{
|
|
|
int value = validation_element.attribute( "Operator" ).toInt();
|
|
|
switch( value )
|
|
|
{
|
|
|
case 0:
|
|
|
kspread_validity->m_cond=Conditional::Between;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->valMax=expression1.toElement().text().toInt();
|
|
|
break;
|
|
|
case 1:
|
|
|
kspread_validity->m_cond=Conditional::DifferentTo;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->valMax=expression1.toElement().text().toInt();
|
|
|
break;
|
|
|
case 2:
|
|
|
kspread_validity->m_cond=Conditional::Equal;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 3:
|
|
|
kspread_validity->m_cond=Conditional::Different;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 4:
|
|
|
kspread_validity->m_cond=Conditional::Superior;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 5:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
kspread_validity->m_cond=Conditional::Inferior;
|
|
|
break;
|
|
|
case 6:
|
|
|
kspread_validity->m_cond=Conditional::SuperiorEqual;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 7:
|
|
|
kspread_validity->m_cond=Conditional::InferiorEqual;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
default:
|
|
|
kdDebug()<<" Error in validation Operator :"<<value<<endl;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case 3:
|
|
|
kspread_validity->m_restriction=Restriction::List;
|
|
|
break;
|
|
|
case 4:
|
|
|
kspread_validity->m_restriction=Restriction::Date;
|
|
|
if ( validation_element.hasAttribute( "Operator" ) )
|
|
|
{
|
|
|
int value = validation_element.attribute( "Operator" ).toInt();
|
|
|
switch( value )
|
|
|
{
|
|
|
case 0:
|
|
|
kspread_validity->m_cond=Conditional::Between;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->dateMin=TQDate::fromString( expression0.toElement().text() );
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->dateMax=TQDate::fromString( expression1.toElement().text() );
|
|
|
|
|
|
break;
|
|
|
case 1:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->dateMin=TQDate::fromString( expression0.toElement().text() );
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->dateMax=TQDate::fromString( expression1.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::DifferentTo;
|
|
|
break;
|
|
|
case 2:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->dateMin=TQDate::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::Equal;
|
|
|
break;
|
|
|
case 3:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->dateMin=TQDate::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::Different;
|
|
|
break;
|
|
|
case 4:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->dateMin=TQDate::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::Superior;
|
|
|
break;
|
|
|
case 5:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->dateMin=TQDate::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::Inferior;
|
|
|
break;
|
|
|
case 6:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->dateMin=TQDate::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::SuperiorEqual;
|
|
|
break;
|
|
|
case 7:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->dateMin=TQDate::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::InferiorEqual;
|
|
|
break;
|
|
|
default:
|
|
|
kdDebug()<<" Error in validation Operator :"<<value<<endl;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case 5:
|
|
|
kspread_validity->m_restriction=Restriction::Time;
|
|
|
if ( validation_element.hasAttribute( "Operator" ) )
|
|
|
{
|
|
|
int value = validation_element.attribute( "Operator" ).toInt();
|
|
|
switch( value )
|
|
|
{
|
|
|
case 0:
|
|
|
kspread_validity->m_cond=Conditional::Between;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->timeMin=TQTime::fromString( expression0.toElement().text() );
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->timeMax=TQTime::fromString( expression1.toElement().text() );
|
|
|
break;
|
|
|
case 1:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->timeMin=TQTime::fromString( expression0.toElement().text() );
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->timeMax=TQTime::fromString( expression1.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::DifferentTo;
|
|
|
break;
|
|
|
case 2:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->timeMin=TQTime::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::Equal;
|
|
|
break;
|
|
|
case 3:
|
|
|
kspread_validity->m_cond=Conditional::Different;
|
|
|
break;
|
|
|
case 4:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->timeMin=TQTime::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::Superior;
|
|
|
break;
|
|
|
case 5:
|
|
|
kspread_validity->m_cond=Conditional::Inferior;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->timeMin=TQTime::fromString( expression0.toElement().text() );
|
|
|
break;
|
|
|
case 6:
|
|
|
kspread_validity->m_cond=Conditional::SuperiorEqual;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->timeMin=TQTime::fromString( expression0.toElement().text() );
|
|
|
break;
|
|
|
case 7:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->timeMin=TQTime::fromString( expression0.toElement().text() );
|
|
|
kspread_validity->m_cond=Conditional::InferiorEqual;
|
|
|
break;
|
|
|
default:
|
|
|
kdDebug()<<" Error in validation Operator :"<<value<<endl;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case 6:
|
|
|
kspread_validity->m_restriction=Restriction::TextLength;
|
|
|
if ( validation_element.hasAttribute( "Operator" ) )
|
|
|
{
|
|
|
int value = validation_element.attribute( "Operator" ).toInt();
|
|
|
switch( value )
|
|
|
{
|
|
|
case 0:
|
|
|
kspread_validity->m_cond=Conditional::Between;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->valMax=expression1.toElement().text().toInt();
|
|
|
break;
|
|
|
case 1:
|
|
|
kspread_validity->m_cond=Conditional::DifferentTo;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
if ( !expression1.isNull() )
|
|
|
kspread_validity->valMax=expression1.toElement().text().toInt();
|
|
|
break;
|
|
|
case 2:
|
|
|
kspread_validity->m_cond=Conditional::Equal;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 3:
|
|
|
kspread_validity->m_cond=Conditional::Different;
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
break;
|
|
|
case 4:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
kspread_validity->m_cond=Conditional::Superior;
|
|
|
break;
|
|
|
case 5:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
kspread_validity->m_cond=Conditional::Inferior;
|
|
|
break;
|
|
|
case 6:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
kspread_validity->m_cond=Conditional::SuperiorEqual;
|
|
|
break;
|
|
|
case 7:
|
|
|
if ( !expression0.isNull() )
|
|
|
kspread_validity->valMin=expression0.toElement().text().toInt();
|
|
|
kspread_validity->m_cond=Conditional::InferiorEqual;
|
|
|
break;
|
|
|
default:
|
|
|
kdDebug()<<" Error in validation Operator :"<<value<<endl;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
kdDebug()<<" Error in Type element : "<<valueOp<<endl;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
//<gmr:Validation Style="0" Type="1" Operator="0" AllowBlank="true" UseDropdown="false">
|
|
|
//<gmr:Expression0>745</gmr:Expression0>
|
|
|
//<gmr:Expression1>4546</gmr:Expression1>
|
|
|
}
|
|
|
}
|
|
|
if (!font.isNull())
|
|
|
{
|
|
|
TQDomElement font_element = font.toElement();
|
|
|
|
|
|
kspread_cell->format()->setTextFontFamily( font_element.text() );
|
|
|
|
|
|
if (!font_element.isNull())
|
|
|
{
|
|
|
if (font_element.attribute("Italic") == "1")
|
|
|
{ kspread_cell->format()->setTextFontItalic(true); }
|
|
|
|
|
|
if (font_element.attribute("Bold") == "1")
|
|
|
{ kspread_cell->format()->setTextFontBold(true); }
|
|
|
|
|
|
if (font_element.hasAttribute("Underline") && ( font_element.attribute("Underline") != "0") )
|
|
|
{ kspread_cell->format()->setTextFontUnderline(true); }
|
|
|
|
|
|
if (font_element.hasAttribute("StrikeThrough" ) && ( font_element.attribute("StrikeThrough") != "0") )
|
|
|
{ kspread_cell->format()->setTextFontStrike(true); }
|
|
|
|
|
|
if (font_element.hasAttribute("Unit"))
|
|
|
{ kspread_cell->format()->setTextFontSize(font_element.attribute("Unit").toInt()); }
|
|
|
|
|
|
}
|
|
|
if ( !hyperlink.isNull() )
|
|
|
{
|
|
|
//<gmr:HyperLink type="GnmHLinkURL" target="www.kde.org"/>
|
|
|
if ( hyperlink.toElement().hasAttribute( "type" ) )
|
|
|
{
|
|
|
TQString linkType= hyperlink.toElement().attribute( "type" );
|
|
|
TQString target = hyperlink.toElement().attribute( "target" );
|
|
|
TQString tip = hyperlink.toElement().attribute( "tip" );
|
|
|
if ( !tip.isEmpty() )
|
|
|
kspread_cell->setCellText( tip );
|
|
|
if ( linkType=="GnmHLinkURL" )
|
|
|
{
|
|
|
if ( !target.startsWith( "http://" ) )
|
|
|
target="http://"+target;
|
|
|
kspread_cell->setLink( target );
|
|
|
}
|
|
|
else if ( linkType=="GnmHLinkEMail" )
|
|
|
{
|
|
|
if ( !target.startsWith( "mailto:/" ) )
|
|
|
target="mailto:/"+target;
|
|
|
kspread_cell->setLink( target );
|
|
|
}
|
|
|
else if ( linkType=="GnmHLinkExternal" )
|
|
|
{
|
|
|
if ( !target.startsWith( "file://" ) )
|
|
|
target="file://"+target;
|
|
|
|
|
|
kspread_cell->setLink( target );
|
|
|
}
|
|
|
else if ( linkType=="GnmHLinkCurWB" )
|
|
|
{
|
|
|
kspread_cell->setLink( target );
|
|
|
}
|
|
|
else
|
|
|
kdDebug()<<" linkType not defined : "<<linkType<<endl;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
style_region = style_region.nextSibling();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* NOTE: As of now everything is in a single huge function. This is
|
|
|
very ugly. It should all be broken up into smaller
|
|
|
functions, probably one for each GNUMeric section. It kind
|
|
|
of grew out of control. It could probably be cleaned up in
|
|
|
an hour or so. --PGE
|
|
|
*/
|
|
|
|
|
|
|
|
|
KoFilter::ConversiontqStatus GNUMERICFilter::convert( const TQCString & from, const TQCString & to )
|
|
|
{
|
|
|
dateInit();
|
|
|
bool bSuccess=true;
|
|
|
|
|
|
kdDebug(30521) << "Entering GNUmeric Import filter." << endl;
|
|
|
|
|
|
KoDocument * document = m_chain->outputDocument();
|
|
|
if ( !document )
|
|
|
return KoFilter::StupidError;
|
|
|
|
|
|
kdDebug(30521) << "here we go... " << document->className() << endl;
|
|
|
|
|
|
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 ( from != "application/x-gnumeric" || to != "application/x-kspread" )
|
|
|
{
|
|
|
kdWarning(30521) << "Invalid mimetypes " << from << " " << to << endl;
|
|
|
return KoFilter::NotImplemented;
|
|
|
}
|
|
|
|
|
|
kdDebug(30521) << "...still here..." << endl;
|
|
|
|
|
|
// No need for a dynamic cast here, since we use TQt's tqmoc magic
|
|
|
Doc * ksdoc = ( Doc * ) document;
|
|
|
|
|
|
if ( ksdoc->mimeType() != "application/x-kspread" )
|
|
|
{
|
|
|
kdWarning(30521) << "Invalid document mimetype " << ksdoc->mimeType() << endl;
|
|
|
return KoFilter::NotImplemented;
|
|
|
}
|
|
|
|
|
|
|
|
|
TQIODevice* in = KFilterDev::deviceForFile(m_chain->inputFile(),"application/x-gzip");
|
|
|
|
|
|
if ( !in )
|
|
|
{
|
|
|
kdError(30521) << "Cannot create device for uncompressing! Aborting!" << endl;
|
|
|
return KoFilter::FileNotFound;
|
|
|
}
|
|
|
|
|
|
if (!in->open(IO_ReadOnly))
|
|
|
{
|
|
|
kdError(30521) << "Cannot open file for uncompressing! Aborting!" << endl;
|
|
|
delete in;
|
|
|
return KoFilter::FileNotFound;
|
|
|
}
|
|
|
|
|
|
TQDomDocument doc;
|
|
|
TQString errorMsg;
|
|
|
int errorLine, errorColumn;
|
|
|
if ( !doc.setContent(in, &errorMsg, &errorLine, &errorColumn) )
|
|
|
{
|
|
|
kdError(30521) << "Parsing error in " << from << "! Aborting!" << endl
|
|
|
<< " In line: " << errorLine << ", column: " << errorColumn << endl
|
|
|
<< " Error message: " << errorMsg << endl;
|
|
|
in->close();
|
|
|
return KoFilter::ParsingError;
|
|
|
}
|
|
|
|
|
|
in->close();
|
|
|
delete in;
|
|
|
|
|
|
int row, column;
|
|
|
int value = 0;
|
|
|
int currentTab = -1;
|
|
|
int selectedTab = 0;
|
|
|
Sheet * selTable = 0;
|
|
|
|
|
|
TQDomElement docElem = doc.documentElement();
|
|
|
TQDomElement uiData = docElem.namedItem("gmr:UIData").toElement();
|
|
|
if ( !uiData.isNull() )
|
|
|
{
|
|
|
if ( uiData.hasAttribute( "SelectedTab" ) )
|
|
|
{
|
|
|
bool ok = false;
|
|
|
int n = uiData.attribute( "SelectedTab" ).toInt( &ok );
|
|
|
if ( ok )
|
|
|
{
|
|
|
selectedTab = n;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
TQDomNode sheets = docElem.namedItem("gmr:Sheets");
|
|
|
if ( sheets.isNull() )
|
|
|
{
|
|
|
//avoid crash with new file format.
|
|
|
//TODO allow to load new file format
|
|
|
return KoFilter::ParsingError;
|
|
|
}
|
|
|
TQDomNode sheet = sheets.namedItem("gmr:Sheet");
|
|
|
|
|
|
/* This sets the Document information. */
|
|
|
set_document_info( document, &docElem );
|
|
|
|
|
|
/* This sets the Document attributes */
|
|
|
set_document_attributes( ksdoc, &docElem );
|
|
|
|
|
|
/* This sets the Area Names */
|
|
|
set_document_area_names( ksdoc, &docElem );
|
|
|
|
|
|
Sheet * table;
|
|
|
|
|
|
// This is a mapping of exprID to expressions.
|
|
|
|
|
|
TQDict<char> exprID_dict( 17, FALSE );
|
|
|
int num = 1;
|
|
|
|
|
|
while (!sheet.isNull())
|
|
|
{
|
|
|
++currentTab;
|
|
|
table = ksdoc->map()->addNewSheet();
|
|
|
|
|
|
if ( currentTab == selectedTab )
|
|
|
selTable = table;
|
|
|
|
|
|
TQDomElement name = sheet.namedItem( "gmr:Name" ).toElement();
|
|
|
TQDomElement sheetElement = sheet.toElement();
|
|
|
|
|
|
if ( !name.isNull() )
|
|
|
table->setSheetName( name.text(), false, false );
|
|
|
else
|
|
|
table->setSheetName( "Sheet" + TQString::number( num ), false, false );
|
|
|
table->enableScrollBarUpdates( false );
|
|
|
|
|
|
//kdDebug()<<" sheetElement.hasAttribute( DisplayFormulas ) :"<<sheetElement.hasAttribute( "DisplayFormulas" )<<endl;
|
|
|
TQString tmp;
|
|
|
if ( sheetElement.hasAttribute( "DisplayFormulas" ) )
|
|
|
{
|
|
|
tmp=sheetElement.attribute( "DisplayFormulas");
|
|
|
table->setShowFormula( ( tmp=="true" )||( tmp=="1" ) );
|
|
|
}
|
|
|
if ( sheetElement.hasAttribute( "HideZero" ) )
|
|
|
{
|
|
|
tmp = sheetElement.attribute( "HideZero" );
|
|
|
table->setHideZero( ( tmp=="true" )||( tmp=="1" ) );
|
|
|
}
|
|
|
if ( sheetElement.hasAttribute( "HideGrid" ) )
|
|
|
{
|
|
|
tmp = sheetElement.attribute( "HideGrid" );
|
|
|
table->setShowGrid( ( tmp=="false" )||( tmp=="0" ) );
|
|
|
}
|
|
|
if ( sheetElement.hasAttribute( "HideColHeader" ) )
|
|
|
{
|
|
|
tmp = sheetElement.attribute( "HideColHeader" );
|
|
|
ksdoc->setShowColumnHeader( ( tmp=="false" )||( tmp=="0" ) );
|
|
|
}
|
|
|
if ( sheetElement.hasAttribute( "HideRowHeader" ) )
|
|
|
{
|
|
|
tmp =sheetElement.attribute( "HideRowHeader" );
|
|
|
ksdoc->setShowRowHeader( ( tmp=="false" )||( tmp=="0" ) );
|
|
|
}
|
|
|
|
|
|
|
|
|
setObjectInfo(&sheet, table);
|
|
|
setColInfo(&sheet, table);
|
|
|
setRowInfo(&sheet, table);
|
|
|
setSelectionInfo(&sheet, table);
|
|
|
|
|
|
/* handling print information */
|
|
|
TQDomNode printInfo = sheet.namedItem("gmr:PrintInformation");
|
|
|
if ( !printInfo.isNull() )
|
|
|
ParsePrintInfo( printInfo, table );
|
|
|
|
|
|
kdDebug(30521) << "Reading in cells" << endl;
|
|
|
|
|
|
/* CELL handling START */
|
|
|
TQDomNode cells = sheet.namedItem( "gmr:Cells" );
|
|
|
TQDomNode cell = cells.namedItem( "gmr:Cell" );
|
|
|
TQDomNode mergedCells = sheet.namedItem( "gmr:MergedRegions" );
|
|
|
TQDomNode mergedRegion = mergedCells.namedItem( "gmr:Merge" );
|
|
|
if ( cell.isNull() )
|
|
|
{
|
|
|
kdWarning(30521) << "No cells" << endl;
|
|
|
}
|
|
|
|
|
|
while ( !cell.isNull() )
|
|
|
{
|
|
|
value += 2;
|
|
|
emit sigProgress(value);
|
|
|
|
|
|
TQDomElement e = cell.toElement(); // try to convert the node to an element.
|
|
|
if ( !e.isNull() )
|
|
|
{ // the node was really an element.
|
|
|
kdDebug(30521) << "New Cell " << endl;
|
|
|
TQDomNode content_node = cell.namedItem("gmr:Content");
|
|
|
|
|
|
if (!content_node.isNull())
|
|
|
{
|
|
|
TQDomElement content = content_node.toElement();
|
|
|
|
|
|
if( !content.isNull() )
|
|
|
{ // the node was really an element.
|
|
|
column = e.attribute( "Col" ).toInt() + 1;
|
|
|
row = e.attribute( "Row" ).toInt() + 1;
|
|
|
|
|
|
TQString cell_content( content.text() );
|
|
|
//kdDebug()<<"cell_content :!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :"<<cell_content<<endl;
|
|
|
if ( cell_content[0] == '=' )
|
|
|
convertFormula( cell_content );
|
|
|
|
|
|
Cell * kspread_cell = table->nonDefaultCell( column, row );
|
|
|
|
|
|
if (e.hasAttribute("ValueType"))
|
|
|
{
|
|
|
// TODO: what is this for?
|
|
|
// <xsd:enumeration value="10"/> <!-- empty -->
|
|
|
// <xsd:enumeration value="20"/> <!-- boolean -->
|
|
|
// <xsd:enumeration value="30"/> <!-- integer -->
|
|
|
// <xsd:enumeration value="40"/> <!-- float -->
|
|
|
// <xsd:enumeration value="50"/> <!-- error -->
|
|
|
// <xsd:enumeration value="60"/> <!-- string -->
|
|
|
// <xsd:enumeration value="70"/> <!-- cellrange -->
|
|
|
// <xsd:enumeration value="80"/> <!-- array -->
|
|
|
TQString valuetype = e.attribute( "ValueType" );
|
|
|
if ( valuetype == "40" )//percentage
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType( Percentage_format );
|
|
|
kspread_cell->setValue( cell_content );
|
|
|
}
|
|
|
else if ( valuetype =="60" )//string
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType( Text_format );
|
|
|
kspread_cell->setValue( cell_content );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (e.hasAttribute( "ValueFormat" ))
|
|
|
{
|
|
|
TQString formatString = e.attribute( "ValueFormat" );
|
|
|
if ( !setType( kspread_cell, formatString, cell_content ) )
|
|
|
table->setText(row, column, cell_content, false);
|
|
|
}
|
|
|
else
|
|
|
table->setText(row, column, cell_content, false);
|
|
|
|
|
|
if (e.hasAttribute("ExprID"))
|
|
|
{
|
|
|
// TQString encoded_string(table->cellAt( column, row, false)->encodeFormula( row, column ).utf8());
|
|
|
TQString encoded_string(table->cellAt( column, row, false )->encodeFormula().latin1());
|
|
|
|
|
|
|
|
|
char * tmp_string = ( char * ) malloc( strlen( encoded_string.latin1() ) );
|
|
|
strcpy( tmp_string, encoded_string.latin1() );
|
|
|
|
|
|
kdDebug(30521) << encoded_string.latin1() << endl;
|
|
|
|
|
|
exprID_dict.insert(e.attribute("ExprID"), tmp_string);
|
|
|
|
|
|
kdDebug(30521) << exprID_dict[e.attribute("ExprID")] << endl;
|
|
|
kdDebug(30521) << exprID_dict[TQString("1")] << endl;
|
|
|
kdDebug(30521) << e.attribute("ExprID") << endl;
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
column = e.attribute( "Col" ).toInt() + 1;
|
|
|
row = e.attribute( "Row" ).toInt() + 1;
|
|
|
|
|
|
TQString cell_content( e.text() );
|
|
|
//kdDebug()<<"cell_content :!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :"<<cell_content<<endl;
|
|
|
if ( cell_content[0] == '=' )
|
|
|
convertFormula( cell_content );
|
|
|
|
|
|
Cell * kspread_cell = table->nonDefaultCell( column, row );
|
|
|
|
|
|
if (e.hasAttribute("ValueType"))
|
|
|
{
|
|
|
// TODO: Defined type of cell
|
|
|
//<xsd:enumeration value="10"/> <!-- empty -->
|
|
|
//<xsd:enumeration value="20"/> <!-- boolean -->
|
|
|
//<xsd:enumeration value="30"/> <!-- integer -->
|
|
|
//<xsd:enumeration value="40"/> <!-- float -->
|
|
|
//<xsd:enumeration value="50"/> <!-- error -->
|
|
|
//<xsd:enumeration value="60"/> <!-- string -->
|
|
|
//<xsd:enumeration value="70"/> <!-- cellrange -->
|
|
|
//<xsd:enumeration value="80"/> <!-- array -->
|
|
|
//kspread_cell->setValue( date );
|
|
|
//kspread_cell->format()->setFormatType( type );
|
|
|
TQString valuetype = e.attribute( "ValueType" );
|
|
|
if ( valuetype == "40" )//percentage
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType( Percentage_format );
|
|
|
kspread_cell->setValue( cell_content );
|
|
|
}
|
|
|
else if ( valuetype =="60" )//string
|
|
|
{
|
|
|
kspread_cell->format()->setFormatType( Text_format );
|
|
|
kspread_cell->setValue( cell_content );
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (e.hasAttribute( "ValueFormat" ))
|
|
|
{
|
|
|
TQString formatString = e.attribute( "ValueFormat" );
|
|
|
if ( !setType( kspread_cell, formatString, cell_content ) )
|
|
|
table->setText(row, column, cell_content, false);
|
|
|
}
|
|
|
else
|
|
|
table->setText(row, column, cell_content, false);
|
|
|
|
|
|
|
|
|
if (e.hasAttribute("ExprID"))
|
|
|
{
|
|
|
column = e.attribute("Col").toInt() + 1;
|
|
|
row = e.attribute("Row").toInt() + 1;
|
|
|
char * expr;
|
|
|
expr = exprID_dict[e.attribute("ExprID")];
|
|
|
// expr = exprID_dict[TQString("1")];
|
|
|
|
|
|
kdDebug(30521) << "FOO:" << column << row << endl;
|
|
|
kdDebug(30521) <<
|
|
|
table->cellAt( column, row, false )->decodeFormula( expr, column, row ).latin1() << endl;
|
|
|
kdDebug(30521) << expr << endl;
|
|
|
|
|
|
table->setText(row, column,
|
|
|
table->cellAt( column, row, false )->decodeFormula( expr, column, row ),
|
|
|
false);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
cell = cell.nextSibling();
|
|
|
}
|
|
|
|
|
|
kdDebug(30521) << "Reading in cells done" << endl;
|
|
|
|
|
|
if ( mergedRegion.isNull() )
|
|
|
{
|
|
|
kdWarning(30521) << "No cells merged !" << endl;
|
|
|
}
|
|
|
while ( !mergedRegion.isNull() )
|
|
|
{
|
|
|
TQDomElement e = mergedRegion.toElement(); // try to convert the node to an element.
|
|
|
TQString cell_merge_area( e.text() );
|
|
|
Range range(cell_merge_area);
|
|
|
//kdDebug()<<"text !!! :"<<cell_merge_area<< "range :start row : "<<range.startRow ()<<" start col :"<<range.startCol ()<<" end row :"<<range.endRow ()<<" end col :"<<range.endCol ()<<endl;
|
|
|
Cell * cell = table->nonDefaultCell( range.startCol (), range.startRow () );
|
|
|
cell->mergeCells( range.startCol (), range.startRow (), range.endCol ()-range.startCol (), range.endRow ()-range.startRow ());
|
|
|
mergedRegion = mergedRegion.nextSibling();
|
|
|
}
|
|
|
/* There is a memory leak here...
|
|
|
* The strings in the exprID_dict have been allocated, but they have not been freed.
|
|
|
*/
|
|
|
|
|
|
/* exprID_dict.statistics(); */
|
|
|
|
|
|
/* CELL handling STOP */
|
|
|
|
|
|
/* STYLE handling START */
|
|
|
//Laurent - 2001-12-07 desactivate this code : otherwise we
|
|
|
//create 65535*255 cells (Styleregion is define for a area and
|
|
|
//not for cell, so gnumeric define a style as : col start=0 col end=255
|
|
|
//rowstart=0 rowend=255 => we create 255*255 cells
|
|
|
//and gnumeric stocke all area and not just modify area
|
|
|
//=> not good for kspread.
|
|
|
// Norbert: activated again, only cells with texts get modified, nothing else created
|
|
|
setStyleInfo(&sheet, table);
|
|
|
|
|
|
/* STYLE handling STOP */
|
|
|
table->enableScrollBarUpdates( true );
|
|
|
|
|
|
sheet = sheet.nextSibling();
|
|
|
++num;
|
|
|
}
|
|
|
|
|
|
if ( selTable )
|
|
|
ksdoc->setDisplaySheet( selTable );
|
|
|
|
|
|
emit sigProgress(100);
|
|
|
if ( bSuccess )
|
|
|
return KoFilter::OK;
|
|
|
else
|
|
|
return KoFilter::StupidError;
|
|
|
}
|
|
|
|
|
|
#include <gnumericimport.moc>
|