Commit 1e0f4d6f authored by ElenaSubbotina's avatar ElenaSubbotina

XlsFormat - developers controls (buttons, options, ....), fix vba stream

parent a038e156
...@@ -97,9 +97,9 @@ CompoundFile::CompoundFile(const std::wstring & file_path, const ReadWriteMode m ...@@ -97,9 +97,9 @@ CompoundFile::CompoundFile(const std::wstring & file_path, const ReadWriteMode m
Open(file_path, mode); Open(file_path, mode);
} }
void CompoundFile::copy_stream(std::string streamName, POLE::Storage * storageOut, bool bWithRoot) void CompoundFile::copy_stream(std::string streamNameOpen, std::string streamNameCreate, POLE::Storage * storageOut, bool bWithRoot)
{ {
POLE::Stream *stream = new POLE::Stream(storage_, streamName); POLE::Stream *stream = new POLE::Stream(storage_, streamNameOpen);
if (!stream) return; if (!stream) return;
stream->seek(0); stream->seek(0);
...@@ -107,12 +107,12 @@ void CompoundFile::copy_stream(std::string streamName, POLE::Storage * storageOu ...@@ -107,12 +107,12 @@ void CompoundFile::copy_stream(std::string streamName, POLE::Storage * storageOu
if (bWithRoot == false) if (bWithRoot == false)
{ {
int pos = streamName.find("/"); int pos = streamNameCreate.find("/");
if (pos >= 0) if (pos >= 0)
streamName = streamName.substr(pos + 1); streamNameCreate = streamNameCreate.substr(pos + 1);
} }
POLE::Stream *streamNew = new POLE::Stream(storageOut, streamName, true, size_stream); POLE::Stream *streamNew = new POLE::Stream(storageOut, streamNameCreate, true, size_stream);
if (!streamNew) return; if (!streamNew) return;
unsigned char* data_stream = new unsigned char[size_stream]; unsigned char* data_stream = new unsigned char[size_stream];
...@@ -135,7 +135,8 @@ void CompoundFile::copy_stream(std::string streamName, POLE::Storage * storageOu ...@@ -135,7 +135,8 @@ void CompoundFile::copy_stream(std::string streamName, POLE::Storage * storageOu
void CompoundFile::copy( int indent, std::string path, POLE::Storage * storageOut, bool bWithRoot, bool bSortFiles) void CompoundFile::copy( int indent, std::string path, POLE::Storage * storageOut, bool bWithRoot, bool bSortFiles)
{ {
std::list<std::string> entries, entries_files, entries_dir; std::list<std::string> entries, entries_files, entries_dir;
entries = storage_->entries( path );
entries = storage_->entries_with_prefix( path );
for( std::list<std::string>::iterator it = entries.begin(); it != entries.end(); it++ ) for( std::list<std::string>::iterator it = entries.begin(); it != entries.end(); it++ )
{ {
...@@ -157,16 +158,18 @@ void CompoundFile::copy( int indent, std::string path, POLE::Storage * storageOu ...@@ -157,16 +158,18 @@ void CompoundFile::copy( int indent, std::string path, POLE::Storage * storageOu
copy( indent + 1, fullname + "/", storageOut, bWithRoot, bSortFiles ); copy( indent + 1, fullname + "/", storageOut, bWithRoot, bSortFiles );
} }
if (bSortFiles)
{
entries_files.sort(); entries_files.sort();
//todooo ??? со спецсимволами выше
}
for( std::list<std::string>::iterator it = entries_files.begin(); it != entries_files.end(); it++ ) for( std::list<std::string>::iterator it = entries_files.begin(); it != entries_files.end(); it++ )
{ {
std::string fullname = path + *it; std::string createName = path + *it;
std::string openName;
if (it->at(0) < 32) openName = path + it->substr(1);
else openName = path + *it;
copy_stream(fullname, storageOut, bWithRoot); copy_stream(openName, createName, storageOut, bWithRoot);
} }
} }
CFStreamPtr CompoundFile::getWorkbookStream() CFStreamPtr CompoundFile::getWorkbookStream()
......
...@@ -65,7 +65,7 @@ public: ...@@ -65,7 +65,7 @@ public:
POLE::Storage *storage_; POLE::Storage *storage_;
private: private:
void copy_stream(std::string streamName, POLE::Storage * storageOut, bool bWithRoot = true); void copy_stream(std::string streamNameOpen, std::string streamNameCreate, POLE::Storage * storageOut, bool bWithRoot = true);
POLE::Stream* openStream (const std::string & stream_name); // Opens a stream in the storage (shall be called not more than once per stream) POLE::Stream* openStream (const std::string & stream_name); // Opens a stream in the storage (shall be called not more than once per stream)
POLE::Stream* createStream (const std::string & stream_name); // Creates a new stream in the storage POLE::Stream* createStream (const std::string & stream_name); // Creates a new stream in the storage
......
...@@ -32,14 +32,12 @@ ...@@ -32,14 +32,12 @@
#pragma once #pragma once
#include "BiffRecord.h" #include "BiffRecord.h"
#include <Logic/Biff_structures/BiffString.h> #include "../Biff_structures/BiffString.h"
#include <Logic/Biff_structures/BorderFillInfo.h> #include "../Biff_structures/BorderFillInfo.h"
namespace XLS namespace XLS
{ {
// Logical representation of Font record in BIFF8
class Font: public BiffRecord class Font: public BiffRecord
{ {
BIFF_RECORD_DEFINE_TYPE_INFO(Font) BIFF_RECORD_DEFINE_TYPE_INFO(Font)
......
...@@ -39,12 +39,10 @@ Note::Note() ...@@ -39,12 +39,10 @@ Note::Note()
{ {
} }
Note::~Note() Note::~Note()
{ {
} }
BaseObjectPtr Note::clone() BaseObjectPtr Note::clone()
{ {
return BaseObjectPtr(new Note(*this)); return BaseObjectPtr(new Note(*this));
......
...@@ -32,13 +32,11 @@ ...@@ -32,13 +32,11 @@
#pragma once #pragma once
#include "BiffRecord.h" #include "BiffRecord.h"
#include <Logic/Biff_structures/NoteSh.h> #include "../Biff_structures/NoteSh.h"
#include <Logic/Biff_structures/NoteRR.h> #include "../Biff_structures/NoteRR.h"
namespace XLS namespace XLS
{ {
// Logical representation of Note record in BIFF8
class Note: public BiffRecord class Note: public BiffRecord
{ {
BIFF_RECORD_DEFINE_TYPE_INFO(Note) BIFF_RECORD_DEFINE_TYPE_INFO(Note)
...@@ -49,15 +47,12 @@ public: ...@@ -49,15 +47,12 @@ public:
BaseObjectPtr clone(); BaseObjectPtr clone();
void readFields(CFRecord& record); void readFields(CFRecord& record);
static const ElementType type = typeNote; static const ElementType type = typeNote;
NoteSh note_sh; NoteSh note_sh;
// NoteRR note_rr; // NoteRR note_rr;
}; };
} // namespace XLS } // namespace XLS
......
...@@ -56,11 +56,11 @@ BaseObjectPtr TxO::clone() ...@@ -56,11 +56,11 @@ BaseObjectPtr TxO::clone()
void TxO::readFields(CFRecord& record) void TxO::readFields(CFRecord& record)
{ {
pGlobalWorkbookInfoPtr = record.getGlobalWorkbookInfo(); global_info = record.getGlobalWorkbookInfo();
unsigned short flags; unsigned short flags;
if (pGlobalWorkbookInfoPtr->Version < 0x0600) if (global_info->Version < 0x0600)
{ {
short mnLinkSize; short mnLinkSize;
short mnButtonFlags; short mnButtonFlags;
...@@ -154,6 +154,71 @@ void TxO::readFields(CFRecord& record) ...@@ -154,6 +154,71 @@ void TxO::readFields(CFRecord& record)
fSecretEdit = GETBIT(flags, 15); fSecretEdit = GETBIT(flags, 15);
} }
int TxO::serialize_vml (std::wostream & _stream)
{
std::wstring str_ = rawText.value();
int str_size = str_.size();
int iFmt = 0;
CP_XML_WRITER(_stream)
{
for (size_t i = 0; i < TxOruns.rgTxoRuns.size(); i++)
{
Run *run = dynamic_cast<Run*>(TxOruns.rgTxoRuns[i].get());
if (run == NULL) continue;
int end_string = str_size;
if ( i < TxOruns.rgTxoRuns.size() - 1)
{
Run *run_next = dynamic_cast<Run*>(TxOruns.rgTxoRuns[i+1].get());
if (run_next)
end_string = run_next->formatRun.ich;
}
CP_XML_NODE(L"div")
{
//style='text-align:left'
CP_XML_NODE(L"font")
{
iFmt = run->formatRun.ifnt;
Font *font = NULL;
if ((global_info->m_arFonts) && (iFmt >=0 && iFmt < global_info->m_arFonts->size()))
{
font = dynamic_cast<Font *>(global_info->m_arFonts->at(iFmt).get());
}
if (font)
{
if (font->dyHeight > 0) CP_XML_ATTR(L"size", font->dyHeight);
if (font->bls == 700) CP_XML_ATTR(L"bold", true);
if (font->fItalic) CP_XML_ATTR(L"italic", true);
if (!font->fontName.value().empty())
{
CP_XML_ATTR(L"face", font->fontName.value());
}
if ( font->icv < 0x7fff )
{
}
else CP_XML_ATTR(L"color", L"auto");
}
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);
}
}
}
}
return 0;
}
int TxO::serialize (std::wostream & _stream) int TxO::serialize (std::wostream & _stream)
{ {
...@@ -163,7 +228,7 @@ int TxO::serialize (std::wostream & _stream) ...@@ -163,7 +228,7 @@ int TxO::serialize (std::wostream & _stream)
int Fmt = 0; int Fmt = 0;
std::wstring namespace_ = L"a:"; std::wstring namespace_ = L"a:";
oox::external_items::Type type = pGlobalWorkbookInfoPtr->xls_converter->xlsx_context->get_drawing_context().getType(); oox::external_items::Type type = global_info->xls_converter->xlsx_context->get_drawing_context().getType();
if (type == oox::external_items::typeComment) if (type == oox::external_items::typeComment)
namespace_.clear(); namespace_.clear();
...@@ -215,13 +280,13 @@ int TxO::serialize (std::wostream & _stream) ...@@ -215,13 +280,13 @@ int TxO::serialize (std::wostream & _stream)
} }
int TxO::serialize_rPr (std::wostream & _stream, int iFmt, std::wstring namespace_) int TxO::serialize_rPr (std::wostream & _stream, int iFmt, std::wstring namespace_)
{ {
if (!pGlobalWorkbookInfoPtr) return 0; if (!global_info) return 0;
if (!pGlobalWorkbookInfoPtr->m_arFonts) return 0; if (!global_info->m_arFonts) return 0;
int sz = pGlobalWorkbookInfoPtr->m_arFonts->size(); int sz = global_info->m_arFonts->size();
if (iFmt - 1 >= sz || iFmt < 1) return 0; if (iFmt - 1 >= sz || iFmt < 1) return 0;
Font * font = dynamic_cast<Font*>(pGlobalWorkbookInfoPtr->m_arFonts->at(iFmt-1).get()); Font * font = dynamic_cast<Font*>(global_info->m_arFonts->at(iFmt-1).get());
if (!font) return 0; if (!font) return 0;
......
...@@ -32,17 +32,15 @@ ...@@ -32,17 +32,15 @@
#pragma once #pragma once
#include "BiffRecordContinued.h" #include "BiffRecordContinued.h"
#include <Logic/Biff_structures/ControlInfo.h> #include "MsoDrawing.h"
#include <Logic/Biff_structures/FontIndex.h> #include "../Biff_structures/ControlInfo.h"
#include <Logic/Biff_structures/ObjFmla.h> #include "../Biff_structures/FontIndex.h"
#include <Logic/Biff_structures/TxORuns.h> #include "../Biff_structures/ObjFmla.h"
#include <Logic/Biff_records/MsoDrawing.h> #include "../Biff_structures/TxORuns.h"
namespace XLS namespace XLS
{ {
// Logical representation of TxO record in BIFF8
class TxO: public BiffRecordContinued class TxO: public BiffRecordContinued
{ {
BIFF_RECORD_DEFINE_TYPE_INFO(TxO) BIFF_RECORD_DEFINE_TYPE_INFO(TxO)
...@@ -68,8 +66,9 @@ public: ...@@ -68,8 +66,9 @@ public:
int serialize (std::wostream & _stream); int serialize (std::wostream & _stream);
int serialize_rPr (std::wostream & _stream, int iFmt, std::wstring namespace_= L"a:"); int serialize_rPr (std::wostream & _stream, int iFmt, std::wstring namespace_= L"a:");
int serialize_vml (std::wostream & _stream);
GlobalWorkbookInfoPtr pGlobalWorkbookInfoPtr; GlobalWorkbookInfoPtr global_info;
unsigned char hAlignment; unsigned char hAlignment;
unsigned char vAlignment; unsigned char vAlignment;
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
namespace XLS namespace XLS
{ {
NoteSh::NoteSh() NoteSh::NoteSh()
{ {
x_ = y_ = 0; x_ = y_ = 0;
...@@ -47,14 +46,12 @@ NoteSh::NoteSh() ...@@ -47,14 +46,12 @@ NoteSh::NoteSh()
fColHidden = false; fColHidden = false;
} }
NoteSh::NoteSh(CFRecord& record) NoteSh::NoteSh(CFRecord& record)
{ {
x_ = y_ = 0; x_ = y_ = 0;
load(record); load(record);
} }
BiffStructurePtr NoteSh::clone() BiffStructurePtr NoteSh::clone()
{ {
return BiffStructurePtr(new NoteSh(*this)); return BiffStructurePtr(new NoteSh(*this));
......
...@@ -52,7 +52,6 @@ public: ...@@ -52,7 +52,6 @@ public:
virtual void load(CFRecord& record); virtual void load(CFRecord& record);
Rw row; Rw row;
Col col; Col col;
bool fShow; bool fShow;
......
...@@ -137,41 +137,6 @@ namespace NSCustomShapesConvert ...@@ -137,41 +137,6 @@ namespace NSCustomShapesConvert
} }
}; };
//class CRectF
//{
//public:
// float X;
// float Y;
// float Width;
// float Height;
//public:
// CRectF()
// {
// X = 0;
// Y = 0;
// Width = 0;
// Height = 0;
// }
// CRectF(const CRectF& oSrc)
// {
// *this = oSrc;
// }
// CRectF& operator=(const CRectF& oSrc)
// {
// X = oSrc.X;
// Y = oSrc.Y;
// Width = oSrc.Width;
// Height = oSrc.Height;
// return *this;
// }
// bool Equals(const CRect& oSrc)
// {
// return ((X == oSrc.X) && (Y == oSrc.Y) && (Width == oSrc.Width) && (Height == oSrc.Height));
// }
//};
class CGeomShapeInfo class CGeomShapeInfo
{ {
public: public:
...@@ -314,7 +279,7 @@ namespace NSCustomShapesConvert ...@@ -314,7 +279,7 @@ namespace NSCustomShapesConvert
enum RulesType enum RulesType
{ {
// VML // VML
rtLineTo = 0, // 2* rtLineTo = 0, // 2*
rtCurveTo = 1, // 6* rtCurveTo = 1, // 6*
rtMoveTo = 2, // 2 rtMoveTo = 2, // 2
...@@ -360,58 +325,14 @@ namespace NSCustomShapesConvert ...@@ -360,58 +325,14 @@ namespace NSCustomShapesConvert
class CGraphicPath class CGraphicPath
{ {
public: public:
//virtual void InternalFromXmlNode(XmlUtils::CXmlNode& oXmlNode)
//{
// Metric = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("metric"), _T("0")));
// m_bStroke = (1 == XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("stroke"), _T("0"))));
// m_bFill = (1 == XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("fill"), _T("0"))));
// m_dWidthMM = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("widthmm"), _T("210")));
// m_dHeightMM = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("heightmm"), _T("190")));
// m_dAngle = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("angle"), _T("0")));
// m_lFlags = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("flags"), _T("0")));
// m_oBounds.left = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("bounds-left"), _T("0")));
// m_oBounds.top = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("bounds-top"), _T("0")));
// m_oBounds.right = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("bounds-right"), _T("0")));
// m_oBounds.bottom = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("bounds-bottom"), _T("0")));
// XmlUtils::CXmlNodes oNodes;
// oXmlNode.GetNodes(_T("part"), oNodes);
// for (int nIndex = 0; nIndex < oNodes.GetCount(); ++nIndex)
// {
// CPart oPart;
// XmlUtils::CXmlNode oNode;
// oNodes.GetAt(nIndex, oNode);
// oPart.FromXmlNode(oNode);
// m_arParts.push_back(oPart);
// }
// //XmlUtils::CXmlNode oPenNode;
// //if (oXmlNode.GetNode(_T("pen"), oPenNode))
// //{
// // Pen.FromXmlNode(oPenNode);
// //}
// //XmlUtils::CXmlNode oBrushNode;
// //if (oXmlNode.GetNode(_T("brush"), oBrushNode))
// //{
// // Brush.FromXmlNode(oBrushNode);
// //}
//}
virtual void InternalClear() virtual void InternalClear()
{ {
m_lFlags = 0; m_lFlags = 0;
} }
public:
CGraphicPath() CGraphicPath()
{ {
InternalClear(); InternalClear();
} }
public:
class CPart class CPart
{ {
public: public:
...@@ -1028,9 +949,6 @@ namespace NSCustomShapesConvert ...@@ -1028,9 +949,6 @@ namespace NSCustomShapesConvert
{ {
m_arParts.clear(); m_arParts.clear();
} }
public:
std::vector<CPart> m_arParts; std::vector<CPart> m_arParts;
int m_lFlags; int m_lFlags;
......
...@@ -1040,7 +1040,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects, XLS::WorksheetSubstream * shee ...@@ -1040,7 +1040,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects, XLS::WorksheetSubstream * shee
if (text_obj) if (text_obj)
{ {
if (type_object <0) type_object = 0x0006; if (type_object < 0) type_object = 0x0006;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -1115,7 +1115,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects, XLS::WorksheetSubstream * shee ...@@ -1115,7 +1115,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects, XLS::WorksheetSubstream * shee
void XlsConverter::convert(ODRAW::OfficeArtSpgrContainer * spgr) void XlsConverter::convert(ODRAW::OfficeArtSpgrContainer * spgr)
{ {
if (spgr == NULL) return; if (spgr == NULL) return;
if (spgr->anchor_type_ != ODRAW::OfficeArtRecord::CA_HF) return; //todooo проверить что тока для header/footer это нужно if (spgr->anchor_type_ != ODRAW::OfficeArtRecord::CA_HF) return;
for (size_t i = 0; i < spgr->child_records.size(); i++) for (size_t i = 0; i < spgr->child_records.size(); i++)
{ {
...@@ -1123,7 +1123,7 @@ void XlsConverter::convert(ODRAW::OfficeArtSpgrContainer * spgr) ...@@ -1123,7 +1123,7 @@ void XlsConverter::convert(ODRAW::OfficeArtSpgrContainer * spgr)
if (xlsx_context->get_drawing_context().start_drawing(type_object)) if (xlsx_context->get_drawing_context().start_drawing(type_object))
{ {
xlsx_context->get_drawing_context().set_mode_vmlwrite(true); xlsx_context->get_drawing_context().set_mode_HF(true);
convert(spgr->child_records[i].get()); convert(spgr->child_records[i].get());
xlsx_context->get_drawing_context().end_drawing(); xlsx_context->get_drawing_context().end_drawing();
...@@ -1515,7 +1515,7 @@ void XlsConverter::convert_blip(std::vector<ODRAW::OfficeArtFOPTEPtr> & props) ...@@ -1515,7 +1515,7 @@ void XlsConverter::convert_blip(std::vector<ODRAW::OfficeArtFOPTEPtr> & props)
std::wstring target; std::wstring target;
int id = props[i]->op; int id = props[i]->op;
if (xlsx_context->get_drawing_context().get_mode_vmlwrite()) if (xlsx_context->get_drawing_context().get_mode_HF())
id += 3000; id += 3000;
std::wstring rId = xlsx_context->get_mediaitems().find_image(id , target, isIternal); std::wstring rId = xlsx_context->get_mediaitems().find_image(id , target, isIternal);
...@@ -1894,9 +1894,6 @@ void XlsConverter::convert(XLS::TxO * text_obj) ...@@ -1894,9 +1894,6 @@ void XlsConverter::convert(XLS::TxO * text_obj)
{ {
if (text_obj == NULL) return; if (text_obj == NULL) return;
std::wstringstream strm;
text_obj->serialize(strm);
int rot = text_obj->rot; int rot = text_obj->rot;
if (rot > 0) if (rot > 0)
...@@ -1928,7 +1925,14 @@ void XlsConverter::convert(XLS::TxO * text_obj) ...@@ -1928,7 +1925,14 @@ void XlsConverter::convert(XLS::TxO * text_obj)
xlsx_context->get_drawing_context().set_text_align (text_obj->hAlignment); xlsx_context->get_drawing_context().set_text_align (text_obj->hAlignment);
xlsx_context->get_drawing_context().set_text_vert_align (text_obj->vAlignment); xlsx_context->get_drawing_context().set_text_vert_align (text_obj->vAlignment);
std::wstringstream strm, strm_vml;
text_obj->serialize(strm);
xlsx_context->get_drawing_context().set_text(strm.str()); xlsx_context->get_drawing_context().set_text(strm.str());
text_obj->serialize_vml(strm_vml);
xlsx_context->get_drawing_context().set_text_vml(strm_vml.str());
} }
void XlsConverter::convert(XLS::Obj * obj) void XlsConverter::convert(XLS::Obj * obj)
...@@ -1991,9 +1995,17 @@ void XlsConverter::convert(XLS::Obj * obj) ...@@ -1991,9 +1995,17 @@ void XlsConverter::convert(XLS::Obj * obj)
if (obj->list.fExist) if (obj->list.fExist)
{ {
} }
bool full_ref = false;
if (obj->cmo.ot > 0x06) full_ref = true;
if (obj->linkFmla.fExist && obj->linkFmla.fmla.bFmlaExist)
{
std::wstring link = obj->linkFmla.fmla.fmla.getAssembledFormula(full_ref);
xlsx_context->get_drawing_context().set_object_link(link);
}
if (obj->macro.fExist && obj->macro.fmla.bFmlaExist) if (obj->macro.fExist && obj->macro.fmla.bFmlaExist)
{ {
std::wstring macro = obj->macro.fmla.fmla.getAssembledFormula(); std::wstring macro = obj->macro.fmla.fmla.getAssembledFormula(full_ref);
xlsx_context->get_drawing_context().set_macro(macro); xlsx_context->get_drawing_context().set_macro(macro);
} }
} }
......
...@@ -41,7 +41,22 @@ class rels; ...@@ -41,7 +41,22 @@ class rels;
class external_items class external_items
{ {
public: public:
enum Type { typeUnknown = 0, typeImage, typeChart, typeShape, typeTable, typeHyperlink, typeComment, typeMedia, typeGroup, typeExternalLink, typeOleObject, typeActiveX}; enum Type
{
typeUnknown = 0,
typeImage,
typeChart,
typeShape,
typeTable,
typeHyperlink,
typeComment,
typeMedia,
typeGroup,
typeExternalLink,
typeOleObject,
typeActiveX,
typeControl
};
external_items() external_items()
{ {
...@@ -52,6 +67,7 @@ public: ...@@ -52,6 +67,7 @@ public:
count_media = 0; count_media = 0;
count_activeX = 0; count_activeX = 0;
count_embeddings= 0; count_embeddings= 0;
count_controls = 0;
} }
struct item struct item
...@@ -79,6 +95,7 @@ public: ...@@ -79,6 +95,7 @@ public:
size_t count_tables; size_t count_tables;
size_t count_activeX; size_t count_activeX;
size_t count_embeddings; size_t count_embeddings;
size_t count_controls;
//std::wstring add_or_find(const std::wstring & href, Type type, bool & isInternal);//возможны ссылки на один и тот же объект //std::wstring add_or_find(const std::wstring & href, Type type, bool & isInternal);//возможны ссылки на один и тот же объект
std::wstring add_image (const std::wstring & file_name, int bin_id); std::wstring add_image (const std::wstring & file_name, int bin_id);
......
...@@ -135,7 +135,7 @@ public: ...@@ -135,7 +135,7 @@ public:
flipH(false), flipV(false), flipH(false), flipV(false),
bTextBox(false), bTextBox(false),
type_anchor(0), type_anchor(0),
vmlwrite_mode_(false), vml_HF_mode_(false),
hidden(false) hidden(false)
{ {
id = -1; id = -1;
...@@ -144,17 +144,20 @@ public: ...@@ -144,17 +144,20 @@ public:
custom_path = -1; custom_path = -1;
custom_x_limo = 0x80000000; custom_x_limo = 0x80000000;
custom_y_limo = 0x80000000; custom_y_limo = 0x80000000;
type_control = -1;
} }
external_items::Type type; external_items::Type type;
bool hidden; bool hidden;
std::wstring name; std::wstring name;
std::wstring description; std::wstring description;
std::wstring macro;
std::wstring objectId; std::wstring objectId;
std::wstring objectProgId; std::wstring objectProgId;
int type_control;
struct _anchor struct _anchor
{ {
int colFrom = -1; int colFrom = -1;
...@@ -172,8 +175,10 @@ public: ...@@ -172,8 +175,10 @@ public:
int type_anchor; int type_anchor;
bool vmlwrite_mode_; bool vml_HF_mode_;
std::wstring shape; std::wstring shape;
std::wstring vml_shape;
int id; int id;
MSOSPT shape_id; MSOSPT shape_id;
...@@ -204,7 +209,8 @@ public: ...@@ -204,7 +209,8 @@ public:
margins.left = margins.right = 0x00016530; margins.left = margins.right = 0x00016530;
margins.top = margins.bottom = 0x0000b298; margins.top = margins.bottom = 0x0000b298;
} }
std::wstring content; //c форматированием std::wstring content; //c форматированием oox
std::wstring vml_content; //c форматированием vml
int wrap; int wrap;
int align; int align;
int vert_align; int vert_align;
...@@ -289,11 +295,13 @@ public: ...@@ -289,11 +295,13 @@ public:
}line; }line;
struct _object struct _object
{ {
_object() {visible = false; col = row = 0; id = 0;} _object() {visible = true; col = row = 0; id = 0;}
int id; int id;
bool visible; bool visible;
int col; int col;
int row; int row;
std::wstring macro;
std::wstring link;
}object; }object;
//for group //for group
std::vector<_drawing_state_ptr> drawing_states; std::vector<_drawing_state_ptr> drawing_states;
...@@ -317,10 +325,11 @@ public: ...@@ -317,10 +325,11 @@ public:
xlsx_drawings_rels_ptr get_rels(); xlsx_drawings_rels_ptr get_rels();
xlsx_drawings_rels_ptr get_vml_HF_rels(); xlsx_drawings_rels_ptr get_vml_HF_rels();
xlsx_drawings_rels_ptr get_vml_comments_rels(); xlsx_drawings_rels_ptr get_vml_rels();
xlsx_drawings_rels_ptr get_sheet_rels(); xlsx_drawings_rels_ptr get_sheet_rels();
bool empty(); bool empty();
bool empty_vml();
bool empty_vml_HF(); bool empty_vml_HF();
void start_group(); void start_group();
...@@ -330,14 +339,15 @@ public: ...@@ -330,14 +339,15 @@ public:
void start_shape(int type); void start_shape(int type);
void start_chart(); void start_chart();
void start_comment(); void start_comment();
void start_control(int type);
void set_id (int id); void set_id (int id);
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); void set_mode_HF (bool val);
bool get_mode_vmlwrite (); bool get_mode_HF ();
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
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);
...@@ -392,6 +402,7 @@ public: ...@@ -392,6 +402,7 @@ public:
void set_hyperlink (const std::wstring & link, const std::wstring & display, bool is_external); void set_hyperlink (const std::wstring & link, const std::wstring & display, bool is_external);
void set_text (const std::wstring & text); void set_text (const std::wstring & text);
void set_text_vml (const std::wstring & text);
void set_text_wrap (int val); void set_text_wrap (int val);
void set_text_align (int val); void set_text_align (int val);
void set_text_vert_align (int val); void set_text_vert_align (int val);
...@@ -412,6 +423,7 @@ public: ...@@ -412,6 +423,7 @@ public:
void set_object_id (int val); void set_object_id (int val);
void set_object_visible (bool val); void set_object_visible (bool val);
void set_object_anchor (int col, int row); void set_object_anchor (int col, int row);
void set_object_link (const std::wstring & text);
//--------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------
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);
...@@ -431,8 +443,7 @@ public: ...@@ -431,8 +443,7 @@ 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_object (_drawing_state_ptr & drawing_state, std::wstring rId ); void serialize_object (_drawing_state_ptr & drawing_state, std::wstring rId );
void serialize_control (_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_shape (_drawing_state_ptr & drawing_state);
void serialize_vml_pic (_drawing_state_ptr & drawing_state, std::wstring rId ); void serialize_vml_pic (_drawing_state_ptr & drawing_state, std::wstring rId );
...@@ -441,12 +452,11 @@ public: ...@@ -441,12 +452,11 @@ public:
void serialize_fill (std::wostream & stream); void serialize_fill (std::wostream & stream);
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
void serialize (std::wostream & stream, _drawing_state_ptr & drawing_state); void serialize (std::wostream & stream, _drawing_state_ptr & drawing_state);
void serialize_vml (std::wostream & stream, _drawing_state_ptr & drawing_state);
void serialize_object (std::wostream & stream, _drawing_state_ptr & drawing_state); void serialize_object (std::wostream & stream, _drawing_state_ptr & drawing_state);
void serialize_objects (std::wostream & stream);
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
void serialize_vml_HF (std::wostream & stream); void serialize_vml_HF (std::wostream & stream);
void serialize_vml_comments (std::wostream & stream); void serialize_vml (std::wostream & stream);
void serialize_objects (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);
...@@ -459,7 +469,7 @@ private: ...@@ -459,7 +469,7 @@ private:
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_rels_;
xlsx_drawings_rels_ptr vml_HF_rels_; xlsx_drawings_rels_ptr vml_HF_rels_;
xlsx_drawings_rels_ptr sheet_rels_; xlsx_drawings_rels_ptr sheet_rels_;
...@@ -469,7 +479,7 @@ private: ...@@ -469,7 +479,7 @@ private:
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_HF;
std::vector<_drawing_state_ptr> drawing_states_vml_comments; std::vector<_drawing_state_ptr> drawing_states_vml;
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;
......
...@@ -78,8 +78,8 @@ public: ...@@ -78,8 +78,8 @@ 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_HF_drawingName_;
std::wstring vml_drawingId_HF_; std::wstring vml_HF_drawingId_;
}; };
std::wstring xlsx_xml_worksheet::name() const std::wstring xlsx_xml_worksheet::name() const
...@@ -223,18 +223,18 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm) ...@@ -223,18 +223,18 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm)
CP_XML_STREAM() << impl_->drawing_.str(); CP_XML_STREAM() << impl_->drawing_.str();
if (!impl_->commentsId_.empty() && !impl_->vml_drawingId_.empty()) if (!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()) if (!impl_->vml_HF_drawingId_.empty())
{ {
CP_XML_NODE(L"legacyDrawingHF") CP_XML_NODE(L"legacyDrawingHF")
{ {
CP_XML_ATTR(L"r:id", impl_->vml_drawingId_HF_); CP_XML_ATTR(L"r:id", impl_->vml_HF_drawingId_);
} }
} }
if (!impl_->ole_objects_.str().empty()) if (!impl_->ole_objects_.str().empty())
...@@ -271,10 +271,10 @@ void xlsx_xml_worksheet::set_vml_drawing_link(std::wstring const & fileName, std ...@@ -271,10 +271,10 @@ 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) void xlsx_xml_worksheet::set_vml_HF_drawing_link(std::wstring const & fileName, std::wstring const & id)
{ {
impl_->vml_drawingName_HF_ = fileName; impl_->vml_HF_drawingName_ = fileName;
impl_->vml_drawingId_HF_ = id; impl_->vml_HF_drawingId_ = 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
{ {
...@@ -290,7 +290,7 @@ std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_vml_drawing_link() ...@@ -290,7 +290,7 @@ std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_vml_drawing_link()
} }
std::pair<std::wstring, std::wstring> xlsx_xml_worksheet::get_vml_drawing_HF_link() const 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_); return std::pair<std::wstring, std::wstring>(impl_->vml_HF_drawingName_, impl_->vml_HF_drawingId_);
} }
} }
......
...@@ -77,7 +77,7 @@ public: ...@@ -77,7 +77,7 @@ 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); void set_vml_HF_drawing_link(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;
......
...@@ -104,25 +104,27 @@ void xlsx_table_context::end_table() ...@@ -104,25 +104,27 @@ void xlsx_table_context::end_table()
const std::pair<std::wstring, std::wstring> vmlDrawingName = 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_.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); context_.current_sheet().set_vml_HF_drawing_link(vmlDrawingName.first, vmlDrawingName.second);
}
if (!get_drawing_context().empty_vml())
{
std::wstringstream strm;
get_drawing_context().serialize_vml(strm);
const std::pair<std::wstring, std::wstring> vmlDrawingName =
context_.get_drawing_context_handle().add_drawing_vml(strm.str(), get_drawing_context().get_vml_rels());
context_.current_sheet().set_vml_drawing_link(vmlDrawingName.first, vmlDrawingName.second);
} }
if (!get_comments_context().empty()) if (!get_comments_context().empty())
{ {
std::wstringstream strm; std::wstringstream strm;
get_comments_context().write_comments(strm); get_comments_context().write_comments(strm);
std::wstringstream 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(), 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> vmlDrawingName =
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 (vmlDrawingName.first, vmlDrawingName.second);
} }
} }
......
...@@ -125,6 +125,7 @@ class DirEntry ...@@ -125,6 +125,7 @@ class DirEntry
public: public:
DirEntry(): valid(), name(), dir(), size(), start(), prev(), next(), child() {} DirEntry(): valid(), name(), dir(), size(), start(), prev(), next(), child() {}
bool valid; // false if invalid (should be skipped) bool valid; // false if invalid (should be skipped)
unsigned char prefix;
std::string name; // the name, not in unicode anymore std::string name; // the name, not in unicode anymore
bool dir; // true if directory bool dir; // true if directory
uint64 size; // size (not valid if directory) uint64 size; // size (not valid if directory)
...@@ -805,12 +806,30 @@ DirEntry* DirTree::entry( const std::string& name, bool create, int64 bigBlockSi ...@@ -805,12 +806,30 @@ DirEntry* DirTree::entry( const std::string& name, bool create, int64 bigBlockSi
} }
else else
{ {
// not found among children std::vector<uint64> chi = children( index );
for( unsigned i = 0; i < chi.size(); i++ )
{
DirEntry* ce = entry( chi[i] );
if( ce )
if( ce->valid && ( ce->name.length()>1 ) )
if( ce->name == *it )
{
child = chi[i];
break;
}
}
}
if( child > 0 )
{
index = child;
}
else
{
// not found among children ..wrong header???
if( !create || !io->writeable) if( !create || !io->writeable)
{ {
return (DirEntry*)0; return (DirEntry*)0;
} }
// create a new entry // create a new entry
uint64 parent2 = index; uint64 parent2 = index;
index = unused(); index = unused();
...@@ -937,7 +956,7 @@ void DirTree::load( unsigned char* buffer, uint64 size ) ...@@ -937,7 +956,7 @@ void DirTree::load( unsigned char* buffer, uint64 size )
uint64 p = i * 128; uint64 p = i * 128;
// would be < 32 if first char in the name isn't printable // would be < 32 if first char in the name isn't printable
unsigned prefix = 32; unsigned char prefix = 32;
// parse name of this entry, which stored as Unicode 16-bit // parse name of this entry, which stored as Unicode 16-bit
std::string name; std::string name;
...@@ -949,7 +968,7 @@ void DirTree::load( unsigned char* buffer, uint64 size ) ...@@ -949,7 +968,7 @@ void DirTree::load( unsigned char* buffer, uint64 size )
// first char isn't printable ? remove it... // first char isn't printable ? remove it...
if( buffer[p] < 32 ) if( buffer[p] < 32 )
{ {
prefix = buffer[0]; prefix = name[0];
name.erase( 0,1 ); name.erase( 0,1 );
} }
...@@ -959,6 +978,7 @@ void DirTree::load( unsigned char* buffer, uint64 size ) ...@@ -959,6 +978,7 @@ void DirTree::load( unsigned char* buffer, uint64 size )
DirEntry e; DirEntry e;
e.valid = ( type != 0 ); e.valid = ( type != 0 );
e.name = name; e.name = name;
e.prefix = prefix;
e.start = readU32( buffer + 0x74+p ); e.start = readU32( buffer + 0x74+p );
e.size = readU32( buffer + 0x78+p ); e.size = readU32( buffer + 0x78+p );
e.prev = readU32( buffer + 0x44+p ); e.prev = readU32( buffer + 0x44+p );
...@@ -2225,12 +2245,35 @@ std::list<std::string> Storage::entries( const std::string& path ) ...@@ -2225,12 +2245,35 @@ std::list<std::string> Storage::entries( const std::string& path )
uint64 parent = dt->indexOf( e ); uint64 parent = dt->indexOf( e );
std::vector<uint64> children = dt->children( parent ); std::vector<uint64> children = dt->children( parent );
for( uint64 i = 0; i < children.size(); i++ ) for( uint64 i = 0; i < children.size(); i++ )
{
localResult.push_back( dt->entry( children[i] )->name ); localResult.push_back( dt->entry( children[i] )->name );
} }
}
return localResult; return localResult;
} }
std::list<std::string> Storage::entries_with_prefix( const std::string& path )
{
std::list<std::string> localResult;
DirTree* dt = io->dirtree;
DirEntry* e = dt->entry( path, false );
if( e && e->dir )
{
uint64 parent = dt->indexOf( e );
std::vector<uint64> children = dt->children( parent );
for( uint64 i = 0; i < children.size(); i++ )
{
std::string val;
if (dt->entry( children[i] )->prefix != 32)
val = (char) dt->entry( children[i] )->prefix;
val += dt->entry( children[i] )->name;
localResult.push_back(val);
}
}
return localResult;
}
bool Storage::isDirectory( const std::string& name ) bool Storage::isDirectory( const std::string& name )
{ {
DirEntry* e = io->dirtree->entry( name, false ); DirEntry* e = io->dirtree->entry( name, false );
...@@ -2271,7 +2314,9 @@ void CollectStreams( std::list<std::string>& result, DirTree* tree, DirEntry* pa ...@@ -2271,7 +2314,9 @@ void CollectStreams( std::list<std::string>& result, DirTree* tree, DirEntry* pa
DirEntry* c = tree->entry( parent->child ); DirEntry* c = tree->entry( parent->child );
std::queue<DirEntry*> queue; std::queue<DirEntry*> queue;
if ( c ) queue.push( c ); if ( c ) queue.push( c );
while ( !queue.empty() ) {
while ( !queue.empty() )
{
DirEntry* e = queue.front(); DirEntry* e = queue.front();
queue.pop(); queue.pop();
if ( e->dir ) if ( e->dir )
......
...@@ -124,6 +124,7 @@ public: ...@@ -124,6 +124,7 @@ public:
* Finds all stream and directories in given path. * Finds all stream and directories in given path.
**/ **/
std::list<std::string> entries( const std::string& path = "/" ); std::list<std::string> entries( const std::string& path = "/" );
std::list<std::string> entries_with_prefix( const std::string& path = "/" );
/** /**
* Returns true if specified entry name is a directory. * Returns true if specified entry name is a directory.
......
...@@ -3019,6 +3019,8 @@ namespace BinXlsxRW ...@@ -3019,6 +3019,8 @@ namespace BinXlsxRW
else else
pCellAnchor = new OOX::Spreadsheet::CCellAnchor(eAnchorType); pCellAnchor = new OOX::Spreadsheet::CCellAnchor(eAnchorType);
pCellAnchor->m_bShapeOle= true;
PPTX::Logic::Pic *olePic = new PPTX::Logic::Pic; PPTX::Logic::Pic *olePic = new PPTX::Logic::Pic;
olePic->oleObject.Init(); olePic->oleObject.Init();
......
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