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

XlsFile2 - "простое" описание картинки (новое), гиперлинки с картинок (новое)

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@63902 954022d7-b5bf-4e40-9824-e11837661b57
parent 574951a3
#include "Obj.h" #include "Obj.h"
#include <Logic/Biff_records/MsoDrawing.h> #include <Logic/Biff_records/MsoDrawing.h>
#include <Logic/Biff_structures/ODRAW/OfficeArtDgContainer.h> #include <Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h>
namespace XLS namespace XLS
{; {;
Obj::Obj(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing) Obj::Obj()
{ {
} }
...@@ -171,13 +171,29 @@ void Obj::readFields(CFRecord& record) ...@@ -171,13 +171,29 @@ void Obj::readFields(CFRecord& record)
std::list<CFRecordPtr>& recs = continue_records[rt_Continue]; std::list<CFRecordPtr>& recs = continue_records[rt_Continue];
ODRAW::OfficeArtDgContainer dg(ODRAW::OfficeArtRecord::CA_Sheet); ODRAW::OfficeArtDgContainer dg(ODRAW::OfficeArtRecord::CA_Sheet);
if (recs.size())
{
m_OfficeArtSpContainer = ODRAW::OfficeArtRecordPtr(new ODRAW::OfficeArtSpContainer(ODRAW::OfficeArtRecord::CA_Sheet));
while( !recs.empty() ) while( !recs.empty() )
{ {
//dg.loadFields(*recs.front()); record.appendRawData(recs.front());
mso_drawing_->storeRecordAndDecideProceeding(recs.front());
recs.pop_front(); recs.pop_front();
} }
record >> *m_OfficeArtSpContainer;
BYTE* Add = NULL;
if (record.getRdPtr() < record.getDataSize())
{
int size = record.getDataSize() - record.getRdPtr();
Add = new BYTE [size];
memcpy(Add, record.getData(), size);
record.skipNunBytes(size);
}
if (Add)
{
delete []Add;
}
}
} }
} }
......
...@@ -15,11 +15,17 @@ ...@@ -15,11 +15,17 @@
#include <Logic/Biff_structures/FtLbsData.h> #include <Logic/Biff_structures/FtLbsData.h>
#include <Logic/Biff_structures/FtGboData.h> #include <Logic/Biff_structures/FtGboData.h>
namespace ODRAW
{
class OfficeArtRecord;
typedef boost::shared_ptr<OfficeArtRecord> OfficeArtRecordPtr;
}
namespace XLS namespace XLS
{; {
class MsoDrawing; //class MsoDrawing;
typedef boost::shared_ptr<MsoDrawing> MsoDrawingPtr; //typedef boost::shared_ptr<MsoDrawing> MsoDrawingPtr;
// Logical representation of Obj record in BIFF8 // Logical representation of Obj record in BIFF8
class Obj : public BiffRecordContinued class Obj : public BiffRecordContinued
...@@ -27,7 +33,7 @@ class Obj : public BiffRecordContinued ...@@ -27,7 +33,7 @@ class Obj : public BiffRecordContinued
BIFF_RECORD_DEFINE_TYPE_INFO(Obj) BIFF_RECORD_DEFINE_TYPE_INFO(Obj)
BASE_OBJECT_DEFINE_CLASS_NAME(Obj) BASE_OBJECT_DEFINE_CLASS_NAME(Obj)
public: public:
Obj(MsoDrawingPtr mso_drawing); Obj();
~Obj(); ~Obj();
BaseObjectPtr clone(); BaseObjectPtr clone();
...@@ -37,7 +43,6 @@ public: ...@@ -37,7 +43,6 @@ public:
static const ElementType type = typeObj; static const ElementType type = typeObj;
MsoDrawingPtr mso_drawing_;
//----------------------------- //-----------------------------
FtCmo cmo; FtCmo cmo;
FtCf pictFormat; FtCf pictFormat;
...@@ -54,8 +59,7 @@ public: ...@@ -54,8 +59,7 @@ public:
FtLbsData list; FtLbsData list;
FtGboData gbo; FtGboData gbo;
ODRAW::OfficeArtRecordPtr m_OfficeArtSpContainer;
public:
//BO_ATTRIB_MARKUP_BEGIN //BO_ATTRIB_MARKUP_BEGIN
//BO_ATTRIB_MARKUP_COMPLEX(cmo) //BO_ATTRIB_MARKUP_COMPLEX(cmo)
//if(0x08 == cmo.ot) //if(0x08 == cmo.ot)
......
...@@ -65,6 +65,23 @@ void TxO::readFields(CFRecord& record) ...@@ -65,6 +65,23 @@ void TxO::readFields(CFRecord& record)
TxOruns.load(record); TxOruns.load(record);
///+120 byte ??? ///+120 byte ???
/*BYTE* Add = NULL;*/
int size = 0;
if (record.getRdPtr() < record.getDataSize())
{
//XLUnicodeStringNoCch add;
//record >> add;
size = record.getDataSize() - record.getRdPtr();
//Add = new BYTE [size];
//memcpy(Add, record.getData(), size);
record.skipNunBytes(size);
}
//if (Add)
//{
// delete []Add;
//}
} }
} }
} }
......
...@@ -141,13 +141,13 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record) ...@@ -141,13 +141,13 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
if(record.getRdPtr() != child_beginning_ptr + rh_child.recLen) if(record.getRdPtr() != child_beginning_ptr + rh_child.recLen)
{ {
if(record.getRdPtr() < child_beginning_ptr + rh_child.recLen) if(record.getRdPtr() < child_beginning_ptr + rh_child.recLen - 8)
{ {
Log::warning(STR::int2wstr(child_beginning_ptr + rh_child.recLen - record.getRdPtr(), 10) + Log::warning(STR::int2wstr(child_beginning_ptr + rh_child.recLen - record.getRdPtr(), 10) +
L" unsigned chars were not processed while reading from OfficeArt record of type 0x" + L" unsigned chars were not processed while reading from OfficeArt record of type 0x" +
STR::int2hex_wstr(rh_child.recType, sizeof(rh_child.recType))); STR::int2hex_wstr(rh_child.recType, sizeof(rh_child.recType)));
} }
else else if(record.getRdPtr() > child_beginning_ptr + rh_child.recLen)
{ {
throw;// EXCEPT::RT::WrongBiffRecord("Wrong data parsed in OfficeArt record of type 0x" + throw;// EXCEPT::RT::WrongBiffRecord("Wrong data parsed in OfficeArt record of type 0x" +
//STR::int2hex_wstr(rh_child.recType, sizeof(rh_child.recType)), record.getTypeString()); //STR::int2hex_wstr(rh_child.recType, sizeof(rh_child.recType)), record.getTypeString());
......
...@@ -244,6 +244,9 @@ OfficeArtFOPTEPtr OfficeArtFOPTE::load_and_create(XLS::CFRecord& record) ...@@ -244,6 +244,9 @@ OfficeArtFOPTEPtr OfficeArtFOPTE::load_and_create(XLS::CFRecord& record)
fopte = OfficeArtFOPTEPtr(new ShadowStyleBooleanProperties); fopte = OfficeArtFOPTEPtr(new ShadowStyleBooleanProperties);
break; break;
case 0x0382:
fopte = OfficeArtFOPTEPtr(new pihlShape);
break;
default: default:
fopte = OfficeArtFOPTEPtr(new OfficeArtFOPTE); fopte = OfficeArtFOPTEPtr(new OfficeArtFOPTE);
break; break;
...@@ -486,5 +489,20 @@ void fillShadeColors::ReadComplexData(XLS::CFRecord& record) ...@@ -486,5 +489,20 @@ void fillShadeColors::ReadComplexData(XLS::CFRecord& record)
// own_tag->setAttribute(L"fUsefshadowObscured", fUsefshadowObscured); // own_tag->setAttribute(L"fUsefshadowObscured", fUsefshadowObscured);
// own_tag->setAttribute(L"fUsefShadow", fUsefShadow); // own_tag->setAttribute(L"fUsefShadow", fUsefShadow);
//} //}
XLS::BiffStructurePtr IHlink::clone()
{
return XLS::BiffStructurePtr(new IHlink(*this));
}
void IHlink::load(XLS::CFRecord& record)
{
record >> CLSID_StdHlink;
record >> hyperlink;
}
} // namespace XLS void pihlShape::ReadComplexData(XLS::CFRecord& record)
{
record >> IHlink_complex;
}
}
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "IMsoArray.h" #include "IMsoArray.h"
#include "MSOSHADECOLOR.h" #include "MSOSHADECOLOR.h"
#include "MSO_enums.h" #include "MSO_enums.h"
#include <Logic/Biff_structures/HyperlinkObject.h>
namespace XLS namespace XLS
{ {
...@@ -61,7 +62,6 @@ class TextBooleanProperties : public OfficeArtFOPTE ...@@ -61,7 +62,6 @@ class TextBooleanProperties : public OfficeArtFOPTE
BASE_STRUCTURE_DEFINE_CLASS_NAME(TextBooleanProperties) BASE_STRUCTURE_DEFINE_CLASS_NAME(TextBooleanProperties)
public: public:
//virtual void setXMLAttributes(MSXML2::IXMLDOMElementPtr own_tag);
}; };
...@@ -384,7 +384,7 @@ class fillShadeColors : public OfficeArtFOPTE ...@@ -384,7 +384,7 @@ class fillShadeColors : public OfficeArtFOPTE
public: public:
//virtual void setXMLAttributes(MSXML2::IXMLDOMElementPtr own_tag); //virtual void setXMLAttributes(MSXML2::IXMLDOMElementPtr own_tag);
virtual void ReadComplexData(XLS::CFRecord& record); virtual void ReadComplexData(XLS::CFRecord& record);
private:
IMsoArray<MSOSHADECOLOR> fillShadeColors_complex; IMsoArray<MSOSHADECOLOR> fillShadeColors_complex;
}; };
...@@ -572,6 +572,35 @@ public: ...@@ -572,6 +572,35 @@ public:
//} //}
}; };
class IHlink;
typedef boost::shared_ptr<IHlink> IHlinkPtr;
class IHlink : public XLS::BiffStructure
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(IHlink)
public:
IHlink(){}
XLS::BiffStructurePtr clone();
void load(XLS::CFRecord& record);
void store(XLS::CFRecord& record){}
static const XLS::ElementType type = XLS::typeIHLink;
_GUID_ CLSID_StdHlink;
OSHARED::HyperlinkObject hyperlink;
};
class pihlShape : public OfficeArtFOPTE
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(pihlShape)
public:
virtual void ReadComplexData(XLS::CFRecord& record);
IHlink IHlink_complex;
};
} // namespace XLS }
...@@ -6,6 +6,10 @@ ...@@ -6,6 +6,10 @@
namespace ODRAW namespace ODRAW
{; {;
OfficeArtRecordHeader::OfficeArtRecordHeader()
{
recVer = recInstance = recType = recLen = 0;
}
XLS::BiffStructurePtr OfficeArtRecordHeader::clone() XLS::BiffStructurePtr OfficeArtRecordHeader::clone()
{ {
......
...@@ -15,6 +15,7 @@ class OfficeArtRecordHeader : public XLS::BiffStructure ...@@ -15,6 +15,7 @@ class OfficeArtRecordHeader : public XLS::BiffStructure
{ {
BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtRecordHeader) BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtRecordHeader)
public: public:
OfficeArtRecordHeader();
XLS::BiffStructurePtr clone(); XLS::BiffStructurePtr clone();
virtual void load(XLS::CFRecord& record); virtual void load(XLS::CFRecord& record);
......
...@@ -20,15 +20,6 @@ TxORuns::~TxORuns() ...@@ -20,15 +20,6 @@ TxORuns::~TxORuns()
{ {
} }
//void TxORuns::setXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// std::for_each(rgTxoRuns.begin(), rgTxoRuns.end(), boost::bind(&Run::toXML, _1, xml_tag));
// lastRun.toXML(xml_tag);
//}
//
//void TxORuns::getXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
//}
void TxORuns::store(CFRecord& record) void TxORuns::store(CFRecord& record)
{ {
......
...@@ -2,13 +2,12 @@ ...@@ -2,13 +2,12 @@
#include "OBJ.h" #include "OBJ.h"
#include <Logic/Biff_records/Obj.h> #include <Logic/Biff_records/Obj.h>
#include <Logic/Biff_records/Continue.h> #include <Logic/Biff_records/Continue.h>
#include <Logic/Biff_records/MsoDrawing.h>
namespace XLS namespace XLS
{; {;
OBJ::OBJ(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing) OBJ::OBJ()
{ {
} }
...@@ -27,8 +26,7 @@ BaseObjectPtr OBJ::clone() ...@@ -27,8 +26,7 @@ BaseObjectPtr OBJ::clone()
// OBJ = Obj *Continue // OBJ = Obj *Continue
const bool OBJ::loadContent(BinProcessor& proc) const bool OBJ::loadContent(BinProcessor& proc)
{ {
Obj Obj_(mso_drawing_); if(!proc.mandatory<Obj>())
if(!proc.mandatory(Obj_))
{ {
return false; return false;
} }
......
...@@ -5,15 +5,13 @@ ...@@ -5,15 +5,13 @@
namespace XLS namespace XLS
{; {;
class MsoDrawing;
typedef boost::shared_ptr<MsoDrawing> MsoDrawingPtr;
// Logical representation of OBJ union of records // Logical representation of OBJ union of records
class OBJ: public CompositeObject class OBJ: public CompositeObject
{ {
BASE_OBJECT_DEFINE_CLASS_NAME(OBJ) BASE_OBJECT_DEFINE_CLASS_NAME(OBJ)
public: public:
OBJ(MsoDrawingPtr mso_drawing); OBJ();
~OBJ(); ~OBJ();
BaseObjectPtr clone(); BaseObjectPtr clone();
...@@ -21,11 +19,8 @@ public: ...@@ -21,11 +19,8 @@ public:
virtual const bool loadContent(BinProcessor& proc); virtual const bool loadContent(BinProcessor& proc);
BaseObjectPtr m_Obj; BaseObjectPtr m_Obj;
MsoDrawingPtr m_MsoDrawing;
static const ElementType type = typeOBJ; static const ElementType type = typeOBJ;
MsoDrawingPtr mso_drawing_;
}; };
} // namespace XLS } // namespace XLS
......
...@@ -26,10 +26,6 @@ class Parenthesis_OBJECTS_2: public ABNFParenthesis ...@@ -26,10 +26,6 @@ class Parenthesis_OBJECTS_2: public ABNFParenthesis
{ {
BASE_OBJECT_DEFINE_CLASS_NAME(Parenthesis_OBJECTS_2) BASE_OBJECT_DEFINE_CLASS_NAME(Parenthesis_OBJECTS_2)
public: public:
Parenthesis_OBJECTS_2(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing)
{
}
BaseObjectPtr clone() BaseObjectPtr clone()
{ {
return BaseObjectPtr(new Parenthesis_OBJECTS_2(*this)); return BaseObjectPtr(new Parenthesis_OBJECTS_2(*this));
...@@ -37,14 +33,12 @@ public: ...@@ -37,14 +33,12 @@ public:
const bool loadContent(BinProcessor& proc) const bool loadContent(BinProcessor& proc)
{ {
OBJ OBJ_(mso_drawing_);
bool res = proc.optional<TEXTOBJECT>() || bool res = proc.optional<TEXTOBJECT>() ||
proc.optional(OBJ_)|| proc.optional<OBJ>() ||
proc.optional<CHART>(); proc.optional<CHART>();
return res; return res;
}; };
MsoDrawingPtr mso_drawing_;
}; };
...@@ -53,13 +47,13 @@ class Parenthesis_OBJECTS_1: public ABNFParenthesis ...@@ -53,13 +47,13 @@ class Parenthesis_OBJECTS_1: public ABNFParenthesis
BASE_OBJECT_DEFINE_CLASS_NAME(Parenthesis_OBJECTS_1) BASE_OBJECT_DEFINE_CLASS_NAME(Parenthesis_OBJECTS_1)
public: public:
Parenthesis_OBJECTS_1(MsoDrawingPtr mso_drawing,MsoDrawingPtr mso_drawing2) : mso_drawing_(mso_drawing), mso_drawing2_(mso_drawing2) Parenthesis_OBJECTS_1(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing)
{ {
} }
BaseObjectPtr clone() BaseObjectPtr clone()
{ {
return BaseObjectPtr(new Parenthesis_OBJECTS_1(mso_drawing_, mso_drawing2_)); return BaseObjectPtr(new Parenthesis_OBJECTS_1(mso_drawing_));
} }
const bool loadContent(BinProcessor& proc) const bool loadContent(BinProcessor& proc)
...@@ -74,13 +68,12 @@ public: ...@@ -74,13 +68,12 @@ public:
{ {
return false; return false;
} }
int count1 = proc.repeated(Parenthesis_OBJECTS_2(mso_drawing2_), 0, 0); proc.repeated(Parenthesis_OBJECTS_2(), 0, 0);
proc.repeated<Continue>(0,0);
return true; return true;
} }
MsoDrawingPtr mso_drawing_; MsoDrawingPtr mso_drawing_;
MsoDrawingPtr mso_drawing2_;
}; };
...@@ -101,21 +94,8 @@ const bool OBJECTS::loadContent(BinProcessor& proc) ...@@ -101,21 +94,8 @@ const bool OBJECTS::loadContent(BinProcessor& proc)
const bool OBJECTS::loadContentRead(BinReaderProcessor& proc) const bool OBJECTS::loadContentRead(BinReaderProcessor& proc)
{ {
m_MsoDrawing = boost::shared_ptr<MsoDrawing>(new MsoDrawing(is_inside_chart_sheet_)); m_MsoDrawing = boost::shared_ptr<MsoDrawing>(new MsoDrawing(is_inside_chart_sheet_));
m_MsoDrawingObjects = boost::shared_ptr<MsoDrawing>(new MsoDrawing(is_inside_chart_sheet_));
int count1 = proc.repeated(Parenthesis_OBJECTS_1(m_MsoDrawing, m_MsoDrawingObjects), 0, 0);
if (m_MsoDrawing->isReading == false) int count1 = proc.repeated(Parenthesis_OBJECTS_1(m_MsoDrawing), 0, 0);
{
try
{
m_MsoDrawingObjects->readFields();
m_MsoDrawing = m_MsoDrawingObjects;
}
catch(...)
{
}
}
int i = 0 ; int i = 0 ;
for(std::list<BaseObjectPtr>::iterator it = elements_.begin(); it != elements_.end() ; it++) for(std::list<BaseObjectPtr>::iterator it = elements_.begin(); it != elements_.end() ; it++)
......
...@@ -147,6 +147,7 @@ enum ElementType ...@@ -147,6 +147,7 @@ enum ElementType
typeHFPicture, typeHFPicture,
typeHideObj, typeHideObj,
typeHLink, typeHLink,
typeIHLink,
typeHLinkTooltip, typeHLinkTooltip,
typeHorizontalPageBreaks, typeHorizontalPageBreaks,
typeIFmtRecord, typeIFmtRecord,
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <Logic/Biff_structures/ODRAW/OfficeArtBStoreContainer.h> #include <Logic/Biff_structures/ODRAW/OfficeArtBStoreContainer.h>
#include <Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h> #include <Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h>
#include <Logic/Biff_structures/ODRAW/OfficeArtFOPT.h> #include <Logic/Biff_structures/ODRAW/OfficeArtFOPT.h>
#include <Logic/Biff_structures/ODRAW/OfficeArtFOPTE.h>
#include <Logic/Biff_structures/ODRAW/OfficeArtFSP.h> #include <Logic/Biff_structures/ODRAW/OfficeArtFSP.h>
#include <Logic/Biff_structures/ODRAW/OfficeArtBlip.h> #include <Logic/Biff_structures/ODRAW/OfficeArtBlip.h>
...@@ -443,24 +444,25 @@ void XlsConverter::convert(XLS::OBJECTS* objects) ...@@ -443,24 +444,25 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
ODRAW::OfficeArtSpgrContainer *spgr = dynamic_cast<ODRAW::OfficeArtSpgrContainer*>(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpgrContainer.get()); ODRAW::OfficeArtSpgrContainer *spgr = dynamic_cast<ODRAW::OfficeArtSpgrContainer*>(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpgrContainer.get());
//ODRAW::OfficeArtSpContainer *sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.get()); //ODRAW::OfficeArtSpContainer *sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.get());
if (spgr == NULL && objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.size() < 1) return; //if (spgr == NULL/* && objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.size() < 1*/) return;
for (long i = 0 ; i < objects->m_OBJs.size(); i++) for (long i = 0 ; i < objects->m_OBJs.size(); i++)
{ {
int ind = objects->m_OBJs[i].second; int ind = objects->m_OBJs[i].second;
XLS::OBJ* OBJ = dynamic_cast<XLS::OBJ*>(objects->m_OBJs[i].first.get());
XLS::Obj *obj = dynamic_cast<XLS::Obj*>(OBJ->m_Obj.get());
ODRAW::OfficeArtSpContainer *sp = NULL; ODRAW::OfficeArtSpContainer *sp = NULL;
if ( (spgr) && (ind < spgr->child_records.size()))
if (obj->m_OfficeArtSpContainer)
{ {
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get()); sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(obj->m_OfficeArtSpContainer.get());
} }
else if (ind < objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.size()) else if ( (spgr) && (ind < spgr->child_records.size()))
{ {
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer[ind].get()); sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
} }
XLS::OBJ* OBJ = dynamic_cast<XLS::OBJ*>(objects->m_OBJs[i].first.get());
XLS::Obj *obj = dynamic_cast<XLS::Obj*>(OBJ->m_Obj.get());
if (xlsx_context->get_drawing_context().start_drawing(obj->cmo.ot)) if (xlsx_context->get_drawing_context().start_drawing(obj->cmo.ot))
{ {
...@@ -539,8 +541,16 @@ void XlsConverter::convert(ODRAW::OfficeArtFOPT * fort) ...@@ -539,8 +541,16 @@ void XlsConverter::convert(ODRAW::OfficeArtFOPT * fort)
std::wstring rId = xlsx_context->get_mediaitems().find_image(fort->fopt.rgfopte[i]->op , target, isIternal); std::wstring rId = xlsx_context->get_mediaitems().find_image(fort->fopt.rgfopte[i]->op , target, isIternal);
xlsx_context->get_drawing_context().set_image(target); xlsx_context->get_drawing_context().set_image(target);
}break; }break;
case 0x0382:
{
ODRAW::pihlShape *pihlShape = dynamic_cast<ODRAW::pihlShape*>(fort->fopt.rgfopte[i].get());
if (pihlShape)
{
std::wstring target = GetTargetMoniker(pihlShape->IHlink_complex.hyperlink.oleMoniker.data.get());
xlsx_context->get_drawing_context().set_hyperlink(target);
}
}break;
} }
} }
} }
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include "xlsx_drawing_context.h" #include "xlsx_drawing_context.h"
#include <simple_xml_writer.h> #include <simple_xml_writer.h>
#include <utils.h>
namespace oox { namespace oox {
...@@ -150,6 +150,7 @@ void xlsx_drawing_context::set_shape_id(int id) ...@@ -150,6 +150,7 @@ void xlsx_drawing_context::set_shape_id(int id)
if (drawing_state.size() < 1 )return; if (drawing_state.size() < 1 )return;
drawing_state.back().shape_id = id; drawing_state.back().shape_id = id;
} }
void xlsx_drawing_context::end_drawing() void xlsx_drawing_context::end_drawing()
{ {
if (drawing_state.size() < 1 )return; if (drawing_state.size() < 1 )return;
...@@ -188,6 +189,17 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId) ...@@ -188,6 +189,17 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId)
{ {
if (drawing_state.back().id >= 0) CP_XML_ATTR(L"id", drawing_state.back().id); if (drawing_state.back().id >= 0) CP_XML_ATTR(L"id", drawing_state.back().id);
CP_XML_ATTR(L"name", L"Picture_" + rId.substr(5)); CP_XML_ATTR(L"name", L"Picture_" + rId.substr(5));
if (!drawing_state.back().hyperlink.empty())
{
CP_XML_NODE(L"a:hlinkClick")
{
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
//CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main");
CP_XML_ATTR(L"r:id", drawing_state.back().hyperlink);
}
}
} }
CP_XML_NODE(L"xdr:cNvPicPr") CP_XML_NODE(L"xdr:cNvPicPr")
{ {
...@@ -266,6 +278,23 @@ void xlsx_drawing_context::set_image(std::wstring & str) ...@@ -266,6 +278,23 @@ void xlsx_drawing_context::set_image(std::wstring & str)
if (drawing_state.size() < 1 )return; if (drawing_state.size() < 1 )return;
drawing_state.back().image_target = str; drawing_state.back().image_target = str;
} }
void xlsx_drawing_context::set_hyperlink(std::wstring & str)
{
if (drawing_state.size() < 1 )return;
std::wstring hId=std::wstring(L"hId") + boost::lexical_cast<std::wstring>(hlinks_.size()+1);
std::wstring href_correct = xml::utils::replace_text_to_xml(str);
_hlink_desc desc = {hId, href_correct};
hlinks_.push_back(desc);
drawing_state.back().hyperlink = hId;
xlsx_drawings_->add( false, hId , href_correct, external_items::typeHyperlink);
}
void xlsx_drawing_context::set_properties(std::wstring & str) void xlsx_drawing_context::set_properties(std::wstring & str)
{ {
if (drawing_state.size() < 1 )return; if (drawing_state.size() < 1 )return;
......
...@@ -39,9 +39,15 @@ public: ...@@ -39,9 +39,15 @@ public:
int shape_id; int shape_id;
bool flipV; bool flipV;
bool flipH; bool flipH;
std::wstring hyperlink;
bool isInternal; bool isInternal;
}; };
struct _hlink_desc
{
std::wstring hId;
std::wstring hRef;
};
class xlsx_drawing_context class xlsx_drawing_context
{ {
...@@ -67,6 +73,7 @@ public: ...@@ -67,6 +73,7 @@ public:
void set_image(std::wstring & str); void set_image(std::wstring & str);
void set_anchor(std::wstring & str); void set_anchor(std::wstring & str);
void set_properties(std::wstring & str); void set_properties(std::wstring & str);
void set_hyperlink(std::wstring & str);
void serialize(std::wostream & stream); void serialize(std::wostream & stream);
...@@ -79,6 +86,8 @@ private: ...@@ -79,6 +86,8 @@ private:
xlsx_drawing_context_handle & handle_; xlsx_drawing_context_handle & handle_;
xlsx_drawings_ptr xlsx_drawings_; xlsx_drawings_ptr xlsx_drawings_;
int count_object; int count_object;
std::vector<_hlink_desc> hlinks_;
}; };
} }
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