Commit bab31c41 authored by Elen.Subbotina's avatar Elen.Subbotina Committed by Alexander Trofimov

XlsFile2 правка багов по результатам тестирования + расширены автофигуры

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64343 954022d7-b5bf-4e40-9824-e11837661b57
parent a8deb86c
......@@ -152,11 +152,23 @@ void CFRecord::appendRawData(CFRecordPtr where_from)
void CFRecord::appendRawData(const char* raw_data, const size_t size)
{
char* data_new = new char[size_ + size];
memcpy(data_new, data_, size_);
memcpy(data_new + size_, raw_data, size);
if (data_ && size_ > 0)
{
memcpy(data_new, data_, size_);
}
if (raw_data && size > 0)
{
memcpy(data_new + size_, raw_data, size);
}
size_ += size;
std::swap(data_, data_new);
delete[] data_new;
if (data_new)
{
delete[] data_new;
data_new = NULL;
}
}
......
......@@ -23,9 +23,19 @@ const bool BiffRecordSplit::storeRecordAndDecideProceeding(CFRecordPtr record)
{
useContinueRecords(*record);
record->resetPointerToBegin();
if(isStartingRecord(*record))
{
stored_record = record;
if (stored_record)
{
stored_record->appendRawData(record->getData(), record->getDataSize());
}
else
{
stored_record = CFRecordPtr(new CFRecord(record->getTypeId(), record->getGlobalWorkbookInfo()));
stored_record->appendRawData(record->getData(), record->getDataSize());
}
}
else if(stored_record == NULL)
{
......@@ -34,8 +44,9 @@ const bool BiffRecordSplit::storeRecordAndDecideProceeding(CFRecordPtr record)
}
else
{
record->insertDataFromRecordToBeginning(stored_record);
stored_record = record;
//record->insertDataFromRecordToBeginning(stored_record);
//stored_record = record;
stored_record->appendRawData(record->getData(), record->getDataSize());
}
stored_record->resetPointerToBegin();
bool is_end = isEndingRecord(*stored_record);
......
......@@ -48,6 +48,7 @@ int Blank::serialize(std::wostream & stream)
{
CP_XML_ATTR(L"r", ref);
int st = (int)cell.ixfe - cellStyleXfs_count;
if ((cell.ixfe.value()) && (cell.ixfe > cellStyleXfs_count))
{
CP_XML_ATTR(L"s", cell.ixfe - cellStyleXfs_count);
......
......@@ -6,17 +6,36 @@ namespace XLS
Continue::Continue()
{
m_pData = NULL;
m_iDataSize = 0;
}
Continue::~Continue()
{
if (m_pData)
{
delete []m_pData;
}
m_pData = NULL;
m_iDataSize = 0;
}
BaseObjectPtr Continue::clone()
{
return BaseObjectPtr(new Continue(*this));
Continue* n = new Continue(*this);
if (n)
{
n->m_iDataSize = m_iDataSize;
if (m_pData)
{
n->m_pData = new char[m_iDataSize];
memcpy(n->m_pData, m_pData, m_iDataSize);
}
}
return BaseObjectPtr(n);
}
......@@ -24,16 +43,16 @@ void Continue::writeFields(CFRecord& record)
{
#pragma message("####################### Continue record is not implemented")
Log::error("Continue record is not implemented.");
//record << some_value;
}
void Continue::readFields(CFRecord& record)
{
#pragma message("####################### Continue record is not implemented")
Log::error("Continue record is not implemented.");
m_iDataSize = record.getDataSize();
m_pData = new char[m_iDataSize];
memcpy(m_pData, record.getData(), m_iDataSize);
//record >> some_value;
record.skipNunBytes(m_iDataSize);
}
} // namespace XLS
......
......@@ -21,6 +21,9 @@ public:
void readFields(CFRecord& record);
static const ElementType type = typeContinue;
char* m_pData;
int m_iDataSize;
};
} // namespace XLS
......
......@@ -50,6 +50,7 @@ int LabelSst::serialize(std::wostream & stream)
{
CP_XML_ATTR(L"r", ref);
int st = (int)cell.ixfe - cellStyleXfs_count;
if ((cell.ixfe.value()) && (cell.ixfe > cellStyleXfs_count))
{
CP_XML_ATTR(L"s", cell.ixfe - cellStyleXfs_count);
......
......@@ -27,11 +27,24 @@ void MsoDrawing::writeFields(CFRecord& record)
record << rgChildRec;
}
void MsoDrawing::resetToBegin()
{
if (stored_record)
{
stored_record->resetPointerToBegin();
}
}
void MsoDrawing::readFields()
{
rgChildRec.rh_own.recLen = stored_record->getDataSize();
if (stored_record)
{
rgChildRec.rh_own.recLen = stored_record->getDataSize();
rgChildRec.loadFields(*stored_record);
}
rgChildRec.loadFields(*stored_record);
isReading = true;
}
void MsoDrawing::readFields(CFRecord& record)
......
......@@ -18,15 +18,17 @@ public:
BaseObjectPtr clone();
void writeFields(CFRecord& record);
void readFields(CFRecord& record);
void readFields();
void writeFields (CFRecord& record);
void readFields (CFRecord& record);
void readFields ();
void resetToBegin ();
static const ElementType type = typeMsoDrawing;
//-----------------------------
virtual const bool isStartingRecord(CFRecord& record);
virtual const bool isEndingRecord(CFRecord& record);
virtual void useContinueRecords(CFRecord& record);
virtual const bool isStartingRecord (CFRecord& record);
virtual const bool isEndingRecord (CFRecord& record);
virtual void useContinueRecords (CFRecord& record);
//-----------------------------
ODRAW::OfficeArtDgContainer rgChildRec;
......
......@@ -72,6 +72,10 @@ void MulBlank::readFields(CFRecord& record)
//------------------
record >> rw >> colFirst;
int r = rw;
int colL = colLast;
int colF = colFirst;
rgixfe.load(record, colLast - colFirst + 1);
record.skipNunBytes(sizeof(unsigned short));
......@@ -94,17 +98,29 @@ int MulBlank::serialize(std::wostream & stream)
CP_XML_NODE(L"c")
{
CP_XML_ATTR(L"r", ref);
if(( (i-colFirst) < rgixfe.rgixfe.size()) && (rgixfe.rgixfe[i-colFirst] > cellStyleXfs_count))
{
int st = (int)rgixfe.rgixfe[i-colFirst] - cellStyleXfs_count;
CP_XML_ATTR(L"s", rgixfe.rgixfe[i-colFirst] - cellStyleXfs_count);
}
else if ((rgixfe.common_ixfe > 0) && (rgixfe.common_ixfe > cellStyleXfs_count))
{
int st = (int)rgixfe.common_ixfe - cellStyleXfs_count;
CP_XML_ATTR(L"s", rgixfe.common_ixfe - cellStyleXfs_count);
}
}
}
//if(( (i-colFirst) < rgixfe.rgixfe.size()) && (rgixfe.rgixfe[i-colFirst] > cellStyleXfs_count))
//{
// CP_XML_NODE(L"c")
// {
// CP_XML_ATTR(L"r", ref);
//
// int st = (int)rgixfe.rgixfe[i-colFirst] - cellStyleXfs_count;
// CP_XML_ATTR(L"s", rgixfe.rgixfe[i-colFirst] - cellStyleXfs_count);
// }
//}
}
}
return 0;
......@@ -122,8 +138,10 @@ BiffStructurePtr IXFCellMulBlankSpecial::clone()
void IXFCellMulBlankSpecial::load(CFRecord& record, const size_t num_cells)
{
size_t sz = (record.getDataSize() - record.getRdPtr()-2)/2;
unsigned short ixfe;
for(size_t i = 0; i < num_cells; ++i)
for(size_t i = 0; i < (std::min)(sz, num_cells); ++i) //Lighting Load Calculation.xls -
{
record >> ixfe;
rgixfe.push_back(ixfe);
......
#include "Obj.h"
#include <Logic/Biff_records/MsoDrawing.h>
#include <Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h>
namespace XLS
{
Obj::Obj()
{
}
Obj::~Obj()
{
}
......@@ -165,7 +159,7 @@ void Obj::readFields(CFRecord& record)
{
record.skipNunBytes(4); // reserved
}
if (continue_records.size() > 0)
{
std::list<CFRecordPtr>& recs = continue_records[rt_Continue];
......@@ -174,44 +168,12 @@ void Obj::readFields(CFRecord& record)
{
while( !recs.empty() )
{
record.appendRawData(recs.front());
mso_drawing_->storeRecordAndDecideProceeding(recs.front());
recs.pop_front();
}
}
}
if (record.getRdPtr() < record.getDataSize() - 8)
{
ODRAW::OfficeArtRecordHeader rh_child;
record >> rh_child;
record.RollRdPtrBack(rh_child.size());
if (rh_child.recType == ODRAW::OfficeArtContainer::SpContainer)
{
m_OfficeArtSpContainer = ODRAW::OfficeArtRecordPtr(new ODRAW::OfficeArtSpContainer(ODRAW::OfficeArtRecord::CA_Sheet));
record >> *m_OfficeArtSpContainer;
}
int sz_skip = record.getDataSize() - record.getRdPtr();
if (sz_skip > 0)
{
record.skipNunBytes(sz_skip);
}
}
// unsigned char* Add = NULL;
//int size = 0;
//if (record.getRdPtr() < record.getDataSize())
//{
// size = record.getDataSize() - record.getRdPtr();
// Add = new unsigned char [size];
// memcpy(Add, record.getData(), size);
// record.skipNunBytes(size);
//}
//if (Add)
//{
// delete []Add;
//}
}
......
......@@ -15,25 +15,20 @@
#include <Logic/Biff_structures/FtLbsData.h>
#include <Logic/Biff_structures/FtGboData.h>
namespace ODRAW
{
class OfficeArtRecord;
typedef boost::shared_ptr<OfficeArtRecord> OfficeArtRecordPtr;
}
#include <Logic/Biff_records/MsoDrawing.h>
namespace XLS
{
//class MsoDrawing;
//typedef boost::shared_ptr<MsoDrawing> MsoDrawingPtr;
// Logical representation of Obj record in BIFF8
class Obj : public BiffRecordContinued
{
BIFF_RECORD_DEFINE_TYPE_INFO(Obj)
BASE_OBJECT_DEFINE_CLASS_NAME(Obj)
public:
Obj();
Obj(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing)
{
}
~Obj();
BaseObjectPtr clone();
......@@ -59,7 +54,8 @@ public:
FtLbsData list;
FtGboData gbo;
ODRAW::OfficeArtRecordPtr m_OfficeArtSpContainer;
MsoDrawingPtr mso_drawing_;
//BO_ATTRIB_MARKUP_BEGIN
//BO_ATTRIB_MARKUP_COMPLEX(cmo)
//if(0x08 == cmo.ot)
......
#include "TxO.h"
#include <Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h>
#include <Logic/Biff_records/Font.h>
#include <simple_xml_writer.h>
......@@ -10,12 +9,6 @@
namespace XLS
{
TxO::TxO():fmla(false)
{
cbRuns = 0;
}
TxO::~TxO()
{
}
......@@ -56,18 +49,18 @@ void TxO::readFields(CFRecord& record)
fmla.load(record);
std::list<CFRecordPtr>& recs = continue_records[rt_Continue];
if ( recs.size() )
{
while( !recs.empty() )
{
record.appendRawData(recs.front());
recs.pop_front();
}
}
if ( cbRuns )
{
{
if (record.getRdPtr() >= record.getDataSize())
{
int sz = recs.size()-1;
for(int i = 0; i < sz; i++)
{
record.appendRawData(recs.front());
recs.pop_front();
}
}
commentText.setSize(cchText);
record >> commentText;
......@@ -75,17 +68,10 @@ void TxO::readFields(CFRecord& record)
TxOruns.load(record);
}
if (record.getRdPtr() < record.getDataSize() - 8)
while( !recs.empty() )
{
ODRAW::OfficeArtRecordHeader rh_child;
record >> rh_child;
record.RollRdPtrBack(rh_child.size());
if (rh_child.recType == ODRAW::OfficeArtContainer::SpContainer)
{
m_OfficeArtSpContainer = ODRAW::OfficeArtRecordPtr(new ODRAW::OfficeArtSpContainer(ODRAW::OfficeArtRecord::CA_Sheet));
record >> *m_OfficeArtSpContainer;
}
mso_drawing_->storeRecordAndDecideProceeding(recs.front());
recs.pop_front();
}
}
......@@ -122,6 +108,12 @@ int TxO::serialize (std::wostream & _stream)
{
//CP_XML_ATTR(L"xml:space", L"preserve");
if (run->formatRun.ich > str_.length())
{
//
run->formatRun.ich = 0;
}
std::wstring str_part = str_.substr( run->formatRun.ich, end_string - run->formatRun.ich);
CP_XML_STREAM() << xml::utils::replace_text_to_xml(str_part);
......
......@@ -5,12 +5,7 @@
#include <Logic/Biff_structures/FontIndex.h>
#include <Logic/Biff_structures/ObjFmla.h>
#include <Logic/Biff_structures/TxORuns.h>
namespace ODRAW
{
class OfficeArtRecord;
typedef boost::shared_ptr<OfficeArtRecord> OfficeArtRecordPtr;
}
#include <Logic/Biff_records/MsoDrawing.h>
namespace XLS
{
......@@ -22,7 +17,10 @@ class TxO: public BiffRecordContinued
BIFF_RECORD_DEFINE_TYPE_INFO(TxO)
BASE_OBJECT_DEFINE_CLASS_NAME(TxO)
public:
TxO();
TxO(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing), fmla(false)
{
cbRuns = 0;
}
~TxO();
BaseObjectPtr clone();
......@@ -51,7 +49,7 @@ public:
TxORuns TxOruns;
XLUnicodeStringNoCch commentText;
ODRAW::OfficeArtRecordPtr m_OfficeArtSpContainer;
MsoDrawingPtr mso_drawing_;
};
......
......@@ -98,7 +98,7 @@ int FillInfo::serialize(std::wostream & stream)
case 2://rgb
CP_XML_ATTR(L"rgb", STR::toARGB(foreFillInfo_.xclrValue)); break;
case 3://theme color
CP_XML_ATTR(L"theme", foreFillInfo_.xclrValue + 1);
CP_XML_ATTR(L"theme", foreFillInfo_.xclrValue/* + 1*/);
CP_XML_ATTR(L"tint", foreFillInfo_.nTintShade / 32767.0); break;
case 4://not set
break;
......@@ -120,7 +120,7 @@ int FillInfo::serialize(std::wostream & stream)
case 2://rgb
CP_XML_ATTR(L"rgb", STR::toARGB(backFillInfo_.xclrValue)); break;
case 3://theme color
CP_XML_ATTR(L"theme", backFillInfo_.xclrValue + 1);
CP_XML_ATTR(L"theme", backFillInfo_.xclrValue /*+ 1*/);
CP_XML_ATTR(L"tint", backFillInfo_.nTintShade / 32767.0); break;
case 4://not set
break;
......
......@@ -34,8 +34,11 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
while(record.getRdPtr() < container_beginning_ptr + rh_own.recLen - 8)
{
if (record.getRdPtr() >= record.getDataSize()) break;
OfficeArtRecordHeader rh_child;
record >> rh_child;
size_t child_beginning_ptr = record.getRdPtr();
record.RollRdPtrBack(rh_child.size());
......@@ -62,6 +65,10 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
art_record = OfficeArtRecordPtr(new OfficeArtSpContainer(anchor_type_));
break;
case SolverContainer:
art_record = OfficeArtRecordPtr(new OfficeArtSolverContainer);
break;
case FSPGR:
art_record = OfficeArtRecordPtr(new OfficeArtFSPGR);
break;
......
......@@ -51,6 +51,25 @@ void OfficeArtDgContainer::loadFields(XLS::CFRecord& record)
{
switch(child_records[i]->rh_own.recType)
{
case ODRAW::OfficeArtRecord::DgContainer:
{
OfficeArtDgContainer * dg = dynamic_cast<OfficeArtDgContainer *>(child_records[i].get());
if (dg)
{
for (int i = 0 ; i < dg->child_records.size(); i++)
{
child_records.push_back(dg->child_records[i]);
}
dg->child_records.clear();
if (dg->m_OfficeArtSpgrContainer) m_OfficeArtSpgrContainer = dg->m_OfficeArtSpgrContainer;
if (dg->m_OfficeArtFDG) m_OfficeArtFDG = dg->m_OfficeArtFDG;
if (dg->m_OfficeArtSpContainer.size() > 0)
m_OfficeArtSpContainer.insert(m_OfficeArtSpContainer.end(), dg->m_OfficeArtSpContainer.begin(), dg->m_OfficeArtSpContainer.end());
}
child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--;
}break;
case ODRAW::OfficeArtRecord::FDG:
{
m_OfficeArtFDG = child_records[i];
......
......@@ -18,23 +18,6 @@ XLS::BiffStructurePtr OfficeArtFRITContainer::clone()
}
//void OfficeArtFRITContainer::setXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// std::for_each(rgfrit.begin(), rgfrit.end(), boost::bind(&OfficeArtFRIT::toXML, _1, xml_tag));
//}
//
//void OfficeArtFRITContainer::getXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// OfficeArtFRIT frit;
// size_t number = 0;
// while(frit.fromXML(xml_tag, ++number, false))
// {
// rgfrit.push_back(frit);
// }
//}
void OfficeArtFRITContainer::storeFields(XLS::CFRecord& record)
{
record << rgfrit;
......
......@@ -23,6 +23,10 @@ void OfficeArtClientData::loadFields(XLS::CFRecord& record)
{
}
}
void OfficeArtSolverContainer::loadFields(XLS::CFRecord& record)
{
//array of OfficeArtSolverContainerFileBlock
}
void OfficeArtDggContainer::loadFields(XLS::CFRecord& record)
{
......
......@@ -33,6 +33,17 @@ public:
std::vector<OfficeArtContainerPtr> m_OfficeArtSpgrContainerFileBlock;
};
class OfficeArtSolverContainer : public OfficeArtRecord
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtSolverContainer)
public:
OfficeArtSolverContainer() : OfficeArtRecord(0x0F, SolverContainer) {}
XLS::BiffStructurePtr clone() { return XLS::BiffStructurePtr(new OfficeArtSolverContainer(*this)); }
void loadFields(XLS::CFRecord& record);
void storeFields(XLS::CFRecord& record) {}
};
class OfficeArtSpContainer : public OfficeArtContainer
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtSpContainer)
......
#pragma once
#include <Logic/CompositeObject.h>
#include <Logic/Biff_records/MsoDrawing.h>
namespace XLS
{
......@@ -11,7 +12,9 @@ class CHART: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(CHART)
public:
CHART();
CHART(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing)
{
}
~CHART();
BaseObjectPtr clone();
......@@ -19,6 +22,8 @@ public:
virtual const bool loadContent(BinProcessor& proc);
static const ElementType type = typeCHART;
MsoDrawingPtr mso_drawing_;
};
} // namespace XLS
......
......@@ -2,16 +2,11 @@
#include "CHART.h"
#include <Logic/Biff_records/BOF.h>
#include <Logic/ChartSheetSubstream.h>
#include <Logic/Biff_records/Continue.h>
namespace XLS
{
CHART::CHART()
{
}
CHART::~CHART()
{
}
......@@ -38,6 +33,21 @@ const bool CHART::loadContent(BinProcessor& proc)
return false;
}
int count = proc.repeated<Continue>(0, 0);
while (count > 0)
{
Continue* c = dynamic_cast<Continue*>(elements_.back().get());
if (c)
{
CFRecordPtr r = CFRecordPtr(new CFRecord(CFRecordType::ANY_TYPE, proc.getGlobalWorkbookInfo()));
r->appendRawData(c->m_pData, c->m_iDataSize);
mso_drawing_->storeRecordAndDecideProceeding(r);
}
count--;
}
// reader.SeekNextSubstream();
return true;
}
......
#pragma once
#include <Logic/CompositeObject.h>
#include <Logic/Biff_records/MsoDrawing.h>
namespace XLS
{
......@@ -11,7 +12,9 @@ class OBJ: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(OBJ)
public:
OBJ();
OBJ(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing)
{
}
~OBJ();
BaseObjectPtr clone();
......@@ -21,6 +24,8 @@ public:
BaseObjectPtr m_Obj;
static const ElementType type = typeOBJ;
MsoDrawingPtr mso_drawing_;
};
} // namespace XLS
......
......@@ -6,6 +6,7 @@
#include <Logic/Biff_unions/OBJ.h>
#include <Logic/Biff_unions/CHART.h>
#include <Logic/Biff_records/Continue.h>
#include <Logic/Biff_records/Obj.h>
namespace XLS
{
......@@ -26,6 +27,9 @@ class Parenthesis_OBJECTS_2: public ABNFParenthesis
{
BASE_OBJECT_DEFINE_CLASS_NAME(Parenthesis_OBJECTS_2)
public:
Parenthesis_OBJECTS_2(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing)
{
}
BaseObjectPtr clone()
{
return BaseObjectPtr(new Parenthesis_OBJECTS_2(*this));
......@@ -33,12 +37,19 @@ public:
const bool loadContent(BinProcessor& proc)
{
bool res = proc.optional<OBJ>() ||
proc.optional<TEXTOBJECT>() ||
proc.optional<CHART>() ;
OBJ OBJ_(mso_drawing_);
bool res1 = proc.optional(OBJ_);
TEXTOBJECT TEXTOBJECT_(mso_drawing_);
bool res2 = proc.optional(TEXTOBJECT_);
CHART CHART_(mso_drawing_);
bool res3 = proc.optional(CHART_);
return res;
};
return res1 || res2 || res3;
}
MsoDrawingPtr mso_drawing_;
};
......@@ -66,10 +77,9 @@ public:
{
bool res = proc.mandatory(*mso_drawing_);
Parenthesis_OBJECTS_2 parenthesis_objects_2;
Parenthesis_OBJECTS_2 parenthesis_objects_2(mso_drawing_);
int count = proc.repeated(parenthesis_objects_2, 0, 0);
//int count_continue = proc.repeated<Continue>(0,0);
return res || count>0;
}
......@@ -110,7 +120,20 @@ const bool OBJECTS::loadContentRead(BinReaderProcessor& proc)
elements_.erase(elem);
break;
}
}
//int count_2 = proc.repeated(parenthesis_objects_1, 0, 0);
if (m_MsoDrawing->isReading == false)
{
try
{
m_MsoDrawing->resetToBegin();
m_MsoDrawing->readFields();
}
catch(...)
{
}
}
return count_1 > 0 || count_4 > 0;
......
......@@ -5,13 +5,6 @@
namespace XLS
{
OBJ::OBJ()
{
}
OBJ::~OBJ()
{
}
......@@ -26,7 +19,9 @@ BaseObjectPtr OBJ::clone()
// OBJ = Obj *Continue
const bool OBJ::loadContent(BinProcessor& proc)
{
if(!proc.mandatory<Obj>())
Obj Obj_(mso_drawing_);
if(!proc.mandatory(Obj_))
{
return false;
}
......
......@@ -8,11 +8,6 @@ namespace XLS
{
TEXTOBJECT::TEXTOBJECT()
{
}
TEXTOBJECT::~TEXTOBJECT()
{
}
......@@ -27,7 +22,8 @@ BaseObjectPtr TEXTOBJECT::clone()
// TEXTOBJECT = TxO *Continue
const bool TEXTOBJECT::loadContent(BinProcessor& proc)
{
if(!proc.mandatory<TxO>())
TxO TxO_(mso_drawing_);
if(!proc.mandatory(TxO_))
{
return false;
}
......
#pragma once
#include <Logic/CompositeObject.h>
#include <Logic/Biff_records/MsoDrawing.h>
namespace XLS
{
......@@ -11,7 +12,9 @@ class TEXTOBJECT: public CompositeObject
{
BASE_OBJECT_DEFINE_CLASS_NAME(TEXTOBJECT)
public:
TEXTOBJECT();
TEXTOBJECT(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing)
{
}
~TEXTOBJECT();
BaseObjectPtr clone();
......@@ -21,6 +24,7 @@ public:
static const ElementType type = typeTEXTOBJECT;
BaseObjectPtr m_TxO;
MsoDrawingPtr mso_drawing_;
};
} // namespace XLS
......
......@@ -241,7 +241,7 @@ namespace oox
case msosptCan : return L"can";
case msosptDonut : return L"donut";
case msosptStraightConnector1 : return L"straightConnector1";
case msosptBentConnector2 : return L"bentConnector2 ";
case msosptBentConnector2 : return L"bentConnector2";
case msosptBentConnector3 : return L"bentConnector3";
case msosptBentConnector4 : return L"bentConnector4";
case msosptBentConnector5 : return L"bentConnector5";
......@@ -249,9 +249,9 @@ namespace oox
case msosptCurvedConnector3 : return L"curvedConnector3";
case msosptCurvedConnector4 : return L"curvedConnector4";
case msosptCurvedConnector5 : return L"curvedConnector5";
case msosptCallout1 : return L"callout1 ";
case msosptCallout2 : return L"callout2 ";
case msosptCallout3 : return L"callout3 ";
case msosptCallout1 : return L"callout1";
case msosptCallout2 : return L"callout2";
case msosptCallout3 : return L"callout3";
case msosptAccentCallout1 : return L"accentCallout1";
case msosptAccentCallout2 : return L"accentCallout2";
case msosptAccentCallout3 : return L"accentCallout3";
......@@ -276,7 +276,7 @@ namespace oox
case msosptFoldedCorner : return L"foldedCorner";
case msosptLeftArrow : return L"leftArrow";
case msosptDownArrow : return L"downArrow";
case msosptUpArrow : return L"upArrow ";
case msosptUpArrow : return L"upArrow";
case msosptLeftRightArrow : return L"leftRightArrow";
case msosptUpDownArrow : return L"upDownArrow";
case msosptIrregularSeal1 : return L"irregularSeal1";
......@@ -310,7 +310,7 @@ namespace oox
case msosptCircularArrow : return L"circularArrow";
//case msosptNotchedCircularArrow : return L"notchedCircularArrow";
case msosptUturnArrow : return L"uturnArrow";
case msosptCurvedRightArrow : return L"curvedRightArrow ";
case msosptCurvedRightArrow : return L"curvedRightArrow";
case msosptCurvedLeftArrow : return L"curvedLeftArrow";
case msosptCurvedUpArrow : return L"curvedUpArrow";
case msosptCurvedDownArrow : return L"curvedDownArrow";
......@@ -328,12 +328,12 @@ namespace oox
case msosptFlowChartPreparation : return L"flowChartPreparation";
case msosptFlowChartManualInput : return L"flowChartManualInput";
case msosptFlowChartManualOperation : return L"flowChartManualOperation";
case msosptFlowChartConnector : return L"flowChartConnector ";
case msosptFlowChartConnector : return L"flowChartConnector";
case msosptFlowChartPunchedCard : return L"flowChartPunchedCard";
case msosptFlowChartPunchedTape : return L"flowChartPunchedTape ";
case msosptFlowChartPunchedTape : return L"flowChartPunchedTape";
case msosptFlowChartSummingJunction : return L"flowChartSummingJunction";
case msosptFlowChartOr : return L"flowChartOr";
case msosptFlowChartCollate : return L"flowChartCollate ";
case msosptFlowChartCollate : return L"flowChartCollate";
case msosptFlowChartSort : return L"flowChartSort";
case msosptFlowChartExtract : return L"flowChartExtract";
case msosptFlowChartMerge : return L"flowChartMerge";
......@@ -362,7 +362,7 @@ namespace oox
case msosptActionButtonHelp : return L"actionButtonHelp";
case msosptActionButtonInformation : return L"actionButtonInformation";
case msosptActionButtonForwardNext : return L"actionButtonForwardNext";
case msosptActionButtonBackPrevious : return L"actionButtonBackPrevious ";
case msosptActionButtonBackPrevious : return L"actionButtonBackPrevious";
case msosptActionButtonEnd : return L"actionButtonEnd";
case msosptActionButtonBeginning : return L"actionButtonBeginning";
case msosptActionButtonReturn : return L"actionButtonReturn";
......@@ -381,7 +381,7 @@ namespace oox
case msosptTextHexagon : return L"textHexagon";
case msosptTextCurve : return L"textCurve";
case msosptTextWave : return L"textWave";
case msosptTextRing : return L"textRing ";
case msosptTextRing : return L"textRing";
case msosptTextOnCurve : return L"textOnCurve";
case msosptTextOnRing : return L"textOnRing";
case msosptTextPlainText : return L"textPlain";
......@@ -416,13 +416,13 @@ namespace oox
case msosptTextDeflateTop : return L"textDeflateTop";
case msosptTextDeflateInflate : return L"textDeflateInflate";
case msosptTextDeflateInflateDeflate : return L"textDeflateInflateDeflat";
case msosptTextFadeRight : return L"textFadeRight ";
case msosptTextFadeRight : return L"textFadeRight";
case msosptTextFadeLeft : return L"textFadeLeft";
case msosptTextFadeUp : return L"textFadeUp";
case msosptTextFadeDown : return L"textFadeDown";
case msosptTextSlantUp : return L"textSlantUp";
case msosptTextSlantDown : return L"textSlantDown";
case msosptTextCanUp : return L"textCanUp ";
case msosptTextCanUp : return L"textCanUp";
case msosptTextCanDown : return L"textCanDown";
}
return L"";
......
......@@ -523,54 +523,45 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
{
short type_object = -1;
ODRAW::OfficeArtSpContainer *sp = NULL;
ODRAW::OfficeArtSpContainer *sp_text = NULL;
ODRAW::OfficeArtSpContainer *sp_common = NULL;
XLS::OBJ * OBJ = dynamic_cast<XLS::OBJ*> (elem->get());
XLS::TEXTOBJECT * TEXTOBJECT = NULL;
XLS::CHART * CHART = NULL;
std::list<XLS::BaseObjectPtr>::iterator elem_next = boost::next(elem);
if ( elem_next !=objects->elements_.end() )
{
TEXTOBJECT = dynamic_cast<XLS::TEXTOBJECT*>(elem_next->get());
CHART = dynamic_cast<XLS::CHART*> (elem_next->get());
}
XLS::CHART * CHART = dynamic_cast<XLS::CHART*> (elem->get());
XLS::Obj * obj = NULL;
XLS::TxO * text_obj = NULL;
XLS::ChartSheetSubstream * chart = NULL;
XLS::Obj * obj = NULL;
XLS::TxO * text_obj = NULL;
XLS::ChartSheetSubstream * chart = NULL;
if (OBJ) obj = dynamic_cast<XLS::Obj*>(OBJ->m_Obj.get());
if (OBJ) obj = dynamic_cast<XLS::Obj *>(OBJ->m_Obj.get());
if (TEXTOBJECT) text_obj = dynamic_cast<XLS::TxO *>(TEXTOBJECT->m_TxO.get());
if (CHART) chart = dynamic_cast<XLS::ChartSheetSubstream *>(CHART->elements_.back().get());
if (obj)
{
type_object = obj->cmo.ot; //тут тип шейпа ВРАНЬЕ !!! пример - 7.SINIF I.DÖNEM III.YAZILI SINAV.xls
if (obj->m_OfficeArtSpContainer)
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(obj->m_OfficeArtSpContainer.get());
}
if (obj) type_object = obj->cmo.ot;
if (chart) type_object = 0x0005;
if (text_obj)
{
if (type_object <0) type_object = 0x0006;
if (text_obj->m_OfficeArtSpContainer)
{
sp_text = dynamic_cast<ODRAW::OfficeArtSpContainer*>(text_obj->m_OfficeArtSpContainer.get());
}
}
if (chart)
{
type_object = 0x0005;
if (type_object <0) type_object = 0x0006;
}
//-----------------------------------------------------------------------------
if ( (spgr) && (ind+1< spgr->child_records.size()))
ODRAW::OfficeArtSpContainer *sp = NULL;
ODRAW::OfficeArtSpContainer *sp_text = NULL;
if ( spgr)
{
sp_common = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
if (ind + 1 < spgr->child_records.size())
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
if (text_obj && ind + 2 < spgr->child_records.size())
sp_text = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+2].get());
}
if (note && text_obj)
{
......@@ -584,9 +575,8 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
if (xlsx_context->get_drawing_context().start_drawing(type_object))
{
convert(sp_text);
convert(sp);
convert(sp_common);
convert(sp_text);
if (text_obj)
{
......@@ -595,7 +585,9 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
xlsx_context->get_drawing_context().set_text(strm.str());
}
if (chart)
{
}
xlsx_context->get_drawing_context().end_drawing();
}
else
......@@ -605,10 +597,10 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
note = true;
}
}
if ( sp == NULL ) ind++;
ind++;
if ( spgr )
{
while (ind+1 < spgr->child_records.size()) // бывает что эти элементы не привязаны к sp, а "лежат" сверху - FilterClickColour_2003.xls
while (ind + 1 < spgr->child_records.size()) // бывает что эти элементы не привязаны к sp, а "лежат" сверху - FilterClickColour_2003.xls
{
ODRAW::OfficeArtClientData* client_data = NULL;
ODRAW::OfficeArtClientTextbox* text_client_data = NULL;
......@@ -622,10 +614,10 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
}else break;
}
}
if (TEXTOBJECT)
if (TEXTOBJECT || CHART)
{
elem++;
if ( sp_text == NULL ) ind++;
ind++;
}
}
}
......
......@@ -311,7 +311,7 @@ void xlsx_drawing_context::serialize_shape()
}
}
}
//serialize_fill(CP_XML_STREAM());
serialize_fill(CP_XML_STREAM());
serialize_line(CP_XML_STREAM());
}
serialize_text(CP_XML_STREAM());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment