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

XlsFile2 автофигуры (новое)

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@63983 954022d7-b5bf-4e40-9824-e11837661b57
parent 9bdb33e2
...@@ -30,9 +30,21 @@ void ShapePropsStream::writeFields(CFRecord& record) ...@@ -30,9 +30,21 @@ void ShapePropsStream::writeFields(CFRecord& record)
void ShapePropsStream::readFields(CFRecord& record) void ShapePropsStream::readFields(CFRecord& record)
{ {
#pragma message("####################### ShapePropsStream record is not implemented") record >> frtHeader;
Log::error("ShapePropsStream record is not implemented."); record >> wObjContext;
//record >> some_value;
record.skipNunBytes(2);
record >> dwChecksum;
unsigned int cb=0;
record >> cb;
if (cb > 0)
{
xml_ = std::string( record.getCurData<char>(), cb);
record.skipNunBytes(cb);
}
} }
} // namespace XLS } // namespace XLS
......
#pragma once #pragma once
#include <Logic/Biff_structures/FrtHeader.h>
#include "BiffRecord.h" #include "BiffRecord.h"
namespace XLS namespace XLS
...@@ -22,12 +23,12 @@ public: ...@@ -22,12 +23,12 @@ public:
static const ElementType type = typeShapePropsStream; static const ElementType type = typeShapePropsStream;
//----------------------------- FrtHeader frtHeader;
// BIFF_WORD userName; unsigned short wObjContext;
public: unsigned int dwChecksum;
//BO_ATTRIB_MARKUP_BEGIN
// //BO_ATTRIB_MARKUP_ATTRIB(userName) std::string xml_;
//BO_ATTRIB_MARKUP_END
}; };
......
...@@ -30,9 +30,17 @@ void TextPropsStream::writeFields(CFRecord& record) ...@@ -30,9 +30,17 @@ void TextPropsStream::writeFields(CFRecord& record)
void TextPropsStream::readFields(CFRecord& record) void TextPropsStream::readFields(CFRecord& record)
{ {
#pragma message("####################### TextPropsStream record is not implemented") record >> frtHeader;
Log::error("TextPropsStream record is not implemented."); record >> dwChecksum;
//record >> some_value;
unsigned int cb=0;
record >> cb;
if (cb > 0)
{
xml_ = std::string( record.getCurData<char>(), cb);
record.skipNunBytes(cb);
}
} }
} // namespace XLS } // namespace XLS
......
#pragma once #pragma once
#include <Logic/Biff_structures/FrtHeader.h>
#include "BiffRecord.h" #include "BiffRecord.h"
namespace XLS namespace XLS
...@@ -22,10 +23,10 @@ public: ...@@ -22,10 +23,10 @@ public:
static const ElementType type = typeTextPropsStream; static const ElementType type = typeTextPropsStream;
//----------------------------- FrtHeader frtHeader;
// BIFF_WORD userName; unsigned int dwChecksum;
std::string xml_;
}; };
} // namespace XLS } // namespace XLS
......
...@@ -21,22 +21,6 @@ BiffStructurePtr FrtHeader::clone() ...@@ -21,22 +21,6 @@ BiffStructurePtr FrtHeader::clone()
return BiffStructurePtr(new FrtHeader(*this)); return BiffStructurePtr(new FrtHeader(*this));
} }
//void FrtHeader::setXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// xml_tag->setAttribute(L"rt", rt);
// xml_tag->setAttribute(L"rt_name", CFRecordType::getStringById(rt).c_str());
// xml_tag->setAttribute(L"fFrtRef", grbitFrt.fFrtRef);
// xml_tag->setAttribute(L"fFrtAlert", grbitFrt.fFrtAlert);
//}
//
//
//void FrtHeader::getXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// throw;// EXCEPT::LE::WrongAPIUsage("FrtHeader must not get data from XML.", __FUNCTION__);
//}
void FrtHeader::store(CFRecord& record) void FrtHeader::store(CFRecord& record)
{ {
record << rt << grbitFrt; record << rt << grbitFrt;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#include "BiffStructure.h" #include "BiffStructure.h"
#include <Binary/CFRecordType.h> #include <Binary/CFRecordType.h>
#include <Logic/Biff_structures/BitMarkedStructs.h> #include "BitMarkedStructs.h"
namespace XLS namespace XLS
{; {;
......
...@@ -109,6 +109,10 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record) ...@@ -109,6 +109,10 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
art_record = OfficeArtRecordPtr(new OfficeArtClientData); art_record = OfficeArtRecordPtr(new OfficeArtClientData);
break; break;
case FConnectorRule:
art_record = OfficeArtRecordPtr(new OfficeArtFConnectorRule);
break;
case ClientTextbox: case ClientTextbox:
art_record = OfficeArtRecordPtr(new OfficeArtClientTextbox); art_record = OfficeArtRecordPtr(new OfficeArtClientTextbox);
break; break;
...@@ -125,12 +129,10 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record) ...@@ -125,12 +129,10 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
art_record = OfficeArtRecordPtr(new OfficeArtSplitMenuColorContainer); art_record = OfficeArtRecordPtr(new OfficeArtSplitMenuColorContainer);
break; break;
case BStoreContainer: case BStoreContainer:
//Log::event("OfficeArtBStoreContainer record found. OfficeArtBStoreContainerFileBlock records count = " + STR::int2str(rh_child.recInstance) +
// ". RecLen = " + STR::int2str(rh_child.recLen));
art_record = OfficeArtRecordPtr(new OfficeArtBStoreContainer); art_record = OfficeArtRecordPtr(new OfficeArtBStoreContainer);
break; break;
case TertiaryFOPT: case TertiaryFOPT:
//art_record = OfficeArtRecordPtr(new OfficeArtTertiaryFOPT); art_record = OfficeArtRecordPtr(new OfficeArtTertiaryFOPT);
break; break;
} }
......
...@@ -206,12 +206,19 @@ OfficeArtFOPTEPtr OfficeArtFOPTE::load_and_create(XLS::CFRecord& record) ...@@ -206,12 +206,19 @@ OfficeArtFOPTEPtr OfficeArtFOPTE::load_and_create(XLS::CFRecord& record)
case 0x01CE: case 0x01CE:
fopte = OfficeArtFOPTEPtr(new lineDashing); fopte = OfficeArtFOPTEPtr(new lineDashing);
break; break;
/*todo*/case 0x1D0: //lineStartArrowhead
/*todo*/case 0x1D1: //lineEndArrowhead
fopte = OfficeArtFOPTEPtr(new OfficeArtFOPTE);
break;
case 0x01FF: case 0x01FF:
fopte = OfficeArtFOPTEPtr(new LineStyleBooleanProperties); fopte = OfficeArtFOPTEPtr(new LineStyleBooleanProperties);
break; break;
case 0x023F: case 0x023F:
fopte = OfficeArtFOPTEPtr(new ShadowStyleBooleanProperties); fopte = OfficeArtFOPTEPtr(new ShadowStyleBooleanProperties);
break; break;
/*todo*/case 0x0303: //cxstyle
fopte = OfficeArtFOPTEPtr(new OfficeArtFOPTE);
break;
case 0x033F: case 0x033F:
fopte = OfficeArtFOPTEPtr(new ShapeBooleanProperties); fopte = OfficeArtFOPTEPtr(new ShapeBooleanProperties);
break; break;
......
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
namespace ODRAW namespace ODRAW
{; {;
void OfficeArtFConnectorRule::loadFields(XLS::CFRecord& record)
{
record >> ruid >> spidA >> spidB >> spidC >> cptiA >> cptiB;
}
void OfficeArtDggContainer::loadFields(XLS::CFRecord& record) void OfficeArtDggContainer::loadFields(XLS::CFRecord& record)
{ {
......
...@@ -55,6 +55,26 @@ public: ...@@ -55,6 +55,26 @@ public:
}; };
class OfficeArtFConnectorRule : public OfficeArtRecord
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtFConnectorRule)
public:
OfficeArtFConnectorRule() : OfficeArtRecord(0, FConnectorRule) {}
XLS::BiffStructurePtr clone() { return XLS::BiffStructurePtr(new OfficeArtFConnectorRule(*this)); }
virtual void loadFields(XLS::CFRecord& record);
virtual void storeFields(XLS::CFRecord& record) {}
static const XLS::ElementType type = XLS::typeOfficeArtClientData;//FConnectorRule
unsigned int ruid;
unsigned int spidA;
unsigned int spidB;
unsigned int spidC;
unsigned int cptiA;
unsigned int cptiB;
};
class OfficeArtClientTextbox : public OfficeArtRecord class OfficeArtClientTextbox : public OfficeArtRecord
{ {
BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtClientTextbox) BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtClientTextbox)
......
...@@ -97,6 +97,9 @@ const bool OBJECTS::loadContentRead(BinReaderProcessor& proc) ...@@ -97,6 +97,9 @@ const bool OBJECTS::loadContentRead(BinReaderProcessor& proc)
int count1 = proc.repeated(Parenthesis_OBJECTS_1(m_MsoDrawing), 0, 0); int count1 = proc.repeated(Parenthesis_OBJECTS_1(m_MsoDrawing), 0, 0);
proc.repeated(Parenthesis_OBJECTS_2(), 0, 0);
proc.repeated<Continue>(0,0);
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++)
{ {
......
...@@ -486,6 +486,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects) ...@@ -486,6 +486,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
{ {
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get()); sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
} }
else continue;
if (xlsx_context->get_drawing_context().start_drawing(obj->cmo.ot)) if (xlsx_context->get_drawing_context().start_drawing(obj->cmo.ot))
......
...@@ -84,6 +84,7 @@ bool xlsx_drawing_context::start_drawing(int type) ...@@ -84,6 +84,7 @@ bool xlsx_drawing_context::start_drawing(int type)
case 0x0002: // Rectangle case 0x0002: // Rectangle
case 0x0003: // Oval case 0x0003: // Oval
case 0x0004: // Arc case 0x0004: // Arc
//case 0x0009: // Polygon:
start_shape(type); return true; start_shape(type); return true;
case 0x0005: // Chart case 0x0005: // Chart
case 0x0006: // Text case 0x0006: // Text
...@@ -91,7 +92,6 @@ bool xlsx_drawing_context::start_drawing(int type) ...@@ -91,7 +92,6 @@ bool xlsx_drawing_context::start_drawing(int type)
break; break;
case 0x0008: // Picture case 0x0008: // Picture
start_image(); return true; start_image(); return true;
case 0x0009: // Polygon:
case 0x000B: // Checkbox case 0x000B: // Checkbox
case 0x000C: // Radio button case 0x000C: // Radio button
case 0x000D: // Edit box case 0x000D: // Edit box
...@@ -126,6 +126,7 @@ void xlsx_drawing_context::start_shape(int type) ...@@ -126,6 +126,7 @@ void xlsx_drawing_context::start_shape(int type)
drawing_state.push_back(st); drawing_state.push_back(st);
drawing_state.back().type = external_items::typeShape; drawing_state.back().type = external_items::typeShape;
drawing_state.back().shape_type = type;
count_object++; count_object++;
} }
...@@ -169,26 +170,50 @@ void xlsx_drawing_context::end_drawing() ...@@ -169,26 +170,50 @@ void xlsx_drawing_context::end_drawing()
serialize(strm); serialize(strm);
xlsx_drawings_->add(strm.str(), isIternal, rId , drawing_state.back().image_target, drawing_state.back().type); xlsx_drawings_->add(strm.str(), isIternal, rId , drawing_state.back().image_target, drawing_state.back().type);
} }
else
{
serialize_shape();
serialize(strm);
xlsx_drawings_->add(strm.str(), true, L"" , L"", drawing_state.back().type);
}
break; break;
case external_items::typeShape:
{
serialize_shape();
serialize(strm);
xlsx_drawings_->add(strm.str(), true, L"" , L"", drawing_state.back().type);
}break;
} }
drawing_state.pop_back(); drawing_state.pop_back();
} }
void xlsx_drawing_context::serialize_pic(std::wstring rId) void xlsx_drawing_context::serialize_shape()
{ {
std::wstringstream strm; std::wstringstream strm;
std::wstring prstGeom;
switch(drawing_state.back().shape_type)
{
case 1: prstGeom = L"line"; break;
case 2: prstGeom = L"rect"; break;
case 3: prstGeom = L"ellipse"; break;
case 4: prstGeom = L"arc"; break;
case 9: prstGeom = L"polygon"; break;
default: prstGeom = L"custom"; break;
}
CP_XML_WRITER(strm) CP_XML_WRITER(strm)
{ {
CP_XML_NODE(L"xdr:pic") CP_XML_NODE(L"xdr:sp")
{ {
CP_XML_NODE(L"xdr:nvPicPr") CP_XML_NODE(L"xdr:nvSpPr")
{ {
CP_XML_NODE(L"xdr:cNvPr") CP_XML_NODE(L"xdr:cNvPr")
{ {
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);
if (drawing_state.back().name.empty()) drawing_state.back().name = L"Picture_" + rId.substr(5); if (drawing_state.back().name.empty()) drawing_state.back().name = L"Shape_" + count_object;
CP_XML_ATTR(L"name", drawing_state.back().name); CP_XML_ATTR(L"name", drawing_state.back().name);
if (!drawing_state.back().description.empty()) if (!drawing_state.back().description.empty())
...@@ -201,21 +226,84 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId) ...@@ -201,21 +226,84 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId)
CP_XML_NODE(L"a:hlinkClick") 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: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_ATTR(L"r:id", drawing_state.back().hyperlink);
} }
} }
} }
CP_XML_NODE(L"xdr:cNvPicPr") CP_XML_NODE(L"xdr:cNvSpPr");
}
CP_XML_NODE(L"xdr:spPr")
{ {
CP_XML_NODE(L"a:picLocks") CP_XML_NODE(L"a:xfrm")
{ {
CP_XML_ATTR(L"noChangeAspect", 1); CP_XML_NODE(L"a:off")
{
CP_XML_ATTR(L"y", 0);
CP_XML_ATTR(L"x", 0);
}
CP_XML_NODE(L"a:ext")
{
CP_XML_ATTR(L"cy", 0);
CP_XML_ATTR(L"cx", 0);
}
}
CP_XML_NODE(L"a:prstGeom")
{
CP_XML_ATTR(L"prst", prstGeom);
CP_XML_NODE(L"a:avLst");
}
serialize_fill(CP_XML_STREAM());
CP_XML_NODE(L"a:ln")
{
CP_XML_NODE(L"a:solidFill")
{
CP_XML_NODE(L"a:srgbClr")
{
CP_XML_ATTR(L"val", "000000");
}
} }
} }
} }
CP_XML_NODE(L"xdr:blipFill") }
}
drawing_state.back().shape = strm.str();
}
void xlsx_drawing_context::serialize_fill(std::wostream & stream)
{
if (!drawing_state.back().image_target.empty())
{
bool isIternal = false;
std::wstring rId = handle_.impl_->get_mediaitems().find_image( drawing_state.back().image_target, isIternal);
if (!rId.empty())
{
xlsx_drawings_->add(L"", isIternal, rId , drawing_state.back().image_target, drawing_state.back().type);
serialize_bitmap_fill(stream, rId);
}else
serialize_none_fill(stream);
}
else
serialize_none_fill(stream);
}
void xlsx_drawing_context::serialize_none_fill(std::wostream & stream)
{
CP_XML_WRITER(stream)
{
CP_XML_NODE(L"a:noFill");
}
}
void xlsx_drawing_context::serialize_bitmap_fill(std::wostream & stream, std::wstring rId, const std::wstring ns)
{
CP_XML_WRITER(stream)
{
CP_XML_NODE(ns + L"blipFill")
{ {
CP_XML_NODE(L"a:blip") CP_XML_NODE(L"a:blip")
{ {
...@@ -238,6 +326,51 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId) ...@@ -238,6 +326,51 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId)
CP_XML_NODE(L"a:fillRect"); CP_XML_NODE(L"a:fillRect");
} }
} }
}
}
void xlsx_drawing_context::serialize_pic(std::wstring rId)
{
std::wstringstream strm;
CP_XML_WRITER(strm)
{
CP_XML_NODE(L"xdr:pic")
{
CP_XML_NODE(L"xdr:nvPicPr")
{
CP_XML_NODE(L"xdr:cNvPr")
{
if (drawing_state.back().id >= 0) CP_XML_ATTR(L"id", drawing_state.back().id);
if (drawing_state.back().name.empty()) drawing_state.back().name = L"Picture_" + rId.substr(5);
CP_XML_ATTR(L"name", drawing_state.back().name);
if (!drawing_state.back().description.empty())
{
CP_XML_ATTR(L"descr", drawing_state.back().description);
}
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"a:picLocks")
{
CP_XML_ATTR(L"noChangeAspect", 1);
}
}
}
serialize_bitmap_fill(CP_XML_STREAM(), rId, L"xdr:");
CP_XML_NODE(L"xdr:spPr") CP_XML_NODE(L"xdr:spPr")
{ {
CP_XML_NODE(L"a:xfrm") CP_XML_NODE(L"a:xfrm")
...@@ -266,6 +399,7 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId) ...@@ -266,6 +399,7 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId)
drawing_state.back().shape = strm.str(); drawing_state.back().shape = strm.str();
} }
void xlsx_drawing_context::serialize(std::wostream & stream) void xlsx_drawing_context::serialize(std::wostream & stream)
{ {
CP_XML_WRITER(stream) CP_XML_WRITER(stream)
......
...@@ -34,6 +34,7 @@ public: ...@@ -34,6 +34,7 @@ public:
memset(image_crop, 0, 4 * sizeof(int)); memset(image_crop, 0, 4 * sizeof(int));
} }
int shape_type;
external_items::Type type; external_items::Type type;
std::wstring name; std::wstring name;
std::wstring description; std::wstring description;
...@@ -94,6 +95,12 @@ public: ...@@ -94,6 +95,12 @@ public:
void serialize(std::wostream & stream); void serialize(std::wostream & stream);
void serialize_pic(std::wstring rId); void serialize_pic(std::wstring rId);
void serialize_shape();
void serialize_fill (std::wostream & stream);
void serialize_bitmap_fill (std::wostream & stream, std::wstring rId, const std::wstring ns = L"a:");
void serialize_none_fill (std::wostream & stream);
void end_drawing(); void end_drawing();
private: private:
......
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