Commit a3274076 authored by ElenaSubbotina's avatar ElenaSubbotina

XlsFormatReader - graphic in footer/header, refactoring shape for comment

parent 80477c83
...@@ -54,12 +54,6 @@ BaseObjectPtr HFPicture::clone() ...@@ -54,12 +54,6 @@ BaseObjectPtr HFPicture::clone()
void HFPicture::writeFields(CFRecord& record) void HFPicture::writeFields(CFRecord& record)
{ {
FrtHeader frtHeader(rt_HFPicture);
record << frtHeader;
#pragma message("####################### HFPicture record is not implemented")
Log::error("HFPicture record is not implemented.");
//record << some_value;
} }
...@@ -70,13 +64,17 @@ void HFPicture::readFields(CFRecord& record) ...@@ -70,13 +64,17 @@ void HFPicture::readFields(CFRecord& record)
unsigned short flags; unsigned short flags;
record >> flags; record >> flags;
fIsDrawing = GETBIT(flags, 0); fIsDrawing = GETBIT(flags, 0);
fIsDrawingGroup = GETBIT(flags, 0); fIsDrawingGroup = GETBIT(flags, 1);
fContinue = GETBIT(flags, 0); fContinue = GETBIT(flags, 2);
int size = record.getDataSize() - record.getRdPtr();
recordDrawingGroup = CFRecordPtr(new CFRecord(CFRecordType::ANY_TYPE, record.getGlobalWorkbookInfo()));
recordDrawingGroup->appendRawData(record.getCurData<char>(), size);
#pragma message("############################ OfficeArtDggContainer containers are not implemented yet") record.skipNunBytes(size);
Log::info("OfficeArtDggContainer containers are not implemented yet");
//record >> rgDrawing;
} }
} // namespace XLS } // namespace XLS
......
...@@ -32,11 +32,11 @@ ...@@ -32,11 +32,11 @@
#pragma once #pragma once
#include "BiffRecord.h" #include "BiffRecord.h"
//#include "../Biff_structures/ODRAW/OfficeArtDgContainer.h"
namespace XLS namespace XLS
{ {
// Logical representation of HFPicture record in BIFF8 // Logical representation of HFPicture record in BIFF8
class HFPicture: public BiffRecord class HFPicture: public BiffRecord
{ {
...@@ -53,12 +53,11 @@ public: ...@@ -53,12 +53,11 @@ public:
static const ElementType type = typeHFPicture; static const ElementType type = typeHFPicture;
//-----------------------------
bool fIsDrawing; bool fIsDrawing;
bool fIsDrawingGroup; bool fIsDrawingGroup;
bool fContinue; bool fContinue;
//OfficeArtDgContainer rgDrawing;
CFRecordPtr recordDrawingGroup;
}; };
} // namespace XLS } // namespace XLS
......
...@@ -97,10 +97,13 @@ void HeaderFooter::readFields(CFRecord& record) ...@@ -97,10 +97,13 @@ void HeaderFooter::readFields(CFRecord& record)
{ {
FrtHeader frtHeader(rt_HeaderFooter); FrtHeader frtHeader(rt_HeaderFooter);
record >> frtHeader; record >> frtHeader;
unsigned short flags; unsigned short flags;
_GUID_ guid_num; _GUID_ guid_num;
record >> guid_num >> flags; record >> guid_num >> flags;
guidSView = STR::guid2bstr(guid_num); guidSView = STR::guid2bstr(guid_num);
fHFDiffOddEven = GETBIT(flags, 0); fHFDiffOddEven = GETBIT(flags, 0);
fHFDiffFirst = GETBIT(flags, 1); fHFDiffFirst = GETBIT(flags, 1);
fHFScaleWithDoc = GETBIT(flags, 2); fHFScaleWithDoc = GETBIT(flags, 2);
......
...@@ -56,6 +56,7 @@ public: ...@@ -56,6 +56,7 @@ public:
//----------------------------- //-----------------------------
std::wstring guidSView; std::wstring guidSView;
bool fHFDiffOddEven; bool fHFDiffOddEven;
bool fHFDiffFirst; bool fHFDiffFirst;
bool fHFScaleWithDoc; bool fHFScaleWithDoc;
......
...@@ -65,6 +65,9 @@ void OfficeArtBStoreContainer::loadFields(XLS::CFRecord& record) ...@@ -65,6 +65,9 @@ void OfficeArtBStoreContainer::loadFields(XLS::CFRecord& record)
rgfb.push_back(fileBlock); rgfb.push_back(fileBlock);
} }
//int skip_data = record.getDataSize() - record.getRdPtr();
//record.skipNunBytes(skip_data);
// OpenOffice // OpenOffice
while(1) while(1)
{ {
......
...@@ -249,7 +249,9 @@ void OfficeArtBStoreContainerFileBlock::load(XLS::CFRecord& record) ...@@ -249,7 +249,9 @@ void OfficeArtBStoreContainerFileBlock::load(XLS::CFRecord& record)
pict_size = rc_header.recLen - skipLen; pict_size = rc_header.recLen - skipLen;
if (pict_size > record.getDataSize() - record.getRdPtr()) if (pict_size > record.getDataSize() - record.getRdPtr())
{
return; return;
}
else else
result = true; result = true;
......
...@@ -51,7 +51,6 @@ public: ...@@ -51,7 +51,6 @@ public:
static const XLS::ElementType type = XLS::typeOfficeArtClientAnchorChart; static const XLS::ElementType type = XLS::typeOfficeArtClientAnchorChart;
virtual void loadFields(XLS::CFRecord& record); virtual void loadFields(XLS::CFRecord& record);
virtual void storeFields(XLS::CFRecord& record); virtual void storeFields(XLS::CFRecord& record);
......
...@@ -50,13 +50,12 @@ XLS::BiffStructurePtr OfficeArtClientAnchorHF::clone() ...@@ -50,13 +50,12 @@ XLS::BiffStructurePtr OfficeArtClientAnchorHF::clone()
void OfficeArtClientAnchorHF::storeFields(XLS::CFRecord& record) void OfficeArtClientAnchorHF::storeFields(XLS::CFRecord& record)
{ {
record << width << height;
} }
void OfficeArtClientAnchorHF::loadFields(XLS::CFRecord& record) void OfficeArtClientAnchorHF::loadFields(XLS::CFRecord& record)
{ {
record >> width >> height; record >> _cx >> _cy;
} }
......
...@@ -54,8 +54,8 @@ public: ...@@ -54,8 +54,8 @@ public:
virtual void loadFields(XLS::CFRecord& record); virtual void loadFields(XLS::CFRecord& record);
virtual void storeFields(XLS::CFRecord& record); virtual void storeFields(XLS::CFRecord& record);
int width; int _cx;
int height; int _cy;
}; };
typedef boost::shared_ptr<OfficeArtClientAnchorHF> OfficeArtClientAnchorHFPtr; typedef boost::shared_ptr<OfficeArtClientAnchorHF> OfficeArtClientAnchorHFPtr;
......
...@@ -52,6 +52,8 @@ public: ...@@ -52,6 +52,8 @@ public:
static const bool CheckIfContainerStartFound(XLS::CFRecord& record); static const bool CheckIfContainerStartFound(XLS::CFRecord& record);
static const bool CheckIfContainerSizeOK(XLS::CFRecord& record); static const bool CheckIfContainerSizeOK(XLS::CFRecord& record);
static const XLS::ElementType type = XLS::typeOfficeArtDgContainer;
void loadFields(XLS::CFRecord& record); void loadFields(XLS::CFRecord& record);
OfficeArtRecordPtr m_OfficeArtFDG; OfficeArtRecordPtr m_OfficeArtFDG;
......
...@@ -61,6 +61,8 @@ public: ...@@ -61,6 +61,8 @@ public:
void loadFields(XLS::CFRecord& record); void loadFields(XLS::CFRecord& record);
static const XLS::ElementType type = XLS::typeOfficeArtSpgrContainer;
std::vector<OfficeArtContainerPtr> m_OfficeArtSpgrContainerFileBlock; std::vector<OfficeArtContainerPtr> m_OfficeArtSpgrContainerFileBlock;
}; };
...@@ -82,6 +84,8 @@ public: ...@@ -82,6 +84,8 @@ public:
OfficeArtSpContainer(const OfficeArtClientAnchorType anchor_type) : OfficeArtContainer(0x0F, SpContainer, anchor_type) {} OfficeArtSpContainer(const OfficeArtClientAnchorType anchor_type) : OfficeArtContainer(0x0F, SpContainer, anchor_type) {}
XLS::BiffStructurePtr clone() { return XLS::BiffStructurePtr(new OfficeArtSpContainer(*this)); } XLS::BiffStructurePtr clone() { return XLS::BiffStructurePtr(new OfficeArtSpContainer(*this)); }
static const XLS::ElementType type = XLS::typeOfficeArtSpContainer;
void loadFields(XLS::CFRecord& record); void loadFields(XLS::CFRecord& record);
OfficeArtRecordPtr m_OfficeArtFSP; OfficeArtRecordPtr m_OfficeArtFSP;
......
...@@ -95,6 +95,8 @@ ...@@ -95,6 +95,8 @@
#include <Logic/Biff_records/DXF.h> #include <Logic/Biff_records/DXF.h>
#include <Logic/Biff_unions/STYLES.h> #include <Logic/Biff_unions/STYLES.h>
#include "Biff_structures/ODRAW/OfficeArtDgContainer.h"
namespace XLS namespace XLS
{; {;
...@@ -184,6 +186,8 @@ const bool GlobalsSubstream::loadContent(BinProcessor& proc) ...@@ -184,6 +186,8 @@ const bool GlobalsSubstream::loadContent(BinProcessor& proc)
{ {
int count = 0; int count = 0;
global_info_ = proc.getGlobalWorkbookInfo();
while (true) while (true)
{ {
CFRecordType::TypeId type = proc.getNextRecordType(); CFRecordType::TypeId type = proc.getNextRecordType();
...@@ -481,8 +485,50 @@ const bool GlobalsSubstream::loadContent(BinProcessor& proc) ...@@ -481,8 +485,50 @@ const bool GlobalsSubstream::loadContent(BinProcessor& proc)
} }
} }
} }
LoadHFPicture();
return true; return true;
} }
void GlobalsSubstream::LoadHFPicture()
{
if (m_arHFPicture.empty()) return;
int current_size_hf = 0, j = 0;
for ( int i = 0; i < m_arHFPicture.size(); i++)
{
HFPicture* hf = dynamic_cast<HFPicture*>(m_arHFPicture[i].get());
if ((hf) && (hf->recordDrawingGroup))
{
if (!hf->fContinue && current_size_hf > 0)
{
XLS::CFRecord record(CFRecordType::ANY_TYPE, global_info_);
for (; j < i; j++)
{
hf = dynamic_cast<HFPicture*>(m_arHFPicture[j].get());
record.appendRawData(hf->recordDrawingGroup);
}
ODRAW::OfficeArtDgContainerPtr rgDrawing = ODRAW::OfficeArtDgContainerPtr(new ODRAW::OfficeArtDgContainer(ODRAW::OfficeArtRecord::CA_HF));
rgDrawing->loadFields(record);
m_arHFPictureDrawing.push_back(rgDrawing);
current_size_hf = 0;
}
current_size_hf += hf->recordDrawingGroup->getDataSize();
}
}
if (current_size_hf > 0)
{
XLS::CFRecord record(ODRAW::OfficeArtRecord::DggContainer, global_info_);
for (; j < m_arHFPicture.size(); j++)
{
HFPicture* hf = dynamic_cast<HFPicture*>(m_arHFPicture[j].get());
record.appendRawData(hf->recordDrawingGroup);
}
ODRAW::OfficeArtDgContainerPtr rgDrawing = ODRAW::OfficeArtDgContainerPtr(new ODRAW::OfficeArtDgContainer(ODRAW::OfficeArtRecord::CA_HF));
rgDrawing->loadFields(record);
m_arHFPictureDrawing.push_back(rgDrawing);
}
}
} // namespace XLS } // namespace XLS
...@@ -39,7 +39,6 @@ namespace XLS ...@@ -39,7 +39,6 @@ namespace XLS
class CFStreamCacheReader; class CFStreamCacheReader;
class BOF; class BOF;
// Logical representation of Globals substream
class GlobalsSubstream; class GlobalsSubstream;
typedef boost::shared_ptr<GlobalsSubstream> GlobalsSubstreamPtr; typedef boost::shared_ptr<GlobalsSubstream> GlobalsSubstreamPtr;
...@@ -73,7 +72,13 @@ public: ...@@ -73,7 +72,13 @@ public:
std::vector<BaseObjectPtr> m_arUserBView; std::vector<BaseObjectPtr> m_arUserBView;
std::vector<BaseObjectPtr> m_arSUPBOOK; std::vector<BaseObjectPtr> m_arSUPBOOK;
std::vector<BiffStructurePtr> m_arHFPictureDrawing;
unsigned short code_page_; unsigned short code_page_;
GlobalWorkbookInfoPtr global_info_;
private:
void LoadHFPicture();
}; };
} // namespace XLS } // namespace XLS
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
#include <Logic/Biff_unions/BACKGROUND.h> #include <Logic/Biff_unions/BACKGROUND.h>
#include <Logic/Biff_unions/BIGNAME.h> #include <Logic/Biff_unions/BIGNAME.h>
#include <Logic/Biff_unions/PROTECTION_COMMON.h> // special name to exclude ambiguous meaning #include <Logic/Biff_unions/PROTECTION_COMMON.h>
#include <Logic/Biff_unions/COLUMNS.h> #include <Logic/Biff_unions/COLUMNS.h>
#include <Logic/Biff_unions/SCENARIOS.h> #include <Logic/Biff_unions/SCENARIOS.h>
#include <Logic/Biff_unions/SORTANDFILTER.h> #include <Logic/Biff_unions/SORTANDFILTER.h>
...@@ -74,6 +74,8 @@ ...@@ -74,6 +74,8 @@
#include <Logic/Biff_unions/RECORD12.h> #include <Logic/Biff_unions/RECORD12.h>
#include <Logic/Biff_unions/SHFMLA_SET.h> #include <Logic/Biff_unions/SHFMLA_SET.h>
#include "Biff_structures/ODRAW/OfficeArtDgContainer.h"
namespace XLS namespace XLS
{; {;
...@@ -105,13 +107,14 @@ WORKSHEET = BOF WORKSHEETCONTENT ...@@ -105,13 +107,14 @@ WORKSHEET = BOF WORKSHEETCONTENT
*/ */
const bool WorksheetSubstream::loadContent(BinProcessor& proc) const bool WorksheetSubstream::loadContent(BinProcessor& proc)
{ {
GlobalWorkbookInfoPtr global_info = proc.getGlobalWorkbookInfo(); global_info_ = proc.getGlobalWorkbookInfo();
GlobalWorkbookInfo::_sheet_size_info sheet_size_info; GlobalWorkbookInfo::_sheet_size_info sheet_size_info;
global_info->sheet_size_info.push_back(sheet_size_info);
global_info->current_sheet = global_info->sheet_size_info.size();
global_info->cmt_rules = 0; global_info_->sheet_size_info.push_back(sheet_size_info);
global_info_->current_sheet = global_info_->sheet_size_info.size();
global_info_->cmt_rules = 0;
int count = 0; int count = 0;
std::vector<CellRangeRef> shared_formulas_locations; std::vector<CellRangeRef> shared_formulas_locations;
...@@ -251,8 +254,16 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc) ...@@ -251,8 +254,16 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
elements_.pop_back(); elements_.pop_back();
} }
}break; }break;
case rt_HFPicture: proc.repeated<HFPicture>(0, 0); break; case rt_HFPicture:
{
count = proc.repeated<HFPicture>(0, 0);
while(count > 0)
{
m_arHFPicture.insert(m_arHFPicture.begin(), elements_.back());
elements_.pop_back();
count--;
}
}break;
case rt_CommentText: case rt_CommentText:
{ {
count = proc.repeated<CommentText>(0, 0); count = proc.repeated<CommentText>(0, 0);
...@@ -263,7 +274,6 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc) ...@@ -263,7 +274,6 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
count--; count--;
} }
}break; }break;
case rt_Note: case rt_Note:
{ {
count = proc.repeated<Note>(0, 0); count = proc.repeated<Note>(0, 0);
...@@ -304,7 +314,7 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc) ...@@ -304,7 +314,7 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
elements_.pop_back(); elements_.pop_back();
DxGCol* dx = dynamic_cast<DxGCol*>(m_DxGCol.get()); DxGCol* dx = dynamic_cast<DxGCol*>(m_DxGCol.get());
global_info->sheet_size_info.back().defaultColumnWidth = dx->dxgCol / 256.; global_info_->sheet_size_info.back().defaultColumnWidth = dx->dxgCol / 256.;
} }
}break; }break;
case rt_MergeCells: case rt_MergeCells:
...@@ -386,8 +396,9 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc) ...@@ -386,8 +396,9 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
count--; count--;
} }
}break; }break;
case rt_HeaderFooter: proc.repeated<RECORD12> (0, 0); break; case rt_HeaderFooter:
proc.repeated<RECORD12> (0, 0);
break;
default://unknown .... skip default://unknown .... skip
{ {
proc.SkipRecord(); proc.SkipRecord();
...@@ -395,8 +406,51 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc) ...@@ -395,8 +406,51 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
} }
} }
LoadHFPicture();
return true; return true;
} }
void WorksheetSubstream::LoadHFPicture()
{
if (m_arHFPicture.empty()) return;
int current_size_hf = 0, j = 0;
for ( int i = 0; i < m_arHFPicture.size(); i++)
{
HFPicture* hf = dynamic_cast<HFPicture*>(m_arHFPicture[i].get());
if ((hf) && (hf->recordDrawingGroup))
{
if (!hf->fContinue && current_size_hf > 0)
{
XLS::CFRecord record(CFRecordType::ANY_TYPE, global_info_);
for (; j < i; j++)
{
hf = dynamic_cast<HFPicture*>(m_arHFPicture[j].get());
record.appendRawData(hf->recordDrawingGroup);
}
ODRAW::OfficeArtDgContainerPtr rgDrawing = ODRAW::OfficeArtDgContainerPtr(new ODRAW::OfficeArtDgContainer(ODRAW::OfficeArtRecord::CA_HF));
rgDrawing->loadFields(record);
m_arHFPictureDrawing.push_back(rgDrawing);
current_size_hf = 0;
}
current_size_hf += hf->recordDrawingGroup->getDataSize();
}
}
if (current_size_hf > 0)
{
XLS::CFRecord record(ODRAW::OfficeArtRecord::DggContainer, global_info_);
for (; j < m_arHFPicture.size(); j++)
{
HFPicture* hf = dynamic_cast<HFPicture*>(m_arHFPicture[j].get());
record.appendRawData(hf->recordDrawingGroup);
}
ODRAW::OfficeArtDgContainerPtr rgDrawing = ODRAW::OfficeArtDgContainerPtr(new ODRAW::OfficeArtDgContainer(ODRAW::OfficeArtRecord::CA_HF));
rgDrawing->loadFields(record);
m_arHFPictureDrawing.push_back(rgDrawing);
}
}
} // namespace XLS } // namespace XLS
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
namespace XLS namespace XLS
{; {;
// Logical representation of WorksheetSubstream union of records
class WorksheetSubstream; class WorksheetSubstream;
typedef boost::shared_ptr<WorksheetSubstream> WorksheetSubstreamPtr; typedef boost::shared_ptr<WorksheetSubstream> WorksheetSubstreamPtr;
...@@ -54,12 +53,9 @@ public: ...@@ -54,12 +53,9 @@ public:
static const ElementType type = typeWorksheetSubstream; static const ElementType type = typeWorksheetSubstream;
GlobalWorkbookInfoPtr global_info_;
size_t ws_index_; size_t ws_index_;
std::vector<BaseObjectPtr> m_arMergeCells;
std::vector<BaseObjectPtr> m_arWINDOW;
std::vector<BaseObjectPtr> m_arCUSTOMVIEW;
BaseObjectPtr m_GLOBALS; BaseObjectPtr m_GLOBALS;
BaseObjectPtr m_PAGESETUP; BaseObjectPtr m_PAGESETUP;
BaseObjectPtr m_BACKGROUND; BaseObjectPtr m_BACKGROUND;
...@@ -75,12 +71,22 @@ public: ...@@ -75,12 +71,22 @@ public:
BaseObjectPtr m_SheetExt; BaseObjectPtr m_SheetExt;
BaseObjectPtr m_DxGCol; BaseObjectPtr m_DxGCol;
std::vector<BaseObjectPtr> m_arMergeCells;
std::vector<BaseObjectPtr> m_arWINDOW;
std::vector<BaseObjectPtr> m_arCUSTOMVIEW;
std::vector<BaseObjectPtr> m_arFEAT; std::vector<BaseObjectPtr> m_arFEAT;
std::vector<BaseObjectPtr> m_arFEAT11; std::vector<BaseObjectPtr> m_arFEAT11;
std::vector<BaseObjectPtr> m_arNote; std::vector<BaseObjectPtr> m_arNote;
std::vector<BaseObjectPtr> m_arHLINK; std::vector<BaseObjectPtr> m_arHLINK;
std::vector<BaseObjectPtr> m_arSORT; std::vector<BaseObjectPtr> m_arSORT;
std::vector<BaseObjectPtr> m_arLabel; std::vector<BaseObjectPtr> m_arLabel;
std::vector<BaseObjectPtr> m_arHFPicture;
std::vector<BiffStructurePtr> m_arHFPictureDrawing;
private:
void LoadHFPicture(); //todoooo - обобщить
}; };
} // namespace XLS } // namespace XLS
......
...@@ -652,6 +652,7 @@ enum ElementType ...@@ -652,6 +652,7 @@ enum ElementType
typeOfficeArtRecord = 3000, typeOfficeArtRecord = 3000,
typeOfficeArtBStoreContainerFileBlock, typeOfficeArtBStoreContainerFileBlock,
typeOfficeArtDgContainer,
typeOfficeArtCOLORREF, typeOfficeArtCOLORREF,
typeOfficeArtFOPTE, typeOfficeArtFOPTE,
typeOfficeArtFRIT, typeOfficeArtFRIT,
...@@ -660,6 +661,8 @@ enum ElementType ...@@ -660,6 +661,8 @@ enum ElementType
typeOfficeArtRecordHeader, typeOfficeArtRecordHeader,
typeOfficeArtRGFOPTE, typeOfficeArtRGFOPTE,
typeOfficeArtBlip, typeOfficeArtBlip,
typeOfficeArtSpContainer,
typeOfficeArtSpgrContainer,
typeOfficeArtBStoreContainer, typeOfficeArtBStoreContainer,
typeOfficeArtClientAnchorChart, typeOfficeArtClientAnchorChart,
typeOfficeArtClientAnchorHF, typeOfficeArtClientAnchorHF,
......
...@@ -78,6 +78,7 @@ ...@@ -78,6 +78,7 @@
#include <Logic/Biff_structures/ODRAW/OfficeArtBlip.h> #include <Logic/Biff_structures/ODRAW/OfficeArtBlip.h>
#include <Logic/Biff_structures/ODRAW/OfficeArtFSPGR.h> #include <Logic/Biff_structures/ODRAW/OfficeArtFSPGR.h>
#include <Logic/Biff_structures/ODRAW/OfficeArtClientAnchorSheet.h> #include <Logic/Biff_structures/ODRAW/OfficeArtClientAnchorSheet.h>
#include <Logic/Biff_structures/ODRAW/OfficeArtClientAnchorHF.h>
#include "xlsx_conversion_context.h" #include "xlsx_conversion_context.h"
#include "xlsx_package.h" #include "xlsx_package.h"
...@@ -447,6 +448,11 @@ void XlsConverter::convert(XLS::WorksheetSubstream* sheet) ...@@ -447,6 +448,11 @@ void XlsConverter::convert(XLS::WorksheetSubstream* sheet)
sheet->m_PAGESETUP->serialize(xlsx_context->current_sheet().pageProperties()); sheet->m_PAGESETUP->serialize(xlsx_context->current_sheet().pageProperties());
} }
for (int i = 0 ; i < sheet->m_arHFPictureDrawing.size(); i++)
{
//convert(dynamic_cast<XLS::Note*>(sheet->sheet->m_arHFPictureDrawing[i].get(),
}
if (sheet->m_arCUSTOMVIEW.size() > 0) if (sheet->m_arCUSTOMVIEW.size() > 0)
{ {
CP_XML_WRITER(xlsx_context->current_sheet().customViews()) CP_XML_WRITER(xlsx_context->current_sheet().customViews())
...@@ -465,6 +471,11 @@ void XlsConverter::convert(XLS::WorksheetSubstream* sheet) ...@@ -465,6 +471,11 @@ void XlsConverter::convert(XLS::WorksheetSubstream* sheet)
{ {
convert(dynamic_cast<XLS::BACKGROUND*>(sheet->m_BACKGROUND.get())); convert(dynamic_cast<XLS::BACKGROUND*>(sheet->m_BACKGROUND.get()));
} }
for (int i = 0 ; i < sheet->m_arHFPictureDrawing.size(); i++)
{
convert((ODRAW::OfficeArtDgContainer*)sheet->m_arHFPictureDrawing[i].get());
}
} }
void XlsConverter::convert(XLS::GlobalsSubstream* global) void XlsConverter::convert(XLS::GlobalsSubstream* global)
...@@ -486,6 +497,12 @@ void XlsConverter::convert(XLS::GlobalsSubstream* global) ...@@ -486,6 +497,12 @@ void XlsConverter::convert(XLS::GlobalsSubstream* global)
{ {
convert((XLS::MSODRAWINGGROUP*)global->m_arMSODRAWINGGROUP[i].get()); convert((XLS::MSODRAWINGGROUP*)global->m_arMSODRAWINGGROUP[i].get());
} }
for (int i = 0 ; i < global->m_arHFPictureDrawing.size(); i++)
{
convert((ODRAW::OfficeArtDgContainer*)global->m_arHFPictureDrawing[i].get());
}
for (int i = 0 ; i < global->m_arWindow1.size(); i++) for (int i = 0 ; i < global->m_arWindow1.size(); i++)
{ {
global->m_arWindow1[i]->serialize(xlsx_context->workbook_views()); global->m_arWindow1[i]->serialize(xlsx_context->workbook_views());
...@@ -591,7 +608,7 @@ std::wstring XlsConverter::WriteMediaFile(char *data, int size, std::wstring typ ...@@ -591,7 +608,7 @@ std::wstring XlsConverter::WriteMediaFile(char *data, int size, std::wstring typ
{ {
if (size < 1 || !data) return L""; if (size < 1 || !data) return L"";
if (id < 0) id = xlsx_context->get_mediaitems().count_image + 1000; // встроенные в поток if (id < 0) id = xlsx_context->get_mediaitems().count_image + 1000; // 1000 - встроенные в поток , 3000 - footer/header
xlsx_context->get_mediaitems().create_media_path(xlsx_path); xlsx_context->get_mediaitems().create_media_path(xlsx_path);
...@@ -714,14 +731,14 @@ std::wstring XlsConverter::WriteMediaFile(char *data, int size, std::wstring typ ...@@ -714,14 +731,14 @@ std::wstring XlsConverter::WriteMediaFile(char *data, int size, std::wstring typ
return L""; return L"";
} }
void XlsConverter::convert(ODRAW::OfficeArtBStoreContainer* art_bstore) void XlsConverter::convert(ODRAW::OfficeArtBStoreContainer* art_bstore, int start_id)
{ {
if (art_bstore == NULL) return; if (art_bstore == NULL) return;
if (art_bstore->rgfb.size() < 1) return; if (art_bstore->rgfb.size() < 1) return;
for (int i =0 ; i < art_bstore->rgfb.size(); i++) for (int i = 0 ; i < art_bstore->rgfb.size(); i++)
{ {
int bin_id = i + 1; int bin_id = i + start_id + 1;
WriteMediaFile(art_bstore->rgfb[i]->pict_data, art_bstore->rgfb[i]->pict_size, art_bstore->rgfb[i]->pict_type, bin_id); WriteMediaFile(art_bstore->rgfb[i]->pict_data, art_bstore->rgfb[i]->pict_size, art_bstore->rgfb[i]->pict_type, bin_id);
} }
...@@ -796,7 +813,7 @@ void XlsConverter::convert(XLS::BACKGROUND * back) ...@@ -796,7 +813,7 @@ void XlsConverter::convert(XLS::BACKGROUND * back)
if (rId.empty()) return; if (rId.empty()) return;
CP_XML_WRITER(xlsx_context->current_sheet().picture()) CP_XML_WRITER(xlsx_context->current_sheet().picture_background())
{ {
CP_XML_NODE(L"picture") CP_XML_NODE(L"picture")
{ {
...@@ -1029,7 +1046,24 @@ void XlsConverter::convert(XLS::OBJECTS* objects, XLS::WorksheetSubstream * shee ...@@ -1029,7 +1046,24 @@ void XlsConverter::convert(XLS::OBJECTS* objects, XLS::WorksheetSubstream * shee
} }
} }
} }
void XlsConverter::convert(ODRAW::OfficeArtSpgrContainer * spgr)
{
if (spgr == NULL) return;
if (spgr->anchor_type_ != ODRAW::OfficeArtRecord::CA_HF) return; //todooo проверить что тока для header/footer это нужно
for (int i = 0; i < spgr->child_records.size(); i++)
{
int type_object = 2;//rect
if (xlsx_context->get_drawing_context().start_drawing(type_object))
{
xlsx_context->get_drawing_context().set_mode_vmlwrite(true);
convert(spgr->child_records[i].get());
xlsx_context->get_drawing_context().end_drawing();
}
}
}
void XlsConverter::convert(ODRAW::OfficeArtSpContainer *sp, bool anchor_only) void XlsConverter::convert(ODRAW::OfficeArtSpContainer *sp, bool anchor_only)
{ {
if (sp == NULL) return; if (sp == NULL) return;
...@@ -1068,6 +1102,11 @@ void XlsConverter::convert(ODRAW::OfficeArtRecord * art) ...@@ -1068,6 +1102,11 @@ void XlsConverter::convert(ODRAW::OfficeArtRecord * art)
xlsx_context->get_drawing_context().set_group_anchor(ch->_x, ch->_y, ch->_cx, ch->_cy); xlsx_context->get_drawing_context().set_group_anchor(ch->_x, ch->_y, ch->_cx, ch->_cy);
}break; }break;
case XLS::typeOfficeArtClientAnchorHF:
{
ODRAW::OfficeArtClientAnchorHF * hf = dynamic_cast<ODRAW::OfficeArtClientAnchorHF *>(art);
xlsx_context->get_drawing_context().set_child_anchor(0, 0, hf->_cx * 3 / 5, hf->_cy * 3 / 5);
}break;
case XLS::typeOfficeArtChildAnchor: case XLS::typeOfficeArtChildAnchor:
{ {
ODRAW::OfficeArtChildAnchor * ch = dynamic_cast<ODRAW::OfficeArtChildAnchor *>(art); ODRAW::OfficeArtChildAnchor * ch = dynamic_cast<ODRAW::OfficeArtChildAnchor *>(art);
...@@ -1081,6 +1120,34 @@ void XlsConverter::convert(ODRAW::OfficeArtRecord * art) ...@@ -1081,6 +1120,34 @@ void XlsConverter::convert(ODRAW::OfficeArtRecord * art)
//xlsx_context->get_drawing_context().set_child_anchor(ch->_x, ch->_y, ch->_cx, ch->_cy); //xlsx_context->get_drawing_context().set_child_anchor(ch->_x, ch->_y, ch->_cx, ch->_cy);
xlsx_context->get_drawing_context().set_sheet_anchor(ch->colL, ch->_dxL, ch->rwT, ch->_dyT, ch->colR, ch->_dxR, ch->rwB, ch->_dyB); xlsx_context->get_drawing_context().set_sheet_anchor(ch->colL, ch->_dxL, ch->rwT, ch->_dyT, ch->colR, ch->_dxR, ch->rwB, ch->_dyB);
}break; }break;
case XLS::typeOfficeArtBStoreContainer:
{
convert (dynamic_cast<ODRAW::OfficeArtBStoreContainer *>(art), 3000);
}break;
case XLS::typeOfficeArtSpContainer:
{
convert (dynamic_cast<ODRAW::OfficeArtSpContainer *>(art));
}break;
case XLS::typeOfficeArtSpgrContainer:
{
convert (dynamic_cast<ODRAW::OfficeArtSpgrContainer *>(art));
}break;
case XLS::typeOfficeArtDgContainer:
{
ODRAW::OfficeArtDgContainer * dg = dynamic_cast<ODRAW::OfficeArtDgContainer *>(art);
for (int i = 0 ; i < dg->child_records.size(); i++) //a-la msodrawing for headers/footers
{
convert(dg->child_records[i].get());
}
for (int i = 0; i < dg->m_OfficeArtSpContainer.size(); i++)
{
convert(dg->m_OfficeArtSpContainer[i].get());
}
convert(dg->m_OfficeArtSpgrContainer.get());
}break;
} }
} }
...@@ -1368,7 +1435,12 @@ void XlsConverter::convert_blip(std::vector<ODRAW::OfficeArtFOPTEPtr> & props) ...@@ -1368,7 +1435,12 @@ void XlsConverter::convert_blip(std::vector<ODRAW::OfficeArtFOPTEPtr> & props)
{ {
bool isIternal = false; bool isIternal = false;
std::wstring target; std::wstring target;
std::wstring rId = xlsx_context->get_mediaitems().find_image(props[i]->op , target, isIternal);
int id = props[i]->op;
if (xlsx_context->get_drawing_context().get_mode_vmlwrite())
id += 3000;
std::wstring rId = xlsx_context->get_mediaitems().find_image(id , target, isIternal);
xlsx_context->get_drawing_context().set_fill_texture(target); xlsx_context->get_drawing_context().set_fill_texture(target);
}break; }break;
} }
...@@ -1637,16 +1709,18 @@ void XlsConverter::convert(XLS::Note* note) ...@@ -1637,16 +1709,18 @@ void XlsConverter::convert(XLS::Note* note)
xlsx_context->get_comments_context().start_comment(); xlsx_context->get_comments_context().start_comment();
} }
xlsx_context->get_comments_context().set_ref (note->note_sh.ref_, xlsx_context->get_comments_context().set_ref (note->note_sh.ref_, note->note_sh.col, note->note_sh.row);
note->note_sh.col,
note->note_sh.row);
xlsx_context->get_comments_context().set_author (note->note_sh.stAuthor); xlsx_context->get_comments_context().set_author (note->note_sh.stAuthor);
xlsx_context->get_comments_context().set_visibly(note->note_sh.fShow); xlsx_context->get_comments_context().set_visibly(note->note_sh.fShow);
xlsx_context->get_drawing_context().set_object_id (xlsx_context->get_comments_context().get_id());
xlsx_context->get_drawing_context().set_object_visible (note->note_sh.fShow);
xlsx_context->get_drawing_context().set_object_anchor (note->note_sh.col, note->note_sh.row);
if (xls_global_info->Version < 0x0600) if (xls_global_info->Version < 0x0600)
{ {
//todooo размеры произвольные .. можно сделать оценку по размеру строки //todooo размеры произвольные .. можно сделать оценку по размеру строки
xlsx_context->get_comments_context().set_size(120, 64, note->note_sh.x_/ 12700. , note->note_sh.y_/ 12700.); xlsx_context->get_drawing_context().set_child_anchor(120, 64, note->note_sh.x_/ 12700. , note->note_sh.y_/ 12700.);
xlsx_context->get_comments_context().set_content(std::wstring(L"<t>") + note->note_sh.stText.value() + std::wstring(L"</t>")); xlsx_context->get_comments_context().set_content(std::wstring(L"<t>") + note->note_sh.stText.value() + std::wstring(L"</t>"));
xlsx_context->get_comments_context().end_comment(); xlsx_context->get_comments_context().end_comment();
} }
......
...@@ -79,6 +79,7 @@ namespace ODRAW ...@@ -79,6 +79,7 @@ namespace ODRAW
{ {
class OfficeArtRecord; class OfficeArtRecord;
class OfficeArtBStoreContainer; class OfficeArtBStoreContainer;
class OfficeArtSpgrContainer;
class OfficeArtSpContainer; class OfficeArtSpContainer;
class OfficeArtFOPT; class OfficeArtFOPT;
class OfficeArtFSP; class OfficeArtFSP;
...@@ -118,7 +119,8 @@ public: ...@@ -118,7 +119,8 @@ public:
void convert(XLS::IMDATA * imadata); void convert(XLS::IMDATA * imadata);
void convert(ODRAW::OfficeArtRecord * art); void convert(ODRAW::OfficeArtRecord * art);
void convert(ODRAW::OfficeArtBStoreContainer* art_bstore); void convert(ODRAW::OfficeArtBStoreContainer* art_bstore, int start_id = 0);
void convert(ODRAW::OfficeArtSpgrContainer * spgr);
void convert(ODRAW::OfficeArtSpContainer * sp, bool anchor_only = false); void convert(ODRAW::OfficeArtSpContainer * sp, bool anchor_only = false);
void convert(ODRAW::OfficeArtFOPT * fort); void convert(ODRAW::OfficeArtFOPT * fort);
void convert(ODRAW::OfficeArtFSP * fsp); void convert(ODRAW::OfficeArtFSP * fsp);
......
...@@ -102,106 +102,6 @@ public: ...@@ -102,106 +102,6 @@ public:
} }
} }
} }
void serialize_vml(std::wostream & strm) const
{
_CP_OPT(std::wstring) strVal;
_CP_OPT(double) dVal;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xml")
{
CP_XML_ATTR(L"xmlns:v", L"urn:schemas-microsoft-com:vml");
CP_XML_ATTR(L"xmlns:o", L"urn:schemas-microsoft-com:office:office");
CP_XML_ATTR(L"xmlns:x", L"urn:schemas-microsoft-com:office:excel");
CP_XML_NODE(L"v:shapetype")
{
CP_XML_ATTR(L"id" , L"_x0000_t202");
CP_XML_ATTR(L"coordsize", L"21600,21600");
CP_XML_ATTR(L"o:spt" , L"202");
CP_XML_ATTR(L"path" , L"m,l,21600r21600,l21600,xe");
CP_XML_NODE(L"v:stroke")
{
CP_XML_ATTR(L"joinstyle", L"miter");
}
CP_XML_NODE(L"v:path")
{
CP_XML_ATTR(L"gradientshapeok", L"t");
CP_XML_ATTR(L"o:connecttype", L"rect");
}
}
int count = 0;
BOOST_FOREACH(_xlsx_comment const & c, xlsx_comment_)
{
CP_XML_NODE(L"v:shape")
{
CP_XML_ATTR(L"fillcolor", std::wstring(L"#") + c.fill_);
CP_XML_ATTR(L"id", L"shape_" + boost::lexical_cast<std::wstring>(count++));
std::wstring style = std::wstring(L"position:absolute;");
//todooo сделать "покороче" значения .. достаточно 2 знаков после запятой
style += std::wstring(L"margin-left:") + boost::lexical_cast<std::wstring>(c.left_) + std::wstring(L"pt;");
style += std::wstring(L"margin-top:") + boost::lexical_cast<std::wstring>(c.top_) + std::wstring(L"pt;");
style += std::wstring(L"width:") + boost::lexical_cast<std::wstring>(c.width_) + std::wstring(L"pt;");
style += std::wstring(L"height:") + boost::lexical_cast<std::wstring>(c.height_) + std::wstring(L"pt;");
style += std::wstring(L"z-index:") + boost::lexical_cast<std::wstring>(count) + std::wstring(L";");
if (c.visibly_ == false) style += std::wstring(L"visibility:hidden;");
CP_XML_ATTR(L"style",style);
CP_XML_ATTR(L"type", L"_x0000_t202");
// CP_XML_ATTR(L"opacity",boost::lexical_cast<std::wstring>((int)(100.-dVal.get())) + L"%");
CP_XML_NODE(L"v:shadow")
{
CP_XML_ATTR(L"color", L"black");
CP_XML_ATTR(L"obscured", L"t");
CP_XML_ATTR(L"on", L"t");
}
CP_XML_NODE(L"v:wrap")
{
CP_XML_ATTR(L"v:type", L"none");
}
CP_XML_NODE(L"v:fill")
{
CP_XML_ATTR(L"color" , std::wstring(L"#") + c.fill_);
//CP_XML_ATTR(L"color2" , std::wstring(L"#") + c.fill_);
CP_XML_ATTR(L"type" , L"solid");
// CP_XML_ATTR(L"opacity", (dVal.get())/100.);
}
CP_XML_NODE(L"v:stroke")
{
CP_XML_ATTR(L"color", std::wstring(L"#") + c.line_);
// CP_XML_ATTR(L"opacity",(100.-dVal.get())/100.);
}
CP_XML_NODE(L"x:ClientData")
{
CP_XML_ATTR(L"ObjectType", L"Note");
CP_XML_NODE(L"x:MoveWithCells"){}
CP_XML_NODE(L"x:SizeWithCells"){}
if (!c.anchor_.empty())
{
CP_XML_NODE(L"x:Anchor"){CP_XML_CONTENT(c.anchor_);}
}
CP_XML_NODE(L"x:AutoFill") {CP_XML_CONTENT("False");}
CP_XML_NODE(L"x:Row") {CP_XML_CONTENT(c.row_);}
CP_XML_NODE(L"x:Column") {CP_XML_CONTENT(c.col_);}
if (c.visibly_) CP_XML_NODE(L"x:Visible");
}
}
}
}
}
}
bool empty() const bool empty() const
{ {
return ( xlsx_comment_.empty()); return ( xlsx_comment_.empty());
...@@ -251,11 +151,6 @@ void xlsx_comments::serialize(std::wostream & _Wostream) ...@@ -251,11 +151,6 @@ void xlsx_comments::serialize(std::wostream & _Wostream)
impl_->serialize(_Wostream); impl_->serialize(_Wostream);
} }
void xlsx_comments::serialize_vml(std::wostream & _Wostream)
{
impl_->serialize_vml(_Wostream);
}
xlsx_comments_ptr xlsx_comments::create() xlsx_comments_ptr xlsx_comments::create()
{ {
return boost::make_shared<xlsx_comments>(); return boost::make_shared<xlsx_comments>();
......
...@@ -38,18 +38,10 @@ ...@@ -38,18 +38,10 @@
namespace oox { namespace oox {
struct _xlsx_comment struct _xlsx_comment
{ {
double left_, top_;
double width_, height_;
std::wstring anchor_;
std::wstring ref_; std::wstring ref_;
std::wstring fill_;
std::wstring line_;
int col_; int col_;
int row_; int row_;
...@@ -57,23 +49,20 @@ namespace oox { ...@@ -57,23 +49,20 @@ namespace oox {
std::wstring author_; std::wstring author_;
std::wstring content_; std::wstring content_;
}; };
class xlsx_comments; class xlsx_comments;
typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr; typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr;
struct comment_elm struct comment_elm
{ {
comment_elm(std::wstring const & _filename, std::wstring const & _vml_filename, std::wstring const & _content, std::wstring const & _vml_content, xlsx_comments_ptr _comments) comment_elm(std::wstring const & _filename, std::wstring const & _content, xlsx_comments_ptr _comments)
: filename(_filename), content(_content), comments(_comments),vml_filename(_vml_filename),vml_content(_vml_content) : filename(_filename), content(_content), comments(_comments)
{} {}
xlsx_comments_ptr comments; xlsx_comments_ptr comments;
std::wstring filename; std::wstring filename;
std::wstring content; std::wstring content;
std::wstring vml_filename;
std::wstring vml_content;
}; };
class xlsx_comments class xlsx_comments
...@@ -88,7 +77,6 @@ public: ...@@ -88,7 +77,6 @@ public:
bool empty() const; bool empty() const;
void serialize(std::wostream & strm); void serialize(std::wostream & strm);
void serialize_vml(std::wostream & strm);
private: private:
class Impl; class Impl;
......
...@@ -46,32 +46,23 @@ typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr; ...@@ -46,32 +46,23 @@ typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr;
class xlsx_comments_context_handle::Impl class xlsx_comments_context_handle::Impl
{ {
public: public:
Impl() Impl() : next_comments_id_(1) , next_comments_file_id_(1)
: next_comments_id_(1) ,next_file_id_(1)
{ {
} }
std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, std::wstring const & vml_content,xlsx_comments_ptr comments) std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, xlsx_comments_ptr comments)
{ {
const std::wstring file_id = boost::lexical_cast<std::wstring>(next_file_id_++); const std::wstring file_comments_id = boost::lexical_cast<std::wstring>(next_comments_file_id_++);
const std::wstring fileName = std::wstring(L"comments") + file_id + L".xml"; const std::wstring fileName = std::wstring(L"comments") + file_comments_id + L".xml";
const std::wstring vml_fileName = std::wstring(L"vmlDrawing") + file_id + L".vml";
comments_.push_back(comment_elm(fileName,vml_fileName, content, vml_content, comments)); comments_.push_back(comment_elm(fileName, content, comments));
const std::wstring id = boost::lexical_cast<std::wstring>(next_comments_id_++); const std::wstring id = boost::lexical_cast<std::wstring>(next_comments_id_++);
const std::wstring rId = std::wstring(L"comId") + id; const std::wstring rId = std::wstring(L"comId") + id;
return std::pair<std::wstring, std::wstring>(fileName, rId); return std::pair<std::wstring, std::wstring>(fileName, rId);
} }
std::pair<std::wstring, std::wstring> get_vml_drawing_xml()
{
const std::wstring id = boost::lexical_cast<std::wstring>(next_comments_id_++);
const std::wstring rId = std::wstring(L"comId") + id;
return std::pair<std::wstring, std::wstring>(comments_.back().vml_filename, rId);
}
const std::vector<comment_elm> & content() const const std::vector<comment_elm> & content() const
{ {
return comments_; return comments_;
...@@ -82,11 +73,12 @@ private: ...@@ -82,11 +73,12 @@ private:
std::vector<comment_elm> comments_; std::vector<comment_elm> comments_;
size_t next_comments_id_; size_t next_comments_id_;
size_t next_file_id_; size_t next_comments_file_id_;
}; };
xlsx_comments_context_handle::xlsx_comments_context_handle() xlsx_comments_context_handle::xlsx_comments_context_handle(/*size_t & next_vml_file_id*/)
: impl_(new xlsx_comments_context_handle::Impl()) : impl_(new xlsx_comments_context_handle::Impl(/*next_vml_file_id*/))
{ {
} }
...@@ -94,13 +86,9 @@ xlsx_comments_context_handle::~xlsx_comments_context_handle() ...@@ -94,13 +86,9 @@ xlsx_comments_context_handle::~xlsx_comments_context_handle()
{ {
} }
std::pair<std::wstring, std::wstring> xlsx_comments_context_handle::add_comments_xml(std::wstring const & content, std::wstring const & vml_content,xlsx_comments_ptr comments) std::pair<std::wstring, std::wstring> xlsx_comments_context_handle::add_comments_xml(std::wstring const & content, xlsx_comments_ptr comments)
{ {
return impl_->add_comments_xml(content,vml_content, comments); return impl_->add_comments_xml(content, comments);
}
std::pair<std::wstring, std::wstring> xlsx_comments_context_handle::get_vml_drawing_xml()
{
return impl_->get_vml_drawing_xml();
} }
const std::vector<comment_elm> & xlsx_comments_context_handle::content() const const std::vector<comment_elm> & xlsx_comments_context_handle::content() const
...@@ -112,7 +100,7 @@ class xlsx_comments_context::Impl ...@@ -112,7 +100,7 @@ class xlsx_comments_context::Impl
{ {
public: public:
Impl(xlsx_comments_context_handle & handle) : xlsx_comments_(xlsx_comments::create()), Impl(xlsx_comments_context_handle & handle) : xlsx_comments_(xlsx_comments::create()),
handle_(handle) handle_(handle) , count_comments_(0)
{} {}
xlsx_comments_context_handle & handle_; xlsx_comments_context_handle & handle_;
...@@ -121,16 +109,13 @@ public: ...@@ -121,16 +109,13 @@ public:
void add_comment(_xlsx_comment & d) void add_comment(_xlsx_comment & d)
{ {
xlsx_comments_->add(d); xlsx_comments_->add(d);
count_comments_++;
} }
void write_comments(std::wostream & strm) void write_comments(std::wostream & strm)
{ {
xlsx_comments_->serialize(strm); xlsx_comments_->serialize(strm);
} }
void write_comments_vml(std::wostream & strm)
{
xlsx_comments_->serialize_vml(strm);
}
bool empty() const bool empty() const
{ {
return xlsx_comments_->empty(); return xlsx_comments_->empty();
...@@ -140,8 +125,10 @@ public: ...@@ -140,8 +125,10 @@ public:
{ {
return xlsx_comments_; return xlsx_comments_;
} }
int get_count_comments() {return count_comments_;}
private: private:
xlsx_comments_ptr xlsx_comments_; xlsx_comments_ptr xlsx_comments_;
int count_comments_;
}; };
...@@ -158,22 +145,14 @@ void xlsx_comments_context::start_comment () ...@@ -158,22 +145,14 @@ void xlsx_comments_context::start_comment ()
{ {
impl_->current_.ref_ = L""; impl_->current_.ref_ = L"";
impl_->current_.visibly_ = false; impl_->current_.visibly_ = false;
impl_->current_.fill_ = L"FFFFE1";
impl_->current_.line_ = L"3465af";
impl_->current_.anchor_ = L"";
impl_->current_.left_ = impl_->current_.top_ = impl_->current_.width_ = impl_->current_.height_ = 0;
} }
void xlsx_comments_context::set_size (double width_pt, double height_pt, double x_pt, double y_pt)
{
impl_->current_.width_ = width_pt;
impl_->current_.height_ = height_pt;
impl_->current_.left_ = x_pt;
impl_->current_.top_ = y_pt;
int xlsx_comments_context::get_id()
{
return impl_->get_count_comments() + 1;
} }
void xlsx_comments_context::set_content(std::wstring content) void xlsx_comments_context::set_content(std::wstring content)
{ {
impl_->current_.content_ = content; impl_->current_.content_ = content;
...@@ -186,10 +165,7 @@ void xlsx_comments_context::set_visibly(bool Val) ...@@ -186,10 +165,7 @@ void xlsx_comments_context::set_visibly(bool Val)
{ {
impl_->current_.visibly_ = Val; impl_->current_.visibly_ = Val;
} }
void xlsx_comments_context::set_anchor(std::wstring val)
{
impl_->current_.anchor_ = val;
}
void xlsx_comments_context::set_ref(std::wstring ref, int col, int row) void xlsx_comments_context::set_ref(std::wstring ref, int col, int row)
{ {
impl_->current_.ref_ = ref; impl_->current_.ref_ = ref;
...@@ -197,16 +173,6 @@ void xlsx_comments_context::set_ref(std::wstring ref, int col, int row) ...@@ -197,16 +173,6 @@ void xlsx_comments_context::set_ref(std::wstring ref, int col, int row)
impl_->current_.col_ = col; impl_->current_.col_ = col;
impl_->current_.row_ = row; impl_->current_.row_ = row;
} }
void xlsx_comments_context::set_fill_color (std::wstring color)
{
if (color.empty()) return;
impl_->current_.fill_ = color;
}
void xlsx_comments_context::set_line_color (std::wstring color)
{
if (color.empty()) return;
impl_->current_.line_ = color;
}
void xlsx_comments_context::end_comment() void xlsx_comments_context::end_comment()
{ {
...@@ -224,10 +190,6 @@ void xlsx_comments_context::write_comments(std::wostream & strm) ...@@ -224,10 +190,6 @@ void xlsx_comments_context::write_comments(std::wostream & strm)
{ {
impl_->write_comments(strm); impl_->write_comments(strm);
} }
void xlsx_comments_context::write_comments_vml(std::wostream & strm)
{
impl_->write_comments_vml(strm);
}
xlsx_comments_ptr xlsx_comments_context::get_comments() xlsx_comments_ptr xlsx_comments_context::get_comments()
{ {
......
...@@ -46,11 +46,10 @@ typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr; ...@@ -46,11 +46,10 @@ typedef _CP_PTR(xlsx_comments) xlsx_comments_ptr;
class xlsx_comments_context_handle class xlsx_comments_context_handle
{ {
public: public:
xlsx_comments_context_handle(); xlsx_comments_context_handle ();
~xlsx_comments_context_handle(); ~xlsx_comments_context_handle ();
std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, std::wstring const & vml_content,xlsx_comments_ptr comments); std::pair<std::wstring, std::wstring> add_comments_xml(std::wstring const & content, xlsx_comments_ptr comments);
std::pair<std::wstring, std::wstring> get_vml_drawing_xml();
const std::vector<comment_elm> & content() const; const std::vector<comment_elm> & content() const;
friend class xlsx_comments_context; friend class xlsx_comments_context;
...@@ -70,21 +69,18 @@ public: ...@@ -70,21 +69,18 @@ public:
void start_comment(); void start_comment();
int get_id();
void set_content (std::wstring content); void set_content (std::wstring content);
void set_author (std::wstring author); void set_author (std::wstring author);
void set_anchor (std::wstring anchor);
void set_size (double width_pt, double height_pt, double x_pt, double y_pt);
void set_ref (std::wstring ref, int col, int row); void set_ref (std::wstring ref, int col, int row);
void set_visibly (bool Val); void set_visibly (bool Val);
void set_fill_color (std::wstring color);
void set_line_color (std::wstring color);
void end_comment(); void end_comment();
bool empty() const; bool empty() const;
void write_comments (std::wostream & strm); void write_comments (std::wostream & strm);
void write_comments_vml (std::wostream & strm);
xlsx_comments_ptr get_comments(); xlsx_comments_ptr get_comments();
......
...@@ -44,9 +44,10 @@ ...@@ -44,9 +44,10 @@
namespace oox { namespace oox {
xlsx_conversion_context::xlsx_conversion_context( package::xlsx_document * outputDocument): output_document_(outputDocument), xlsx_conversion_context::xlsx_conversion_context( package::xlsx_document * outputDocument) : output_document_(outputDocument),
xlsx_table_context_(*this), next_vml_file_id_ ( 1 ),
xlsx_drawing_context_handle_(get_mediaitems()) xlsx_table_context_ ( *this ),
xlsx_drawing_context_handle_ ( next_vml_file_id_, get_mediaitems())
{ {
} }
xlsx_conversion_context::~xlsx_conversion_context() xlsx_conversion_context::~xlsx_conversion_context()
...@@ -178,6 +179,15 @@ void xlsx_conversion_context::end_document() ...@@ -178,6 +179,15 @@ void xlsx_conversion_context::end_document()
static const std::wstring kType = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing"; static const std::wstring kType = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing";
const std::wstring dName = std::wstring(L"../drawings/" + p3.first); const std::wstring dName = std::wstring(L"../drawings/" + p3.first);
content->add_rel(relationship(dId, kType, dName)); content->add_rel(relationship(dId, kType, dName));
}
const std::pair<std::wstring, std::wstring> p4 = sheet->get_vml_drawing_HF_link();
if (!p4.first.empty())
{
const std::wstring dId = p4.second;
static const std::wstring kType = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing";
const std::wstring dName = std::wstring(L"../drawings/" + p4.first);
content->add_rel(relationship(dId, kType, dName));
} }
///////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////
sheet->write_to(content->content()); sheet->write_to(content->content());
...@@ -262,6 +272,9 @@ void xlsx_conversion_context::end_document() ...@@ -262,6 +272,9 @@ void xlsx_conversion_context::end_document()
package::xl_drawings_ptr drawings = package::xl_drawings::create(xlsx_drawing_context_handle_.content()); package::xl_drawings_ptr drawings = package::xl_drawings::create(xlsx_drawing_context_handle_.content());
output_document_->get_xl_files().set_drawings(drawings); output_document_->get_xl_files().set_drawings(drawings);
package::xl_drawings_ptr drawings_vml = package::xl_drawings::create(xlsx_drawing_context_handle_.content_vml());
output_document_->get_xl_files().set_vml_drawings(drawings_vml);
package::xl_comments_ptr comments = package::xl_comments::create(xlsx_comments_context_handle_.content()); package::xl_comments_ptr comments = package::xl_comments::create(xlsx_comments_context_handle_.content());
output_document_->get_xl_files().set_comments(comments); output_document_->get_xl_files().set_comments(comments);
......
...@@ -55,7 +55,7 @@ namespace package ...@@ -55,7 +55,7 @@ namespace package
class xlsx_conversion_context : boost::noncopyable class xlsx_conversion_context : boost::noncopyable
{ {
public: public:
xlsx_conversion_context(package::xlsx_document * outputDocument); xlsx_conversion_context (package::xlsx_document * outputDocument);
~xlsx_conversion_context(); ~xlsx_conversion_context();
//void set_font_directory(std::wstring pathFonts); //void set_font_directory(std::wstring pathFonts);
...@@ -103,6 +103,8 @@ private: ...@@ -103,6 +103,8 @@ private:
//num_format_context num_format_context_; //num_format_context num_format_context_;
//size_t default_style_; //size_t default_style_;
size_t next_vml_file_id_; //используется для footer/header & comments
xlsx_table_context xlsx_table_context_; xlsx_table_context xlsx_table_context_;
xlsx_text_context xlsx_text_context_; xlsx_text_context xlsx_text_context_;
......
...@@ -61,11 +61,14 @@ namespace oox { ...@@ -61,11 +61,14 @@ namespace oox {
class xlsx_drawing_context_handle class xlsx_drawing_context_handle
{ {
public: public:
xlsx_drawing_context_handle(external_items & items); xlsx_drawing_context_handle (size_t & next_vml_file_id, external_items & items);
~xlsx_drawing_context_handle(); ~xlsx_drawing_context_handle();
std::pair<std::wstring, std::wstring> add_drawing_xml(std::wstring const & content, xlsx_drawings_rels_ptr rels); std::pair<std::wstring, std::wstring> add_drawing_xml (std::wstring const & content, xlsx_drawings_rels_ptr rels);
std::pair<std::wstring, std::wstring> add_drawing_vml (std::wstring const & content, xlsx_drawings_rels_ptr rels);
const std::vector<drawing_elm> & content() const; const std::vector<drawing_elm> & content() const;
const std::vector<drawing_elm> & content_vml() const;
friend class xlsx_drawing_context; friend class xlsx_drawing_context;
private: private:
...@@ -131,7 +134,8 @@ public: ...@@ -131,7 +134,8 @@ public:
_drawing_state() : shape_id(msosptRectangle), _drawing_state() : shape_id(msosptRectangle),
flipH(false), flipV(false), flipH(false), flipV(false),
bTextBox(false), bTextBox(false),
type_anchor(0) type_anchor(0),
vmlwrite_mode_(false)
{ {
id = -1; id = -1;
rotation = 0; rotation = 0;
...@@ -161,6 +165,7 @@ public: ...@@ -161,6 +165,7 @@ public:
int type_anchor; int type_anchor;
bool vmlwrite_mode_;
std::wstring shape; std::wstring shape;
int id; int id;
...@@ -267,6 +272,14 @@ public: ...@@ -267,6 +272,14 @@ public:
_fill fill; _fill fill;
_arrow arrow; _arrow arrow;
}line; }line;
struct _object
{
_object() {visible = false; col = row = 0; id = 0;}
int id;
bool visible;
int col;
int row;
}object;
//for group //for group
std::vector<_drawing_state_ptr> drawing_states; std::vector<_drawing_state_ptr> drawing_states;
std::vector<_drawing_state_ptr>* parent_drawing_states; std::vector<_drawing_state_ptr>* parent_drawing_states;
...@@ -287,11 +300,16 @@ public: ...@@ -287,11 +300,16 @@ public:
external_items::Type getType(); external_items::Type getType();
xlsx_drawings_rels_ptr get_drawings_rels(); xlsx_drawings_rels_ptr get_rels();
xlsx_drawings_rels_ptr get_vml_HF_rels();
xlsx_drawings_rels_ptr get_vml_comments_rels();
bool empty(); bool empty();
bool empty_vml_HF();
void start_group(); void start_group();
bool start_drawing (int type); bool start_drawing (int type);
//--------------------------------------------------------------------------------------
void start_image(); void start_image();
void start_shape(int type); void start_shape(int type);
void start_chart(); void start_chart();
...@@ -301,6 +319,9 @@ public: ...@@ -301,6 +319,9 @@ public:
void set_FlipH (); void set_FlipH ();
void set_FlipV (); void set_FlipV ();
void set_shape_id (int id); void set_shape_id (int id);
//--------------------------------------------------------------------------------------
void set_mode_vmlwrite (bool val);
bool get_mode_vmlwrite ();
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
void set_name (const std::wstring & str); void set_name (const std::wstring & str);
void set_description (const std::wstring & str); void set_description (const std::wstring & str);
...@@ -366,7 +387,11 @@ public: ...@@ -366,7 +387,11 @@ public:
void set_wordart_strike (bool val); void set_wordart_strike (bool val);
void set_wordart_vertical (bool val); void set_wordart_vertical (bool val);
void set_wordart_spacing (double val); void set_wordart_spacing (double val);
//---------------------------------------------------------------------------------------------
void set_object_id (int val);
void set_object_visible (bool val);
void set_object_anchor (int col, int row);
//---------------------------------------------------------------------------------------------
void set_custom_rect (_rect & rect); void set_custom_rect (_rect & rect);
void set_custom_verticles (std::vector<ODRAW::MSOPOINT> & points); void set_custom_verticles (std::vector<ODRAW::MSOPOINT> & points);
void set_custom_segments (std::vector<ODRAW::MSOPATHINFO>& segments); void set_custom_segments (std::vector<ODRAW::MSOPATHINFO>& segments);
...@@ -380,9 +405,19 @@ public: ...@@ -380,9 +405,19 @@ public:
void serialize_chart (_drawing_state_ptr & drawing_state, std::wstring rId ); void serialize_chart (_drawing_state_ptr & drawing_state, std::wstring rId );
void serialize_pic (_drawing_state_ptr & drawing_state, std::wstring rId ); void serialize_pic (_drawing_state_ptr & drawing_state, std::wstring rId );
void serialize (std::wostream & stream, _drawing_state_ptr & drawing_state); void serialize_shape_comment(_drawing_state_ptr & drawing_state); //part of vml shape
//-----------------------------------------------------------------------------------
void serialize_vml_shape (_drawing_state_ptr & drawing_state);
void serialize_vml_pic (_drawing_state_ptr & drawing_state, std::wstring rId );
//-----------------------------------------------------------------------------------
void serialize_fill (std::wostream & stream, _drawing_state_ptr & drawing_state); void serialize_fill (std::wostream & stream, _drawing_state_ptr & drawing_state);
void serialize_fill (std::wostream & stream); void serialize_fill (std::wostream & stream);
//-----------------------------------------------------------------------------------
void serialize (std::wostream & stream, _drawing_state_ptr & drawing_state);
void serialize_vml (std::wostream & stream, _drawing_state_ptr & drawing_state);
//-----------------------------------------------------------------------------------
void serialize_vml_HF (std::wostream & stream);
void serialize_vml_comments (std::wostream & stream);
void serialize (std::wostream & stream); void serialize (std::wostream & stream);
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
bool is_lined_shape (_drawing_state_ptr & drawing_state); bool is_lined_shape (_drawing_state_ptr & drawing_state);
...@@ -393,12 +428,19 @@ private: ...@@ -393,12 +428,19 @@ private:
xlsx_conversion_context & context_; xlsx_conversion_context & context_;
xlsx_drawing_context_handle & handle_; xlsx_drawing_context_handle & handle_;
xlsx_drawings_rels_ptr rels_; xlsx_drawings_rels_ptr rels_;
xlsx_drawings_rels_ptr vml_comments_rels_;
xlsx_drawings_rels_ptr vml_HF_rels_;
int count_object; int count_object;
bool in_chart_; bool in_chart_;
std::vector<_hlink_desc> hlinks_; std::vector<_hlink_desc> hlinks_;
std::vector<_drawing_state_ptr> drawing_states_vml_HF;
std::vector<_drawing_state_ptr> drawing_states_vml_comments;
std::vector<_drawing_state_ptr> drawing_states; std::vector<_drawing_state_ptr> drawing_states;
std::vector<_drawing_state_ptr>* current_drawing_states; std::vector<_drawing_state_ptr>* current_drawing_states;
......
...@@ -63,7 +63,7 @@ public: ...@@ -63,7 +63,7 @@ public:
std::wstringstream sortAndFilters_; std::wstringstream sortAndFilters_;
std::wstringstream customViews_; std::wstringstream customViews_;
std::wstringstream conditionalFormatting_; std::wstringstream conditionalFormatting_;
std::wstringstream picture_; std::wstringstream picture_background_;
rels rels_; rels rels_;
...@@ -75,6 +75,9 @@ public: ...@@ -75,6 +75,9 @@ public:
std::wstring vml_drawingName_; std::wstring vml_drawingName_;
std::wstring vml_drawingId_; std::wstring vml_drawingId_;
std::wstring vml_drawingName_HF_;
std::wstring vml_drawingId_HF_;
}; };
std::wstring xlsx_xml_worksheet::name() const std::wstring xlsx_xml_worksheet::name() const
...@@ -137,10 +140,10 @@ std::wostream & xlsx_xml_worksheet::pageProperties() ...@@ -137,10 +140,10 @@ std::wostream & xlsx_xml_worksheet::pageProperties()
{ {
return impl_->pageProperties_; return impl_->pageProperties_;
} }
std::wostream & xlsx_xml_worksheet::comments() //std::wostream & xlsx_xml_worksheet::comments()
{ //{
return impl_->comments_; // return impl_->comments_;
} //}
std::wostream & xlsx_xml_worksheet::hyperlinks() std::wostream & xlsx_xml_worksheet::hyperlinks()
{ {
return impl_->hyperlinks_; return impl_->hyperlinks_;
...@@ -157,9 +160,9 @@ std::wostream & xlsx_xml_worksheet::conditionalFormatting() ...@@ -157,9 +160,9 @@ std::wostream & xlsx_xml_worksheet::conditionalFormatting()
{ {
return impl_->conditionalFormatting_; return impl_->conditionalFormatting_;
} }
std::wostream & xlsx_xml_worksheet::picture() std::wostream & xlsx_xml_worksheet::picture_background()
{ {
return impl_->picture_; return impl_->picture_background_;
} }
//----------------------------------------------------------------- //-----------------------------------------------------------------
...@@ -207,15 +210,22 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm) ...@@ -207,15 +210,22 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm)
CP_XML_STREAM() << impl_->drawing_.str(); CP_XML_STREAM() << impl_->drawing_.str();
if (impl_->commentsId_.length()>0) if (!impl_->commentsId_.empty() && !impl_->vml_drawingId_.empty())
{ {
CP_XML_NODE(L"legacyDrawing") CP_XML_NODE(L"legacyDrawing")
{ {
CP_XML_ATTR(L"r:id",impl_->vml_drawingId_); CP_XML_ATTR(L"r:id", impl_->vml_drawingId_);
}
}
if (!impl_->vml_drawingId_HF_.empty())
{
CP_XML_NODE(L"legacyDrawingHF")
{
CP_XML_ATTR(L"r:id", impl_->vml_drawingId_HF_);
} }
} }
CP_XML_STREAM() << impl_->picture_.str(); CP_XML_STREAM() << impl_->picture_background_.str();
//CP_XML_NODE(L"rowBreaks){} //CP_XML_NODE(L"rowBreaks){}
...@@ -242,6 +252,11 @@ void xlsx_xml_worksheet::set_vml_drawing_link(std::wstring const & fileName, std ...@@ -242,6 +252,11 @@ void xlsx_xml_worksheet::set_vml_drawing_link(std::wstring const & fileName, std
impl_->vml_drawingName_ = fileName; impl_->vml_drawingName_ = fileName;
impl_->vml_drawingId_ = id; impl_->vml_drawingId_ = id;
} }
void xlsx_xml_worksheet::set_vml_drawing_link_HF(std::wstring const & fileName, std::wstring const & id)
{
impl_->vml_drawingName_HF_ = fileName;
impl_->vml_drawingId_HF_ = id;
}
std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_drawing_link() const std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_drawing_link() const
{ {
return std::pair<std::wstring, std::wstring>(impl_->drawingName_, impl_->drawingId_); return std::pair<std::wstring, std::wstring>(impl_->drawingName_, impl_->drawingId_);
...@@ -254,6 +269,10 @@ std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_vml_drawing_link() ...@@ -254,6 +269,10 @@ std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_vml_drawing_link()
{ {
return std::pair<std::wstring, std::wstring>(impl_->vml_drawingName_, impl_->vml_drawingId_); return std::pair<std::wstring, std::wstring>(impl_->vml_drawingName_, impl_->vml_drawingId_);
} }
std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_vml_drawing_HF_link() const
{
return std::pair<std::wstring, std::wstring>(impl_->vml_drawingName_HF_, impl_->vml_drawingId_HF_);
}
} }
...@@ -63,12 +63,12 @@ public: ...@@ -63,12 +63,12 @@ public:
std::wostream & hyperlinks(); std::wostream & hyperlinks();
std::wostream & mergeCells(); std::wostream & mergeCells();
std::wostream & drawing(); std::wostream & drawing();
std::wostream & comments(); //std::wostream & comments();
std::wostream & sheetSortAndFilters(); std::wostream & sheetSortAndFilters();
std::wostream & pageProperties(); std::wostream & pageProperties();
std::wostream & customViews(); std::wostream & customViews();
std::wostream & conditionalFormatting(); std::wostream & conditionalFormatting();
std::wostream & picture(); std::wostream & picture_background();
rels & sheet_rels();//hyperlink, background image, external, media ... rels & sheet_rels();//hyperlink, background image, external, media ...
...@@ -78,9 +78,11 @@ public: ...@@ -78,9 +78,11 @@ public:
void set_vml_drawing_link (std::wstring const & fileName, std::wstring const & id); void set_vml_drawing_link (std::wstring const & fileName, std::wstring const & id);
void set_comments_link (std::wstring const & fileName, std::wstring const & id); void set_comments_link (std::wstring const & fileName, std::wstring const & id);
void set_state (std::wstring const & state); void set_state (std::wstring const & state);
void set_vml_drawing_link_HF(std::wstring const & fileName, std::wstring const & id);
std::pair<std::wstring, std::wstring> get_drawing_link() const; std::pair<std::wstring, std::wstring> get_drawing_link() const;
std::pair<std::wstring, std::wstring> get_vml_drawing_link() const; std::pair<std::wstring, std::wstring> get_vml_drawing_link() const;
std::pair<std::wstring, std::wstring> get_vml_drawing_HF_link() const;
std::pair<std::wstring, std::wstring> get_comments_link() const; std::pair<std::wstring, std::wstring> get_comments_link() const;
static xlsx_xml_worksheet_ptr create(std::wstring const & name); static xlsx_xml_worksheet_ptr create(std::wstring const & name);
......
...@@ -217,6 +217,12 @@ void xl_files::write(const std::wstring & RootPath) ...@@ -217,6 +217,12 @@ void xl_files::write(const std::wstring & RootPath)
comments_->set_main_document(get_main_document()); comments_->set_main_document(get_main_document());
comments_->write(path); comments_->write(path);
} }
if (vml_drawings_)
{
vml_drawings_->set_main_document(get_main_document());
vml_drawings_->write(path);
}
rels_files_.write(path); rels_files_.write(path);
} }
...@@ -255,6 +261,8 @@ void xl_files::set_drawings(element_ptr Element) ...@@ -255,6 +261,8 @@ void xl_files::set_drawings(element_ptr Element)
void xl_files::set_vml_drawings(element_ptr Element) void xl_files::set_vml_drawings(element_ptr Element)
{ {
vml_drawings_ = Element; vml_drawings_ = Element;
xl_drawings* d = dynamic_cast<xl_drawings*>(vml_drawings_.get());
d->vml = true;
} }
void xl_files::add_charts(chart_content_ptr chart) void xl_files::add_charts(chart_content_ptr chart)
{ {
...@@ -320,8 +328,14 @@ void xl_drawings::write(const std::wstring & RootPath) ...@@ -320,8 +328,14 @@ void xl_drawings::write(const std::wstring & RootPath)
content_type & contentTypes = this->get_main_document()->content_type().get_content_type(); content_type & contentTypes = this->get_main_document()->content_type().get_content_type();
const std::wstring kDrawingCT = L"application/vnd.openxmlformats-officedocument.drawing+xml"; if (vml)
contentTypes.add_override(L"/xl/drawings/" + e.filename, kDrawingCT); {
contentTypes.add_override(L"/xl/drawings/" + e.filename, L"application/vnd.openxmlformats-officedocument.vmlDrawing");
}
else
{
contentTypes.add_override(L"/xl/drawings/" + e.filename, L"application/vnd.openxmlformats-officedocument.drawing+xml");
}
} }
} }
...@@ -344,7 +358,6 @@ void xl_comments::write(const std::wstring & RootPath) ...@@ -344,7 +358,6 @@ void xl_comments::write(const std::wstring & RootPath)
contentTypes.add_override(std::wstring(L"/xl/") + e.filename, kWSConType); contentTypes.add_override(std::wstring(L"/xl/") + e.filename, kWSConType);
package::simple_element(e.filename, e.content).write(RootPath); package::simple_element(e.filename, e.content).write(RootPath);
package::simple_element(e.vml_filename, e.vml_content).write(vml_path);
} }
} }
......
...@@ -67,7 +67,6 @@ private: ...@@ -67,7 +67,6 @@ private:
rels_file_ptr rels_; rels_file_ptr rels_;
}; };
/// \class sheets_files
class sheets_files : public element class sheets_files : public element
{ {
public: public:
...@@ -88,7 +87,6 @@ public: ...@@ -88,7 +87,6 @@ public:
}; };
/// \class xl_charts_files
class xl_charts_files : public element class xl_charts_files : public element
{ {
public: public:
...@@ -105,7 +103,6 @@ public: ...@@ -105,7 +103,6 @@ public:
class xl_comments; class xl_comments;
typedef _CP_PTR(xl_comments) xl_comments_ptr; typedef _CP_PTR(xl_comments) xl_comments_ptr;
/// \class xl_comments
class xl_comments: public element class xl_comments: public element
{ {
public: public:
...@@ -128,13 +125,14 @@ typedef _CP_PTR(xl_drawings) xl_drawings_ptr; ...@@ -128,13 +125,14 @@ typedef _CP_PTR(xl_drawings) xl_drawings_ptr;
class xl_drawings: public element class xl_drawings: public element
{ {
public: public:
bool vml;
virtual void write(const std::wstring & RootPath); virtual void write(const std::wstring & RootPath);
void set_rels(rels_files * rels) void set_rels(rels_files * rels)
{ {
rels_ = rels; rels_ = rels;
} }
xl_drawings(const std::vector<drawing_elm> & elms) : drawings_ ( elms ) xl_drawings(const std::vector<drawing_elm> & elms) : drawings_ ( elms ), vml(false)
{ {
} }
...@@ -146,7 +144,6 @@ private: ...@@ -146,7 +144,6 @@ private:
}; };
/// \class xl_files
class xl_files : public element class xl_files : public element
{ {
public: public:
...@@ -155,15 +152,15 @@ public: ...@@ -155,15 +152,15 @@ public:
public: public:
virtual void write(const std::wstring & RootPath); virtual void write(const std::wstring & RootPath);
void set_workbook(element_ptr Element); void set_workbook (element_ptr Element);
void set_styles(element_ptr Element); void set_styles (element_ptr Element);
void set_sharedStrings(element_ptr Element); void set_sharedStrings (element_ptr Element);
void add_sheet(sheet_content_ptr sheet); void add_sheet (sheet_content_ptr sheet);
void set_media(external_items & _Mediaitems); void set_media (external_items & _Mediaitems);
void set_drawings(element_ptr Element); void set_drawings (element_ptr Element);
void set_vml_drawings(element_ptr Element); void set_vml_drawings (element_ptr Element);
void set_comments(element_ptr Element); void set_comments (element_ptr Element);
void add_charts(chart_content_ptr chart); void add_charts (chart_content_ptr chart);
private: private:
rels_files rels_files_; rels_files rels_files_;
...@@ -181,7 +178,6 @@ private: ...@@ -181,7 +178,6 @@ private:
}; };
/// \class xlsx_document
class xlsx_document : public document class xlsx_document : public document
{ {
public: public:
......
...@@ -69,7 +69,7 @@ void xlsx_table_context::end_table() ...@@ -69,7 +69,7 @@ void xlsx_table_context::end_table()
get_drawing_context().serialize(strm); get_drawing_context().serialize(strm);
const std::pair<std::wstring, std::wstring> drawingName = const std::pair<std::wstring, std::wstring> drawingName =
context_.get_drawing_context_handle().add_drawing_xml(strm.str(), get_drawing_context().get_drawings_rels()); context_.get_drawing_context_handle().add_drawing_xml(strm.str(), get_drawing_context().get_rels());
context_.current_sheet().set_drawing_link(drawingName.first, drawingName.second); context_.current_sheet().set_drawing_link(drawingName.first, drawingName.second);
...@@ -80,6 +80,17 @@ void xlsx_table_context::end_table() ...@@ -80,6 +80,17 @@ void xlsx_table_context::end_table()
CP_XML_ATTR(L"r:id", drawingName.second); CP_XML_ATTR(L"r:id", drawingName.second);
} }
} }
}
if (!get_drawing_context().empty_vml_HF())
{
std::wstringstream strm;
get_drawing_context().serialize_vml_HF(strm);
const std::pair<std::wstring, std::wstring> vmlDrawingName =
context_.get_drawing_context_handle().add_drawing_vml(strm.str(), get_drawing_context().get_vml_HF_rels());
context_.current_sheet().set_vml_drawing_link_HF(vmlDrawingName.first, vmlDrawingName.second);
} }
if (!get_comments_context().empty()) if (!get_comments_context().empty())
{ {
...@@ -87,16 +98,16 @@ void xlsx_table_context::end_table() ...@@ -87,16 +98,16 @@ void xlsx_table_context::end_table()
get_comments_context().write_comments(strm); get_comments_context().write_comments(strm);
std::wstringstream vml_strm; std::wstringstream vml_strm;
get_comments_context().write_comments_vml(vml_strm); get_drawing_context().serialize_vml_comments(vml_strm);
const std::pair<std::wstring, std::wstring> commentsName = const std::pair<std::wstring, std::wstring> commentsName =
context_.get_comments_context_handle().add_comments_xml(strm.str(), vml_strm.str(), context_.get_comments_context().get_comments() ); context_.get_comments_context_handle().add_comments_xml(strm.str(), context_.get_comments_context().get_comments());
const std::pair<std::wstring, std::wstring> vml_drawingName = const std::pair<std::wstring, std::wstring> vmlDrawingName =
context_.get_comments_context_handle().get_vml_drawing_xml(); context_.get_drawing_context_handle().add_drawing_vml(vml_strm.str(), get_drawing_context().get_vml_comments_rels());
context_.current_sheet().set_comments_link(commentsName.first, commentsName.second); context_.current_sheet().set_comments_link (commentsName.first, commentsName.second);
context_.current_sheet().set_vml_drawing_link(vml_drawingName.first, vml_drawingName.second); context_.current_sheet().set_vml_drawing_link (vmlDrawingName.first, vmlDrawingName.second);
} }
} }
......
...@@ -212,9 +212,14 @@ namespace OOX ...@@ -212,9 +212,14 @@ namespace OOX
{ {
if (sNodeName.IsEmpty()) return L""; if (sNodeName.IsEmpty()) return L"";
CString sResult = _T("<") + sNodeName + _T(" m:val=\""); CString sResult = _T("<") + sNodeName;
if (m_val.IsInit())
{
sResult += _T(" m:val=\"");
sResult += m_val->ToString(); sResult += m_val->ToString();
sResult += _T("\" />"); sResult += _T("\"");
}
sResult += _T("/>");
return sResult; return sResult;
} }
......
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