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)
void ShapePropsStream::readFields(CFRecord& record)
{
#pragma message("####################### ShapePropsStream record is not implemented")
Log::error("ShapePropsStream record is not implemented.");
//record >> some_value;
record >> frtHeader;
record >> wObjContext;
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
......
#pragma once
#include <Logic/Biff_structures/FrtHeader.h>
#include "BiffRecord.h"
namespace XLS
......@@ -22,12 +23,12 @@ public:
static const ElementType type = typeShapePropsStream;
//-----------------------------
// BIFF_WORD userName;
public:
//BO_ATTRIB_MARKUP_BEGIN
// //BO_ATTRIB_MARKUP_ATTRIB(userName)
//BO_ATTRIB_MARKUP_END
FrtHeader frtHeader;
unsigned short wObjContext;
unsigned int dwChecksum;
std::string xml_;
};
......
......@@ -29,10 +29,18 @@ void TextPropsStream::writeFields(CFRecord& record)
void TextPropsStream::readFields(CFRecord& record)
{
#pragma message("####################### TextPropsStream record is not implemented")
Log::error("TextPropsStream record is not implemented.");
//record >> some_value;
{
record >> frtHeader;
record >> dwChecksum;
unsigned int cb=0;
record >> cb;
if (cb > 0)
{
xml_ = std::string( record.getCurData<char>(), cb);
record.skipNunBytes(cb);
}
}
} // namespace XLS
......
#pragma once
#include <Logic/Biff_structures/FrtHeader.h>
#include "BiffRecord.h"
namespace XLS
......@@ -22,10 +23,10 @@ public:
static const ElementType type = typeTextPropsStream;
//-----------------------------
// BIFF_WORD userName;
FrtHeader frtHeader;
unsigned int dwChecksum;
std::string xml_;
};
} // namespace XLS
......
......@@ -21,22 +21,6 @@ BiffStructurePtr FrtHeader::clone()
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)
{
record << rt << grbitFrt;
......
......@@ -2,7 +2,7 @@
#include "BiffStructure.h"
#include <Binary/CFRecordType.h>
#include <Logic/Biff_structures/BitMarkedStructs.h>
#include "BitMarkedStructs.h"
namespace XLS
{;
......@@ -24,8 +24,8 @@ public:
static const ElementType type = typeFrtHeader;
CFRecordType::TypeId rt;
FrtFlags grbitFrt;
CFRecordType::TypeId rt;
FrtFlags grbitFrt;
};
typedef boost::shared_ptr<FrtHeader> FrtHeaderPtr;
......
......@@ -109,6 +109,10 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
art_record = OfficeArtRecordPtr(new OfficeArtClientData);
break;
case FConnectorRule:
art_record = OfficeArtRecordPtr(new OfficeArtFConnectorRule);
break;
case ClientTextbox:
art_record = OfficeArtRecordPtr(new OfficeArtClientTextbox);
break;
......@@ -125,12 +129,10 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record)
art_record = OfficeArtRecordPtr(new OfficeArtSplitMenuColorContainer);
break;
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);
break;
case TertiaryFOPT:
//art_record = OfficeArtRecordPtr(new OfficeArtTertiaryFOPT);
art_record = OfficeArtRecordPtr(new OfficeArtTertiaryFOPT);
break;
}
......
......@@ -206,12 +206,19 @@ OfficeArtFOPTEPtr OfficeArtFOPTE::load_and_create(XLS::CFRecord& record)
case 0x01CE:
fopte = OfficeArtFOPTEPtr(new lineDashing);
break;
/*todo*/case 0x1D0: //lineStartArrowhead
/*todo*/case 0x1D1: //lineEndArrowhead
fopte = OfficeArtFOPTEPtr(new OfficeArtFOPTE);
break;
case 0x01FF:
fopte = OfficeArtFOPTEPtr(new LineStyleBooleanProperties);
break;
case 0x023F:
fopte = OfficeArtFOPTEPtr(new ShadowStyleBooleanProperties);
break;
/*todo*/case 0x0303: //cxstyle
fopte = OfficeArtFOPTEPtr(new OfficeArtFOPTE);
break;
case 0x033F:
fopte = OfficeArtFOPTEPtr(new ShapeBooleanProperties);
break;
......
......@@ -5,6 +5,10 @@
namespace ODRAW
{;
void OfficeArtFConnectorRule::loadFields(XLS::CFRecord& record)
{
record >> ruid >> spidA >> spidB >> spidC >> cptiA >> cptiB;
}
void OfficeArtDggContainer::loadFields(XLS::CFRecord& record)
{
......
......@@ -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
{
BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtClientTextbox)
......
......@@ -97,6 +97,9 @@ const bool OBJECTS::loadContentRead(BinReaderProcessor& proc)
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 ;
for(std::list<BaseObjectPtr>::iterator it = elements_.begin(); it != elements_.end() ; it++)
{
......
......@@ -486,6 +486,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
{
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
}
else continue;
if (xlsx_context->get_drawing_context().start_drawing(obj->cmo.ot))
......
......@@ -84,6 +84,7 @@ bool xlsx_drawing_context::start_drawing(int type)
case 0x0002: // Rectangle
case 0x0003: // Oval
case 0x0004: // Arc
//case 0x0009: // Polygon:
start_shape(type); return true;
case 0x0005: // Chart
case 0x0006: // Text
......@@ -91,7 +92,6 @@ bool xlsx_drawing_context::start_drawing(int type)
break;
case 0x0008: // Picture
start_image(); return true;
case 0x0009: // Polygon:
case 0x000B: // Checkbox
case 0x000C: // Radio button
case 0x000D: // Edit box
......@@ -126,6 +126,7 @@ void xlsx_drawing_context::start_shape(int type)
drawing_state.push_back(st);
drawing_state.back().type = external_items::typeShape;
drawing_state.back().shape_type = type;
count_object++;
}
......@@ -169,26 +170,50 @@ void xlsx_drawing_context::end_drawing()
serialize(strm);
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;
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();
}
void xlsx_drawing_context::serialize_pic(std::wstring rId)
void xlsx_drawing_context::serialize_shape()
{
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_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")
{
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);
if (!drawing_state.back().description.empty())
......@@ -201,43 +226,151 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId)
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:cNvSpPr");
}
CP_XML_NODE(L"xdr:spPr")
{
CP_XML_NODE(L"a:xfrm")
{
CP_XML_NODE(L"a:picLocks")
CP_XML_NODE(L"a:off")
{
CP_XML_ATTR(L"noChangeAspect", 1);
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")
{
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"r:embed", rId);
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
CP_XML_ATTR(L"r:embed", rId);
}
CP_XML_NODE(L"a:srcRect")
{
if (drawing_state.back().image_crop_enabled)
{
CP_XML_ATTR(L"l", static_cast<size_t>(drawing_state.back().image_crop[0]));
CP_XML_ATTR(L"t", static_cast<size_t>(drawing_state.back().image_crop[1]));
CP_XML_ATTR(L"r", static_cast<size_t>(drawing_state.back().image_crop[2]));
CP_XML_ATTR(L"b", static_cast<size_t>(drawing_state.back().image_crop[3]));
}
}
CP_XML_NODE(L"a:stretch")
{
CP_XML_NODE(L"a:fillRect");
}
}
}
}
CP_XML_NODE(L"a:srcRect")
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().image_crop_enabled)
{
CP_XML_ATTR(L"l", static_cast<size_t>(drawing_state.back().image_crop[0]));
CP_XML_ATTR(L"t", static_cast<size_t>(drawing_state.back().image_crop[1]));
CP_XML_ATTR(L"r", static_cast<size_t>(drawing_state.back().image_crop[2]));
CP_XML_ATTR(L"b", static_cast<size_t>(drawing_state.back().image_crop[3]));
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"a:stretch")
CP_XML_NODE(L"xdr:cNvPicPr")
{
CP_XML_NODE(L"a:fillRect");
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"a:xfrm")
......@@ -266,6 +399,7 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId)
drawing_state.back().shape = strm.str();
}
void xlsx_drawing_context::serialize(std::wostream & stream)
{
CP_XML_WRITER(stream)
......
......@@ -34,6 +34,7 @@ public:
memset(image_crop, 0, 4 * sizeof(int));
}
int shape_type;
external_items::Type type;
std::wstring name;
std::wstring description;
......@@ -94,6 +95,12 @@ public:
void serialize(std::wostream & stream);
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();
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