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

XlsFile2

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64366 954022d7-b5bf-4e40-9824-e11837661b57
parent c754742e
......@@ -50,26 +50,26 @@ void TxO::readFields(CFRecord& record)
std::list<CFRecordPtr>& recs = continue_records[rt_Continue];
int sz = cchText;
if ( cbRuns )
{
if (record.getRdPtr() >= record.getDataSize())
while (record.getRdPtr() + cchText > record.getDataSize() && !recs.empty())
{
int sz = recs.size()-1;
for(int i = 0; i < sz; i++)
{
record.appendRawData(recs.front());
recs.pop_front();
}
record.appendRawData(recs.front());
recs.pop_front();
}
commentText.setSize(cchText);
record >> commentText;
TxOruns.set_records(&recs);
TxOruns.m_runCount = cbRuns / 8 - 1;
TxOruns.load(record);
}
while( !recs.empty() )
{
sp_enabled = true;
mso_drawing_->storeRecordAndDecideProceeding(recs.front());
recs.pop_front();
}
......
......@@ -19,7 +19,8 @@ class TxO: public BiffRecordContinued
public:
TxO(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing), fmla(false)
{
cbRuns = 0;
cbRuns = 0;
sp_enabled = false;
}
~TxO();
......@@ -49,6 +50,8 @@ public:
TxORuns TxOruns;
XLUnicodeStringNoCch commentText;
bool sp_enabled;
MsoDrawingPtr mso_drawing_;
};
......
......@@ -87,17 +87,17 @@ void OfficeArtSpContainer::loadFields(XLS::CFRecord& record)
{
OfficeArtContainer::loadFields(record);
//for (int i = 0 ; i < child_records.size(); i++)
//{
// switch(child_records[i]->rh_own.recType)
// {
// case ODRAW::OfficeArtRecord::SpgrContainerFileBlock:
// {
// m_OfficeArtSpgrContainerFileBlock.push_back(child_records[i]);
// child_records.erase(child_records.begin() + i,child_records.begin() + i + 1);
// }break;
// }
//}
for (int i = 0 ; i < child_records.size(); i++)
{
switch(child_records[i]->rh_own.recType)
{
case ODRAW::OfficeArtRecord::FSP:
{
m_OfficeArtFSP = child_records[i];
child_records.erase(child_records.begin() + i,child_records.begin() + i + 1); i--;
}break;
}
}
}
......
......@@ -52,6 +52,8 @@ public:
XLS::BiffStructurePtr clone() { return XLS::BiffStructurePtr(new OfficeArtSpContainer(*this)); }
void loadFields(XLS::CFRecord& record);
OfficeArtRecordPtr m_OfficeArtFSP;
};
class OfficeArtClientData : public OfficeArtRecord
......
......@@ -14,10 +14,12 @@ BiffStructurePtr TxORuns::clone()
TxORuns::TxORuns()
{
m_runCount = 0;
recs = NULL;
}
TxORuns::~TxORuns()
{
recs = NULL;
}
......@@ -29,10 +31,28 @@ void TxORuns::load(CFRecord& record)
{
for (int i = 0; i < m_runCount; i++)
{
while (record.getRdPtr() + 8 > record.getDataSize())
{
if ((recs) && (!recs->empty()))
{
record.appendRawData(recs->front());
recs->pop_front();
}
else return;
}
RunPtr run(new Run);
run->load(record);
rgTxoRuns.push_back(run);
}
while (record.getRdPtr() + 8 > record.getDataSize())
{
if ((recs) && (!recs->empty()))
{
record.appendRawData(recs->front());
recs->pop_front();
}
else return;
}
lastRun.load(record);
}
......
......@@ -25,6 +25,13 @@ public:
int m_runCount;
std::vector<RunPtr> rgTxoRuns;
TxOLastRun lastRun;
void set_records(std::list<CFRecordPtr>* recs_)
{
recs = recs_;
}
std::list<CFRecordPtr>* recs;
};
typedef boost::shared_ptr<TxORuns> TxORunsPtr;
......
......@@ -14,6 +14,7 @@ class CHART: public CompositeObject
public:
CHART(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing)
{
sp_enabled = false;
}
~CHART();
......@@ -23,7 +24,10 @@ public:
static const ElementType type = typeCHART;
MsoDrawingPtr mso_drawing_;
MsoDrawingPtr mso_drawing_;
BaseObjectPtr m_ChartSheetSubstream;
bool sp_enabled;
};
} // namespace XLS
......
......@@ -33,6 +33,9 @@ const bool CHART::loadContent(BinProcessor& proc)
return false;
}
m_ChartSheetSubstream = elements_.back();
elements_.pop_back();
int count = proc.repeated<Continue>(0, 0);
while (count > 0)
......@@ -43,8 +46,11 @@ const bool CHART::loadContent(BinProcessor& proc)
CFRecordPtr r = CFRecordPtr(new CFRecord(CFRecordType::ANY_TYPE, proc.getGlobalWorkbookInfo()));
r->appendRawData(c->m_pData, c->m_iDataSize);
mso_drawing_->storeRecordAndDecideProceeding(r);
sp_enabled = true;
}
elements_.pop_back();
count--;
}
......
......@@ -122,18 +122,13 @@ const bool OBJECTS::loadContentRead(BinReaderProcessor& proc)
}
}
//int count_2 = proc.repeated(parenthesis_objects_1, 0, 0);
if (m_MsoDrawing->isReading == false)
try
{
m_MsoDrawing->resetToBegin();
m_MsoDrawing->readFields();
}
catch(...)
{
try
{
m_MsoDrawing->resetToBegin();
m_MsoDrawing->readFields();
}
catch(...)
{
}
}
return count_1 > 0 || count_4 > 0;
......
......@@ -519,6 +519,17 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
bool note = false;
int ind = 0;
if ((spgr) && (ind < spgr->child_records.size()))
{
ODRAW::OfficeArtSpContainer *s = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind].get());
if (s)
{
ODRAW::OfficeArtFSP *fsp = dynamic_cast<ODRAW::OfficeArtFSP*>(s->m_OfficeArtFSP.get());
if ((fsp) && (fsp->fPatriarch)) ind++;
}
}
for ( std::list<XLS::BaseObjectPtr>::iterator elem = objects->elements_.begin(); elem != objects->elements_.end(); elem++)
{
short type_object = -1;
......@@ -541,7 +552,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
if (OBJ) obj = dynamic_cast<XLS::Obj *>(OBJ->m_Obj.get());
if (TEXTOBJECT) text_obj = dynamic_cast<XLS::TxO *>(TEXTOBJECT->m_TxO.get());
if (CHART) chart = dynamic_cast<XLS::ChartSheetSubstream *>(CHART->elements_.back().get());
if (CHART) chart = dynamic_cast<XLS::ChartSheetSubstream *>(CHART->m_ChartSheetSubstream.get());
if (obj) type_object = obj->cmo.ot;
if (chart) type_object = 0x0005;
......@@ -556,10 +567,21 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
ODRAW::OfficeArtSpContainer *sp_text = NULL;
if ( spgr)
{
if (ind + 1 < spgr->child_records.size())
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
if (text_obj && ind + 2 < spgr->child_records.size())
sp_text = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+2].get());
if (ind < spgr->child_records.size())
{
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind].get());
ind++;
}
if ((text_obj && ind < spgr->child_records.size()) && text_obj->sp_enabled)
{
sp_text = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind].get());
ind++;
}
if ((chart && ind < spgr->child_records.size()) && CHART->sp_enabled)
{
sp_text = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind].get());
ind++;
}
}
......@@ -597,16 +619,15 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
note = true;
}
}
ind++;
if ( spgr )
{
while (ind + 1 < spgr->child_records.size()) // бывает что эти элементы не привязаны к sp, а "лежат" сверху - FilterClickColour_2003.xls
while (ind < spgr->child_records.size()) // бывает что эти элементы не привязаны к sp, а "лежат" сверху - FilterClickColour_2003.xls
{
ODRAW::OfficeArtClientData* client_data = NULL;
ODRAW::OfficeArtClientTextbox* text_client_data = NULL;
client_data = dynamic_cast<ODRAW::OfficeArtClientData*> (spgr->child_records[ind+1].get());
text_client_data = dynamic_cast<ODRAW::OfficeArtClientTextbox*> (spgr->child_records[ind+1].get());
client_data = dynamic_cast<ODRAW::OfficeArtClientData*> (spgr->child_records[ind].get());
text_client_data = dynamic_cast<ODRAW::OfficeArtClientTextbox*> (spgr->child_records[ind].get());
if (client_data || text_client_data)
{
......@@ -617,7 +638,6 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
if (TEXTOBJECT || CHART)
{
elem++;
ind++;
}
}
}
......@@ -626,6 +646,8 @@ void XlsConverter::convert(ODRAW::OfficeArtSpContainer *sp)
{
if (sp == NULL) return;
convert(sp->m_OfficeArtFSP.get());
for (int i = 0; i < sp->child_records.size(); i++)
{
convert(sp->child_records[i].get());
......@@ -670,6 +692,44 @@ void XlsConverter::convert_fill_style(std::vector<ODRAW::OfficeArtFOPTEPtr> & pr
{
for (int i = 0 ; i < props.size() ; i++)
{
switch(props[i]->opid)
{
case 0x0181:
{
ODRAW::fillColor * fill = (ODRAW::fillColor *)(props[i].get());
ODRAW::OfficeArtCOLORREF color(fill->op);
if (!color.colorRGB.empty())
xlsx_context->get_drawing_context().set_fill_color(color.colorRGB);
else if (color. fPaletteIndex)
{
std::map<int, std::wstring>::iterator it = xls_global_info->colors_palette.find(color.index);
if (it != xls_global_info->colors_palette.end())
{
xlsx_context->get_drawing_context().set_fill_color(it->second);
}
}
else
xlsx_context->get_drawing_context().set_fill_color(color.index, color.fSchemeIndex ? 1 : 3 );
}break;
case 0x0186:
{
//bool isIternal = false;
//std::wstring target;
//std::wstring rId = xlsx_context->get_mediaitems().find_image(props[i]->op , target, isIternal);
//xlsx_context->get_drawing_context().set_image(target);
}break;
case 0x01BF:
{
ODRAW::FillStyleBooleanProperties * fill = (ODRAW::FillStyleBooleanProperties *)(props[i].get());
if (fill)
{
if (fill->fFilled == false)
xlsx_context->get_drawing_context().set_fill_type(0);
}
}break;
}
}
}
void XlsConverter::convert_line_style(std::vector<ODRAW::OfficeArtFOPTEPtr> & props)
......@@ -683,8 +743,16 @@ void XlsConverter::convert_line_style(std::vector<ODRAW::OfficeArtFOPTEPtr> & pr
ODRAW::OfficeArtCOLORREF color(props[i]->op);
if (!color.colorRGB.empty())
xlsx_context->get_drawing_context().set_line_color(color.colorRGB);
else if (color. fPaletteIndex)
{
std::map<int, std::wstring>::iterator it = xls_global_info->colors_palette.find(color.index);
if (it != xls_global_info->colors_palette.end())
{
xlsx_context->get_drawing_context().set_line_color(it->second);
}
}
else
xlsx_context->get_drawing_context().set_line_color(color.index, color.fSchemeIndex ? 1 : (color. fPaletteIndex ? 2 : 3 ));
xlsx_context->get_drawing_context().set_line_color(color.index, color.fSchemeIndex ? 1 : 3 );
}break;
case 0x01C4:
{
......@@ -801,13 +869,22 @@ void XlsConverter::convert_geometry(std::vector<ODRAW::OfficeArtFOPTEPtr> & prop
{
for (int j=0 ; j < count_point[command[i].typeSegment]; j ++)
{
if (ind_point >= points.size())
break;
CP_XML_NODE(L"a:pt")
if (ind_point < points.size())
{
CP_XML_NODE(L"a:pt")
{
CP_XML_ATTR(L"x", points[ind_point].x);
CP_XML_ATTR(L"y", points[ind_point].y);
ind_point++;
}
}
else
{
CP_XML_ATTR(L"x", points[ind_point].x);
CP_XML_ATTR(L"y", points[ind_point].y);
ind_point++;
CP_XML_NODE(L"a:pt")
{
CP_XML_ATTR(L"x", 0);
CP_XML_ATTR(L"y", 0);
}
}
}
}
......
......@@ -11,7 +11,13 @@
namespace oox {
const static std::wstring shemeColor[17] =
{L"accent1",L"accent2",L"accent3",L"accent4",L"accent5",L"accent6",L"bg1",L"bg2",L"dk1",L"dk2",L"folHlink",L"hlink",L"lt1",L"lt2",L"phClr",L"tx1",L"tx2"};
{L"lt1",L"dk1",L"lt2",L"dk2",L"accent1",L"accent2",L"accent3",L"accent4",L"accent5",L"accent6",L"dk1",L"dk2",L"folHlink",L"hlink",L"tx1",L"tx2",L"phClr"};
const static std::wstring systemColor[30] =
{L"scrollBar", L"background", L"activeCaption", L"inactiveCaption", L"menu", L"window", L"windowFrame", L"menuText", L"windowText",
L"captionText", L"activeBorder", L"inactiveBorder", L"appWorkspace", L"highlight", L"highlightText", L"btnFace", L"btnShadow",
L"grayText", L"btnText", L"inactiveCaptionText", L"btnHighlight", L"3dDkShadow", L"3dLight", L"infoText", L"infoBk", L"hotLight",
L"gradientActiveCaption", L"gradientInactiveCaption", L"menuHighlight", L"menuBar"};
class xlsx_drawing_context_handle::Impl
{
......@@ -301,12 +307,18 @@ void xlsx_drawing_context::serialize_shape()
}
CP_XML_NODE(L"a:pathLst")
{
CP_XML_NODE(L"a:path")
int w = drawing_state.back().path_rect.right - drawing_state.back().path_rect.left;
int h = drawing_state.back().path_rect.bottom- drawing_state.back().path_rect.top;
if (w > 0 && h > 0)
{
CP_XML_ATTR(L"w", drawing_state.back().path_rect.right - drawing_state.back().path_rect.left);
CP_XML_ATTR(L"h", drawing_state.back().path_rect.bottom- drawing_state.back().path_rect.top);
CP_XML_STREAM() << drawing_state.back().path;
CP_XML_NODE(L"a:path")
{
CP_XML_ATTR(L"w", w);
CP_XML_ATTR(L"h", h);
CP_XML_STREAM() << drawing_state.back().path;
}
}
}
}
......@@ -323,19 +335,28 @@ void xlsx_drawing_context::serialize_shape()
void xlsx_drawing_context::serialize_fill(std::wostream & stream)
{
if (drawing_state.back().fill.type == 0)
{
serialize_none_fill(stream);
return;
}
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);
xlsx_drawings_->add(L"", isIternal, rId , drawing_state.back().image_target, external_items::typeImage);
serialize_bitmap_fill(stream, rId);
}else
serialize_none_fill(stream);
return;
}
}
else
serialize_none_fill(stream);
if (drawing_state.back().fill.color.index>=0 || !drawing_state.back().fill.color.rgb.empty())
{
serialize_solid_fill(stream, drawing_state.back().fill.color);
}
else serialize_none_fill(stream);
}
void xlsx_drawing_context::serialize_none_fill(std::wostream & stream)
......@@ -345,7 +366,16 @@ void xlsx_drawing_context::serialize_none_fill(std::wostream & stream)
CP_XML_NODE(L"a:noFill");
}
}
void xlsx_drawing_context::serialize_solid_fill(std::wostream & stream, const _color & color)
{
CP_XML_WRITER(stream)
{
CP_XML_NODE(L"a:solidFill")
{
serialize_color(CP_XML_STREAM(), drawing_state.back().fill.color);
}
}
}
void xlsx_drawing_context::serialize_xfrm(std::wostream & stream)
{
CP_XML_WRITER(stream)
......@@ -382,16 +412,27 @@ void xlsx_drawing_context::serialize_color (std::wostream & stream, const _color
CP_XML_ATTR(L"val", color.rgb);
}
}
else if (color.bPalette){CP_XML_NODE(L"a:prstClr") { CP_XML_ATTR(L"val",L"black");}}
else if (color.bScheme)
//else
else if (color.index >=0 && color.index < 17)
{
CP_XML_NODE(L"a:schemeClr")
{
CP_XML_ATTR(L"val", (color.index >=0 && color.index < 17) ? shemeColor[color.index] : L"tx1");
CP_XML_ATTR(L"val", shemeColor[color.index]);
}
}
else if (color.index >=0 && color.index < 30)
{
CP_XML_NODE(L"a:sysClr")
{
CP_XML_ATTR(L"val", systemColor[color.index]);
}
}
else
{
CP_XML_NODE(L"a:sysClr")
{
CP_XML_ATTR(L"val", L"lt1");
}
}
else{CP_XML_NODE(L"a:sysClr") { CP_XML_ATTR(L"val",L"windowText");}}
}
}
......@@ -597,8 +638,23 @@ void xlsx_drawing_context::set_line_color (int index, int type)
drawing_state.back().line.color.index = index;
if (type == 1) drawing_state.back().line.color.bScheme = true;
else if (type == 2) drawing_state.back().line.color.bPalette = true;
}
void xlsx_drawing_context::set_fill_color (const std::wstring & color)
{
if (drawing_state.size() < 1 )return;
drawing_state.back().fill.color.rgb = color;
}
void xlsx_drawing_context::set_fill_color (int index, int type)
{
if (drawing_state.size() < 1 )return;
drawing_state.back().fill.color.index = index;
if (type == 1) drawing_state.back().fill.color.bScheme = true;
}
void xlsx_drawing_context::set_fill_type (int val)
{
if (drawing_state.size() < 1 )return;
drawing_state.back().fill.type = val;
}
void xlsx_drawing_context::set_line_type (int val)
{
......
......@@ -29,11 +29,10 @@ private:
struct _color
{
_color() : index(-1), bScheme(false), bPalette(false){}
_color() : index(-1), bScheme(false){}
std::wstring rgb;
int index;
bool bScheme;
bool bPalette;
};
struct _rect
......@@ -98,6 +97,14 @@ public:
int width;
}line;
struct _fill
{
_fill() {opacity = 0; type = 1; }
_color color;
_color color2;
int opacity;
int type;
}fill;
};
struct _hlink_desc
{
......@@ -134,7 +141,11 @@ public:
void set_rotation (int val);
void set_line_color (const std::wstring & color);
void set_fill_color (const std::wstring & color);
void set_fill_color (int index, int type);
void set_fill_type (int val);
void set_line_color (const std::wstring & color);
void set_line_color (int index, int type);
void set_line_type (int val);
void set_line_style (int val);
......@@ -158,6 +169,7 @@ public:
void serialize_line (std::wostream & stream);
void serialize_fill (std::wostream & stream);
void serialize_bitmap_fill (std::wostream & stream, std::wstring rId, const std::wstring ns = L"a:");
void serialize_solid_fill (std::wostream & stream, const _color &color);
void serialize_none_fill (std::wostream & stream);
void serialize_xfrm (std::wostream & stream);
void serialize_text (std::wostream & stream);
......
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